package godo import ( "fmt" "net/url" ) // ActionRequest reprents DigitalOcean Action Request type ActionRequest map[string]interface{} // DropletActionsService is an interface for interfacing with the Droplet actions // endpoints of the DigitalOcean API // See: https://developers.digitalocean.com/documentation/v2#droplet-actions type DropletActionsService interface { Shutdown(int) (*Action, *Response, error) ShutdownByTag(string) (*Action, *Response, error) PowerOff(int) (*Action, *Response, error) PowerOffByTag(string) (*Action, *Response, error) PowerOn(int) (*Action, *Response, error) PowerOnByTag(string) (*Action, *Response, error) PowerCycle(int) (*Action, *Response, error) PowerCycleByTag(string) (*Action, *Response, error) Reboot(int) (*Action, *Response, error) Restore(int, int) (*Action, *Response, error) Resize(int, string, bool) (*Action, *Response, error) Rename(int, string) (*Action, *Response, error) Snapshot(int, string) (*Action, *Response, error) SnapshotByTag(string, string) (*Action, *Response, error) EnableBackups(int) (*Action, *Response, error) EnableBackupsByTag(string) (*Action, *Response, error) DisableBackups(int) (*Action, *Response, error) DisableBackupsByTag(string) (*Action, *Response, error) PasswordReset(int) (*Action, *Response, error) RebuildByImageID(int, int) (*Action, *Response, error) RebuildByImageSlug(int, string) (*Action, *Response, error) ChangeKernel(int, int) (*Action, *Response, error) EnableIPv6(int) (*Action, *Response, error) EnableIPv6ByTag(string) (*Action, *Response, error) EnablePrivateNetworking(int) (*Action, *Response, error) EnablePrivateNetworkingByTag(string) (*Action, *Response, error) Upgrade(int) (*Action, *Response, error) Get(int, int) (*Action, *Response, error) GetByURI(string) (*Action, *Response, error) } // DropletActionsServiceOp handles communication with the Droplet action related // methods of the DigitalOcean API. type DropletActionsServiceOp struct { client *Client } var _ DropletActionsService = &DropletActionsServiceOp{} // Shutdown a Droplet func (s *DropletActionsServiceOp) Shutdown(id int) (*Action, *Response, error) { request := &ActionRequest{"type": "shutdown"} return s.doAction(id, request) } // ShutdownByTag shuts down Droplets matched by a Tag. func (s *DropletActionsServiceOp) ShutdownByTag(tag string) (*Action, *Response, error) { request := &ActionRequest{"type": "shutdown"} return s.doActionByTag(tag, request) } // PowerOff a Droplet func (s *DropletActionsServiceOp) PowerOff(id int) (*Action, *Response, error) { request := &ActionRequest{"type": "power_off"} return s.doAction(id, request) } // PowerOffByTag powers off Droplets matched by a Tag. func (s *DropletActionsServiceOp) PowerOffByTag(tag string) (*Action, *Response, error) { request := &ActionRequest{"type": "power_off"} return s.doActionByTag(tag, request) } // PowerOn a Droplet func (s *DropletActionsServiceOp) PowerOn(id int) (*Action, *Response, error) { request := &ActionRequest{"type": "power_on"} return s.doAction(id, request) } // PowerOnByTag powers on Droplets matched by a Tag. func (s *DropletActionsServiceOp) PowerOnByTag(tag string) (*Action, *Response, error) { request := &ActionRequest{"type": "power_on"} return s.doActionByTag(tag, request) } // PowerCycle a Droplet func (s *DropletActionsServiceOp) PowerCycle(id int) (*Action, *Response, error) { request := &ActionRequest{"type": "power_cycle"} return s.doAction(id, request) } // PowerCycleByTag power cycles Droplets matched by a Tag. func (s *DropletActionsServiceOp) PowerCycleByTag(tag string) (*Action, *Response, error) { request := &ActionRequest{"type": "power_cycle"} return s.doActionByTag(tag, request) } // Reboot a Droplet func (s *DropletActionsServiceOp) Reboot(id int) (*Action, *Response, error) { request := &ActionRequest{"type": "reboot"} return s.doAction(id, request) } // Restore an image to a Droplet func (s *DropletActionsServiceOp) Restore(id, imageID int) (*Action, *Response, error) { requestType := "restore" request := &ActionRequest{ "type": requestType, "image": float64(imageID), } return s.doAction(id, request) } // Resize a Droplet func (s *DropletActionsServiceOp) Resize(id int, sizeSlug string, resizeDisk bool) (*Action, *Response, error) { requestType := "resize" request := &ActionRequest{ "type": requestType, "size": sizeSlug, "disk": resizeDisk, } return s.doAction(id, request) } // Rename a Droplet func (s *DropletActionsServiceOp) Rename(id int, name string) (*Action, *Response, error) { requestType := "rename" request := &ActionRequest{ "type": requestType, "name": name, } return s.doAction(id, request) } // Snapshot a Droplet. func (s *DropletActionsServiceOp) Snapshot(id int, name string) (*Action, *Response, error) { requestType := "snapshot" request := &ActionRequest{ "type": requestType, "name": name, } return s.doAction(id, request) } // SnapshotByTag snapshots Droplets matched by a Tag. func (s *DropletActionsServiceOp) SnapshotByTag(tag string, name string) (*Action, *Response, error) { requestType := "snapshot" request := &ActionRequest{ "type": requestType, "name": name, } return s.doActionByTag(tag, request) } // EnableBackups enables backups for a Droplet. func (s *DropletActionsServiceOp) EnableBackups(id int) (*Action, *Response, error) { request := &ActionRequest{"type": "enable_backups"} return s.doAction(id, request) } // EnableBackupsByTag enables backups for Droplets matched by a Tag. func (s *DropletActionsServiceOp) EnableBackupsByTag(tag string) (*Action, *Response, error) { request := &ActionRequest{"type": "enable_backups"} return s.doActionByTag(tag, request) } // DisableBackups disables backups for a Droplet. func (s *DropletActionsServiceOp) DisableBackups(id int) (*Action, *Response, error) { request := &ActionRequest{"type": "disable_backups"} return s.doAction(id, request) } // DisableBackupsByTag disables backups for Droplet matched by a Tag. func (s *DropletActionsServiceOp) DisableBackupsByTag(tag string) (*Action, *Response, error) { request := &ActionRequest{"type": "disable_backups"} return s.doActionByTag(tag, request) } // PasswordReset resets the password for a Droplet. func (s *DropletActionsServiceOp) PasswordReset(id int) (*Action, *Response, error) { request := &ActionRequest{"type": "password_reset"} return s.doAction(id, request) } // RebuildByImageID rebuilds a Droplet from an image with a given id. func (s *DropletActionsServiceOp) RebuildByImageID(id, imageID int) (*Action, *Response, error) { request := &ActionRequest{"type": "rebuild", "image": imageID} return s.doAction(id, request) } // RebuildByImageSlug rebuilds a Droplet from an Image matched by a given Slug. func (s *DropletActionsServiceOp) RebuildByImageSlug(id int, slug string) (*Action, *Response, error) { request := &ActionRequest{"type": "rebuild", "image": slug} return s.doAction(id, request) } // ChangeKernel changes the kernel for a Droplet. func (s *DropletActionsServiceOp) ChangeKernel(id, kernelID int) (*Action, *Response, error) { request := &ActionRequest{"type": "change_kernel", "kernel": kernelID} return s.doAction(id, request) } // EnableIPv6 enables IPv6 for a Droplet. func (s *DropletActionsServiceOp) EnableIPv6(id int) (*Action, *Response, error) { request := &ActionRequest{"type": "enable_ipv6"} return s.doAction(id, request) } // EnableIPv6ByTag enables IPv6 for Droplets matched by a Tag. func (s *DropletActionsServiceOp) EnableIPv6ByTag(tag string) (*Action, *Response, error) { request := &ActionRequest{"type": "enable_ipv6"} return s.doActionByTag(tag, request) } // EnablePrivateNetworking enables private networking for a Droplet. func (s *DropletActionsServiceOp) EnablePrivateNetworking(id int) (*Action, *Response, error) { request := &ActionRequest{"type": "enable_private_networking"} return s.doAction(id, request) } // EnablePrivateNetworkingByTag enables private networking for Droplets matched by a Tag. func (s *DropletActionsServiceOp) EnablePrivateNetworkingByTag(tag string) (*Action, *Response, error) { request := &ActionRequest{"type": "enable_private_networking"} return s.doActionByTag(tag, request) } // Upgrade a Droplet. func (s *DropletActionsServiceOp) Upgrade(id int) (*Action, *Response, error) { request := &ActionRequest{"type": "upgrade"} return s.doAction(id, request) } func (s *DropletActionsServiceOp) doAction(id int, request *ActionRequest) (*Action, *Response, error) { if id < 1 { return nil, nil, NewArgError("id", "cannot be less than 1") } if request == nil { return nil, nil, NewArgError("request", "request can't be nil") } path := dropletActionPath(id) req, err := s.client.NewRequest("POST", path, request) if err != nil { return nil, nil, err } root := new(actionRoot) resp, err := s.client.Do(req, root) if err != nil { return nil, resp, err } return root.Event, resp, err } func (s *DropletActionsServiceOp) doActionByTag(tag string, request *ActionRequest) (*Action, *Response, error) { if tag == "" { return nil, nil, NewArgError("tag", "cannot be empty") } if request == nil { return nil, nil, NewArgError("request", "request can't be nil") } path := dropletActionPathByTag(tag) req, err := s.client.NewRequest("POST", path, request) if err != nil { return nil, nil, err } root := new(actionRoot) resp, err := s.client.Do(req, root) if err != nil { return nil, resp, err } return root.Event, resp, err } // Get an action for a particular Droplet by id. func (s *DropletActionsServiceOp) Get(dropletID, actionID int) (*Action, *Response, error) { if dropletID < 1 { return nil, nil, NewArgError("dropletID", "cannot be less than 1") } if actionID < 1 { return nil, nil, NewArgError("actionID", "cannot be less than 1") } path := fmt.Sprintf("%s/%d", dropletActionPath(dropletID), actionID) return s.get(path) } // GetByURI gets an action for a particular Droplet by id. func (s *DropletActionsServiceOp) GetByURI(rawurl string) (*Action, *Response, error) { u, err := url.Parse(rawurl) if err != nil { return nil, nil, err } return s.get(u.Path) } func (s *DropletActionsServiceOp) get(path string) (*Action, *Response, error) { req, err := s.client.NewRequest("GET", path, nil) if err != nil { return nil, nil, err } root := new(actionRoot) resp, err := s.client.Do(req, root) if err != nil { return nil, resp, err } return root.Event, resp, err } func dropletActionPath(dropletID int) string { return fmt.Sprintf("v2/droplets/%d/actions", dropletID) } func dropletActionPathByTag(tag string) string { return fmt.Sprintf("v2/droplets/actions?tag_name=%s", tag) }