func resourceAliCloudSaeApplicationCreate()

in alicloud/resource_alicloud_sae_application.go [832:1492]


func resourceAliCloudSaeApplicationCreate(d *schema.ResourceData, meta interface{}) error {
	client := meta.(*connectivity.AliyunClient)
	saeService := SaeService{client}
	var response map[string]interface{}
	action := "/pop/v1/sam/app/createApplication"
	request := make(map[string]*string)
	var err error

	request["AppName"] = StringPointer(d.Get("app_name").(string))
	request["PackageType"] = StringPointer(d.Get("package_type").(string))
	request["Replicas"] = StringPointer(strconv.Itoa(d.Get("replicas").(int)))
	request["PackageVersion"] = StringPointer(strconv.FormatInt(time.Now().Unix(), 10))

	if v, ok := d.GetOk("namespace_id"); ok {
		request["NamespaceId"] = StringPointer(v.(string))
	}

	if v, ok := d.GetOk("vpc_id"); ok {
		request["VpcId"] = StringPointer(v.(string))
	}

	if v, ok := d.GetOk("vswitch_id"); ok {
		request["VSwitchId"] = StringPointer(v.(string))
	}

	if v, ok := d.GetOk("package_url"); ok {
		request["PackageUrl"] = StringPointer(v.(string))
	}

	if v, ok := d.GetOk("image_url"); ok {
		request["ImageUrl"] = StringPointer(v.(string))
	}

	if v, ok := d.GetOk("cpu"); ok {
		request["Cpu"] = StringPointer(strconv.Itoa(v.(int)))
	}

	if v, ok := d.GetOk("memory"); ok {
		request["Memory"] = StringPointer(strconv.Itoa(v.(int)))
	}

	if v, ok := d.GetOk("command"); ok {
		request["Command"] = StringPointer(v.(string))
	}

	if v, ok := d.GetOk("web_container"); ok {
		request["WebContainer"] = StringPointer(v.(string))
	}

	if v, ok := d.GetOk("jdk"); ok {
		request["Jdk"] = StringPointer(v.(string))
	}

	if v, ok := d.GetOk("jar_start_options"); ok {
		request["JarStartOptions"] = StringPointer(v.(string))
	}

	if v, ok := d.GetOk("jar_start_args"); ok {
		request["JarStartArgs"] = StringPointer(v.(string))
	}

	if v, ok := d.GetOk("app_description"); ok {
		request["AppDescription"] = StringPointer(v.(string))
	}

	if v, ok := d.GetOkExists("auto_config"); ok {
		request["AutoConfig"] = StringPointer(strconv.FormatBool(v.(bool)))
	}

	if v, ok := d.GetOkExists("deploy"); ok {
		request["Deploy"] = StringPointer(strconv.FormatBool(v.(bool)))
	}

	if v, ok := d.GetOk("edas_container_version"); ok {
		request["EdasContainerVersion"] = StringPointer(v.(string))
	}

	if v, ok := d.GetOk("oss_ak_id"); ok {
		request["OssAkId"] = StringPointer(v.(string))
	}

	if v, ok := d.GetOk("oss_ak_secret"); ok {
		request["OssAkSecret"] = StringPointer(v.(string))
	}

	if v, ok := d.GetOk("php_arms_config_location"); ok {
		request["PhpArmsConfigLocation"] = StringPointer(v.(string))
	}

	if v, ok := d.GetOk("php_config"); ok {
		request["PhpConfig"] = StringPointer(v.(string))
	}

	if v, ok := d.GetOk("php_config_location"); ok {
		request["PhpConfigLocation"] = StringPointer(v.(string))
	}

	if v, ok := d.GetOk("security_group_id"); ok {
		request["SecurityGroupId"] = StringPointer(v.(string))
	}

	if v, ok := d.GetOk("termination_grace_period_seconds"); ok {
		request["TerminationGracePeriodSeconds"] = StringPointer(strconv.Itoa(v.(int)))
	}

	if v, ok := d.GetOk("timezone"); ok {
		request["Timezone"] = StringPointer(v.(string))
	}

	if v, ok := d.GetOk("war_start_options"); ok {
		request["WarStartOptions"] = StringPointer(v.(string))
	}

	if v, ok := d.GetOk("acr_instance_id"); ok {
		request["AcrInstanceId"] = StringPointer(v.(string))
	}

	if v, ok := d.GetOk("acr_assume_role_arn"); ok {
		request["AcrAssumeRoleArn"] = StringPointer(v.(string))
	}

	if v, ok := d.GetOk("micro_registration"); ok {
		request["MicroRegistration"] = StringPointer(v.(string))
	}

	if v, ok := d.GetOk("envs"); ok {
		request["Envs"] = StringPointer(v.(string))
	}

	if v, ok := d.GetOk("sls_configs"); ok {
		request["SlsConfigs"] = StringPointer(v.(string))
	}

	if v, ok := d.GetOk("php"); ok {
		request["Php"] = StringPointer(v.(string))
	}

	if v, ok := d.GetOk("image_pull_secrets"); ok {
		request["ImagePullSecrets"] = StringPointer(v.(string))
	}

	if v, ok := d.GetOk("programming_language"); ok {
		request["ProgrammingLanguage"] = StringPointer(v.(string))
	}

	if v, ok := d.GetOk("command_args_v2"); ok {
		request["CommandArgs"] = StringPointer(convertListToJsonString(v.([]interface{})))
	} else if v, ok := d.GetOk("command_args"); ok {
		request["CommandArgs"] = StringPointer(v.(string))
	}

	if v, ok := d.GetOk("custom_host_alias_v2"); ok {
		customHostAliasMaps := make([]map[string]interface{}, 0)
		for _, customHostAlias := range v.([]interface{}) {
			customHostAliasMap := map[string]interface{}{}
			customHostAliasArg := customHostAlias.(map[string]interface{})

			if hostName, ok := customHostAliasArg["host_name"]; ok && hostName.(string) != "" {
				customHostAliasMap["hostName"] = hostName
			}

			if ip, ok := customHostAliasArg["ip"]; ok && ip.(string) != "" {
				customHostAliasMap["ip"] = ip
			}

			customHostAliasMaps = append(customHostAliasMaps, customHostAliasMap)
		}

		customHostAliasJson, err := convertListMapToJsonString(customHostAliasMaps)
		if err != nil {
			return WrapError(err)
		}

		request["CustomHostAlias"] = StringPointer(customHostAliasJson)
	} else if v, ok := d.GetOk("custom_host_alias"); ok {
		request["CustomHostAlias"] = StringPointer(v.(string))
	}

	if v, ok := d.GetOk("oss_mount_descs_v2"); ok {
		ossMountDescsMaps := make([]map[string]interface{}, 0)
		for _, ossMountDescs := range v.([]interface{}) {
			ossMountDescsMap := map[string]interface{}{}
			ossMountDescsArg := ossMountDescs.(map[string]interface{})

			if bucketName, ok := ossMountDescsArg["bucket_name"]; ok && bucketName.(string) != "" {
				ossMountDescsMap["bucketName"] = bucketName
			}

			if bucketPath, ok := ossMountDescsArg["bucket_path"]; ok && bucketPath.(string) != "" {
				ossMountDescsMap["bucketPath"] = bucketPath
			}

			if mountPath, ok := ossMountDescsArg["mount_path"]; ok && mountPath.(string) != "" {
				ossMountDescsMap["mountPath"] = mountPath
			}

			if readOnly, ok := ossMountDescsArg["read_only"]; ok {
				ossMountDescsMap["readOnly"] = readOnly
			}

			ossMountDescsMaps = append(ossMountDescsMaps, ossMountDescsMap)
		}

		ossMountDescsJson, err := convertListMapToJsonString(ossMountDescsMaps)
		if err != nil {
			return WrapError(err)
		}

		request["OssMountDescs"] = StringPointer(ossMountDescsJson)
	} else if v, ok := d.GetOk("oss_mount_descs"); ok {
		request["OssMountDescs"] = StringPointer(v.(string))
	}

	if v, ok := d.GetOk("config_map_mount_desc_v2"); ok {
		configMapMountDescMaps := make([]map[string]interface{}, 0)
		for _, configMapMountDesc := range v.([]interface{}) {
			configMapMountDescMap := map[string]interface{}{}
			configMapMountDescArg := configMapMountDesc.(map[string]interface{})

			if configMapId, ok := configMapMountDescArg["config_map_id"]; ok && configMapId.(string) != "" {
				configMapMountDescMap["configMapId"] = configMapId
			}

			if mountPath, ok := configMapMountDescArg["mount_path"]; ok && mountPath.(string) != "" {
				configMapMountDescMap["mountPath"] = mountPath
			}

			if key, ok := configMapMountDescArg["key"]; ok && key.(string) != "" {
				configMapMountDescMap["key"] = key
			}

			configMapMountDescMaps = append(configMapMountDescMaps, configMapMountDescMap)
		}

		configMapMountDescJson, err := convertListMapToJsonString(configMapMountDescMaps)
		if err != nil {
			return WrapError(err)
		}

		request["ConfigMapMountDesc"] = StringPointer(configMapMountDescJson)
	} else if v, ok := d.GetOk("config_map_mount_desc"); ok {
		request["ConfigMapMountDesc"] = StringPointer(v.(string))
	}

	if v, ok := d.GetOk("liveness_v2"); ok {
		livenessMap := map[string]interface{}{}
		for _, livenessList := range v.([]interface{}) {
			livenessArg := livenessList.(map[string]interface{})

			if initialDelaySeconds, ok := livenessArg["initial_delay_seconds"]; ok {
				livenessMap["initialDelaySeconds"] = initialDelaySeconds
			}

			if periodSeconds, ok := livenessArg["period_seconds"]; ok {
				livenessMap["periodSeconds"] = periodSeconds
			}

			if timeoutSeconds, ok := livenessArg["timeout_seconds"]; ok {
				livenessMap["timeoutSeconds"] = timeoutSeconds
			}

			if exec, ok := livenessArg["exec"]; ok && len(exec.([]interface{})) > 0 {
				execMap := map[string]interface{}{}
				for _, execList := range exec.([]interface{}) {
					execArg := execList.(map[string]interface{})

					if command, ok := execArg["command"]; ok {
						execMap["command"] = command
					}
				}

				livenessMap["exec"] = execMap
			}

			if tcpSocket, ok := livenessArg["tcp_socket"]; ok && len(tcpSocket.([]interface{})) > 0 {
				tcpSocketMap := map[string]interface{}{}
				for _, tcpSocketList := range tcpSocket.([]interface{}) {
					tcpSocketArg := tcpSocketList.(map[string]interface{})

					if port, ok := tcpSocketArg["port"]; ok {
						tcpSocketMap["port"] = port
					}
				}

				livenessMap["tcpSocket"] = tcpSocketMap
			}

			if httpGet, ok := livenessArg["http_get"]; ok && len(httpGet.([]interface{})) > 0 {
				httpGetMap := map[string]interface{}{}
				for _, httpGetList := range httpGet.([]interface{}) {
					httpGetArg := httpGetList.(map[string]interface{})

					if path, ok := httpGetArg["path"]; ok && path.(string) != "" {
						httpGetMap["path"] = path
					}

					if port, ok := httpGetArg["port"]; ok {
						httpGetMap["port"] = port
					}

					if scheme, ok := httpGetArg["scheme"]; ok && scheme.(string) != "" {
						httpGetMap["scheme"] = scheme
					}

					if keyWord, ok := httpGetArg["key_word"]; ok && keyWord.(string) != "" {
						httpGetMap["keyWord"] = keyWord

						if isContainKeyWord, ok := d.GetOkExists("liveness_v2.0.http_get.0.is_contain_key_word"); ok {
							httpGetMap["isContainKeyWord"] = isContainKeyWord
						}
					}
				}

				livenessMap["httpGet"] = httpGetMap
			}
		}

		livenessJson, err := convertMaptoJsonString(livenessMap)
		if err != nil {
			return WrapError(err)
		}

		request["Liveness"] = StringPointer(livenessJson)
	} else if v, ok := d.GetOk("liveness"); ok {
		request["Liveness"] = StringPointer(v.(string))
	}

	if v, ok := d.GetOk("readiness_v2"); ok {
		readinessMap := map[string]interface{}{}
		for _, readinessList := range v.([]interface{}) {
			readinessArg := readinessList.(map[string]interface{})

			if initialDelaySeconds, ok := readinessArg["initial_delay_seconds"]; ok {
				readinessMap["initialDelaySeconds"] = initialDelaySeconds
			}

			if periodSeconds, ok := readinessArg["period_seconds"]; ok {
				readinessMap["periodSeconds"] = periodSeconds
			}

			if timeoutSeconds, ok := readinessArg["timeout_seconds"]; ok {
				readinessMap["timeoutSeconds"] = timeoutSeconds
			}

			if exec, ok := readinessArg["exec"]; ok && len(exec.([]interface{})) > 0 {
				execMap := map[string]interface{}{}
				for _, execList := range exec.([]interface{}) {
					execArg := execList.(map[string]interface{})

					if command, ok := execArg["command"]; ok {
						execMap["command"] = command
					}
				}

				readinessMap["exec"] = execMap
			}

			if tcpSocket, ok := readinessArg["tcp_socket"]; ok && len(tcpSocket.([]interface{})) > 0 {
				tcpSocketMap := map[string]interface{}{}
				for _, tcpSocketList := range tcpSocket.([]interface{}) {
					tcpSocketArg := tcpSocketList.(map[string]interface{})

					if port, ok := tcpSocketArg["port"]; ok {
						tcpSocketMap["port"] = port
					}
				}

				readinessMap["tcpSocket"] = tcpSocketMap
			}

			if httpGet, ok := readinessArg["http_get"]; ok && len(httpGet.([]interface{})) > 0 {
				httpGetMap := map[string]interface{}{}
				for _, httpGetList := range httpGet.([]interface{}) {
					httpGetArg := httpGetList.(map[string]interface{})

					if path, ok := httpGetArg["path"]; ok && path.(string) != "" {
						httpGetMap["path"] = path
					}

					if port, ok := httpGetArg["port"]; ok {
						httpGetMap["port"] = port
					}

					if scheme, ok := httpGetArg["scheme"]; ok && scheme.(string) != "" {
						httpGetMap["scheme"] = scheme
					}

					if keyWord, ok := httpGetArg["key_word"]; ok && keyWord.(string) != "" {
						httpGetMap["keyWord"] = keyWord

						if isContainKeyWord, ok := d.GetOkExists("readiness_v2.0.http_get.0.is_contain_key_word"); ok {
							httpGetMap["isContainKeyWord"] = isContainKeyWord
						}
					}
				}

				readinessMap["httpGet"] = httpGetMap
			}
		}

		readinessJson, err := convertMaptoJsonString(readinessMap)
		if err != nil {
			return WrapError(err)
		}

		request["Readiness"] = StringPointer(readinessJson)

	} else if v, ok := d.GetOk("readiness"); ok {
		request["Readiness"] = StringPointer(v.(string))
	}

	if v, ok := d.GetOk("post_start_v2"); ok {
		postStartMap := map[string]interface{}{}
		for _, postStartList := range v.([]interface{}) {
			postStartArg := postStartList.(map[string]interface{})

			if exec, ok := postStartArg["exec"]; ok && len(exec.([]interface{})) > 0 {
				execMap := map[string]interface{}{}
				for _, execList := range exec.([]interface{}) {
					execArg := execList.(map[string]interface{})

					if command, ok := execArg["command"]; ok {
						execMap["command"] = command
					}
				}

				postStartMap["exec"] = execMap
			}
		}

		postStartJson, err := convertMaptoJsonString(postStartMap)
		if err != nil {
			return WrapError(err)
		}

		request["PostStart"] = StringPointer(postStartJson)
	} else if v, ok := d.GetOk("post_start"); ok {
		request["PostStart"] = StringPointer(v.(string))
	}

	if v, ok := d.GetOk("pre_stop_v2"); ok {
		preStopMap := map[string]interface{}{}
		for _, preStopList := range v.([]interface{}) {
			preStopArg := preStopList.(map[string]interface{})

			if exec, ok := preStopArg["exec"]; ok && len(exec.([]interface{})) > 0 {
				execMap := map[string]interface{}{}
				for _, execList := range exec.([]interface{}) {
					execArg := execList.(map[string]interface{})

					if command, ok := execArg["command"]; ok {
						execMap["command"] = command
					}
				}

				preStopMap["exec"] = execMap
			}
		}

		preStopJson, err := convertMaptoJsonString(preStopMap)
		if err != nil {
			return WrapError(err)
		}

		request["PreStop"] = StringPointer(preStopJson)
	} else if v, ok := d.GetOk("pre_stop"); ok {
		request["PreStop"] = StringPointer(v.(string))
	}

	if v, ok := d.GetOk("tomcat_config_v2"); ok {
		tomcatConfigMap := map[string]interface{}{}
		for _, tomcatConfigList := range v.([]interface{}) {
			tomcatConfigArg := tomcatConfigList.(map[string]interface{})

			if port, ok := tomcatConfigArg["port"]; ok {
				tomcatConfigMap["port"] = port
			}

			if maxThreads, ok := tomcatConfigArg["max_threads"]; ok {
				tomcatConfigMap["maxThreads"] = maxThreads
			}

			if contextPath, ok := tomcatConfigArg["context_path"]; ok && contextPath.(string) != "" {
				tomcatConfigMap["contextPath"] = contextPath
			}

			if uriEncoding, ok := tomcatConfigArg["uri_encoding"]; ok && uriEncoding.(string) != "" {
				tomcatConfigMap["uriEncoding"] = uriEncoding
			}

			if useBodyEncodingForUri, ok := tomcatConfigArg["use_body_encoding_for_uri"]; ok && useBodyEncodingForUri.(string) != "" {
				tomcatConfigMap["useBodyEncodingForUri"] = useBodyEncodingForUri
			}
		}

		tomcatConfigJson, err := convertMaptoJsonString(tomcatConfigMap)
		if err != nil {
			return WrapError(err)
		}

		request["TomcatConfig"] = StringPointer(tomcatConfigJson)
	} else if v, ok := d.GetOk("tomcat_config"); ok {
		request["TomcatConfig"] = StringPointer(v.(string))
	}

	if v, ok := d.GetOk("nas_configs"); ok {
		nasConfigsMaps := make([]map[string]interface{}, 0)
		for _, nasConfigs := range v.([]interface{}) {
			nasConfigsMap := map[string]interface{}{}
			nasConfigsArg := nasConfigs.(map[string]interface{})

			if nasId, ok := nasConfigsArg["nas_id"]; ok && nasId.(string) != "" {
				nasConfigsMap["nasId"] = nasId
			}

			if nasPath, ok := nasConfigsArg["nas_path"]; ok && nasPath.(string) != "" {
				nasConfigsMap["nasPath"] = nasPath
			}

			if mountPath, ok := nasConfigsArg["mount_path"]; ok && mountPath.(string) != "" {
				nasConfigsMap["mountPath"] = mountPath
			}

			if mountDomain, ok := nasConfigsArg["mount_domain"]; ok && mountDomain.(string) != "" {
				nasConfigsMap["mountDomain"] = mountDomain
			}

			if readOnly, ok := nasConfigsArg["read_only"]; ok {
				nasConfigsMap["readOnly"] = readOnly
			}

			nasConfigsMaps = append(nasConfigsMaps, nasConfigsMap)
		}

		nasConfigsJson, err := convertListMapToJsonString(nasConfigsMaps)
		if err != nil {
			return WrapError(err)
		}

		request["NasConfigs"] = StringPointer(nasConfigsJson)
	}

	if v, ok := d.GetOk("kafka_configs"); ok {
		kafkaConfigsMap := map[string]interface{}{}
		for _, kafkaConfigsList := range v.([]interface{}) {
			kafkaConfigsArg := kafkaConfigsList.(map[string]interface{})

			if kafkaInstanceId, ok := kafkaConfigsArg["kafka_instance_id"]; ok && kafkaInstanceId.(string) != "" {
				kafkaConfigsMap["kafkaInstanceId"] = kafkaInstanceId
			}

			if kafkaEndpoint, ok := kafkaConfigsArg["kafka_endpoint"]; ok && kafkaEndpoint.(string) != "" {
				kafkaConfigsMap["kafkaEndpoint"] = kafkaEndpoint
			}

			if kafkaConfigsValue, ok := kafkaConfigsArg["kafka_configs"]; ok && len(kafkaConfigsValue.([]interface{})) > 0 {
				kafkaConfigsValueMaps := make([]map[string]interface{}, 0)
				for _, kafkaConfigsValueList := range kafkaConfigsValue.([]interface{}) {
					kafkaConfigsValueMap := map[string]interface{}{}
					kafkaConfigsValueArg := kafkaConfigsValueList.(map[string]interface{})

					if logType, ok := kafkaConfigsValueArg["log_type"]; ok && logType.(string) != "" {
						kafkaConfigsValueMap["logType"] = logType
					}

					if logDir, ok := kafkaConfigsValueArg["log_dir"]; ok && logDir.(string) != "" {
						kafkaConfigsValueMap["logDir"] = logDir
					}

					if kafkaTopic, ok := kafkaConfigsValueArg["kafka_topic"]; ok && kafkaTopic.(string) != "" {
						kafkaConfigsValueMap["kafkaTopic"] = kafkaTopic
					}

					kafkaConfigsValueMaps = append(kafkaConfigsValueMaps, kafkaConfigsValueMap)
				}

				kafkaConfigsMap["kafkaConfigs"] = kafkaConfigsValueMaps
			}
		}

		kafkaConfigsJson, err := convertMaptoJsonString(kafkaConfigsMap)
		if err != nil {
			return WrapError(err)
		}

		request["KafkaConfigs"] = StringPointer(kafkaConfigsJson)
	}

	if v, ok := d.GetOk("pvtz_discovery_svc"); ok {
		pvtzDiscoverySvcMap := map[string]interface{}{}
		for _, pvtzDiscoverySvcList := range v.([]interface{}) {
			pvtzDiscoverySvcArg := pvtzDiscoverySvcList.(map[string]interface{})

			if serviceName, ok := pvtzDiscoverySvcArg["service_name"]; ok && serviceName.(string) != "" {
				pvtzDiscoverySvcMap["serviceName"] = serviceName
			}

			if namespaceId, ok := pvtzDiscoverySvcArg["namespace_id"]; ok && namespaceId.(string) != "" {
				pvtzDiscoverySvcMap["namespaceId"] = namespaceId
			}

			if enable, ok := pvtzDiscoverySvcArg["enable"]; ok {
				pvtzDiscoverySvcMap["enable"] = enable
			}

			if portProtocols, ok := pvtzDiscoverySvcArg["port_protocols"]; ok && len(portProtocols.([]interface{})) > 0 {
				portProtocolsMaps := make([]map[string]interface{}, 0)
				for _, portProtocolsList := range portProtocols.([]interface{}) {
					portProtocolsMap := map[string]interface{}{}
					portProtocolsArg := portProtocolsList.(map[string]interface{})

					if port, ok := portProtocolsArg["port"]; ok {
						portProtocolsMap["port"] = port
					}

					if protocol, ok := portProtocolsArg["protocol"]; ok && protocol.(string) != "" {
						portProtocolsMap["protocol"] = protocol
					}

					portProtocolsMaps = append(portProtocolsMaps, portProtocolsMap)
				}

				pvtzDiscoverySvcMap["portProtocols"] = portProtocolsMaps
			}
		}

		pvtzDiscoverySvcJson, err := convertMaptoJsonString(pvtzDiscoverySvcMap)
		if err != nil {
			return WrapError(err)
		}

		request["PvtzDiscoverySvc"] = StringPointer(pvtzDiscoverySvcJson)
	}

	wait := incrementalWait(3*time.Second, 3*time.Second)
	err = resource.Retry(client.GetRetryTimeout(d.Timeout(schema.TimeoutCreate)), func() *resource.RetryError {
		response, err = client.RoaPost("sae", "2019-05-06", action, request, nil, nil, true)
		if err != nil {
			if NeedRetry(err) {
				wait()
				return resource.RetryableError(err)
			}
			return resource.NonRetryableError(err)
		}
		return nil
	})
	addDebug(action, response, request)

	if err != nil {
		return WrapErrorf(err, DefaultErrorMsg, "alicloud_sae_application", "POST "+action, AlibabaCloudSdkGoERROR)
	}
	responseData := response["Data"].(map[string]interface{})
	d.SetId(fmt.Sprint(responseData["AppId"]))

	stateConf := BuildStateConf([]string{}, []string{"2", "8", "11", "12"}, d.Timeout(schema.TimeoutCreate), 3*time.Second, saeService.SaeApplicationChangeOrderStateRefreshFunc(fmt.Sprint(responseData["ChangeOrderId"]), []string{}))
	if _, err := stateConf.WaitForState(); err != nil {
		return WrapErrorf(err, IdMsg, d.Id())
	}

	return resourceAliCloudSaeApplicationUpdate(d, meta)
}