func TestTaskQueue(t *testing.T) { // Only run the test if APPENGINE_DEV_APPSERVER is explicitly set. if os.Getenv("APPENGINE_DEV_APPSERVER") == "" { t.Skip("APPENGINE_DEV_APPSERVER not set") } queueNames := []string{ "taskQueueName", } ctx, done, err := NewContextOptions(&Options{ TaskQueues: queueNames, }) queueNames = append(queueNames, "default") if err != nil { t.Fatalf("NewContext: %v", err) } defer done() for _, queueName := range queueNames { _, err = taskqueue.Add(ctx, taskqueue.NewPOSTTask("/worker", url.Values{ "key": {"value"}, }), queueName) if err != nil { t.Errorf("Unable to add task to queue - %v", err) } if stats, err := taskqueue.QueueStats(ctx, []string{queueName}); err != nil { t.Errorf("Unable to fetch queue statistics - %v", err) } else if len(stats) == 0 { t.Errorf("No stats found for the default taskqueue!") } else if stats[0].Tasks != 1 { t.Errorf("Wrong number of tasks found in queue, wanted 1, got %d", stats[0].Tasks) } } }
func (t tqImpl) Stats(queueNames []string, cb tq.RawStatsCB) error { stats, err := taskqueue.QueueStats(t.aeCtx, queueNames) if err != nil { return err } for _, s := range stats { cb((*tq.Statistics)(&s), nil) } return nil }
func handlerGceManager(w http.ResponseWriter, r *http.Request) { ctx := appengine.NewContext(r) client := &http.Client{ Transport: &oauth2.Transport{ Source: google.AppEngineTokenSource(ctx, compute.ComputeScope), Base: &urlfetch.Transport{Context: ctx}, }, } s, err := compute.New(client) if err != nil { log.Errorf(ctx, "ERROR compute.New: %s", err) w.WriteHeader(500) return } is := compute.NewInstancesService(s) ilc := is.List("cp300demo1", "us-central1-b") il, err := ilc.Do() if err != nil { log.Errorf(ctx, "ERROR instances list: %s", err) w.WriteHeader(500) return } count := 0 for _, item := range il.Items { log.Infof(ctx, "id = %s, name = %s, creationTimestamp = %s", item.Id, item.Name, item.CreationTimestamp) if strings.HasPrefix(item.Name, INSTANCE_NAME) { count++ } } threshold := 3 if count > threshold { log.Infof(ctx, "Create a new instance is canceled.") w.WriteHeader(200) return } qs, err := taskqueue.QueueStats(ctx, []string{"pull-queue"}) if err != nil { log.Errorf(ctx, "ERROR get queue stats: %s", err) w.WriteHeader(500) return } if qs[0].Tasks < 1 { log.Infof(ctx, "gce-manager purge.") err = taskqueue.Purge(ctx, "gce-manager") if err != nil { log.Warningf(ctx, "missing gce-manager purge. err = %s", err) } } if count > qs[0].Tasks { log.Infof(ctx, "instance count %d > task count %d", count, qs[0].Tasks) w.WriteHeader(200) return } threshold = math.MinInt32(threshold, qs[0].Tasks) names := make([]string, 0) for i := count; i < threshold; i++ { name, err := createInstance(ctx, is) if err != nil { time.Sleep(3 * time.Second) } names = append(names, name) } w.WriteHeader(200) fmt.Fprint(w, names) }