Skip to content

Commit

Permalink
Stubs for SDK alpha/beta/stable functionality (#1285)
Browse files Browse the repository at this point in the history
This gets the requisite pieces in place, such that alpha and beta
features can be written for the GameServer SDKs.

This includes:
- Moving the sdk.proto into the proto directory
- Updating all the gen scripts for clients for the new sdk.proto
  location
- creating new alpha.proto and beta.proto definitions, with an empty
  service stub
- Integrated the new alpha and beta service stubs into the sdkserver
  local and sidecar implementations.
- Moved all the swagger generated files under ./sdks/swagger (felt like
  an appropriate place)

I've deliberately not update all the clients as (a) I felt it would make
this PR too big and (b) each language's client may have slightly
different integration requirements. I figured it could be handled on a
case by case basis, as required.
  • Loading branch information
markmandel committed Jan 29, 2020
1 parent 7974eb9 commit 7126d1f
Show file tree
Hide file tree
Showing 25 changed files with 568 additions and 52 deletions.
2 changes: 1 addition & 1 deletion build/boilerplate.go.txt
@@ -1,4 +1,4 @@
// Copyright 2019 Google LLC All Rights Reserved.
// Copyright 2020 Google LLC All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
Expand Down
5 changes: 3 additions & 2 deletions build/build-sdk-images/cpp/gen.sh
Expand Up @@ -20,6 +20,7 @@ header() {
cat /go/src/agones.dev/agones/build/boilerplate.go.txt ./$1 >> $2/$1
}

sdk=/go/src/agones.dev/agones/proto/sdk
googleapis=/go/src/agones.dev/agones/proto/googleapis
protoc_intermediate=/go/src/agones.dev/agones/sdks/cpp/.generated
protoc_destination=/go/src/agones.dev/agones/sdks/cpp
Expand All @@ -33,8 +34,8 @@ mkdir -p ${protoc_destination}/include/google/api
cd /go/src/agones.dev/agones/sdks/cpp
find -name '*.pb.*' -delete
cd /go/src/agones.dev/agones
protoc -I ${googleapis} -I . --grpc_out=${protoc_intermediate} --plugin=protoc-gen-grpc=`which grpc_cpp_plugin` sdk.proto
protoc -I ${googleapis} -I . --cpp_out=dllexport_decl=AGONES_EXPORT:${protoc_intermediate} sdk.proto ${googleapis}/google/api/annotations.proto ${googleapis}/google/api/http.proto
protoc -I ${googleapis} -I ${sdk} --grpc_out=${protoc_intermediate} --plugin=protoc-gen-grpc=`which grpc_cpp_plugin` sdk.proto
protoc -I ${googleapis} -I ${sdk} --cpp_out=dllexport_decl=AGONES_EXPORT:${protoc_intermediate} sdk.proto ${googleapis}/google/api/annotations.proto ${googleapis}/google/api/http.proto

cd ${protoc_intermediate}
header sdk.grpc.pb.cc ${protoc_destination}/src/agones
Expand Down
52 changes: 40 additions & 12 deletions build/build-sdk-images/go/gen.sh
Expand Up @@ -16,6 +16,13 @@

set -ex

header() {
cat /go/src/agones.dev/agones/build/boilerplate.go.txt "$1" | sponge "$1"
}

sdk=/go/src/agones.dev/agones/proto/sdk
googleapis=/go/src/agones.dev/agones/proto/googleapis

export GO111MODULE=on

mkdir -p /go/src/
Expand All @@ -25,21 +32,42 @@ cd /go/src/agones.dev/agones
go install -mod=vendor github.com/grpc-ecosystem/grpc-gateway/protoc-gen-grpc-gateway
go install -mod=vendor github.com/grpc-ecosystem/grpc-gateway/protoc-gen-swagger

googleapis=/go/src/agones.dev/agones/proto/googleapis
mkdir -p ./pkg/sdk/{alpha,beta} || true

rm ./pkg/sdk/beta/beta.pb.gw.go || true
rm ./pkg/sdk/alpha/alpha.pb.gw.go || true

# generate the go code for each feature stage
protoc -I ${googleapis} -I ${sdk} sdk.proto --go_out=plugins=grpc:pkg/sdk
protoc -I ${googleapis} -I ${sdk}/alpha alpha.proto --go_out=plugins=grpc:pkg/sdk/alpha
protoc -I ${googleapis} -I ${sdk}/beta beta.proto --go_out=plugins=grpc:pkg/sdk/beta

# generate grpc gateway
protoc -I ${googleapis} -I ${sdk} sdk.proto --grpc-gateway_out=logtostderr=true:pkg/sdk
protoc -I ${googleapis} -I ${sdk}/alpha alpha.proto --grpc-gateway_out=logtostderr=true:pkg/sdk/alpha
protoc -I ${googleapis} -I ${sdk}/beta beta.proto --grpc-gateway_out=logtostderr=true:pkg/sdk/beta

protoc -I ${googleapis} -I . sdk.proto --go_out=plugins=grpc:pkg/sdk
protoc -I ${googleapis} -I . sdk.proto --grpc-gateway_out=logtostderr=true:pkg/sdk
protoc -I ${googleapis} -I . sdk.proto --swagger_out=logtostderr=true:.
jq 'del(.schemes[] | select(. == "https"))' sdk.swagger.json > sdk.swagger.temp.json
mv sdk.swagger.temp.json sdk.swagger.json
protoc -I ${googleapis} -I ${sdk} sdk.proto --swagger_out=logtostderr=true:sdks/swagger
protoc -I ${googleapis} -I ${sdk}/alpha alpha.proto --swagger_out=logtostderr=true:sdks/swagger
protoc -I ${googleapis} -I ${sdk}/beta beta.proto --swagger_out=logtostderr=true:sdks/swagger

cat ./build/boilerplate.go.txt ./pkg/sdk/sdk.pb.go >> ./sdk.pb.go
cat ./build/boilerplate.go.txt ./pkg/sdk/sdk.pb.gw.go >> ./sdk.pb.gw.go
jq 'del(.schemes[] | select(. == "https"))' ./sdks/swagger/sdk.swagger.json | sponge ./sdks/swagger/sdk.swagger.json
jq 'del(.schemes[] | select(. == "https"))' ./sdks/swagger/alpha.swagger.json | sponge ./sdks/swagger/alpha.swagger.json
jq 'del(.schemes[] | select(. == "https"))' ./sdks/swagger/beta.swagger.json | sponge ./sdks/swagger/beta.swagger.json

goimports -w ./sdk.pb.go
goimports -w ./sdk.pb.gw.go
header ./pkg/sdk/sdk.pb.go
header ./pkg/sdk/sdk.pb.gw.go
header ./pkg/sdk/alpha/alpha.pb.go
header ./pkg/sdk/beta/beta.pb.go

mv ./sdk.pb.go ./pkg/sdk
mv ./sdk.pb.gw.go ./pkg/sdk
# these files may not exist if there are no grpc services
if [ -f "./pkg/sdk/alpha/alpha.pb.gw.go" ]; then
header ./pkg/sdk/alpha/alpha.pb.gw.go
fi
if [ -f "./pkg/sdk/beta/beta.pb.gw.go" ]; then
header ./pkg/sdk/beta/beta.pb.gw.go
fi

goimports -w ./pkg/sdk/*
goimports -w ./pkg/sdk/alpha/*
goimports -w ./pkg/sdk/beta/*
5 changes: 3 additions & 2 deletions build/build-sdk-images/node/gen.sh
Expand Up @@ -20,12 +20,13 @@ header() {
cat ./build/boilerplate.go.txt $1 >> ./tmp.js && mv ./tmp.js $1
}

sdk=/go/src/agones.dev/agones/proto/sdk
googleapis=/go/src/agones.dev/agones/proto/googleapis

cd /go/src/agones.dev/agones

protoc -I ${googleapis} -I . --grpc_out=./sdks/nodejs/lib --plugin=protoc-gen-grpc=`which grpc_node_plugin` sdk.proto
protoc -I ${googleapis} -I . --js_out=import_style=commonjs,binary:./sdks/nodejs/lib sdk.proto ${googleapis}/google/api/annotations.proto ${googleapis}/google/api/http.proto
protoc -I ${googleapis} -I ${sdk} --grpc_out=./sdks/nodejs/lib --plugin=protoc-gen-grpc=`which grpc_node_plugin` sdk.proto
protoc -I ${googleapis} -I ${sdk} --js_out=import_style=commonjs,binary:./sdks/nodejs/lib sdk.proto ${googleapis}/google/api/annotations.proto ${googleapis}/google/api/http.proto

header ./sdks/nodejs/lib/sdk_pb.js
header ./sdks/nodejs/lib/google/api/annotations_pb.js
Expand Down
2 changes: 1 addition & 1 deletion build/build-sdk-images/restapi/build-sdk-test.sh
Expand Up @@ -17,4 +17,4 @@

mkdir /go/src/agones.dev/agones/swagger
wget -q https://repo1.maven.org/maven2/io/swagger/swagger-codegen-cli/2.4.10/swagger-codegen-cli-2.4.10.jar -O /tmp/swagger-codegen-cli.jar
java -jar /tmp/swagger-codegen-cli.jar generate -i /go/src/agones.dev/agones/sdk.swagger.json -l go -o /go/src/agones.dev/agones/test/sdk/restapi/swagger
java -jar /tmp/swagger-codegen-cli.jar generate -i /go/src/agones.dev/agones/sdks/swagger/sdk.swagger.json -l go -o /go/src/agones.dev/agones/test/sdk/restapi/swagger
3 changes: 2 additions & 1 deletion build/build-sdk-images/rust/gen.sh
Expand Up @@ -18,10 +18,11 @@ set -ex

googleapis=/go/src/agones.dev/agones/proto/googleapis

sdk=/go/src/agones.dev/agones/proto/sdk
cd /go/src/agones.dev/agones

protoc \
-I ${googleapis} -I . sdk.proto \
-I ${googleapis} -I ${sdk} sdk.proto \
--rust_out=sdks/rust/src/grpc --grpc_out=sdks/rust/src/grpc \
--plugin=protoc-gen-grpc=`which grpc_rust_plugin` \

Expand Down
2 changes: 1 addition & 1 deletion build/build-sdk-images/tool/base/Dockerfile
Expand Up @@ -21,7 +21,7 @@ FROM debian:stretch

RUN apt-get update && apt-get install -y \
build-essential autoconf libtool git pkg-config curl \
automake libtool curl make g++ unzip \
automake libtool curl make g++ unzip moreutils \
&& apt-get clean

ARG GRPC_RELEASE_TAG
Expand Down
70 changes: 49 additions & 21 deletions cmd/sdk-server/main.go
Expand Up @@ -27,7 +27,11 @@ import (
"agones.dev/agones/pkg"
"agones.dev/agones/pkg/client/clientset/versioned"
"agones.dev/agones/pkg/sdk"
sdkalpha "agones.dev/agones/pkg/sdk/alpha"
sdkbeta "agones.dev/agones/pkg/sdk/beta"
"agones.dev/agones/pkg/sdkserver"
serveralpha "agones.dev/agones/pkg/sdkserver/alpha"
serverbeta "agones.dev/agones/pkg/sdkserver/beta"
"agones.dev/agones/pkg/util/runtime"
"agones.dev/agones/pkg/util/signals"
gwruntime "github.com/grpc-ecosystem/grpc-gateway/runtime"
Expand Down Expand Up @@ -92,11 +96,11 @@ func main() {

switch {
case ctlConf.IsLocal:
localSDK, err := registerLocal(grpcServer, ctlConf)
cancel, err := registerLocal(grpcServer, ctlConf)
if err != nil {
logger.WithError(err).Fatal("Could not start local sdk server")
}
defer localSDK.Close()
defer cancel()

if ctlConf.Timeout != 0 {
go func() {
Expand All @@ -105,11 +109,11 @@ func main() {
}()
}
case ctlConf.Test != "":
localSDK, err := registerTestSdkServer(grpcServer, ctlConf)
cancel, err := registerTestSdkServer(grpcServer, ctlConf)
if err != nil {
logger.WithError(err).Fatal("Could not start test sdk server")
}
defer localSDK.Close()
defer cancel()

if ctlConf.Timeout != 0 {
go func() {
Expand Down Expand Up @@ -150,6 +154,8 @@ func main() {
}
}()
sdk.RegisterSDKServer(grpcServer, s)
sdkalpha.RegisterSDKServer(grpcServer, serveralpha.NewSDKServer())
sdkbeta.RegisterSDKServer(grpcServer, serverbeta.NewSDKServer())
}

grpcEndpoint := fmt.Sprintf("%s:%d", ctlConf.Address, ctlConf.GRPCPort)
Expand All @@ -164,39 +170,61 @@ func main() {
logger.Info("shutting down sdk server")
}

func registerLocal(grpcServer *grpc.Server, ctlConf config) (localSDK *sdkserver.LocalSDKServer, err error) {
// registerLocal registers the local SDK servers, and returns a cancel func that
// closes all the SDK implementations
func registerLocal(grpcServer *grpc.Server, ctlConf config) (func(), error) {
filePath := ""
if ctlConf.LocalFile != "" {
filePath, err = filepath.Abs(ctlConf.LocalFile)
filePath, err := filepath.Abs(ctlConf.LocalFile)
if err != nil {
return
return nil, err
}

if _, err = os.Stat(filePath); os.IsNotExist(err) {
err = errors.Errorf("Could not find file: %s", filePath)
return
return nil, errors.Errorf("Could not find file: %s", filePath)
}
}

localSDK, err = sdkserver.NewLocalSDKServer(filePath)
stableSDK, err := sdkserver.NewLocalSDKServer(filePath)
if err != nil {
return
return nil, err
}
sdk.RegisterSDKServer(grpcServer, localSDK)
return
alphaSDK := serveralpha.NewLocalSDKServer()
betaSDK := serverbeta.NewLocalSDKServer()

sdk.RegisterSDKServer(grpcServer, stableSDK)
sdkalpha.RegisterSDKServer(grpcServer, alphaSDK)
sdkbeta.RegisterSDKServer(grpcServer, betaSDK)
return func() {
alphaSDK.Close()
betaSDK.Close()
stableSDK.Close()
}, err
}

func registerTestSdkServer(grpcServer *grpc.Server, ctlConf config) (localSDK *sdkserver.LocalSDKServer, err error) {
localSDK, err = sdkserver.NewLocalSDKServer("")
// registerLocal registers the local test SDK servers, and returns a cancel func that
// closes all the SDK implementations
func registerTestSdkServer(grpcServer *grpc.Server, ctlConf config) (func(), error) {
stableSDK, err := sdkserver.NewLocalSDKServer("")
if err != nil {
return
return nil, err
}
localSDK.SetTestMode(true)
localSDK.GenerateUID()
alphaSDK := serveralpha.NewLocalSDKServer()
betaSDK := serverbeta.NewLocalSDKServer()

stableSDK.SetTestMode(true)
stableSDK.GenerateUID()
expectedFuncs := strings.Split(ctlConf.Test, ",")
localSDK.SetExpectedSequence(expectedFuncs)
sdk.RegisterSDKServer(grpcServer, localSDK)
return
stableSDK.SetExpectedSequence(expectedFuncs)

sdk.RegisterSDKServer(grpcServer, stableSDK)
sdkalpha.RegisterSDKServer(grpcServer, alphaSDK)
sdkbeta.RegisterSDKServer(grpcServer, betaSDK)
return func() {
alphaSDK.Close()
betaSDK.Close()
stableSDK.Close()
}, err
}

// runGrpc runs the grpc service
Expand Down
95 changes: 95 additions & 0 deletions pkg/sdk/alpha/alpha.pb.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

0 comments on commit 7126d1f

Please sign in to comment.