func resourceAwsElasticBeanstalkConfigurationTemplateOptionSettingsUpdate(conn *elasticbeanstalk.ElasticBeanstalk, d *schema.ResourceData) error { if d.HasChange("setting") { _, err := conn.ValidateConfigurationSettings(&elasticbeanstalk.ValidateConfigurationSettingsInput{ ApplicationName: aws.String(d.Get("application").(string)), TemplateName: aws.String(d.Get("name").(string)), OptionSettings: gatherOptionSettings(d), }) if err != nil { return err } o, n := d.GetChange("setting") if o == nil { o = new(schema.Set) } if n == nil { n = new(schema.Set) } os := o.(*schema.Set) ns := o.(*schema.Set) remove := extractOptionSettings(os.Difference(ns)) add := extractOptionSettings(ns.Difference(os)) req := &elasticbeanstalk.UpdateConfigurationTemplateInput{ ApplicationName: aws.String(d.Get("application").(string)), TemplateName: aws.String(d.Get("name").(string)), OptionSettings: add, } for _, elem := range remove { req.OptionsToRemove = append(req.OptionsToRemove, &elasticbeanstalk.OptionSpecification{ Namespace: elem.Namespace, OptionName: elem.OptionName, }) } if _, err := conn.UpdateConfigurationTemplate(req); err != nil { return err } } return nil }
func resourceAwsElasticBeanstalkConfigurationTemplateOptionSettingsUpdate(conn *elasticbeanstalk.ElasticBeanstalk, d *schema.ResourceData) error { if d.HasChange("setting") { _, err := conn.ValidateConfigurationSettings(&elasticbeanstalk.ValidateConfigurationSettingsInput{ ApplicationName: aws.String(d.Get("application").(string)), TemplateName: aws.String(d.Get("name").(string)), OptionSettings: gatherOptionSettings(d), }) if err != nil { return err } o, n := d.GetChange("setting") if o == nil { o = new(schema.Set) } if n == nil { n = new(schema.Set) } os := o.(*schema.Set) ns := n.(*schema.Set) rm := extractOptionSettings(os.Difference(ns)) add := extractOptionSettings(ns.Difference(os)) // Additions and removals of options are done in a single API call, so we // can't do our normal "remove these" and then later "add these", re-adding // any updated settings. // Because of this, we need to remove any settings in the "removable" // settings that are also found in the "add" settings, otherwise they // conflict. Here we loop through all the initial removables from the set // difference, and we build up a slice of settings not found in the "add" // set var remove []*elasticbeanstalk.ConfigurationOptionSetting for _, r := range rm { for _, a := range add { if *r.Namespace == *a.Namespace && *r.OptionName == *a.OptionName { continue } remove = append(remove, r) } } req := &elasticbeanstalk.UpdateConfigurationTemplateInput{ ApplicationName: aws.String(d.Get("application").(string)), TemplateName: aws.String(d.Get("name").(string)), OptionSettings: add, } for _, elem := range remove { req.OptionsToRemove = append(req.OptionsToRemove, &elasticbeanstalk.OptionSpecification{ Namespace: elem.Namespace, OptionName: elem.OptionName, }) } log.Printf("[DEBUG] Update Configuration Template request: %s", req) if _, err := conn.UpdateConfigurationTemplate(req); err != nil { return err } } return nil }