code: func processBuilders(c context.Context, r *swarmbucketAPI.LegacySwarmbucketApiGetBuildersResponseMessage) ([]model.PoolDescriptor, error) {
  	var builderPools []model.BuilderPool
  	var descriptors []model.PoolDescriptor
  	seen := stringset.New(0)
  	for _, bucket := range r.Buckets {
  		for _, builder := range bucket.Builders {
  			bid := NewBuilderID(bucket.Name, builder.Name)
  			if bid.Project == "" {
  				// This may happen if the bucket or builder does not fulfill the LUCI
  				// naming convention.
  				logging.Warningf(c, "invalid bucket/builder %q/%q, skipping", bucket.Name, builder.Name)
  				continue
  			}
  			id := bid.String()
  			dimensions := stripEmptyDimensions(builder.SwarmingDimensions)
  			descriptor := model.NewPoolDescriptor(builder.SwarmingHostname, dimensions)
  			dID := descriptor.PoolID()
  			builderPools = append(builderPools, model.BuilderPool{
  				BuilderID: datastore.MakeKey(c, model.BuilderSummaryKind, id),
  				PoolKey:   datastore.MakeKey(c, model.BotPoolKind, dID),
  			})
  			if added := seen.Add(dID); added {
  				descriptors = append(descriptors, descriptor)
  			}
  		}
  	}
  	return descriptors, datastore.Put(c, builderPools)
  }
docs: // processBuilders parses out all of the builder pools from the Swarmbucket get_builders response,
  // and saves the BuilderPool information into the datastore.
  // It returns a list of PoolDescriptors that needs to be fetched and saved.