mirror of
				https://github.com/linuxkit/linuxkit.git
				synced 2025-10-31 00:45:22 +00:00 
			
		
		
		
	Merge pull request #1599 from avsm/packet-net-run
Add `moby run packet` to boot on baremetal Packet.net hosts
This commit is contained in:
		
							
								
								
									
										56
									
								
								vendor/github.com/packethost/packngo/LICENSE.txt
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										56
									
								
								vendor/github.com/packethost/packngo/LICENSE.txt
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,56 @@ | ||||
| Copyright (c) 2014 The packngo AUTHORS. All rights reserved. | ||||
|  | ||||
| MIT License | ||||
|  | ||||
| Permission is hereby granted, free of charge, to any person obtaining | ||||
| a copy of this software and associated documentation files (the | ||||
| "Software"), to deal in the Software without restriction, including | ||||
| without limitation the rights to use, copy, modify, merge, publish, | ||||
| distribute, sublicense, and/or sell copies of the Software, and to | ||||
| permit persons to whom the Software is furnished to do so, subject to | ||||
| the following conditions: | ||||
|  | ||||
| The above copyright notice and this permission notice shall be | ||||
| included in all copies or substantial portions of the Software. | ||||
|  | ||||
| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, | ||||
| EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | ||||
| MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND | ||||
| NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE | ||||
| LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION | ||||
| OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION | ||||
| WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | ||||
|  | ||||
| ====================== | ||||
| Portions of the client are based on code at: | ||||
| https://github.com/google/go-github/ and | ||||
| https://github.com/digitalocean/godo | ||||
|  | ||||
| Copyright (c) 2013 The go-github AUTHORS. All rights reserved. | ||||
|  | ||||
| Redistribution and use in source and binary forms, with or without | ||||
| modification, are permitted provided that the following conditions are | ||||
| met: | ||||
|  | ||||
|    * Redistributions of source code must retain the above copyright | ||||
| notice, this list of conditions and the following disclaimer. | ||||
|    * Redistributions in binary form must reproduce the above | ||||
| copyright notice, this list of conditions and the following disclaimer | ||||
| in the documentation and/or other materials provided with the | ||||
| distribution. | ||||
|    * Neither the name of Google Inc. nor the names of its | ||||
| contributors may be used to endorse or promote products derived from | ||||
| this software without specific prior written permission. | ||||
|  | ||||
| THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||||
| "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||||
| LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | ||||
| A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | ||||
| OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | ||||
| SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | ||||
| LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | ||||
| DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | ||||
| THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||||
| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | ||||
| OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||
|  | ||||
							
								
								
									
										9
									
								
								vendor/github.com/packethost/packngo/README.md
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								vendor/github.com/packethost/packngo/README.md
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,9 @@ | ||||
| # packngo | ||||
| Packet Go Api Client | ||||
|  | ||||
|  | ||||
|  | ||||
| Committing | ||||
| ---------- | ||||
|  | ||||
| Before committing, it's a good idea to run `gofmt -w *.go`. ([gofmt](https://golang.org/cmd/gofmt/)) | ||||
							
								
								
									
										223
									
								
								vendor/github.com/packethost/packngo/devices.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										223
									
								
								vendor/github.com/packethost/packngo/devices.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,223 @@ | ||||
| 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 | ||||
| } | ||||
							
								
								
									
										41
									
								
								vendor/github.com/packethost/packngo/email.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										41
									
								
								vendor/github.com/packethost/packngo/email.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,41 @@ | ||||
| package packngo | ||||
|  | ||||
| const emailBasePath = "/emails" | ||||
|  | ||||
| // EmailService interface defines available email methods | ||||
| type EmailService interface { | ||||
| 	Get(string) (*Email, *Response, error) | ||||
| } | ||||
|  | ||||
| // Email represents a user's email address | ||||
| type Email struct { | ||||
| 	ID      string `json:"id"` | ||||
| 	Address string `json:"address"` | ||||
| 	Default bool   `json:"default,omitempty"` | ||||
| 	URL     string `json:"href,omitempty"` | ||||
| } | ||||
|  | ||||
| func (e Email) String() string { | ||||
| 	return Stringify(e) | ||||
| } | ||||
|  | ||||
| // EmailServiceOp implements EmailService | ||||
| type EmailServiceOp struct { | ||||
| 	client *Client | ||||
| } | ||||
|  | ||||
| // Get retrieves an email by id | ||||
| func (s *EmailServiceOp) Get(emailID string) (*Email, *Response, error) { | ||||
| 	req, err := s.client.NewRequest("GET", emailBasePath, nil) | ||||
| 	if err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
|  | ||||
| 	email := new(Email) | ||||
| 	resp, err := s.client.Do(req, email) | ||||
| 	if err != nil { | ||||
| 		return nil, resp, err | ||||
| 	} | ||||
|  | ||||
| 	return email, resp, err | ||||
| } | ||||
							
								
								
									
										56
									
								
								vendor/github.com/packethost/packngo/facilities.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										56
									
								
								vendor/github.com/packethost/packngo/facilities.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,56 @@ | ||||
| package packngo | ||||
|  | ||||
| const facilityBasePath = "/facilities" | ||||
|  | ||||
| // FacilityService interface defines available facility methods | ||||
| type FacilityService interface { | ||||
| 	List() ([]Facility, *Response, error) | ||||
| } | ||||
|  | ||||
| type facilityRoot struct { | ||||
| 	Facilities []Facility `json:"facilities"` | ||||
| } | ||||
|  | ||||
| // Facility represents a Packet facility | ||||
| type Facility struct { | ||||
| 	ID       string   `json:"id"` | ||||
| 	Name     string   `json:"name,omitempty"` | ||||
| 	Code     string   `json:"code,omitempty"` | ||||
| 	Features []string `json:"features,omitempty"` | ||||
| 	Address  *Address `json:"address,omitempty"` | ||||
| 	URL      string   `json:"href,omitempty"` | ||||
| } | ||||
|  | ||||
| func (f Facility) String() string { | ||||
| 	return Stringify(f) | ||||
| } | ||||
|  | ||||
| // Address - the physical address of the facility | ||||
| type Address struct { | ||||
| 	ID string `json:"id,omitempty"` | ||||
| } | ||||
|  | ||||
| func (a Address) String() string { | ||||
| 	return Stringify(a) | ||||
| } | ||||
|  | ||||
| // FacilityServiceOp implements FacilityService | ||||
| type FacilityServiceOp struct { | ||||
| 	client *Client | ||||
| } | ||||
|  | ||||
| // List returns all available Packet facilities | ||||
| func (s *FacilityServiceOp) List() ([]Facility, *Response, error) { | ||||
| 	req, err := s.client.NewRequest("GET", facilityBasePath, nil) | ||||
| 	if err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
|  | ||||
| 	root := new(facilityRoot) | ||||
| 	resp, err := s.client.Do(req, root) | ||||
| 	if err != nil { | ||||
| 		return nil, resp, err | ||||
| 	} | ||||
|  | ||||
| 	return root.Facilities, resp, err | ||||
| } | ||||
							
								
								
									
										204
									
								
								vendor/github.com/packethost/packngo/ip.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										204
									
								
								vendor/github.com/packethost/packngo/ip.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,204 @@ | ||||
