forked from TrueCloudLab/lego
99 lines
2.1 KiB
Go
99 lines
2.1 KiB
Go
|
package egoscale
|
||
|
|
||
|
import (
|
||
|
"context"
|
||
|
"fmt"
|
||
|
|
||
|
"github.com/jinzhu/copier"
|
||
|
)
|
||
|
|
||
|
// ResourceType returns the type of the resource
|
||
|
func (*Volume) ResourceType() string {
|
||
|
return "Volume"
|
||
|
}
|
||
|
|
||
|
// Get fetches the given volume by ID
|
||
|
func (vol *Volume) Get(ctx context.Context, client *Client) error {
|
||
|
if vol.ID == "" {
|
||
|
return fmt.Errorf("A Volume may only be get using ID")
|
||
|
}
|
||
|
|
||
|
vols, err := client.ListWithContext(ctx, vol)
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
count := len(vols)
|
||
|
if count == 0 {
|
||
|
return &ErrorResponse{
|
||
|
ErrorCode: ParamError,
|
||
|
ErrorText: fmt.Sprintf("Volume not found. id: %s", vol.ID),
|
||
|
}
|
||
|
} else if count > 1 {
|
||
|
return fmt.Errorf("More than one Volume was found. Query: id: %s", vol.ID)
|
||
|
}
|
||
|
|
||
|
return copier.Copy(vol, vols[0])
|
||
|
}
|
||
|
|
||
|
// ListRequest builds the ListVolumes request
|
||
|
func (vol *Volume) ListRequest() (ListCommand, error) {
|
||
|
req := &ListVolumes{
|
||
|
Account: vol.Account,
|
||
|
DomainID: vol.DomainID,
|
||
|
Name: vol.Name,
|
||
|
Type: vol.Type,
|
||
|
VirtualMachineID: vol.VirtualMachineID,
|
||
|
ZoneID: vol.ZoneID,
|
||
|
}
|
||
|
|
||
|
return req, nil
|
||
|
}
|
||
|
|
||
|
// name returns the CloudStack API command name
|
||
|
func (*ResizeVolume) name() string {
|
||
|
return "resizeVolume"
|
||
|
}
|
||
|
|
||
|
func (*ResizeVolume) asyncResponse() interface{} {
|
||
|
return new(ResizeVolumeResponse)
|
||
|
}
|
||
|
|
||
|
// ResizeVolumeResponse represents the new Volume
|
||
|
type ResizeVolumeResponse struct {
|
||
|
Volume Volume `json:"volume"`
|
||
|
}
|
||
|
|
||
|
// name returns the CloudStack API command name
|
||
|
func (*ListVolumes) name() string {
|
||
|
return "listVolumes"
|
||
|
}
|
||
|
|
||
|
func (*ListVolumes) response() interface{} {
|
||
|
return new(ListVolumesResponse)
|
||
|
}
|
||
|
|
||
|
// SetPage sets the current page
|
||
|
func (ls *ListVolumes) SetPage(page int) {
|
||
|
ls.Page = page
|
||
|
}
|
||
|
|
||
|
// SetPageSize sets the page size
|
||
|
func (ls *ListVolumes) SetPageSize(pageSize int) {
|
||
|
ls.PageSize = pageSize
|
||
|
}
|
||
|
|
||
|
func (*ListVolumes) each(resp interface{}, callback IterateItemFunc) {
|
||
|
volumes, ok := resp.(*ListVolumesResponse)
|
||
|
if !ok {
|
||
|
callback(nil, fmt.Errorf("ListVolumesResponse expected, got %t", resp))
|
||
|
return
|
||
|
}
|
||
|
|
||
|
for i := range volumes.Volume {
|
||
|
if !callback(&volumes.Volume[i], nil) {
|
||
|
break
|
||
|
}
|
||
|
}
|
||
|
}
|