Skip to content
This repository has been archived by the owner on Apr 9, 2021. It is now read-only.

Commit

Permalink
added implementation for SL_Virtual_Guest#CreateArchiveTransaction
Browse files Browse the repository at this point in the history
  • Loading branch information
maximilien committed Apr 28, 2016
1 parent ac166f3 commit 9e73ca4
Show file tree
Hide file tree
Showing 6 changed files with 168 additions and 6 deletions.
18 changes: 18 additions & 0 deletions data_types/softlayer_virtual_guest_block_device.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package data_types

import "time"

type SoftLayer_Virtual_Guest_Block_Device struct {
BootableFlag int `json:"bootableFlag"`
CreateDate *time.Time `json:"createDate"`
Device string `json:"device"`
DiskImageId int `json:"diskImageId"`
GuestId int `json:"guestId"`
HotPlugFlag int `json:"hotPlugFlag"`
Id int `json:"id"`
ModifyDate *time.Time `json:"modifyDate"`
MountMode string `json:"mountMode"`
MountType string `json:"mountType"`
StatusId int `json:"statusId"`
Uuid string `json:"uuid"`
}
8 changes: 6 additions & 2 deletions data_types/softlayer_virtual_guest_init_parameters.go
Original file line number Diff line number Diff line change
@@ -1,9 +1,13 @@
package data_types

type SoftLayer_Virtual_GuestInitParameters struct {
Parameters SoftLayer_Virtual_GuestInitParameter `json:"parameters"`
Parameters []interface{} `json:"parameters"`
}

