func resourceVcdVAppDelete(d *schema.ResourceData, meta interface{}) error { vcdClient := meta.(*VCDClient) vapp, err := vcdClient.OrgVdc.FindVAppByName(d.Id()) if err != nil { return fmt.Errorf("error finding vapp: %s", err) } if err != nil { return fmt.Errorf("Error getting VApp status: %#v", err) } _ = retryCall(vcdClient.MaxRetryTimeout, func() error { task, err := vapp.Undeploy() if err != nil { return fmt.Errorf("Error undeploying: %#v", err) } return task.WaitTaskCompletion() }) err = retryCall(vcdClient.MaxRetryTimeout, func() error { task, err := vapp.Delete() if err != nil { return fmt.Errorf("Error deleting: %#v", err) } return task.WaitTaskCompletion() }) return err }
// resourceAzureAffinityGroupRead does all the necessary API calls to // read the state of the affinity group off Azure. func resourceAzureAffinityGroupRead(d *schema.ResourceData, meta interface{}) error { affinityGroupClient := meta.(*Client).affinityGroupClient log.Println("[INFO] Issuing Azure Affinity Group list request.") affinityGroups, err := affinityGroupClient.ListAffinityGroups() if err != nil { return fmt.Errorf("Error obtaining Affinity Group list off Azure: %s", err) } var found bool name := d.Get("name").(string) for _, group := range affinityGroups.AffinityGroups { if group.Name == name { found = true d.Set("location", group.Location) d.Set("label", group.Label) d.Set("description", group.Description) break } } if !found { // it means the affinity group has been deleted in the meantime, so we // must stop tracking it: d.SetId("") } return nil }
func resourceHerokuAddonCreate(d *schema.ResourceData, meta interface{}) error { addonLock.Lock() defer addonLock.Unlock() client := meta.(*heroku.Service) app := d.Get("app").(string) opts := heroku.AddonCreateOpts{Plan: d.Get("plan").(string)} if v := d.Get("config"); v != nil { config := make(map[string]string) for _, v := range v.([]interface{}) { for k, v := range v.(map[string]interface{}) { config[k] = v.(string) } } opts.Config = &config } log.Printf("[DEBUG] Addon create configuration: %#v, %#v", app, opts) a, err := client.AddonCreate(app, opts) if err != nil { return err } d.SetId(a.ID) log.Printf("[INFO] Addon ID: %s", d.Id()) return resourceHerokuAddonRead(d, meta) }
func roleFromResourceData(d *schema.ResourceData) (*chefc.Role, error) { role := &chefc.Role{ Name: d.Get("name").(string), Description: d.Get("description").(string), ChefType: "role", } var err error err = json.Unmarshal( []byte(d.Get("default_attributes_json").(string)), &role.DefaultAttributes, ) if err != nil { return nil, fmt.Errorf("default_attributes_json: %s", err) } err = json.Unmarshal( []byte(d.Get("override_attributes_json").(string)), &role.OverrideAttributes, ) if err != nil { return nil, fmt.Errorf("override_attributes_json: %s", err) } runListI := d.Get("run_list").([]interface{}) role.RunList = make([]string, len(runListI)) for i, vI := range runListI { role.RunList[i] = vI.(string) } return role, nil }
func resourceAWSEbsVolumeUpdate(d *schema.ResourceData, meta interface{}) error { conn := meta.(*AWSClient).ec2conn if _, ok := d.GetOk("tags"); ok { setTags(conn, d) } return resourceAwsEbsVolumeRead(d, meta) }
func resourceAwsKinesisStreamDelete(d *schema.ResourceData, meta interface{}) error { conn := meta.(*AWSClient).kinesisconn sn := d.Get("name").(string) _, err := conn.DeleteStream(&kinesis.DeleteStreamInput{ StreamName: aws.String(sn), }) if err != nil { return err } stateConf := &resource.StateChangeConf{ Pending: []string{"DELETING"}, Target: "DESTROYED", Refresh: streamStateRefreshFunc(conn, sn), Timeout: 5 * time.Minute, Delay: 10 * time.Second, MinTimeout: 3 * time.Second, } _, err = stateConf.WaitForState() if err != nil { return fmt.Errorf( "Error waiting for Stream (%s) to be destroyed: %s", sn, err) } d.SetId("") return nil }
func getNetworkName(d *schema.ResourceData, meta interface{}, networkID string) (string, error) { config := meta.(*Config) networkingClient, err := config.networkingV2Client(d.Get("region").(string)) if err != nil { return "", fmt.Errorf("Error creating OpenStack network client: %s", err) } opts := networks.ListOpts{ID: networkID} pager := networks.List(networkingClient, opts) networkName := "" err = pager.EachPage(func(page pagination.Page) (bool, error) { networkList, err := networks.ExtractNetworks(page) if err != nil { return false, err } for _, n := range networkList { if n.ID == networkID { networkName = n.Name return false, nil } } return true, nil }) return networkName, err }
func resourceVcdNetworkDelete(d *schema.ResourceData, meta interface{}) error { vcdClient := meta.(*VCDClient) vcdClient.Mutex.Lock() defer vcdClient.Mutex.Unlock() err := vcdClient.OrgVdc.Refresh() if err != nil { return fmt.Errorf("Error refreshing vdc: %#v", err) } network, err := vcdClient.OrgVdc.FindVDCNetwork(d.Id()) if err != nil { return fmt.Errorf("Error finding network: %#v", err) } err = retryCall(vcdClient.MaxRetryTimeout, func() error { task, err := network.Delete() if err != nil { return fmt.Errorf("Error Deleting Network: %#v", err) } return task.WaitTaskCompletion() }) if err != nil { return err } return nil }
func resourceAwsOpsworksSetStackCustomCookbooksSource(d *schema.ResourceData, v *opsworks.Source) { nv := make([]interface{}, 0, 1) if v != nil { m := make(map[string]interface{}) if v.Type != nil { m["type"] = *v.Type } if v.Url != nil { m["url"] = *v.Url } if v.Username != nil { m["username"] = *v.Username } if v.Password != nil { m["password"] = *v.Password } if v.Revision != nil { m["revision"] = *v.Revision } nv = append(nv, m) } err := d.Set("custom_cookbooks_source", nv) if err != nil { // should never happen panic(err) } }
func resourceAwsIamRoleDelete(d *schema.ResourceData, meta interface{}) error { iamconn := meta.(*AWSClient).iamconn // Roles cannot be destroyed when attached to an existing Instance Profile resp, err := iamconn.ListInstanceProfilesForRole(&iam.ListInstanceProfilesForRoleInput{ RoleName: aws.String(d.Id()), }) if err != nil { return fmt.Errorf("Error listing Profiles for IAM Role (%s) when trying to delete: %s", d.Id(), err) } // Loop and remove this Role from any Profiles if len(resp.InstanceProfiles) > 0 { for _, i := range resp.InstanceProfiles { _, err := iamconn.RemoveRoleFromInstanceProfile(&iam.RemoveRoleFromInstanceProfileInput{ InstanceProfileName: i.InstanceProfileName, RoleName: aws.String(d.Id()), }) if err != nil { return fmt.Errorf("Error deleting IAM Role %s: %s", d.Id(), err) } } } request := &iam.DeleteRoleInput{ RoleName: aws.String(d.Id()), } if _, err := iamconn.DeleteRole(request); err != nil { return fmt.Errorf("Error deleting IAM Role %s: %s", d.Id(), err) } return nil }
func resourceAwsKeyPairRead(d *schema.ResourceData, meta interface{}) error { conn := meta.(*AWSClient).ec2conn req := &ec2.DescribeKeyPairsInput{ KeyNames: []*string{aws.String(d.Id())}, } resp, err := conn.DescribeKeyPairs(req) if err != nil { awsErr, ok := err.(awserr.Error) if ok && awsErr.Code() == "InvalidKeyPair.NotFound" { d.SetId("") return nil } return fmt.Errorf("Error retrieving KeyPair: %s", err) } for _, keyPair := range resp.KeyPairs { if *keyPair.KeyName == d.Id() { d.Set("key_name", keyPair.KeyName) d.Set("fingerprint", keyPair.KeyFingerprint) return nil } } return fmt.Errorf("Unable to find key pair within: %#v", resp.KeyPairs) }
func environmentFromResourceData(d *schema.ResourceData) (*chefc.Environment, error) { env := &chefc.Environment{ Name: d.Get("name").(string), Description: d.Get("description").(string), ChefType: "environment", } var err error err = json.Unmarshal( []byte(d.Get("default_attributes_json").(string)), &env.DefaultAttributes, ) if err != nil { return nil, fmt.Errorf("default_attributes_json: %s", err) } err = json.Unmarshal( []byte(d.Get("override_attributes_json").(string)), &env.OverrideAttributes, ) if err != nil { return nil, fmt.Errorf("override_attributes_json: %s", err) } env.CookbookVersions = make(map[string]string) for k, vI := range d.Get("cookbook_constraints").(map[string]interface{}) { env.CookbookVersions[k] = vI.(string) } return env, nil }
func resourceAwsSnsTopicRead(d *schema.ResourceData, meta interface{}) error { snsconn := meta.(*AWSClient).snsconn attributeOutput, err := snsconn.GetTopicAttributes(&sns.GetTopicAttributesInput{ TopicArn: aws.String(d.Id()), }) if err != nil { return err } if attributeOutput.Attributes != nil && len(attributeOutput.Attributes) > 0 { attrmap := attributeOutput.Attributes resource := *resourceAwsSnsTopic() // iKey = internal struct key, oKey = AWS Attribute Map key for iKey, oKey := range SNSAttributeMap { log.Printf("[DEBUG] Updating %s => %s", iKey, oKey) if attrmap[oKey] != nil { // Some of the fetched attributes are stateful properties such as // the number of subscriptions, the owner, etc. skip those if resource.Schema[iKey] != nil { value := *attrmap[oKey] log.Printf("[DEBUG] Updating %s => %s -> %s", iKey, oKey, value) d.Set(iKey, *attrmap[oKey]) } } } } return nil }
func resourceAwsIAMServerCertificateRead(d *schema.ResourceData, meta interface{}) error { conn := meta.(*AWSClient).iamconn resp, err := conn.GetServerCertificate(&iam.GetServerCertificateInput{ ServerCertificateName: aws.String(d.Get("name").(string)), }) if err != nil { if awsErr, ok := err.(awserr.Error); ok { return fmt.Errorf("[WARN] Error reading IAM Server Certificate: %s: %s", awsErr.Code(), awsErr.Message()) } return fmt.Errorf("[WARN] Error reading IAM Server Certificate: %s", err) } // these values should always be present, and have a default if not set in // configuration, and so safe to reference with nil checks d.Set("certificate_body", normalizeCert(resp.ServerCertificate.CertificateBody)) c := normalizeCert(resp.ServerCertificate.CertificateChain) if c != "" { d.Set("certificate_chain", c) } d.Set("path", resp.ServerCertificate.ServerCertificateMetadata.Path) d.Set("arn", resp.ServerCertificate.ServerCertificateMetadata.Arn) return nil }
func resourceAwsAutoscalingLifecycleHookPut(d *schema.ResourceData, meta interface{}) error { conn := meta.(*AWSClient).autoscalingconn params := getAwsAutoscalingPutLifecycleHookInput(d) log.Printf("[DEBUG] AutoScaling PutLifecyleHook: %s", params) err := resource.Retry(5*time.Minute, func() error { _, err := conn.PutLifecycleHook(¶ms) if err != nil { if awsErr, ok := err.(awserr.Error); ok { if strings.Contains(awsErr.Message(), "Unable to publish test message to notification target") { return fmt.Errorf("[DEBUG] Retrying AWS AutoScaling Lifecycle Hook: %s", params) } } return resource.RetryError{Err: fmt.Errorf("Error putting lifecycle hook: %s", err)} } return nil }) if err != nil { return err } d.SetId(d.Get("name").(string)) return resourceAwsAutoscalingLifecycleHookRead(d, meta) }
func resourceStorageBucketRead(d *schema.ResourceData, meta interface{}) error { config := meta.(*Config) // Get the bucket and acl bucket := d.Get("name").(string) res, err := config.clientStorage.Buckets.Get(bucket).Do() if err != nil { if gerr, ok := err.(*googleapi.Error); ok && gerr.Code == 404 { log.Printf("[WARN] Removing Bucket %q because it's gone", d.Get("name").(string)) // The resource doesn't exist anymore d.SetId("") return nil } return fmt.Errorf("Error reading bucket %s: %v", bucket, err) } log.Printf("[DEBUG] Read bucket %v at location %v\n\n", res.Name, res.SelfLink) // Update the bucket ID according to the resource ID d.Set("self_link", res.SelfLink) d.SetId(res.Id) return nil }
func resourceCloudStackDiskDelete(d *schema.ResourceData, meta interface{}) error { cs := meta.(*cloudstack.CloudStackClient) // Detach the volume if err := resourceCloudStackDiskDetach(d, meta); err != nil { return err } // Create a new parameter struct p := cs.Volume.NewDeleteVolumeParams(d.Id()) // Delete the voluem if _, err := cs.Volume.DeleteVolume(p); err != nil { // This is a very poor way to be told the ID does no longer exist :( if strings.Contains(err.Error(), fmt.Sprintf( "Invalid parameter id value=%s due to incorrect long value format, "+ "or entity does not exist", d.Id())) { return nil } return err } return nil }
func resourceAwsRedshiftSubnetGroupCreate(d *schema.ResourceData, meta interface{}) error { conn := meta.(*AWSClient).redshiftconn subnetIdsSet := d.Get("subnet_ids").(*schema.Set) subnetIds := make([]*string, subnetIdsSet.Len()) for i, subnetId := range subnetIdsSet.List() { subnetIds[i] = aws.String(subnetId.(string)) } createOpts := redshift.CreateClusterSubnetGroupInput{ ClusterSubnetGroupName: aws.String(d.Get("name").(string)), Description: aws.String(d.Get("description").(string)), SubnetIds: subnetIds, } log.Printf("[DEBUG] Create Redshift Subnet Group: %#v", createOpts) _, err := conn.CreateClusterSubnetGroup(&createOpts) if err != nil { return fmt.Errorf("Error creating Redshift Subnet Group: %s", err) } d.SetId(*createOpts.ClusterSubnetGroupName) log.Printf("[INFO] Redshift Subnet Group ID: %s", d.Id()) return resourceAwsRedshiftSubnetGroupRead(d, meta) }
func resourceAwsKinesisStreamRead(d *schema.ResourceData, meta interface{}) error { conn := meta.(*AWSClient).kinesisconn sn := d.Get("name").(string) state, err := readKinesisStreamState(conn, sn) if err != nil { if awsErr, ok := err.(awserr.Error); ok { if awsErr.Code() == "ResourceNotFoundException" { d.SetId("") return nil } return fmt.Errorf("[WARN] Error reading Kinesis Stream: \"%s\", code: \"%s\"", awsErr.Message(), awsErr.Code()) } return err } d.Set("arn", state.arn) d.Set("shard_count", state.shardCount) // set tags describeTagsOpts := &kinesis.ListTagsForStreamInput{ StreamName: aws.String(sn), } tagsResp, err := conn.ListTagsForStream(describeTagsOpts) if err != nil { log.Printf("[DEBUG] Error retrieving tags for Stream: %s. %s", sn, err) } else { d.Set("tags", tagsToMapKinesis(tagsResp.Tags)) } return nil }
// resourceAwsLambdaEventSourceMappingUpdate maps to: // UpdateEventSourceMapping in the API / SDK func resourceAwsLambdaEventSourceMappingUpdate(d *schema.ResourceData, meta interface{}) error { conn := meta.(*AWSClient).lambdaconn log.Printf("[DEBUG] Updating Lambda event source mapping: %s", d.Id()) params := &lambda.UpdateEventSourceMappingInput{ UUID: aws.String(d.Id()), BatchSize: aws.Int64(int64(d.Get("batch_size").(int))), FunctionName: aws.String(d.Get("function_name").(string)), Enabled: aws.Bool(d.Get("enabled").(bool)), } err := resource.Retry(1*time.Minute, func() error { _, err := conn.UpdateEventSourceMapping(params) if err != nil { if awserr, ok := err.(awserr.Error); ok { if awserr.Code() == "InvalidParameterValueException" { // Retryable return awserr } } // Not retryable return resource.RetryError{Err: err} } // No error return nil }) if err != nil { return fmt.Errorf("Error updating Lambda event source mapping: %s", err) } return resourceAwsLambdaEventSourceMappingRead(d, meta) }
func resourceAwsDbParameterGroupDeleteRefreshFunc( d *schema.ResourceData, meta interface{}) resource.StateRefreshFunc { rdsconn := meta.(*AWSClient).rdsconn return func() (interface{}, string, error) { deleteOpts := rds.DeleteDBParameterGroupInput{ DBParameterGroupName: aws.String(d.Id()), } if _, err := rdsconn.DeleteDBParameterGroup(&deleteOpts); err != nil { rdserr, ok := err.(awserr.Error) if !ok { return d, "error", err } if rdserr.Code() != "DBParameterGroupNotFoundFault" { return d, "error", err } } return d, "destroyed", nil } }
func resourceSqlDatabaseCreate(d *schema.ResourceData, meta interface{}) error { config := meta.(*Config) database_name := d.Get("name").(string) instance_name := d.Get("instance").(string) project := config.Project db := &sqladmin.Database{ Name: database_name, Instance: instance_name, } op, err := config.clientSqlAdmin.Databases.Insert(project, instance_name, db).Do() if err != nil { return fmt.Errorf("Error, failed to insert "+ "database %s into instance %s: %s", database_name, instance_name, err) } err = sqladminOperationWait(config, op, "Insert Database") if err != nil { return fmt.Errorf("Error, failure waiting for insertion of %s "+ "into %s: %s", database_name, instance_name, err) } return resourceSqlDatabaseRead(d, meta) }
func resourceContainerMetadataV2(d *schema.ResourceData) map[string]string { m := make(map[string]string) for key, val := range d.Get("metadata").(map[string]interface{}) { m[key] = val.(string) } return m }
func resourceSqlDatabaseDelete(d *schema.ResourceData, meta interface{}) error { config := meta.(*Config) database_name := d.Get("name").(string) instance_name := d.Get("instance").(string) project := config.Project op, err := config.clientSqlAdmin.Databases.Delete(project, instance_name, database_name).Do() if err != nil { return fmt.Errorf("Error, failed to delete"+ "database %s in instance %s: %s", database_name, instance_name, err) } err = sqladminOperationWait(config, op, "Delete Database") if err != nil { return fmt.Errorf("Error, failure waiting for deletion of %s "+ "in %s: %s", database_name, instance_name, err) } return nil }
// resourceAzureAffinityGroupUpdate does all the necessary API calls to // update the state of the affinity group on Azure. func resourceAzureAffinityGroupUpdate(d *schema.ResourceData, meta interface{}) error { affinityGroupClient := meta.(*Client).affinityGroupClient name := d.Get("name").(string) clabel := d.HasChange("label") cdesc := d.HasChange("description") if clabel || cdesc { log.Println("[INFO] Beginning Affinity Group update process.") params := affinitygroup.UpdateAffinityGroupParams{} if clabel { params.Label = d.Get("label").(string) } if cdesc { params.Description = d.Get("description").(string) } log.Println("[INFO] Sending Affinity Group update request to Azure.") err := affinityGroupClient.UpdateAffinityGroup(name, params) if err != nil { return fmt.Errorf("Error updating Azure Affinity Group parameters: %s", err) } } return nil }
func resourceAwsSecurityGroupDelete(d *schema.ResourceData, meta interface{}) error { conn := meta.(*AWSClient).ec2conn log.Printf("[DEBUG] Security Group destroy: %v", d.Id()) return resource.Retry(5*time.Minute, func() error { _, err := conn.DeleteSecurityGroup(&ec2.DeleteSecurityGroupInput{ GroupId: aws.String(d.Id()), }) if err != nil { ec2err, ok := err.(awserr.Error) if !ok { return err } switch ec2err.Code() { case "InvalidGroup.NotFound": return nil case "DependencyViolation": // If it is a dependency violation, we want to retry return err default: // Any other error, we want to quit the retry loop immediately return resource.RetryError{Err: err} } } return nil }) }
func resourceAwsRDSClusterInstanceDelete(d *schema.ResourceData, meta interface{}) error { conn := meta.(*AWSClient).rdsconn log.Printf("[DEBUG] RDS Cluster Instance destroy: %v", d.Id()) opts := rds.DeleteDBInstanceInput{DBInstanceIdentifier: aws.String(d.Id())} log.Printf("[DEBUG] RDS Cluster Instance destroy configuration: %s", opts) if _, err := conn.DeleteDBInstance(&opts); err != nil { return err } // re-uses db_instance refresh func log.Println("[INFO] Waiting for RDS Cluster Instance to be destroyed") stateConf := &resource.StateChangeConf{ Pending: []string{"modifying", "deleting"}, Target: "", Refresh: resourceAwsDbInstanceStateRefreshFunc(d, meta), Timeout: 40 * time.Minute, MinTimeout: 10 * time.Second, } if _, err := stateConf.WaitForState(); err != nil { return err } return nil }
func resourceAwsMainRouteTableAssociationCreate(d *schema.ResourceData, meta interface{}) error { conn := meta.(*AWSClient).ec2conn vpcId := d.Get("vpc_id").(string) routeTableId := d.Get("route_table_id").(string) log.Printf("[INFO] Creating main route table association: %s => %s", vpcId, routeTableId) mainAssociation, err := findMainRouteTableAssociation(conn, vpcId) if err != nil { return err } resp, err := conn.ReplaceRouteTableAssociation(&ec2.ReplaceRouteTableAssociationInput{ AssociationId: mainAssociation.RouteTableAssociationId, RouteTableId: aws.String(routeTableId), }) if err != nil { return err } d.Set("original_route_table_id", mainAssociation.RouteTableId) d.SetId(*resp.NewAssociationId) log.Printf("[INFO] New main route table association ID: %s", d.Id()) return nil }
func resourceAwsDbInstanceRetrieve( d *schema.ResourceData, meta interface{}) (*rds.DBInstance, error) { conn := meta.(*AWSClient).rdsconn opts := rds.DescribeDBInstancesInput{ DBInstanceIdentifier: aws.String(d.Id()), } log.Printf("[DEBUG] DB Instance describe configuration: %#v", opts) resp, err := conn.DescribeDBInstances(&opts) if err != nil { dbinstanceerr, ok := err.(awserr.Error) if ok && dbinstanceerr.Code() == "DBInstanceNotFound" { return nil, nil } return nil, fmt.Errorf("Error retrieving DB Instances: %s", err) } if len(resp.DBInstances) != 1 || *resp.DBInstances[0].DBInstanceIdentifier != d.Id() { if err != nil { return nil, nil } } return resp.DBInstances[0], nil }
func resourceDnsManagedZoneCreate(d *schema.ResourceData, meta interface{}) error { config := meta.(*Config) // Build the parameter zone := &dns.ManagedZone{ Name: d.Get("name").(string), DnsName: d.Get("dns_name").(string), } // Optional things if v, ok := d.GetOk("description"); ok { zone.Description = v.(string) } if v, ok := d.GetOk("dns_name"); ok { zone.DnsName = v.(string) } log.Printf("[DEBUG] DNS ManagedZone create request: %#v", zone) zone, err := config.clientDns.ManagedZones.Create(config.Project, zone).Do() if err != nil { return fmt.Errorf("Error creating DNS ManagedZone: %s", err) } d.SetId(zone.Name) return resourceDnsManagedZoneRead(d, meta) }