alicloud/resource_alicloud_service_mesh_service_mesh.go (1,845 lines of code) (raw):
// Package alicloud. This file is generated automatically. Please do not modify it manually, thank you!
package alicloud
import (
"encoding/json"
"fmt"
"log"
"regexp"
"time"
"github.com/PaesslerAG/jsonpath"
"github.com/aliyun/terraform-provider-alicloud/alicloud/connectivity"
"github.com/hashicorp/terraform-plugin-sdk/helper/resource"
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
)
func resourceAliCloudServiceMeshServiceMesh() *schema.Resource {
return &schema.Resource{
Create: resourceAliCloudServiceMeshServiceMeshCreate,
Read: resourceAliCloudServiceMeshServiceMeshRead,
Update: resourceAliCloudServiceMeshServiceMeshUpdate,
Delete: resourceAliCloudServiceMeshServiceMeshDelete,
Importer: &schema.ResourceImporter{
State: schema.ImportStatePassthrough,
},
Timeouts: &schema.ResourceTimeout{
Create: schema.DefaultTimeout(10 * time.Minute),
Update: schema.DefaultTimeout(10 * time.Minute),
Delete: schema.DefaultTimeout(20 * time.Minute),
},
Schema: map[string]*schema.Schema{
"cluster_ids": {
Type: schema.TypeList,
Optional: true,
Elem: &schema.Schema{Type: schema.TypeString},
},
"cluster_spec": {
Type: schema.TypeString,
Optional: true,
Computed: true,
ValidateFunc: StringInSlice([]string{"standard", "enterprise", "ultimate"}, false),
},
"create_time": {
Type: schema.TypeString,
Computed: true,
},
"customized_prometheus": {
Type: schema.TypeBool,
Optional: true,
},
"edition": {
Type: schema.TypeString,
Optional: true,
ForceNew: true,
ValidateFunc: StringInSlice([]string{"Default", "Pro"}, false),
},
"extra_configuration": {
Type: schema.TypeList,
Optional: true,
Computed: true,
MaxItems: 1,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"cr_aggregation_enabled": {
Type: schema.TypeBool,
Optional: true,
},
},
},
},
"force": {
Type: schema.TypeBool,
Optional: true,
},
"kubeconfig": {
Type: schema.TypeString,
Computed: true,
},
"load_balancer": {
Type: schema.TypeList,
Optional: true,
Computed: true,
MaxItems: 1,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"api_server_loadbalancer_id": {
Type: schema.TypeString,
Computed: true,
},
"pilot_public_eip": {
Type: schema.TypeBool,
Computed: true,
Optional: true,
ForceNew: true,
},
"pilot_public_loadbalancer_id": {
Type: schema.TypeString,
Computed: true,
},
"api_server_public_eip": {
Type: schema.TypeBool,
Optional: true,
ForceNew: true,
},
"pilot_public_eip_id": {
Type: schema.TypeString,
Optional: true,
},
},
},
},
"mesh_config": {
Type: schema.TypeList,
Optional: true,
Computed: true,
MaxItems: 1,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"access_log": {
Type: schema.TypeList,
Optional: true,
MaxItems: 1,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"project": {
Type: schema.TypeString,
Optional: true,
},
"gateway_lifecycle": {
Type: schema.TypeInt,
Optional: true,
Computed: true,
ValidateFunc: IntBetween(0, 365),
},
"gateway_enabled": {
Type: schema.TypeBool,
Optional: true,
},
"sidecar_lifecycle": {
Type: schema.TypeInt,
Optional: true,
Computed: true,
ValidateFunc: IntBetween(0, 365),
},
"enabled": {
Type: schema.TypeBool,
Optional: true,
},
"sidecar_enabled": {
Type: schema.TypeBool,
Optional: true,
},
},
},
},
"pilot": {
Type: schema.TypeList,
Optional: true,
MaxItems: 1,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"http10_enabled": {
Type: schema.TypeBool,
Optional: true,
},
"trace_sampling": {
Type: schema.TypeFloat,
Optional: true,
},
},
},
},
"opa": {
Type: schema.TypeList,
Optional: true,
MaxItems: 1,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"limit_memory": {
Type: schema.TypeString,
Optional: true,
},
"request_memory": {
Type: schema.TypeString,
Optional: true,
},
"limit_cpu": {
Type: schema.TypeString,
Optional: true,
},
"enabled": {
Type: schema.TypeBool,
Optional: true,
},
"log_level": {
Type: schema.TypeString,
Optional: true,
},
"request_cpu": {
Type: schema.TypeString,
Optional: true,
},
},
},
},
"prometheus": {
Type: schema.TypeList,
Computed: true,
MaxItems: 1,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"use_external": {
Type: schema.TypeBool,
Computed: true,
},
"external_url": {
Type: schema.TypeString,
Computed: true,
},
},
},
},
"telemetry": {
Type: schema.TypeBool,
Optional: true,
},
"outbound_traffic_policy": {
Type: schema.TypeString,
Optional: true,
ValidateFunc: StringInSlice([]string{"ALLOW_ANY", "REGISTRY_ONLY"}, false),
},
"sidecar_injector": {
Type: schema.TypeList,
Optional: true,
MaxItems: 1,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"limit_memory": {
Type: schema.TypeString,
Optional: true,
},
"auto_injection_policy_enabled": {
Type: schema.TypeBool,
Optional: true,
},
"request_memory": {
Type: schema.TypeString,
Optional: true,
},
"enable_namespaces_by_default": {
Type: schema.TypeBool,
Optional: true,
},
"limit_cpu": {
Type: schema.TypeString,
Optional: true,
},
"init_cni_configuration": {
Type: schema.TypeList,
Optional: true,
Computed: true,
MaxItems: 1,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"enabled": {
Type: schema.TypeBool,
Optional: true,
},
"exclude_namespaces": {
Type: schema.TypeString,
Optional: true,
},
},
},
},
"request_cpu": {
Type: schema.TypeString,
Optional: true,
},
"sidecar_injector_webhook_as_yaml": {
Type: schema.TypeString,
Computed: true,
},
},
},
},
"audit": {
Type: schema.TypeList,
Optional: true,
Computed: true,
MaxItems: 1,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"project": {
Type: schema.TypeString,
Optional: true,
Computed: true,
},
"enabled": {
Type: schema.TypeBool,
Optional: true,
Computed: true,
},
},
},
},
"kiali": {
Type: schema.TypeList,
Optional: true,
MaxItems: 1,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"aggregated_kiali_address": {
Type: schema.TypeString,
Computed: true,
},
"integrate_clb": {
Type: schema.TypeBool,
Optional: true,
},
"auth_strategy": {
Type: schema.TypeString,
Optional: true,
Computed: true,
ValidateFunc: StringInSlice([]string{"token", "openid", "ramoauth"}, false),
},
"enabled": {
Type: schema.TypeBool,
Optional: true,
},
"kiali_arms_auth_tokens": {
Type: schema.TypeString,
Optional: true,
},
"open_id_config": {
Type: schema.TypeList,
Optional: true,
MaxItems: 1,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"issuer_uri": {
Type: schema.TypeString,
Optional: true,
},
"client_secret": {
Type: schema.TypeString,
Optional: true,
},
"scopes": {
Type: schema.TypeList,
Optional: true,
Elem: &schema.Schema{Type: schema.TypeString},
},
"client_id": {
Type: schema.TypeString,
Optional: true,
},
},
},
},
"url": {
Type: schema.TypeString,
Computed: true,
},
"distributed_kiali_addresses": {
Type: schema.TypeString,
Computed: true,
},
"use_populated_arms_prometheus": {
Type: schema.TypeBool,
Computed: true,
},
"server_config": {
Type: schema.TypeList,
Optional: true,
MaxItems: 1,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"web_schema": {
Type: schema.TypeString,
Optional: true,
ValidateFunc: StringInSlice([]string{"http", "https"}, false),
},
"web_root": {
Type: schema.TypeString,
Optional: true,
},
"web_fqdn": {
Type: schema.TypeString,
Optional: true,
},
"web_port": {
Type: schema.TypeInt,
Optional: true,
},
},
},
},
"kiali_service_annotations": {
Type: schema.TypeString,
Optional: true,
},
"distributed_kiali_access_tokens": {
Type: schema.TypeString,
Computed: true,
},
"ram_oauth_config": {
Type: schema.TypeList,
Optional: true,
MaxItems: 1,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"redirect_uris": {
Type: schema.TypeString,
Optional: true,
},
},
},
},
"custom_prometheus_url": {
Type: schema.TypeString,
Computed: true,
Optional: true,
},
},
},
},
"proxy": {
Type: schema.TypeList,
Optional: true,
MaxItems: 1,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"limit_memory": {
Type: schema.TypeString,
Optional: true,
},
"request_memory": {
Type: schema.TypeString,
Optional: true,
},
"cluster_domain": {
Type: schema.TypeString,
Optional: true,
Computed: true,
ForceNew: true,
},
"limit_cpu": {
Type: schema.TypeString,
Optional: true,
},
"request_cpu": {
Type: schema.TypeString,
Optional: true,
},
},
},
},
"include_ip_ranges": {
Type: schema.TypeString,
Optional: true,
Computed: true,
},
"enable_locality_lb": {
Type: schema.TypeBool,
Optional: true,
ForceNew: true,
},
"control_plane_log": {
Type: schema.TypeList,
Optional: true,
MaxItems: 1,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"project": {
Type: schema.TypeString,
Optional: true,
ValidateFunc: StringMatch(regexp.MustCompile("^[\\w.-]+$"), "The name of the SLS Project to which the control plane logs are collected."),
},
"log_ttl_in_day": {
Type: schema.TypeInt,
Optional: true,
Computed: true,
ValidateFunc: IntBetween(0, 365),
},
"enabled": {
Type: schema.TypeBool,
Required: true,
},
},
},
},
"tracing": {
Type: schema.TypeBool,
Optional: true,
},
"customized_zipkin": {
Type: schema.TypeBool,
Optional: true,
},
},
},
},
"network": {
Type: schema.TypeList,
Required: true,
ForceNew: true,
MaxItems: 1,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"vpc_id": {
Type: schema.TypeString,
Required: true,
ForceNew: true,
},
"security_group_id": {
Type: schema.TypeString,
Computed: true,
},
"vswitche_list": {
Type: schema.TypeList,
Required: true,
ForceNew: true,
Elem: &schema.Schema{Type: schema.TypeString},
},
},
},
},
"prometheus_url": {
Type: schema.TypeString,
Optional: true,
},
"service_mesh_name": {
Type: schema.TypeString,
Optional: true,
},
"status": {
Type: schema.TypeString,
Computed: true,
},
"tags": tagsSchema(),
"version": {
Type: schema.TypeString,
Optional: true,
},
},
}
}
func resourceAliCloudServiceMeshServiceMeshCreate(d *schema.ResourceData, meta interface{}) error {
client := meta.(*connectivity.AliyunClient)
action := "CreateServiceMesh"
var request map[string]interface{}
var response map[string]interface{}
query := make(map[string]interface{})
var err error
request = make(map[string]interface{})
query["RegionId"] = client.RegionId
if v, ok := d.GetOk("service_mesh_name"); ok {
request["Name"] = v
}
jsonPathResult1, err := jsonpath.Get("$[0].vpc_id", d.Get("network"))
if err == nil {
request["VpcId"] = jsonPathResult1
}
if v, ok := d.GetOk("load_balancer"); ok {
jsonPathResult2, err := jsonpath.Get("$[0].api_server_public_eip", v)
if err == nil && jsonPathResult2 != "" {
request["ApiServerPublicEip"] = jsonPathResult2
}
}
if v, ok := d.GetOk("mesh_config"); ok {
jsonPathResult3, err := jsonpath.Get("$[0].tracing", v)
if err == nil && jsonPathResult3 != "" {
request["Tracing"] = jsonPathResult3
}
}
if v, ok := d.GetOk("mesh_config"); ok {
jsonPathResult4, err := jsonpath.Get("$[0].pilot[0].trace_sampling", v)
if err == nil && jsonPathResult4 != "" {
request["TraceSampling"] = jsonPathResult4
}
}
if v, ok := d.GetOk("mesh_config"); ok {
jsonPathResult5, err := jsonpath.Get("$[0].customized_zipkin", v)
if err == nil && jsonPathResult5 != "" {
request["CustomizedZipkin"] = jsonPathResult5
}
}
if v, ok := d.GetOk("mesh_config"); ok {
jsonPathResult6, err := jsonpath.Get("$[0].telemetry", v)
if err == nil && jsonPathResult6 != "" {
request["Telemetry"] = jsonPathResult6
}
}
if v, ok := d.GetOk("mesh_config"); ok {
jsonPathResult7, err := jsonpath.Get("$[0].include_ip_ranges", v)
if err == nil && jsonPathResult7 != "" {
request["IncludeIPRanges"] = jsonPathResult7
}
}
if v, ok := d.GetOk("mesh_config"); ok {
jsonPathResult8, err := jsonpath.Get("$[0].opa[0].log_level", v)
if err == nil && jsonPathResult8 != "" {
request["OPALogLevel"] = jsonPathResult8
}
}
if v, ok := d.GetOk("mesh_config"); ok {
jsonPathResult9, err := jsonpath.Get("$[0].opa[0].request_cpu", v)
if err == nil && jsonPathResult9 != "" {
request["OPARequestCPU"] = jsonPathResult9
}
}
if v, ok := d.GetOk("mesh_config"); ok {
jsonPathResult10, err := jsonpath.Get("$[0].opa[0].limit_cpu", v)
if err == nil && jsonPathResult10 != "" {
request["OPALimitCPU"] = jsonPathResult10
}
}
if v, ok := d.GetOk("mesh_config"); ok {
jsonPathResult11, err := jsonpath.Get("$[0].opa[0].limit_memory", v)
if err == nil && jsonPathResult11 != "" {
request["OPALimitMemory"] = jsonPathResult11
}
}
if v, ok := d.GetOk("mesh_config"); ok {
jsonPathResult12, err := jsonpath.Get("$[0].opa[0].request_memory", v)
if err == nil && jsonPathResult12 != "" {
request["OPARequestMemory"] = jsonPathResult12
}
}
if v, ok := d.GetOk("mesh_config"); ok {
jsonPathResult13, err := jsonpath.Get("$[0].proxy[0].request_cpu", v)
if err == nil && jsonPathResult13 != "" {
request["ProxyRequestCPU"] = jsonPathResult13
}
}
if v, ok := d.GetOk("mesh_config"); ok {
jsonPathResult14, err := jsonpath.Get("$[0].proxy[0].limit_cpu", v)
if err == nil && jsonPathResult14 != "" {
request["ProxyLimitCPU"] = jsonPathResult14
}
}
if v, ok := d.GetOk("mesh_config"); ok {
jsonPathResult15, err := jsonpath.Get("$[0].proxy[0].limit_memory", v)
if err == nil && jsonPathResult15 != "" {
request["ProxyLimitMemory"] = jsonPathResult15
}
}
if v, ok := d.GetOk("mesh_config"); ok {
jsonPathResult16, err := jsonpath.Get("$[0].proxy[0].request_memory", v)
if err == nil && jsonPathResult16 != "" {
request["ProxyRequestMemory"] = jsonPathResult16
}
}
if v, ok := d.GetOk("mesh_config"); ok {
jsonPathResult17, err := jsonpath.Get("$[0].kiali[0].enabled", v)
if err == nil && jsonPathResult17 != "" {
request["KialiEnabled"] = jsonPathResult17
}
}
if v, ok := d.GetOk("mesh_config"); ok {
jsonPathResult18, err := jsonpath.Get("$[0].access_log[0].enabled", v)
if err == nil && jsonPathResult18 != "" {
request["AccessLogEnabled"] = jsonPathResult18
}
}
if v, ok := d.GetOk("mesh_config"); ok {
jsonPathResult19, err := jsonpath.Get("$[0].enable_locality_lb", v)
if err == nil && jsonPathResult19 != "" {
request["LocalityLoadBalancing"] = jsonPathResult19
}
}
if v, ok := d.GetOk("version"); ok {
request["IstioVersion"] = v
}
if v, ok := d.GetOk("mesh_config"); ok {
jsonPathResult21, err := jsonpath.Get("$[0].opa[0].enabled", v)
if err == nil && jsonPathResult21 != "" {
request["OpaEnabled"] = jsonPathResult21
}
}
if v, ok := d.GetOk("edition"); ok {
request["Edition"] = v
}
if v, ok := d.GetOk("cluster_spec"); ok {
request["ClusterSpec"] = v
}
if v, ok := d.GetOkExists("customized_prometheus"); ok {
request["CustomizedPrometheus"] = v
}
if v, ok := d.GetOk("tags"); ok {
tagsMap := ConvertTags(v.(map[string]interface{}))
request["Tags"] = tagsMap
}
if v, ok := d.GetOk("mesh_config"); ok {
jsonPathResult25, err := jsonpath.Get("$[0].control_plane_log[0].enabled", v)
if err == nil && jsonPathResult25 != "" {
request["ControlPlaneLogEnabled"] = jsonPathResult25
}
}
if v, ok := d.GetOk("mesh_config"); ok {
jsonPathResult26, err := jsonpath.Get("$[0].control_plane_log[0].project", v)
if err == nil && jsonPathResult26 != "" {
request["ControlPlaneLogProject"] = jsonPathResult26
}
}
if v, ok := d.GetOk("mesh_config"); ok {
jsonPathResult27, err := jsonpath.Get("$[0].audit[0].enabled", v)
if err == nil && jsonPathResult27 != "" {
request["EnableAudit"] = jsonPathResult27
}
}
if v, ok := d.GetOk("mesh_config"); ok {
jsonPathResult28, err := jsonpath.Get("$[0].audit[0].project", v)
if err == nil && jsonPathResult28 != "" {
request["AuditProject"] = jsonPathResult28
}
}
jsonPathResult29, err := jsonpath.Get("$[0].vswitche_list", d.Get("network"))
if err == nil {
request["VSwitches"] = convertListToJsonString(jsonPathResult29.([]interface{}))
}
if v, ok := d.GetOk("mesh_config"); ok {
jsonPathResult30, err := jsonpath.Get("$[0].access_log[0].project", v)
if err == nil && jsonPathResult30 != "" {
request["AccessLogProject"] = jsonPathResult30
}
}
if v, ok := d.GetOk("mesh_config"); ok {
jsonPathResult31, err := jsonpath.Get("$[0].proxy[0].cluster_domain", v)
if err == nil && jsonPathResult31 != "" {
request["ClusterDomain"] = jsonPathResult31
}
}
wait := incrementalWait(3*time.Second, 5*time.Second)
err = resource.Retry(d.Timeout(schema.TimeoutCreate), func() *resource.RetryError {
response, err = client.RpcPost("servicemesh", "2020-01-11", action, query, request, true)
if err != nil {
if IsExpectedErrors(err, []string{"NameAlreadyExist", "InvalidActiveState.ACK", "ERR404"}) || NeedRetry(err) {
wait()
return resource.RetryableError(err)
}
return resource.NonRetryableError(err)
}
addDebug(action, response, request)
return nil
})
if err != nil {
return WrapErrorf(err, DefaultErrorMsg, "alicloud_service_mesh_service_mesh", action, AlibabaCloudSdkGoERROR)
}
d.SetId(fmt.Sprint(response["ServiceMeshId"]))
serviceMeshServiceV2 := ServiceMeshServiceV2{client}
stateConf := BuildStateConf([]string{}, []string{"running"}, d.Timeout(schema.TimeoutCreate), 60*time.Second, serviceMeshServiceV2.ServiceMeshServiceMeshStateRefreshFunc(d.Id(), "$.ServiceMeshInfo.State", []string{}))
if _, err := stateConf.WaitForState(); err != nil {
return WrapErrorf(err, IdMsg, d.Id())
}
return resourceAliCloudServiceMeshServiceMeshUpdate(d, meta)
}
func resourceAliCloudServiceMeshServiceMeshRead(d *schema.ResourceData, meta interface{}) error {
client := meta.(*connectivity.AliyunClient)
serviceMeshServiceV2 := ServiceMeshServiceV2{client}
objectRaw, err := serviceMeshServiceV2.DescribeServiceMeshServiceMesh(d.Id())
if err != nil {
if !d.IsNewResource() && NotFoundError(err) {
log.Printf("[DEBUG] Resource alicloud_service_mesh_service_mesh DescribeServiceMeshServiceMesh Failed!!! %s", err)
d.SetId("")
return nil
}
return WrapError(err)
}
if objectRaw["ClusterSpec"] != nil {
d.Set("cluster_spec", objectRaw["ClusterSpec"])
}
serviceMeshInfo1RawObj, _ := jsonpath.Get("$.ServiceMeshInfo", objectRaw)
serviceMeshInfo1Raw := make(map[string]interface{})
if serviceMeshInfo1RawObj != nil {
serviceMeshInfo1Raw = serviceMeshInfo1RawObj.(map[string]interface{})
}
if serviceMeshInfo1Raw["CreationTime"] != nil {
d.Set("create_time", serviceMeshInfo1Raw["CreationTime"])
}
if serviceMeshInfo1Raw["Profile"] != nil {
d.Set("edition", serviceMeshInfo1Raw["Profile"])
}
if serviceMeshInfo1Raw["Name"] != nil {
d.Set("service_mesh_name", serviceMeshInfo1Raw["Name"])
}
if serviceMeshInfo1Raw["State"] != nil {
d.Set("status", serviceMeshInfo1Raw["State"])
}
if serviceMeshInfo1Raw["Version"] != nil {
d.Set("version", serviceMeshInfo1Raw["Version"])
}
clusters1Raw := make([]interface{}, 0)
if objectRaw["Clusters"] != nil {
clusters1Raw = objectRaw["Clusters"].([]interface{})
}
d.Set("cluster_ids", clusters1Raw)
extraConfigurationMaps := make([]map[string]interface{}, 0)
extraConfigurationMap := make(map[string]interface{})
cRAggregationConfiguration1RawObj, _ := jsonpath.Get("$.Spec.MeshConfig.ExtraConfiguration.CRAggregationConfiguration", objectRaw)
cRAggregationConfiguration1Raw := make(map[string]interface{})
if cRAggregationConfiguration1RawObj != nil {
cRAggregationConfiguration1Raw = cRAggregationConfiguration1RawObj.(map[string]interface{})
}
if len(cRAggregationConfiguration1Raw) > 0 {
extraConfigurationMap["cr_aggregation_enabled"] = cRAggregationConfiguration1Raw["Enabled"]
extraConfigurationMaps = append(extraConfigurationMaps, extraConfigurationMap)
}
if cRAggregationConfiguration1RawObj != nil {
if err := d.Set("extra_configuration", extraConfigurationMaps); err != nil {
return err
}
}
loadBalancerMaps := make([]map[string]interface{}, 0)
loadBalancerMap := make(map[string]interface{})
loadBalancer1RawObj, _ := jsonpath.Get("$.Spec.LoadBalancer", objectRaw)
loadBalancer1Raw := make(map[string]interface{})
if loadBalancer1RawObj != nil {
loadBalancer1Raw = loadBalancer1RawObj.(map[string]interface{})
}
if len(loadBalancer1Raw) > 0 {
loadBalancerMap["api_server_loadbalancer_id"] = loadBalancer1Raw["ApiServerLoadbalancerId"]
loadBalancerMap["api_server_public_eip"] = loadBalancer1Raw["ApiServerPublicEip"]
loadBalancerMap["pilot_public_eip"] = loadBalancer1Raw["PilotPublicEip"]
loadBalancerMap["pilot_public_eip_id"] = loadBalancer1Raw["PilotPublicEipId"]
loadBalancerMap["pilot_public_loadbalancer_id"] = loadBalancer1Raw["PilotPublicLoadbalancerId"]
loadBalancerMaps = append(loadBalancerMaps, loadBalancerMap)
}
if loadBalancer1RawObj != nil {
if err := d.Set("load_balancer", loadBalancerMaps); err != nil {
return err
}
}
meshConfigMaps := make([]map[string]interface{}, 0)
meshConfigMap := make(map[string]interface{})
meshConfig1RawObj, _ := jsonpath.Get("$.Spec.MeshConfig", objectRaw)
meshConfig1Raw := make(map[string]interface{})
if meshConfig1RawObj != nil {
meshConfig1Raw = meshConfig1RawObj.(map[string]interface{})
}
if len(meshConfig1Raw) > 0 {
meshConfigMap["customized_zipkin"] = meshConfig1Raw["CustomizedZipkin"]
meshConfigMap["enable_locality_lb"] = meshConfig1Raw["EnableLocalityLB"]
meshConfigMap["include_ip_ranges"] = meshConfig1Raw["IncludeIPRanges"]
meshConfigMap["outbound_traffic_policy"] = meshConfig1Raw["OutboundTrafficPolicy"]
meshConfigMap["telemetry"] = meshConfig1Raw["Telemetry"]
meshConfigMap["tracing"] = meshConfig1Raw["Tracing"]
accessLogMaps := make([]map[string]interface{}, 0)
accessLogMap := make(map[string]interface{})
accessLog1RawObj, _ := jsonpath.Get("$.Spec.MeshConfig.AccessLog", objectRaw)
accessLog1Raw := make(map[string]interface{})
if accessLog1RawObj != nil {
accessLog1Raw = accessLog1RawObj.(map[string]interface{})
}
if len(accessLog1Raw) > 0 {
accessLogMap["enabled"] = accessLog1Raw["Enabled"]
accessLogMap["project"] = accessLog1Raw["Project"]
accessLogExtraConf1RawObj, _ := jsonpath.Get("$.Spec.MeshConfig.ExtraConfiguration.AccessLogExtraConf", objectRaw)
accessLogExtraConf1Raw := make(map[string]interface{})
if accessLogExtraConf1RawObj != nil {
accessLogExtraConf1Raw = accessLogExtraConf1RawObj.(map[string]interface{})
}
if len(accessLogExtraConf1Raw) > 0 {
accessLogMap["gateway_enabled"] = accessLogExtraConf1Raw["GatewayEnabled"]
accessLogMap["gateway_lifecycle"] = accessLogExtraConf1Raw["GatewayLifecycle"]
accessLogMap["sidecar_enabled"] = accessLogExtraConf1Raw["SidecarEnabled"]
accessLogMap["sidecar_lifecycle"] = accessLogExtraConf1Raw["SidecarLifecycle"]
}
accessLogMaps = append(accessLogMaps, accessLogMap)
}
meshConfigMap["access_log"] = accessLogMaps
auditMaps := make([]map[string]interface{}, 0)
auditMap := make(map[string]interface{})
audit1RawObj, _ := jsonpath.Get("$.Spec.MeshConfig.Audit", objectRaw)
audit1Raw := make(map[string]interface{})
if audit1RawObj != nil {
audit1Raw = audit1RawObj.(map[string]interface{})
}
if len(audit1Raw) > 0 {
auditMap["enabled"] = audit1Raw["Enabled"]
auditMap["project"] = audit1Raw["Project"]
auditMaps = append(auditMaps, auditMap)
}
meshConfigMap["audit"] = auditMaps
controlPlaneLogMaps := make([]map[string]interface{}, 0)
controlPlaneLogMap := make(map[string]interface{})
controlPlaneLogInfo1RawObj, _ := jsonpath.Get("$.Spec.MeshConfig.ControlPlaneLogInfo", objectRaw)
controlPlaneLogInfo1Raw := make(map[string]interface{})
if controlPlaneLogInfo1RawObj != nil {
controlPlaneLogInfo1Raw = controlPlaneLogInfo1RawObj.(map[string]interface{})
}
if len(controlPlaneLogInfo1Raw) > 0 {
controlPlaneLogMap["enabled"] = controlPlaneLogInfo1Raw["Enabled"]
controlPlaneLogMap["log_ttl_in_day"] = controlPlaneLogInfo1Raw["LogTTL"]
controlPlaneLogMap["project"] = controlPlaneLogInfo1Raw["Project"]
controlPlaneLogMaps = append(controlPlaneLogMaps, controlPlaneLogMap)
}
meshConfigMap["control_plane_log"] = controlPlaneLogMaps
oPAMaps := make([]map[string]interface{}, 0)
oPAMap := make(map[string]interface{})
oPA1RawObj, _ := jsonpath.Get("$.Spec.MeshConfig.OPA", objectRaw)
oPA1Raw := make(map[string]interface{})
if oPA1RawObj != nil {
oPA1Raw = oPA1RawObj.(map[string]interface{})
}
if len(oPA1Raw) > 0 {
oPAMap["enabled"] = oPA1Raw["Enabled"]
oPAMap["limit_cpu"] = oPA1Raw["LimitCPU"]
oPAMap["limit_memory"] = oPA1Raw["LimitMemory"]
oPAMap["log_level"] = oPA1Raw["LogLevel"]
oPAMap["request_cpu"] = oPA1Raw["RequestCPU"]
oPAMap["request_memory"] = oPA1Raw["RequestMemory"]
oPAMaps = append(oPAMaps, oPAMap)
}
meshConfigMap["opa"] = oPAMaps
pilotMaps := make([]map[string]interface{}, 0)
pilotMap := make(map[string]interface{})
pilot1RawObj, _ := jsonpath.Get("$.Spec.MeshConfig.Pilot", objectRaw)
pilot1Raw := make(map[string]interface{})
if pilot1RawObj != nil {
pilot1Raw = pilot1RawObj.(map[string]interface{})
}
if len(pilot1Raw) > 0 {
pilotMap["http10_enabled"] = pilot1Raw["Http10Enabled"]
pilotMap["trace_sampling"] = pilot1Raw["TraceSampling"]
pilotMaps = append(pilotMaps, pilotMap)
}
meshConfigMap["pilot"] = pilotMaps
prometheusMaps := make([]map[string]interface{}, 0)
prometheusMap := make(map[string]interface{})
prometheus1RawObj, _ := jsonpath.Get("$.Spec.MeshConfig.Prometheus", objectRaw)
prometheus1Raw := make(map[string]interface{})
if prometheus1RawObj != nil {
prometheus1Raw = prometheus1RawObj.(map[string]interface{})
}
if len(prometheus1Raw) > 0 {
prometheusMap["external_url"] = prometheus1Raw["ExternalUrl"]
prometheusMap["use_external"] = prometheus1Raw["UseExternal"]
prometheusMaps = append(prometheusMaps, prometheusMap)
}
meshConfigMap["prometheus"] = prometheusMaps
proxyMaps := make([]map[string]interface{}, 0)
proxyMap := make(map[string]interface{})
proxy1RawObj, _ := jsonpath.Get("$.Spec.MeshConfig.Proxy", objectRaw)
proxy1Raw := make(map[string]interface{})
if proxy1RawObj != nil {
proxy1Raw = proxy1RawObj.(map[string]interface{})
}
if len(proxy1Raw) > 0 {
proxyMap["cluster_domain"] = proxy1Raw["ClusterDomain"]
proxyMap["limit_cpu"] = proxy1Raw["LimitCPU"]
proxyMap["limit_memory"] = proxy1Raw["LimitMemory"]
proxyMap["request_cpu"] = proxy1Raw["RequestCPU"]
proxyMap["request_memory"] = proxy1Raw["RequestMemory"]
proxyMaps = append(proxyMaps, proxyMap)
}
meshConfigMap["proxy"] = proxyMaps
sidecarInjectorMaps := make([]map[string]interface{}, 0)
sidecarInjectorMap := make(map[string]interface{})
sidecarInjector1RawObj, _ := jsonpath.Get("$.Spec.MeshConfig.SidecarInjector", objectRaw)
sidecarInjector1Raw := make(map[string]interface{})
if sidecarInjector1RawObj != nil {
sidecarInjector1Raw = sidecarInjector1RawObj.(map[string]interface{})
}
if len(sidecarInjector1Raw) > 0 {
sidecarInjectorMap["auto_injection_policy_enabled"] = sidecarInjector1Raw["AutoInjectionPolicyEnabled"]
sidecarInjectorMap["enable_namespaces_by_default"] = sidecarInjector1Raw["EnableNamespacesByDefault"]
sidecarInjectorMap["limit_cpu"] = sidecarInjector1Raw["LimitCPU"]
sidecarInjectorMap["limit_memory"] = sidecarInjector1Raw["LimitMemory"]
sidecarInjectorMap["request_cpu"] = sidecarInjector1Raw["RequestCPU"]
sidecarInjectorMap["request_memory"] = sidecarInjector1Raw["RequestMemory"]
sidecarInjectorMap["sidecar_injector_webhook_as_yaml"] = sidecarInjector1Raw["SidecarInjectorWebhookAsYaml"]
initCNIConfigurationMaps := make([]map[string]interface{}, 0)
initCNIConfigurationMap := make(map[string]interface{})
initCNIConfiguration1RawObj, _ := jsonpath.Get("$.Spec.MeshConfig.SidecarInjector.InitCNIConfiguration", objectRaw)
initCNIConfiguration1Raw := make(map[string]interface{})
if initCNIConfiguration1RawObj != nil {
initCNIConfiguration1Raw = initCNIConfiguration1RawObj.(map[string]interface{})
}
if len(initCNIConfiguration1Raw) > 0 {
initCNIConfigurationMap["enabled"] = initCNIConfiguration1Raw["Enabled"]
initCNIConfigurationMap["exclude_namespaces"] = initCNIConfiguration1Raw["ExcludeNamespaces"]
initCNIConfigurationMaps = append(initCNIConfigurationMaps, initCNIConfigurationMap)
}
sidecarInjectorMap["init_cni_configuration"] = initCNIConfigurationMaps
sidecarInjectorMaps = append(sidecarInjectorMaps, sidecarInjectorMap)
}
meshConfigMap["sidecar_injector"] = sidecarInjectorMaps
}
networkMaps := make([]map[string]interface{}, 0)
networkMap := make(map[string]interface{})
network1RawObj, _ := jsonpath.Get("$.Spec.Network", objectRaw)
network1Raw := make(map[string]interface{})
if network1RawObj != nil {
network1Raw = network1RawObj.(map[string]interface{})
}
if len(network1Raw) > 0 {
networkMap["security_group_id"] = network1Raw["SecurityGroupId"]
networkMap["vpc_id"] = network1Raw["VpcId"]
vSwitches1Raw, _ := jsonpath.Get("$.Spec.Network.VSwitches", objectRaw)
networkMap["vswitche_list"] = vSwitches1Raw
networkMaps = append(networkMaps, networkMap)
}
if network1RawObj != nil {
if err := d.Set("network", networkMaps); err != nil {
return err
}
}
objectRaw, err = serviceMeshServiceV2.DescribeDescribeKialiConfiguration(d.Id())
if err != nil {
return WrapError(err)
}
kialiMaps := make([]map[string]interface{}, 0)
kialiMap := make(map[string]interface{})
kialiMap["aggregated_kiali_address"] = objectRaw["AggregatedKialiAddress"]
kialiMap["auth_strategy"] = objectRaw["AuthStrategy"]
kialiMap["custom_prometheus_url"] = objectRaw["CustomPrometheusUrl"]
kialiMap["distributed_kiali_access_tokens"] = objectRaw["DistributedKialiAccessTokens"]
kialiMap["distributed_kiali_addresses"] = objectRaw["DistributedKialiAddresses"]
kialiMap["enabled"] = objectRaw["Enabled"]
kialiMap["integrate_clb"] = objectRaw["IntegrateCLB"]
kialiMap["kiali_arms_auth_tokens"] = objectRaw["KialiArmsAuthTokens"]
kialiMap["kiali_service_annotations"] = objectRaw["KialiServiceAnnotations"]
kialiMap["url"] = objectRaw["KialiIstioIngressAddress"]
kialiMap["use_populated_arms_prometheus"] = objectRaw["UsePopulatedArmsPrometheus"]
openIdConfigMaps := make([]map[string]interface{}, 0)
openIdConfigMap := make(map[string]interface{})
openIdConfig1RawObj, _ := jsonpath.Get("$.OpenIdConfig", objectRaw)
openIdConfig1Raw := make(map[string]interface{})
if openIdConfig1RawObj != nil {
openIdConfig1Raw = openIdConfig1RawObj.(map[string]interface{})
}
if len(openIdConfig1Raw) > 0 {
openIdConfigMap["client_id"] = openIdConfig1Raw["ClientId"]
openIdConfigMap["client_secret"] = openIdConfig1Raw["ClientSecret"]
openIdConfigMap["issuer_uri"] = openIdConfig1Raw["IssuerUri"]
scopes1Raw, _ := jsonpath.Get("$.OpenIdConfig.Scopes", objectRaw)
openIdConfigMap["scopes"] = scopes1Raw
openIdConfigMaps = append(openIdConfigMaps, openIdConfigMap)
}
kialiMap["open_id_config"] = openIdConfigMaps
ramOAuthConfigMaps := make([]map[string]interface{}, 0)
ramOAuthConfigMap := make(map[string]interface{})
rAMOAuthConfig1RawObj, _ := jsonpath.Get("$.RAMOAuthConfig", objectRaw)
rAMOAuthConfig1Raw := make(map[string]interface{})
if rAMOAuthConfig1RawObj != nil {
rAMOAuthConfig1Raw = rAMOAuthConfig1RawObj.(map[string]interface{})
}
if len(rAMOAuthConfig1Raw) > 0 {
ramOAuthConfigMap["redirect_uris"] = rAMOAuthConfig1Raw["RedirectUris"]
ramOAuthConfigMaps = append(ramOAuthConfigMaps, ramOAuthConfigMap)
}
kialiMap["ram_oauth_config"] = ramOAuthConfigMaps
serverConfigMaps := make([]map[string]interface{}, 0)
serverConfigMap := make(map[string]interface{})
serverConfig1RawObj, _ := jsonpath.Get("$.ServerConfig", objectRaw)
serverConfig1Raw := make(map[string]interface{})
if serverConfig1RawObj != nil {
serverConfig1Raw = serverConfig1RawObj.(map[string]interface{})
}
if len(serverConfig1Raw) > 0 {
serverConfigMap["web_fqdn"] = serverConfig1Raw["WebFQDN"]
serverConfigMap["web_port"] = serverConfig1Raw["WebPort"]
serverConfigMap["web_root"] = serverConfig1Raw["WebRoot"]
serverConfigMap["web_schema"] = serverConfig1Raw["WebSchema"]
serverConfigMaps = append(serverConfigMaps, serverConfigMap)
}
kialiMap["server_config"] = serverConfigMaps
kialiMaps = append(kialiMaps, kialiMap)
meshConfigMap["kiali"] = kialiMaps
meshConfigMaps = append(meshConfigMaps, meshConfigMap)
if err := d.Set("mesh_config", meshConfigMaps); err != nil {
return err
}
objectRaw, err = serviceMeshServiceV2.DescribeListTagResources(d.Id())
if err != nil {
return WrapError(err)
}
tagsMaps := objectRaw["TagResources"]
d.Set("tags", tagsToMap(tagsMaps))
objectRaw, err = serviceMeshServiceV2.DescribeDescribeServiceMeshKubeconfig(d.Id())
if err != nil {
return WrapError(err)
}
if objectRaw["Kubeconfig"] != nil {
d.Set("kubeconfig", objectRaw["Kubeconfig"])
}
return nil
}
func resourceAliCloudServiceMeshServiceMeshUpdate(d *schema.ResourceData, meta interface{}) error {
client := meta.(*connectivity.AliyunClient)
var request map[string]interface{}
var response map[string]interface{}
var query map[string]interface{}
update := false
d.Partial(true)
action := "UpdateMeshFeature"
var err error
request = make(map[string]interface{})
query = make(map[string]interface{})
request["ServiceMeshId"] = d.Id()
if !d.IsNewResource() && d.HasChange("mesh_config.0.tracing") {
update = true
jsonPathResult, err := jsonpath.Get("$[0].tracing", d.Get("mesh_config"))
if err == nil {
request["Tracing"] = jsonPathResult
}
}
if !d.IsNewResource() && d.HasChange("mesh_config.0.pilot.0.trace_sampling") {
update = true
jsonPathResult1, err := jsonpath.Get("$[0].pilot[0].trace_sampling", d.Get("mesh_config"))
if err == nil {
request["TraceSampling"] = jsonPathResult1
}
}
if !d.IsNewResource() && d.HasChange("mesh_config.0.telemetry") {
update = true
jsonPathResult2, err := jsonpath.Get("$[0].telemetry", d.Get("mesh_config"))
if err == nil {
request["Telemetry"] = jsonPathResult2
}
}
if !d.IsNewResource() && d.HasChange("mesh_config.0.customized_zipkin") {
update = true
jsonPathResult3, err := jsonpath.Get("$[0].customized_zipkin", d.Get("mesh_config"))
if err == nil {
request["CustomizedZipkin"] = jsonPathResult3
}
}
if d.HasChange("mesh_config.0.outbound_traffic_policy") {
update = true
jsonPathResult4, err := jsonpath.Get("$[0].outbound_traffic_policy", d.Get("mesh_config"))
if err == nil {
request["OutboundTrafficPolicy"] = jsonPathResult4
}
}
if !d.IsNewResource() && d.HasChange("mesh_config.0.include_ip_ranges") {
update = true
jsonPathResult5, err := jsonpath.Get("$[0].include_ip_ranges", d.Get("mesh_config"))
if err == nil {
request["IncludeIPRanges"] = jsonPathResult5
}
}
if d.HasChange("mesh_config.0.sidecar_injector.0.enable_namespaces_by_default") {
update = true
jsonPathResult6, err := jsonpath.Get("$[0].sidecar_injector[0].enable_namespaces_by_default", d.Get("mesh_config"))
if err == nil {
request["EnableNamespacesByDefault"] = jsonPathResult6
}
}
if d.HasChange("mesh_config.0.pilot.0.http10_enabled") {
update = true
jsonPathResult7, err := jsonpath.Get("$[0].pilot[0].http10_enabled", d.Get("mesh_config"))
if err == nil {
request["Http10Enabled"] = jsonPathResult7
}
}
if !d.IsNewResource() && d.HasChange("mesh_config.0.opa.0.log_level") {
update = true
jsonPathResult8, err := jsonpath.Get("$[0].opa[0].log_level", d.Get("mesh_config"))
if err == nil {
request["OPALogLevel"] = jsonPathResult8
}
}
if !d.IsNewResource() && d.HasChange("mesh_config.0.opa.0.request_cpu") {
update = true
jsonPathResult9, err := jsonpath.Get("$[0].opa[0].request_cpu", d.Get("mesh_config"))
if err == nil {
request["OPARequestCPU"] = jsonPathResult9
}
}
if !d.IsNewResource() && d.HasChange("mesh_config.0.opa.0.request_memory") {
update = true
jsonPathResult10, err := jsonpath.Get("$[0].opa[0].request_memory", d.Get("mesh_config"))
if err == nil {
request["OPARequestMemory"] = jsonPathResult10
}
}
if !d.IsNewResource() && d.HasChange("mesh_config.0.opa.0.limit_cpu") {
update = true
jsonPathResult11, err := jsonpath.Get("$[0].opa[0].limit_cpu", d.Get("mesh_config"))
if err == nil {
request["OPALimitCPU"] = jsonPathResult11
}
}
if !d.IsNewResource() && d.HasChange("mesh_config.0.opa.0.limit_memory") {
update = true
jsonPathResult12, err := jsonpath.Get("$[0].opa[0].limit_memory", d.Get("mesh_config"))
if err == nil {
request["OPALimitMemory"] = jsonPathResult12
}
}
if !d.IsNewResource() && d.HasChange("mesh_config.0.proxy.0.limit_cpu") {
update = true
jsonPathResult13, err := jsonpath.Get("$[0].proxy[0].limit_cpu", d.Get("mesh_config"))
if err == nil {
request["ProxyLimitCPU"] = jsonPathResult13
}
}
if !d.IsNewResource() && d.HasChange("mesh_config.0.proxy.0.request_cpu") {
update = true
jsonPathResult14, err := jsonpath.Get("$[0].proxy[0].request_cpu", d.Get("mesh_config"))
if err == nil {
request["ProxyRequestCPU"] = jsonPathResult14
}
}
if !d.IsNewResource() && d.HasChange("mesh_config.0.proxy.0.limit_memory") {
update = true
jsonPathResult15, err := jsonpath.Get("$[0].proxy[0].limit_memory", d.Get("mesh_config"))
if err == nil {
request["ProxyLimitMemory"] = jsonPathResult15
}
}
if !d.IsNewResource() && d.HasChange("mesh_config.0.access_log.0.enabled") {
update = true
jsonPathResult16, err := jsonpath.Get("$[0].access_log[0].enabled", d.Get("mesh_config"))
if err == nil {
request["AccessLogEnabled"] = jsonPathResult16
}
}
if d.HasChange("mesh_config.0.sidecar_injector.0.init_cni_configuration.0.exclude_namespaces") && (d.Get("cluster_spec") == "enterprise" || d.Get("cluster_spec") == "ultimate") {
update = true
jsonPathResult18, err := jsonpath.Get("$[0].sidecar_injector[0].init_cni_configuration[0].exclude_namespaces", d.Get("mesh_config"))
if err == nil {
request["CniExcludeNamespaces"] = jsonPathResult18
}
}
if d.HasChange("mesh_config.0.sidecar_injector.0.init_cni_configuration.0.enabled") && (d.Get("cluster_spec") == "enterprise" || d.Get("cluster_spec") == "ultimate") {
update = true
}
jsonPathResult19, err := jsonpath.Get("$[0].sidecar_injector[0].init_cni_configuration[0].enabled", d.Get("mesh_config"))
if err == nil {
request["CniEnabled"] = jsonPathResult19
}
if !d.IsNewResource() && d.HasChange("mesh_config.0.proxy.0.request_memory") {
update = true
jsonPathResult19, err := jsonpath.Get("$[0].proxy[0].request_memory", d.Get("mesh_config"))
if err == nil {
request["ProxyRequestMemory"] = jsonPathResult19
}
}
if d.HasChange("mesh_config.0.sidecar_injector.0.request_memory") {
update = true
jsonPathResult20, err := jsonpath.Get("$[0].sidecar_injector[0].request_memory", d.Get("mesh_config"))
if err == nil {
request["SidecarInjectorRequestMemory"] = jsonPathResult20
}
}
if d.HasChange("mesh_config.0.sidecar_injector.0.limit_memory") {
update = true
jsonPathResult21, err := jsonpath.Get("$[0].sidecar_injector[0].limit_memory", d.Get("mesh_config"))
if err == nil {
request["SidecarInjectorLimitMemory"] = jsonPathResult21
}
}
if d.HasChange("mesh_config.0.sidecar_injector.0.limit_cpu") {
update = true
jsonPathResult22, err := jsonpath.Get("$[0].sidecar_injector[0].limit_cpu", d.Get("mesh_config"))
if err == nil {
request["SidecarInjectorLimitCPU"] = jsonPathResult22
}
}
if d.HasChange("mesh_config.0.sidecar_injector.0.request_cpu") {
update = true
jsonPathResult23, err := jsonpath.Get("$[0].sidecar_injector[0].request_cpu", d.Get("mesh_config"))
if err == nil {
request["SidecarInjectorRequestCPU"] = jsonPathResult23
}
}
if !d.IsNewResource() && d.HasChange("mesh_config.0.opa.0.enabled") {
update = true
}
jsonPathResult25, err := jsonpath.Get("$[0].opa[0].enabled", d.Get("mesh_config"))
if err == nil {
request["OpaEnabled"] = jsonPathResult25
}
if v, ok := d.GetOkExists("customized_prometheus"); ok {
request["CustomizedPrometheus"] = v
}
if v, ok := d.GetOk("prometheus_url"); ok {
request["PrometheusUrl"] = v
}
if d.HasChange("mesh_config.0.sidecar_injector.0.auto_injection_policy_enabled") {
update = true
}
jsonPathResult28, err := jsonpath.Get("$[0].sidecar_injector[0].auto_injection_policy_enabled", d.Get("mesh_config"))
if err == nil {
request["AutoInjectionPolicyEnabled"] = jsonPathResult28
}
if !d.IsNewResource() && d.HasChange("mesh_config.0.access_log.0.project") {
update = true
jsonPathResult28, err := jsonpath.Get("$[0].access_log[0].project", d.Get("mesh_config"))
if err == nil {
request["AccessLogProject"] = jsonPathResult28
}
}
if d.HasChange("mesh_config.0.access_log.0.gateway_enabled") {
update = true
jsonPathResult29, err := jsonpath.Get("$[0].access_log[0].gateway_enabled", d.Get("mesh_config"))
if err == nil {
request["AccessLogGatewayEnabled"] = jsonPathResult29
}
}
if d.HasChange("mesh_config.0.access_log.0.sidecar_enabled") {
update = true
jsonPathResult30, err := jsonpath.Get("$[0].access_log[0].sidecar_enabled", d.Get("mesh_config"))
if err == nil {
request["AccessLogSidecarEnabled"] = jsonPathResult30
}
}
if d.HasChange("mesh_config.0.access_log.0.gateway_lifecycle") {
update = true
jsonPathResult31, err := jsonpath.Get("$[0].access_log[0].gateway_lifecycle", d.Get("mesh_config"))
if err == nil && jsonPathResult31.(int) > 0 {
request["AccessLogGatewayLifecycle"] = jsonPathResult31
}
}
if d.HasChange("mesh_config.0.access_log.0.sidecar_lifecycle") {
update = true
jsonPathResult32, err := jsonpath.Get("$[0].access_log[0].sidecar_lifecycle", d.Get("mesh_config"))
if err == nil && jsonPathResult32.(int) > 0 {
request["AccessLogSidecarLifecycle"] = jsonPathResult32
}
}
if !d.IsNewResource() && d.HasChange("mesh_config.0.audit.0.project") {
update = true
}
jsonPathResult34, err := jsonpath.Get("$[0].audit[0].project", d.Get("mesh_config"))
if err == nil {
request["AuditProject"] = jsonPathResult34
}
if !d.IsNewResource() && d.HasChange("mesh_config.0.audit.0.enabled") {
update = true
}
jsonPathResult35, err := jsonpath.Get("$[0].audit[0].enabled", d.Get("mesh_config"))
if err == nil {
request["EnableAudit"] = jsonPathResult35
}
if !d.IsNewResource() && d.HasChange("cluster_spec") {
update = true
request["ClusterSpec"] = d.Get("cluster_spec")
}
if update {
wait := incrementalWait(3*time.Second, 5*time.Second)
err = resource.Retry(d.Timeout(schema.TimeoutUpdate), func() *resource.RetryError {
response, err = client.RpcPost("servicemesh", "2020-01-11", action, query, request, true)
if err != nil {
if NeedRetry(err) {
wait()
return resource.RetryableError(err)
}
return resource.NonRetryableError(err)
}
addDebug(action, response, request)
return nil
})
if err != nil {
return WrapErrorf(err, DefaultErrorMsg, d.Id(), action, AlibabaCloudSdkGoERROR)
}
serviceMeshServiceV2 := ServiceMeshServiceV2{client}
stateConf := BuildStateConf([]string{}, []string{"running"}, d.Timeout(schema.TimeoutUpdate), 30*time.Second, serviceMeshServiceV2.ServiceMeshServiceMeshStateRefreshFunc(d.Id(), "$.ServiceMeshInfo.State", []string{}))
if _, err := stateConf.WaitForState(); err != nil {
return WrapErrorf(err, IdMsg, d.Id())
}
}
update = false
action = "UpdateMeshCRAggregation"
request = make(map[string]interface{})
query = make(map[string]interface{})
request["ServiceMeshId"] = d.Id()
if d.HasChange("extra_configuration.0.cr_aggregation_enabled") {
update = true
jsonPathResult, err := jsonpath.Get("$[0].cr_aggregation_enabled", d.Get("extra_configuration"))
if err == nil {
request["Enabled"] = jsonPathResult
}
}
if update {
wait := incrementalWait(3*time.Second, 5*time.Second)
err = resource.Retry(d.Timeout(schema.TimeoutUpdate), func() *resource.RetryError {
response, err = client.RpcPost("servicemesh", "2020-01-11", action, query, request, true)
if err != nil {
if NeedRetry(err) {
wait()
return resource.RetryableError(err)
}
return resource.NonRetryableError(err)
}
addDebug(action, response, request)
return nil
})
if err != nil {
return WrapErrorf(err, DefaultErrorMsg, d.Id(), action, AlibabaCloudSdkGoERROR)
}
serviceMeshServiceV2 := ServiceMeshServiceV2{client}
stateConf := BuildStateConf([]string{}, []string{"running"}, d.Timeout(schema.TimeoutUpdate), 5*time.Second, serviceMeshServiceV2.ServiceMeshServiceMeshStateRefreshFunc(d.Id(), "$.ServiceMeshInfo.State", []string{}))
if _, err := stateConf.WaitForState(); err != nil {
return WrapErrorf(err, IdMsg, d.Id())
}
}
update = false
action = "UpgradeMeshEditionPartially"
request = make(map[string]interface{})
query = make(map[string]interface{})
request["ServiceMeshId"] = d.Id()
if !d.IsNewResource() && d.HasChange("version") {
update = true
request["ExpectedVersion"] = d.Get("version")
}
request["ASMGatewayContinue"] = "false"
if update {
wait := incrementalWait(3*time.Second, 5*time.Second)
err = resource.Retry(d.Timeout(schema.TimeoutUpdate), func() *resource.RetryError {
response, err = client.RpcPost("servicemesh", "2020-01-11", action, query, request, true)
if err != nil {
if NeedRetry(err) {
wait()
return resource.RetryableError(err)
}
return resource.NonRetryableError(err)
}
addDebug(action, response, request)
return nil
})
if err != nil {
return WrapErrorf(err, DefaultErrorMsg, d.Id(), action, AlibabaCloudSdkGoERROR)
}
serviceMeshServiceV2 := ServiceMeshServiceV2{client}
stateConf := BuildStateConf([]string{}, []string{"running"}, d.Timeout(schema.TimeoutUpdate), 30*time.Second, serviceMeshServiceV2.ServiceMeshServiceMeshStateRefreshFunc(d.Id(), "$.ServiceMeshInfo.State", []string{}))
if _, err := stateConf.WaitForState(); err != nil {
return WrapErrorf(err, IdMsg, d.Id())
}
}
update = false
action = "UpdateControlPlaneLogConfig"
request = make(map[string]interface{})
query = make(map[string]interface{})
request["ServiceMeshId"] = d.Id()
if !d.IsNewResource() && d.HasChange("mesh_config.0.control_plane_log.0.enabled") {
update = true
}
jsonPathResult, err := jsonpath.Get("$[0].control_plane_log[0].enabled", d.Get("mesh_config"))
if err == nil {
request["Enabled"] = jsonPathResult
}
if !d.IsNewResource() && d.HasChange("mesh_config.0.control_plane_log.0.project") {
update = true
jsonPathResult1, err := jsonpath.Get("$[0].control_plane_log[0].project", d.Get("mesh_config"))
if err == nil {
request["Project"] = jsonPathResult1
}
}
if d.HasChange("mesh_config.0.control_plane_log.0.log_ttl_in_day") {
update = true
jsonPathResult2, err := jsonpath.Get("$[0].control_plane_log[0].log_ttl_in_day", d.Get("mesh_config"))
if err == nil && jsonPathResult2.(int) > 0 {
request["LogTTLInDay"] = jsonPathResult2
}
}
if update {
wait := incrementalWait(3*time.Second, 5*time.Second)
err = resource.Retry(d.Timeout(schema.TimeoutUpdate), func() *resource.RetryError {
response, err = client.RpcPost("servicemesh", "2020-01-11", action, query, request, true)
if err != nil {
if NeedRetry(err) {
wait()
return resource.RetryableError(err)
}
return resource.NonRetryableError(err)
}
addDebug(action, response, request)
return nil
})
if err != nil {
return WrapErrorf(err, DefaultErrorMsg, d.Id(), action, AlibabaCloudSdkGoERROR)
}
serviceMeshServiceV2 := ServiceMeshServiceV2{client}
stateConf := BuildStateConf([]string{}, []string{"running"}, d.Timeout(schema.TimeoutUpdate), 5*time.Second, serviceMeshServiceV2.ServiceMeshServiceMeshStateRefreshFunc(d.Id(), "$.ServiceMeshInfo.State", []string{}))
if _, err := stateConf.WaitForState(); err != nil {
return WrapErrorf(err, IdMsg, d.Id())
}
}
update = false
action = "ModifyServiceMeshName"
request = make(map[string]interface{})
query = make(map[string]interface{})
request["ServiceMeshId"] = d.Id()
if !d.IsNewResource() && d.HasChange("service_mesh_name") {
update = true
}
request["Name"] = d.Get("service_mesh_name")
if update {
wait := incrementalWait(3*time.Second, 5*time.Second)
err = resource.Retry(d.Timeout(schema.TimeoutUpdate), func() *resource.RetryError {
response, err = client.RpcPost("servicemesh", "2020-01-11", action, query, request, true)
if err != nil {
if NeedRetry(err) {
wait()
return resource.RetryableError(err)
}
return resource.NonRetryableError(err)
}
addDebug(action, response, request)
return nil
})
if err != nil {
return WrapErrorf(err, DefaultErrorMsg, d.Id(), action, AlibabaCloudSdkGoERROR)
}
}
update = false
action = "UpdateKialiConfiguration"
request = make(map[string]interface{})
query = make(map[string]interface{})
request["ServiceMeshId"] = d.Id()
if !d.IsNewResource() && d.HasChange("mesh_config.0.kiali.0.enabled") {
update = true
jsonPathResult, err := jsonpath.Get("$[0].kiali[0].enabled", d.Get("mesh_config"))
if err == nil {
request["Enabled"] = jsonPathResult
}
}
if d.HasChange("mesh_config.0.kiali.0.custom_prometheus_url") {
update = true
jsonPathResult1, err := jsonpath.Get("$[0].kiali[0].custom_prometheus_url", d.Get("mesh_config"))
if err == nil {
request["CustomPrometheusUrl"] = jsonPathResult1
}
}
if d.HasChange("mesh_config.0.kiali.0.integrate_clb") {
update = true
jsonPathResult2, err := jsonpath.Get("$[0].kiali[0].integrate_clb", d.Get("mesh_config"))
if err == nil {
request["IntegrateCLB"] = jsonPathResult2
}
}
if d.HasChange("mesh_config.0.kiali.0.kiali_service_annotations") {
update = true
jsonPathResult3, err := jsonpath.Get("$[0].kiali[0].kiali_service_annotations", d.Get("mesh_config"))
if err == nil {
request["KialiServiceAnnotations"] = jsonPathResult3
}
}
if d.HasChange("mesh_config.0.kiali.0.kiali_arms_auth_tokens") {
update = true
jsonPathResult4, err := jsonpath.Get("$[0].kiali[0].kiali_arms_auth_tokens", d.Get("mesh_config"))
if err == nil {
request["KialiArmsAuthTokens"] = jsonPathResult4
}
}
if d.HasChange("mesh_config.0.kiali.0.auth_strategy") {
update = true
jsonPathResult5, err := jsonpath.Get("$[0].kiali[0].auth_strategy", d.Get("mesh_config"))
if err == nil {
request["AuthStrategy"] = jsonPathResult5
}
}
if d.HasChange("mesh_config") {
update = true
objectDataLocalMap := make(map[string]interface{})
if v := d.Get("mesh_config"); !IsNil(v) {
redirectUris1, _ := jsonpath.Get("$[0].kiali[0].ram_oauth_config[0].redirect_uris", v)
if redirectUris1 != nil && (d.HasChange("mesh_config.0.kiali.0.ram_oauth_config.0.redirect_uris") || redirectUris1 != "") {
objectDataLocalMap["RedirectUris"] = redirectUris1
}
objectDataLocalMapJson, err := json.Marshal(objectDataLocalMap)
if err != nil {
return WrapError(err)
}
request["RAMOAuthConfig"] = string(objectDataLocalMapJson)
}
}
if d.HasChange("mesh_config") {
update = true
objectDataLocalMap1 := make(map[string]interface{})
if v := d.Get("mesh_config"); !IsNil(v) {
clientId1, _ := jsonpath.Get("$[0].kiali[0].open_id_config[0].client_id", v)
if clientId1 != nil && (d.HasChange("mesh_config.0.kiali.0.open_id_config.0.client_id") || clientId1 != "") {
objectDataLocalMap1["ClientId"] = clientId1
}
clientSecret1, _ := jsonpath.Get("$[0].kiali[0].open_id_config[0].client_secret", v)
if clientSecret1 != nil && (d.HasChange("mesh_config.0.kiali.0.open_id_config.0.client_secret") || clientSecret1 != "") {
objectDataLocalMap1["ClientSecret"] = clientSecret1
}
issuerUri1, _ := jsonpath.Get("$[0].kiali[0].open_id_config[0].issuer_uri", v)
if issuerUri1 != nil && (d.HasChange("mesh_config.0.kiali.0.open_id_config.0.issuer_uri") || issuerUri1 != "") {
objectDataLocalMap1["IssuerUri"] = issuerUri1
}
scopes1, _ := jsonpath.Get("$[0].kiali[0].open_id_config[0].scopes", d.Get("mesh_config"))
if scopes1 != nil && (d.HasChange("mesh_config.0.kiali.0.open_id_config.0.scopes") || scopes1 != "") {
objectDataLocalMap1["Scopes"] = scopes1
}
objectDataLocalMap1Json, err := json.Marshal(objectDataLocalMap1)
if err != nil {
return WrapError(err)
}
request["OpenIdConfig"] = string(objectDataLocalMap1Json)
}
}
if d.HasChange("mesh_config") {
update = true
objectDataLocalMap2 := make(map[string]interface{})
if v := d.Get("mesh_config"); !IsNil(v) {
webFqdn, _ := jsonpath.Get("$[0].kiali[0].server_config[0].web_fqdn", v)
if webFqdn != nil && (d.HasChange("mesh_config.0.kiali.0.server_config.0.web_fqdn") || webFqdn != "") {
objectDataLocalMap2["WebFQDN"] = webFqdn
}
webPort1, _ := jsonpath.Get("$[0].kiali[0].server_config[0].web_port", v)
if webPort1 != nil && (d.HasChange("mesh_config.0.kiali.0.server_config.0.web_port") || webPort1 != "") {
objectDataLocalMap2["WebPort"] = webPort1
}
webRoot1, _ := jsonpath.Get("$[0].kiali[0].server_config[0].web_root", v)
if webRoot1 != nil && (d.HasChange("mesh_config.0.kiali.0.server_config.0.web_root") || webRoot1 != "") {
objectDataLocalMap2["WebRoot"] = webRoot1
}
webSchema1, _ := jsonpath.Get("$[0].kiali[0].server_config[0].web_schema", v)
if webSchema1 != nil && (d.HasChange("mesh_config.0.kiali.0.server_config.0.web_schema") || webSchema1 != "") {
objectDataLocalMap2["WebSchema"] = webSchema1
}
objectDataLocalMap2Json, err := json.Marshal(objectDataLocalMap2)
if err != nil {
return WrapError(err)
}
request["ServerConfig"] = string(objectDataLocalMap2Json)
}
}
if update {
wait := incrementalWait(3*time.Second, 5*time.Second)
err = resource.Retry(d.Timeout(schema.TimeoutUpdate), func() *resource.RetryError {
response, err = client.RpcPost("servicemesh", "2020-01-11", action, query, request, true)
if err != nil {
if NeedRetry(err) {
wait()
return resource.RetryableError(err)
}
return resource.NonRetryableError(err)
}
addDebug(action, response, request)
return nil
})
if err != nil {
return WrapErrorf(err, DefaultErrorMsg, d.Id(), action, AlibabaCloudSdkGoERROR)
}
serviceMeshServiceV2 := ServiceMeshServiceV2{client}
stateConf := BuildStateConf([]string{}, []string{"running"}, d.Timeout(schema.TimeoutUpdate), 5*time.Second, serviceMeshServiceV2.ServiceMeshServiceMeshStateRefreshFunc(d.Id(), "$.ServiceMeshInfo.State", []string{}))
if _, err := stateConf.WaitForState(); err != nil {
return WrapErrorf(err, IdMsg, d.Id())
}
}
if d.HasChange("cluster_ids") {
oldEntry, newEntry := d.GetChange("cluster_ids")
removed := oldEntry
added := newEntry
if len(removed.([]interface{})) > 0 {
clusterIds := removed.([]interface{})
for _, item := range clusterIds {
action := "RemoveClusterFromServiceMesh"
request = make(map[string]interface{})
query = make(map[string]interface{})
request["ServiceMeshId"] = d.Id()
if v, ok := item.(string); ok {
jsonPathResult, err := jsonpath.Get("$", v)
if err != nil {
return WrapError(err)
}
request["ClusterId"] = jsonPathResult
}
wait := incrementalWait(3*time.Second, 5*time.Second)
err = resource.Retry(d.Timeout(schema.TimeoutUpdate), func() *resource.RetryError {
response, err = client.RpcPost("servicemesh", "2020-01-11", action, query, request, true)
if err != nil {
if NeedRetry(err) {
wait()
return resource.RetryableError(err)
}
return resource.NonRetryableError(err)
}
addDebug(action, response, request)
return nil
})
if err != nil {
return WrapErrorf(err, DefaultErrorMsg, d.Id(), action, AlibabaCloudSdkGoERROR)
}
serviceMeshServiceV2 := ServiceMeshServiceV2{client}
stateConf := BuildStateConf([]string{}, []string{"running"}, d.Timeout(schema.TimeoutUpdate), 5*time.Second, serviceMeshServiceV2.ServiceMeshServiceMeshStateRefreshFunc(d.Id(), "$.ServiceMeshInfo.State", []string{}))
if _, err := stateConf.WaitForState(); err != nil {
return WrapErrorf(err, IdMsg, d.Id())
}
}
}
if len(added.([]interface{})) > 0 {
clusterIds := added.([]interface{})
for _, item := range clusterIds {
action := "AddClusterIntoServiceMesh"
request = make(map[string]interface{})
query = make(map[string]interface{})
request["ServiceMeshId"] = d.Id()
if v, ok := item.(string); ok {
jsonPathResult, err := jsonpath.Get("$", v)
if err != nil {
return WrapError(err)
}
request["ClusterId"] = jsonPathResult
}
wait := incrementalWait(3*time.Second, 5*time.Second)
err = resource.Retry(d.Timeout(schema.TimeoutUpdate), func() *resource.RetryError {
response, err = client.RpcPost("servicemesh", "2020-01-11", action, query, request, true)
if err != nil {
if NeedRetry(err) {
wait()
return resource.RetryableError(err)
}
return resource.NonRetryableError(err)
}
addDebug(action, response, request)
return nil
})
if err != nil {
return WrapErrorf(err, DefaultErrorMsg, d.Id(), action, AlibabaCloudSdkGoERROR)
}
serviceMeshServiceV2 := ServiceMeshServiceV2{client}
stateConf := BuildStateConf([]string{}, []string{"running"}, d.Timeout(schema.TimeoutUpdate), 5*time.Second, serviceMeshServiceV2.ServiceMeshServiceMeshStateRefreshFunc(d.Id(), "$.ServiceMeshInfo.State", []string{}))
if _, err := stateConf.WaitForState(); err != nil {
return WrapErrorf(err, IdMsg, d.Id())
}
}
}
}
if d.HasChange("tags") {
serviceMeshServiceV2 := ServiceMeshServiceV2{client}
if err := serviceMeshServiceV2.SetResourceTags(d, "servicemesh"); err != nil {
return WrapError(err)
}
}
if !d.IsNewResource() && d.HasChange("load_balancer.0.pilot_public_eip_id") {
oldEntry, newEntry := d.GetChange("load_balancer.0.pilot_public_eip_id")
removed, removedOk := oldEntry.(string)
added, addedOk := newEntry.(string)
log.Printf("[INFO] Resource load_balancer.0.pilot_public_eip_id removed %s removedOk %v added %s addedOk %v", removed, removedOk, added, addedOk)
if removedOk && len(removed) > 0 && added != removed {
action := "ModifyPilotEipResource"
request = make(map[string]interface{})
query = make(map[string]interface{})
request["ServiceMeshId"] = d.Id()
request["Operation"] = "UnBindEip"
if v, ok := d.GetOk("load_balancer"); ok {
jsonPathResult, err := jsonpath.Get("$[0].pilot_public_eip_id", v)
if err == nil && jsonPathResult != "" {
request["EipId"] = jsonPathResult
}
}
wait := incrementalWait(3*time.Second, 5*time.Second)
err = resource.Retry(d.Timeout(schema.TimeoutUpdate), func() *resource.RetryError {
response, err = client.RpcPost("servicemesh", "2020-01-11", action, query, request, true)
if err != nil {
if NeedRetry(err) {
wait()
return resource.RetryableError(err)
}
return resource.NonRetryableError(err)
}
addDebug(action, response, request)
return nil
})
if err != nil {
return WrapErrorf(err, DefaultErrorMsg, d.Id(), action, AlibabaCloudSdkGoERROR)
}
serviceMeshServiceV2 := ServiceMeshServiceV2{client}
stateConf := BuildStateConf([]string{}, []string{"running"}, d.Timeout(schema.TimeoutUpdate), 5*time.Second, serviceMeshServiceV2.ServiceMeshServiceMeshStateRefreshFunc(d.Id(), "$.ServiceMeshInfo.State", []string{}))
if _, err := stateConf.WaitForState(); err != nil {
return WrapErrorf(err, IdMsg, d.Id())
}
}
if addedOk && len(added) > 0 && added != removed {
action := "ModifyPilotEipResource"
request = make(map[string]interface{})
query = make(map[string]interface{})
request["ServiceMeshId"] = d.Id()
if v, ok := d.GetOk("load_balancer"); ok {
jsonPathResult, err := jsonpath.Get("$[0].pilot_public_eip_id", v)
if err == nil && jsonPathResult != "" {
request["EipId"] = jsonPathResult
}
}
request["Operation"] = "BindEip"
wait := incrementalWait(3*time.Second, 5*time.Second)
err = resource.Retry(d.Timeout(schema.TimeoutUpdate), func() *resource.RetryError {
response, err = client.RpcPost("servicemesh", "2020-01-11", action, query, request, true)
if err != nil {
if NeedRetry(err) {
wait()
return resource.RetryableError(err)
}
return resource.NonRetryableError(err)
}
addDebug(action, response, request)
return nil
})
if err != nil {
return WrapErrorf(err, DefaultErrorMsg, d.Id(), action, AlibabaCloudSdkGoERROR)
}
serviceMeshServiceV2 := ServiceMeshServiceV2{client}
stateConf := BuildStateConf([]string{}, []string{"running"}, d.Timeout(schema.TimeoutUpdate), 5*time.Second, serviceMeshServiceV2.ServiceMeshServiceMeshStateRefreshFunc(d.Id(), "$.ServiceMeshInfo.State", []string{}))
if _, err := stateConf.WaitForState(); err != nil {
return WrapErrorf(err, IdMsg, d.Id())
}
}
}
d.Partial(false)
return resourceAliCloudServiceMeshServiceMeshRead(d, meta)
}
func resourceAliCloudServiceMeshServiceMeshDelete(d *schema.ResourceData, meta interface{}) error {
client := meta.(*connectivity.AliyunClient)
action := "DeleteServiceMesh"
var request map[string]interface{}
var response map[string]interface{}
query := make(map[string]interface{})
var err error
request = make(map[string]interface{})
request["ServiceMeshId"] = d.Id()
if v, ok := d.GetOkExists("force"); ok {
request["Force"] = v
}
wait := incrementalWait(3*time.Second, 5*time.Second)
err = resource.Retry(d.Timeout(schema.TimeoutDelete), func() *resource.RetryError {
response, err = client.RpcPost("servicemesh", "2020-01-11", action, query, request, true)
if err != nil {
if IsExpectedErrors(err, []string{"RelatedResourceReused", "StillInitializing"}) || NeedRetry(err) {
wait()
return resource.RetryableError(err)
}
return resource.NonRetryableError(err)
}
addDebug(action, response, request)
return nil
})
if err != nil {
if IsExpectedErrors(err, []string{"StatusForbidden", "403"}) || NotFoundError(err) {
return nil
}
return WrapErrorf(err, DefaultErrorMsg, d.Id(), action, AlibabaCloudSdkGoERROR)
}
serviceMeshServiceV2 := ServiceMeshServiceV2{client}
stateConf := BuildStateConf([]string{}, []string{}, d.Timeout(schema.TimeoutDelete), 60*time.Second, serviceMeshServiceV2.ServiceMeshServiceMeshStateRefreshFunc(d.Id(), "$.ServiceMeshInfo.State", []string{}))
if _, err := stateConf.WaitForState(); err != nil {
return WrapErrorf(err, IdMsg, d.Id())
}
return nil
}