type SoftLayer_Virtual_GuestInitParameter struct {
type SoftLayer_Virtual_GuestInit_ImageId_Parameters struct {
Parameters ImageId_Parameter `json:"parameters"`
}

type ImageId_Parameter struct {
ImageId int `json:"imageId"`
}
41 changes: 37 additions & 4 deletions services/softlayer_virtual_guest.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import (
"encoding/json"
"errors"
"fmt"
"net/url"
"strconv"
"strings"
"time"
Expand Down Expand Up @@ -823,8 +824,8 @@ func (slvgs *softLayer_Virtual_Guest_Service) GetTagReferences(instanceId int) (
}

func (slvgs *softLayer_Virtual_Guest_Service) AttachDiskImage(instanceId int, imageId int) (datatypes.SoftLayer_Provisioning_Version1_Transaction, error) {
parameters := datatypes.SoftLayer_Virtual_GuestInitParameters{
Parameters: datatypes.SoftLayer_Virtual_GuestInitParameter{
parameters := datatypes.SoftLayer_Virtual_GuestInit_ImageId_Parameters{
Parameters: datatypes.ImageId_Parameter{
ImageId: imageId,
},
}
Expand Down Expand Up @@ -854,8 +855,8 @@ func (slvgs *softLayer_Virtual_Guest_Service) AttachDiskImage(instanceId int, im
}

func (slvgs *softLayer_Virtual_Guest_Service) DetachDiskImage(instanceId int, imageId int) (datatypes.SoftLayer_Provisioning_Version1_Transaction, error) {
parameters := datatypes.SoftLayer_Virtual_GuestInitParameters{
Parameters: datatypes.SoftLayer_Virtual_GuestInitParameter{
parameters := datatypes.SoftLayer_Virtual_GuestInit_ImageId_Parameters{
Parameters: datatypes.ImageId_Parameter{
ImageId: imageId,
},
}
Expand Down Expand Up @@ -1064,6 +1065,38 @@ func (slvgs *softLayer_Virtual_Guest_Service) CaptureImage(instanceId int) (data
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) {
Expand Down
88 changes: 88 additions & 0 deletions services/softlayer_virtual_guest_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -1868,4 +1868,92 @@ var _ = Describe("SoftLayer_Virtual_Guest_Service", func() {
})
})
})

Context("#CreateArchiveTransaction", func() {
var blockDevices []datatypes.SoftLayer_Virtual_Guest_Block_Device

BeforeEach(func() {
virtualGuest.Id = 1234567
fakeClient.FakeHttpClient.DoRawHttpRequestResponse, err = testhelpers.ReadJsonTestFixtures("services", "SoftLayer_Virtual_Guest_Service_createArchiveTransaction.json")
Expect(err).ToNot(HaveOccurred())

blockDevices = []datatypes.SoftLayer_Virtual_Guest_Block_Device{
datatypes.SoftLayer_Virtual_Guest_Block_Device{
BootableFlag: 0,
CreateDate: nil,
Device: "fake-device0",
DiskImageId: 123456,
GuestId: 123456,
HotPlugFlag: 123456,
Id: 0,
ModifyDate: nil,
MountMode: "fake-mount-mode",
MountType: "fake-mount-type",
StatusId: 0,
Uuid: "fake-uuid",
},
datatypes.SoftLayer_Virtual_Guest_Block_Device{
BootableFlag: 0,
CreateDate: nil,
Device: "fake-device1",
DiskImageId: 123456,
GuestId: 123456,
HotPlugFlag: 123456,
Id: 1,
ModifyDate: nil,
MountMode: "fake-mount-mode",
MountType: "fake-mount-type",
StatusId: 0,
Uuid: "fake-uuid",
},
}
})

It("cfreates an archive transaction", func() {
transaction, err := virtualGuestService.CreateArchiveTransaction(virtualGuest.Id, "fake-group-name", blockDevices, "fake-note")

Expect(err).ToNot(HaveOccurred())

Expect(transaction.CreateDate).ToNot(BeNil())
Expect(transaction.ElapsedSeconds).To(BeNumerically(">", 0))
Expect(transaction.GuestId).To(Equal(123456))
Expect(transaction.HardwareId).To(Equal(123456))
Expect(transaction.Id).To(Equal(0))
Expect(transaction.ModifyDate).ToNot(BeNil())
Expect(transaction.StatusChangeDate).ToNot(BeNil())

Expect(transaction.TransactionGroup).To(Equal(datatypes.TransactionGroup{
AverageTimeToComplete: ".5",
Name: "fake-name",
}))

Expect(transaction.TransactionStatus).To(Equal(datatypes.TransactionStatus{
AverageDuration: ".4",
FriendlyName: "fake-friendly-name",
Name: "fake-name",
}))
})

Context("when HTTP client returns error codes 40x or 50x", func() {
It("fails for error code 40x", func() {
errorCodes := []int{400, 401, 499}
for _, errorCode := range errorCodes {
fakeClient.FakeHttpClient.DoRawHttpRequestInt = errorCode

_, err := virtualGuestService.CreateArchiveTransaction(virtualGuest.Id, "fake-group-name", blockDevices, "fake-note")
Expect(err).To(HaveOccurred())
}
})

It("fails for error code 50x", func() {
errorCodes := []int{500, 501, 599}
for _, errorCode := range errorCodes {
fakeClient.FakeHttpClient.DoRawHttpRequestInt = errorCode

_, err := virtualGuestService.CreateArchiveTransaction(virtualGuest.Id, "fake-group-name", blockDevices, "fake-note")
Expect(err).To(HaveOccurred())
}
})
})
})
})
1 change: 1 addition & 0 deletions softlayer/softlayer_virtual_guest_service.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ type SoftLayer_Virtual_Guest_Service interface {
CaptureImage(instanceId int) (datatypes.SoftLayer_Container_Disk_Image_Capture_Template, error)
CheckHostDiskAvailability(instanceId int, diskCapacity int) (bool, error)
ConfigureMetadataDisk(instanceId int) (datatypes.SoftLayer_Provisioning_Version1_Transaction, error)
CreateArchiveTransaction(instanceId int, groupName string, blockDevices []datatypes.SoftLayer_Virtual_Guest_Block_Device, note string) (datatypes.SoftLayer_Provisioning_Version1_Transaction, error)
CreateObject(template datatypes.SoftLayer_Virtual_Guest_Template) (datatypes.SoftLayer_Virtual_Guest, error)

DeleteObject(instanceId int) (bool, error)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
{
"createDate": "2014-09-08T11:09:52-08:00",
"elapsedSeconds": 1,
"guestId": 123456,
"hardwareId": 123456,
"id": 0,
"modifyDate": "2014-09-08T11:09:52-08:00",
"statusChangeDate": "2014-09-08T11:09:52-08:00",
"transactionGroup": {
"averageTimeToComplete" : ".5",
"name" : "fake-name"
},
"transactionStatus": {
"averageDuration": ".4",
"friendlyName": "fake-friendly-name",
"name": "fake-name"
}
}

0 comments on commit 9e73ca4

Please sign in to comment.