diff --git a/docs/examples/terraform/cloud-resource-provision-and-consume/application-aws-s3.yaml b/docs/examples/terraform/cloud-resource-provision-and-consume/application-aws-s3.yaml new file mode 100644 index 000000000..1bbeda59b --- /dev/null +++ b/docs/examples/terraform/cloud-resource-provision-and-consume/application-aws-s3.yaml @@ -0,0 +1,14 @@ +apiVersion: core.oam.dev/v1beta1 +kind: Application +metadata: + name: app-aws-s3 +spec: + components: + - name: sample-s3 + type: aws-s3 + properties: + bucket: vela-website-202110191745 + acl: private + + writeConnectionSecretToRef: + name: s3-conn \ No newline at end of file diff --git a/pkg/appfile/appfile.go b/pkg/appfile/appfile.go index b2b9b9e14..a799f72a4 100644 --- a/pkg/appfile/appfile.go +++ b/pkg/appfile/appfile.go @@ -704,7 +704,14 @@ func generateTerraformConfigurationWorkload(wl *Workload, ns string) (*unstructu } if spec.ProviderReference != nil && !reflect.DeepEqual(configuration.Spec.ProviderReference, spec.ProviderReference) { configuration.Spec.ProviderReference = spec.ProviderReference + } else if wl.FullTemplate != nil && wl.FullTemplate.ComponentDefinition != nil && + wl.FullTemplate.ComponentDefinition.Spec.Schematic != nil && + wl.FullTemplate.ComponentDefinition.Spec.Schematic.Terraform != nil && + wl.FullTemplate.ComponentDefinition.Spec.Schematic.Terraform.ProviderReference != nil { + // Check whether the provider reference is set in ComponentDefinition + configuration.Spec.ProviderReference = wl.FullTemplate.ComponentDefinition.Spec.Schematic.Terraform.ProviderReference } + if spec.Region != "" && configuration.Spec.Region != spec.Region { configuration.Spec.Region = spec.Region } diff --git a/pkg/appfile/appfile_test.go b/pkg/appfile/appfile_test.go index 36274d0ad..3aade2a77 100644 --- a/pkg/appfile/appfile_test.go +++ b/pkg/appfile/appfile_test.go @@ -944,7 +944,6 @@ func TestGenerateTerraformConfigurationWorkload(t *testing.T) { }, "workload's params is bad": { - args: args{ params: badParam, hcl: "abc", @@ -952,8 +951,7 @@ func TestGenerateTerraformConfigurationWorkload(t *testing.T) { want: want{err: errors.Wrap(badParamMarshalError, errFailToConvertTerraformComponentProperties)}, }, - "terraform workload has a provider reference": { - + "terraform workload has a provider reference, but parameters are bad": { args: args{ params: badParam, hcl: "abc", @@ -961,6 +959,14 @@ func TestGenerateTerraformConfigurationWorkload(t *testing.T) { }, want: want{err: errors.Wrap(badParamMarshalError, errFailToConvertTerraformComponentProperties)}, }, + "terraform workload has a provider reference": { + args: args{ + params: variable, + hcl: "variable \"name\" {\n description = \"Name to be used on all resources as prefix. Default to 'TF-Module-EIP'.\"\n default = \"TF-Module-EIP\"\n type = string\n }", + providerRef: &terraformtypes.Reference{Name: "aws", Namespace: "default"}, + }, + want: want{err: nil}, + }, } for tcName, tc := range testcases { @@ -1021,7 +1027,16 @@ func TestGenerateTerraformConfigurationWorkload(t *testing.T) { configSpec.WriteConnectionSecretToReference = tc.args.writeConnectionSecretToRef } if tc.args.providerRef != nil { - template.Terraform.ProviderReference = tc.args.providerRef + tf := &common.Terraform{} + tf.ProviderReference = tc.args.providerRef + template.ComponentDefinition = &v1beta1.ComponentDefinition{ + Spec: v1beta1.ComponentDefinitionSpec{ + Schematic: &common.Schematic{ + Terraform: tf, + }, + }, + } + configSpec.ProviderReference = tc.args.providerRef } wl := &Workload{