| package packngo | ||||
|  | ||||
| import "fmt" | ||||
|  | ||||
| const ipBasePath = "/ips" | ||||
|  | ||||
| // IPService interface defines available IP methods | ||||
| type IPService interface { | ||||
| 	Assign(deviceID string, assignRequest *IPAddressAssignRequest) (*IPAddress, *Response, error) | ||||
| 	Unassign(ipAddressID string) (*Response, error) | ||||
| 	Get(ipAddressID string) (*IPAddress, *Response, error) | ||||
| } | ||||
|  | ||||
| // IPAddress represents a ip address | ||||
| type IPAddress struct { | ||||
| 	ID            string            `json:"id"` | ||||
| 	Address       string            `json:"address"` | ||||
| 	Gateway       string            `json:"gateway"` | ||||
| 	Network       string            `json:"network"` | ||||
| 	AddressFamily int               `json:"address_family"` | ||||
| 	Netmask       string            `json:"netmask"` | ||||
| 	Public        bool              `json:"public"` | ||||
| 	Cidr          int               `json:"cidr"` | ||||
| 	AssignedTo    map[string]string `json:"assigned_to"` | ||||
| 	Created       string            `json:"created_at,omitempty"` | ||||
| 	Updated       string            `json:"updated_at,omitempty"` | ||||
| 	Href          string            `json:"href"` | ||||
| 	Facility      Facility          `json:"facility,omitempty"` | ||||
| } | ||||
|  | ||||
| // IPAddressAssignRequest represents the body if a ip assign request | ||||
| type IPAddressAssignRequest struct { | ||||
| 	Address string `json:"address"` | ||||
| } | ||||
|  | ||||
| func (i IPAddress) String() string { | ||||
| 	return Stringify(i) | ||||
| } | ||||
|  | ||||
| // IPServiceOp implements IPService | ||||
| type IPServiceOp struct { | ||||
| 	client *Client | ||||
| } | ||||
|  | ||||
| // Get returns IpAddress by ID | ||||
| func (i *IPServiceOp) Get(ipAddressID string) (*IPAddress, *Response, error) { | ||||
| 	path := fmt.Sprintf("%s/%s", ipBasePath, ipAddressID) | ||||
|  | ||||
| 	req, err := i.client.NewRequest("GET", path, nil) | ||||
| 	if err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
|  | ||||
| 	ip := new(IPAddress) | ||||
| 	resp, err := i.client.Do(req, ip) | ||||
| 	if err != nil { | ||||
| 		return nil, resp, err | ||||
| 	} | ||||
|  | ||||
| 	return ip, resp, err | ||||
| } | ||||
|  | ||||
| // Unassign unassigns an IP address record. This will remove the relationship between an IP | ||||
| // and the device and will make the IP address available to be assigned to another device. | ||||
| func (i *IPServiceOp) Unassign(ipAddressID string) (*Response, error) { | ||||
| 	path := fmt.Sprintf("%s/%s", ipBasePath, ipAddressID) | ||||
|  | ||||
| 	req, err := i.client.NewRequest("DELETE", path, nil) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
|  | ||||
| 	resp, err := i.client.Do(req, nil) | ||||
| 	return resp, err | ||||
| } | ||||
|  | ||||
| // Assign assigns an IP address to a device. The IP address must be in one of the IP ranges assigned to the device’s project. | ||||
| func (i *IPServiceOp) Assign(deviceID string, assignRequest *IPAddressAssignRequest) (*IPAddress, *Response, error) { | ||||
| 	path := fmt.Sprintf("%s/%s%s", deviceBasePath, deviceID, ipBasePath) | ||||
|  | ||||
| 	req, err := i.client.NewRequest("POST", path, assignRequest) | ||||
|  | ||||
| 	ip := new(IPAddress) | ||||
| 	resp, err := i.client.Do(req, ip) | ||||
| 	if err != nil { | ||||
| 		return nil, resp, err | ||||
| 	} | ||||
|  | ||||
| 	return ip, resp, err | ||||
| } | ||||
|  | ||||
| // IP RESERVATIONS API | ||||
|  | ||||
| // IPReservationService interface defines available IPReservation methods | ||||
| type IPReservationService interface { | ||||
| 	List(projectID string) ([]IPReservation, *Response, error) | ||||
| 	RequestMore(projectID string, ipReservationReq *IPReservationRequest) (*IPReservation, *Response, error) | ||||
| 	Get(ipReservationID string) (*IPReservation, *Response, error) | ||||
| 	Remove(ipReservationID string) (*Response, error) | ||||
| } | ||||
|  | ||||
| // IPReservationServiceOp implements the IPReservationService interface | ||||
| type IPReservationServiceOp struct { | ||||
| 	client *Client | ||||
| } | ||||
|  | ||||
| // IPReservationRequest represents the body of a reservation request | ||||
| type IPReservationRequest struct { | ||||
| 	Type     string `json:"type"` | ||||
| 	Quantity int    `json:"quantity"` | ||||
| 	Comments string `json:"comments"` | ||||
| } | ||||
|  | ||||
| // IPReservation represent an IP reservation for a single project | ||||
| type IPReservation struct { | ||||
| 	ID            string              `json:"id"` | ||||
| 	Network       string              `json:"network"` | ||||
| 	Address       string              `json:"address"` | ||||
| 	AddressFamily int                 `json:"address_family"` | ||||
| 	Netmask       string              `json:"netmask"` | ||||
| 	Public        bool                `json:"public"` | ||||
| 	Cidr          int                 `json:"cidr"` | ||||
| 	Management    bool                `json:"management"` | ||||
| 	Manageable    bool                `json:"manageable"` | ||||
| 	Addon         bool                `json:"addon"` | ||||
| 	Bill          bool                `json:"bill"` | ||||
| 	Assignments   []map[string]string `json:"assignments"` | ||||
| 	Created       string              `json:"created_at,omitempty"` | ||||
| 	Updated       string              `json:"updated_at,omitempty"` | ||||
| 	Href          string              `json:"href"` | ||||
| } | ||||
|  | ||||
| type ipReservationRoot struct { | ||||
| 	IPReservations []IPReservation `json:"ip_addresses"` | ||||
| } | ||||
|  | ||||
| // List provides a list of IP resevations for a single project. | ||||
| func (i *IPReservationServiceOp) List(projectID string) ([]IPReservation, *Response, error) { | ||||
| 	path := fmt.Sprintf("%s/%s%s", projectBasePath, projectID, ipBasePath) | ||||
|  | ||||
| 	req, err := i.client.NewRequest("GET", path, nil) | ||||
| 	if err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
|  | ||||
| 	reservations := new(ipReservationRoot) | ||||
| 	resp, err := i.client.Do(req, reservations) | ||||
| 	if err != nil { | ||||
| 		return nil, resp, err | ||||
| 	} | ||||
| 	return reservations.IPReservations, resp, err | ||||
| } | ||||
|  | ||||
| // RequestMore requests more IP space for a project in order to have additional IP addresses to assign to devices | ||||
| func (i *IPReservationServiceOp) RequestMore(projectID string, ipReservationReq *IPReservationRequest) (*IPReservation, *Response, error) { | ||||
| 	path := fmt.Sprintf("%s/%s%s", projectBasePath, projectID, ipBasePath) | ||||
|  | ||||
| 	req, err := i.client.NewRequest("POST", path, &ipReservationReq) | ||||
| 	if err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
|  | ||||
| 	ip := new(IPReservation) | ||||
| 	resp, err := i.client.Do(req, ip) | ||||
| 	if err != nil { | ||||
| 		return nil, resp, err | ||||
| 	} | ||||
| 	return ip, resp, err | ||||
| } | ||||
|  | ||||
| // Get returns a single IP reservation object | ||||
| func (i *IPReservationServiceOp) Get(ipReservationID string) (*IPReservation, *Response, error) { | ||||
| 	path := fmt.Sprintf("%s/%s", ipBasePath, ipReservationID) | ||||
|  | ||||
| 	req, err := i.client.NewRequest("GET", path, nil) | ||||
| 	if err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
|  | ||||
| 	reservation := new(IPReservation) | ||||
| 	resp, err := i.client.Do(req, reservation) | ||||
| 	if err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
|  | ||||
| 	return reservation, resp, err | ||||
| } | ||||
|  | ||||
| // Remove removes an IP reservation from the project. | ||||
| func (i *IPReservationServiceOp) Remove(ipReservationID string) (*Response, error) { | ||||
| 	path := fmt.Sprintf("%s/%s", ipBasePath, ipReservationID) | ||||
|  | ||||
| 	req, err := i.client.NewRequest("DELETE", path, nil) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
|  | ||||
| 	resp, err := i.client.Do(req, nil) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
|  | ||||
| 	return resp, err | ||||
| } | ||||
							
								
								
									
										45
									
								
								vendor/github.com/packethost/packngo/operatingsystems.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										45
									
								
								vendor/github.com/packethost/packngo/operatingsystems.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,45 @@ | ||||
