alibabacloudstack/resource_apsarastack_edas_k8s_service.go (286 lines of code) (raw):
package alibabacloudstack
import (
"encoding/json"
"fmt"
"strconv"
"strings"
"github.com/aliyun/terraform-provider-alibabacloudstack/alibabacloudstack/connectivity"
"github.com/aliyun/terraform-provider-alibabacloudstack/alibabacloudstack/errmsgs"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation"
)
func resourceAlibabacloudStackEdasK8sService() *schema.Resource {
resource := &schema.Resource{
Schema: map[string]*schema.Schema{
"app_id": {
Type: schema.TypeString,
Required: true,
ForceNew: true,
},
"service_name": {
Type: schema.TypeString,
Required: true,
},
"type": {
Type: schema.TypeString,
Optional: true,
Default: "ClusterIP",
ValidateFunc: validation.StringInSlice([]string{"ClusterIP", "NodePort", "LoadBalancer"}, false),
},
"port_mappings": {
Type: schema.TypeList,
Optional: true,
Computed: true,
Elem: &schema.Resource{
Schema: map[string]*schema.Schema{
"protocol": {
Type: schema.TypeString,
Optional: true,
ValidateFunc: validation.StringInSlice([]string{"TCP", "UDP"}, false),
},
"service_port": {
Type: schema.TypeInt,
Optional: true,
Computed: true,
},
"target_port": {
Type: schema.TypeInt,
Optional: true,
Computed: true,
},
},
},
},
"annotations": {
Type: schema.TypeMap,
Optional: true,
Computed: true,
},
"labels": {
Type: schema.TypeMap,
Optional: true,
},
"external_traffic_policy": {
Type: schema.TypeString,
Optional: true,
Computed: true,
ValidateFunc: validation.StringInSlice([]string{"Local", "Cluster"}, false),
},
"cluster_ip": {
Type: schema.TypeString,
Computed: true,
},
"inner_endpointer": {
Type: schema.TypeString,
Computed: true,
},
"namespace": {
Type: schema.TypeString,
Computed: true,
},
"nodeip_list": {
Type: schema.TypeList,
Computed: true,
Elem: &schema.Schema{Type: schema.TypeString},
},
"allow_edit": {
Type: schema.TypeBool,
Computed: true,
},
},
}
setResourceFunc(resource, resourceAlibabacloudStackEdasK8sServiceCreate, resourceAlibabacloudStackEdasK8sServiceRead, resourceAlibabacloudStackEdasK8sServiceUpdate, resourceAlibabacloudStackEdasK8sServiceDelete)
return resource
}
func resourceAlibabacloudStackEdasK8sServiceCreate(d *schema.ResourceData, meta interface{}) error {
client := meta.(*connectivity.AlibabacloudStackClient)
edasService := EdasService{client}
service_type := d.Get("type").(string)
request := client.NewCommonRequest("POST", "Edas", "2017-08-01", "CreateK8sService", "/pop/v5/k8s/service/service")
request.QueryParams["AppId"] = d.Get("app_id").(string)
request.QueryParams["Act"] = "1" // 创建接口默认值
request.QueryParams["ServiceName"] = d.Get("service_name").(string)
request.QueryParams["Type"] = service_type
port_mappings := d.Get("port_mappings").([]interface{})
k8s_port_mappings, err := edasService.GetK8sServicePorts(port_mappings)
if err != nil {
return errmsgs.WrapError(err)
}
request.QueryParams["PortMappingsStrs"] = k8s_port_mappings
if service_type != "ClusterIP" {
request.QueryParams["ExternalTrafficPolicy"] = d.Get("external_traffic_policy").(string)
}
if v, ok := d.GetOk("annotations"); ok {
AnnotationsStrs, err := json.Marshal(v.(map[string]interface{}))
if err != nil {
return errmsgs.WrapError(err)
}
request.QueryParams["AnnotationsStrs"] = string(AnnotationsStrs)
}
if v, ok := d.GetOk("labels"); ok {
labelsStrs, err := json.Marshal(v.(map[string]interface{}))
if err != nil {
return errmsgs.WrapError(err)
}
request.QueryParams["LabelsStrs"] = string(labelsStrs)
}
bresponse, err := client.ProcessCommonRequest(request)
addDebug("CreateK8sService", bresponse, request, request.QueryParams)
if err != nil {
errmsg := ""
if bresponse != nil {
errmsg = errmsgs.GetBaseResponseErrorMessage(bresponse.BaseResponse)
}
return errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, "alibabacloudstack_edas_k8s_application", request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
}
var response map[string]interface{}
err = json.Unmarshal(bresponse.GetHttpContentBytes(), &response)
if fmt.Sprint(response["Code"]) != "200" {
return errmsgs.WrapError(fmt.Errorf("Create edas k8s service failed for %s", response["Message"].(string)))
}
d.SetId(d.Get("app_id").(string) + ":" + d.Get("service_name").(string))
return nil
}
func resourceAlibabacloudStackEdasK8sServiceRead(d *schema.ResourceData, meta interface{}) error {
client := meta.(*connectivity.AlibabacloudStackClient)
edasService := EdasService{client}
id := d.Id()
service, err := edasService.DescribeEdasK8sService(id)
if err != nil {
if errmsgs.NotFoundError(err) {
d.SetId("")
return nil
}
return err
}
d.Set("app_id", strings.Split(id, ":")[0])
d.Set("type", service.Type)
d.Set("service_name", service.ServiceName)
d.Set("allow_edit", service.AllowEdit)
d.Set("inner_endpointer", service.InnerEndpointer)
d.Set("namespace", service.Namespace)
d.Set("nodeip_list", service.NodeIpList)
if service.ExternalTrafficPolicy != "" {
d.Set("external_traffic_policy", service.ExternalTrafficPolicy)
}
port_mappings := make([]map[string]interface{}, 0)
for _, portMappings := range service.PortMappings {
service_port, _ := strconv.Atoi(portMappings.ServicePort)
target_port, _ := strconv.Atoi(portMappings.TargetPort)
port_mappings = append(port_mappings, map[string]interface{}{
"protocol": portMappings.Protocol,
"service_port": service_port,
"target_port": target_port,
})
}
d.Set("port_mappings", port_mappings)
if len(service.Labels) > 0 {
labels := d.Get("labels").(map[string]interface{})
new_labels := make(map[string]interface{})
for k, _ := range labels {
if v, ok := service.Labels[k]; ok {
new_labels[k] = v
}
}
d.Set("labels", new_labels)
}
d.Set("annotations", service.Annotations)
return nil
}
func resourceAlibabacloudStackEdasK8sServiceUpdate(d *schema.ResourceData, meta interface{}) error {
client := meta.(*connectivity.AlibabacloudStackClient)
edasService := EdasService{client}
request := client.NewCommonRequest("PUT", "Edas", "2017-08-01", "UpdateK8sService", "/pop/v5/k8s/acs/k8s_service")
d.Partial(true)
request.QueryParams["AppId"] = d.Get("app_id").(string)
request.QueryParams["Name"] = d.Get("service_name").(string)
request.QueryParams["Type"] = d.Get("type").(string)
request.QueryParams["Act"] = "2" // 更新接口默认值
port_mappings, err := edasService.GetK8sServicePorts(d.Get("port_mappings").([]interface{}))
if err != nil {
return errmsgs.WrapError(err)
}
request.QueryParams["PortMappingsStrs"] = port_mappings
update := false
if d.HasChange("service_name") {
update = true
}
if d.HasChange("port_mappings") {
update = true
}
if d.HasChange("type") {
update = true
}
if d.HasChange("external_traffic_policy") {
update = true
request.QueryParams["ExternalTrafficPolicy"] = d.Get("external_traffic_policy").(string)
}
if d.HasChange("annotations") {
AnnotationsStrs, err := json.Marshal(d.Get("annotations").(map[string]interface{}))
if err != nil {
return errmsgs.WrapError(err)
}
request.QueryParams["AnnotationsStrs"] = string(AnnotationsStrs)
}
if d.HasChange("labels") {
service, err := edasService.DescribeEdasK8sService(d.Id())
if err != nil {
return errmsgs.WrapError(err)
}
labels := d.Get("labels").(map[string]interface{})
for k, v := range service.Labels {
if _, ok := labels[k]; !ok {
labels[k] = v
}
}
labelsStrs, err := json.Marshal(labels)
if err != nil {
return errmsgs.WrapError(err)
}
request.QueryParams["LabelsStrs"] = string(labelsStrs)
}
if update && !d.IsNewResource() {
bresponse, err := client.ProcessCommonRequest(request)
addDebug(request.GetActionName(), bresponse, request)
if err != nil {
errmsg := ""
if bresponse != nil {
errmsg = errmsgs.GetBaseResponseErrorMessage(bresponse.BaseResponse)
}
return errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, d.Id(), request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
}
response := make(map[string]interface{})
_ = json.Unmarshal(bresponse.GetHttpContentBytes(), &response)
if fmt.Sprint(response["Code"]) != "200" {
return errmsgs.WrapError(errmsgs.Error("update edas k8s service failed for " + response["Message"].(string)))
}
}
d.Partial(false)
return nil
}
func resourceAlibabacloudStackEdasK8sServiceDelete(d *schema.ResourceData, meta interface{}) error {
client := meta.(*connectivity.AlibabacloudStackClient)
request := client.NewCommonRequest("DELETE", "Edas", "2017-08-01", "DeleteK8sService", "/pop/v5/k8s/service/service")
parts := strings.Split(d.Id(), ":")
app_id := parts[0]
name := parts[1]
request.QueryParams = map[string]string{
"AppId": app_id,
"ServiceName": name,
}
bresponse, err := client.ProcessCommonRequest(request)
addDebug(request.GetActionName(), bresponse, request)
if err != nil {
errmsg := ""
if bresponse != nil {
errmsg = errmsgs.GetBaseResponseErrorMessage(bresponse.BaseResponse)
}
return errmsgs.WrapErrorf(err, errmsgs.RequestV1ErrorMsg, d.Id(), request.GetActionName(), errmsgs.AlibabacloudStackSdkGoERROR, errmsg)
}
response := make(map[string]interface{})
_ = json.Unmarshal(bresponse.GetHttpContentBytes(), &response)
if fmt.Sprint(response["Code"]) != "200" {
return errmsgs.WrapError(errmsgs.Error("delete edas k8s service failed for " + response["Message"].(string)))
}
return nil
}