diff --git a/mmv1/third_party/terraform/fwprovider/framework_provider.go.tmpl b/mmv1/third_party/terraform/fwprovider/framework_provider.go.tmpl index e71a6d220941..9d03a71f5498 100644 --- a/mmv1/third_party/terraform/fwprovider/framework_provider.go.tmpl +++ b/mmv1/third_party/terraform/fwprovider/framework_provider.go.tmpl @@ -21,7 +21,8 @@ import ( "github.com/hashicorp/terraform-provider-google/google/functions" "github.com/hashicorp/terraform-provider-google/google/fwmodels" "github.com/hashicorp/terraform-provider-google/google/services/resourcemanager" - + "github.com/hashicorp/terraform-provider-google/google/services/apigee" + "github.com/hashicorp/terraform-provider-google/version" {{- if ne $.TargetVersionName "ga" }} "github.com/hashicorp/terraform-provider-google/google/services/firebase" @@ -329,7 +330,9 @@ func (p *FrameworkProvider) DataSources(_ context.Context) []func() datasource.D // Resources defines the resources implemented in the provider. func (p *FrameworkProvider) Resources(_ context.Context) []func() resource.Resource { - return nil + return []func() resource.Resource{ + apigee.NewApigeeKeystoresAliasesKeyCertFileResource, + } } // Functions defines the provider functions implemented in the provider. diff --git a/mmv1/third_party/terraform/provider/provider_mmv1_resources.go.tmpl b/mmv1/third_party/terraform/provider/provider_mmv1_resources.go.tmpl index 07830118fe48..f0ea04ee9168 100644 --- a/mmv1/third_party/terraform/provider/provider_mmv1_resources.go.tmpl +++ b/mmv1/third_party/terraform/provider/provider_mmv1_resources.go.tmpl @@ -349,7 +349,6 @@ var handwrittenResources = map[string]*schema.Resource{ "google_apigee_sharedflow_deployment": apigee.ResourceApigeeSharedFlowDeployment(), "google_apigee_flowhook": apigee.ResourceApigeeFlowhook(), "google_apigee_keystores_aliases_pkcs12": apigee.ResourceApigeeKeystoresAliasesPkcs12(), - "google_apigee_keystores_aliases_key_cert_file": apigee.ResourceApigeeKeystoresAliasesKeyCertFile(), "google_bigquery_table": bigquery.ResourceBigQueryTable(), "google_bigtable_gc_policy": bigtable.ResourceBigtableGCPolicy(), "google_bigtable_instance": bigtable.ResourceBigtableInstance(), diff --git a/mmv1/third_party/terraform/services/apigee/fw_apigee_utils.go b/mmv1/third_party/terraform/services/apigee/fw_apigee_utils.go new file mode 100644 index 000000000000..065a3862bda8 --- /dev/null +++ b/mmv1/third_party/terraform/services/apigee/fw_apigee_utils.go @@ -0,0 +1,117 @@ +package apigee + +import ( + "context" + "encoding/json" + "fmt" + "io" + "net/http" + "time" + + "github.com/hashicorp/terraform-plugin-framework/diag" + "github.com/hashicorp/terraform-plugin-log/tflog" + transport_tpg "github.com/hashicorp/terraform-provider-google/google/transport" + "google.golang.org/api/googleapi" +) + +func RetryWithContext(ctx context.Context, opt transport_tpg.RetryOptions) error { + doneCh := make(chan error, 1) + + go func() { + doneCh <- transport_tpg.Retry(opt) + }() + + select { + case err := <-doneCh: + return err + case <-ctx.Done(): + return ctx.Err() + } +} + +func sendRequestRawBodyFramework(ctx context.Context, opts SendRequestRawBodyOptions) (map[string]interface{}, diag.Diagnostics) { + var diags diag.Diagnostics + + tflog.Trace(ctx, "Executing raw body request", map[string]interface{}{ + "url": opts.RawURL, + "method": opts.Method, + }) + + reqHeaders := make(http.Header) + reqHeaders.Set("User-Agent", opts.UserAgent) + reqHeaders.Set("Content-Type", opts.ContentType) + + if opts.Config.UserProjectOverride && opts.Project != "" { + reqHeaders.Set("X-Goog-User-Project", opts.Project) + } + + timeout := opts.Timeout + if timeout == 0 { + timeout = 2 * time.Minute + } + + var httpResp *http.Response + + err := RetryWithContext(ctx, transport_tpg.RetryOptions{ + RetryFunc: func() error { + client := opts.Config.Client + + if bodySeeker, ok := opts.Body.(io.ReadSeeker); ok { + bodySeeker.Seek(0, io.SeekStart) + } + + httpReq, err := http.NewRequestWithContext(ctx, opts.Method, opts.RawURL, opts.Body) + if err != nil { + return fmt.Errorf("error creating HTTP request: %w", err) + } + httpReq.Header = reqHeaders + + httpResp, err = client.Do(httpReq) + if err != nil { + return fmt.Errorf("error sending request: %w", err) + } + + if err := googleapi.CheckResponse(httpResp); err != nil { + return err + } + + return nil + }, + Timeout: timeout, + }) + + if err != nil { + diags.AddError("API Request Failed", fmt.Sprintf("request to %s failed with retries: %s", opts.RawURL, err.Error())) + return nil, diags + } + + if httpResp == nil { + diags.AddError("API Response Error", "Request was successful, but the HTTP response was nil.") + return nil, diags + } + defer googleapi.CloseBody(httpResp) + + if httpResp.StatusCode == http.StatusNoContent { + return nil, diags + } + + result := make(map[string]interface{}) + if err := json.NewDecoder(httpResp.Body).Decode(&result); err != nil { + diags.AddError("API Response Decode Error", fmt.Sprintf("failed to decode JSON response body: %s", err.Error())) + return nil, diags + } + + tflog.Trace(ctx, "Raw body request successful") + return result, diags +} + +type SendRequestRawBodyOptions struct { + Config *transport_tpg.Config + Method string + Project string + RawURL string + UserAgent string + Body io.Reader + ContentType string + Timeout time.Duration +} diff --git a/mmv1/third_party/terraform/services/apigee/fw_resource_apigee_keystores_aliases_key_cert_file.go b/mmv1/third_party/terraform/services/apigee/fw_resource_apigee_keystores_aliases_key_cert_file.go new file mode 100644 index 000000000000..8d1789ae0749 --- /dev/null +++ b/mmv1/third_party/terraform/services/apigee/fw_resource_apigee_keystores_aliases_key_cert_file.go @@ -0,0 +1,512 @@ +package apigee + +import ( + "bytes" + "context" + "fmt" + "mime/multipart" + + "github.com/hashicorp/terraform-plugin-framework/attr" + "github.com/hashicorp/terraform-plugin-framework/diag" + "github.com/hashicorp/terraform-plugin-framework/path" + "github.com/hashicorp/terraform-plugin-framework/resource" + "github.com/hashicorp/terraform-plugin-framework/resource/schema" + "github.com/hashicorp/terraform-plugin-framework/resource/schema/planmodifier" + "github.com/hashicorp/terraform-plugin-framework/resource/schema/stringplanmodifier" + "github.com/hashicorp/terraform-plugin-framework/tfsdk" + "github.com/hashicorp/terraform-plugin-framework/types" + "github.com/hashicorp/terraform-plugin-log/tflog" + "github.com/hashicorp/terraform-provider-google/google/fwmodels" + "github.com/hashicorp/terraform-provider-google/google/fwresource" + "github.com/hashicorp/terraform-provider-google/google/fwtransport" + transport_tpg "github.com/hashicorp/terraform-provider-google/google/transport" +) + +var ( + _ resource.Resource = &ApigeeKeystoresAliasesKeyCertFileResource{} + _ resource.ResourceWithConfigure = &ApigeeKeystoresAliasesKeyCertFileResource{} + _ resource.ResourceWithImportState = &ApigeeKeystoresAliasesKeyCertFileResource{} +) + +func NewApigeeKeystoresAliasesKeyCertFileResource() resource.Resource { + return &ApigeeKeystoresAliasesKeyCertFileResource{} +} + +type ApigeeKeystoresAliasesKeyCertFileResource struct { + providerConfig *transport_tpg.Config +} + +type ApigeeKeystoresAliasesKeyCertFileResourceModel struct { + Id types.String `tfsdk:"id"` + OrgId types.String `tfsdk:"org_id"` + Environment types.String `tfsdk:"environment"` + Keystore types.String `tfsdk:"keystore"` + Alias types.String `tfsdk:"alias"` + Cert types.String `tfsdk:"cert"` + Key types.String `tfsdk:"key"` + Password types.String `tfsdk:"password"` + Type types.String `tfsdk:"type"` + CertsInfo types.List `tfsdk:"certs_info"` +} + +type CertInfoDetailModel struct { + BasicConstraints types.String `tfsdk:"basic_constraints"` + ExpiryDate types.String `tfsdk:"expiry_date"` + IsValid types.String `tfsdk:"is_valid"` + Issuer types.String `tfsdk:"issuer"` + PublicKey types.String `tfsdk:"public_key"` + SerialNumber types.String `tfsdk:"serial_number"` + SigAlgName types.String `tfsdk:"sig_alg_name"` + Subject types.String `tfsdk:"subject"` + SubjectAlternativeNames types.List `tfsdk:"subject_alternative_names"` + ValidFrom types.String `tfsdk:"valid_from"` + Version types.Int64 `tfsdk:"version"` +} + +func (r *ApigeeKeystoresAliasesKeyCertFileResource) Metadata(_ context.Context, req resource.MetadataRequest, resp *resource.MetadataResponse) { + resp.TypeName = req.ProviderTypeName + "_apigee_keystores_aliases_key_cert_file" +} + +func (r *ApigeeKeystoresAliasesKeyCertFileResource) Configure(ctx context.Context, req resource.ConfigureRequest, resp *resource.ConfigureResponse) { + if req.ProviderData == nil { + return + } + p, ok := req.ProviderData.(*transport_tpg.Config) + if !ok { + resp.Diagnostics.AddError( + "Unexpected Resource Configure Type", + fmt.Sprintf("Expected *transport_tpg.Config, got: %T. Please report this issue to the provider developers.", req.ProviderData), + ) + return + } + r.providerConfig = p +} + +func (r *ApigeeKeystoresAliasesKeyCertFileResource) Schema(_ context.Context, _ resource.SchemaRequest, resp *resource.SchemaResponse) { + resp.Schema = schema.Schema{ + Description: "An alias from a key/cert file.", + Attributes: map[string]schema.Attribute{ + "org_id": schema.StringAttribute{ + Description: "Organization ID associated with the alias.", + Required: true, + PlanModifiers: []planmodifier.String{ + stringplanmodifier.RequiresReplace(), + }, + }, + "environment": schema.StringAttribute{ + Description: "Environment associated with the alias.", + Required: true, + PlanModifiers: []planmodifier.String{ + stringplanmodifier.RequiresReplace(), + }, + }, + "keystore": schema.StringAttribute{ + Description: "Keystore Name.", + Required: true, + PlanModifiers: []planmodifier.String{ + stringplanmodifier.RequiresReplace(), + }, + }, + "alias": schema.StringAttribute{ + Description: "Alias Name.", + Required: true, + PlanModifiers: []planmodifier.String{ + stringplanmodifier.RequiresReplace(), + }, + }, + "cert": schema.StringAttribute{ + Description: "Cert content.", + Required: true, + }, + "key": schema.StringAttribute{ + Description: "Private Key content, omit if uploading to truststore.", + Optional: true, + Sensitive: true, + PlanModifiers: []planmodifier.String{ + stringplanmodifier.RequiresReplace(), + }, + }, + "password": schema.StringAttribute{ + Description: "Password for the Private Key if it's encrypted.", + Optional: true, + Sensitive: true, + }, + "type": schema.StringAttribute{ + Description: "Optional. Type of Alias.", + Computed: true, + }, + "id": schema.StringAttribute{ + Description: "Project identifier", + Computed: true, + }, + "certs_info": schema.ListAttribute{ + Description: "Chain of certificates under this alias.", + Computed: true, + ElementType: types.ObjectType{ + AttrTypes: map[string]attr.Type{ + "basic_constraints": types.StringType, + "expiry_date": types.StringType, + "is_valid": types.StringType, + "issuer": types.StringType, + "public_key": types.StringType, + "serial_number": types.StringType, + "sig_alg_name": types.StringType, + "subject": types.StringType, + "subject_alternative_names": types.ListType{ElemType: types.StringType}, + "valid_from": types.StringType, + "version": types.Int64Type, + }, + }, + }, + }, + } +} + +func (r *ApigeeKeystoresAliasesKeyCertFileResource) Create(ctx context.Context, req resource.CreateRequest, resp *resource.CreateResponse) { + var plan ApigeeKeystoresAliasesKeyCertFileResourceModel + var metaData *fwmodels.ProviderMetaModel + + resp.Diagnostics.Append(req.Plan.Get(ctx, &plan)...) + resp.Diagnostics.Append(req.ProviderMeta.Get(ctx, &metaData)...) + if resp.Diagnostics.HasError() { + return + } + + buf := new(bytes.Buffer) + bw := multipart.NewWriter(buf) + if !plan.Key.IsNull() && !plan.Key.IsUnknown() { + keyFilePartWriter, _ := bw.CreateFormField("keyFile") + keyFilePartWriter.Write([]byte(plan.Key.ValueString())) + } + if !plan.Password.IsNull() && !plan.Password.IsUnknown() { + keyFilePartWriter, _ := bw.CreateFormField("password") + keyFilePartWriter.Write([]byte(plan.Password.ValueString())) + } + certFilePartWriter, _ := bw.CreateFormField("certFile") + certFilePartWriter.Write([]byte(plan.Cert.ValueString())) + bw.Close() + + billingProject := types.StringValue(r.providerConfig.BillingProject) + + var schemaDefaultVals fwtransport.DefaultVars + + userAgent := fwtransport.GenerateFrameworkUserAgentString(metaData, r.providerConfig.UserAgent) + url := fwtransport.ReplaceVars(ctx, req, &resp.Diagnostics, schemaDefaultVals, r.providerConfig, "{{ApigeeBasePath}}organizations/{{org_id}}/environments/{{environment}}/keystores/{{keystore}}/aliases?format=keycertfile&alias={{alias}}&ignoreExpiryValidation=true") + if resp.Diagnostics.HasError() { + return + } + res, diags := sendRequestRawBodyFramework(ctx, SendRequestRawBodyOptions{ + Config: r.providerConfig, + Method: "POST", + Project: billingProject.ValueString(), + RawURL: url, + UserAgent: userAgent, + Body: buf, + ContentType: bw.FormDataContentType(), + }) + resp.Diagnostics.Append(diags...) + if resp.Diagnostics.HasError() { + return + } + + tflog.Trace(ctx, "Successfully created Apigee Keystore Alias", map[string]interface{}{"response": res}) + + id := fmt.Sprintf("organizations/%s/environments/%s/keystores/%s/aliases/%s", + plan.OrgId.ValueString(), + plan.Environment.ValueString(), + plan.Keystore.ValueString(), + plan.Alias.ValueString(), + ) + plan.Id = types.StringValue(id) + + r.refresh(ctx, req, &plan, &resp.State, &resp.Diagnostics) + if resp.Diagnostics.HasError() { + return + } + + resp.Diagnostics.Append(resp.State.Set(ctx, &plan)...) +} + +func (r *ApigeeKeystoresAliasesKeyCertFileResource) Read(ctx context.Context, req resource.ReadRequest, resp *resource.ReadResponse) { + var state ApigeeKeystoresAliasesKeyCertFileResourceModel + + resp.Diagnostics.Append(req.State.Get(ctx, &state)...) + if resp.Diagnostics.HasError() { + return + } + + r.refresh(ctx, req, &state, &resp.State, &resp.Diagnostics) + if resp.Diagnostics.HasError() { + return + } + + resp.Diagnostics.Append(resp.State.Set(ctx, &state)...) +} + +func (r *ApigeeKeystoresAliasesKeyCertFileResource) Update(ctx context.Context, req resource.UpdateRequest, resp *resource.UpdateResponse) { + var plan ApigeeKeystoresAliasesKeyCertFileResourceModel + var state ApigeeKeystoresAliasesKeyCertFileResourceModel + var metaData *fwmodels.ProviderMetaModel + + resp.Diagnostics.Append(req.Plan.Get(ctx, &plan)...) + resp.Diagnostics.Append(req.State.Get(ctx, &state)...) + if resp.Diagnostics.HasError() { + return + } + + resp.Diagnostics.Append(req.ProviderMeta.Get(ctx, &metaData)...) + if resp.Diagnostics.HasError() { + return + } + + buf := new(bytes.Buffer) + bw := multipart.NewWriter(buf) + certFilePartWriter, err := bw.CreateFormField("certFile") + if err != nil { + resp.Diagnostics.AddError("Unable to create form field for certificate", err.Error()) + return + } + certFilePartWriter.Write([]byte(plan.Cert.ValueString())) + bw.Close() + + billingProject := types.StringValue(r.providerConfig.BillingProject) + userAgent := fwtransport.GenerateFrameworkUserAgentString(metaData, r.providerConfig.UserAgent) + + var schemaDefaultVals fwtransport.DefaultVars + + url := fwtransport.ReplaceVars(ctx, req, &resp.Diagnostics, schemaDefaultVals, r.providerConfig, "{{ApigeeBasePath}}organizations/{{org_id}}/environments/{{environment}}/keystores/{{keystore}}/aliases/{{alias}}?ignoreExpiryValidation=true") + if resp.Diagnostics.HasError() { + return + } + + tflog.Trace(ctx, "Updating Apigee Keystore Alias", map[string]interface{}{"url": url}) + + res, diags := sendRequestRawBodyFramework(ctx, SendRequestRawBodyOptions{ + Config: r.providerConfig, + Method: "PUT", + Project: billingProject.ValueString(), + RawURL: url, + UserAgent: userAgent, + Body: buf, + ContentType: bw.FormDataContentType(), + }) + resp.Diagnostics.Append(diags...) + if resp.Diagnostics.HasError() { + return + } + + tflog.Trace(ctx, "Successfully sent update request for Apigee Keystore Alias", map[string]interface{}{"response": res}) + + r.refresh(ctx, req, &plan, &resp.State, &resp.Diagnostics) + if resp.Diagnostics.HasError() { + return + } + + resp.Diagnostics.Append(resp.State.Set(ctx, &plan)...) +} + +func (r *ApigeeKeystoresAliasesKeyCertFileResource) Delete(ctx context.Context, req resource.DeleteRequest, resp *resource.DeleteResponse) { + var data ApigeeKeystoresAliasesKeyCertFileResourceModel + var metaData *fwmodels.ProviderMetaModel + + resp.Diagnostics.Append(req.State.Get(ctx, &data)...) + if resp.Diagnostics.HasError() { + return + } + + resp.Diagnostics.Append(req.ProviderMeta.Get(ctx, &metaData)...) + if resp.Diagnostics.HasError() { + return + } + + userAgent := fwtransport.GenerateFrameworkUserAgentString(metaData, r.providerConfig.UserAgent) + + var schemaDefaultVals fwtransport.DefaultVars + url := fwtransport.ReplaceVars(ctx, req, &resp.Diagnostics, schemaDefaultVals, r.providerConfig, "{{ApigeeBasePath}}organizations/{{org_id}}/environments/{{environment}}/keystores/{{keystore}}/aliases/{{alias}}") + if resp.Diagnostics.HasError() { + return + } + + tflog.Trace(ctx, "Deleting Apigee Keystore Alias", map[string]interface{}{"url": url}) + + _ = fwtransport.SendRequest(fwtransport.SendRequestOptions{ + Config: r.providerConfig, + Method: "DELETE", + Project: data.OrgId.ValueString(), + RawURL: url, + UserAgent: userAgent, + }, &resp.Diagnostics) + + tflog.Trace(ctx, "Successfully deleted Apigee Keystore Alias.") +} + +func (r *ApigeeKeystoresAliasesKeyCertFileResource) refresh(ctx context.Context, req interface{}, data *ApigeeKeystoresAliasesKeyCertFileResourceModel, state *tfsdk.State, diags *diag.Diagnostics) { + var metaData *fwmodels.ProviderMetaModel + + userAgent := fwtransport.GenerateFrameworkUserAgentString(metaData, r.providerConfig.UserAgent) + + var schemaDefaultVals fwtransport.DefaultVars + url := fwtransport.ReplaceVars(ctx, req, diags, schemaDefaultVals, r.providerConfig, "{{ApigeeBasePath}}organizations/{{org_id}}/environments/{{environment}}/keystores/{{keystore}}/aliases/{{alias}}") + if diags.HasError() { + return + } + + tflog.Trace(ctx, "Refreshing Apigee Keystore Alias", map[string]interface{}{"url": url}) + + res := fwtransport.SendRequest(fwtransport.SendRequestOptions{ + Config: r.providerConfig, + Method: "GET", + Project: data.OrgId.ValueString(), + RawURL: url, + UserAgent: userAgent, + }, diags) + + if diags.HasError() { + return + } + + tflog.Trace(ctx, "Successfully refreshed Apigee Keystore Alias", map[string]interface{}{"response": res}) + + id := fmt.Sprintf("organizations/%s/environments/%s/keystores/%s/aliases/%s", + data.OrgId.ValueString(), + data.Environment.ValueString(), + data.Keystore.ValueString(), + data.Alias.ValueString(), + ) + data.Id = types.StringValue(id) + + data.Type = types.StringValue(res["type"].(string)) + + flattenedCertsInfo, certDiags := flattenCertsInfo(res["certsInfo"]) + diags.Append(certDiags...) + if diags.HasError() { + return + } + data.CertsInfo = flattenedCertsInfo +} + +var certInfoObjectType = types.ObjectType{ + AttrTypes: map[string]attr.Type{ + "basic_constraints": types.StringType, + "expiry_date": types.StringType, + "is_valid": types.StringType, + "issuer": types.StringType, + "public_key": types.StringType, + "serial_number": types.StringType, + "sig_alg_name": types.StringType, + "subject": types.StringType, + "subject_alternative_names": types.ListType{ElemType: types.StringType}, + "valid_from": types.StringType, + "version": types.Int64Type, + }, +} + +func flattenCertsInfo(v interface{}) (types.List, diag.Diagnostics) { + if v == nil { + return types.ListNull(certInfoObjectType), nil + } + + var diags diag.Diagnostics + + certsInfoMap, ok := v.(map[string]interface{}) + if !ok { + diags.AddError("Invalid Type", "Cannot flatten certs_info: input is not a map.") + return types.ListNull(certInfoObjectType), diags + } + if len(certsInfoMap) == 0 { + return types.ListNull(certInfoObjectType), nil + } + + certInfoListRaw, ok := certsInfoMap["certInfo"].([]interface{}) + if !ok || len(certInfoListRaw) == 0 { + return types.ListNull(certInfoObjectType), nil + } + + var certInfoDetails []CertInfoDetailModel + for _, rawCertInfo := range certInfoListRaw { + certInfo, ok := rawCertInfo.(map[string]interface{}) + if !ok || len(certInfo) == 0 { + continue + } + getStringValue := func(key string) types.String { + if val, ok := certInfo[key].(string); ok { + return types.StringValue(val) + } + return types.StringNull() + } + var sansValue types.List + if sansRaw, ok := certInfo["subjectAlternativeNames"].([]interface{}); ok { + sans := make([]string, 0, len(sansRaw)) + for _, san := range sansRaw { + if s, ok := san.(string); ok { + sans = append(sans, s) + } + } + var listDiags diag.Diagnostics + sansValue, listDiags = types.ListValueFrom(context.Background(), types.StringType, sans) + diags.Append(listDiags...) + } else { + sansValue = types.ListNull(types.StringType) + } + var versionValue types.Int64 + if versionRaw, ok := certInfo["version"]; ok { + switch v := versionRaw.(type) { + case float64: + versionValue = types.Int64Value(int64(v)) + case string: + versionValue = types.Int64Null() + default: + versionValue = types.Int64Null() + } + } else { + versionValue = types.Int64Null() + } + detail := CertInfoDetailModel{ + BasicConstraints: getStringValue("basicConstraints"), + ExpiryDate: getStringValue("expiryDate"), + IsValid: getStringValue("isValid"), + Issuer: getStringValue("issuer"), + PublicKey: getStringValue("publicKey"), + SerialNumber: getStringValue("serialNumber"), + SigAlgName: getStringValue("sigAlgName"), + Subject: getStringValue("subject"), + ValidFrom: getStringValue("validFrom"), + SubjectAlternativeNames: sansValue, + Version: versionValue, + } + certInfoDetails = append(certInfoDetails, detail) + } + + if diags.HasError() { + return types.ListNull(certInfoObjectType), diags + } + + flattenedList, listDiags := types.ListValueFrom(context.Background(), certInfoObjectType, certInfoDetails) + diags.Append(listDiags...) + + return flattenedList, diags +} + +func (r *ApigeeKeystoresAliasesKeyCertFileResource) ImportState(ctx context.Context, req resource.ImportStateRequest, resp *resource.ImportStateResponse) { + idRegexes := []string{ + "organizations/(?P[^/]+)/environments/(?P[^/]+)/keystores/(?P[^/]+)/aliases/(?P[^/]+)", + "(?P[^/]+)/(?P[^/]+)/(?P[^/]+)/(?P[^/]+)", + } + + var resourceSchemaResp resource.SchemaResponse + r.Schema(ctx, resource.SchemaRequest{}, &resourceSchemaResp) + if resourceSchemaResp.Diagnostics.HasError() { + resp.Diagnostics.Append(resourceSchemaResp.Diagnostics...) + return + } + + parsedAttributes, diags := fwresource.ParseImportId(ctx, req, resourceSchemaResp.Schema, r.providerConfig, idRegexes) + resp.Diagnostics.Append(diags...) + if resp.Diagnostics.HasError() { + return + } + + for name, value := range parsedAttributes { + resp.Diagnostics.Append(resp.State.SetAttribute(ctx, path.Root(name), value)...) + } +} diff --git a/mmv1/third_party/terraform/services/apigee/resource_apigee_keystores_aliases_key_cert_file.go b/mmv1/third_party/terraform/services/apigee/resource_apigee_keystores_aliases_key_cert_file.go deleted file mode 100644 index 48747a85d5b9..000000000000 --- a/mmv1/third_party/terraform/services/apigee/resource_apigee_keystores_aliases_key_cert_file.go +++ /dev/null @@ -1,692 +0,0 @@ -package apigee - -import ( - "bytes" - "context" - "fmt" - "log" - "mime/multipart" - "reflect" - "time" - - "github.com/hashicorp/terraform-plugin-sdk/v2/helper/customdiff" - "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" - "github.com/hashicorp/terraform-provider-google/google/tpgresource" - transport_tpg "github.com/hashicorp/terraform-provider-google/google/transport" -) - -func ResourceApigeeKeystoresAliasesKeyCertFile() *schema.Resource { - return &schema.Resource{ - Create: resourceApigeeKeystoresAliasesKeyCertFileCreate, - Read: resourceApigeeKeystoresAliasesKeyCertFileRead, - Update: resourceApigeeKeystoresAliasesKeyCertFileUpdate, - Delete: resourceApigeeKeystoresAliasesKeyCertFileDelete, - - Importer: &schema.ResourceImporter{ - State: resourceApigeeKeystoresAliasesKeyCertFileImport, - }, - - CustomizeDiff: customdiff.All( - /* - If cert is changed then an update is expected, so we tell Terraform core to expect update on certs_info - */ - - customdiff.ComputedIf("certs_info", func(_ context.Context, diff *schema.ResourceDiff, v interface{}) bool { - return diff.HasChange("cert") - }), - ), - - Timeouts: &schema.ResourceTimeout{ - Create: schema.DefaultTimeout(20 * time.Minute), - Read: schema.DefaultTimeout(20 * time.Minute), - Update: schema.DefaultTimeout(20 * time.Minute), - Delete: schema.DefaultTimeout(20 * time.Minute), - }, - - Schema: map[string]*schema.Schema{ - "alias": { - Type: schema.TypeString, - ForceNew: true, - Required: true, - Description: `Alias Name`, - }, - "cert": { - Type: schema.TypeString, - Required: true, - Description: `Cert content`, - }, - "environment": { - Type: schema.TypeString, - ForceNew: true, - Required: true, - Description: `Environment associated with the alias`, - }, - "keystore": { - Type: schema.TypeString, - ForceNew: true, - Required: true, - Description: `Keystore Name`, - }, - "org_id": { - Type: schema.TypeString, - ForceNew: true, - Required: true, - Description: `Organization ID associated with the alias`, - }, - "certs_info": { - Type: schema.TypeList, - Optional: true, - Computed: true, - Description: `Chain of certificates under this alias.`, - MaxItems: 1, - Elem: &schema.Resource{ - Schema: map[string]*schema.Schema{ - "cert_info": { - Type: schema.TypeList, - Optional: true, - Computed: true, - Description: `List of all properties in the object.`, - Elem: &schema.Resource{ - Schema: map[string]*schema.Schema{ - "basic_constraints": { - Type: schema.TypeString, - Optional: true, - Computed: true, - Description: `X.509 basic constraints extension.`, - }, - "expiry_date": { - Type: schema.TypeString, - Optional: true, - Computed: true, - Description: `X.509 notAfter validity period in milliseconds since epoch.`, - }, - "is_valid": { - Type: schema.TypeString, - Optional: true, - Computed: true, - Description: `Flag that specifies whether the certificate is valid. -Flag is set to Yes if the certificate is valid, No if expired, or Not yet if not yet valid.`, - }, - "issuer": { - Type: schema.TypeString, - Optional: true, - Computed: true, - Description: `X.509 issuer.`, - }, - "public_key": { - Type: schema.TypeString, - Optional: true, - Computed: true, - Description: `Public key component of the X.509 subject public key info.`, - }, - "serial_number": { - Type: schema.TypeString, - Optional: true, - Computed: true, - Description: `X.509 serial number.`, - }, - "sig_alg_name": { - Type: schema.TypeString, - Optional: true, - Computed: true, - Description: `X.509 signatureAlgorithm.`, - }, - "subject": { - Type: schema.TypeString, - Optional: true, - Computed: true, - Description: `X.509 subject.`, - }, - "subject_alternative_names": { - Type: schema.TypeList, - Optional: true, - Computed: true, - Description: `X.509 subject alternative names (SANs) extension.`, - Elem: &schema.Schema{ - Type: schema.TypeString, - }, - }, - "valid_from": { - Type: schema.TypeString, - Optional: true, - Computed: true, - Description: `X.509 notBefore validity period in milliseconds since epoch.`, - }, - "version": { - Type: schema.TypeInt, - Optional: true, - Computed: true, - Description: `X.509 version.`, - }, - }, - }, - }, - }, - }, - }, - "key": { - Type: schema.TypeString, - ForceNew: true, - Optional: true, - Sensitive: true, - Description: `Private Key content, omit if uploading to truststore`, - }, - "password": { - Type: schema.TypeString, - Optional: true, - Sensitive: true, - Description: `Password for the Private Key if it's encrypted`, - }, - "type": { - Type: schema.TypeString, - Computed: true, - Description: `Optional.Type of Alias`, - }, - }, - UseJSONNumber: true, - } -} - -func resourceApigeeKeystoresAliasesKeyCertFileCreate(d *schema.ResourceData, meta interface{}) error { - config := meta.(*transport_tpg.Config) - userAgent, err := tpgresource.GenerateUserAgentString(d, config.UserAgent) - if err != nil { - return err - } - - buf := new(bytes.Buffer) - bw := multipart.NewWriter(buf) - if key, ok := d.GetOkExists("key"); ok { - keyFilePartWriter, _ := bw.CreateFormField("keyFile") - keyFilePartWriter.Write([]byte(key.(string))) - } - if password, ok := d.GetOkExists("password"); ok { - keyFilePartWriter, _ := bw.CreateFormField("password") - keyFilePartWriter.Write([]byte(password.(string))) - } - certFilePartWriter, _ := bw.CreateFormField("certFile") - certFilePartWriter.Write([]byte(d.Get("cert").(string))) - bw.Close() - - url, err := tpgresource.ReplaceVars(d, config, "{{ApigeeBasePath}}organizations/{{org_id}}/environments/{{environment}}/keystores/{{keystore}}/aliases?format=keycertfile&alias={{alias}}&ignoreExpiryValidation=true") - if err != nil { - return err - } - - log.Printf("[DEBUG] Creating new KeystoresAliasesKeyCertFile") - billingProject := "" - - // err == nil indicates that the billing_project value was found - if bp, err := tpgresource.GetBillingProject(d, config); err == nil { - billingProject = bp - } - - res, err := sendRequestRawBodyWithTimeout(config, "POST", billingProject, url, userAgent, buf, "multipart/form-data; boundary="+bw.Boundary(), d.Timeout(schema.TimeoutCreate)) - if err != nil { - return fmt.Errorf("Error creating KeystoresAliasesKeyCertFile: %s", err) - } - - // Store the ID now - id, err := tpgresource.ReplaceVars(d, config, "organizations/{{org_id}}/environments/{{environment}}/keystores/{{keystore}}/aliases/{{alias}}") - if err != nil { - return fmt.Errorf("Error constructing id: %s", err) - } - d.SetId(id) - - log.Printf("[DEBUG] Finished creating KeystoresAliasesKeyCertFile %q: %#v", d.Id(), res) - - return resourceApigeeKeystoresAliasesKeyCertFileRead(d, meta) -} - -func resourceApigeeKeystoresAliasesKeyCertFileRead(d *schema.ResourceData, meta interface{}) error { - config := meta.(*transport_tpg.Config) - userAgent, err := tpgresource.GenerateUserAgentString(d, config.UserAgent) - if err != nil { - return err - } - - url, err := tpgresource.ReplaceVars(d, config, "{{ApigeeBasePath}}organizations/{{org_id}}/environments/{{environment}}/keystores/{{keystore}}/aliases/{{alias}}") - if err != nil { - return err - } - - billingProject := "" - - // err == nil indicates that the billing_project value was found - if bp, err := tpgresource.GetBillingProject(d, config); err == nil { - billingProject = bp - } - - res, err := transport_tpg.SendRequest(transport_tpg.SendRequestOptions{ - Config: config, - Method: "GET", - Project: billingProject, - RawURL: url, - UserAgent: userAgent, - }) - if err != nil { - return transport_tpg.HandleNotFoundError(err, d, fmt.Sprintf("ApigeeKeystoresAliasesKeyCertFile %q", d.Id())) - } - - if err := d.Set("alias", flattenApigeeKeystoresAliasesKeyCertFileAlias(res["alias"], d, config)); err != nil { - return fmt.Errorf("Error reading KeystoresAliasesKeyCertFile: %s", err) - } - - if err := d.Set("certs_info", flattenApigeeKeystoresAliasesKeyCertFileCertsInfo(res["certsInfo"], d, config)); err != nil { - return fmt.Errorf("Error reading KeystoresAliasesKeyCertFile: %s", err) - } - if err := d.Set("type", flattenApigeeKeystoresAliasesKeyCertFileType(res["type"], d, config)); err != nil { - return fmt.Errorf("Error reading KeystoresAliasesKeyCertFile: %s", err) - } - - return nil -} - -func resourceApigeeKeystoresAliasesKeyCertFileUpdate(d *schema.ResourceData, meta interface{}) error { - config := meta.(*transport_tpg.Config) - userAgent, err := tpgresource.GenerateUserAgentString(d, config.UserAgent) - if err != nil { - return err - } - - billingProject := "" - - url, err := tpgresource.ReplaceVars(d, config, "{{ApigeeBasePath}}organizations/{{org_id}}/environments/{{environment}}/keystores/{{keystore}}/aliases/{{alias}}?ignoreExpiryValidation=true") - if err != nil { - return err - } - - log.Printf("[DEBUG] Updating KeystoresAliasesKeyCertFile %q", d.Id()) - - // err == nil indicates that the billing_project value was found - if bp, err := tpgresource.GetBillingProject(d, config); err == nil { - billingProject = bp - } - - buf := new(bytes.Buffer) - bw := multipart.NewWriter(buf) - certFilePartWriter, _ := bw.CreateFormField("certFile") - certFilePartWriter.Write([]byte(d.Get("cert").(string))) - bw.Close() - - res, err := sendRequestRawBodyWithTimeout(config, "PUT", billingProject, url, userAgent, buf, "multipart/form-data; boundary="+bw.Boundary(), d.Timeout(schema.TimeoutCreate)) - - if err != nil { - return fmt.Errorf("Error updating KeystoresAliasesKeyCertFile %q: %s", d.Id(), err) - } else { - log.Printf("[DEBUG] Finished updating KeystoresAliasesKeyCertFile %q: %#v", d.Id(), res) - } - - return resourceApigeeKeystoresAliasesKeyCertFileRead(d, meta) -} - -func resourceApigeeKeystoresAliasesKeyCertFileDelete(d *schema.ResourceData, meta interface{}) error { - config := meta.(*transport_tpg.Config) - userAgent, err := tpgresource.GenerateUserAgentString(d, config.UserAgent) - if err != nil { - return err - } - - billingProject := "" - - url, err := tpgresource.ReplaceVars(d, config, "{{ApigeeBasePath}}organizations/{{org_id}}/environments/{{environment}}/keystores/{{keystore}}/aliases/{{alias}}") - if err != nil { - return err - } - - var obj map[string]interface{} - log.Printf("[DEBUG] Deleting KeystoresAliasesKeyCertFile %q", d.Id()) - - // err == nil indicates that the billing_project value was found - if bp, err := tpgresource.GetBillingProject(d, config); err == nil { - billingProject = bp - } - - res, err := transport_tpg.SendRequest(transport_tpg.SendRequestOptions{ - Config: config, - Method: "DELETE", - Project: billingProject, - RawURL: url, - UserAgent: userAgent, - Body: obj, - Timeout: d.Timeout(schema.TimeoutDelete), - }) - if err != nil { - return transport_tpg.HandleNotFoundError(err, d, "KeystoresAliasesKeyCertFile") - } - - log.Printf("[DEBUG] Finished deleting KeystoresAliasesKeyCertFile %q: %#v", d.Id(), res) - return nil -} - -func resourceApigeeKeystoresAliasesKeyCertFileImport(d *schema.ResourceData, meta interface{}) ([]*schema.ResourceData, error) { - config := meta.(*transport_tpg.Config) - if err := tpgresource.ParseImportId([]string{ - "organizations/(?P[^/]+)/environments/(?P[^/]+)/keystores/(?P[^/]+)/aliases/(?P[^/]+)", - "(?P[^/]+)/(?P[^/]+)/(?P[^/]+)/(?P[^/]+)", - }, d, config); err != nil { - return nil, err - } - - // Replace import id for the resource id - id, err := tpgresource.ReplaceVars(d, config, "organizations/{{org_id}}/environments/{{environment}}/keystores/{{keystore}}/aliases/{{alias}}") - if err != nil { - return nil, fmt.Errorf("Error constructing id: %s", err) - } - d.SetId(id) - - return []*schema.ResourceData{d}, nil -} - -func flattenApigeeKeystoresAliasesKeyCertFileOrgId(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} { - return v -} - -func flattenApigeeKeystoresAliasesKeyCertFileEnvironment(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} { - return v -} - -func flattenApigeeKeystoresAliasesKeyCertFileKeystore(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} { - return v -} - -func flattenApigeeKeystoresAliasesKeyCertFileAlias(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} { - return v -} - -func flattenApigeeKeystoresAliasesKeyCertFileKey(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} { - return v -} - -func flattenApigeeKeystoresAliasesKeyCertFilePassword(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} { - return v -} - -func flattenApigeeKeystoresAliasesKeyCertFileCert(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} { - return v -} - -func flattenApigeeKeystoresAliasesKeyCertFileCertsInfo(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} { - if v == nil { - return nil - } - original := v.(map[string]interface{}) - if len(original) == 0 { - return nil - } - transformed := make(map[string]interface{}) - transformed["cert_info"] = - flattenApigeeKeystoresAliasesKeyCertFileCertsInfoCertInfo(original["certInfo"], d, config) - return []interface{}{transformed} -} -func flattenApigeeKeystoresAliasesKeyCertFileCertsInfoCertInfo(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} { - if v == nil { - return v - } - l := v.([]interface{}) - transformed := make([]interface{}, 0, len(l)) - for _, raw := range l { - original := raw.(map[string]interface{}) - if len(original) < 1 { - // Do not include empty json objects coming back from the api - continue - } - transformed = append(transformed, map[string]interface{}{ - "version": flattenApigeeKeystoresAliasesKeyCertFileCertsInfoCertInfoVersion(original["version"], d, config), - "subject": flattenApigeeKeystoresAliasesKeyCertFileCertsInfoCertInfoSubject(original["subject"], d, config), - "issuer": flattenApigeeKeystoresAliasesKeyCertFileCertsInfoCertInfoIssuer(original["issuer"], d, config), - "expiry_date": flattenApigeeKeystoresAliasesKeyCertFileCertsInfoCertInfoExpiryDate(original["expiryDate"], d, config), - "valid_from": flattenApigeeKeystoresAliasesKeyCertFileCertsInfoCertInfoValidFrom(original["validFrom"], d, config), - "is_valid": flattenApigeeKeystoresAliasesKeyCertFileCertsInfoCertInfoIsValid(original["isValid"], d, config), - "subject_alternative_names": flattenApigeeKeystoresAliasesKeyCertFileCertsInfoCertInfoSubjectAlternativeNames(original["subjectAlternativeNames"], d, config), - "sig_alg_name": flattenApigeeKeystoresAliasesKeyCertFileCertsInfoCertInfoSigAlgName(original["sigAlgName"], d, config), - "public_key": flattenApigeeKeystoresAliasesKeyCertFileCertsInfoCertInfoPublicKey(original["publicKey"], d, config), - "basic_constraints": flattenApigeeKeystoresAliasesKeyCertFileCertsInfoCertInfoBasicConstraints(original["basicConstraints"], d, config), - "serial_number": flattenApigeeKeystoresAliasesKeyCertFileCertsInfoCertInfoSerialNumber(original["serialNumber"], d, config), - }) - } - return transformed -} -func flattenApigeeKeystoresAliasesKeyCertFileCertsInfoCertInfoVersion(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} { - // Handles the string fixed64 format - if strVal, ok := v.(string); ok { - if intVal, err := tpgresource.StringToFixed64(strVal); err == nil { - return intVal - } - } - - // number values are represented as float64 - if floatVal, ok := v.(float64); ok { - intVal := int(floatVal) - return intVal - } - - return v // let terraform core handle it otherwise -} - -func flattenApigeeKeystoresAliasesKeyCertFileCertsInfoCertInfoSubject(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} { - return v -} - -func flattenApigeeKeystoresAliasesKeyCertFileCertsInfoCertInfoIssuer(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} { - return v -} - -func flattenApigeeKeystoresAliasesKeyCertFileCertsInfoCertInfoExpiryDate(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} { - return v -} - -func flattenApigeeKeystoresAliasesKeyCertFileCertsInfoCertInfoValidFrom(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} { - return v -} - -func flattenApigeeKeystoresAliasesKeyCertFileCertsInfoCertInfoIsValid(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} { - return v -} - -func flattenApigeeKeystoresAliasesKeyCertFileCertsInfoCertInfoSubjectAlternativeNames(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} { - return v -} - -func flattenApigeeKeystoresAliasesKeyCertFileCertsInfoCertInfoSigAlgName(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} { - return v -} - -func flattenApigeeKeystoresAliasesKeyCertFileCertsInfoCertInfoPublicKey(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} { - return v -} - -func flattenApigeeKeystoresAliasesKeyCertFileCertsInfoCertInfoBasicConstraints(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} { - return v -} - -func flattenApigeeKeystoresAliasesKeyCertFileCertsInfoCertInfoSerialNumber(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} { - return v -} - -func flattenApigeeKeystoresAliasesKeyCertFileType(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} { - return v -} - -func expandApigeeKeystoresAliasesKeyCertFileOrgId(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) { - return v, nil -} - -func expandApigeeKeystoresAliasesKeyCertFileEnvironment(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) { - return v, nil -} - -func expandApigeeKeystoresAliasesKeyCertFileKeystore(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) { - return v, nil -} - -func expandApigeeKeystoresAliasesKeyCertFileAlias(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) { - return v, nil -} - -func expandApigeeKeystoresAliasesKeyCertFileKey(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) { - return v, nil -} - -func expandApigeeKeystoresAliasesKeyCertFilePassword(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) { - return v, nil -} - -func expandApigeeKeystoresAliasesKeyCertFileCert(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) { - return v, nil -} - -func expandApigeeKeystoresAliasesKeyCertFileCertsInfo(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) { - l := v.([]interface{}) - if len(l) == 0 || l[0] == nil { - return nil, nil - } - raw := l[0] - original := raw.(map[string]interface{}) - transformed := make(map[string]interface{}) - - transformedCertInfo, err := expandApigeeKeystoresAliasesKeyCertFileCertsInfoCertInfo(original["cert_info"], d, config) - if err != nil { - return nil, err - } else if val := reflect.ValueOf(transformedCertInfo); val.IsValid() && !tpgresource.IsEmptyValue(val) { - transformed["certInfo"] = transformedCertInfo - } - - return transformed, nil -} - -func expandApigeeKeystoresAliasesKeyCertFileCertsInfoCertInfo(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) { - l := v.([]interface{}) - req := make([]interface{}, 0, len(l)) - for _, raw := range l { - if raw == nil { - continue - } - original := raw.(map[string]interface{}) - transformed := make(map[string]interface{}) - - transformedVersion, err := expandApigeeKeystoresAliasesKeyCertFileCertsInfoCertInfoVersion(original["version"], d, config) - if err != nil { - return nil, err - } else if val := reflect.ValueOf(transformedVersion); val.IsValid() && !tpgresource.IsEmptyValue(val) { - transformed["version"] = transformedVersion - } - - transformedSubject, err := expandApigeeKeystoresAliasesKeyCertFileCertsInfoCertInfoSubject(original["subject"], d, config) - if err != nil { - return nil, err - } else if val := reflect.ValueOf(transformedSubject); val.IsValid() && !tpgresource.IsEmptyValue(val) { - transformed["subject"] = transformedSubject - } - - transformedIssuer, err := expandApigeeKeystoresAliasesKeyCertFileCertsInfoCertInfoIssuer(original["issuer"], d, config) - if err != nil { - return nil, err - } else if val := reflect.ValueOf(transformedIssuer); val.IsValid() && !tpgresource.IsEmptyValue(val) { - transformed["issuer"] = transformedIssuer - } - - transformedExpiryDate, err := expandApigeeKeystoresAliasesKeyCertFileCertsInfoCertInfoExpiryDate(original["expiry_date"], d, config) - if err != nil { - return nil, err - } else if val := reflect.ValueOf(transformedExpiryDate); val.IsValid() && !tpgresource.IsEmptyValue(val) { - transformed["expiryDate"] = transformedExpiryDate - } - - transformedValidFrom, err := expandApigeeKeystoresAliasesKeyCertFileCertsInfoCertInfoValidFrom(original["valid_from"], d, config) - if err != nil { - return nil, err - } else if val := reflect.ValueOf(transformedValidFrom); val.IsValid() && !tpgresource.IsEmptyValue(val) { - transformed["validFrom"] = transformedValidFrom - } - - transformedIsValid, err := expandApigeeKeystoresAliasesKeyCertFileCertsInfoCertInfoIsValid(original["is_valid"], d, config) - if err != nil { - return nil, err - } else if val := reflect.ValueOf(transformedIsValid); val.IsValid() && !tpgresource.IsEmptyValue(val) { - transformed["isValid"] = transformedIsValid - } - - transformedSubjectAlternativeNames, err := expandApigeeKeystoresAliasesKeyCertFileCertsInfoCertInfoSubjectAlternativeNames(original["subject_alternative_names"], d, config) - if err != nil { - return nil, err - } else if val := reflect.ValueOf(transformedSubjectAlternativeNames); val.IsValid() && !tpgresource.IsEmptyValue(val) { - transformed["subjectAlternativeNames"] = transformedSubjectAlternativeNames - } - - transformedSigAlgName, err := expandApigeeKeystoresAliasesKeyCertFileCertsInfoCertInfoSigAlgName(original["sig_alg_name"], d, config) - if err != nil { - return nil, err - } else if val := reflect.ValueOf(transformedSigAlgName); val.IsValid() && !tpgresource.IsEmptyValue(val) { - transformed["sigAlgName"] = transformedSigAlgName - } - - transformedPublicKey, err := expandApigeeKeystoresAliasesKeyCertFileCertsInfoCertInfoPublicKey(original["public_key"], d, config) - if err != nil { - return nil, err - } else if val := reflect.ValueOf(transformedPublicKey); val.IsValid() && !tpgresource.IsEmptyValue(val) { - transformed["publicKey"] = transformedPublicKey - } - - transformedBasicConstraints, err := expandApigeeKeystoresAliasesKeyCertFileCertsInfoCertInfoBasicConstraints(original["basic_constraints"], d, config) - if err != nil { - return nil, err - } else if val := reflect.ValueOf(transformedBasicConstraints); val.IsValid() && !tpgresource.IsEmptyValue(val) { - transformed["basicConstraints"] = transformedBasicConstraints - } - - transformedSerialNumber, err := expandApigeeKeystoresAliasesKeyCertFileCertsInfoCertInfoSerialNumber(original["serial_number"], d, config) - if err != nil { - return nil, err - } else if val := reflect.ValueOf(transformedSerialNumber); val.IsValid() && !tpgresource.IsEmptyValue(val) { - transformed["serialNumber"] = transformedSerialNumber - } - - req = append(req, transformed) - } - return req, nil -} - -func expandApigeeKeystoresAliasesKeyCertFileCertsInfoCertInfoVersion(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) { - return v, nil -} - -func expandApigeeKeystoresAliasesKeyCertFileCertsInfoCertInfoSubject(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) { - return v, nil -} - -func expandApigeeKeystoresAliasesKeyCertFileCertsInfoCertInfoIssuer(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) { - return v, nil -} - -func expandApigeeKeystoresAliasesKeyCertFileCertsInfoCertInfoExpiryDate(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) { - return v, nil -} - -func expandApigeeKeystoresAliasesKeyCertFileCertsInfoCertInfoValidFrom(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) { - return v, nil -} - -func expandApigeeKeystoresAliasesKeyCertFileCertsInfoCertInfoIsValid(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) { - return v, nil -} - -func expandApigeeKeystoresAliasesKeyCertFileCertsInfoCertInfoSubjectAlternativeNames(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) { - return v, nil -} - -func expandApigeeKeystoresAliasesKeyCertFileCertsInfoCertInfoSigAlgName(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) { - return v, nil -} - -func expandApigeeKeystoresAliasesKeyCertFileCertsInfoCertInfoPublicKey(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) { - return v, nil -} - -func expandApigeeKeystoresAliasesKeyCertFileCertsInfoCertInfoBasicConstraints(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) { - return v, nil -} - -func expandApigeeKeystoresAliasesKeyCertFileCertsInfoCertInfoSerialNumber(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) { - return v, nil -} diff --git a/mmv1/third_party/terraform/website/docs/r/apigee_keystores_aliases_key_cert_file.html.markdown b/mmv1/third_party/terraform/website/docs/r/apigee_keystores_aliases_key_cert_file.html.markdown index 2660aaf170d6..1424e2a1b351 100644 --- a/mmv1/third_party/terraform/website/docs/r/apigee_keystores_aliases_key_cert_file.html.markdown +++ b/mmv1/third_party/terraform/website/docs/r/apigee_keystores_aliases_key_cert_file.html.markdown @@ -66,7 +66,7 @@ In addition to the arguments listed above, the following computed attributes are Optional.Type of Alias -The `certs_info` block contains: +The `certs_info` list contains: * `cert_info` - (Output)