224 lines
5.7 KiB
Go
224 lines
5.7 KiB
Go
package packngo
|
|
|
|
import "fmt"
|
|
|
|
const deviceBasePath = "/devices"
|
|
|
|
// DeviceService interface defines available device methods
|
|
type DeviceService interface {
|
|
List(ProjectID string) ([]Device, *Response, error)
|
|
Get(string) (*Device, *Response, error)
|
|
Create(*DeviceCreateRequest) (*Device, *Response, error)
|
|
Delete(string) (*Response, error)
|
|
Reboot(string) (*Response, error)
|
|
PowerOff(string) (*Response, error)
|
|
PowerOn(string) (*Response, error)
|
|
Lock(string) (*Response, error)
|
|
Unlock(string) (*Response, error)
|
|
}
|
|
|
|
type devicesRoot struct {
|
|
Devices []Device `json:"devices"`
|
|
}
|
|
|
|
// Device represents a Packet device
|
|
type Device struct {
|
|
ID string `json:"id"`
|
|
Href string `json:"href,omitempty"`
|
|
Hostname string `json:"hostname,omitempty"`
|
|
State string `json:"state,omitempty"`
|
|
Created string `json:"created_at,omitempty"`
|
|
Updated string `json:"updated_at,omitempty"`
|
|
Locked bool `json:"locked,omitempty"`
|
|
BillingCycle string `json:"billing_cycle,omitempty"`
|
|
Tags []string `json:"tags,omitempty"`
|
|
Network []*IPAddress `json:"ip_addresses"`
|
|
OS *OS `json:"operating_system,omitempty"`
|
|
Plan *Plan `json:"plan,omitempty"`
|
|
Facility *Facility `json:"facility,omitempty"`
|
|
Project *Project `json:"project,omitempty"`
|
|
ProvisionPer float32 `json:"provisioning_percentage,omitempty"`
|
|
}
|
|
|
|
func (d Device) String() string {
|
|
return Stringify(d)
|
|
}
|
|
|
|
// DeviceCreateRequest type used to create a Packet device
|
|
type DeviceCreateRequest struct {
|
|
HostName string `json:"hostname"`
|
|
Plan string `json:"plan"`
|
|
Facility string `json:"facility"`
|
|
OS string `json:"operating_system"`
|
|
BillingCycle string `json:"billing_cycle"`
|
|
ProjectID string `json:"project_id"`
|
|
UserData string `json:"userdata"`
|
|
Tags []string `json:"tags"`
|
|
}
|
|
|
|
func (d DeviceCreateRequest) String() string {
|
|
return Stringify(d)
|
|
}
|
|
|
|
// DeviceActionRequest type used to execute actions on devices
|
|
type DeviceActionRequest struct {
|
|
Type string `json:"type"`
|
|
}
|
|
|
|
func (d DeviceActionRequest) String() string {
|
|
return Stringify(d)
|
|
}
|
|
|
|
// DeviceServiceOp implements DeviceService
|
|
type DeviceServiceOp struct {
|
|
client *Client
|
|
}
|
|
|
|
// List returns devices on a project
|
|
func (s *DeviceServiceOp) List(projectID string) ([]Device, *Response, error) {
|
|
path := fmt.Sprintf("%s/%s/devices?include=facility", projectBasePath, projectID)
|
|
|
|
req, err := s.client.NewRequest("GET", path, nil)
|
|
if err != nil {
|
|
return nil, nil, err
|
|
}
|
|
|
|
root := new(devicesRoot)
|
|
resp, err := s.client.Do(req, root)
|
|
if err != nil {
|
|
return nil, resp, err
|
|
}
|
|
|
|
return root.Devices, resp, err
|
|
}
|
|
|
|
// Get returns a device by id
|
|
func (s *DeviceServiceOp) Get(deviceID string) (*Device, *Response, error) {
|
|
path := fmt.Sprintf("%s/%s?include=facility", deviceBasePath, deviceID)
|
|
|
|
req, err := s.client.NewRequest("GET", path, nil)
|
|
if err != nil {
|
|
return nil, nil, err
|
|
}
|
|
|
|
device := new(Device)
|
|
resp, err := s.client.Do(req, device)
|
|
if err != nil {
|
|
return nil, resp, err
|
|
}
|
|
|
|
return device, resp, err
|
|
}
|
|
|
|
// Create creates a new device
|
|
func (s *DeviceServiceOp) Create(createRequest *DeviceCreateRequest) (*Device, *Response, error) {
|
|
path := fmt.Sprintf("%s/%s/devices", projectBasePath, createRequest.ProjectID)
|
|
|
|
req, err := s.client.NewRequest("POST", path, createRequest)
|
|
if err != nil {
|
|
return nil, nil, err
|
|
}
|
|
|
|
device := new(Device)
|
|
resp, err := s.client.Do(req, device)
|
|
if err != nil {
|
|
return nil, resp, err
|
|
}
|
|
|
|
return device, resp, err
|
|
}
|
|
|
|
// Delete deletes a device
|
|
func (s *DeviceServiceOp) Delete(deviceID string) (*Response, error) {
|
|
path := fmt.Sprintf("%s/%s", deviceBasePath, deviceID)
|
|
|
|
req, err := s.client.NewRequest("DELETE", path, nil)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
resp, err := s.client.Do(req, nil)
|
|
|
|
return resp, err
|
|
}
|
|
|
|
// Reboot reboots on a device
|
|
func (s *DeviceServiceOp) Reboot(deviceID string) (*Response, error) {
|
|
path := fmt.Sprintf("%s/%s/actions", deviceBasePath, deviceID)
|
|
|
|
action := &DeviceActionRequest{Type: "reboot"}
|
|
req, err := s.client.NewRequest("POST", path, action)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
resp, err := s.client.Do(req, nil)
|
|
|
|
return resp, err
|
|
}
|
|
|
|
// PowerOff powers on a device
|
|
func (s *DeviceServiceOp) PowerOff(deviceID string) (*Response, error) {
|
|
path := fmt.Sprintf("%s/%s/actions", deviceBasePath, deviceID)
|
|
|
|
action := &DeviceActionRequest{Type: "power_off"}
|
|
req, err := s.client.NewRequest("POST", path, action)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
resp, err := s.client.Do(req, nil)
|
|
|
|
return resp, err
|
|
}
|
|
|
|
// PowerOn powers on a device
|
|
func (s *DeviceServiceOp) PowerOn(deviceID string) (*Response, error) {
|
|
path := fmt.Sprintf("%s/%s/actions", deviceBasePath, deviceID)
|
|
|
|
action := &DeviceActionRequest{Type: "power_on"}
|
|
req, err := s.client.NewRequest("POST", path, action)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
resp, err := s.client.Do(req, nil)
|
|
|
|
return resp, err
|
|
}
|
|
|
|
type lockDeviceType struct {
|
|
Locked bool `json:"locked"`
|
|
}
|
|
|
|
// Lock sets a device to "locked"
|
|
func (s *DeviceServiceOp) Lock(deviceID string) (*Response, error) {
|
|
path := fmt.Sprintf("%s/%s", deviceBasePath, deviceID)
|
|
|
|
action := lockDeviceType{Locked: true}
|
|
req, err := s.client.NewRequest("PATCH", path, action)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
resp, err := s.client.Do(req, nil)
|
|
|
|
return resp, err
|
|
|
|
}
|
|
|
|
// Unlock sets a device to "locked"
|
|
func (s *DeviceServiceOp) Unlock(deviceID string) (*Response, error) {
|
|
path := fmt.Sprintf("%s/%s", deviceBasePath, deviceID)
|
|
|
|
action := lockDeviceType{Locked: false}
|
|
req, err := s.client.NewRequest("PATCH", path, action)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
resp, err := s.client.Do(req, nil)
|
|
|
|
return resp, err
|
|
}
|