additionally return 'error' from 'ToCreateServerMap'
diff --git a/openstack/compute/v2/extensions/bootfromvolume/requests.go b/openstack/compute/v2/extensions/bootfromvolume/requests.go
index b0cf61e..bbef496 100644
--- a/openstack/compute/v2/extensions/bootfromvolume/requests.go
+++ b/openstack/compute/v2/extensions/bootfromvolume/requests.go
@@ -1,31 +1,34 @@
package bootfromvolume
import (
- "errors"
+ "errors"
- "github.com/rackspace/gophercloud/openstack/compute/v2/servers"
+ "github.com/rackspace/gophercloud/openstack/compute/v2/servers"
)
type CreateOptsExt struct {
servers.CreateOptsBuilder
- BlockDeviceMapping BlockDeviceMapping
+ BDM BlockDeviceMapping
}
// ToServerCreateMap adds the block device mapping option to the base server
// creation options.
func (opts CreateOptsExt) ToServerCreateMap() (map[string]interface{}, error) {
- if opts.SourceType != "volume" && opts.SourceType != "image" && opts.SourceType != "snapshot" {
- return nil, errors.New("SourceType must be one of: volume, image, snapshot.")
- }
+ if opts.BDM.SourceType != "volume" && opts.BDM.SourceType != "image" && opts.BDM.SourceType != "snapshot" {
+ return nil, errors.New("SourceType must be one of: volume, image, snapshot.")
+ }
- if opts.UUID == "" {
- return nil, errors.New("Required field UUID not set.")
- }
+ if opts.BDM.UUID == "" {
+ return nil, errors.New("Required field UUID not set.")
+ }
- base := opts.CreateOptsBuilder.ToServerCreateMap()
+ base, err := opts.CreateOptsBuilder.ToServerCreateMap()
+ if err != nil {
+ return nil, err
+ }
- serverMap := base["server"].(map[string]interface{})
- serverMap["block_device_mapping_v2"] = opts.BlockDeviceMapping
+ serverMap := base["server"].(map[string]interface{})
+ serverMap["block_device_mapping_v2"] = opts.BDM
- return base
+ return base, nil
}
diff --git a/openstack/compute/v2/extensions/bootfromvolume/results.go b/openstack/compute/v2/extensions/bootfromvolume/results.go
index ef093e8..9d33728 100644
--- a/openstack/compute/v2/extensions/bootfromvolume/results.go
+++ b/openstack/compute/v2/extensions/bootfromvolume/results.go
@@ -1,10 +1,10 @@
package bootfromvolume
type BlockDeviceMapping struct {
- BootIndex int `json:"boot_index"`
- DeleteOnTermination bool `json:"delete_on_termination"`
- DestinationType string `json:"destination_type"`
- SourceType string `json:"source_type"`
- UUID string `json:"uuid"`
- VolumeSize int `json:"volume_size"`
+ BootIndex int `json:"boot_index"`
+ DeleteOnTermination bool `json:"delete_on_termination"`
+ DestinationType string `json:"destination_type"`
+ SourceType string `json:"source_type"`
+ UUID string `json:"uuid"`
+ VolumeSize int `json:"volume_size"`
}
diff --git a/openstack/compute/v2/extensions/diskconfig/requests.go b/openstack/compute/v2/extensions/diskconfig/requests.go
index 06a922a..cc390f7 100644
--- a/openstack/compute/v2/extensions/diskconfig/requests.go
+++ b/openstack/compute/v2/extensions/diskconfig/requests.go
@@ -45,13 +45,16 @@
}
// ToServerCreateMap adds the diskconfig option to the base server creation options.
-func (opts CreateOptsExt) ToServerCreateMap() map[string]interface{} {
- base := opts.CreateOptsBuilder.ToServerCreateMap()
+func (opts CreateOptsExt) ToServerCreateMap() (map[string]interface{}, error) {
+ base, err := opts.CreateOptsBuilder.ToServerCreateMap()
+ if err != nil {
+ return nil, err
+ }
serverMap := base["server"].(map[string]interface{})
serverMap["OS-DCF:diskConfig"] = string(opts.DiskConfig)
- return base
+ return base, nil
}
// RebuildOptsExt adds a DiskConfig option to the base RebuildOpts.
diff --git a/openstack/compute/v2/extensions/diskconfig/requests_test.go b/openstack/compute/v2/extensions/diskconfig/requests_test.go
index 1f4f626..e3c26d4 100644
--- a/openstack/compute/v2/extensions/diskconfig/requests_test.go
+++ b/openstack/compute/v2/extensions/diskconfig/requests_test.go
@@ -29,7 +29,9 @@
}
}
`
- th.CheckJSONEquals(t, expected, ext.ToServerCreateMap())
+ actual, err := ext.ToServerCreateMap()
+ th.AssertNoErr(t, err)
+ th.CheckJSONEquals(t, expected, actual)
}
func TestRebuildOpts(t *testing.T) {
diff --git a/openstack/compute/v2/servers/requests.go b/openstack/compute/v2/servers/requests.go
index c6eca11..544f816 100644
--- a/openstack/compute/v2/servers/requests.go
+++ b/openstack/compute/v2/servers/requests.go
@@ -79,7 +79,7 @@
// CreateOptsBuilder describes struct types that can be accepted by the Create call.
// The CreateOpts struct in this package does.
type CreateOptsBuilder interface {
- ToServerCreateMap() map[string]interface{}
+ ToServerCreateMap() (map[string]interface{}, error)
}
// Network is used within CreateOpts to control a new server's network attachments.
@@ -134,7 +134,7 @@
}
// ToServerCreateMap assembles a request body based on the contents of a CreateOpts.
-func (opts CreateOpts) ToServerCreateMap() map[string]interface{} {
+func (opts CreateOpts) ToServerCreateMap() (map[string]interface{}, error) {
server := make(map[string]interface{})
server["name"] = opts.Name
@@ -183,19 +183,26 @@
server["networks"] = networks
}
- return map[string]interface{}{"server": server}
+ return map[string]interface{}{"server": server}, nil
}
// Create requests a server to be provisioned to the user in the current tenant.
func Create(client *gophercloud.ServiceClient, opts CreateOptsBuilder) CreateResult {
- var result CreateResult
- _, result.Err = perigee.Request("POST", listURL(client), perigee.Options{
- Results: &result.Body,
- ReqBody: opts.ToServerCreateMap(),
+ var res CreateResult
+
+ reqBody, err := opts.ToServerCreateMap()
+ if err != nil {
+ res.Err = err
+ return res
+ }
+
+ _, res.Err = perigee.Request("POST", listURL(client), perigee.Options{
+ Results: &res.Body,
+ ReqBody: reqBody,
MoreHeaders: client.AuthenticatedHeaders(),
OkCodes: []int{202},
})
- return result
+ return res
}
// Delete requests that a server previously provisioned be removed from your account.