terraform/vendor/github.com/maximilien/softlayer-go/services/softlayer_virtual_guest.go

1234 lines
44 KiB
Go

package services
import (
"bytes"
"encoding/base64"
"encoding/json"
"errors"
"fmt"
"net/url"
"strconv"
"strings"
"time"
common "github.com/maximilien/softlayer-go/common"
datatypes "github.com/maximilien/softlayer-go/data_types"
softlayer "github.com/maximilien/softlayer-go/softlayer"
)
const (
EPHEMERAL_DISK_CATEGORY_CODE = "guest_disk1"
// Package type for virtual servers: http://sldn.softlayer.com/reference/services/SoftLayer_Product_Order/placeOrder
VIRTUAL_SERVER_PACKAGE_TYPE = "VIRTUAL_SERVER_INSTANCE"
MAINTENANCE_WINDOW_PROPERTY = "MAINTENANCE_WINDOW"
// Described in the following link: http://sldn.softlayer.com/reference/datatypes/SoftLayer_Container_Product_Order_Virtual_Guest_Upgrade
UPGRADE_VIRTUAL_SERVER_ORDER_TYPE = "SoftLayer_Container_Product_Order_Virtual_Guest_Upgrade"
)
type softLayer_Virtual_Guest_Service struct {
client softlayer.Client
}
func NewSoftLayer_Virtual_Guest_Service(client softlayer.Client) *softLayer_Virtual_Guest_Service {
return &softLayer_Virtual_Guest_Service{
client: client,
}
}
func (slvgs *softLayer_Virtual_Guest_Service) GetName() string {
return "SoftLayer_Virtual_Guest"
}
func (slvgs *softLayer_Virtual_Guest_Service) CreateObject(template datatypes.SoftLayer_Virtual_Guest_Template) (datatypes.SoftLayer_Virtual_Guest, error) {
err := slvgs.checkCreateObjectRequiredValues(template)
if err != nil {
return datatypes.SoftLayer_Virtual_Guest{}, err
}
parameters := datatypes.SoftLayer_Virtual_Guest_Template_Parameters{
Parameters: []datatypes.SoftLayer_Virtual_Guest_Template{
template,
},
}
requestBody, err := json.Marshal(parameters)
if err != nil {
return datatypes.SoftLayer_Virtual_Guest{}, err
}
response, errorCode, err := slvgs.client.GetHttpClient().DoRawHttpRequest(fmt.Sprintf("%s.json", slvgs.GetName()), "POST", bytes.NewBuffer(requestBody))
if err != nil {
return datatypes.SoftLayer_Virtual_Guest{}, err
}
if common.IsHttpErrorCode(errorCode) {
errorMessage := fmt.Sprintf("softlayer-go: could not SoftLayer_Virtual_Guest#createObject, HTTP error code: '%d'", errorCode)
return datatypes.SoftLayer_Virtual_Guest{}, errors.New(errorMessage)
}
err = slvgs.client.GetHttpClient().CheckForHttpResponseErrors(response)
if err != nil {
return datatypes.SoftLayer_Virtual_Guest{}, err
}
softLayer_Virtual_Guest := datatypes.SoftLayer_Virtual_Guest{}
err = json.Unmarshal(response, &softLayer_Virtual_Guest)
if err != nil {
return datatypes.SoftLayer_Virtual_Guest{}, err
}
return softLayer_Virtual_Guest, nil
}
func (slvgs *softLayer_Virtual_Guest_Service) ReloadOperatingSystem(instanceId int, template datatypes.Image_Template_Config) error {
parameter := [2]interface{}{"FORCE", template}
parameters := map[string]interface{}{
"parameters": parameter,
}
requestBody, err := json.Marshal(parameters)
if err != nil {
return err
}
response, errorCode, err := slvgs.client.GetHttpClient().DoRawHttpRequest(fmt.Sprintf("%s/%d/reloadOperatingSystem.json", slvgs.GetName(), instanceId), "POST", bytes.NewBuffer(requestBody))
if err != nil {
return err
}
if common.IsHttpErrorCode(errorCode) {
errorMessage := fmt.Sprintf("softlayer-go: could not SoftLayer_Virtual_Guest#reloadOperatingSystem, HTTP error code: '%d'", errorCode)
return errors.New(errorMessage)
}
if res := string(response[:]); res != `"1"` {
return errors.New(fmt.Sprintf("Failed to reload OS on instance with id '%d', got '%s' as response from the API.", instanceId, res))
}
return nil
}
func (slvgs *softLayer_Virtual_Guest_Service) GetObject(instanceId int) (datatypes.SoftLayer_Virtual_Guest, error) {
objectMask := []string{
"accountId",
"createDate",
"dedicatedAccountHostOnlyFlag",
"domain",
"fullyQualifiedDomainName",
"hostname",
"hourlyBillingFlag",
"id",
"lastPowerStateId",
"lastVerifiedDate",
"maxCpu",
"maxCpuUnits",
"maxMemory",
"metricPollDate",
"modifyDate",
"notes",
"postInstallScriptUri",
"privateNetworkOnlyFlag",
"startCpus",
"statusId",
"uuid",
"userData.value",
"localDiskFlag",
"globalIdentifier",
"managedResourceFlag",
"primaryBackendIpAddress",
"primaryIpAddress",
"location.name",
"location.longName",
"location.id",
"datacenter.name",
"datacenter.longName",
"datacenter.id",
"networkComponents.maxSpeed",
"operatingSystem.passwords.password",
"operatingSystem.passwords.username",
"blockDeviceTemplateGroup.globalIdentifier",
"primaryNetworkComponent.networkVlan.id",
"primaryBackendNetworkComponent.networkVlan.id",
}
response, errorCode, err := slvgs.client.GetHttpClient().DoRawHttpRequestWithObjectMask(fmt.Sprintf("%s/%d/getObject.json", slvgs.GetName(), instanceId), objectMask, "GET", new(bytes.Buffer))
if err != nil {
return datatypes.SoftLayer_Virtual_Guest{}, err
}
if common.IsHttpErrorCode(errorCode) {
errorMessage := fmt.Sprintf("softlayer-go: could not SoftLayer_Virtual_Guest#getObject, HTTP error code: '%d'", errorCode)
return datatypes.SoftLayer_Virtual_Guest{}, errors.New(errorMessage)
}
virtualGuest := datatypes.SoftLayer_Virtual_Guest{}
err = json.Unmarshal(response, &virtualGuest)
if err != nil {
return datatypes.SoftLayer_Virtual_Guest{}, err
}
return virtualGuest, nil
}
func (slvgs *softLayer_Virtual_Guest_Service) GetObjectByPrimaryIpAddress(ipAddress string) (datatypes.SoftLayer_Virtual_Guest, error) {
ObjectFilter := string(`{"virtualGuests":{"primaryIpAddress":{"operation":"` + ipAddress + `"}}}`)
accountService, err := slvgs.client.GetSoftLayer_Account_Service()
if err != nil {
return datatypes.SoftLayer_Virtual_Guest{}, err
}
virtualGuests, err := accountService.GetVirtualGuestsByFilter(ObjectFilter)
if err != nil {
return datatypes.SoftLayer_Virtual_Guest{}, err
}
if len(virtualGuests) == 1 {
return virtualGuests[0], nil
}
return datatypes.SoftLayer_Virtual_Guest{}, errors.New(fmt.Sprintf("Cannot find virtual guest with primary ip: %s", ipAddress))
}
func (slvgs *softLayer_Virtual_Guest_Service) GetObjectByPrimaryBackendIpAddress(ipAddress string) (datatypes.SoftLayer_Virtual_Guest, error) {
ObjectFilter := string(`{"virtualGuests":{"primaryBackendIpAddress":{"operation":` + ipAddress + `}}}`)
accountService, err := slvgs.client.GetSoftLayer_Account_Service()
if err != nil {
return datatypes.SoftLayer_Virtual_Guest{}, err
}
virtualGuests, err := accountService.GetVirtualGuestsByFilter(ObjectFilter)
if err != nil {
return datatypes.SoftLayer_Virtual_Guest{}, err
}
if len(virtualGuests) == 1 {
return virtualGuests[0], nil
}
return datatypes.SoftLayer_Virtual_Guest{}, errors.New(fmt.Sprintf("Cannot find virtual guest with primary backend ip: %s", ipAddress))
}
func (slvgs *softLayer_Virtual_Guest_Service) EditObject(instanceId int, template datatypes.SoftLayer_Virtual_Guest) (bool, error) {
parameters := datatypes.SoftLayer_Virtual_Guest_Parameters{
Parameters: []datatypes.SoftLayer_Virtual_Guest{template},
}
requestBody, err := json.Marshal(parameters)
if err != nil {
return false, err
}
response, errorCode, err := slvgs.client.GetHttpClient().DoRawHttpRequest(fmt.Sprintf("%s/%d/editObject.json", slvgs.GetName(), instanceId), "POST", bytes.NewBuffer(requestBody))
if err != nil {
return false, err
}
if res := string(response[:]); res != "true" {
return false, errors.New(fmt.Sprintf("Failed to edit virtual guest with id: %d, got '%s' as response from the API.", instanceId, res))
}
if common.IsHttpErrorCode(errorCode) {
errorMessage := fmt.Sprintf("softlayer-go: could not SoftLayer_Virtual_Guest#editObject, HTTP error code: '%d'", errorCode)
return false, errors.New(errorMessage)
}
return true, err
}
func (slvgs *softLayer_Virtual_Guest_Service) DeleteObject(instanceId int) (bool, error) {
response, errorCode, err := slvgs.client.GetHttpClient().DoRawHttpRequest(fmt.Sprintf("%s/%d.json", slvgs.GetName(), instanceId), "DELETE", new(bytes.Buffer))
if err != nil {
return false, err
}
if res := string(response[:]); res != "true" {
return false, errors.New(fmt.Sprintf("Failed to delete instance with id '%d', got '%s' as response from the API.", instanceId, res))
}
if common.IsHttpErrorCode(errorCode) {
errorMessage := fmt.Sprintf("softlayer-go: could not SoftLayer_Virtual_Guest#deleteObject, HTTP error code: '%d'", errorCode)
return false, errors.New(errorMessage)
}
return true, err
}
func (slvgs *softLayer_Virtual_Guest_Service) GetPowerState(instanceId int) (datatypes.SoftLayer_Virtual_Guest_Power_State, error) {
response, errorCode, err := slvgs.client.GetHttpClient().DoRawHttpRequest(fmt.Sprintf("%s/%d/getPowerState.json", slvgs.GetName(), instanceId), "GET", new(bytes.Buffer))
if err != nil {
return datatypes.SoftLayer_Virtual_Guest_Power_State{}, err
}
if common.IsHttpErrorCode(errorCode) {
errorMessage := fmt.Sprintf("softlayer-go: could not SoftLayer_Virtual_Guest#getPowerState, HTTP error code: '%d'", errorCode)
return datatypes.SoftLayer_Virtual_Guest_Power_State{}, errors.New(errorMessage)
}
vgPowerState := datatypes.SoftLayer_Virtual_Guest_Power_State{}
err = json.Unmarshal(response, &vgPowerState)
if err != nil {
return datatypes.SoftLayer_Virtual_Guest_Power_State{}, err
}
return vgPowerState, nil
}
func (slvgs *softLayer_Virtual_Guest_Service) GetPrimaryIpAddress(instanceId int) (string, error) {
response, errorCode, err := slvgs.client.GetHttpClient().DoRawHttpRequest(fmt.Sprintf("%s/%d/getPrimaryIpAddress.json", slvgs.GetName(), instanceId), "GET", new(bytes.Buffer))
if err != nil {
return "", err
}
if common.IsHttpErrorCode(errorCode) {
errorMessage := fmt.Sprintf("softlayer-go: could not SoftLayer_Virtual_Guest#getPrimaryIpAddress, HTTP error code: '%d'", errorCode)
return "", errors.New(errorMessage)
}
vgPrimaryIpAddress := strings.TrimSpace(string(response))
if vgPrimaryIpAddress == "" {
return "", errors.New(fmt.Sprintf("Failed to get primary IP address for instance with id '%d', got '%s' as response from the API.", instanceId, response))
}
return vgPrimaryIpAddress, nil
}
func (slvgs *softLayer_Virtual_Guest_Service) GetActiveTransaction(instanceId int) (datatypes.SoftLayer_Provisioning_Version1_Transaction, error) {
response, errorCode, err := slvgs.client.GetHttpClient().DoRawHttpRequest(fmt.Sprintf("%s/%d/getActiveTransaction.json", slvgs.GetName(), instanceId), "GET", new(bytes.Buffer))
if err != nil {
return datatypes.SoftLayer_Provisioning_Version1_Transaction{}, err
}
if common.IsHttpErrorCode(errorCode) {
errorMessage := fmt.Sprintf("softlayer-go: could not SoftLayer_Virtual_Guest#getActiveTransaction, HTTP error code: '%d'", errorCode)
return datatypes.SoftLayer_Provisioning_Version1_Transaction{}, errors.New(errorMessage)
}
activeTransaction := datatypes.SoftLayer_Provisioning_Version1_Transaction{}
err = json.Unmarshal(response, &activeTransaction)
if err != nil {
return datatypes.SoftLayer_Provisioning_Version1_Transaction{}, err
}
return activeTransaction, nil
}
func (slvgs *softLayer_Virtual_Guest_Service) GetLastTransaction(instanceId int) (datatypes.SoftLayer_Provisioning_Version1_Transaction, error) {
objectMask := []string{
"transactionGroup",
}
response, errorCode, err := slvgs.client.GetHttpClient().DoRawHttpRequestWithObjectMask(fmt.Sprintf("%s/%d/getLastTransaction.json", slvgs.GetName(), instanceId), objectMask, "GET", new(bytes.Buffer))
if err != nil {
return datatypes.SoftLayer_Provisioning_Version1_Transaction{}, err
}
if common.IsHttpErrorCode(errorCode) {
errorMessage := fmt.Sprintf("softlayer-go: could not SoftLayer_Virtual_Guest#getLastTransaction, HTTP error code: '%d'", errorCode)
return datatypes.SoftLayer_Provisioning_Version1_Transaction{}, errors.New(errorMessage)
}
lastTransaction := datatypes.SoftLayer_Provisioning_Version1_Transaction{}
err = json.Unmarshal(response, &lastTransaction)
if err != nil {
return datatypes.SoftLayer_Provisioning_Version1_Transaction{}, err
}
return lastTransaction, nil
}
func (slvgs *softLayer_Virtual_Guest_Service) GetActiveTransactions(instanceId int) ([]datatypes.SoftLayer_Provisioning_Version1_Transaction, error) {
response, errorCode, err := slvgs.client.GetHttpClient().DoRawHttpRequest(fmt.Sprintf("%s/%d/getActiveTransactions.json", slvgs.GetName(), instanceId), "GET", new(bytes.Buffer))
if err != nil {
return []datatypes.SoftLayer_Provisioning_Version1_Transaction{}, err
}
if common.IsHttpErrorCode(errorCode) {
errorMessage := fmt.Sprintf("softlayer-go: could not SoftLayer_Virtual_Guest#getActiveTransactions, HTTP error code: '%d'", errorCode)
return []datatypes.SoftLayer_Provisioning_Version1_Transaction{}, errors.New(errorMessage)
}
activeTransactions := []datatypes.SoftLayer_Provisioning_Version1_Transaction{}
err = json.Unmarshal(response, &activeTransactions)
if err != nil {
return []datatypes.SoftLayer_Provisioning_Version1_Transaction{}, err
}
return activeTransactions, nil
}
func (slvgs *softLayer_Virtual_Guest_Service) GetSshKeys(instanceId int) ([]datatypes.SoftLayer_Security_Ssh_Key, error) {
response, errorCode, err := slvgs.client.GetHttpClient().DoRawHttpRequest(fmt.Sprintf("%s/%d/getSshKeys.json", slvgs.GetName(), instanceId), "GET", new(bytes.Buffer))
if err != nil {
return []datatypes.SoftLayer_Security_Ssh_Key{}, err
}
if common.IsHttpErrorCode(errorCode) {
errorMessage := fmt.Sprintf("softlayer-go: could not SoftLayer_Virtual_Guest#getSshKeys, HTTP error code: '%d'", errorCode)
return []datatypes.SoftLayer_Security_Ssh_Key{}, errors.New(errorMessage)
}
sshKeys := []datatypes.SoftLayer_Security_Ssh_Key{}
err = json.Unmarshal(response, &sshKeys)
if err != nil {
return []datatypes.SoftLayer_Security_Ssh_Key{}, err
}
return sshKeys, nil
}
func (slvgs *softLayer_Virtual_Guest_Service) PowerCycle(instanceId int) (bool, error) {
response, errorCode, err := slvgs.client.GetHttpClient().DoRawHttpRequest(fmt.Sprintf("%s/%d/powerCycle.json", slvgs.GetName(), instanceId), "GET", new(bytes.Buffer))
if err != nil {
return false, err
}
if res := string(response[:]); res != "true" {
return false, errors.New(fmt.Sprintf("Failed to power cycle instance with id '%d', got '%s' as response from the API.", instanceId, res))
}
if common.IsHttpErrorCode(errorCode) {
errorMessage := fmt.Sprintf("softlayer-go: could not SoftLayer_Virtual_Guest#powerCycle, HTTP error code: '%d'", errorCode)
return false, errors.New(errorMessage)
}
return true, err
}
func (slvgs *softLayer_Virtual_Guest_Service) PowerOff(instanceId int) (bool, error) {
response, errorCode, err := slvgs.client.GetHttpClient().DoRawHttpRequest(fmt.Sprintf("%s/%d/powerOff.json", slvgs.GetName(), instanceId), "GET", new(bytes.Buffer))
if err != nil {
return false, err
}
if res := string(response[:]); res != "true" {
return false, errors.New(fmt.Sprintf("Failed to power off instance with id '%d', got '%s' as response from the API.", instanceId, res))
}
if common.IsHttpErrorCode(errorCode) {
errorMessage := fmt.Sprintf("softlayer-go: could not SoftLayer_Virtual_Guest#powerOff, HTTP error code: '%d'", errorCode)
return false, errors.New(errorMessage)
}
return true, err
}
func (slvgs *softLayer_Virtual_Guest_Service) PowerOffSoft(instanceId int) (bool, error) {
response, errorCode, err := slvgs.client.GetHttpClient().DoRawHttpRequest(fmt.Sprintf("%s/%d/powerOffSoft.json", slvgs.GetName(), instanceId), "GET", new(bytes.Buffer))
if err != nil {
return false, err
}
if res := string(response[:]); res != "true" {
return false, errors.New(fmt.Sprintf("Failed to power off soft instance with id '%d', got '%s' as response from the API.", instanceId, res))
}
if common.IsHttpErrorCode(errorCode) {
errorMessage := fmt.Sprintf("softlayer-go: could not SoftLayer_Virtual_Guest#powerOffSoft, HTTP error code: '%d'", errorCode)
return false, errors.New(errorMessage)
}
return true, err
}
func (slvgs *softLayer_Virtual_Guest_Service) PowerOn(instanceId int) (bool, error) {
response, errorCode, err := slvgs.client.GetHttpClient().DoRawHttpRequest(fmt.Sprintf("%s/%d/powerOn.json", slvgs.GetName(), instanceId), "GET", new(bytes.Buffer))
if err != nil {
return false, err
}
if res := string(response[:]); res != "true" {
return false, errors.New(fmt.Sprintf("Failed to power on instance with id '%d', got '%s' as response from the API.", instanceId, res))
}
if common.IsHttpErrorCode(errorCode) {
errorMessage := fmt.Sprintf("softlayer-go: could not SoftLayer_Virtual_Guest#powerOn, HTTP error code: '%d'", errorCode)
return false, errors.New(errorMessage)
}
return true, err
}
func (slvgs *softLayer_Virtual_Guest_Service) RebootDefault(instanceId int) (bool, error) {
response, errorCode, err := slvgs.client.GetHttpClient().DoRawHttpRequest(fmt.Sprintf("%s/%d/rebootDefault.json", slvgs.GetName(), instanceId), "GET", new(bytes.Buffer))
if err != nil {
return false, err
}
if res := string(response[:]); res != "true" {
return false, errors.New(fmt.Sprintf("Failed to default reboot instance with id '%d', got '%s' as response from the API.", instanceId, res))
}
if common.IsHttpErrorCode(errorCode) {
errorMessage := fmt.Sprintf("softlayer-go: could not SoftLayer_Virtual_Guest#rebootDefault, HTTP error code: '%d'", errorCode)
return false, errors.New(errorMessage)
}
return true, err
}
func (slvgs *softLayer_Virtual_Guest_Service) RebootSoft(instanceId int) (bool, error) {
response, errorCode, err := slvgs.client.GetHttpClient().DoRawHttpRequest(fmt.Sprintf("%s/%d/rebootSoft.json", slvgs.GetName(), instanceId), "GET", new(bytes.Buffer))
if err != nil {
return false, err
}
if res := string(response[:]); res != "true" {
return false, errors.New(fmt.Sprintf("Failed to soft reboot instance with id '%d', got '%s' as response from the API.", instanceId, res))
}
if common.IsHttpErrorCode(errorCode) {
errorMessage := fmt.Sprintf("softlayer-go: could not SoftLayer_Virtual_Guest#rebootSoft, HTTP error code: '%d'", errorCode)
return false, errors.New(errorMessage)
}
return true, err
}
func (slvgs *softLayer_Virtual_Guest_Service) RebootHard(instanceId int) (bool, error) {
response, errorCode, err := slvgs.client.GetHttpClient().DoRawHttpRequest(fmt.Sprintf("%s/%d/rebootHard.json", slvgs.GetName(), instanceId), "GET", new(bytes.Buffer))
if err != nil {
return false, err
}
if res := string(response[:]); res != "true" {
return false, errors.New(fmt.Sprintf("Failed to hard reboot instance with id '%d', got '%s' as response from the API.", instanceId, res))
}
if common.IsHttpErrorCode(errorCode) {
errorMessage := fmt.Sprintf("softlayer-go: could not SoftLayer_Security_Ssh_Key#rebootHard, HTTP error code: '%d'", errorCode)
return false, errors.New(errorMessage)
}
return true, err
}
func (slvgs *softLayer_Virtual_Guest_Service) SetMetadata(instanceId int, metadata string) (bool, error) {
dataBytes := []byte(metadata)
base64EncodedMetadata := base64.StdEncoding.EncodeToString(dataBytes)
parameters := datatypes.SoftLayer_SetUserMetadata_Parameters{
Parameters: []datatypes.UserMetadataArray{
[]datatypes.UserMetadata{datatypes.UserMetadata(base64EncodedMetadata)},
},
}
requestBody, err := json.Marshal(parameters)
if err != nil {
return false, err
}
response, errorCode, err := slvgs.client.GetHttpClient().DoRawHttpRequest(fmt.Sprintf("%s/%d/setUserMetadata.json", slvgs.GetName(), instanceId), "POST", bytes.NewBuffer(requestBody))
if err != nil {
return false, err
}
if res := string(response[:]); res != "true" {
return false, errors.New(fmt.Sprintf("Failed to setUserMetadata for instance with id '%d', got '%s' as response from the API.", instanceId, res))
}
if common.IsHttpErrorCode(errorCode) {
errorMessage := fmt.Sprintf("softlayer-go: could not SoftLayer_Virtual_Guest#setUserMetadata, HTTP error code: '%d'", errorCode)
return false, errors.New(errorMessage)
}
return true, err
}
func (slvgs *softLayer_Virtual_Guest_Service) ConfigureMetadataDisk(instanceId int) (datatypes.SoftLayer_Provisioning_Version1_Transaction, error) {
response, errorCode, err := slvgs.client.GetHttpClient().DoRawHttpRequest(fmt.Sprintf("%s/%d/configureMetadataDisk.json", slvgs.GetName(), instanceId), "GET", new(bytes.Buffer))
if err != nil {
return datatypes.SoftLayer_Provisioning_Version1_Transaction{}, err
}
if common.IsHttpErrorCode(errorCode) {
errorMessage := fmt.Sprintf("softlayer-go: could not SoftLayer_Virtual_Guest#setUserMetadata, HTTP error code: '%d'", errorCode)
return datatypes.SoftLayer_Provisioning_Version1_Transaction{}, errors.New(errorMessage)
}
transaction := datatypes.SoftLayer_Provisioning_Version1_Transaction{}
err = json.Unmarshal(response, &transaction)
if err != nil {
return datatypes.SoftLayer_Provisioning_Version1_Transaction{}, err
}
return transaction, nil
}
func (slvgs *softLayer_Virtual_Guest_Service) GetUserData(instanceId int) ([]datatypes.SoftLayer_Virtual_Guest_Attribute, error) {
response, errorCode, err := slvgs.client.GetHttpClient().DoRawHttpRequest(fmt.Sprintf("%s/%d/getUserData.json", slvgs.GetName(), instanceId), "GET", new(bytes.Buffer))
if err != nil {
return []datatypes.SoftLayer_Virtual_Guest_Attribute{}, err
}
if common.IsHttpErrorCode(errorCode) {
errorMessage := fmt.Sprintf("softlayer-go: could not SoftLayer_Virtual_Guest#getUserData, HTTP error code: '%d'", errorCode)
return []datatypes.SoftLayer_Virtual_Guest_Attribute{}, errors.New(errorMessage)
}
attributes := []datatypes.SoftLayer_Virtual_Guest_Attribute{}
err = json.Unmarshal(response, &attributes)
if err != nil {
return []datatypes.SoftLayer_Virtual_Guest_Attribute{}, err
}
return attributes, nil
}
func (slvgs *softLayer_Virtual_Guest_Service) IsPingable(instanceId int) (bool, error) {
response, errorCode, err := slvgs.client.GetHttpClient().DoRawHttpRequest(fmt.Sprintf("%s/%d/isPingable.json", slvgs.GetName(), instanceId), "GET", new(bytes.Buffer))
if err != nil {
return false, err
}
if common.IsHttpErrorCode(errorCode) {
errorMessage := fmt.Sprintf("softlayer-go: could not SoftLayer_Virtual_Guest#isPingable, HTTP error code: '%d'", errorCode)
return false, errors.New(errorMessage)
}
res := string(response)
if res == "true" {
return true, nil
}
if res == "false" {
return false, nil
}
return false, errors.New(fmt.Sprintf("Failed to checking that virtual guest is pingable for instance with id '%d', got '%s' as response from the API.", instanceId, res))
}
func (slvgs *softLayer_Virtual_Guest_Service) IsBackendPingable(instanceId int) (bool, error) {
response, errorCode, err := slvgs.client.GetHttpClient().DoRawHttpRequest(fmt.Sprintf("%s/%d/isBackendPingable.json", slvgs.GetName(), instanceId), "GET", new(bytes.Buffer))
if err != nil {
return false, err
}
if common.IsHttpErrorCode(errorCode) {
errorMessage := fmt.Sprintf("softlayer-go: could not SoftLayer_Virtual_Guest#isBackendPingable, HTTP error code: '%d'", errorCode)
return false, errors.New(errorMessage)
}
res := string(response)
if res == "true" {
return true, nil
}
if res == "false" {
return false, nil
}
return false, errors.New(fmt.Sprintf("Failed to checking that virtual guest backend is pingable for instance with id '%d', got '%s' as response from the API.", instanceId, res))
}
func (slvgs *softLayer_Virtual_Guest_Service) AttachEphemeralDisk(instanceId int, diskSize int) (datatypes.SoftLayer_Container_Product_Order_Receipt, error) {
diskItemPrice, err := slvgs.findUpgradeItemPriceForEphemeralDisk(instanceId, diskSize)
if err != nil {
return datatypes.SoftLayer_Container_Product_Order_Receipt{}, err
}
orderService, err := slvgs.client.GetSoftLayer_Product_Order_Service()
if err != nil {
return datatypes.SoftLayer_Container_Product_Order_Receipt{}, err
}
order := datatypes.SoftLayer_Container_Product_Order_Virtual_Guest_Upgrade{
VirtualGuests: []datatypes.VirtualGuest{
datatypes.VirtualGuest{
Id: instanceId,
},
},
Prices: []datatypes.SoftLayer_Product_Item_Price{
datatypes.SoftLayer_Product_Item_Price{
Id: diskItemPrice.Id,
Categories: []datatypes.Category{
datatypes.Category{
CategoryCode: EPHEMERAL_DISK_CATEGORY_CODE,
},
},
},
},
ComplexType: UPGRADE_VIRTUAL_SERVER_ORDER_TYPE,
Properties: []datatypes.Property{
datatypes.Property{
Name: MAINTENANCE_WINDOW_PROPERTY,
Value: time.Now().UTC().Format(time.RFC3339),
},
datatypes.Property{
Name: "NOTE_GENERAL",
Value: "addingdisks",
},
},
}
receipt, err := orderService.PlaceContainerOrderVirtualGuestUpgrade(order)
if err != nil {
return datatypes.SoftLayer_Container_Product_Order_Receipt{}, err
}
return receipt, nil
}
func (slvgs *softLayer_Virtual_Guest_Service) UpgradeObject(instanceId int, options *softlayer.UpgradeOptions) (bool, error) {
prices, err := slvgs.GetAvailableUpgradeItemPrices(options)
if err != nil {
return false, err
}
if len(prices) == 0 {
// Nothing to order, as all the values are up to date
return false, nil
}
orderService, err := slvgs.client.GetSoftLayer_Product_Order_Service()
if err != nil {
return false, err
}
order := datatypes.SoftLayer_Container_Product_Order_Virtual_Guest_Upgrade{
VirtualGuests: []datatypes.VirtualGuest{
datatypes.VirtualGuest{
Id: instanceId,
},
},
Prices: prices,
ComplexType: UPGRADE_VIRTUAL_SERVER_ORDER_TYPE,
Properties: []datatypes.Property{
datatypes.Property{
Name: MAINTENANCE_WINDOW_PROPERTY,
Value: time.Now().UTC().Format(time.RFC3339),
},
},
}
_, err = orderService.PlaceContainerOrderVirtualGuestUpgrade(order)
if err != nil {
return false, err
}
return true, nil
}
func (slvgs *softLayer_Virtual_Guest_Service) GetAvailableUpgradeItemPrices(upgradeOptions *softlayer.UpgradeOptions) ([]datatypes.SoftLayer_Product_Item_Price, error) {
itemsCapacity := make(map[string]int)
if upgradeOptions.Cpus > 0 {
itemsCapacity["cpus"] = upgradeOptions.Cpus
}
if upgradeOptions.MemoryInGB > 0 {
itemsCapacity["memory"] = upgradeOptions.MemoryInGB
}
if upgradeOptions.NicSpeed > 0 {
itemsCapacity["nic_speed"] = upgradeOptions.NicSpeed
}
virtualServerPackageItems, err := slvgs.getVirtualServerItems()
if err != nil {
return []datatypes.SoftLayer_Product_Item_Price{}, err
}
prices := make([]datatypes.SoftLayer_Product_Item_Price, 0)
for item, amount := range itemsCapacity {
price, err := slvgs.filterProductItemPrice(virtualServerPackageItems, item, amount)
if err != nil {
return []datatypes.SoftLayer_Product_Item_Price{}, err
}
prices = append(prices, price)
}
return prices, nil
}
func (slvgs *softLayer_Virtual_Guest_Service) GetUpgradeItemPrices(instanceId int) ([]datatypes.SoftLayer_Product_Item_Price, error) {
response, errorCode, err := slvgs.client.GetHttpClient().DoRawHttpRequest(fmt.Sprintf("%s/%d/getUpgradeItemPrices.json", slvgs.GetName(), instanceId), "GET", new(bytes.Buffer))
if err != nil {
return []datatypes.SoftLayer_Product_Item_Price{}, err
}
if common.IsHttpErrorCode(errorCode) {
errorMessage := fmt.Sprintf("softlayer-go: could not SoftLayer_Virtual_Guest#getUpgradeItemPrices, HTTP error code: '%d'", errorCode)
return []datatypes.SoftLayer_Product_Item_Price{}, errors.New(errorMessage)
}
itemPrices := []datatypes.SoftLayer_Product_Item_Price{}
err = json.Unmarshal(response, &itemPrices)
if err != nil {
return []datatypes.SoftLayer_Product_Item_Price{}, err
}
return itemPrices, nil
}
func (slvgs *softLayer_Virtual_Guest_Service) SetTags(instanceId int, tags []string) (bool, error) {
var tagStringBuffer bytes.Buffer
for i, tag := range tags {
tagStringBuffer.WriteString(tag)
if i != len(tags)-1 {
tagStringBuffer.WriteString(", ")
}
}
setTagsParameters := datatypes.SoftLayer_Virtual_Guest_SetTags_Parameters{
Parameters: []string{tagStringBuffer.String()},
}
requestBody, err := json.Marshal(setTagsParameters)
if err != nil {
return false, err
}
response, errorCode, err := slvgs.client.GetHttpClient().DoRawHttpRequest(fmt.Sprintf("%s/%d/setTags.json", slvgs.GetName(), instanceId), "POST", bytes.NewBuffer(requestBody))
if err != nil {
return false, err
}
if common.IsHttpErrorCode(errorCode) {
errorMessage := fmt.Sprintf("softlayer-go: could not SoftLayer_Virtual_Guest#setTags, HTTP error code: '%d'", errorCode)
return false, errors.New(errorMessage)
}
if res := string(response[:]); res != "true" {
return false, errors.New(fmt.Sprintf("Failed to setTags for instance with id '%d', got '%s' as response from the API.", instanceId, res))
}
return true, nil
}
func (slvgs *softLayer_Virtual_Guest_Service) GetTagReferences(instanceId int) ([]datatypes.SoftLayer_Tag_Reference, error) {
response, errorCode, err := slvgs.client.GetHttpClient().DoRawHttpRequest(fmt.Sprintf("%s/%d/getTagReferences.json", slvgs.GetName(), instanceId), "GET", new(bytes.Buffer))
if err != nil {
return []datatypes.SoftLayer_Tag_Reference{}, err
}
if common.IsHttpErrorCode(errorCode) {
errorMessage := fmt.Sprintf("softlayer-go: could not SoftLayer_Virtual_Guest#getTagReferences, HTTP error code: '%d'", errorCode)
return []datatypes.SoftLayer_Tag_Reference{}, errors.New(errorMessage)
}
tagReferences := []datatypes.SoftLayer_Tag_Reference{}
err = json.Unmarshal(response, &tagReferences)
if err != nil {
return []datatypes.SoftLayer_Tag_Reference{}, err
}
return tagReferences, nil
}
func (slvgs *softLayer_Virtual_Guest_Service) AttachDiskImage(instanceId int, imageId int) (datatypes.SoftLayer_Provisioning_Version1_Transaction, error) {
parameters := datatypes.SoftLayer_Virtual_GuestInit_ImageId_Parameters{
Parameters: datatypes.ImageId_Parameter{
ImageId: imageId,
},
}
requestBody, err := json.Marshal(parameters)
if err != nil {
return datatypes.SoftLayer_Provisioning_Version1_Transaction{}, err
}
response, errorCode, err := slvgs.client.GetHttpClient().DoRawHttpRequest(fmt.Sprintf("%s/%d/attachDiskImage.json", slvgs.GetName(), instanceId), "POST", bytes.NewBuffer(requestBody))
if err != nil {
return datatypes.SoftLayer_Provisioning_Version1_Transaction{}, err
}
if common.IsHttpErrorCode(errorCode) {
errorMessage := fmt.Sprintf("softlayer-go: could not SoftLayer_Virtual_Guest#attachDiskImage, HTTP error code: '%d'", errorCode)
return datatypes.SoftLayer_Provisioning_Version1_Transaction{}, errors.New(errorMessage)
}
transaction := datatypes.SoftLayer_Provisioning_Version1_Transaction{}
err = json.Unmarshal(response, &transaction)
if err != nil {
return datatypes.SoftLayer_Provisioning_Version1_Transaction{}, err
}
return transaction, nil
}
func (slvgs *softLayer_Virtual_Guest_Service) DetachDiskImage(instanceId int, imageId int) (datatypes.SoftLayer_Provisioning_Version1_Transaction, error) {
parameters := datatypes.SoftLayer_Virtual_GuestInit_ImageId_Parameters{
Parameters: datatypes.ImageId_Parameter{
ImageId: imageId,
},
}
requestBody, err := json.Marshal(parameters)
if err != nil {
return datatypes.SoftLayer_Provisioning_Version1_Transaction{}, err
}
response, errorCode, err := slvgs.client.GetHttpClient().DoRawHttpRequest(fmt.Sprintf("%s/%d/detachDiskImage.json", slvgs.GetName(), instanceId), "POST", bytes.NewBuffer(requestBody))
if err != nil {
return datatypes.SoftLayer_Provisioning_Version1_Transaction{}, err
}
if common.IsHttpErrorCode(errorCode) {
errorMessage := fmt.Sprintf("softlayer-go: could not SoftLayer_Virtual_Guest#detachDiskImage, HTTP error code: '%d'", errorCode)
return datatypes.SoftLayer_Provisioning_Version1_Transaction{}, errors.New(errorMessage)
}
transaction := datatypes.SoftLayer_Provisioning_Version1_Transaction{}
err = json.Unmarshal(response, &transaction)
if err != nil {
return datatypes.SoftLayer_Provisioning_Version1_Transaction{}, err
}
return transaction, nil
}
func (slvgs *softLayer_Virtual_Guest_Service) ActivatePrivatePort(instanceId int) (bool, error) {
response, errorCode, err := slvgs.client.GetHttpClient().DoRawHttpRequest(fmt.Sprintf("%s/%d/activatePrivatePort.json", slvgs.GetName(), instanceId), "GET", new(bytes.Buffer))
if err != nil {
return false, err
}
if common.IsHttpErrorCode(errorCode) {
errorMessage := fmt.Sprintf("softlayer-go: could not SoftLayer_Virtual_Guest#activatePrivatePort, HTTP error code: '%d'", errorCode)
return false, errors.New(errorMessage)
}
res := string(response)
if res == "true" {
return true, nil
}
if res == "false" {
return false, nil
}
return false, errors.New(fmt.Sprintf("Failed to activate private port for virtual guest is pingable for instance with id '%d', got '%s' as response from the API.", instanceId, res))
}
func (slvgs *softLayer_Virtual_Guest_Service) ActivatePublicPort(instanceId int) (bool, error) {
response, errorCode, err := slvgs.client.GetHttpClient().DoRawHttpRequest(fmt.Sprintf("%s/%d/activatePublicPort.json", slvgs.GetName(), instanceId), "GET", new(bytes.Buffer))
if err != nil {
return false, err
}
if common.IsHttpErrorCode(errorCode) {
errorMessage := fmt.Sprintf("softlayer-go: could not SoftLayer_Virtual_Guest#activatePublicPort, HTTP error code: '%d'", errorCode)
return false, errors.New(errorMessage)
}
res := string(response)
if res == "true" {
return true, nil
}
if res == "false" {
return false, nil
}
return false, errors.New(fmt.Sprintf("Failed to activate public port for virtual guest is pingable for instance with id '%d', got '%s' as response from the API.", instanceId, res))
}
func (slvgs *softLayer_Virtual_Guest_Service) ShutdownPrivatePort(instanceId int) (bool, error) {
response, errorCode, err := slvgs.client.GetHttpClient().DoRawHttpRequest(fmt.Sprintf("%s/%d/shutdownPrivatePort.json", slvgs.GetName(), instanceId), "GET", new(bytes.Buffer))
if err != nil {
return false, err
}
if common.IsHttpErrorCode(errorCode) {
errorMessage := fmt.Sprintf("softlayer-go: could not SoftLayer_Virtual_Guest#shutdownPrivatePort, HTTP error code: '%d'", errorCode)
return false, errors.New(errorMessage)
}
res := string(response)
if res == "true" {
return true, nil
}
if res == "false" {
return false, nil
}
return false, errors.New(fmt.Sprintf("Failed to shutdown private port for virtual guest is pingable for instance with id '%d', got '%s' as response from the API.", instanceId, res))
}
func (slvgs *softLayer_Virtual_Guest_Service) ShutdownPublicPort(instanceId int) (bool, error) {
response, errorCode, err := slvgs.client.GetHttpClient().DoRawHttpRequest(fmt.Sprintf("%s/%d/shutdownPublicPort.json", slvgs.GetName(), instanceId), "GET", new(bytes.Buffer))
if err != nil {
return false, err
}
if common.IsHttpErrorCode(errorCode) {
errorMessage := fmt.Sprintf("softlayer-go: could not SoftLayer_Virtual_Guest#shutdownPublicPort, HTTP error code: '%d'", errorCode)
return false, errors.New(errorMessage)
}
res := string(response)
if res == "true" {
return true, nil
}
if res == "false" {
return false, nil
}
return false, errors.New(fmt.Sprintf("Failed to shutdown public port for virtual guest is pingable for instance with id '%d', got '%s' as response from the API.", instanceId, res))
}
func (slvgs *softLayer_Virtual_Guest_Service) GetAllowedHost(instanceId int) (datatypes.SoftLayer_Network_Storage_Allowed_Host, error) {
response, errorCode, err := slvgs.client.GetHttpClient().DoRawHttpRequest(fmt.Sprintf("%s/%d/getAllowedHost.json", slvgs.GetName(), instanceId), "GET", new(bytes.Buffer))
if err != nil {
return datatypes.SoftLayer_Network_Storage_Allowed_Host{}, err
}
if common.IsHttpErrorCode(errorCode) {
errorMessage := fmt.Sprintf("softlayer-go: could not SoftLayer_Virtual_Guest#getAllowedHost, HTTP error code: '%d'", errorCode)
return datatypes.SoftLayer_Network_Storage_Allowed_Host{}, errors.New(errorMessage)
}
allowedHost := datatypes.SoftLayer_Network_Storage_Allowed_Host{}
err = json.Unmarshal(response, &allowedHost)
if err != nil {
return datatypes.SoftLayer_Network_Storage_Allowed_Host{}, err
}
return allowedHost, nil
}
func (slvgs *softLayer_Virtual_Guest_Service) GetNetworkVlans(instanceId int) ([]datatypes.SoftLayer_Network_Vlan, error) {
response, errorCode, err := slvgs.client.GetHttpClient().DoRawHttpRequest(fmt.Sprintf("%s/%d/getNetworkVlans.json", slvgs.GetName(), instanceId), "GET", new(bytes.Buffer))
if err != nil {
return []datatypes.SoftLayer_Network_Vlan{}, err
}
if common.IsHttpErrorCode(errorCode) {
errorMessage := fmt.Sprintf("softlayer-go: could not SoftLayer_Virtual_Guest#getNetworkVlans, HTTP error code: '%d'", errorCode)
return []datatypes.SoftLayer_Network_Vlan{}, errors.New(errorMessage)
}
networkVlans := []datatypes.SoftLayer_Network_Vlan{}
err = json.Unmarshal(response, &networkVlans)
if err != nil {
return []datatypes.SoftLayer_Network_Vlan{}, err
}
return networkVlans, nil
}
func (slvgs *softLayer_Virtual_Guest_Service) CheckHostDiskAvailability(instanceId int, diskCapacity int) (bool, error) {
response, errorCode, err := slvgs.client.GetHttpClient().DoRawHttpRequest(fmt.Sprintf("%s/%d/checkHostDiskAvailability/%d", slvgs.GetName(), instanceId, diskCapacity), "GET", new(bytes.Buffer))
if err != nil {
return false, err
}
if common.IsHttpErrorCode(errorCode) {
errorMessage := fmt.Sprintf("softlayer-go: could not SoftLayer_Virtual_Guest#checkHostDiskAvailability, HTTP error code: '%d'", errorCode)
return false, errors.New(errorMessage)
}
res := string(response)
if res == "true" {
return true, nil
}
if res == "false" {
return false, nil
}
return false, errors.New(fmt.Sprintf("Failed to check host disk availability for instance '%d', got '%s' as response from the API.", instanceId, res))
}
func (slvgs *softLayer_Virtual_Guest_Service) CaptureImage(instanceId int) (datatypes.SoftLayer_Container_Disk_Image_Capture_Template, error) {
response, errorCode, err := slvgs.client.GetHttpClient().DoRawHttpRequest(fmt.Sprintf("%s/%d/captureImage.json", slvgs.GetName(), instanceId), "GET", new(bytes.Buffer))
if err != nil {
return datatypes.SoftLayer_Container_Disk_Image_Capture_Template{}, err
}
if common.IsHttpErrorCode(errorCode) {
errorMessage := fmt.Sprintf("softlayer-go: could not SoftLayer_Virtual_Guest#captureImage, HTTP error code: '%d'", errorCode)
return datatypes.SoftLayer_Container_Disk_Image_Capture_Template{}, errors.New(errorMessage)
}
diskImageTemplate := datatypes.SoftLayer_Container_Disk_Image_Capture_Template{}
err = json.Unmarshal(response, &diskImageTemplate)
if err != nil {
return datatypes.SoftLayer_Container_Disk_Image_Capture_Template{}, err
}
return diskImageTemplate, nil
}
func (slvgs *softLayer_Virtual_Guest_Service) CreateArchiveTransaction(instanceId int, groupName string, blockDevices []datatypes.SoftLayer_Virtual_Guest_Block_Device, note string) (datatypes.SoftLayer_Provisioning_Version1_Transaction, error) {
groupName = url.QueryEscape(groupName)
note = url.QueryEscape(note)
parameters := datatypes.SoftLayer_Virtual_GuestInitParameters{
Parameters: []interface{}{groupName, blockDevices, note},
}
requestBody, err := json.Marshal(parameters)
if err != nil {
return datatypes.SoftLayer_Provisioning_Version1_Transaction{}, err
}
response, errorCode, err := slvgs.client.GetHttpClient().DoRawHttpRequest(fmt.Sprintf("%s/%d/createArchiveTransaction.json", slvgs.GetName(), instanceId), "POST", bytes.NewBuffer(requestBody))
if err != nil {
return datatypes.SoftLayer_Provisioning_Version1_Transaction{}, err
}
if common.IsHttpErrorCode(errorCode) {
errorMessage := fmt.Sprintf("softlayer-go: could not SoftLayer_Virtual_Guest#createArchiveTransaction, HTTP error code: '%d'", errorCode)
return datatypes.SoftLayer_Provisioning_Version1_Transaction{}, errors.New(errorMessage)
}
transaction := datatypes.SoftLayer_Provisioning_Version1_Transaction{}
err = json.Unmarshal(response, &transaction)
if err != nil {
return datatypes.SoftLayer_Provisioning_Version1_Transaction{}, err
}
return transaction, nil
}
//Private methods
func (slvgs *softLayer_Virtual_Guest_Service) getVirtualServerItems() ([]datatypes.SoftLayer_Product_Item, error) {
service, err := slvgs.client.GetSoftLayer_Product_Package_Service()
if err != nil {
return []datatypes.SoftLayer_Product_Item{}, err
}
return service.GetItemsByType(VIRTUAL_SERVER_PACKAGE_TYPE)
}
func (slvgs *softLayer_Virtual_Guest_Service) filterProductItemPrice(packageItems []datatypes.SoftLayer_Product_Item, option string, amount int) (datatypes.SoftLayer_Product_Item_Price, error) {
// for now use hardcoded values in the same "style" as Python client does
// refer to corresponding Python method #_get_item_id_for_upgrade: https://github.com/softlayer/softlayer-python/blob/master/SoftLayer/managers/vs.py
vsId := map[string]int{
"memory": 3,
"cpus": 80,
"nic_speed": 26,
}
for _, packageItem := range packageItems {
categories := packageItem.Prices[0].Categories
for _, category := range categories {
if packageItem.Capacity == "" {
continue
}
capacity, err := strconv.Atoi(packageItem.Capacity)
if err != nil {
return datatypes.SoftLayer_Product_Item_Price{}, err
}
if category.Id != vsId[option] || capacity != amount {
continue
}
switch option {
case "cpus":
if !strings.Contains(packageItem.Description, "Private") {
return packageItem.Prices[0], nil
}
case "nic_speed":
if strings.Contains(packageItem.Description, "Public") {
return packageItem.Prices[0], nil
}
default:
return packageItem.Prices[0], nil
}
}
}
return datatypes.SoftLayer_Product_Item_Price{}, errors.New(fmt.Sprintf("Failed to find price for '%s' (of size %d)", option, amount))
}
func (slvgs *softLayer_Virtual_Guest_Service) checkCreateObjectRequiredValues(template datatypes.SoftLayer_Virtual_Guest_Template) error {
var err error
errorMessage, errorTemplate := "", "* %s is required and cannot be empty\n"
if template.Hostname == "" {
errorMessage += fmt.Sprintf(errorTemplate, "Hostname for the computing instance")
}
if template.Domain == "" {
errorMessage += fmt.Sprintf(errorTemplate, "Domain for the computing instance")
}
if template.StartCpus <= 0 {
errorMessage += fmt.Sprintf(errorTemplate, "StartCpus: the number of CPU cores to allocate")
}
if template.MaxMemory <= 0 {
errorMessage += fmt.Sprintf(errorTemplate, "MaxMemory: the amount of memory to allocate in megabytes")
}
for _, device := range template.BlockDevices {
if device.DiskImage.Capacity <= 0 {
errorMessage += fmt.Sprintf("Disk size must be positive number, the size of block device %s is set to be %dGB.", device.Device, device.DiskImage.Capacity)
}
}
if template.Datacenter.Name == "" {
errorMessage += fmt.Sprintf(errorTemplate, "Datacenter.Name: specifies which datacenter the instance is to be provisioned in")
}
if errorMessage != "" {
err = errors.New(errorMessage)
}
return err
}
func (slvgs *softLayer_Virtual_Guest_Service) findUpgradeItemPriceForEphemeralDisk(instanceId int, ephemeralDiskSize int) (datatypes.SoftLayer_Product_Item_Price, error) {
if ephemeralDiskSize <= 0 {
return datatypes.SoftLayer_Product_Item_Price{}, errors.New(fmt.Sprintf("Ephemeral disk size can not be negative: %d", ephemeralDiskSize))
}
itemPrices, err := slvgs.GetUpgradeItemPrices(instanceId)
if err != nil {
return datatypes.SoftLayer_Product_Item_Price{}, nil
}
var currentDiskCapacity int
var currentItemPrice datatypes.SoftLayer_Product_Item_Price
for _, itemPrice := range itemPrices {
flag := false
for _, category := range itemPrice.Categories {
if category.CategoryCode == EPHEMERAL_DISK_CATEGORY_CODE {
flag = true
break
}
}
if flag && strings.Contains(itemPrice.Item.Description, "(LOCAL)") {
capacity, _ := strconv.Atoi(itemPrice.Item.Capacity)
if capacity >= ephemeralDiskSize {
if currentItemPrice.Id == 0 || currentDiskCapacity >= capacity {
currentItemPrice = itemPrice
currentDiskCapacity = capacity
}
}
}
}
if currentItemPrice.Id == 0 {
return datatypes.SoftLayer_Product_Item_Price{}, errors.New(fmt.Sprintf("No proper local disk for size %d", ephemeralDiskSize))
}
return currentItemPrice, nil
}