alicloud/resource_alicloud_market_order.go (154 lines of code) (raw):

package alicloud import ( "encoding/json" "fmt" "strings" "github.com/aliyun/alibaba-cloud-sdk-go/services/market" "github.com/aliyun/terraform-provider-alicloud/alicloud/connectivity" "github.com/hashicorp/terraform-plugin-sdk/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/helper/validation" ) func resourceAlicloudMarketOrder() *schema.Resource { return &schema.Resource{ Create: resourceAlicloudMarketOrderCreate, Read: resourceAlicloudMarketOrderRead, Delete: resourceAlicloudMarketOrderDelete, Importer: &schema.ResourceImporter{ State: schema.ImportStatePassthrough, }, Schema: map[string]*schema.Schema{ "product_code": { Type: schema.TypeString, Required: true, ForceNew: true, ValidateFunc: validation.StringLenBetween(8, 12), }, "pay_type": { Type: schema.TypeString, Optional: true, Default: "PostPaid", ForceNew: true, ValidateFunc: validation.StringInSlice([]string{"PrePaid", "PostPaid"}, false), }, "duration": { Type: schema.TypeInt, Optional: true, ForceNew: true, Default: 1, ValidateFunc: validation.IntBetween(1, 256), }, "pricing_cycle": { Type: schema.TypeString, Required: true, ForceNew: true, ValidateFunc: validation.StringInSlice([]string{"Day", "Month", "Year"}, false), }, "package_version": { Type: schema.TypeString, Required: true, ForceNew: true, }, "quantity": { Type: schema.TypeInt, Optional: true, ForceNew: true, Default: 1, }, "coupon_id": { Type: schema.TypeString, Optional: true, ForceNew: true, }, "components": { Type: schema.TypeMap, Optional: true, Default: map[string]interface{}{}, ForceNew: true, }, }, } } func resourceAlicloudMarketOrderCreate(d *schema.ResourceData, meta interface{}) error { client := meta.(*connectivity.AliyunClient) request, err := buildAliyunMarketOrderArgs(d, meta) if err != nil { return WrapError(err) } request.RegionId = client.RegionId raw, err := client.WithMarketClient(func(marketClient *market.Client) (interface{}, error) { return marketClient.CreateOrder(request) }) if err != nil { return WrapErrorf(err, DefaultErrorMsg, "alicloud_market_order", request.GetActionName(), AlibabaCloudSdkGoERROR) } response, _ := raw.(*market.CreateOrderResponse) addDebug(request.GetActionName(), raw, request.RpcRequest, request) d.SetId(response.OrderId) return resourceAlicloudMarketOrderRead(d, meta) } func resourceAlicloudMarketOrderRead(d *schema.ResourceData, meta interface{}) error { client := meta.(*connectivity.AliyunClient) marketService := MarketService{client} object, err := marketService.DescribeMarketOrder(d.Id()) if err != nil { if NotFoundError(err) { d.SetId("") return nil } return WrapError(err) } err = d.Set("product_code", object.ProductCode) if err != nil { return WrapError(err) } orderPayType := "PostPaid" if strings.Split(object.ProductSkuCode, "-")[1] == "prepay" { orderPayType = "PrePaid" } err = d.Set("pay_type", orderPayType) if err != nil { return WrapError(err) } err = d.Set("quantity", object.Quantity) if err != nil { return WrapError(err) } return nil } func resourceAlicloudMarketOrderDelete(d *schema.ResourceData, meta interface{}) error { return nil } func buildAliyunMarketOrderArgs(d *schema.ResourceData, meta interface{}) (*market.CreateOrderRequest, error) { packageVersion := d.Get("package_version").(string) couponId := "" if v, ok := d.GetOk("coupon_id"); ok { couponId = v.(string) } duration := d.Get("duration").(int) pricingCycle := d.Get("pricing_cycle").(string) productCode := d.Get("product_code").(string) quantity := d.Get("quantity").(int) orderPayType := "postpay" if d.Get("pay_type").(string) == "PrePaid" { orderPayType = "prepay" } skuCode := fmt.Sprintf("%s-%s", productCode, orderPayType) components := d.Get("components").(map[string]interface{}) components["package_version"] = packageVersion componentsJson, _ := json.Marshal(components) commodity := fmt.Sprintf(`{ "components": %s, "couponId": "%s", "duration": %d, "pricingCycle": "%s", "productCode": "%s", "quantity": %d, "skuCode": "%s" }`, componentsJson, couponId, duration, pricingCycle, productCode, quantity, skuCode) request := market.CreateCreateOrderRequest() request.ClientToken = buildClientToken(request.GetActionName()) request.OrderType = "INSTANCE_BUY" request.PaymentType = "AUTO" request.Commodity = commodity return request, nil }