From b58ec6aec71435352720862811e7bee5ad2d6484 Mon Sep 17 00:00:00 2001 From: toshi0607 Date: Sun, 20 Jan 2019 11:42:57 +0900 Subject: [PATCH] :tada: add google go --- docker-compose.yml | 4 ++ docs/providers/google/cli-reference/create.md | 1 + lib/plugins/create/create.js | 1 + lib/plugins/create/create.test.js | 14 ++++++ .../create/templates/google-go/.gitignore | 12 +++++ .../create/templates/google-go/Makefile | 10 +++++ lib/plugins/create/templates/google-go/fn.go | 14 ++++++ .../create/templates/google-go/fn_test.go | 44 +++++++++++++++++++ .../create/templates/google-go/serverless.yml | 44 +++++++++++++++++++ tests/templates/test_all_templates | 1 + 10 files changed, 145 insertions(+) create mode 100644 lib/plugins/create/templates/google-go/.gitignore create mode 100644 lib/plugins/create/templates/google-go/Makefile create mode 100644 lib/plugins/create/templates/google-go/fn.go create mode 100644 lib/plugins/create/templates/google-go/fn_test.go create mode 100644 lib/plugins/create/templates/google-go/serverless.yml diff --git a/docker-compose.yml b/docker-compose.yml index c2eabd0d0..a372d2250 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -102,6 +102,10 @@ services: image: node:6.9.1 volumes: - ./tmp/serverless-integration-test-google-nodejs:/app + google-nodejs: + image: golang:1.11 + volumes: + - ./tmp/serverless-integration-test-google-go:/app spotinst-nodejs: image: node:4.8 volumes: diff --git a/docs/providers/google/cli-reference/create.md b/docs/providers/google/cli-reference/create.md index 27d550bdb..8fa3bbee2 100644 --- a/docs/providers/google/cli-reference/create.md +++ b/docs/providers/google/cli-reference/create.md @@ -41,6 +41,7 @@ To see a list of available templates run `serverless create --help` Most commonly used templates: - google-nodejs +- google-go ## Examples diff --git a/lib/plugins/create/create.js b/lib/plugins/create/create.js index b54f6785b..f0bd86e2c 100644 --- a/lib/plugins/create/create.js +++ b/lib/plugins/create/create.js @@ -42,6 +42,7 @@ const validTemplates = [ 'fn-nodejs', 'fn-go', 'google-nodejs', + 'google-go', 'kubeless-python', 'kubeless-nodejs', 'openwhisk-java-maven', diff --git a/lib/plugins/create/create.test.js b/lib/plugins/create/create.test.js index c325c768e..d5c2aefee 100644 --- a/lib/plugins/create/create.test.js +++ b/lib/plugins/create/create.test.js @@ -567,6 +567,20 @@ describe('Create', () => { }); }); + it('should generate scaffolding for "google-go" template', () => { + process.chdir(tmpDir); + create.options.template = 'google-go'; + + return create.create().then(() => { + const dirContent = fs.readdirSync(tmpDir); + expect(dirContent).to.include('fn.go'); + expect(dirContent).to.include('fn_test.go'); + expect(dirContent).to.include('serverless.yml'); + expect(dirContent).to.include('Makefile'); + expect(dirContent).to.include('.gitignore'); + }); + }); + it('should generate scaffolding for "kubeless-python" template', () => { process.chdir(tmpDir); create.options.template = 'kubeless-python'; diff --git a/lib/plugins/create/templates/google-go/.gitignore b/lib/plugins/create/templates/google-go/.gitignore new file mode 100644 index 000000000..f2dd9554a --- /dev/null +++ b/lib/plugins/create/templates/google-go/.gitignore @@ -0,0 +1,12 @@ +# Binaries for programs and plugins +*.exe +*.exe~ +*.dll +*.so +*.dylib + +# Test binary, built with `go test -c` +*.test + +# Output of the go coverage tool, specifically when used with LiteIDE +*.out diff --git a/lib/plugins/create/templates/google-go/Makefile b/lib/plugins/create/templates/google-go/Makefile new file mode 100644 index 000000000..bb9dba220 --- /dev/null +++ b/lib/plugins/create/templates/google-go/Makefile @@ -0,0 +1,10 @@ +.PHONY: gomodgen deploy delete + +gomodgen: + GO111MODULE=on go mod init + +deploy: + gcloud functions deploy hello --entry-point Hello --runtime go111 --trigger-http + +delete: + gcloud functions delete hello --entry-point Hello --runtime go111 --trigger-http diff --git a/lib/plugins/create/templates/google-go/fn.go b/lib/plugins/create/templates/google-go/fn.go new file mode 100644 index 000000000..070be59c8 --- /dev/null +++ b/lib/plugins/create/templates/google-go/fn.go @@ -0,0 +1,14 @@ +package hello + +import ( + "fmt" + "net/http" +) + +func Hello(w http.ResponseWriter, r *http.Request) { + name := r.URL.Query().Get("name") + if name == "" { + name = "someone" + } + fmt.Fprintf(w, "Hello, %s!", name) +} diff --git a/lib/plugins/create/templates/google-go/fn_test.go b/lib/plugins/create/templates/google-go/fn_test.go new file mode 100644 index 000000000..05f2d679b --- /dev/null +++ b/lib/plugins/create/templates/google-go/fn_test.go @@ -0,0 +1,44 @@ +package hello + +import ( + "io/ioutil" + "net/http" + "net/http/httptest" + "testing" +) + +func TestHello(t *testing.T) { + tests := map[string]struct { + name string + wantStatus int + wantString string + }{ + "name specified": {"toshi0607", http.StatusOK, "Hello, toshi0607!"}, + "name not specified": {"", http.StatusOK, "Hello, someone!"}, + } + + for name, te := range tests { + t.Run(name, func(t *testing.T) { + w := httptest.NewRecorder() + r := httptest.NewRequest(http.MethodGet, "/", nil) + q := r.URL.Query() + q.Add("name", te.name) + r.URL.RawQuery = q.Encode() + + Hello(w, r) + + rw := w.Result() + defer rw.Body.Close() + if s := rw.StatusCode; s != te.wantStatus { + t.Fatalf("got: %d, want: %d", s, te.wantStatus) + } + b, err := ioutil.ReadAll(rw.Body) + if err != nil { + t.Fatal("failed to read res body") + } + if s := string(b); s != te.wantString { + t.Fatalf("got: %s, want: %s", s, te.wantString) + } + }) + } +} diff --git a/lib/plugins/create/templates/google-go/serverless.yml b/lib/plugins/create/templates/google-go/serverless.yml new file mode 100644 index 000000000..8be1972d1 --- /dev/null +++ b/lib/plugins/create/templates/google-go/serverless.yml @@ -0,0 +1,44 @@ +service: gcf-go111 # NOTE: Don't put the word "google" in here + +provider: + name: google + runtime: go111 + project: my-project + # the path to the credentials file needs to be absolute + credentials: ~/.gcloud/keyfile.json + +plugins: + - serverless-google-cloudfunctions + +# needs more granular excluding in production as only the serverless provider npm +# package should be excluded (and not the whole node_modules directory) +package: + exclude: + - .gitignore + - .git/** + +functions: + first: + handler: http + events: + - http: path + + # NOTE: the following uses an "event" event (pubSub event in this case). + # Please create the corresponding resources in the Google Cloud + # before deploying this service through Serverless + + #second: + # handler: event + # events: + # - event: + # eventType: providers/cloud.pubsub/eventTypes/topic.publish + # resource: projects/*/topics/my-topic + +# you can define resources, templates etc. the same way you would in a +# Google Cloud deployment configuration +#resources: +# resources: +# - type: storage.v1.bucket +# name: my-serverless-service-bucket +# imports: +# - path: my_template.jinja diff --git a/tests/templates/test_all_templates b/tests/templates/test_all_templates index c5a462982..211244236 100755 --- a/tests/templates/test_all_templates +++ b/tests/templates/test_all_templates @@ -30,6 +30,7 @@ integration-test aws-nodejs-typescript integration-test aws-alexa-typescript integration-test aws-nodejs-ecma-script integration-test google-nodejs +integration-test google-go integration-test spotinst-nodejs integration-test spotinst-python integration-test spotinst-ruby