diff --git a/bindata.go b/bindata.go index 0084181..d477108 100644 --- a/bindata.go +++ b/bindata.go @@ -108,7 +108,7 @@ func bindataTemplatesRdstfDeploysh() (*asset, error) { size: 343, md5checksum: "", mode: os.FileMode(420), - modTime: time.Unix(1578918947, 0), + modTime: time.Unix(1578927242, 0), } a := &asset{bytes: bytes, info: info} @@ -117,22 +117,22 @@ func bindataTemplatesRdstfDeploysh() (*asset, error) { } var _bindataTemplatesRdstfMaintf = []byte( - "\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x94\x53\x4d\x8f\x9b\x30\x10\xbd\xf3\x2b\xac\xdc\x0d\xaa\x7a\x8b\xb4\x52" + - "\xab\x76\x5b\x6d\x0f\xd5\xaa\x5f\x57\x64\xec\x81\x58\xd8\x63\xe2\x31\xa1\x59\x96\xff\x5e\x81\x21\x0b\x65\x7b\xa8" + - "\x6f\x79\x79\x1f\xf3\x9e\x44\x00\xef\x45\xe9\xbc\x65\x7d\xc2\x58\x21\x64\x0d\xa8\xd8\x81\xde\x1e\x26\x80\xb1\xa2" + - "\x95\x35\x04\xb6\x7d\x77\xec\x80\xe2\xa2\x79\x21\xb0\xe6\x37\x0b\x2e\x9d\xb5\x02\x15\xa7\x20\x02\x1c\x26\xb9\x87" + - "\x4a\x3b\xdc\xcb\x45\xc3\xc9\xb5\xe1\xc4\xdf\x44\x5e\x0d\x57\xb6\x7b\x77\xec\xe0\x15\x45\x42\xe7\x7c\x4d\x8d\x90" + - "\x90\xd7\x70\xcd\x1b\x0f\xa5\xfe\x3d\x13\x62\x1e\x65\x7d\xcf\xd2\x6f\x8a\xd2\x07\xa4\x20\x50\xc2\x57\x61\x81\x0d" + - "\x43\xd4\x37\xde\x95\xda\xc0\x2e\x40\x5a\x15\x09\x42\x9a\x57\x2f\x88\x03\x70\xd7\x21\x78\x5e\xb6\xc6\x70\xe9\x30" + - "\x78\x67\x46\xd9\x90\x0c\x49\x62\x9d\x6a\x0d\xc4\x5b\xa7\xd5\xc8\xb5\x5e\xc2\xca\xa3\xd2\xe1\x78\x24\x3a\x1d\xb3" + - "\xac\xd2\xe1\x5d\xa5\xc3\xa9\x2d\x52\x69\x55\x3a\xcd\x18\x40\x9e\x52\x8d\xd9\xf4\x43\x63\xe9\x45\xe6\x15\xa5\x95" + - "\x0e\x63\x06\xe0\x45\x7b\x87\x16\x30\x4c\x6e\x63\xcd\xfb\x15\xf6\xcc\xce\xad\x0b\x63\xd3\x84\x31\x3d\x77\xcf\x71" + - "\x2c\x1f\xc9\xbb\x4d\x36\x8a\x46\x10\x75\xce\xab\xe5\xd8\x45\xf1\xb8\xe0\x1b\x36\xe9\x27\x58\xcf\xb3\xb0\xbf\xeb" + - "\x27\x78\xc0\xcf\x45\x64\xb5\x04\xfe\x35\xd6\xcf\x11\x5f\xf9\x25\x8c\x29\x11\x44\x21\x08\xe8\x2f\xea\xc7\x1b\xfe" + - "\xcc\x6c\x4b\xe1\x87\xfb\x42\x0e\x67\x51\xdf\x73\xa6\xcb\x48\x7c\xdf\xd1\x52\xee\x83\x11\x44\xf1\x02\xd1\x51\x7e" + - "\xdb\x42\x4e\xf8\x8b\xf7\x4e\xb2\xa9\x38\x9a\x8f\x1f\xc1\x3e\xea\x91\xce\xe6\x93\xb0\xda\x5c\xe7\xe9\xe8\x6c\xf2" + - "\x32\x02\xab\xe1\x5e\x58\xff\xe1\x7b\x8f\x95\x46\xf8\x05\x9e\x74\xac\x39\xdb\xc3\x84\xe7\x97\xf9\x8f\x6d\xcc\x56" + - "\xf4\xaf\xb4\x21\xf9\x13\x00\x00\xff\xff\x5e\x09\x8e\x45\xe6\x03\x00\x00") + "\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\x94\x53\x4d\x8f\x9b\x30\x10\xbd\xf3\x2b\x46\xb9\x9b\xa8\xea\x2d\xd2\x4a" + + "\xad\xba\xdb\x6a\x7b\xa8\x56\xea\xc7\x15\x19\x33\x10\x0b\x7b\x4c\x3c\x26\x34\xcb\xf2\xdf\x2b\x30\xd9\xc2\x26\x39" + + "\xac\x6f\xcc\xbc\x37\xef\x43\x22\xa0\xf7\xb2\x74\xde\x42\x9f\x00\xe4\x52\xd5\x48\x05\x6c\xf8\xe3\x66\x1a\x00\xe4" + + "\xad\xaa\x31\xc0\xfa\xdd\xc1\x86\xe4\x51\x8b\x5c\x52\x2d\x5e\x4f\x08\xe5\xac\x95\x54\x08\x0e\x32\xe0\x66\xa2\x7b" + + "\xac\xb4\xa3\x4b\xba\x6c\x04\xbb\x36\xec\xc5\x87\x88\xab\xf1\x04\x17\xef\x0e\x36\xbe\xe0\x08\xe8\x9c\xaf\xb9\x91" + + "\x0a\xb3\x1a\x4f\x59\xe3\xb1\xd4\x7f\x67\x40\xd4\xe3\x6d\xdf\x43\x7a\x2f\x83\xcc\x25\x63\xfa\x48\x1c\x24\x29\xfc" + + "\x21\x2d\xc2\x30\xc4\x23\x8d\x77\xa5\x36\x78\xa1\xa2\x6c\x11\x01\x52\x99\xab\x36\x62\x0b\xc2\x75\x84\x5e\x94\xad" + + "\x31\x42\x39\x0a\xde\x99\x91\x36\x24\x43\x92\x58\x57\xb4\x06\xa3\xe1\xa9\x3a\x76\xad\x57\xb8\xb8\x51\xe9\xb0\xdb" + + "\x31\xef\x77\xdb\x6d\xa5\xc3\xa7\x4a\x87\x7d\x9b\xa7\xca\x16\xe9\xd4\x65\x40\xb5\x4f\x35\x6d\xa7\x0f\x4d\xa5\x97" + + "\x5b\x5f\x70\x5a\xe9\x30\x6a\x20\x1d\xb5\x77\x64\x91\xc2\x74\x6d\xcc\xfa\xb0\x98\xbd\xc0\xa1\x75\x61\x4c\x9a\x00" + + "\xe8\x39\x7b\x46\x63\xf8\x08\xbe\x5e\xcc\x8a\xd6\x48\xe6\xce\xf9\xe2\xec\x78\x45\x7b\x3a\x2f\x57\x14\xd6\xcf\xb8" + + "\x2c\x6a\x45\xf9\xa9\x9f\xf1\x91\xbe\xe5\x11\xda\x32\xfa\x9b\xd0\xdf\xe3\x72\x71\x39\x01\x28\xe6\x1d\x5f\xc3\xdf" + + "\xe7\xa3\x7d\x86\x17\xb0\x2d\x87\x5f\xee\x3b\x3b\x9a\x79\x7d\x2f\x40\x97\x0b\xec\xe7\x8e\xcf\x99\xbf\x18\xc9\x1c" + + "\xed\xc8\x8e\xb3\xd7\x9e\xd4\x34\x7f\xa3\x71\xc1\x5b\x25\x1f\x65\xc6\x5f\xe5\x86\xe8\x13\x1f\xcc\x57\x69\xb5\x39" + + "\xcd\xdd\xf2\xc1\x64\x65\x1c\xbc\x6d\xf6\x3f\xf4\xbd\x0a\x0f\x54\x69\xc2\x3f\xe8\x59\xc7\xfc\xb3\x10\x4e\xf3\xec" + + "\x38\x2f\xae\x08\xae\x99\xb7\x74\x87\xe4\x5f\x00\x00\x00\xff\xff\xf5\xc3\xcf\xc3\x20\x04\x00\x00") func bindataTemplatesRdstfMaintfBytes() ([]byte, error) { return bindataRead( @@ -151,10 +151,10 @@ func bindataTemplatesRdstfMaintf() (*asset, error) { info := bindataFileInfo{ name: "templates/rds-tf/main.tf", - size: 998, + size: 1056, md5checksum: "", mode: os.FileMode(420), - modTime: time.Unix(1578901238, 0), + modTime: time.Unix(1578995480, 0), } a := &asset{bytes: bytes, info: info} diff --git a/main.go b/main.go index e8d7acc..c6e10d4 100644 --- a/main.go +++ b/main.go @@ -14,13 +14,13 @@ func init() { func parseManifest(manifestPath string) (*Manifest, error) { manifestContent, err := ioutil.ReadFile(manifestPath) - if(err != nil) { + if err != nil { log.Fatalf("\nErr: %v", err) return nil, err } var manifest Manifest json.Unmarshal(manifestContent, &manifest) - manifest.Infra.Workspace = workspaceMap[manifest.Infra.Environment] + manifest.ExtraResources.Workspace = workspaceMap[manifest.ExtraResources.Environment] return &manifest, nil } @@ -37,19 +37,24 @@ func main() { Aliases: []string{"m"}, Required: true, }, + &cli.BoolFlag{ + Name: "template-only", + Usage: "Provisions just the template for given resource", + Aliases: []string{"t"}, + }, }, Commands: []*cli.Command{ { - Name: "rds", - Usage: "Provision rds instance", + Name: "database", + Usage: "Provision database instance", Action: func(c *cli.Context) error { manifest, err := parseManifest(c.String("manifest")) - if(err != nil) { + if err != nil { log.Fatalf("\nErr: %v", err) return err } - err = provisionResource("rds", "rds-tf", manifest) + err = provisionResource("rds", "rds-tf", manifest, c.Bool("template-only")) if err != nil { log.Fatalf("\nErr: %v", err) return err diff --git a/resource.go b/resource.go index c450b6e..c67f345 100644 --- a/resource.go +++ b/resource.go @@ -12,18 +12,19 @@ import ( const TEMPLATES_DIR = "templates" const INIT_SCRIPT = "./deploy.sh" -func provisionResource(resourceName, resourceDir string, manifest *Manifest) error { +func provisionResource(resourceName, resourceDir string, manifest *Manifest, templateOnly bool) error { err := templateResourceTf(resourceName, resourceDir, manifest) - if(err != nil) { + if err != nil { log.Fatalf("\nErr: %v", err) return err } - - err = executeResourceTf(resourceDir) - if(err != nil) { - log.Fatalf("\nErr: %v", err) - return err + if !templateOnly { + err = executeResourceTf(resourceDir) + if(err != nil) { + log.Fatalf("\nErr: %v", err) + return err + } } return nil @@ -31,6 +32,7 @@ func provisionResource(resourceName, resourceDir string, manifest *Manifest) err func templateResourceTf(templateName, resourceDir string, manifest *Manifest) error { + log.Printf("Creating templates for %s in %s", templateName, resourceDir) tfFiles, err := AssetDir(strings.Join([]string{TEMPLATES_DIR, resourceDir}, "/")) if err != nil { @@ -42,13 +44,13 @@ func templateResourceTf(templateName, resourceDir string, manifest *Manifest) er t := template.Must(template.New(templateName).Funcs(sprig.TxtFuncMap()).Parse(string(tfBytes))) tfOut, err := createFile(resourceDir, tfFile) - if(err != nil) { + if err != nil { log.Fatalf("\nErr: %v", err) return err } - err = t.Execute(tfOut, manifest.Infra) - if(err != nil) { + err = t.Execute(tfOut, manifest.ExtraResources) + if err != nil { log.Fatalf("\nErr: %v", err) return err } @@ -59,12 +61,13 @@ func templateResourceTf(templateName, resourceDir string, manifest *Manifest) er } func executeResourceTf(resourceDir string) error { + log.Printf("Running terraform for %s", resourceDir) cmd := exec.Command(INIT_SCRIPT) cmd.Dir = resourceDir cmd.Stdout = os.Stdout cmd.Stderr = os.Stderr err := cmd.Run() - if(err != nil) { + if err != nil { log.Fatalf("\nErr: %v", err) return err } diff --git a/sample_infra_manifest.json b/sample_infra_manifest.json index 1960b7e..271bccd 100644 --- a/sample_infra_manifest.json +++ b/sample_infra_manifest.json @@ -1,12 +1,12 @@ { - "infra": { + "extraResources": { "environment": "prod", - "rds": { + "database": { "instanceName": "auth-service", "user": "auth_service_user", "password": "auth_service_password", "sizeInGb": 7, - "databases": ["auth_service"] + "dbNames": ["auth_service"] } } } diff --git a/templates/rds-tf/main.tf b/templates/rds-tf/main.tf index 53fcff1..e9c5ab3 100644 --- a/templates/rds-tf/main.tf +++ b/templates/rds-tf/main.tf @@ -3,7 +3,7 @@ terraform { bucket = "navi-bank-terraform-command-state" region = "ap-south-1" key = "rds" - workspace_key_prefix = "rds-states/{{ .Rds.InstanceName }}" + workspace_key_prefix = "rds-states/{{ .Database.InstanceName }}" profile = "cmd" acl = "bucket-owner-full-control" } @@ -12,22 +12,22 @@ terraform { module "rds" { source = "git::ssh://git@github.cmd.navi-tech.in/navi-infra/rds.git" environment = {{ .Environment | quote }} - instance_name = {{ .Rds.InstanceName | quote }} - password = {{ .Rds.Password | quote }} - size = {{ .Rds.SizeInGb }} - user = {{ .Rds.User | quote }} + instance_name = {{ .Database.InstanceName | quote }} + password = {{ .Database.Password | quote }} + size = {{ .Database.SizeInGb }} + user = {{ .Database.User | quote }} - databases = {{ .Rds.Databases | mustToJson }} + databases = {{ .Database.DbNames | mustToJson }} - {{- if .Rds.AwsInstanceClass }} - aws_instance_class = {{ .Rds.AwsInstanceClass | quote }} + {{- if .Database.AwsInstanceClass }} + aws_instance_class = {{ .Database.AwsInstanceClass | quote }} {{- end }} - {{- if .Rds.PsqlFamily }} - psql_family = {{ .Rds.PsqlFamily | quote }} + {{- if .Database.PsqlFamily }} + psql_family = {{ .Database.PsqlFamily | quote }} {{- end }} - {{- if .Rds.PsqlEngineVersion }} - psql_engine_version = {{ .Rds.PsqlEngineVersion | quote }} + {{- if .Database.PsqlEngineVersion }} + psql_engine_version = {{ .Database.PsqlEngineVersion | quote }} {{- end }} } diff --git a/types.go b/types.go index ec94f4e..fda89df 100644 --- a/types.go +++ b/types.go @@ -5,24 +5,23 @@ var workspaceMap = map[string]string { } type Manifest struct { - Infra Infra `json:"infra"` + ExtraResources ExtraResources `json:"extraResources"` } -type Infra struct { +type ExtraResources struct { Environment string `json:"environment"` Workspace string - Rds Rds `json:"rds"` + Database Database `json:"database"` } //We provide defaults in respective terraforms instead of here to keep all values at one place -type Rds struct { +type Database struct { AwsInstanceClass string `json:"awsInstanceClass"` PsqlFamily string `json:"psqlFamily"` PsqlEngineVersion string `json:"psqlEngineVersion"` User string `json:"user"` Password string `json:"password"` SizeInGb int `json:"sizeInGb"` - Databases []string `json:"databases"` + DbNames []string `json:"dbNames"` InstanceName string `json:"instanceName"` } -