func resourceAliCloudOssBucketWebsiteUpdate()

in alicloud/resource_alicloud_oss_bucket_website.go [1120:1519]


func resourceAliCloudOssBucketWebsiteUpdate(d *schema.ResourceData, meta interface{}) error {
	client := meta.(*connectivity.AliyunClient)
	var request map[string]interface{}
	var response map[string]interface{}
	var query map[string]*string
	var body map[string]interface{}
	update := false

	action := fmt.Sprintf("/?website")
	var err error
	request = make(map[string]interface{})
	query = make(map[string]*string)
	body = make(map[string]interface{})
	hostMap := make(map[string]*string)
	hostMap["bucket"] = StringPointer(d.Id())

	objectDataLocalMap := make(map[string]interface{})

	if d.HasChange("routing_rules") {
		update = true
	}
	if v := d.Get("routing_rules"); !IsNil(v) {
		routingRules := make(map[string]interface{})
		if v, ok := d.GetOk("routing_rules"); ok {
			localData, err := jsonpath.Get("$[0].routing_rule", v)
			if err != nil {
				localData = make([]interface{}, 0)
			}
			localMaps := make([]interface{}, 0)
			for _, dataLoop := range localData.([]interface{}) {
				dataLoopTmp := make(map[string]interface{})
				if dataLoop != nil {
					dataLoopTmp = dataLoop.(map[string]interface{})
				}
				dataLoopMap := make(map[string]interface{})
				if !IsNil(dataLoopTmp["lua_config"]) {
					localData1 := make(map[string]interface{})
					script1, _ := jsonpath.Get("$[0].script", dataLoopTmp["lua_config"])
					if script1 != nil && script1 != "" {
						localData1["Script"] = script1
					}
					dataLoopMap["LuaConfig"] = localData1
				}
				if !IsNil(dataLoopTmp["redirect"]) {
					localData2 := make(map[string]interface{})
					mirrorMultiAlternates := make(map[string]interface{})
					if v, ok := dataLoopTmp["redirect"]; ok {
						localData3, err := jsonpath.Get("$[0].mirror_multi_alternates[0].mirror_multi_alternate", v)
						if err != nil {
							localData3 = make([]interface{}, 0)
						}
						localMaps3 := make([]interface{}, 0)
						for _, dataLoop3 := range localData3.([]interface{}) {
							dataLoop3Tmp := make(map[string]interface{})
							if dataLoop3 != nil {
								dataLoop3Tmp = dataLoop3.(map[string]interface{})
							}
							dataLoop3Map := make(map[string]interface{})
							dataLoop3Map["MirrorMultiAlternateNumber"] = dataLoop3Tmp["mirror_multi_alternate_number"]
							dataLoop3Map["MirrorMultiAlternateURL"] = dataLoop3Tmp["mirror_multi_alternate_url"]
							dataLoop3Map["MirrorMultiAlternateVpcId"] = dataLoop3Tmp["mirror_multi_alternate_vpc_id"]
							dataLoop3Map["MirrorMultiAlternateDstRegion"] = dataLoop3Tmp["mirror_multi_alternate_dst_region"]
							localMaps3 = append(localMaps3, dataLoop3Map)
						}
						mirrorMultiAlternates["MirrorMultiAlternate"] = localMaps3
					}

					localData2["MirrorMultiAlternates"] = mirrorMultiAlternates
					mirrorAuth := make(map[string]interface{})
					accessKeySecret1, _ := jsonpath.Get("$[0].mirror_auth[0].access_key_secret", dataLoopTmp["redirect"])
					if accessKeySecret1 != nil && accessKeySecret1 != "" {
						mirrorAuth["AccessKeySecret"] = accessKeySecret1
					}
					accessKeyId1, _ := jsonpath.Get("$[0].mirror_auth[0].access_key_id", dataLoopTmp["redirect"])
					if accessKeyId1 != nil && accessKeyId1 != "" {
						mirrorAuth["AccessKeyId"] = accessKeyId1
					}
					authType1, _ := jsonpath.Get("$[0].mirror_auth[0].auth_type", dataLoopTmp["redirect"])
					if authType1 != nil && authType1 != "" {
						mirrorAuth["AuthType"] = authType1
					}
					region1, _ := jsonpath.Get("$[0].mirror_auth[0].region", dataLoopTmp["redirect"])
					if region1 != nil && region1 != "" {
						mirrorAuth["Region"] = region1
					}

					localData2["MirrorAuth"] = mirrorAuth
					mirrorReturnHeaders := make(map[string]interface{})
					if v, ok := dataLoopTmp["redirect"]; ok {
						localData4, err := jsonpath.Get("$[0].mirror_return_headers[0].return_header", v)
						if err != nil {
							localData4 = make([]interface{}, 0)
						}
						localMaps4 := make([]interface{}, 0)
						for _, dataLoop4 := range localData4.([]interface{}) {
							dataLoop4Tmp := make(map[string]interface{})
							if dataLoop4 != nil {
								dataLoop4Tmp = dataLoop4.(map[string]interface{})
							}
							dataLoop4Map := make(map[string]interface{})
							dataLoop4Map["Value"] = dataLoop4Tmp["value"]
							dataLoop4Map["Key"] = dataLoop4Tmp["key"]
							localMaps4 = append(localMaps4, dataLoop4Map)
						}
						mirrorReturnHeaders["ReturnHeader"] = localMaps4
					}

					localData2["MirrorReturnHeaders"] = mirrorReturnHeaders
					mirrorTaggings := make(map[string]interface{})
					if v, ok := dataLoopTmp["redirect"]; ok {
						localData5, err := jsonpath.Get("$[0].mirror_taggings[0].taggings", v)
						if err != nil {
							localData5 = make([]interface{}, 0)
						}
						localMaps5 := make([]interface{}, 0)
						for _, dataLoop5 := range localData5.([]interface{}) {
							dataLoop5Tmp := make(map[string]interface{})
							if dataLoop5 != nil {
								dataLoop5Tmp = dataLoop5.(map[string]interface{})
							}
							dataLoop5Map := make(map[string]interface{})
							dataLoop5Map["Key"] = dataLoop5Tmp["key"]
							dataLoop5Map["Value"] = dataLoop5Tmp["value"]
							localMaps5 = append(localMaps5, dataLoop5Map)
						}
						mirrorTaggings["Taggings"] = localMaps5
					}

					localData2["MirrorTaggings"] = mirrorTaggings
					mirrorAsyncStatus1, _ := jsonpath.Get("$[0].mirror_async_status", dataLoopTmp["redirect"])
					if mirrorAsyncStatus1 != nil && mirrorAsyncStatus1 != "" {
						localData2["MirrorAsyncStatus"] = mirrorAsyncStatus1
					}
					transparentMirrorResponseCodes1, _ := jsonpath.Get("$[0].transparent_mirror_response_codes", dataLoopTmp["redirect"])
					if transparentMirrorResponseCodes1 != nil && transparentMirrorResponseCodes1 != "" {
						localData2["TransparentMirrorResponseCodes"] = transparentMirrorResponseCodes1
					}
					mirrorAllowHeadObject1, _ := jsonpath.Get("$[0].mirror_allow_head_object", dataLoopTmp["redirect"])
					if mirrorAllowHeadObject1 != nil && mirrorAllowHeadObject1 != "" {
						localData2["MirrorAllowHeadObject"] = mirrorAllowHeadObject1
					}
					mirrorRole1, _ := jsonpath.Get("$[0].mirror_role", dataLoopTmp["redirect"])
					if mirrorRole1 != nil && mirrorRole1 != "" {
						localData2["MirrorRole"] = mirrorRole1
					}
					mirrorUsingRole1, _ := jsonpath.Get("$[0].mirror_using_role", dataLoopTmp["redirect"])
					if mirrorUsingRole1 != nil && mirrorUsingRole1 != "" {
						localData2["MirrorUsingRole"] = mirrorUsingRole1
					}
					mirrorTunnelId1, _ := jsonpath.Get("$[0].mirror_tunnel_id", dataLoopTmp["redirect"])
					if mirrorTunnelId1 != nil && mirrorTunnelId1 != "" {
						localData2["MirrorTunnelId"] = mirrorTunnelId1
					}
					mirrorSwitchAllErrors1, _ := jsonpath.Get("$[0].mirror_switch_all_errors", dataLoopTmp["redirect"])
					if mirrorSwitchAllErrors1 != nil && mirrorSwitchAllErrors1 != "" {
						localData2["MirrorSwitchAllErrors"] = mirrorSwitchAllErrors1
					}
					mirrorUserLastModified1, _ := jsonpath.Get("$[0].mirror_user_last_modified", dataLoopTmp["redirect"])
					if mirrorUserLastModified1 != nil && mirrorUserLastModified1 != "" {
						localData2["MirrorUserLastModified"] = mirrorUserLastModified1
					}
					mirrorDstSlaveVpcId1, _ := jsonpath.Get("$[0].mirror_dst_slave_vpc_id", dataLoopTmp["redirect"])
					if mirrorDstSlaveVpcId1 != nil && mirrorDstSlaveVpcId1 != "" {
						localData2["MirrorDstSlaveVpcId"] = mirrorDstSlaveVpcId1
					}
					mirrorDstVpcId1, _ := jsonpath.Get("$[0].mirror_dst_vpc_id", dataLoopTmp["redirect"])
					if mirrorDstVpcId1 != nil && mirrorDstVpcId1 != "" {
						localData2["MirrorDstVpcId"] = mirrorDstVpcId1
					}
					mirrorDstRegion1, _ := jsonpath.Get("$[0].mirror_dst_region", dataLoopTmp["redirect"])
					if mirrorDstRegion1 != nil && mirrorDstRegion1 != "" {
						localData2["MirrorDstRegion"] = mirrorDstRegion1
					}
					mirrorIsExpressTunnel1, _ := jsonpath.Get("$[0].mirror_is_express_tunnel", dataLoopTmp["redirect"])
					if mirrorIsExpressTunnel1 != nil && mirrorIsExpressTunnel1 != "" {
						localData2["MirrorIsExpressTunnel"] = mirrorIsExpressTunnel1
					}
					mirrorAllowVideoSnapshot1, _ := jsonpath.Get("$[0].mirror_allow_video_snapshot", dataLoopTmp["redirect"])
					if mirrorAllowVideoSnapshot1 != nil && mirrorAllowVideoSnapshot1 != "" {
						localData2["MirrorAllowVideoSnapshot"] = mirrorAllowVideoSnapshot1
					}
					mirrorAllowGetImageInfo1, _ := jsonpath.Get("$[0].mirror_allow_get_image_info", dataLoopTmp["redirect"])
					if mirrorAllowGetImageInfo1 != nil && mirrorAllowGetImageInfo1 != "" {
						localData2["MirrorAllowGetImageInfo"] = mirrorAllowGetImageInfo1
					}
					mirrorProxyPass1, _ := jsonpath.Get("$[0].mirror_proxy_pass", dataLoopTmp["redirect"])
					if mirrorProxyPass1 != nil && mirrorProxyPass1 != "" {
						localData2["MirrorProxyPass"] = mirrorProxyPass1
					}
					mirrorSaveOssMeta1, _ := jsonpath.Get("$[0].mirror_save_oss_meta", dataLoopTmp["redirect"])
					if mirrorSaveOssMeta1 != nil && mirrorSaveOssMeta1 != "" {
						localData2["MirrorSaveOssMeta"] = mirrorSaveOssMeta1
					}
					mirrorUrlProbe, _ := jsonpath.Get("$[0].mirror_url_probe", dataLoopTmp["redirect"])
					if mirrorUrlProbe != nil && mirrorUrlProbe != "" {
						localData2["MirrorURLProbe"] = mirrorUrlProbe
					}
					mirrorUrlSlave, _ := jsonpath.Get("$[0].mirror_url_slave", dataLoopTmp["redirect"])
					if mirrorUrlSlave != nil && mirrorUrlSlave != "" {
						localData2["MirrorURLSlave"] = mirrorUrlSlave
					}
					mirrorUrl, _ := jsonpath.Get("$[0].mirror_url", dataLoopTmp["redirect"])
					if mirrorUrl != nil && mirrorUrl != "" {
						localData2["MirrorURL"] = mirrorUrl
					}
					mirrorSni, _ := jsonpath.Get("$[0].mirror_sni", dataLoopTmp["redirect"])
					if mirrorSni != nil && mirrorSni != "" {
						localData2["MirrorSNI"] = mirrorSni
					}
					mirrorPassOriginalSlashes1, _ := jsonpath.Get("$[0].mirror_pass_original_slashes", dataLoopTmp["redirect"])
					if mirrorPassOriginalSlashes1 != nil && mirrorPassOriginalSlashes1 != "" {
						localData2["MirrorPassOriginalSlashes"] = mirrorPassOriginalSlashes1
					}
					httpRedirectCode1, _ := jsonpath.Get("$[0].http_redirect_code", dataLoopTmp["redirect"])
					if httpRedirectCode1 != nil && httpRedirectCode1 != "" {
						localData2["HttpRedirectCode"] = httpRedirectCode1
					}
					replaceKeyWith1, _ := jsonpath.Get("$[0].replace_key_with", dataLoopTmp["redirect"])
					if replaceKeyWith1 != nil && replaceKeyWith1 != "" {
						localData2["ReplaceKeyWith"] = replaceKeyWith1
					}
					enableReplacePrefix1, _ := jsonpath.Get("$[0].enable_replace_prefix", dataLoopTmp["redirect"])
					if enableReplacePrefix1 != nil && enableReplacePrefix1 != "" {
						localData2["EnableReplacePrefix"] = enableReplacePrefix1
					}
					replaceKeyPrefixWith1, _ := jsonpath.Get("$[0].replace_key_prefix_with", dataLoopTmp["redirect"])
					if replaceKeyPrefixWith1 != nil && replaceKeyPrefixWith1 != "" {
						localData2["ReplaceKeyPrefixWith"] = replaceKeyPrefixWith1
					}
					hostName1, _ := jsonpath.Get("$[0].host_name", dataLoopTmp["redirect"])
					if hostName1 != nil && hostName1 != "" {
						localData2["HostName"] = hostName1
					}
					protocol1, _ := jsonpath.Get("$[0].protocol", dataLoopTmp["redirect"])
					if protocol1 != nil && protocol1 != "" {
						localData2["Protocol"] = protocol1
					}
					mirrorHeaders := make(map[string]interface{})
					if v, ok := dataLoopTmp["redirect"]; ok {
						localData6, err := jsonpath.Get("$[0].mirror_headers[0].set", v)
						if err != nil {
							localData6 = make([]interface{}, 0)
						}
						localMaps6 := make([]interface{}, 0)
						for _, dataLoop6 := range localData6.([]interface{}) {
							dataLoop6Tmp := make(map[string]interface{})
							if dataLoop6 != nil {
								dataLoop6Tmp = dataLoop6.(map[string]interface{})
							}
							dataLoop6Map := make(map[string]interface{})
							dataLoop6Map["Key"] = dataLoop6Tmp["key"]
							dataLoop6Map["Value"] = dataLoop6Tmp["value"]
							localMaps6 = append(localMaps6, dataLoop6Map)
						}
						mirrorHeaders["Set"] = localMaps6
					}

					remove1, _ := jsonpath.Get("$[0].mirror_headers[0].remove", dataLoopTmp["redirect"])
					if remove1 != nil && remove1 != "" {
						mirrorHeaders["Remove"] = remove1
					}
					pass1, _ := jsonpath.Get("$[0].mirror_headers[0].pass", dataLoopTmp["redirect"])
					if pass1 != nil && pass1 != "" {
						mirrorHeaders["Pass"] = pass1
					}
					passAll1, _ := jsonpath.Get("$[0].mirror_headers[0].pass_all", dataLoopTmp["redirect"])
					if passAll1 != nil && passAll1 != "" {
						mirrorHeaders["PassAll"] = passAll1
					}

					localData2["MirrorHeaders"] = mirrorHeaders
					mirrorCheckMd51, _ := jsonpath.Get("$[0].mirror_check_md5", dataLoopTmp["redirect"])
					if mirrorCheckMd51 != nil && mirrorCheckMd51 != "" {
						localData2["MirrorCheckMd5"] = mirrorCheckMd51
					}
					mirrorFollowRedirect1, _ := jsonpath.Get("$[0].mirror_follow_redirect", dataLoopTmp["redirect"])
					if mirrorFollowRedirect1 != nil && mirrorFollowRedirect1 != "" {
						localData2["MirrorFollowRedirect"] = mirrorFollowRedirect1
					}
					mirrorPassQueryString1, _ := jsonpath.Get("$[0].mirror_pass_query_string", dataLoopTmp["redirect"])
					if mirrorPassQueryString1 != nil && mirrorPassQueryString1 != "" {
						localData2["MirrorPassQueryString"] = mirrorPassQueryString1
					}
					passQueryString1, _ := jsonpath.Get("$[0].pass_query_string", dataLoopTmp["redirect"])
					if passQueryString1 != nil && passQueryString1 != "" {
						localData2["PassQueryString"] = passQueryString1
					}
					redirectType1, _ := jsonpath.Get("$[0].redirect_type", dataLoopTmp["redirect"])
					if redirectType1 != nil && redirectType1 != "" {
						localData2["RedirectType"] = redirectType1
					}
					dataLoopMap["Redirect"] = localData2
				}
				if !IsNil(dataLoopTmp["condition"]) {
					localData7 := make(map[string]interface{})
					if v, ok := dataLoopTmp["condition"]; ok {
						localData8, err := jsonpath.Get("$[0].include_headers", v)
						if err != nil {
							localData8 = make([]interface{}, 0)
						}
						localMaps8 := make([]interface{}, 0)
						for _, dataLoop8 := range localData8.([]interface{}) {
							dataLoop8Tmp := make(map[string]interface{})
							if dataLoop8 != nil {
								dataLoop8Tmp = dataLoop8.(map[string]interface{})
							}
							dataLoop8Map := make(map[string]interface{})
							dataLoop8Map["EndsWith"] = dataLoop8Tmp["ends_with"]
							dataLoop8Map["StartsWith"] = dataLoop8Tmp["starts_with"]
							dataLoop8Map["Equals"] = dataLoop8Tmp["equals"]
							dataLoop8Map["Key"] = dataLoop8Tmp["key"]
							localMaps8 = append(localMaps8, dataLoop8Map)
						}
						localData7["IncludeHeader"] = localMaps8
					}

					httpErrorCodeReturnedEquals1, _ := jsonpath.Get("$[0].http_error_code_returned_equals", dataLoopTmp["condition"])
					if httpErrorCodeReturnedEquals1 != nil && httpErrorCodeReturnedEquals1 != "" {
						localData7["HttpErrorCodeReturnedEquals"] = httpErrorCodeReturnedEquals1
					}
					keySuffixEquals1, _ := jsonpath.Get("$[0].key_suffix_equals", dataLoopTmp["condition"])
					if keySuffixEquals1 != nil && keySuffixEquals1 != "" {
						localData7["KeySuffixEquals"] = keySuffixEquals1
					}
					keyPrefixEquals1, _ := jsonpath.Get("$[0].key_prefix_equals", dataLoopTmp["condition"])
					if keyPrefixEquals1 != nil && keyPrefixEquals1 != "" {
						localData7["KeyPrefixEquals"] = keyPrefixEquals1
					}
					dataLoopMap["Condition"] = localData7
				}
				dataLoopMap["RuleNumber"] = dataLoopTmp["rule_number"]
				localMaps = append(localMaps, dataLoopMap)
			}
			routingRules["RoutingRule"] = localMaps
		}

		objectDataLocalMap["RoutingRules"] = routingRules
	}

	if d.HasChange("error_document") {
		update = true
	}
	if v := d.Get("error_document"); !IsNil(v) {
		errorDocument := make(map[string]interface{})
		httpStatus1, _ := jsonpath.Get("$[0].http_status", v)
		if httpStatus1 != nil && (d.HasChange("error_document.0.http_status") || httpStatus1 != "") {
			errorDocument["HttpStatus"] = httpStatus1
		}
		key9, _ := jsonpath.Get("$[0].key", v)
		if key9 != nil && (d.HasChange("error_document.0.key") || key9 != "") {
			errorDocument["Key"] = key9
		}

		objectDataLocalMap["ErrorDocument"] = errorDocument
	}

	if d.HasChange("index_document") {
		update = true
	}
	if v := d.Get("index_document"); !IsNil(v) {
		indexDocument := make(map[string]interface{})
		type1, _ := jsonpath.Get("$[0].type", v)
		if type1 != nil && (d.HasChange("index_document.0.type") || type1 != "") {
			indexDocument["Type"] = type1
		}
		suffix1, _ := jsonpath.Get("$[0].suffix", v)
		if suffix1 != nil && (d.HasChange("index_document.0.suffix") || suffix1 != "") {
			indexDocument["Suffix"] = suffix1
		}
		supportSubDir1, _ := jsonpath.Get("$[0].support_sub_dir", v)
		if supportSubDir1 != nil && (d.HasChange("index_document.0.support_sub_dir") || supportSubDir1 != "") {
			indexDocument["SupportSubDir"] = supportSubDir1
		}

		objectDataLocalMap["IndexDocument"] = indexDocument
	}

	request["WebsiteConfiguration"] = objectDataLocalMap
	body = request
	if update {
		wait := incrementalWait(3*time.Second, 5*time.Second)
		err = resource.Retry(d.Timeout(schema.TimeoutUpdate), func() *resource.RetryError {
			response, err = client.Do("Oss", xmlParam("PUT", "2019-05-17", "PutBucketWebsite", action), query, body, nil, hostMap, false)
			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, d.Id(), action, AlibabaCloudSdkGoERROR)
		}
	}

	return resourceAliCloudOssBucketWebsiteRead(d, meta)
}