| package packngo | ||||
|  | ||||
| const osBasePath = "/operating-systems" | ||||
|  | ||||
| // OSService interface defines available operating_systems methods | ||||
| type OSService interface { | ||||
| 	List() ([]OS, *Response, error) | ||||
| } | ||||
|  | ||||
| type osRoot struct { | ||||
| 	OperatingSystems []OS `json:"operating_systems"` | ||||
| } | ||||
|  | ||||
| // OS represents a Packet operating system | ||||
| type OS struct { | ||||
| 	Name    string `json:"name"` | ||||
| 	Slug    string `json:"slug"` | ||||
| 	Distro  string `json:"distro"` | ||||
| 	Version string `json:"version"` | ||||
| } | ||||
|  | ||||
| func (o OS) String() string { | ||||
| 	return Stringify(o) | ||||
| } | ||||
|  | ||||
| // OSServiceOp implements OSService | ||||
| type OSServiceOp struct { | ||||
| 	client *Client | ||||
| } | ||||
|  | ||||
| // List returns all available operating systems | ||||
| func (s *OSServiceOp) List() ([]OS, *Response, error) { | ||||
| 	req, err := s.client.NewRequest("GET", osBasePath, nil) | ||||
| 	if err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
|  | ||||
| 	root := new(osRoot) | ||||
| 	resp, err := s.client.Do(req, root) | ||||
| 	if err != nil { | ||||
| 		return nil, resp, err | ||||
| 	} | ||||
|  | ||||
| 	return root.OperatingSystems, resp, err | ||||
| } | ||||
							
								
								
									
										218
									
								
								vendor/github.com/packethost/packngo/packngo.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										218
									
								
								vendor/github.com/packethost/packngo/packngo.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,218 @@ | ||||
