func resourceScalewayServerUpdate(d *schema.ResourceData, m interface{}) error { scaleway := m.(*Client).scaleway var req api.ScalewayServerPatchDefinition if d.HasChange("name") { name := d.Get("name").(string) req.Name = &name } if d.HasChange("tags") { if raw, ok := d.GetOk("tags"); ok { var tags []string for _, tag := range raw.([]interface{}) { tags = append(tags, tag.(string)) } req.Tags = &tags } } if d.HasChange("dynamic_ip_required") { req.DynamicIPRequired = Bool(d.Get("dynamic_ip_required").(bool)) } if err := scaleway.PatchServer(d.Id(), req); err != nil { return fmt.Errorf("Failed patching scaleway server: %q", err) } return resourceScalewayServerRead(d, m) }
func runPatch(cmd *Command, args []string) error { if patchHelp { return cmd.PrintUsage() } if len(args) != 2 { return cmd.PrintShortUsage() } // Parsing FIELD=VALUE updateParts := strings.SplitN(args[1], "=", 2) if len(updateParts) != 2 { return cmd.PrintShortUsage() } fieldName := updateParts[0] newValue := updateParts[1] changes := 0 ident := api.GetIdentifier(cmd.API, args[0]) switch ident.Type { case api.IdentifierServer: currentServer, err := cmd.API.GetServer(ident.Identifier) if err != nil { log.Fatalf("Cannot get server %s: %v", ident.Identifier, err) } var payload api.ScalewayServerPatchDefinition switch fieldName { case "state_detail": log.Debugf("%s=%s => %s=%s", fieldName, currentServer.StateDetail, fieldName, newValue) if currentServer.StateDetail != newValue { changes++ payload.StateDetail = &newValue } case "name": log.Warnf("To rename a server, Use 'scw rename'") log.Debugf("%s=%s => %s=%s", fieldName, currentServer.StateDetail, fieldName, newValue) if currentServer.Name != newValue { changes++ payload.Name = &newValue } case "bootscript": log.Debugf("%s=%s => %s=%s", fieldName, currentServer.Bootscript.Identifier, fieldName, newValue) if currentServer.Bootscript.Identifier != newValue { changes++ payload.Bootscript.Identifier = newValue } case "security_group": log.Debugf("%s=%s => %s=%s", fieldName, currentServer.SecurityGroup.Identifier, fieldName, newValue) if currentServer.SecurityGroup.Identifier != newValue { changes++ payload.SecurityGroup.Identifier = newValue } case "tags": newTags := strings.Split(newValue, " ") log.Debugf("%s=%s => %s=%s", fieldName, currentServer.Tags, fieldName, newTags) // fixme test equality with reflect.DeepEqual ? changes++ payload.Tags = &newTags default: log.Fatalf("'_patch server %s=' not implemented", fieldName) } // FIXME: volumes, tags, dynamic_ip_required if changes > 0 { log.Debugf("updating server: %d change(s)", changes) err = cmd.API.PatchServer(ident.Identifier, payload) } else { log.Debugf("no changes, not updating server") } if err != nil { log.Fatalf("Cannot update server: %v", err) } default: log.Fatalf("_patch not implemented for this kind of object") } fmt.Println(ident.Identifier) return nil }