From a2e923432f1f0c909f71de83b1ad86a315c5de35 Mon Sep 17 00:00:00 2001 From: Lillian Liang Date: Thu, 7 Nov 2019 12:05:31 -0800 Subject: [PATCH 01/10] COMMIT0-57 api for generating project --- cmd/generate.go | 26 ++------ example/hello-world/go.mod | 1 - go.mod | 1 + go.sum | 2 + internal/api/README.md | 26 ++++++++ internal/api/create_project.go | 97 ++++++++++++++++++++++++++++ internal/api/generate_api.go | 54 ++++++++++++++++ internal/config/config.go | 4 +- internal/templator/templator.go | 2 + internal/util/projectAttributes.go | 21 ++++++ templates/commit0/api_generated.tmpl | 55 ++++++++++++++++ 11 files changed, 264 insertions(+), 25 deletions(-) create mode 100644 internal/api/README.md create mode 100644 internal/api/create_project.go create mode 100644 internal/api/generate_api.go create mode 100644 internal/util/projectAttributes.go create mode 100644 templates/commit0/api_generated.tmpl diff --git a/cmd/generate.go b/cmd/generate.go index c103c2665..d426bf86b 100644 --- a/cmd/generate.go +++ b/cmd/generate.go @@ -19,14 +19,6 @@ import ( var configPath string -const ( - Go = "go" - React = "react" - Kubernetes = "kubernetes" -) - -var supportedLanguages = [...]string{Go, React, Kubernetes} - func init() { generateCmd.PersistentFlags().StringVarP(&configPath, "config", "c", "commit0.yml", "config path") @@ -46,19 +38,19 @@ var generateCmd = &cobra.Command{ cfg.Print() var wg sync.WaitGroup - if !ValidLanguage(cfg.Frontend.Framework) { + if !util.ValidateLanguage(cfg.Frontend.Framework) { log.Fatalln(aurora.Red(emoji.Sprintf(":exclamation: '%s' is not a supported framework.", cfg.Frontend.Framework))) } for _, s := range cfg.Services { - if !ValidLanguage(cfg.Frontend.Framework) { + if !util.ValidateLanguage(cfg.Frontend.Framework) { log.Fatalln(aurora.Red(emoji.Sprintf(":exclamation: '%s' in service '%s' is not a supported language.", s.Name, s.Language))) } } for _, s := range cfg.Services { switch s.Language { - case Go: + case util.Go: log.Println(aurora.Cyan(emoji.Sprintf("Creating Go service"))) proto.Generate(t, cfg, s, &wg) golang.Generate(t, cfg, s, &wg) @@ -72,7 +64,7 @@ var generateCmd = &cobra.Command{ // @TODO : This strucuture probably needs to be adjusted. Probably too generic. switch cfg.Frontend.Framework { - case React: + case util.React: log.Println(aurora.Cyan(emoji.Sprintf("Creating React frontend"))) react.Generate(t, cfg, &wg) } @@ -90,13 +82,3 @@ var generateCmd = &cobra.Command{ }, } - -func ValidLanguage(language string) bool { - for _, l := range supportedLanguages { - if l == language { - return true - } - } - - return false -} diff --git a/example/hello-world/go.mod b/example/hello-world/go.mod index 9b83fa8ac..fcdaf198d 100644 --- a/example/hello-world/go.mod +++ b/example/hello-world/go.mod @@ -7,7 +7,6 @@ replace github.com/yourrepo/hello-world-idl => ./hello-world-idl require ( github.com/grpc-ecosystem/grpc-gateway v1.11.3 // indirect github.com/yourrepo/hello-world-idl v0.0.0 - google.golang.org/appengine v1.4.0 // indirect google.golang.org/genproto v0.0.0-20191009194640-548a555dbc03 // indirect google.golang.org/grpc v1.24.0 // indirect ) diff --git a/go.mod b/go.mod index e83a5c97b..316bc3597 100644 --- a/go.mod +++ b/go.mod @@ -5,6 +5,7 @@ go 1.12 require ( github.com/gobuffalo/logger v1.0.1 // indirect github.com/gobuffalo/packr/v2 v2.5.2 + github.com/gorilla/mux v1.7.3 github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88 // indirect github.com/k0kubun/pp v3.0.1+incompatible github.com/kyokomi/emoji v2.1.0+incompatible diff --git a/go.sum b/go.sum index ea6ccd3ee..1d68c2377 100644 --- a/go.sum +++ b/go.sum @@ -17,6 +17,8 @@ github.com/gobuffalo/packd v0.3.0 h1:eMwymTkA1uXsqxS0Tpoop3Lc0u3kTfiMBE6nKtQU4g4 github.com/gobuffalo/packd v0.3.0/go.mod h1:zC7QkmNkYVGKPw4tHpBQ+ml7W/3tIebgeo1b36chA3Q= github.com/gobuffalo/packr/v2 v2.5.2 h1:4EvjeIpQLZuRIljwnidYgbRXbr1yIzVRrESiLjqKj6s= github.com/gobuffalo/packr/v2 v2.5.2/go.mod h1:sgEE1xNZ6G0FNN5xn9pevVu4nywaxHvgup67xisti08= +github.com/gorilla/mux v1.7.3 h1:gnP5JzjVOuiZD07fKKToCAOjS0yOpj/qPETTXCCS6hw= +github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= diff --git a/internal/api/README.md b/internal/api/README.md new file mode 100644 index 000000000..04e2b4013 --- /dev/null +++ b/internal/api/README.md @@ -0,0 +1,26 @@ +# Commit0 Api + +## Usage + - To run: + `go run internal/api/generate_api.go internal/api/create_project.go` + - Endpoint: + `localhost:8080/{version}/generate` + - Post request body json example: + ``` { + "projectName":"funApp", + "language":"go", + "organization":"commit org", + "description":"this app will do amazing things", + "gitRepoName":"fun-repo", + "maintainers":[ + { + "name":"Lill", + "email":"ll@gmail.com" + }, + { + "name":"Pi", + "email":"pi@live.ca" + } + ] + } + ``` diff --git a/internal/api/create_project.go b/internal/api/create_project.go new file mode 100644 index 000000000..dd461be9c --- /dev/null +++ b/internal/api/create_project.go @@ -0,0 +1,97 @@ +package main + +import ( + "log" + "os" + "path" + "sync" + + "github.com/commitdev/commit0/internal/config" + "github.com/commitdev/commit0/internal/generate/ci" + "github.com/commitdev/commit0/internal/generate/docker" + "github.com/commitdev/commit0/internal/generate/golang" + "github.com/commitdev/commit0/internal/generate/http" + "github.com/commitdev/commit0/internal/generate/kubernetes" + "github.com/commitdev/commit0/internal/generate/proto" + "github.com/commitdev/commit0/internal/generate/react" + "github.com/commitdev/commit0/internal/templator" + "github.com/commitdev/commit0/internal/util" + "github.com/gobuffalo/packr/v2" +) + +func CreateProject(projectConfig ProjectConfiguration) string { + templates := packr.New("templates", "../../templates") + t := templator.NewTemplator(templates) + outDir := "./" + rootDir := path.Join(outDir, projectConfig.ProjectName) + log.Printf("Creating project %s.", projectConfig.ProjectName) + err := os.MkdirAll(rootDir, os.ModePerm) + + if os.IsExist(err) { + log.Fatalf("Directory %v already exists! Error: %v", projectConfig.ProjectName, err) + } else if err != nil { + log.Fatalf("Error creating root: %v ", err) + } + var wg sync.WaitGroup + + util.TemplateFileIfDoesNotExist(rootDir, util.ApiGeneratedYamlName, t.ApiCommit0, &wg, projectConfig) + + util.TemplateFileIfDoesNotExist(rootDir, ".gitignore", t.GitIgnore, &wg, projectConfig.ProjectName) + + wg.Wait() + + GenerateArtifacts(projectConfig.ProjectName, projectConfig.Language) + + return rootDir +} + +func GenerateArtifacts(projectName, language string) { + if !util.ValidateLanguage(language) { + log.Fatalf("'%s' is not a supported language.", language) + } + + templates := packr.New("templates", "../templates") + t := templator.NewTemplator(templates) + + err := os.Chdir(projectName) //cd into project + if (err != nil) { + panic(err) + } + + cfg := config.LoadConfig(util.ApiGeneratedYamlName) + cfg.Language = language + cfg.Print() + + var wg sync.WaitGroup + switch language { + case util.Go: + proto.Generate(t, cfg, &wg) + golang.Generate(t, cfg, &wg) + + docker.GenerateGoAppDockerFile(t, cfg, &wg) + docker.GenerateGoDockerCompose(t, cfg, &wg) + case util.React: + react.Generate(t, cfg, &wg) + case util.Kubernetes: + kubernetes.Generate(t, cfg, &wg) + } + + util.TemplateFileIfDoesNotExist("", "README.md", t.Readme, &wg, cfg) + + if cfg.CI.System != "" { + ci.Generate(t.CI, cfg, ".", &wg) + } + + if cfg.Network.Http.Enabled { + http.GenerateHTTPGW(t, cfg, &wg) + docker.GenerateGoHTTPGWDockerFile(t, cfg, &wg) + } + + // Wait for all the templates to be generated + wg.Wait() + + switch language { + case util.Kubernetes: + kubernetes.Execute(cfg) + } +} diff --git a/internal/api/generate_api.go b/internal/api/generate_api.go new file mode 100644 index 000000000..42bffc326 --- /dev/null +++ b/internal/api/generate_api.go @@ -0,0 +1,54 @@ +package main + + +import ( + "encoding/json" + "log" + "net/http" + + "github.com/gorilla/mux" +) + +type Maintainer struct { + Name string `json:"name"` + Email string `json:"email"` +} + +type ProjectConfiguration struct { + ProjectName string `json:"projectName"` + Language string `json:"language"` + Organization string `json:"organization"` + Description string `json:"description"` + GitRepoName string `json:"gitRepoName"` + Maintainers []Maintainer `json:"maintainers"` +} + +func generate(w http.ResponseWriter, req *http.Request) { + w.Header().Set("Content-Type", "application/json") + switch req.Method { + case "POST": + decoder := json.NewDecoder(req.Body) + var projectConfig ProjectConfiguration + err := decoder.Decode(&projectConfig) + if err != nil { + panic(err) + } + log.Println(projectConfig.ProjectName) + CreateProject(projectConfig) + w.WriteHeader(http.StatusCreated) + w.Write([]byte(`{"message": "Post successful"}`)) + + default: + w.WriteHeader(http.StatusNotFound) + w.Write([]byte(`{"message": "Not found"}`)) + } + +} + +func main() { + var router = mux.NewRouter() + var api = router.PathPrefix("/v1/generate").Subrouter() + api.NotFoundHandler = http.HandlerFunc(generate) + + log.Fatal(http.ListenAndServe(":8080", router)) +} diff --git a/internal/config/config.go b/internal/config/config.go index 6ae68273a..1eeee6578 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -8,7 +8,7 @@ import ( "gopkg.in/yaml.v2" ) -type maintainers struct { +type maintainer struct { Name string Email string } @@ -63,7 +63,7 @@ type Commit0Config struct { Organization string Name string Description string - Maintainers []maintainers + Maintainers []maintainer Services []Service Frontend frontend Infrastructure infrastructure diff --git a/internal/templator/templator.go b/internal/templator/templator.go index 1d53cf52f..4f4f0cce7 100644 --- a/internal/templator/templator.go +++ b/internal/templator/templator.go @@ -37,6 +37,7 @@ type GoTemplator struct { // Templator contains all the templates type Templator struct { + ApiCommit0 *template.Template Commit0 *template.Template GitIgnore *template.Template Readme *template.Template @@ -56,6 +57,7 @@ func NewTemplator(box *packr.Box) *Templator { ProtoHealthTemplate: NewSingleFileTemplator(box, "proto/health_proto.tmpl"), ProtoServiceTemplate: NewSingleFileTemplator(box, "proto/service_proto.tmpl"), Go: NewGoTemplator(box), + ApiCommit0: NewSingleFileTemplator(box, "commit0/api_generated.tmpl"), Commit0: NewSingleFileTemplator(box, "commit0/commit0.tmpl"), GitIgnore: NewSingleFileTemplator(box, "util/gitignore.tmpl"), Readme: NewSingleFileTemplator(box, "util/README.tmpl"), diff --git a/internal/util/projectAttributes.go b/internal/util/projectAttributes.go new file mode 100644 index 000000000..aaf9b124f --- /dev/null +++ b/internal/util/projectAttributes.go @@ -0,0 +1,21 @@ +package util + +const ( + Go = "go" + React = "react" + Kubernetes = "kubernetes" +) + +const ApiGeneratedYamlName = "generated-project.yml" + +var supportedLanguages = [...]string{Go, React, Kubernetes} + +func ValidateLanguage(language string) bool { + for _, l := range supportedLanguages { + if l == language { + return true + } + } + + return false +} diff --git a/templates/commit0/api_generated.tmpl b/templates/commit0/api_generated.tmpl new file mode 100644 index 000000000..948b1ce03 --- /dev/null +++ b/templates/commit0/api_generated.tmpl @@ -0,0 +1,55 @@ +organization: {{.Organization}} +name: {{.ProjectName}} +description: {{.Description}} +git-repo: github.com/{{.GitRepoName}} +docker-repo: +maintainers: +{{range .Maintainers}} +# - name: {{.Name}} +# email: {{.Email}} +{{end}} + +kubernetes: + clusterName: staging + deploy: true + awsAccountId: 1234 + awsRegion: us-east-1 + +network: + grpc: + host: 0.0.0.0 + port: 3000 + http: + enabled: true + port: 8080 + web: + enabled: true + port: 8090 + +react: + app: + name: {{.ProjectName}} + header: + enabled: true + account: + enabled: true + required: false + sidenav: + enabled: true + items: + - path: / + label: Home + icon: home + - path: /account + label: Account + icon: account_circle + views: + - path: /account + component: account + - path: / + component: home + +ci: + system: circleci + +services: From 0a31ebb3aad9b3e6d817dfdda05384fc96519f60 Mon Sep 17 00:00:00 2001 From: Lillian Liang Date: Thu, 7 Nov 2019 13:07:57 -0800 Subject: [PATCH 02/10] COMMIT0-57-refactor --- cmd/generate.go | 54 +------------------------ internal/api/README.md | 17 +++++++- internal/api/create_project.go | 52 +++--------------------- internal/api/generate_api.go | 23 +++++++---- internal/generate/generate_helper.go | 60 ++++++++++++++++++++++++++++ templates/commit0/api_generated.tmpl | 59 +++++++++++++++++---------- 6 files changed, 135 insertions(+), 130 deletions(-) create mode 100644 internal/generate/generate_helper.go diff --git a/cmd/generate.go b/cmd/generate.go index d426bf86b..88398881c 100644 --- a/cmd/generate.go +++ b/cmd/generate.go @@ -1,19 +1,10 @@ package cmd import ( - "log" - "sync" - "github.com/commitdev/commit0/internal/config" - "github.com/commitdev/commit0/internal/generate/golang" - "github.com/commitdev/commit0/internal/generate/kubernetes" - "github.com/commitdev/commit0/internal/generate/proto" - "github.com/commitdev/commit0/internal/generate/react" + "github.com/commitdev/commit0/internal/generate" "github.com/commitdev/commit0/internal/templator" - "github.com/commitdev/commit0/internal/util" "github.com/gobuffalo/packr/v2" - "github.com/kyokomi/emoji" - "github.com/logrusorgru/aurora" "github.com/spf13/cobra" ) @@ -37,48 +28,7 @@ var generateCmd = &cobra.Command{ cfg := config.LoadConfig(configPath) cfg.Print() - var wg sync.WaitGroup - if !util.ValidateLanguage(cfg.Frontend.Framework) { - log.Fatalln(aurora.Red(emoji.Sprintf(":exclamation: '%s' is not a supported framework.", cfg.Frontend.Framework))) - } - - for _, s := range cfg.Services { - if !util.ValidateLanguage(cfg.Frontend.Framework) { - log.Fatalln(aurora.Red(emoji.Sprintf(":exclamation: '%s' in service '%s' is not a supported language.", s.Name, s.Language))) - } - } - - for _, s := range cfg.Services { - switch s.Language { - case util.Go: - log.Println(aurora.Cyan(emoji.Sprintf("Creating Go service"))) - proto.Generate(t, cfg, s, &wg) - golang.Generate(t, cfg, s, &wg) - } - } - - if cfg.Infrastructure.AWS.EKS.ClusterName != "" { - log.Println(aurora.Cyan(emoji.Sprintf("Generating Terraform"))) - kubernetes.Generate(t, cfg, &wg) - } - - // @TODO : This strucuture probably needs to be adjusted. Probably too generic. - switch cfg.Frontend.Framework { - case util.React: - log.Println(aurora.Cyan(emoji.Sprintf("Creating React frontend"))) - react.Generate(t, cfg, &wg) - } - - util.TemplateFileIfDoesNotExist("", "README.md", t.Readme, &wg, templator.GenericTemplateData{*cfg}) - - // Wait for all the templates to be generated - wg.Wait() - - log.Println("Executing commands") - // @TODO : Move this stuff to another command? Or genericize it a bit. - if cfg.Infrastructure.AWS.EKS.Deploy { - kubernetes.Execute(cfg) - } + generate.GenerateArtifactsHelper(t, cfg) }, } diff --git a/internal/api/README.md b/internal/api/README.md index 04e2b4013..06bd44cb4 100644 --- a/internal/api/README.md +++ b/internal/api/README.md @@ -8,10 +8,9 @@ - Post request body json example: ``` { "projectName":"funApp", - "language":"go", + "frontendLanguage":"react", "organization":"commit org", "description":"this app will do amazing things", - "gitRepoName":"fun-repo", "maintainers":[ { "name":"Lill", @@ -21,6 +20,20 @@ "name":"Pi", "email":"pi@live.ca" } + ], + "services":[ + { + "name":"user", + "description":"user service", + "language":"go", + "gitRepo":"github.com/user" + }, + { + "name":"account", + "description":"bank account service", + "language":"go", + "gitRepo":"github.com/account" + } ] } ``` diff --git a/internal/api/create_project.go b/internal/api/create_project.go index dd461be9c..fa501eacd 100644 --- a/internal/api/create_project.go +++ b/internal/api/create_project.go @@ -7,13 +7,7 @@ import ( "sync" "github.com/commitdev/commit0/internal/config" - "github.com/commitdev/commit0/internal/generate/ci" - "github.com/commitdev/commit0/internal/generate/docker" - "github.com/commitdev/commit0/internal/generate/golang" - "github.com/commitdev/commit0/internal/generate/http" - "github.com/commitdev/commit0/internal/generate/kubernetes" - "github.com/commitdev/commit0/internal/generate/proto" - "github.com/commitdev/commit0/internal/generate/react" + "github.com/commitdev/commit0/internal/generate" "github.com/commitdev/commit0/internal/templator" "github.com/commitdev/commit0/internal/util" "github.com/gobuffalo/packr/v2" @@ -40,58 +34,22 @@ func CreateProject(projectConfig ProjectConfiguration) string { wg.Wait() - GenerateArtifacts(projectConfig.ProjectName, projectConfig.Language) + GenerateArtifacts(projectConfig) return rootDir } -func GenerateArtifacts(projectName, language string) { - if !util.ValidateLanguage(language) { - log.Fatalf("'%s' is not a supported language.", language) - } +func GenerateArtifacts(projectConfig ProjectConfiguration) { templates := packr.New("templates", "../templates") t := templator.NewTemplator(templates) - err := os.Chdir(projectName) //cd into project + err := os.Chdir(projectConfig.ProjectName) //cd into project if (err != nil) { panic(err) } - cfg := config.LoadConfig(util.ApiGeneratedYamlName) - cfg.Language = language cfg.Print() - var wg sync.WaitGroup - switch language { - case util.Go: - proto.Generate(t, cfg, &wg) - golang.Generate(t, cfg, &wg) - - docker.GenerateGoAppDockerFile(t, cfg, &wg) - docker.GenerateGoDockerCompose(t, cfg, &wg) - case util.React: - react.Generate(t, cfg, &wg) - case util.Kubernetes: - kubernetes.Generate(t, cfg, &wg) - } - - util.TemplateFileIfDoesNotExist("", "README.md", t.Readme, &wg, cfg) - - if cfg.CI.System != "" { - ci.Generate(t.CI, cfg, ".", &wg) - } - - if cfg.Network.Http.Enabled { - http.GenerateHTTPGW(t, cfg, &wg) - docker.GenerateGoHTTPGWDockerFile(t, cfg, &wg) - } - - // Wait for all the templates to be generated - wg.Wait() - - switch language { - case util.Kubernetes: - kubernetes.Execute(cfg) - } + generate.GenerateArtifactsHelper(t, cfg) } diff --git a/internal/api/generate_api.go b/internal/api/generate_api.go index 42bffc326..de1da50eb 100644 --- a/internal/api/generate_api.go +++ b/internal/api/generate_api.go @@ -14,16 +14,23 @@ type Maintainer struct { Email string `json:"email"` } +type Service struct { + Name string `json:"name"` + Description string `json:"description"` + Language string `json:"language"` + GitRepo string `json:"gitRepo"` +} + type ProjectConfiguration struct { - ProjectName string `json:"projectName"` - Language string `json:"language"` - Organization string `json:"organization"` - Description string `json:"description"` - GitRepoName string `json:"gitRepoName"` - Maintainers []Maintainer `json:"maintainers"` + ProjectName string `json:"projectName"` + FrontendLanguage string `json:"frontendLanguage"` + Organization string `json:"organization"` + Description string `json:"description"` + Maintainers []Maintainer `json:"maintainers"` + Services []Service `json:"services"` } -func generate(w http.ResponseWriter, req *http.Request) { +func generateProject(w http.ResponseWriter, req *http.Request) { w.Header().Set("Content-Type", "application/json") switch req.Method { case "POST": @@ -48,7 +55,7 @@ func generate(w http.ResponseWriter, req *http.Request) { func main() { var router = mux.NewRouter() var api = router.PathPrefix("/v1/generate").Subrouter() - api.NotFoundHandler = http.HandlerFunc(generate) + api.NotFoundHandler = http.HandlerFunc(generateProject) log.Fatal(http.ListenAndServe(":8080", router)) } diff --git a/internal/generate/generate_helper.go b/internal/generate/generate_helper.go new file mode 100644 index 000000000..40e0d05d5 --- /dev/null +++ b/internal/generate/generate_helper.go @@ -0,0 +1,60 @@ +package generate + +import ( + "github.com/commitdev/commit0/internal/config" + "github.com/commitdev/commit0/internal/generate/golang" + "github.com/commitdev/commit0/internal/generate/kubernetes" + "github.com/commitdev/commit0/internal/generate/proto" + "github.com/commitdev/commit0/internal/generate/react" + "github.com/commitdev/commit0/internal/templator" + "github.com/commitdev/commit0/internal/util" + "github.com/kyokomi/emoji" + "github.com/logrusorgru/aurora" + "log" + "sync" +) + +func GenerateArtifactsHelper(t *templator.Templator, cfg *config.Commit0Config) { + var wg sync.WaitGroup + if !util.ValidateLanguage(cfg.Frontend.Framework) { + log.Fatalln(aurora.Red(emoji.Sprintf(":exclamation: '%s' is not a supported framework.", cfg.Frontend.Framework))) + } + + for _, s := range cfg.Services { + if !util.ValidateLanguage(cfg.Frontend.Framework) { + log.Fatalln(aurora.Red(emoji.Sprintf(":exclamation: '%s' in service '%s' is not a supported language.", s.Name, s.Language))) + } + } + + for _, s := range cfg.Services { + switch s.Language { + case util.Go: + log.Println(aurora.Cyan(emoji.Sprintf("Creating Go service"))) + proto.Generate(t, cfg, s, &wg) + golang.Generate(t, cfg, s, &wg) + } + } + + if cfg.Infrastructure.AWS.EKS.ClusterName != "" { + log.Println(aurora.Cyan(emoji.Sprintf("Generating Terraform"))) + kubernetes.Generate(t, cfg, &wg) + } + + // @TODO : This strucuture probably needs to be adjusted. Probably too generic. + switch cfg.Frontend.Framework { + case util.React: + log.Println(aurora.Cyan(emoji.Sprintf("Creating React frontend"))) + react.Generate(t, cfg, &wg) + } + + util.TemplateFileIfDoesNotExist("", "README.md", t.Readme, &wg, templator.GenericTemplateData{*cfg}) + + // Wait for all the templates to be generated + wg.Wait() + + log.Println("Executing commands") + // @TODO : Move this stuff to another command? Or genericize it a bit. + if cfg.Infrastructure.AWS.EKS.Deploy { + kubernetes.Execute(cfg) + } +} diff --git a/templates/commit0/api_generated.tmpl b/templates/commit0/api_generated.tmpl index 948b1ce03..14e1ef38c 100644 --- a/templates/commit0/api_generated.tmpl +++ b/templates/commit0/api_generated.tmpl @@ -1,32 +1,28 @@ organization: {{.Organization}} name: {{.ProjectName}} description: {{.Description}} -git-repo: github.com/{{.GitRepoName}} -docker-repo: maintainers: {{range .Maintainers}} # - name: {{.Name}} # email: {{.Email}} {{end}} -kubernetes: - clusterName: staging - deploy: true - awsAccountId: 1234 - awsRegion: us-east-1 +infrastructure: + aws: + accountId: 1234 + region: us-east-1 + eks: + clusterName: staging + deploy: true -network: - grpc: - host: 0.0.0.0 - port: 3000 - http: - enabled: true - port: 8080 - web: - enabled: true - port: 8090 - -react: +frontend: + framework: {{.FrontendLanguage}} + ci: + system: circleci + buildImage: react/react + buildTag: 1234 + buildCommand: make build + testCommand: make test app: name: {{.ProjectName}} header: @@ -49,7 +45,28 @@ react: - path: / component: home -ci: - system: circleci services: + {{range .Services}} + - name: {{.Name}} + description: {{.Description}} + language: {{.Language}} + gitRepo: {{.GitRepo}} + dockerRepo: + ci: + system: circleci + buildImage: golang/golang + buildTag: 1.12 + buildCommand: make build + testCommand: make test + network: + grpc: + host: 0.0.0.0 + port: 3000 + http: + enabled: true + port: 8080 + web: + enabled: true + port: 8090 + {{end}} From 589ece04083ad128e1ab893a13b52fe29221aefa Mon Sep 17 00:00:00 2001 From: Lillian Liang Date: Thu, 7 Nov 2019 15:30:37 -0800 Subject: [PATCH 03/10] COMMIT0-57 address some comments use commit0 template --- cmd/create.go | 23 ++++++++- cmd/create_test.go | 3 +- cmd/generate.go | 3 +- internal/api/README.md | 4 +- internal/api/create_project.go | 8 +-- internal/api/generate_api.go | 24 +-------- internal/templator/templator.go | 2 - internal/util/projectAttributes.go | 23 ++++++++- templates/.DS_Store | Bin 0 -> 6148 bytes templates/commit0/api_generated.tmpl | 72 --------------------------- templates/commit0/commit0.tmpl | 26 ++++++---- 11 files changed, 71 insertions(+), 117 deletions(-) create mode 100644 templates/.DS_Store delete mode 100644 templates/commit0/api_generated.tmpl diff --git a/cmd/create.go b/cmd/create.go index 7ca6eb848..964078f75 100644 --- a/cmd/create.go +++ b/cmd/create.go @@ -30,13 +30,34 @@ func Create(projectName string, outDir string, t *templator.Templator) string { } var wg sync.WaitGroup - util.TemplateFileIfDoesNotExist(rootDir, "commit0.yml", t.Commit0, &wg, projectName) + var defaultProjConfig = defaultProjConfig(projectName) + + util.TemplateFileIfDoesNotExist(rootDir, util.CommitYml, t.Commit0, &wg, defaultProjConfig) util.TemplateFileIfDoesNotExist(rootDir, ".gitignore", t.GitIgnore, &wg, projectName) wg.Wait() return rootDir } +func defaultProjConfig(projectName string) util.ProjectConfiguration { + return util.ProjectConfiguration{ + ProjectName: projectName, + FrontendFramework: "react", + Organization: "mycompany", + Description: "", + Maintainers: []util.Maintainer{{ + Name: "bob", + Email: "bob@test.com", + }}, + Services: []util.Service{{ + Name: "User", + Description: "User Service", + Language: "go", + GitRepo: "github.com/test/repo", + }}, + } +} + var createCmd = &cobra.Command{ Use: "create", Short: "Create new project with provided name.", diff --git a/cmd/create_test.go b/cmd/create_test.go index fd4ac2e58..5c68811c9 100644 --- a/cmd/create_test.go +++ b/cmd/create_test.go @@ -8,6 +8,7 @@ import ( "github.com/commitdev/commit0/cmd" "github.com/commitdev/commit0/internal/templator" + "github.com/commitdev/commit0/internal/util" "github.com/gobuffalo/packr/v2" ) @@ -25,7 +26,7 @@ func TestCreateWorks(t *testing.T) { root := cmd.Create(projectName, tmpdir, templator) defer os.RemoveAll(tmpdir) - st, err := os.Stat(path.Join(root, "commit0.yml")) + st, err := os.Stat(path.Join(root, util.CommitYml)) if err != nil { t.Fatal(err) } diff --git a/cmd/generate.go b/cmd/generate.go index 88398881c..4d44106e2 100644 --- a/cmd/generate.go +++ b/cmd/generate.go @@ -4,6 +4,7 @@ import ( "github.com/commitdev/commit0/internal/config" "github.com/commitdev/commit0/internal/generate" "github.com/commitdev/commit0/internal/templator" + "github.com/commitdev/commit0/internal/util" "github.com/gobuffalo/packr/v2" "github.com/spf13/cobra" ) @@ -12,7 +13,7 @@ var configPath string func init() { - generateCmd.PersistentFlags().StringVarP(&configPath, "config", "c", "commit0.yml", "config path") + generateCmd.PersistentFlags().StringVarP(&configPath, "config", "c", util.CommitYml, "config path") rootCmd.AddCommand(generateCmd) } diff --git a/internal/api/README.md b/internal/api/README.md index 06bd44cb4..87150c0c5 100644 --- a/internal/api/README.md +++ b/internal/api/README.md @@ -4,11 +4,11 @@ - To run: `go run internal/api/generate_api.go internal/api/create_project.go` - Endpoint: - `localhost:8080/{version}/generate` + - POST `localhost:8080/{version}/generate` - Post request body json example: ``` { "projectName":"funApp", - "frontendLanguage":"react", + "frontendFramework":"react", "organization":"commit org", "description":"this app will do amazing things", "maintainers":[ diff --git a/internal/api/create_project.go b/internal/api/create_project.go index fa501eacd..5c5c93a9f 100644 --- a/internal/api/create_project.go +++ b/internal/api/create_project.go @@ -13,7 +13,7 @@ import ( "github.com/gobuffalo/packr/v2" ) -func CreateProject(projectConfig ProjectConfiguration) string { +func CreateProject(projectConfig util.ProjectConfiguration) string { templates := packr.New("templates", "../../templates") t := templator.NewTemplator(templates) outDir := "./" @@ -28,7 +28,7 @@ func CreateProject(projectConfig ProjectConfiguration) string { } var wg sync.WaitGroup - util.TemplateFileIfDoesNotExist(rootDir, util.ApiGeneratedYamlName, t.ApiCommit0, &wg, projectConfig) + util.TemplateFileIfDoesNotExist(rootDir, util.CommitYml, t.Commit0, &wg, projectConfig) util.TemplateFileIfDoesNotExist(rootDir, ".gitignore", t.GitIgnore, &wg, projectConfig.ProjectName) @@ -39,7 +39,7 @@ func CreateProject(projectConfig ProjectConfiguration) string { return rootDir } -func GenerateArtifacts(projectConfig ProjectConfiguration) { +func GenerateArtifacts(projectConfig util.ProjectConfiguration) { templates := packr.New("templates", "../templates") t := templator.NewTemplator(templates) @@ -48,7 +48,7 @@ func GenerateArtifacts(projectConfig ProjectConfiguration) { if (err != nil) { panic(err) } - cfg := config.LoadConfig(util.ApiGeneratedYamlName) + cfg := config.LoadConfig(util.CommitYml) cfg.Print() generate.GenerateArtifactsHelper(t, cfg) diff --git a/internal/api/generate_api.go b/internal/api/generate_api.go index de1da50eb..a3d4ccbc9 100644 --- a/internal/api/generate_api.go +++ b/internal/api/generate_api.go @@ -7,35 +7,15 @@ import ( "net/http" "github.com/gorilla/mux" + "github.com/commitdev/commit0/internal/util" ) -type Maintainer struct { - Name string `json:"name"` - Email string `json:"email"` -} - -type Service struct { - Name string `json:"name"` - Description string `json:"description"` - Language string `json:"language"` - GitRepo string `json:"gitRepo"` -} - -type ProjectConfiguration struct { - ProjectName string `json:"projectName"` - FrontendLanguage string `json:"frontendLanguage"` - Organization string `json:"organization"` - Description string `json:"description"` - Maintainers []Maintainer `json:"maintainers"` - Services []Service `json:"services"` -} - func generateProject(w http.ResponseWriter, req *http.Request) { w.Header().Set("Content-Type", "application/json") switch req.Method { case "POST": decoder := json.NewDecoder(req.Body) - var projectConfig ProjectConfiguration + var projectConfig util.ProjectConfiguration err := decoder.Decode(&projectConfig) if err != nil { panic(err) diff --git a/internal/templator/templator.go b/internal/templator/templator.go index 4f4f0cce7..1d53cf52f 100644 --- a/internal/templator/templator.go +++ b/internal/templator/templator.go @@ -37,7 +37,6 @@ type GoTemplator struct { // Templator contains all the templates type Templator struct { - ApiCommit0 *template.Template Commit0 *template.Template GitIgnore *template.Template Readme *template.Template @@ -57,7 +56,6 @@ func NewTemplator(box *packr.Box) *Templator { ProtoHealthTemplate: NewSingleFileTemplator(box, "proto/health_proto.tmpl"), ProtoServiceTemplate: NewSingleFileTemplator(box, "proto/service_proto.tmpl"), Go: NewGoTemplator(box), - ApiCommit0: NewSingleFileTemplator(box, "commit0/api_generated.tmpl"), Commit0: NewSingleFileTemplator(box, "commit0/commit0.tmpl"), GitIgnore: NewSingleFileTemplator(box, "util/gitignore.tmpl"), Readme: NewSingleFileTemplator(box, "util/README.tmpl"), diff --git a/internal/util/projectAttributes.go b/internal/util/projectAttributes.go index aaf9b124f..99c70f7e0 100644 --- a/internal/util/projectAttributes.go +++ b/internal/util/projectAttributes.go @@ -6,7 +6,7 @@ const ( Kubernetes = "kubernetes" ) -const ApiGeneratedYamlName = "generated-project.yml" +const CommitYml = "commit0.yml" var supportedLanguages = [...]string{Go, React, Kubernetes} @@ -19,3 +19,24 @@ func ValidateLanguage(language string) bool { return false } + +type Maintainer struct { + Name string `json:"name"` + Email string `json:"email"` +} + +type Service struct { + Name string `json:"name"` + Description string `json:"description"` + Language string `json:"language"` + GitRepo string `json:"gitRepo"` +} + +type ProjectConfiguration struct { + ProjectName string `json:"projectName"` + FrontendFramework string `json:"frontendFramework"` + Organization string `json:"organization"` + Description string `json:"description"` + Maintainers []Maintainer `json:"maintainers"` + Services []Service `json:"services"` +} diff --git a/templates/.DS_Store b/templates/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..ef1d68009f5bb26be39e240d4eb3e560b9f01956 GIT binary patch literal 6148 zcmeHKJ8Hu~5S@tyHn>rla*q(-U@`Uyd;t@=2`H#Y(yPk3d^ErLU@W9mAx(HAX5Q{- zo`hbpqY)9^e_eJWt%z*khVpG;Zg$^%W>1+>ARNzllTUfMe02TmFsoip7Vnw zO8|={fHiRpLkdX>dfvEzk z*tXXHkMJMn|0#((DnJGPl>*uvPKP}{DSPYe Date: Thu, 7 Nov 2019 15:36:49 -0800 Subject: [PATCH 04/10] COMMIT0-57 remove bin --- templates/.DS_Store | Bin 6148 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 templates/.DS_Store diff --git a/templates/.DS_Store b/templates/.DS_Store deleted file mode 100644 index ef1d68009f5bb26be39e240d4eb3e560b9f01956..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHKJ8Hu~5S@tyHn>rla*q(-U@`Uyd;t@=2`H#Y(yPk3d^ErLU@W9mAx(HAX5Q{- zo`hbpqY)9^e_eJWt%z*khVpG;Zg$^%W>1+>ARNzllTUfMe02TmFsoip7Vnw zO8|={fHiRpLkdX>dfvEzk z*tXXHkMJMn|0#((DnJGPl>*uvPKP}{DSPYe Date: Thu, 7 Nov 2019 18:42:34 -0800 Subject: [PATCH 05/10] COMMIT0-57 correct file path --- cmd/create.go | 2 +- cmd/generate.go | 2 +- internal/api/create_project.go | 10 ++++------ internal/generate/generate_helper.go | 12 ++++++------ internal/generate/golang/generate.go | 4 ++-- internal/generate/kubernetes/generate.go | 4 ++-- internal/generate/proto/generate.go | 13 +++++++------ internal/generate/react/generate.go | 6 ++++-- internal/templator/templator.go | 6 ++++-- 9 files changed, 31 insertions(+), 28 deletions(-) diff --git a/cmd/create.go b/cmd/create.go index 964078f75..feeb892da 100644 --- a/cmd/create.go +++ b/cmd/create.go @@ -30,7 +30,7 @@ func Create(projectName string, outDir string, t *templator.Templator) string { } var wg sync.WaitGroup - var defaultProjConfig = defaultProjConfig(projectName) + defaultProjConfig := defaultProjConfig(projectName) util.TemplateFileIfDoesNotExist(rootDir, util.CommitYml, t.Commit0, &wg, defaultProjConfig) util.TemplateFileIfDoesNotExist(rootDir, ".gitignore", t.GitIgnore, &wg, projectName) diff --git a/cmd/generate.go b/cmd/generate.go index 4d44106e2..26c8baeb2 100644 --- a/cmd/generate.go +++ b/cmd/generate.go @@ -29,7 +29,7 @@ var generateCmd = &cobra.Command{ cfg := config.LoadConfig(configPath) cfg.Print() - generate.GenerateArtifactsHelper(t, cfg) + generate.GenerateArtifactsHelper(t, cfg, "") }, } diff --git a/internal/api/create_project.go b/internal/api/create_project.go index 5c5c93a9f..f328d141a 100644 --- a/internal/api/create_project.go +++ b/internal/api/create_project.go @@ -44,12 +44,10 @@ func GenerateArtifacts(projectConfig util.ProjectConfiguration) { templates := packr.New("templates", "../templates") t := templator.NewTemplator(templates) - err := os.Chdir(projectConfig.ProjectName) //cd into project - if (err != nil) { - panic(err) - } - cfg := config.LoadConfig(util.CommitYml) + generatedYml := path.Join(projectConfig.ProjectName, util.CommitYml) + + cfg := config.LoadConfig(generatedYml) cfg.Print() - generate.GenerateArtifactsHelper(t, cfg) + generate.GenerateArtifactsHelper(t, cfg, projectConfig.ProjectName) } diff --git a/internal/generate/generate_helper.go b/internal/generate/generate_helper.go index 40e0d05d5..8dc9128a7 100644 --- a/internal/generate/generate_helper.go +++ b/internal/generate/generate_helper.go @@ -14,7 +14,7 @@ import ( "sync" ) -func GenerateArtifactsHelper(t *templator.Templator, cfg *config.Commit0Config) { +func GenerateArtifactsHelper(t *templator.Templator, cfg *config.Commit0Config, pathPrefix string) { var wg sync.WaitGroup if !util.ValidateLanguage(cfg.Frontend.Framework) { log.Fatalln(aurora.Red(emoji.Sprintf(":exclamation: '%s' is not a supported framework.", cfg.Frontend.Framework))) @@ -30,24 +30,24 @@ func GenerateArtifactsHelper(t *templator.Templator, cfg *config.Commit0Config) switch s.Language { case util.Go: log.Println(aurora.Cyan(emoji.Sprintf("Creating Go service"))) - proto.Generate(t, cfg, s, &wg) - golang.Generate(t, cfg, s, &wg) + proto.Generate(t, cfg, s, &wg, pathPrefix) + golang.Generate(t, cfg, s, &wg, pathPrefix) } } if cfg.Infrastructure.AWS.EKS.ClusterName != "" { log.Println(aurora.Cyan(emoji.Sprintf("Generating Terraform"))) - kubernetes.Generate(t, cfg, &wg) + kubernetes.Generate(t, cfg, &wg, pathPrefix) } // @TODO : This strucuture probably needs to be adjusted. Probably too generic. switch cfg.Frontend.Framework { case util.React: log.Println(aurora.Cyan(emoji.Sprintf("Creating React frontend"))) - react.Generate(t, cfg, &wg) + react.Generate(t, cfg, &wg, pathPrefix) } - util.TemplateFileIfDoesNotExist("", "README.md", t.Readme, &wg, templator.GenericTemplateData{*cfg}) + util.TemplateFileIfDoesNotExist(pathPrefix, "README.md", t.Readme, &wg, templator.GenericTemplateData{*cfg}) // Wait for all the templates to be generated wg.Wait() diff --git a/internal/generate/golang/generate.go b/internal/generate/golang/generate.go index 705744e17..84287a343 100644 --- a/internal/generate/golang/generate.go +++ b/internal/generate/golang/generate.go @@ -13,8 +13,8 @@ import ( "github.com/commitdev/commit0/internal/util" ) -func Generate(t *templator.Templator, cfg *config.Commit0Config, service config.Service, wg *sync.WaitGroup) { - basePath := filepath.Join("service", service.Name) +func Generate(t *templator.Templator, cfg *config.Commit0Config, service config.Service, wg *sync.WaitGroup, pathPrefix string) { + basePath := filepath.Join(pathPrefix, "service", service.Name) healthPath := filepath.Join(basePath, "health") data := templator.GolangTemplateData{ diff --git a/internal/generate/kubernetes/generate.go b/internal/generate/kubernetes/generate.go index 7ecc50f4c..f6603162d 100644 --- a/internal/generate/kubernetes/generate.go +++ b/internal/generate/kubernetes/generate.go @@ -12,9 +12,9 @@ import ( "github.com/commitdev/commit0/internal/templator" ) -func Generate(t *templator.Templator, cfg *config.Commit0Config, wg *sync.WaitGroup) { +func Generate(t *templator.Templator, cfg *config.Commit0Config, wg *sync.WaitGroup, pathPrefix string) { data := templator.GenericTemplateData{*cfg} - t.Kubernetes.TemplateFiles(data, false, wg) + t.Kubernetes.TemplateFiles(data, false, wg, pathPrefix) } func Execute(config *config.Commit0Config) { diff --git a/internal/generate/proto/generate.go b/internal/generate/proto/generate.go index 76b0f49c9..6c1bb4b56 100644 --- a/internal/generate/proto/generate.go +++ b/internal/generate/proto/generate.go @@ -5,6 +5,7 @@ import ( "fmt" "log" "os/exec" + "path" "path/filepath" "sync" @@ -16,8 +17,9 @@ import ( "github.com/logrusorgru/aurora" ) -func Generate(t *templator.Templator, cfg *config.Commit0Config, service config.Service, wg *sync.WaitGroup) { - idlPath := fmt.Sprintf("%s-idl", cfg.Name) +func Generate(t *templator.Templator, cfg *config.Commit0Config, service config.Service, wg *sync.WaitGroup, pathPrefix string) { + idlName := fmt.Sprintf("%s-idl", cfg.Name) + idlPath := path.Join(pathPrefix, idlName) idlHealthPath := filepath.Join(idlPath, "proto", "health") data := templator.GolangTemplateData{ @@ -33,13 +35,12 @@ func Generate(t *templator.Templator, cfg *config.Commit0Config, service config. file := fmt.Sprintf("%s.proto", service.Name) util.TemplateFileIfDoesNotExist(serviceProtoDir, file, t.ProtoServiceTemplate, wg, data) - GenerateProtoServiceLibs(cfg) + GenerateProtoServiceLibs(idlPath) } -func GenerateProtoServiceLibs(cfg *config.Commit0Config) { - idlRoot := fmt.Sprintf("%s-idl", cfg.Name) +func GenerateProtoServiceLibs(idlPath string) { cmd := exec.Command("make", "generate") - cmd.Dir = idlRoot + cmd.Dir = idlPath var out bytes.Buffer var stderr bytes.Buffer cmd.Stdout = &out diff --git a/internal/generate/react/generate.go b/internal/generate/react/generate.go index 9ba7dce30..317a44d9f 100644 --- a/internal/generate/react/generate.go +++ b/internal/generate/react/generate.go @@ -1,6 +1,7 @@ package react import ( + "path" "sync" "github.com/commitdev/commit0/internal/config" @@ -8,11 +9,12 @@ import ( "github.com/commitdev/commit0/internal/templator" ) -func Generate(t *templator.Templator, cfg *config.Commit0Config, wg *sync.WaitGroup) { +func Generate(t *templator.Templator, cfg *config.Commit0Config, wg *sync.WaitGroup, pathPrefix string) { data := templator.GenericTemplateData{*cfg} t.React.TemplateFiles(data, false, wg) + basePath := path.Join(pathPrefix, "react/") if cfg.Frontend.CI.System != "" { - ci.Generate(t.CI, cfg, cfg.Frontend.CI, "react/", wg) + ci.Generate(t.CI, cfg, cfg.Frontend.CI, basePath, wg) } } diff --git a/internal/templator/templator.go b/internal/templator/templator.go index 1d53cf52f..dc2b347fb 100644 --- a/internal/templator/templator.go +++ b/internal/templator/templator.go @@ -1,6 +1,7 @@ package templator import ( + "path" "path/filepath" "strings" "sync" @@ -125,9 +126,10 @@ type DirectoryTemplator struct { Templates []*template.Template } -func (d *DirectoryTemplator) TemplateFiles(data interface{}, overwrite bool, wg *sync.WaitGroup) { +func (d *DirectoryTemplator) TemplateFiles(data interface{}, overwrite bool, wg *sync.WaitGroup, pathPrefix string) { for _, template := range d.Templates { - d, f := filepath.Split(template.Name()) + templatePath := path.Join(pathPrefix, template.Name()) + d, f := filepath.Split(templatePath) if strings.HasSuffix(f, ".tmpl") { f = strings.Replace(f, ".tmpl", "", -1) } From 262df53c15ed75c40d1983e11ced2dd3664fff35 Mon Sep 17 00:00:00 2001 From: Lillian Liang Date: Fri, 8 Nov 2019 10:31:23 -0800 Subject: [PATCH 06/10] COMMIT0-57 missed --- internal/generate/react/generate.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/generate/react/generate.go b/internal/generate/react/generate.go index 317a44d9f..01301c28b 100644 --- a/internal/generate/react/generate.go +++ b/internal/generate/react/generate.go @@ -12,7 +12,7 @@ import ( func Generate(t *templator.Templator, cfg *config.Commit0Config, wg *sync.WaitGroup, pathPrefix string) { data := templator.GenericTemplateData{*cfg} - t.React.TemplateFiles(data, false, wg) + t.React.TemplateFiles(data, false, wg, pathPrefix) basePath := path.Join(pathPrefix, "react/") if cfg.Frontend.CI.System != "" { ci.Generate(t.CI, cfg, cfg.Frontend.CI, basePath, wg) From f4f7d9697dabb601e5116268becf85bf2915393c Mon Sep 17 00:00:00 2001 From: Lillian Liang Date: Fri, 8 Nov 2019 12:06:36 -0800 Subject: [PATCH 07/10] COMMIT0-57 readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 7a2aa1299..5b2d307ab 100644 --- a/README.md +++ b/README.md @@ -22,7 +22,7 @@ The best way then to use this is to add an alias, then you can use the CLI as if ## Usage 1) To create a project run `commit0 create [PROJECT_NAME]` -2) A folder will be created and within that update the `commit0.yml` and then run `commit0 generate -l=[LANGUAGE OF CHOICE] eg. go` +2) A folder will be created and within that update the `commit0.yml` and then run `commit0 generate` 3) You will see that there is now an idl folder created. 4) Within the idl folder modify the the protobuf services generated with your desired methods 5) Go up to the parent directory and re run `commit0 generate -l=[LANGUAGE OF CHOICE]` From 47df1bf23761cdb73a79bf82175fa301811d2033 Mon Sep 17 00:00:00 2001 From: Lillian Liang Date: Fri, 8 Nov 2019 16:53:23 -0800 Subject: [PATCH 08/10] COMMIT0-57 attempt to add api cmd --- cmd/commit0_api.go | 18 ++++++++++++++++++ internal/api/README.md | 2 +- internal/api/create_project.go | 4 ++-- internal/api/generate_api.go | 9 ++++----- 4 files changed, 25 insertions(+), 8 deletions(-) create mode 100644 cmd/commit0_api.go diff --git a/cmd/commit0_api.go b/cmd/commit0_api.go new file mode 100644 index 000000000..8179cf2c7 --- /dev/null +++ b/cmd/commit0_api.go @@ -0,0 +1,18 @@ +package cmd + +import ( + "github.com/commitdev/commit0/internal/api" + "github.com/spf13/cobra" +) + +func init() { + rootCmd.AddCommand(commit0api) +} + +var commit0api = &cobra.Command{ + Use: "api", + Short: "Run Commit0 Api", + Run: func(cmd *cobra.Command, args []string) { + api.Commit0Api() + }, +} diff --git a/internal/api/README.md b/internal/api/README.md index 87150c0c5..fdbdc8443 100644 --- a/internal/api/README.md +++ b/internal/api/README.md @@ -2,7 +2,7 @@ ## Usage - To run: - `go run internal/api/generate_api.go internal/api/create_project.go` + `commit0 api` - Endpoint: - POST `localhost:8080/{version}/generate` - Post request body json example: diff --git a/internal/api/create_project.go b/internal/api/create_project.go index f328d141a..2071a0c15 100644 --- a/internal/api/create_project.go +++ b/internal/api/create_project.go @@ -1,4 +1,4 @@ -package main +package api import ( "log" @@ -13,7 +13,7 @@ import ( "github.com/gobuffalo/packr/v2" ) -func CreateProject(projectConfig util.ProjectConfiguration) string { +func createProject(projectConfig util.ProjectConfiguration) string { templates := packr.New("templates", "../../templates") t := templator.NewTemplator(templates) outDir := "./" diff --git a/internal/api/generate_api.go b/internal/api/generate_api.go index a3d4ccbc9..af6569a59 100644 --- a/internal/api/generate_api.go +++ b/internal/api/generate_api.go @@ -1,12 +1,11 @@ -package main - +package api import ( "encoding/json" + "github.com/gorilla/mux" "log" "net/http" - "github.com/gorilla/mux" "github.com/commitdev/commit0/internal/util" ) @@ -21,7 +20,7 @@ func generateProject(w http.ResponseWriter, req *http.Request) { panic(err) } log.Println(projectConfig.ProjectName) - CreateProject(projectConfig) + createProject(projectConfig) w.WriteHeader(http.StatusCreated) w.Write([]byte(`{"message": "Post successful"}`)) @@ -32,7 +31,7 @@ func generateProject(w http.ResponseWriter, req *http.Request) { } -func main() { +func Commit0Api() { var router = mux.NewRouter() var api = router.PathPrefix("/v1/generate").Subrouter() api.NotFoundHandler = http.HandlerFunc(generateProject) From 0e2f336e6106a424dc2f3b6416c4c7b11b588c23 Mon Sep 17 00:00:00 2001 From: Lillian Liang Date: Sat, 9 Nov 2019 11:46:06 -0800 Subject: [PATCH 09/10] COMMIT0-57 fix api --- internal/generate/generate_helper.go | 2 +- internal/generate/kubernetes/generate.go | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/internal/generate/generate_helper.go b/internal/generate/generate_helper.go index 8dc9128a7..f4406e6a0 100644 --- a/internal/generate/generate_helper.go +++ b/internal/generate/generate_helper.go @@ -55,6 +55,6 @@ func GenerateArtifactsHelper(t *templator.Templator, cfg *config.Commit0Config, log.Println("Executing commands") // @TODO : Move this stuff to another command? Or genericize it a bit. if cfg.Infrastructure.AWS.EKS.Deploy { - kubernetes.Execute(cfg) + kubernetes.Execute(cfg, pathPrefix) } } diff --git a/internal/generate/kubernetes/generate.go b/internal/generate/kubernetes/generate.go index f6603162d..a394d2315 100644 --- a/internal/generate/kubernetes/generate.go +++ b/internal/generate/kubernetes/generate.go @@ -1,11 +1,11 @@ package kubernetes import ( - "fmt" "io" "log" "os" "os/exec" + "path" "sync" "github.com/commitdev/commit0/internal/config" @@ -17,21 +17,21 @@ func Generate(t *templator.Templator, cfg *config.Commit0Config, wg *sync.WaitGr t.Kubernetes.TemplateFiles(data, false, wg, pathPrefix) } -func Execute(config *config.Commit0Config) { +func Execute(config *config.Commit0Config, pathPrefix string) { if config.Infrastructure.AWS.EKS.Deploy { log.Println("Planning infrastructure...") - execute(exec.Command("terraform", "init")) - execute(exec.Command("terraform", "plan")) + execute(exec.Command("terraform", "init"), pathPrefix) + execute(exec.Command("terraform", "plan"), pathPrefix) } } -func execute(cmd *exec.Cmd) { +func execute(cmd *exec.Cmd, pathPrefix string) { dir, err := os.Getwd() if err != nil { log.Fatalf("Getting working directory failed: %v\n", err) } - - cmd.Dir = fmt.Sprintf("%s/kubernetes/terraform/environments/staging", dir) + kubDir := path.Join(pathPrefix, "kubernetes/terraform/environments/staging") + cmd.Dir = path.Join(dir, kubDir) stdoutPipe, _ := cmd.StdoutPipe() stderrPipe, _ := cmd.StderrPipe() From e2c783b38730dc3d4c77d250c52cce30079fe26f Mon Sep 17 00:00:00 2001 From: Lillian Liang Date: Sat, 9 Nov 2019 11:53:27 -0800 Subject: [PATCH 10/10] COMMIT0-57 ui --- cmd/{commit0_api.go => commit0_ui.go} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename cmd/{commit0_api.go => commit0_ui.go} (94%) diff --git a/cmd/commit0_api.go b/cmd/commit0_ui.go similarity index 94% rename from cmd/commit0_api.go rename to cmd/commit0_ui.go index 8179cf2c7..e01efe69f 100644 --- a/cmd/commit0_api.go +++ b/cmd/commit0_ui.go @@ -10,7 +10,7 @@ func init() { } var commit0api = &cobra.Command{ - Use: "api", + Use: "ui", Short: "Run Commit0 Api", Run: func(cmd *cobra.Command, args []string) { api.Commit0Api()