func NoAuthContext() context.Context { projID := os.Getenv(envProjID) if projID == "" { log.Fatal("GCLOUD_TESTS_GOLANG_PROJECT_ID must be set. See CONTRIBUTING.md for details.") } return cloud.NewContext(projID, &http.Client{Transport: http.DefaultTransport}) }
// This example demonstrates calling the Cloud Pub/Sub API. As of 22 // Oct 2014, the Cloud Pub/Sub API is only available if you're // whitelisted. If you're interested in using it, please apply for the // Limited Preview program at the following form: // http://goo.gl/Wql9HL // // Also, before running this example, be sure to enable Cloud Pub/Sub // service on your project in Developer Console at: // https://console.developers.google.com/ // // Unless you run this sample on Compute Engine instance, please // create a new service account and download a JSON key file for it at // the developer console: https://console.developers.google.com/ // // It has the following subcommands: // // create_topic <name> // delete_topic <name> // create_subscription <name> <linked_topic> // delete_subscription <name> // publish <topic> <message> // pull_messages <subscription> <numworkers> // publish_messages <topic> <numworkers> // // You can choose any names for topic and subscription as long as they // follow the naming rule described at: // https://cloud.google.com/pubsub/overview#names // // You can create/delete topics/subscriptions by self-explanatory // subcommands. // // The "publish" subcommand is for publishing a single message to a // specified Cloud Pub/Sub topic. // // The "pull_messages" subcommand is for continuously pulling messages // from a specified Cloud Pub/Sub subscription with specified number // of workers. // // The "publish_messages" subcommand is for continuously publishing // messages to a specified Cloud Pub/Sub topic with specified number // of workers. func main() { flag.Parse() argv := flag.Args() checkArgs(argv, 1) client, err := newClient(*jsonFile) if err != nil { log.Fatalf("clientAndId failed, %v", err) } if *projID == "" { usageAndExit("Please specify Project ID.") } ctx := cloud.NewContext(*projID, client) m := map[string]func(ctx context.Context, argv []string){ "create_topic": createTopic, "delete_topic": deleteTopic, "create_subscription": createSubscription, "delete_subscription": deleteSubscription, "publish": publish, "pull_messages": pullMessages, "publish_messages": publishMessages, } subcommand := argv[0] f, ok := m[subcommand] if !ok { usageAndExit(fmt.Sprintf("Function not found for %s", subcommand)) } f(ctx, argv) }
// Write file to Google Storage func writeFile(client *http.Client, bucket, filename, destname string) error { fmt.Printf("Writing %v to gs://%v ...\n", filename, bucket) fmt.Printf("(Sometimes this takes a few mintues)\n") // dummy value is used since a project name isn't necessary unless // we are creating new buckets ctx := cloud.NewContext("dummy", client) wc := storage.NewWriter(ctx, bucket, destname) wc.ContentType = "application/x-gzip" wc.ACL = []storage.ACLRule{{storage.AllAuthenticatedUsers, storage.RoleReader}} file, err := os.Open(filename) if err != nil { return err } defer file.Close() _, err = io.Copy(wc, file) if err != nil { return err } if err := wc.Close(); err != nil { return err } fmt.Printf("Upload successful!\n") return nil }
// handler is the main demo entry point that calls the GCS operations. func handler(w http.ResponseWriter, r *http.Request) { if r.URL.Path != "/" { http.NotFound(w, r) return } c := appengine.NewContext(r) if bucket == "" { var err error if bucket, err = file.DefaultBucketName(c); err != nil { log.Errorf(c, "failed to get default GCS bucket name: %v", err) return } } hc := &http.Client{ Transport: &oauth2.Transport{ Source: google.AppEngineTokenSource(c, storage.ScopeFullControl), Base: &urlfetch.Transport{Context: c}, }, } ctx := cloud.NewContext(appengine.AppID(c), hc) w.Header().Set("Content-Type", "text/plain; charset=utf-8") fmt.Fprintf(w, "Demo GCS Application running from Version: %v\n", appengine.VersionID(c)) fmt.Fprintf(w, "Using bucket name: %v\n\n", bucket) d := &demo{ c: c, w: w, ctx: ctx, } n := "demo-testfile-go" d.createFile(n) d.readFile(n) d.copyFile(n) d.statFile(n) d.createListFiles() d.listBucket() d.listBucketDirMode() d.defaultACL() d.putDefaultACLRule() d.deleteDefaultACLRule() d.bucketACL() d.putBucketACLRule() d.deleteBucketACLRule() d.acl(n) d.putACLRule(n) d.deleteACLRule(n) d.deleteFiles() if d.failed { io.WriteString(w, "\nDemo failed.\n") } else { io.WriteString(w, "\nDemo succeeded.\n") } }
func TestErrorOnObjectsInsertCall(t *testing.T) { ctx := cloud.NewContext("project-id", &http.Client{ Transport: &fakeTransport{}}) wc := NewWriter(ctx, "bucketname", "filename1") wc.ContentType = "text/plain" if _, err := wc.Write([]byte("hello world")); err == nil { t.Errorf("expected error on write, got nil") } if err := wc.Close(); err == nil { t.Errorf("expected error on close, got nil") } }
// Test if file exists in Google Storage func fileQuery(client *http.Client, bucket, name string) (bool, error) { ctx := cloud.NewContext("dummy", client) query := &storage.Query{Prefix: name} objects, err := storage.ListObjects(ctx, bucket, query) if err != nil { return false, err } if len(objects.Results) == 1 { return true, nil } return false, nil }
func Context(scopes ...string) context.Context { key, projID := os.Getenv(envPrivateKey), os.Getenv(envProjID) if key == "" || projID == "" { log.Fatal("GCLOUD_TESTS_GOLANG_KEY and GCLOUD_TESTS_GOLANG_PROJECT_ID must be set. See CONTRIBUTING.md for details.") } jsonKey, err := ioutil.ReadFile(key) if err != nil { log.Fatalf("Cannot read the JSON key file, err: %v", err) } conf, err := google.JWTConfigFromJSON(jsonKey, scopes...) if err != nil { log.Fatal(err) } return cloud.NewContext(projID, conf.Client(oauth2.NoContext)) }
func Example_auth() context.Context { // Initialize an authorized context with Google Developers Console // JSON key. Read the google package examples to learn more about // different authorization flows you can use. // http://godoc.org/golang.org/x/oauth2/google jsonKey, err := ioutil.ReadFile("/path/to/json/keyfile.json") if err != nil { log.Fatal(err) } conf, err := google.JWTConfigFromJSON( jsonKey, storage.ScopeFullControl, ) if err != nil { log.Fatal(err) } ctx := cloud.NewContext("project-id", conf.Client(oauth2.NoContext)) // Use the context (see other examples) return ctx }
func TestSimpleQuery(t *testing.T) { struct1 := Gopher{Name: "George", Height: 32} struct2 := Gopher{Name: "Rufus"} pList1 := PropertyList{ { Name: "Name", Value: "George", }, { Name: "Height", Value: int64(32), }, } pList2 := PropertyList{ { Name: "Name", Value: "Rufus", }, } pMap1 := PropertyMap{ "Name": Property{ Name: "Name", Value: "George", }, "Height": Property{ Name: "Height", Value: int64(32), }, } pMap2 := PropertyMap{ "Name": Property{ Name: "Name", Value: "Rufus", }, } testCases := []struct { dst interface{} want interface{} }{ // The destination must have type *[]P, *[]S or *[]*S, for some non-interface // type P such that *P implements PropertyLoadSaver, or for some struct type S. {new([]Gopher), &[]Gopher{struct1, struct2}}, {new([]*Gopher), &[]*Gopher{&struct1, &struct2}}, {new([]PropertyList), &[]PropertyList{pList1, pList2}}, {new([]PropertyMap), &[]PropertyMap{pMap1, pMap2}}, // Any other destination type is invalid. {0, nil}, {Gopher{}, nil}, {PropertyList{}, nil}, {PropertyMap{}, nil}, {[]int{}, nil}, {[]Gopher{}, nil}, {[]PropertyList{}, nil}, {new(int), nil}, {new(Gopher), nil}, {new(PropertyList), nil}, // This is a special case. {new(PropertyMap), nil}, {new([]int), nil}, {new([]map[int]int), nil}, {new([]map[string]Property), nil}, {new([]map[string]interface{}), nil}, {new([]*int), nil}, {new([]*map[int]int), nil}, {new([]*map[string]Property), nil}, {new([]*map[string]interface{}), nil}, {new([]**Gopher), nil}, {new([]*PropertyList), nil}, {new([]*PropertyMap), nil}, } for _, tc := range testCases { nCall := 0 ctx := cloud.NewContext("queryTest", &http.Client{ Transport: &fakeTransport{Handler: func(in proto.Message, out proto.Message) error { nCall++ return fakeRunQuery(in.(*pb.RunQueryRequest), out.(*pb.RunQueryResponse)) }}}) var ( expectedErr error expectedNCall int ) if tc.want == nil { expectedErr = ErrInvalidEntityType } else { expectedNCall = 1 } keys, err := NewQuery("Gopher").GetAll(ctx, tc.dst) if err != expectedErr { t.Errorf("dst type %T: got error %v, want %v", tc.dst, err, expectedErr) continue } if nCall != expectedNCall { t.Errorf("dst type %T: Context.Call was called an incorrect number of times: got %d want %d", tc.dst, nCall, expectedNCall) continue } if err != nil { continue } key1 := NewKey(ctx, "Gopher", "", 6, nil) expectedKeys := []*Key{ key1, NewKey(ctx, "Gopher", "", 8, key1), } if l1, l2 := len(keys), len(expectedKeys); l1 != l2 { t.Errorf("dst type %T: got %d keys, want %d keys", tc.dst, l1, l2) continue } for i, key := range keys { if !keysEqual(key, expectedKeys[i]) { t.Errorf("dst type %T: got key #%d %v, want %v", tc.dst, i, key, expectedKeys[i]) continue } } if !reflect.DeepEqual(tc.dst, tc.want) { t.Errorf("dst type %T: Entities got %+v, want %+v", tc.dst, tc.dst, tc.want) continue } } }