func resource_aws_r53_record_refresh( s *terraform.ResourceState, meta interface{}) (*terraform.ResourceState, error) { p := meta.(*ResourceProvider) conn := p.route53 zone := s.Attributes["zone_id"] lopts := &route53.ListOpts{ Name: s.Attributes["name"], Type: s.Attributes["type"], } resp, err := conn.ListResourceRecordSets(zone, lopts) if err != nil { return s, err } // Scan for a matching record found := false for _, record := range resp.Records { if route53.FQDN(record.Name) != route53.FQDN(lopts.Name) { continue } if strings.ToUpper(record.Type) != strings.ToUpper(lopts.Type) { continue } found = true resource_aws_r53_record_update_state(s, &record) break } if !found { s.ID = "" } return s, nil }
func resource_aws_subnet_create( s *terraform.ResourceState, d *terraform.ResourceDiff, meta interface{}) (*terraform.ResourceState, error) { p := meta.(*ResourceProvider) ec2conn := p.ec2conn // Merge the diff so that we have all the proper attributes s = s.MergeDiff(d) // Create the Subnet createOpts := &ec2.CreateSubnet{ AvailabilityZone: s.Attributes["availability_zone"], CidrBlock: s.Attributes["cidr_block"], VpcId: s.Attributes["vpc_id"], } log.Printf("[DEBUG] Subnet create config: %#v", createOpts) resp, err := ec2conn.CreateSubnet(createOpts) if err != nil { return nil, fmt.Errorf("Error creating subnet: %s", err) } // Get the ID and store it subnet := &resp.Subnet s.ID = subnet.SubnetId log.Printf("[INFO] Subnet ID: %s", s.ID) // Wait for the Subnet to become available log.Printf( "[DEBUG] Waiting for subnet (%s) to become available", s.ID) stateConf := &resource.StateChangeConf{ Pending: []string{"pending"}, Target: "available", Refresh: SubnetStateRefreshFunc(ec2conn, s.ID), Timeout: 10 * time.Minute, } subnetRaw, err := stateConf.WaitForState() if err != nil { return s, fmt.Errorf( "Error waiting for subnet (%s) to become available: %s", s.ID, err) } // Map public ip on launch must be set in another API call if attr := s.Attributes["map_public_ip_on_launch"]; attr == "true" { modifyOpts := &ec2.ModifySubnetAttribute{ SubnetId: s.ID, MapPublicIpOnLaunch: true, } log.Printf("[DEBUG] Subnet modify attributes: %#v", modifyOpts) _, err := ec2conn.ModifySubnetAttribute(modifyOpts) if err != nil { return nil, fmt.Errorf("Error modify subnet attributes: %s", err) } } // Update our attributes and return return resource_aws_subnet_update_state(s, subnetRaw.(*ec2.Subnet)) }
// Apply performs a create or update depending on the diff, and calls // the proper function on the matching Resource. func (m *Map) Apply( s *terraform.ResourceState, d *terraform.ResourceDiff, meta interface{}) (*terraform.ResourceState, error) { r, ok := m.Mapping[s.Type] if !ok { return nil, fmt.Errorf("Unknown resource type: %s", s.Type) } if d.Destroy || d.RequiresNew() { if s.ID != "" { // Destroy the resource if it is created err := r.Destroy(s, meta) if err != nil { return s, err } s.ID = "" } // If we're only destroying, and not creating, then return now. // Otherwise, we continue so that we can create a new resource. if !d.RequiresNew() { return nil, nil } } var result *terraform.ResourceState var err error if s.ID == "" { result, err = r.Create(s, d, meta) } else { if r.Update == nil { return s, fmt.Errorf( "Resource type '%s' doesn't support update", s.Type) } result, err = r.Update(s, d, meta) } if result != nil { if result.Attributes == nil { result.Attributes = make(map[string]string) } result.Attributes["id"] = result.ID } return result, err }
func resource_aws_r53_zone_refresh( s *terraform.ResourceState, meta interface{}) (*terraform.ResourceState, error) { p := meta.(*ResourceProvider) r53 := p.route53 _, err := r53.GetHostedZone(s.Attributes["zone_id"]) if err != nil { // Handle a deleted zone if strings.Contains(err.Error(), "404") { s.ID = "" return s, nil } return s, err } return s, nil }
func resource_aws_vpc_create( s *terraform.ResourceState, d *terraform.ResourceDiff, meta interface{}) (*terraform.ResourceState, error) { p := meta.(*ResourceProvider) ec2conn := p.ec2conn // Merge the diff so that we have all the proper attributes s = s.MergeDiff(d) // Create the VPC createOpts := &ec2.CreateVpc{ CidrBlock: s.Attributes["cidr_block"], } log.Printf("[DEBUG] VPC create config: %#v", createOpts) vpcResp, err := ec2conn.CreateVpc(createOpts) if err != nil { return nil, fmt.Errorf("Error creating VPC: %s", err) } // Get the ID and store it vpc := &vpcResp.VPC log.Printf("[INFO] VPC ID: %s", vpc.VpcId) s.ID = vpc.VpcId // Wait for the VPC to become available log.Printf( "[DEBUG] Waiting for VPC (%s) to become available", s.ID) stateConf := &resource.StateChangeConf{ Pending: []string{"pending"}, Target: "available", Refresh: VPCStateRefreshFunc(ec2conn, s.ID), Timeout: 10 * time.Minute, } vpcRaw, err := stateConf.WaitForState() if err != nil { return s, fmt.Errorf( "Error waiting for VPC (%s) to become available: %s", s.ID, err) } // Update our attributes and return return resource_aws_vpc_update_state(s, vpcRaw.(*ec2.VPC)) }
// State returns the new ResourceState after the diff and any Set // calls. func (d *ResourceData) State() *terraform.ResourceState { var result terraform.ResourceState result.ID = d.Id() // If we have no ID, then this resource doesn't exist and we just // return nil. if result.ID == "" { return nil } result.Attributes = d.stateObject("", d.schema) result.ConnInfo = d.ConnInfo() result.Dependencies = d.Dependencies() if v := d.Id(); v != "" { result.Attributes["id"] = d.Id() } return &result }
func resource_aws_route_table_create( s *terraform.ResourceState, d *terraform.ResourceDiff, meta interface{}) (*terraform.ResourceState, error) { p := meta.(*ResourceProvider) ec2conn := p.ec2conn // Create the routing table createOpts := &ec2.CreateRouteTable{ VpcId: d.Attributes["vpc_id"].New, } log.Printf("[DEBUG] RouteTable create config: %#v", createOpts) resp, err := ec2conn.CreateRouteTable(createOpts) if err != nil { return nil, fmt.Errorf("Error creating route table: %s", err) } // Get the ID and store it rt := &resp.RouteTable s.ID = rt.RouteTableId log.Printf("[INFO] Route Table ID: %s", s.ID) // Wait for the route table to become available log.Printf( "[DEBUG] Waiting for route table (%s) to become available", s.ID) stateConf := &resource.StateChangeConf{ Pending: []string{"pending"}, Target: "ready", Refresh: RouteTableStateRefreshFunc(ec2conn, s.ID), Timeout: 1 * time.Minute, } if _, err := stateConf.WaitForState(); err != nil { return s, fmt.Errorf( "Error waiting for route table (%s) to become available: %s", s.ID, err) } // Update our routes return resource_aws_route_table_update(s, d, meta) }
func resource_aws_internet_gateway_create( s *terraform.ResourceState, d *terraform.ResourceDiff, meta interface{}) (*terraform.ResourceState, error) { p := meta.(*ResourceProvider) ec2conn := p.ec2conn // Create the gateway log.Printf("[DEBUG] Creating internet gateway") resp, err := ec2conn.CreateInternetGateway(nil) if err != nil { return nil, fmt.Errorf("Error creating subnet: %s", err) } // Get the ID and store it ig := &resp.InternetGateway s.ID = ig.InternetGatewayId log.Printf("[INFO] InternetGateway ID: %s", s.ID) // Update our attributes and return return resource_aws_internet_gateway_update(s, d, meta) }
func resource_aws_vpc_create( s *terraform.ResourceState, d *terraform.ResourceDiff, meta interface{}) (*terraform.ResourceState, error) { p := meta.(*ResourceProvider) ec2conn := p.ec2conn // Merge the diff so that we have all the proper attributes s = s.MergeDiff(d) // Create the VPC createOpts := &ec2.CreateVpc{ CidrBlock: s.Attributes["cidr_block"], } log.Printf("[DEBUG] VPC create config: %#v", createOpts) vpcResp, err := ec2conn.CreateVpc(createOpts) if err != nil { return nil, fmt.Errorf("Error creating VPC: %s", err) } // Get the ID and store it vpc := &vpcResp.VPC log.Printf("[INFO] VPC ID: %s", vpc.VpcId) s.ID = vpc.VpcId // Wait for the VPC to become available log.Printf( "[DEBUG] Waiting for VPC (%s) to become available", s.ID) stateConf := &resource.StateChangeConf{ Pending: []string{"pending"}, Target: "available", Refresh: VPCStateRefreshFunc(ec2conn, s.ID), Timeout: 10 * time.Minute, } vpcRaw, err := stateConf.WaitForState() if err != nil { return s, fmt.Errorf( "Error waiting for VPC (%s) to become available: %s", s.ID, err) } if attr, ok := d.Attributes["enable_dns_support"]; ok { options := new(ec2.ModifyVpcAttribute) options.EnableDnsSupport = attr.New != "" && attr.New != "false" options.SetEnableDnsSupport = true s.Attributes["enable_dns_support"] = strconv.FormatBool(options.EnableDnsSupport) log.Printf("[INFO] Modifying vpc attributes for %s: %#v", s.ID, options) if _, err := ec2conn.ModifyVpcAttribute(s.ID, options); err != nil { return s, err } } if attr, ok := d.Attributes["enable_dns_hostnames"]; ok { options := new(ec2.ModifyVpcAttribute) options.EnableDnsHostnames = attr.New != "" && attr.New != "false" options.SetEnableDnsHostnames = true s.Attributes["enable_dns_hostnames"] = strconv.FormatBool(options.EnableDnsHostnames) log.Printf("[INFO] Modifying enable_dns_hostnames vpc attribute for %s: %#v", s.ID, options) if _, err := ec2conn.ModifyVpcAttribute(s.ID, options); err != nil { return s, err } } // Update our attributes and return return resource_aws_vpc_update_state(s, vpcRaw.(*ec2.VPC)) }