| package packngo | ||||
|  | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"encoding/json" | ||||
| 	"fmt" | ||||
| 	"io" | ||||
| 	"io/ioutil" | ||||
| 	"net/http" | ||||
| 	"net/url" | ||||
| 	"strconv" | ||||
| 	"strings" | ||||
| 	"time" | ||||
| ) | ||||
|  | ||||
| const ( | ||||
| 	libraryVersion = "0.1.0" | ||||
| 	baseURL        = "https://api.packet.net/" | ||||
| 	userAgent      = "packngo/" + libraryVersion | ||||
| 	mediaType      = "application/json" | ||||
|  | ||||
| 	headerRateLimit     = "X-RateLimit-Limit" | ||||
| 	headerRateRemaining = "X-RateLimit-Remaining" | ||||
| 	headerRateReset     = "X-RateLimit-Reset" | ||||
| ) | ||||
|  | ||||
| // ListOptions specifies optional global API parameters | ||||
| type ListOptions struct { | ||||
| 	// for paginated result sets, page of results to retrieve | ||||
| 	Page int `url:"page,omitempty"` | ||||
|  | ||||
| 	// for paginated result sets, the number of results to return per page | ||||
| 	PerPage int `url:"per_page,omitempty"` | ||||
|  | ||||
| 	// specify which resources you want to return as collections instead of references | ||||
| 	Includes string | ||||
| } | ||||
|  | ||||
| // Response is the http response from api calls | ||||
| type Response struct { | ||||
| 	*http.Response | ||||
| 	Rate | ||||
| } | ||||
|  | ||||
| func (r *Response) populateRate() { | ||||
| 	// parse the rate limit headers and populate Response.Rate | ||||
| 	if limit := r.Header.Get(headerRateLimit); limit != "" { | ||||
| 		r.Rate.RequestLimit, _ = strconv.Atoi(limit) | ||||
| 	} | ||||
| 	if remaining := r.Header.Get(headerRateRemaining); remaining != "" { | ||||
| 		r.Rate.RequestsRemaining, _ = strconv.Atoi(remaining) | ||||
| 	} | ||||
| 	if reset := r.Header.Get(headerRateReset); reset != "" { | ||||
| 		if v, _ := strconv.ParseInt(reset, 10, 64); v != 0 { | ||||
| 			r.Rate.Reset = Timestamp{time.Unix(v, 0)} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // ErrorResponse is the http response used on errrors | ||||
| type ErrorResponse struct { | ||||
| 	Response *http.Response | ||||
| 	Errors   []string `json:"errors"` | ||||
| } | ||||
|  | ||||
| func (r *ErrorResponse) Error() string { | ||||
| 	return fmt.Sprintf("%v %v: %d %v", | ||||
| 		r.Response.Request.Method, r.Response.Request.URL, r.Response.StatusCode, strings.Join(r.Errors, ", ")) | ||||
| } | ||||
|  | ||||
| // Client is the base API Client | ||||
| type Client struct { | ||||
| 	client *http.Client | ||||
|  | ||||
| 	BaseURL *url.URL | ||||
|  | ||||
| 	UserAgent     string | ||||
| 	ConsumerToken string | ||||
| 	APIKey        string | ||||
|  | ||||
| 	RateLimit Rate | ||||
|  | ||||
| 	// Packet Api Objects | ||||
| 	Plans            PlanService | ||||
| 	Users            UserService | ||||
| 	Emails           EmailService | ||||
| 	SSHKeys          SSHKeyService | ||||
| 	Devices          DeviceService | ||||
| 	Projects         ProjectService | ||||
| 	Facilities       FacilityService | ||||
| 	OperatingSystems OSService | ||||
| 	Ips              IPService | ||||
| 	IpReservations   IPReservationService | ||||
| 	Volumes          VolumeService | ||||
| } | ||||
|  | ||||
| // NewRequest inits a new http request with the proper headers | ||||
| func (c *Client) NewRequest(method, path string, body interface{}) (*http.Request, error) { | ||||
| 	// relative path to append to the endpoint url, no leading slash please | ||||
| 	rel, err := url.Parse(path) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
|  | ||||
| 	u := c.BaseURL.ResolveReference(rel) | ||||
|  | ||||
| 	// json encode the request body, if any | ||||
| 	buf := new(bytes.Buffer) | ||||
| 	if body != nil { | ||||
| 		err := json.NewEncoder(buf).Encode(body) | ||||
| 		if err != nil { | ||||
| 			return nil, err | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	req, err := http.NewRequest(method, u.String(), buf) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
|  | ||||
| 	req.Close = true | ||||
|  | ||||
| 	req.Header.Add("X-Auth-Token", c.APIKey) | ||||
| 	req.Header.Add("X-Consumer-Token", c.ConsumerToken) | ||||
|  | ||||
| 	req.Header.Add("Content-Type", mediaType) | ||||
| 	req.Header.Add("Accept", mediaType) | ||||
| 	req.Header.Add("User-Agent", userAgent) | ||||
| 	return req, nil | ||||
| } | ||||
|  | ||||
| // Do executes the http request | ||||
| func (c *Client) Do(req *http.Request, v interface{}) (*Response, error) { | ||||
| 	resp, err := c.client.Do(req) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
|  | ||||
| 	defer resp.Body.Close() | ||||
|  | ||||
| 	response := Response{Response: resp} | ||||
| 	response.populateRate() | ||||
| 	c.RateLimit = response.Rate | ||||
|  | ||||
| 	err = checkResponse(resp) | ||||
| 	// if the response is an error, return the ErrorResponse | ||||
| 	if err != nil { | ||||
| 		return &response, err | ||||
| 	} | ||||
|  | ||||
| 	if v != nil { | ||||
| 		// if v implements the io.Writer interface, return the raw response | ||||
| 		if w, ok := v.(io.Writer); ok { | ||||
| 			io.Copy(w, resp.Body) | ||||
| 		} else { | ||||
| 			err = json.NewDecoder(resp.Body).Decode(v) | ||||
| 			if err != nil { | ||||
| 				return &response, err | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	return &response, err | ||||
| } | ||||
|  | ||||
| // NewClient initializes and returns a Client, use this to get an API Client to operate on | ||||
| // N.B.: Packet's API certificate requires Go 1.5+ to successfully parse. If you are using | ||||
| // an older version of Go, pass in a custom http.Client with a custom TLS configuration | ||||
| // that sets "InsecureSkipVerify" to "true" | ||||
| func NewClient(consumerToken string, apiKey string, httpClient *http.Client) *Client { | ||||
| 	client, _ := NewClientWithBaseURL(consumerToken, apiKey, httpClient, baseURL) | ||||
| 	return client | ||||
| } | ||||
| func NewClientWithBaseURL(consumerToken string, apiKey string, httpClient *http.Client, apiBaseURL string) (*Client, error) { | ||||
| 	if httpClient == nil { | ||||
| 		// Don't fall back on http.DefaultClient as it's not nice to adjust state | ||||
| 		// implicitly. If the client wants to use http.DefaultClient, they can | ||||
| 		// pass it in explicitly. | ||||
| 		httpClient = &http.Client{} | ||||
| 	} | ||||
|  | ||||
| 	u, err := url.Parse(apiBaseURL) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
|  | ||||
| 	c := &Client{client: httpClient, BaseURL: u, UserAgent: userAgent, ConsumerToken: consumerToken, APIKey: apiKey} | ||||
| 	c.Plans = &PlanServiceOp{client: c} | ||||
| 	c.Users = &UserServiceOp{client: c} | ||||
| 	c.Emails = &EmailServiceOp{client: c} | ||||
| 	c.SSHKeys = &SSHKeyServiceOp{client: c} | ||||
| 	c.Devices = &DeviceServiceOp{client: c} | ||||
| 	c.Projects = &ProjectServiceOp{client: c} | ||||
| 	c.Facilities = &FacilityServiceOp{client: c} | ||||
| 	c.OperatingSystems = &OSServiceOp{client: c} | ||||
| 	c.Ips = &IPServiceOp{client: c} | ||||
| 	c.IpReservations = &IPReservationServiceOp{client: c} | ||||
| 	c.Volumes = &VolumeServiceOp{client: c} | ||||
|  | ||||
| 	return c, nil | ||||
| } | ||||
|  | ||||
| func checkResponse(r *http.Response) error { | ||||
| 	// return if http status code is within 200 range | ||||
| 	if c := r.StatusCode; c >= 200 && c <= 299 { | ||||
| 		// response is good, return | ||||
| 		return nil | ||||
| 	} | ||||
|  | ||||
| 	errorResponse := &ErrorResponse{Response: r} | ||||
| 	data, err := ioutil.ReadAll(r.Body) | ||||
| 	// if the response has a body, populate the message in errorResponse | ||||
| 	if err == nil && len(data) > 0 { | ||||
| 		json.Unmarshal(data, errorResponse) | ||||
| 	} | ||||
|  | ||||
| 	return errorResponse | ||||
| } | ||||
							
								
								
									
										122
									
								
								vendor/github.com/packethost/packngo/plans.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										122
									
								
								vendor/github.com/packethost/packngo/plans.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,122 @@ | ||||
| package packngo | ||||
|  | ||||
| const planBasePath = "/plans" | ||||
|  | ||||
| // PlanService interface defines available plan methods | ||||
| type PlanService interface { | ||||
| 	List() ([]Plan, *Response, error) | ||||
| } | ||||
|  | ||||
| type planRoot struct { | ||||
| 	Plans []Plan `json:"plans"` | ||||
| } | ||||
|  | ||||
| // Plan represents a Packet service plan | ||||
| type Plan struct { | ||||
| 	ID          string   `json:"id"` | ||||
| 	Slug        string   `json:"slug,omitempty"` | ||||
| 	Name        string   `json:"name,omitempty"` | ||||
| 	Description string   `json:"description,omitempty"` | ||||
| 	Line        string   `json:"line,omitempty"` | ||||
| 	Specs       *Specs   `json:"specs,omitempty"` | ||||
| 	Pricing     *Pricing `json:"pricing,omitempty"` | ||||
| } | ||||
|  | ||||
| func (p Plan) String() string { | ||||
| 	return Stringify(p) | ||||
| } | ||||
|  | ||||
| // Specs - the server specs for a plan | ||||
| type Specs struct { | ||||
| 	Cpus     []*Cpus   `json:"cpus,omitempty"` | ||||
| 	Memory   *Memory   `json:"memory,omitempty"` | ||||
| 	Drives   []*Drives `json:"drives,omitempty"` | ||||
| 	Nics     []*Nics   `json:"nics,omitempty"` | ||||
| 	Features *Features `json:"features,omitempty"` | ||||
| } | ||||
|  | ||||
| func (s Specs) String() string { | ||||
| 	return Stringify(s) | ||||
| } | ||||
|  | ||||
| // Cpus - the CPU config details for specs on a plan | ||||
| type Cpus struct { | ||||
| 	Count int    `json:"count,omitempty"` | ||||
| 	Type  string `json:"type,omitempty"` | ||||
| } | ||||
|  | ||||
| func (c Cpus) String() string { | ||||
| 	return Stringify(c) | ||||
| } | ||||
|  | ||||
| // Memory - the RAM config details for specs on a plan | ||||
| type Memory struct { | ||||
| 	Total string `json:"total,omitempty"` | ||||
| } | ||||
|  | ||||
| func (m Memory) String() string { | ||||
| 	return Stringify(m) | ||||
| } | ||||
|  | ||||
| // Drives - the storage config details for specs on a plan | ||||
| type Drives struct { | ||||
| 	Count int    `json:"count,omitempty"` | ||||
| 	Size  string `json:"size,omitempty"` | ||||
| 	Type  string `json:"type,omitempty"` | ||||
| } | ||||
|  | ||||
| func (d Drives) String() string { | ||||
| 	return Stringify(d) | ||||
| } | ||||
|  | ||||
| // Nics - the network hardware details for specs on a plan | ||||
| type Nics struct { | ||||
| 	Count int    `json:"count,omitempty"` | ||||
| 	Type  string `json:"type,omitempty"` | ||||
| } | ||||
|  | ||||
| func (n Nics) String() string { | ||||
| 	return Stringify(n) | ||||
| } | ||||
|  | ||||
| // Features - other features in the specs for a plan | ||||
| type Features struct { | ||||
| 	Raid bool `json:"raid,omitempty"` | ||||
| 	Txt  bool `json:"txt,omitempty"` | ||||
| } | ||||
|  | ||||
| func (f Features) String() string { | ||||
| 	return Stringify(f) | ||||
| } | ||||
|  | ||||
| // Pricing - the pricing options on a plan | ||||
| type Pricing struct { | ||||
| 	Hourly  float32 `json:"hourly,omitempty"` | ||||
| 	Monthly float32 `json:"monthly,omitempty"` | ||||
| } | ||||
|  | ||||
| func (p Pricing) String() string { | ||||
| 	return Stringify(p) | ||||
| } | ||||
|  | ||||
| // PlanServiceOp implements PlanService | ||||
| type PlanServiceOp struct { | ||||
| 	client *Client | ||||
| } | ||||
|  | ||||
| // List method returns all available plans | ||||
| func (s *PlanServiceOp) List() ([]Plan, *Response, error) { | ||||
| 	req, err := s.client.NewRequest("GET", planBasePath, nil) | ||||
|  | ||||
| 	if err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
|  | ||||
| 	root := new(planRoot) | ||||
| 	resp, err := s.client.Do(req, root) | ||||
| 	if err != nil { | ||||
| 		return nil, resp, err | ||||
| 	} | ||||
|  | ||||
| 	return root.Plans, resp, err | ||||
| } | ||||
							
								
								
									
										183
									
								
								vendor/github.com/packethost/packngo/projects.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										183
									
								
								vendor/github.com/packethost/packngo/projects.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,183 @@ | ||||
| package packngo | ||||
|  | ||||
| import "fmt" | ||||
|  | ||||
| const projectBasePath = "/projects" | ||||
|  | ||||
| // ProjectService interface defines available project methods | ||||
| type ProjectService interface { | ||||
| 	List() ([]Project, *Response, error) | ||||
| 	Get(string) (*Project, *Response, error) | ||||
| 	Create(*ProjectCreateRequest) (*Project, *Response, error) | ||||
| 	Update(*ProjectUpdateRequest) (*Project, *Response, error) | ||||
| 	Delete(string) (*Response, error) | ||||
| 	ListIPAddresses(string) ([]IPAddress, *Response, error) | ||||
| 	ListVolumes(string) ([]Volume, *Response, error) | ||||
| } | ||||
|  | ||||
| type ipsRoot struct { | ||||
| 	IPAddresses []IPAddress `json:"ip_addresses"` | ||||
| } | ||||
|  | ||||
| type volumesRoot struct { | ||||
| 	Volumes []Volume `json:"volumes"` | ||||
| } | ||||
|  | ||||
| type projectsRoot struct { | ||||
| 	Projects []Project `json:"projects"` | ||||
| } | ||||
|  | ||||
| // Project represents a Packet project | ||||
| type Project struct { | ||||
| 	ID      string   `json:"id"` | ||||
| 	Name    string   `json:"name,omitempty"` | ||||
| 	Created string   `json:"created_at,omitempty"` | ||||
| 	Updated string   `json:"updated_at,omitempty"` | ||||
| 	Users   []User   `json:"members,omitempty"` | ||||
| 	Devices []Device `json:"devices,omitempty"` | ||||
| 	SSHKeys []SSHKey `json:"ssh_keys,omitempty"` | ||||
| 	URL     string   `json:"href,omitempty"` | ||||
| } | ||||
|  | ||||
| func (p Project) String() string { | ||||
| 	return Stringify(p) | ||||
| } | ||||
|  | ||||
| // ProjectCreateRequest type used to create a Packet project | ||||
| type ProjectCreateRequest struct { | ||||
| 	Name          string `json:"name"` | ||||
| 	PaymentMethod string `json:"payment_method,omitempty"` | ||||
| } | ||||
|  | ||||
| func (p ProjectCreateRequest) String() string { | ||||
| 	return Stringify(p) | ||||
| } | ||||
|  | ||||
| // ProjectUpdateRequest type used to update a Packet project | ||||
| type ProjectUpdateRequest struct { | ||||
| 	ID            string `json:"id"` | ||||
| 	Name          string `json:"name,omitempty"` | ||||
| 	PaymentMethod string `json:"payment_method,omitempty"` | ||||
| } | ||||
|  | ||||
| func (p ProjectUpdateRequest) String() string { | ||||
| 	return Stringify(p) | ||||
| } | ||||
|  | ||||
| // ProjectServiceOp implements ProjectService | ||||
| type ProjectServiceOp struct { | ||||
| 	client *Client | ||||
| } | ||||
|  | ||||
| func (s *ProjectServiceOp) ListIPAddresses(projectID string) ([]IPAddress, *Response, error) { | ||||
| 	url := fmt.Sprintf("%s/%s/ips", projectBasePath, projectID) | ||||
| 	req, err := s.client.NewRequest("GET", url, nil) | ||||
| 	if err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
|  | ||||
| 	root := new(ipsRoot) | ||||
| 	resp, err := s.client.Do(req, root) | ||||
| 	if err != nil { | ||||
| 		return nil, resp, err | ||||
| 	} | ||||
|  | ||||
| 	return root.IPAddresses, resp, err | ||||
| } | ||||
|  | ||||
| // List returns the user's projects | ||||
| func (s *ProjectServiceOp) List() ([]Project, *Response, error) { | ||||
| 	req, err := s.client.NewRequest("GET", projectBasePath, nil) | ||||
| 	if err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
|  | ||||
| 	root := new(projectsRoot) | ||||
| 	resp, err := s.client.Do(req, root) | ||||
| 	if err != nil { | ||||
| 		return nil, resp, err | ||||
| 	} | ||||
|  | ||||
| 	return root.Projects, resp, err | ||||
| } | ||||
|  | ||||
| // Get returns a project by id | ||||
| func (s *ProjectServiceOp) Get(projectID string) (*Project, *Response, error) { | ||||
| 	path := fmt.Sprintf("%s/%s", projectBasePath, projectID) | ||||
| 	req, err := s.client.NewRequest("GET", path, nil) | ||||
| 	if err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
|  | ||||
| 	project := new(Project) | ||||
| 	resp, err := s.client.Do(req, project) | ||||
| 	if err != nil { | ||||
| 		return nil, resp, err | ||||
| 	} | ||||
|  | ||||
| 	return project, resp, err | ||||
| } | ||||
|  | ||||
| // Create creates a new project | ||||
| func (s *ProjectServiceOp) Create(createRequest *ProjectCreateRequest) (*Project, *Response, error) { | ||||
| 	req, err := s.client.NewRequest("POST", projectBasePath, createRequest) | ||||
| 	if err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
|  | ||||
| 	project := new(Project) | ||||
| 	resp, err := s.client.Do(req, project) | ||||
| 	if err != nil { | ||||
| 		return nil, resp, err | ||||
| 	} | ||||
|  | ||||
| 	return project, resp, err | ||||
| } | ||||
|  | ||||
| // Update updates a project | ||||
| func (s *ProjectServiceOp) Update(updateRequest *ProjectUpdateRequest) (*Project, *Response, error) { | ||||
| 	path := fmt.Sprintf("%s/%s", projectBasePath, updateRequest.ID) | ||||
| 	req, err := s.client.NewRequest("PATCH", path, updateRequest) | ||||
| 	if err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
|  | ||||
| 	project := new(Project) | ||||
| 	resp, err := s.client.Do(req, project) | ||||
| 	if err != nil { | ||||
| 		return nil, resp, err | ||||
| 	} | ||||
|  | ||||
| 	return project, resp, err | ||||
| } | ||||
|  | ||||
| // Delete deletes a project | ||||
| func (s *ProjectServiceOp) Delete(projectID string) (*Response, error) { | ||||
| 	path := fmt.Sprintf("%s/%s", projectBasePath, projectID) | ||||
|  | ||||
| 	req, err := s.client.NewRequest("DELETE", path, nil) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
|  | ||||
| 	resp, err := s.client.Do(req, nil) | ||||
|  | ||||
| 	return resp, err | ||||
| } | ||||
|  | ||||
| // List returns Volumes for a project | ||||
| func (s *ProjectServiceOp) ListVolumes(projectID string) ([]Volume, *Response, error) { | ||||
| 	url := fmt.Sprintf("%s/%s%s", projectBasePath, projectID, volumeBasePath) | ||||
| 	req, err := s.client.NewRequest("GET", url, nil) | ||||
| 	if err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
|  | ||||
| 	root := new(volumesRoot) | ||||
| 	resp, err := s.client.Do(req, root) | ||||
| 	if err != nil { | ||||
| 		return nil, resp, err | ||||
| 	} | ||||
|  | ||||
| 	return root.Volumes, resp, err | ||||
| } | ||||
							
								
								
									
										12
									
								
								vendor/github.com/packethost/packngo/rate.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								vendor/github.com/packethost/packngo/rate.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,12 @@ | ||||
| package packngo | ||||
|  | ||||
| // Rate provides the API request rate limit details | ||||
| type Rate struct { | ||||
| 	RequestLimit      int       `json:"request_limit"` | ||||
| 	RequestsRemaining int       `json:"requests_remaining"` | ||||
| 	Reset             Timestamp `json:"rate_reset"` | ||||
| } | ||||
|  | ||||
| func (r Rate) String() string { | ||||
| 	return Stringify(r) | ||||
| } | ||||
							
								
								
									
										146
									
								
								vendor/github.com/packethost/packngo/sshkeys.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										146
									
								
								vendor/github.com/packethost/packngo/sshkeys.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,146 @@ | ||||
| package packngo | ||||
|  | ||||
| import "fmt" | ||||
|  | ||||
| const sshKeyBasePath = "/ssh-keys" | ||||
|  | ||||
| // SSHKeyService interface defines available device methods | ||||
| type SSHKeyService interface { | ||||
| 	List() ([]SSHKey, *Response, error) | ||||
| 	Get(string) (*SSHKey, *Response, error) | ||||
| 	Create(*SSHKeyCreateRequest) (*SSHKey, *Response, error) | ||||
| 	Update(*SSHKeyUpdateRequest) (*SSHKey, *Response, error) | ||||
| 	Delete(string) (*Response, error) | ||||
| } | ||||
|  | ||||
| type sshKeyRoot struct { | ||||
| 	SSHKeys []SSHKey `json:"ssh_keys"` | ||||
| } | ||||
|  | ||||
| // SSHKey represents a user's ssh key | ||||
| type SSHKey struct { | ||||
| 	ID          string `json:"id"` | ||||
| 	Label       string `json:"label"` | ||||
| 	Key         string `json:"key"` | ||||
| 	FingerPrint string `json:"fingerprint"` | ||||
| 	Created     string `json:"created_at"` | ||||
| 	Updated     string `json:"updated_at"` | ||||
| 	User        User   `json:"user,omitempty"` | ||||
| 	URL         string `json:"href,omitempty"` | ||||
| } | ||||
|  | ||||
| func (s SSHKey) String() string { | ||||
| 	return Stringify(s) | ||||
| } | ||||
|  | ||||
| // SSHKeyCreateRequest type used to create an ssh key | ||||
| type SSHKeyCreateRequest struct { | ||||
| 	Label     string `json:"label"` | ||||
| 	Key       string `json:"key"` | ||||
| 	ProjectID string `json:"-"` | ||||
| } | ||||
|  | ||||
| func (s SSHKeyCreateRequest) String() string { | ||||
| 	return Stringify(s) | ||||
| } | ||||
|  | ||||
| // SSHKeyUpdateRequest type used to update an ssh key | ||||
| type SSHKeyUpdateRequest struct { | ||||
| 	ID    string `json:"id"` | ||||
| 	Label string `json:"label"` | ||||
| 	Key   string `json:"key"` | ||||
| } | ||||
|  | ||||
| func (s SSHKeyUpdateRequest) String() string { | ||||
| 	return Stringify(s) | ||||
| } | ||||
|  | ||||
| // SSHKeyServiceOp implements SSHKeyService | ||||
| type SSHKeyServiceOp struct { | ||||
| 	client *Client | ||||
| } | ||||
|  | ||||
| // List returns a user's ssh keys | ||||
| func (s *SSHKeyServiceOp) List() ([]SSHKey, *Response, error) { | ||||
| 	req, err := s.client.NewRequest("GET", sshKeyBasePath, nil) | ||||
| 	if err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
|  | ||||
| 	root := new(sshKeyRoot) | ||||
| 	resp, err := s.client.Do(req, root) | ||||
| 	if err != nil { | ||||
| 		return nil, resp, err | ||||
| 	} | ||||
|  | ||||
| 	return root.SSHKeys, resp, err | ||||
| } | ||||
|  | ||||
| // Get returns an ssh key by id | ||||
| func (s *SSHKeyServiceOp) Get(sshKeyID string) (*SSHKey, *Response, error) { | ||||
| 	path := fmt.Sprintf("%s/%s", sshKeyBasePath, sshKeyID) | ||||
|  | ||||
| 	req, err := s.client.NewRequest("GET", path, nil) | ||||
| 	if err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
|  | ||||
| 	sshKey := new(SSHKey) | ||||
| 	resp, err := s.client.Do(req, sshKey) | ||||
| 	if err != nil { | ||||
| 		return nil, resp, err | ||||
| 	} | ||||
|  | ||||
| 	return sshKey, resp, err | ||||
| } | ||||
|  | ||||
| // Create creates a new ssh key | ||||
| func (s *SSHKeyServiceOp) Create(createRequest *SSHKeyCreateRequest) (*SSHKey, *Response, error) { | ||||
| 	path := sshKeyBasePath | ||||
| 	if createRequest.ProjectID != "" { | ||||
| 		path = "/projects/" + createRequest.ProjectID + sshKeyBasePath | ||||
| 	} | ||||
| 	req, err := s.client.NewRequest("POST", path, createRequest) | ||||
| 	if err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
|  | ||||
| 	sshKey := new(SSHKey) | ||||
| 	resp, err := s.client.Do(req, sshKey) | ||||
| 	if err != nil { | ||||
| 		return nil, resp, err | ||||
| 	} | ||||
|  | ||||
| 	return sshKey, resp, err | ||||
| } | ||||
|  | ||||
| // Update updates an ssh key | ||||
| func (s *SSHKeyServiceOp) Update(updateRequest *SSHKeyUpdateRequest) (*SSHKey, *Response, error) { | ||||
| 	path := fmt.Sprintf("%s/%s", sshKeyBasePath, updateRequest.ID) | ||||
| 	req, err := s.client.NewRequest("PATCH", path, updateRequest) | ||||
| 	if err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
|  | ||||
| 	sshKey := new(SSHKey) | ||||
| 	resp, err := s.client.Do(req, sshKey) | ||||
| 	if err != nil { | ||||
| 		return nil, resp, err | ||||
| 	} | ||||
|  | ||||
| 	return sshKey, resp, err | ||||
| } | ||||
|  | ||||
| // Delete deletes an ssh key | ||||
| func (s *SSHKeyServiceOp) Delete(sshKeyID string) (*Response, error) { | ||||
| 	path := fmt.Sprintf("%s/%s", sshKeyBasePath, sshKeyID) | ||||
|  | ||||
| 	req, err := s.client.NewRequest("DELETE", path, nil) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
|  | ||||
| 	resp, err := s.client.Do(req, nil) | ||||
|  | ||||
| 	return resp, err | ||||
| } | ||||
							
								
								
									
										35
									
								
								vendor/github.com/packethost/packngo/timestamp.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										35
									
								
								vendor/github.com/packethost/packngo/timestamp.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,35 @@ | ||||
| package packngo | ||||
|  | ||||
| import ( | ||||
| 	"strconv" | ||||
| 	"time" | ||||
| ) | ||||
|  | ||||
| // Timestamp represents a time that can be unmarshalled from a JSON string | ||||
| // formatted as either an RFC3339 or Unix timestamp. All | ||||
| // exported methods of time.Time can be called on Timestamp. | ||||
| type Timestamp struct { | ||||
| 	time.Time | ||||
| } | ||||
|  | ||||
| func (t Timestamp) String() string { | ||||
| 	return t.Time.String() | ||||
| } | ||||
|  | ||||
| // UnmarshalJSON implements the json.Unmarshaler interface. | ||||
| // Time is expected in RFC3339 or Unix format. | ||||
| func (t *Timestamp) UnmarshalJSON(data []byte) (err error) { | ||||
| 	str := string(data) | ||||
| 	i, err := strconv.ParseInt(str, 10, 64) | ||||
| 	if err == nil { | ||||
| 		t.Time = time.Unix(i, 0) | ||||
| 	} else { | ||||
| 		t.Time, err = time.Parse(`"`+time.RFC3339+`"`, str) | ||||
| 	} | ||||
| 	return | ||||
| } | ||||
|  | ||||
| // Equal reports whether t and u are equal based on time.Equal | ||||
| func (t Timestamp) Equal(u Timestamp) bool { | ||||
| 	return t.Time.Equal(u.Time) | ||||
| } | ||||
							
								
								
									
										53
									
								
								vendor/github.com/packethost/packngo/user.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										53
									
								
								vendor/github.com/packethost/packngo/user.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,53 @@ | ||||
| package packngo | ||||
|  | ||||
| const userBasePath = "/users" | ||||
|  | ||||
| // UserService interface defines available user methods | ||||
| type UserService interface { | ||||
| 	Get(string) (*User, *Response, error) | ||||
| } | ||||
|  | ||||
| // User represents a Packet user | ||||
| type User struct { | ||||
| 	ID          string  `json:"id"` | ||||
| 	FirstName   string  `json:"first_name,omitempty"` | ||||
| 	LastName    string  `json:"last_name,omitempty"` | ||||
| 	FullName    string  `json:"full_name,omitempty"` | ||||
| 	Email       string  `json:"email,omitempty"` | ||||
| 	TwoFactor   string  `json:"two_factor_auth,omitempty"` | ||||
| 	AvatarURL   string  `json:"avatar_url,omitempty"` | ||||
| 	Facebook    string  `json:"twitter,omitempty"` | ||||
| 	Twitter     string  `json:"facebook,omitempty"` | ||||
| 	LinkedIn    string  `json:"linkedin,omitempty"` | ||||
| 	Created     string  `json:"created_at,omitempty"` | ||||
| 	Updated     string  `json:"updated_at,omitempty"` | ||||
| 	TimeZone    string  `json:"timezone,omitempty"` | ||||
| 	Emails      []Email `json:"email,omitempty"` | ||||
| 	PhoneNumber string  `json:"phone_number,omitempty"` | ||||
| 	URL         string  `json:"href,omitempty"` | ||||
| } | ||||
|  | ||||
| func (u User) String() string { | ||||
| 	return Stringify(u) | ||||
| } | ||||
|  | ||||
| // UserServiceOp implements UserService | ||||
| type UserServiceOp struct { | ||||
| 	client *Client | ||||
| } | ||||
|  | ||||
| // Get method gets a user by userID | ||||
| func (s *UserServiceOp) Get(userID string) (*User, *Response, error) { | ||||
| 	req, err := s.client.NewRequest("GET", userBasePath, nil) | ||||
| 	if err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
|  | ||||
| 	user := new(User) | ||||
| 	resp, err := s.client.Do(req, user) | ||||
| 	if err != nil { | ||||
| 		return nil, resp, err | ||||
| 	} | ||||
|  | ||||
| 	return user, resp, err | ||||
| } | ||||
							
								
								
									
										112
									
								
								vendor/github.com/packethost/packngo/utils.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										112
									
								
								vendor/github.com/packethost/packngo/utils.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,112 @@ | ||||
| package packngo | ||||
|  | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"fmt" | ||||
| 	"io" | ||||
| 	"reflect" | ||||
| ) | ||||
|  | ||||
| var timestampType = reflect.TypeOf(Timestamp{}) | ||||
|  | ||||
| // Stringify creates a string representation of the provided message | ||||
| func Stringify(message interface{}) string { | ||||
| 	var buf bytes.Buffer | ||||
| 	v := reflect.ValueOf(message) | ||||
| 	stringifyValue(&buf, v) | ||||
| 	return buf.String() | ||||
| } | ||||
|  | ||||
| // String allocates a new string value to store v and returns a pointer to it | ||||
| func String(v string) *string { | ||||
| 	p := new(string) | ||||
| 	*p = v | ||||
| 	return p | ||||
| } | ||||
|  | ||||
| // Int allocates a new int32 value to store v and returns a pointer to it, but unlike Int32 its argument value is an int. | ||||
| func Int(v int) *int { | ||||
| 	p := new(int) | ||||
| 	*p = v | ||||
| 	return p | ||||
| } | ||||
|  | ||||
| // Bool allocates a new bool value to store v and returns a pointer to it. | ||||
| func Bool(v bool) *bool { | ||||
| 	p := new(bool) | ||||
| 	*p = v | ||||
| 	return p | ||||
| } | ||||
|  | ||||
| // StreamToString converts a reader to a string | ||||
| func StreamToString(stream io.Reader) string { | ||||
| 	buf := new(bytes.Buffer) | ||||
| 	buf.ReadFrom(stream) | ||||
| 	return buf.String() | ||||
| } | ||||
|  | ||||
| // stringifyValue was graciously cargoculted from the goprotubuf library | ||||
| func stringifyValue(w io.Writer, val reflect.Value) { | ||||
| 	if val.Kind() == reflect.Ptr && val.IsNil() { | ||||
| 		w.Write([]byte("<nil>")) | ||||
| 		return | ||||
| 	} | ||||
|  | ||||
| 	v := reflect.Indirect(val) | ||||
|  | ||||
| 	switch v.Kind() { | ||||
| 	case reflect.String: | ||||
| 		fmt.Fprintf(w, `"%s"`, v) | ||||
| 	case reflect.Slice: | ||||
| 		w.Write([]byte{'['}) | ||||
| 		for i := 0; i < v.Len(); i++ { | ||||
| 			if i > 0 { | ||||
| 				w.Write([]byte{' '}) | ||||
| 			} | ||||
|  | ||||
| 			stringifyValue(w, v.Index(i)) | ||||
| 		} | ||||
|  | ||||
| 		w.Write([]byte{']'}) | ||||
| 		return | ||||
| 	case reflect.Struct: | ||||
| 		if v.Type().Name() != "" { | ||||
| 			w.Write([]byte(v.Type().String())) | ||||
| 		} | ||||
|  | ||||
| 		// special handling of Timestamp values | ||||
| 		if v.Type() == timestampType { | ||||
| 			fmt.Fprintf(w, "{%s}", v.Interface()) | ||||
| 			return | ||||
| 		} | ||||
|  | ||||
| 		w.Write([]byte{'{'}) | ||||
|  | ||||
| 		var sep bool | ||||
| 		for i := 0; i < v.NumField(); i++ { | ||||
| 			fv := v.Field(i) | ||||
| 			if fv.Kind() == reflect.Ptr && fv.IsNil() { | ||||
| 				continue | ||||
| 			} | ||||
| 			if fv.Kind() == reflect.Slice && fv.IsNil() { | ||||
| 				continue | ||||
| 			} | ||||
|  | ||||
| 			if sep { | ||||
| 				w.Write([]byte(", ")) | ||||
| 			} else { | ||||
| 				sep = true | ||||
| 			} | ||||
|  | ||||
| 			w.Write([]byte(v.Type().Field(i).Name)) | ||||
| 			w.Write([]byte{':'}) | ||||
| 			stringifyValue(w, fv) | ||||
| 		} | ||||
|  | ||||
| 		w.Write([]byte{'}'}) | ||||
| 	default: | ||||
| 		if v.CanInterface() { | ||||
| 			fmt.Fprint(w, v.Interface()) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										146
									
								
								vendor/github.com/packethost/packngo/volumes.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										146
									
								
								vendor/github.com/packethost/packngo/volumes.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,146 @@ | ||||
| package packngo | ||||
|  | ||||
| import "fmt" | ||||
|  | ||||
| const volumeBasePath = "/storage" | ||||
|  | ||||
| // VolumeService interface defines available Volume methods | ||||
| type VolumeService interface { | ||||
| 	Get(string) (*Volume, *Response, error) | ||||
| 	Update(*VolumeUpdateRequest) (*Volume, *Response, error) | ||||
| 	Delete(string) (*Response, error) | ||||
| 	Create(*VolumeCreateRequest) (*Volume, *Response, error) | ||||
| } | ||||
|  | ||||
| // Volume represents a volume | ||||
| type Volume struct { | ||||
| 	ID               string            `json:"id"` | ||||
| 	Name             string            `json:"name,omitempty"` | ||||
| 	Description      string            `json:"description,omitempty"` | ||||
| 	Size             int               `json:"size,omitempty"` | ||||
| 	State            string            `json:"state,omitempty"` | ||||
| 	Locked           bool              `json:"locked,omitempty"` | ||||
| 	BillingCycle     string            `json:"billing_cycle,omitempty"` | ||||
| 	Created          string            `json:"created_at,omitempty"` | ||||
| 	Updated          string            `json:"updated_at,omitempty"` | ||||
| 	Href             string            `json:"href,omitempty"` | ||||
| 	SnapshotPolicies []*SnapshotPolicy `json:"snapshot_policies,omitempty"` | ||||
| 	Attachments      []*Attachment     `json:"attachments,omitempty"` | ||||
| 	Plan             *Plan             `json:"plan,omitempty"` | ||||
| 	Facility         *Facility         `json:"facility,omitempty"` | ||||
| 	Project          *Project          `json:"project,omitempty"` | ||||
| } | ||||
|  | ||||
| // SnapshotPolicy used to execute actions on volume | ||||
| type SnapshotPolicy struct { | ||||
| 	ID                string `json:"id"` | ||||
| 	Href              string `json:"href"` | ||||
| 	SnapshotFrequency string `json:"snapshot_frequency,omitempty"` | ||||
| 	SnapshotCount     int    `json:"snapshot_count,omitempty"` | ||||
| } | ||||
|  | ||||
| // Attachment used to execute actions on volume | ||||
| type Attachment struct { | ||||
| 	ID   string `json:"id"` | ||||
| 	Href string `json:"href"` | ||||
| } | ||||
|  | ||||
| func (v Volume) String() string { | ||||
| 	return Stringify(v) | ||||
| } | ||||
|  | ||||
| // VolumeCreateRequest type used to create a Packet volume | ||||
| type VolumeCreateRequest struct { | ||||
| 	Size             int               `json:"size"` | ||||
| 	BillingCycle     string            `json:"billing_cycle"` | ||||
| 	ProjectID        string            `json:"project_id"` | ||||
| 	PlanID           string            `json:"plan_id"` | ||||
| 	FacilityID       string            `json:"facility_id"` | ||||
| 	Description      string            `json:"description,omitempty"` | ||||
| 	SnapshotPolicies []*SnapshotPolicy `json:"snapshot_policies,omitempty"` | ||||
| } | ||||
|  | ||||
| func (v VolumeCreateRequest) String() string { | ||||
| 	return Stringify(v) | ||||
| } | ||||
|  | ||||
| // VolumeUpdateRequest type used to update a Packet volume | ||||
| type VolumeUpdateRequest struct { | ||||
| 	ID          string `json:"id"` | ||||
| 	Description string `json:"description,omitempty"` | ||||
| 	Plan        string `json:"plan,omitempty"` | ||||
| } | ||||
|  | ||||
| func (v VolumeUpdateRequest) String() string { | ||||
| 	return Stringify(v) | ||||
| } | ||||
|  | ||||
| // VolumeServiceOp implements VolumeService | ||||
| type VolumeServiceOp struct { | ||||
| 	client *Client | ||||
| } | ||||
|  | ||||
| // Get returns a volume by id | ||||
| func (v *VolumeServiceOp) Get(volumeID string) (*Volume, *Response, error) { | ||||
| 	path := fmt.Sprintf("%s/%s?include=facility,snapshot_policies,attachments.device", volumeBasePath, volumeID) | ||||
| 	req, err := v.client.NewRequest("GET", path, nil) | ||||
| 	if err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
|  | ||||
| 	volume := new(Volume) | ||||
| 	resp, err := v.client.Do(req, volume) | ||||
| 	if err != nil { | ||||
| 		return nil, resp, err | ||||
| 	} | ||||
|  | ||||
| 	return volume, resp, err | ||||
| } | ||||
|  | ||||
| // Update updates a volume | ||||
| func (v *VolumeServiceOp) Update(updateRequest *VolumeUpdateRequest) (*Volume, *Response, error) { | ||||
| 	path := fmt.Sprintf("%s/%s", volumeBasePath, updateRequest.ID) | ||||
| 	req, err := v.client.NewRequest("PATCH", path, updateRequest) | ||||
| 	if err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
|  | ||||
| 	volume := new(Volume) | ||||
| 	resp, err := v.client.Do(req, volume) | ||||
| 	if err != nil { | ||||
| 		return nil, resp, err | ||||
| 	} | ||||
|  | ||||
| 	return volume, resp, err | ||||
| } | ||||
|  | ||||
| // Delete deletes a volume | ||||
| func (v *VolumeServiceOp) Delete(volumeID string) (*Response, error) { | ||||
| 	path := fmt.Sprintf("%s/%s", volumeBasePath, volumeID) | ||||
|  | ||||
| 	req, err := v.client.NewRequest("DELETE", path, nil) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
|  | ||||
| 	resp, err := v.client.Do(req, nil) | ||||
|  | ||||
| 	return resp, err | ||||
| } | ||||
|  | ||||
| // Create creates a new volume for a project | ||||
| func (v *VolumeServiceOp) Create(createRequest *VolumeCreateRequest) (*Volume, *Response, error) { | ||||
| 	url := fmt.Sprintf("%s/%s%s", projectBasePath, createRequest.ProjectID, volumeBasePath) | ||||
| 	req, err := v.client.NewRequest("POST", url, createRequest) | ||||
| 	if err != nil { | ||||
| 		return nil, nil, err | ||||
| 	} | ||||
|  | ||||
| 	volume := new(Volume) | ||||
| 	resp, err := v.client.Do(req, volume) | ||||
| 	if err != nil { | ||||
| 		return nil, resp, err | ||||
| 	} | ||||
|  | ||||
| 	return volume, resp, err | ||||
| } | ||||
		Reference in New Issue
	
	Block a user