Skip to content

Commit

Permalink
Merge branch 'IZE-582-IZE-361-IZE-446' into IZE-516-ize-up-infra-expl…
Browse files Browse the repository at this point in the history
…ain-bash-alternative-shown
  • Loading branch information
psihachina authored Sep 30, 2022
2 parents a996082 + ef786cb commit 04a26c8
Show file tree
Hide file tree
Showing 11 changed files with 129 additions and 99 deletions.
4 changes: 2 additions & 2 deletions examples/sls-apps-monorepo/.ize/env/testnut/ize.toml
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,8 @@ terraform_version = "1.2.6" # (optional) Terraform version can be se
# config_file = "" # (optional) Path to ize.toml config file can be specified, but normally it's read from the environment's directory automatically.
# home = "" # (optional) User home directory can be specified here. Normally $HOME is used.

# [terraform.infra]
# aws_region = "" # (optional) Terraform-specific AWS Region of this environment should be specified here. Normally global AWS_REGION is used.
[terraform.infra]
aws_region = "us-east-1" # (optional) Terraform-specific AWS Region of this environment should be specified here. Normally global AWS_REGION is used.
# aws_profile = "" # (optional) Terraform-specific AWS profile (optional) can be specified here (but normally it should be inherited from a global AWS_PROFILE).
# version = "" # (optional) Terraform version can be set here. 1.1.3 by default.
# state_bucket_region = "" # (optional) Terraform state bucket region can be specified here. Normally AWS_REGION is used here. Can be overriden via env vars or flags.
Expand Down
22 changes: 0 additions & 22 deletions examples/sls-apps-monorepo/ize.toml

This file was deleted.

37 changes: 24 additions & 13 deletions internal/commands/down.go
Original file line number Diff line number Diff line change
Expand Up @@ -115,20 +115,21 @@ func (o *DownOptions) Complete(cmd *cobra.Command, args []string) error {
}

if o.Config.Terraform == nil {
o.Config.Terraform = map[string]*config.Terraform{}
o.Config.Terraform["infra"] = &config.Terraform{}
return fmt.Errorf("you must specify at least one terraform stack in ize.toml")
}

