github.com/danp/terraform@v0.9.5-0.20170426144147-39d740081351/builtin/providers/alicloud/resource_alicloud_vswitch.go (about)

     1  package alicloud
     2  
     3  import (
     4  	"fmt"
     5  
     6  	"github.com/denverdino/aliyungo/common"
     7  	"github.com/denverdino/aliyungo/ecs"
     8  	"github.com/hashicorp/terraform/helper/resource"
     9  	"github.com/hashicorp/terraform/helper/schema"
    10  	"log"
    11  	"time"
    12  )
    13  
    14  func resourceAliyunSubnet() *schema.Resource {
    15  	return &schema.Resource{
    16  		Create: resourceAliyunSwitchCreate,
    17  		Read:   resourceAliyunSwitchRead,
    18  		Update: resourceAliyunSwitchUpdate,
    19  		Delete: resourceAliyunSwitchDelete,
    20  
    21  		Schema: map[string]*schema.Schema{
    22  			"availability_zone": &schema.Schema{
    23  				Type:     schema.TypeString,
    24  				Required: true,
    25  				ForceNew: true,
    26  			},
    27  			"vpc_id": &schema.Schema{
    28  				Type:     schema.TypeString,
    29  				Required: true,
    30  				ForceNew: true,
    31  			},
    32  			"cidr_block": &schema.Schema{
    33  				Type:         schema.TypeString,
    34  				Required:     true,
    35  				ForceNew:     true,
    36  				ValidateFunc: validateSwitchCIDRNetworkAddress,
    37  			},
    38  			"name": &schema.Schema{
    39  				Type:     schema.TypeString,
    40  				Optional: true,
    41  			},
    42  			"description": &schema.Schema{
    43  				Type:     schema.TypeString,
    44  				Optional: true,
    45  			},
    46  		},
    47  	}
    48  }
    49  
    50  func resourceAliyunSwitchCreate(d *schema.ResourceData, meta interface{}) error {
    51  
    52  	conn := meta.(*AliyunClient).ecsconn
    53  
    54  	args, err := buildAliyunSwitchArgs(d, meta)
    55  	if err != nil {
    56  		return err
    57  	}
    58  
    59  	vswitchID, err := conn.CreateVSwitch(args)
    60  	if err != nil {
    61  		return fmt.Errorf("Create subnet got a error :%s", err)
    62  	}
    63  
    64  	d.SetId(vswitchID)
    65  
    66  	err = conn.WaitForVSwitchAvailable(args.VpcId, vswitchID, 60)
    67  	if err != nil {
    68  		return fmt.Errorf("WaitForVSwitchAvailable got a error: %s", err)
    69  	}
    70  
    71  	return resourceAliyunSwitchUpdate(d, meta)
    72  }
    73  
    74  func resourceAliyunSwitchRead(d *schema.ResourceData, meta interface{}) error {
    75  
    76  	conn := meta.(*AliyunClient).ecsconn
    77  
    78  	args := &ecs.DescribeVSwitchesArgs{
    79  		VpcId:     d.Get("vpc_id").(string),
    80  		VSwitchId: d.Id(),
    81  	}
    82  
    83  	vswitches, _, err := conn.DescribeVSwitches(args)
    84  
    85  	if err != nil {
    86  		if notFoundError(err) {
    87  			d.SetId("")
    88  			return nil
    89  		}
    90  		return err
    91  	}
    92  
    93  	if len(vswitches) == 0 {
    94  		d.SetId("")
    95  		return nil
    96  	}
    97  
    98  	vswitch := vswitches[0]
    99  
   100  	d.Set("availability_zone", vswitch.ZoneId)
   101  	d.Set("vpc_id", vswitch.VpcId)
   102  	d.Set("cidr_block", vswitch.CidrBlock)
   103  	d.Set("name", vswitch.VSwitchName)
   104  	d.Set("description", vswitch.Description)
   105  
   106  	return nil
   107  }
   108  
   109  func resourceAliyunSwitchUpdate(d *schema.ResourceData, meta interface{}) error {
   110  
   111  	conn := meta.(*AliyunClient).ecsconn
   112  
   113  	d.Partial(true)
   114  
   115  	attributeUpdate := false
   116  	args := &ecs.ModifyVSwitchAttributeArgs{
   117  		VSwitchId: d.Id(),
   118  	}
   119  
   120  	if d.HasChange("name") {
   121  		d.SetPartial("name")
   122  		args.VSwitchName = d.Get("name").(string)
   123  
   124  		attributeUpdate = true
   125  	}
   126  
   127  	if d.HasChange("description") {
   128  		d.SetPartial("description")
   129  		args.Description = d.Get("description").(string)
   130  
   131  		attributeUpdate = true
   132  	}
   133  	if attributeUpdate {
   134  		if err := conn.ModifyVSwitchAttribute(args); err != nil {
   135  			return err
   136  		}
   137  
   138  	}
   139  
   140  	d.Partial(false)
   141  
   142  	return resourceAliyunSwitchRead(d, meta)
   143  }
   144  
   145  func resourceAliyunSwitchDelete(d *schema.ResourceData, meta interface{}) error {
   146  	conn := meta.(*AliyunClient).ecsconn
   147  
   148  	return resource.Retry(5*time.Minute, func() *resource.RetryError {
   149  		err := conn.DeleteVSwitch(d.Id())
   150  
   151  		if err != nil {
   152  			e, _ := err.(*common.Error)
   153  			if e.ErrorResponse.Code == VswitcInvalidRegionId {
   154  				log.Printf("[ERROR] Delete Switch is failed.")
   155  				return resource.NonRetryableError(err)
   156  			}
   157  
   158  			return resource.RetryableError(fmt.Errorf("Switch in use. -- trying again while it is deleted."))
   159  		}
   160  
   161  		vsw, _, vswErr := conn.DescribeVSwitches(&ecs.DescribeVSwitchesArgs{
   162  			VpcId:     d.Get("vpc_id").(string),
   163  			VSwitchId: d.Id(),
   164  		})
   165  
   166  		if vswErr != nil {
   167  			return resource.NonRetryableError(vswErr)
   168  		} else if vsw == nil || len(vsw) < 1 {
   169  			return nil
   170  		}
   171  
   172  		return resource.RetryableError(fmt.Errorf("Switch in use. -- trying again while it is deleted."))
   173  	})
   174  }
   175  
   176  func buildAliyunSwitchArgs(d *schema.ResourceData, meta interface{}) (*ecs.CreateVSwitchArgs, error) {
   177  
   178  	client := meta.(*AliyunClient)
   179  
   180  	vpcID := d.Get("vpc_id").(string)
   181  
   182  	vpc, err := client.DescribeVpc(vpcID)
   183  	if err != nil {
   184  		return nil, err
   185  	}
   186  
   187  	if vpc == nil {
   188  		return nil, fmt.Errorf("vpc_id not found")
   189  	}
   190  
   191  	zoneID := d.Get("availability_zone").(string)
   192  
   193  	zone, err := client.DescribeZone(zoneID)
   194  	if err != nil {
   195  		return nil, err
   196  	}
   197  
   198  	err = client.ResourceAvailable(zone, ecs.ResourceTypeVSwitch)
   199  	if err != nil {
   200  		return nil, err
   201  	}
   202  
   203  	cidrBlock := d.Get("cidr_block").(string)
   204  
   205  	args := &ecs.CreateVSwitchArgs{
   206  		VpcId:     vpcID,
   207  		ZoneId:    zoneID,
   208  		CidrBlock: cidrBlock,
   209  	}
   210  
   211  	if v, ok := d.GetOk("name"); ok && v != "" {
   212  		args.VSwitchName = v.(string)
   213  	}
   214  
   215  	if v, ok := d.GetOk("description"); ok && v != "" {
   216  		args.Description = v.(string)
   217  	}
   218  
   219  	return args, nil
   220  }