code: func processBot(c context.Context, desc model.PoolDescriptor) error {
  	t, err := auth.GetRPCTransport(c, auth.AsSelf)
  	if err != nil {
  		return err
  	}
  	sc, err := swarmingAPI.New(&http.Client{Transport: t})
  	if err != nil {
  		return err
  	}
  	sc.BasePath = fmt.Sprintf("https://%s/_ah/api/swarming/v1/", desc.Host())
  
  	var bots []model.Bot
  	bl := sc.Bots.List().Dimensions(desc.Dimensions().Format()...)
  	// Keep fetching until the cursor is empty.
  	for {
  		botList, err := bl.Do()
  		if err != nil {
  			return err
  		}
  		for _, botInfo := range botList.Items {
  			// Ignore deleted bots.
  			if botInfo.Deleted {
  				continue
  			}
  			bot, err := parseBot(c, desc.Host(), botInfo)
  			if err != nil {
  				return err
  			}
  			bots = append(bots, *bot)
  		}
  
  		if botList.Cursor == "" {
  			break
  		}
  		bl = bl.Cursor(botList.Cursor)
  	}
  	// If there are too many bots, then it won't fit in datastore.
  	// Only store a subset of the bots.
  	// TODO(hinoka): This is inaccurate, but will only affect few builders.
  	// Instead of chopping this list off, just store the statistics.
  	if len(bots) > 1000 {
  		bots = bots[:1000]
  	}
  	// This is a large RPC, don't try to batch it.
  	return datastore.Put(c, &model.BotPool{
  		PoolID:     desc.PoolID(),
  		Descriptor: desc,
  		Bots:       bots,
  		LastUpdate: clock.Now(c),
  	})
  }
docs: // processBot retrieves the Bot pool details from Swarming for a given set of
  // dimensions for its respective Swarming host, and saves the data into datastore.