if len(o.Config.Terraform["infra"].AwsProfile) == 0 {
o.Config.Terraform["infra"].AwsProfile = o.Config.AwsProfile
}
if _, ok := o.Config.Terraform["infra"]; ok {
if len(o.Config.Terraform["infra"].AwsProfile) == 0 {
o.Config.Terraform["infra"].AwsProfile = o.Config.AwsProfile
}

if len(o.Config.Terraform["infra"].AwsRegion) == 0 {
o.Config.Terraform["infra"].AwsRegion = o.Config.AwsRegion
}
if len(o.Config.Terraform["infra"].AwsRegion) == 0 {
o.Config.Terraform["infra"].AwsRegion = o.Config.AwsRegion
}

if len(o.Config.Terraform["infra"].Version) == 0 {
o.Config.Terraform["infra"].Version = o.Config.TerraformVersion
if len(o.Config.Terraform["infra"].Version) == 0 {
o.Config.Terraform["infra"].Version = o.Config.TerraformVersion
}
}
} else {
if err := requirements.CheckRequirements(requirements.WithIzeStructure(), requirements.WithConfigFile()); err != nil {
Expand Down Expand Up @@ -273,9 +274,9 @@ func destroyInfra(state string, config *config.Project, skipGen bool, ui termina

switch config.PreferRuntime {
case "docker":
tf = terraform.NewDockerTerraform(state, []string{"destroy", "-auto-approve"}, env, nil, config)
tf = terraform.NewDockerTerraform(state, []string{"init", "-input=true"}, env, nil, config)
case "native":
tf = terraform.NewLocalTerraform(state, []string{"destroy", "-auto-approve"}, env, nil, config)
tf = terraform.NewLocalTerraform(state, []string{"init", "-input=true"}, env, nil, config)
err = tf.Prepare()
if err != nil {
return fmt.Errorf("can't destroy infra: %w", err)
Expand All @@ -284,13 +285,23 @@ func destroyInfra(state string, config *config.Project, skipGen bool, ui termina
return fmt.Errorf("can't supported %s runtime", config.PreferRuntime)
}

ui.Output("Running terraform destroy...", terminal.WithHeaderStyle())
ui.Output("Execution terraform init...", terminal.WithHeaderStyle())

err = tf.RunUI(ui)
if err != nil {
return err
}

//terraform destroy run options
tf.NewCmd([]string{"destroy", "-auto-approve"})

ui.Output("Execution terraform destroy...", terminal.WithHeaderStyle())

err = tf.RunUI(ui)
if err != nil {
return fmt.Errorf("can't deploy infra: %w", err)
}

ui.Output("Terraform destroy completed!\n", terminal.WithSuccessStyle())

return nil
Expand Down
41 changes: 21 additions & 20 deletions internal/commands/down_infra.go
Original file line number Diff line number Diff line change
Expand Up @@ -69,32 +69,33 @@ func (o *DownInfraOptions) Complete() error {
}

if o.Config.Terraform == nil {
o.Config.Terraform = map[string]*config.Terraform{}
o.Config.Terraform["infra"] = &config.Terraform{}
return fmt.Errorf("you must specify at least one terraform stack in ize.toml")
}

if len(o.AwsProfile) != 0 {
o.Config.Terraform["infra"].AwsProfile = o.AwsProfile
}
if _, ok := o.Config.Terraform["infra"]; ok {
if len(o.AwsProfile) != 0 {
o.Config.Terraform["infra"].AwsProfile = o.AwsProfile
}

if len(o.Config.Terraform["infra"].AwsProfile) == 0 {
o.Config.Terraform["infra"].AwsProfile = o.Config.AwsProfile
}
if len(o.Config.Terraform["infra"].AwsProfile) == 0 {
o.Config.Terraform["infra"].AwsProfile = o.Config.AwsProfile
}

if len(o.AwsProfile) != 0 {
o.Config.Terraform["infra"].AwsRegion = o.AwsRegion
}
if len(o.AwsProfile) != 0 {
o.Config.Terraform["infra"].AwsRegion = o.AwsRegion
}

if len(o.Config.Terraform["infra"].AwsRegion) == 0 {
o.Config.Terraform["infra"].AwsRegion = o.Config.AwsRegion
}
if len(o.Config.Terraform["infra"].AwsRegion) == 0 {
o.Config.Terraform["infra"].AwsRegion = o.Config.AwsRegion
}

if len(o.Version) != 0 {
o.Config.Terraform["infra"].Version = o.Version
}
if len(o.Version) != 0 {
o.Config.Terraform["infra"].Version = o.Version
}

if len(o.Config.Terraform["infra"].Version) == 0 {
o.Config.Terraform["infra"].Version = o.Config.TerraformVersion
if len(o.Config.Terraform["infra"].Version) == 0 {
o.Config.Terraform["infra"].Version = o.Config.TerraformVersion
}
}

o.ui = terminal.ConsoleUI(context.Background(), o.Config.PlainText)
Expand All @@ -120,7 +121,7 @@ func (o *DownInfraOptions) Run() error {
}
}

err := manager.InReversDependencyOrder(aws.BackgroundContext(), o.Config.GetApps(), func(c context.Context, name string) error {
err := manager.InReversDependencyOrder(aws.BackgroundContext(), o.Config.GetStates(), func(c context.Context, name string) error {
return destroyInfra(name, o.Config, o.SkipGen, ui)
})
if err != nil {
Expand Down
36 changes: 33 additions & 3 deletions internal/commands/tfenv.go
Original file line number Diff line number Diff line change
Expand Up @@ -82,9 +82,6 @@ func GenerateTerraformFiles(name string, terraformStateBucketName string, projec
tf = *project.Terraform[name]
}

stateName := tf.StateName
stateKey := fmt.Sprintf("%v/%v.tfstate", project.Env, stateName)

if len(terraformStateBucketName) != 0 {
tf.StateBucketName = terraformStateBucketName
}
Expand All @@ -107,6 +104,20 @@ func GenerateTerraformFiles(name string, terraformStateBucketName string, projec
}
}

stateKey := fmt.Sprintf("%v/%v.tfstate", project.Env, name)
if len(tf.StateName) != 0 {
stateKey = fmt.Sprintf("%v/%v.tfstate", project.Env, tf.StateName)
}

if name == "infra" {
if checkTFStateKey(project, tf.StateBucketName, filepath.Join(project.Env, "terraform.tfstate")) {
stateKey = filepath.Join(project.Env, "terraform.tfstate")
pterm.Warning.Printfln("%s/terraform.tfstate location is deprecated, please move to %s/infra.tfstate", project.Env, project.Env)
} else {
stateKey = filepath.Join(project.Env, "infra.tfstate")
}
}

if len(tf.StateBucketRegion) == 0 {
tf.StateBucketRegion = project.AwsRegion
}
Expand Down Expand Up @@ -197,3 +208,22 @@ func checkTFStateBucket(project *config.Project, name string) bool {

return true
}

func checkTFStateKey(project *config.Project, bucket, key string) bool {
_, err := project.AWSClient.S3Client.HeadObject(&s3.HeadObjectInput{
Bucket: aws.String(bucket),
Key: aws.String(key),
})
if err != nil {
if aerr, ok := err.(awserr.Error); ok {
switch aerr.Code() {
case s3.ErrCodeNoSuchBucket:
return false
default:
return false
}
}
}

return true
}
15 changes: 11 additions & 4 deletions internal/commands/tfenv_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ func TestTfenv(t *testing.T) {
withECS: true,
mockS3Client: func(m *mocks.MockS3API) {
m.EXPECT().HeadBucket(gomock.Any()).Return(nil, nil).AnyTimes()
m.EXPECT().HeadObject(gomock.Any()).Return(nil, nil).AnyTimes()
},
mockSTSClient: func(m *mocks.MockSTSAPI) {},
wantBackend: `provider "aws" {
Expand Down Expand Up @@ -90,6 +91,7 @@ root_domain_name = "examples.ize.sh"
wantErr: false,
mockS3Client: func(m *mocks.MockS3API) {
m.EXPECT().HeadBucket(gomock.Any()).Return(nil, nil).AnyTimes()
m.EXPECT().HeadObject(gomock.Any()).Return(nil, nil).AnyTimes()
},
mockSTSClient: func(m *mocks.MockSTSAPI) {},
withECS: true,
Expand Down Expand Up @@ -134,6 +136,7 @@ root_domain_name = "examples.ize.sh"
wantErr: false,
mockS3Client: func(m *mocks.MockS3API) {
m.EXPECT().HeadBucket(gomock.Any()).Return(nil, nil).AnyTimes()
m.EXPECT().HeadObject(gomock.Any()).Return(nil, nil).AnyTimes()
},
withECS: true,
mockSTSClient: func(m *mocks.MockSTSAPI) {},
Expand Down Expand Up @@ -177,6 +180,7 @@ root_domain_name = "test"
wantErr: false,
mockS3Client: func(m *mocks.MockS3API) {
m.EXPECT().HeadBucket(gomock.Any()).Return(nil, awserr.New(s3.ErrCodeNoSuchKey, "message", nil)).Times(1)
m.EXPECT().HeadObject(gomock.Any()).Return(nil, nil).AnyTimes()
},
mockSTSClient: func(m *mocks.MockSTSAPI) {
m.EXPECT().GetCallerIdentity(gomock.Any()).Return(&sts.GetCallerIdentityOutput{
Expand Down Expand Up @@ -214,10 +218,12 @@ namespace = "testnut"
`,
},
{
name: "success (only flags)",
args: []string{"-e=test", "-r=us-east-1", "-p=test", "-n=testnut", "gen", "tfenv", "--terraform-state-bucket-name=test"},
wantErr: false,
mockS3Client: func(m *mocks.MockS3API) {},
name: "success (only flags)",
args: []string{"-e=test", "-r=us-east-1", "-p=test", "-n=testnut", "gen", "tfenv", "--terraform-state-bucket-name=test"},
wantErr: false,
mockS3Client: func(m *mocks.MockS3API) {
m.EXPECT().HeadObject(gomock.Any()).Return(nil, nil).AnyTimes()
},
mockSTSClient: func(m *mocks.MockSTSAPI) {},
wantBackend: `provider "aws" {
profile = var.aws_profile
Expand Down Expand Up @@ -256,6 +262,7 @@ namespace = "testnut"
wantErr: false,
mockS3Client: func(m *mocks.MockS3API) {
m.EXPECT().HeadBucket(gomock.Any()).Return(nil, awserr.New(s3.ErrCodeNoSuchBucket, "message", nil)).Times(1)
m.EXPECT().HeadObject(gomock.Any()).Return(nil, nil).AnyTimes()
},
mockSTSClient: func(m *mocks.MockSTSAPI) {
m.EXPECT().GetCallerIdentity(gomock.Any()).Return(&sts.GetCallerIdentityOutput{
Expand Down
21 changes: 11 additions & 10 deletions internal/commands/up.go
Original file line number Diff line number Diff line change
Expand Up @@ -112,20 +112,21 @@ func (o *UpOptions) Complete(cmd *cobra.Command, args []string) error {
}

if o.Config.Terraform == nil {
o.Config.Terraform = map[string]*config.Terraform{}
o.Config.Terraform["infra"] = &config.Terraform{}
return fmt.Errorf("you must specify at least one terraform stack in ize.toml")
}

if len(o.Config.Terraform["infra"].AwsProfile) == 0 {
o.Config.Terraform["infra"].AwsProfile = o.Config.AwsProfile
}
if _, ok := o.Config.Terraform["infra"]; ok {
if len(o.Config.Terraform["infra"].AwsProfile) == 0 {
o.Config.Terraform["infra"].AwsProfile = o.Config.AwsProfile
}

if len(o.Config.Terraform["infra"].AwsRegion) == 0 {
o.Config.Terraform["infra"].AwsProfile = o.Config.AwsRegion
}
if len(o.Config.Terraform["infra"].AwsRegion) == 0 {
o.Config.Terraform["infra"].AwsRegion = o.Config.AwsRegion
}

if len(o.Config.Terraform["infra"].Version) == 0 {
o.Config.Terraform["infra"].Version = o.Config.TerraformVersion
if len(o.Config.Terraform["infra"].Version) == 0 {
o.Config.Terraform["infra"].Version = o.Config.TerraformVersion
}
}
} else {
if err := requirements.CheckRequirements(requirements.WithIzeStructure(), requirements.WithConfigFile()); err != nil {
Expand Down
51 changes: 27 additions & 24 deletions internal/commands/up_infra.go
Original file line number Diff line number Diff line change
Expand Up @@ -95,36 +95,39 @@ func (o *UpInfraOptions) Complete() error {
}

if o.Config.Terraform == nil {
o.Config.Terraform = map[string]*config.Terraform{}
o.Config.Terraform["infra"] = &config.Terraform{}
return fmt.Errorf("you must specify at least one terraform stack in ize.toml")
}

if len(o.AwsProfile) != 0 {
o.Config.Terraform["infra"].AwsProfile = o.AwsProfile
}
if _, ok := o.Config.Terraform["infra"]; ok {
if len(o.AwsProfile) != 0 {
o.Config.Terraform["infra"].AwsProfile = o.AwsProfile
}

if len(o.Config.Terraform["infra"].AwsProfile) == 0 {
o.Config.Terraform["infra"].AwsProfile = o.Config.AwsProfile
}
if len(o.Config.Terraform["infra"].AwsProfile) == 0 {
o.Config.Terraform["infra"].AwsProfile = o.Config.AwsProfile
}

if len(o.AwsProfile) != 0 {
o.Config.Terraform["infra"].AwsRegion = o.AwsRegion
}
if len(o.AwsProfile) != 0 {
o.Config.Terraform["infra"].AwsRegion = o.AwsRegion
}

if len(o.Config.Terraform["infra"].AwsRegion) == 0 {
o.Config.Terraform["infra"].AwsRegion = o.Config.AwsRegion
}
if len(o.Config.Terraform["infra"].AwsRegion) == 0 {
o.Config.Terraform["infra"].AwsRegion = o.Config.AwsRegion
}

if len(o.Config.Terraform["infra"].StateBucketRegion) == 0 {
o.Config.Terraform["infra"].StateBucketRegion = o.Config.Terraform["infra"].AwsRegion
}

if len(o.Version) != 0 {
o.Config.Terraform["infra"].Version = o.Version
}
if len(o.Config.Terraform["infra"].StateBucketRegion) == 0 {
o.Config.Terraform["infra"].StateBucketRegion = o.Config.Terraform["infra"].AwsRegion
}

if len(o.Config.Terraform["infra"].Version) == 0 {
o.Config.Terraform["infra"].Version = o.Config.TerraformVersion
if len(o.Version) != 0 {
o.Config.Terraform["infra"].Version = o.Version
}


if len(o.Config.Terraform["infra"].Version) == 0 {
o.Config.Terraform["infra"].Version = o.Config.TerraformVersion
}
}

o.UI = terminal.ConsoleUI(context.Background(), o.Config.PlainText)
Expand Down Expand Up @@ -235,7 +238,7 @@ func deployInfra(name string, ui terminal.UI, config *config.Project, skipGen bo

var tf terraform.Terraform

logrus.Infof("infra: %s", config.Terraform["infra"])
logrus.Infof("infra: %s", config.Terraform[name])

v, err := config.Session.Config.Credentials.Get()
if err != nil {
Expand All @@ -244,7 +247,7 @@ func deployInfra(name string, ui terminal.UI, config *config.Project, skipGen bo

env := []string{
fmt.Sprintf("ENV=%v", config.Env),
fmt.Sprintf("AWS_PROFILE=%v", config.Terraform["infra"].AwsProfile),
fmt.Sprintf("AWS_PROFILE=%v", config.Terraform[name].AwsProfile),
fmt.Sprintf("TF_LOG=%v", config.TFLog),
fmt.Sprintf("TF_LOG_PATH=%v", config.TFLogPath),
fmt.Sprintf("AWS_ACCESS_KEY_ID=%v", v.AccessKeyID),
Expand Down
1 change: 0 additions & 1 deletion internal/config/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -241,7 +241,6 @@ func InitConfig() {
viper.SetDefault("PREFER_RUNTIME", "native")
viper.SetDefault("CUSTOM_PROMPT", false)
viper.SetDefault("PLAIN_TEXT", false)
viper.SetDefault("terraform.infra.state_name", "terraform")

home, err := os.UserHomeDir()
if err != nil {
Expand Down

0 comments on commit 04a26c8

Please sign in to comment.