boot from volume base code
diff --git a/openstack/compute/v2/extensions/bootfromvolume/requests.go b/openstack/compute/v2/extensions/bootfromvolume/requests.go
new file mode 100644
index 0000000..b0cf61e
--- /dev/null
+++ b/openstack/compute/v2/extensions/bootfromvolume/requests.go
@@ -0,0 +1,31 @@
+package bootfromvolume
+
+import (
+ "errors"
+
+ "github.com/rackspace/gophercloud/openstack/compute/v2/servers"
+)
+
+type CreateOptsExt struct {
+ servers.CreateOptsBuilder
+ BlockDeviceMapping 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.UUID == "" {
+ return nil, errors.New("Required field UUID not set.")
+ }
+
+ base := opts.CreateOptsBuilder.ToServerCreateMap()
+
+ serverMap := base["server"].(map[string]interface{})
+ serverMap["block_device_mapping_v2"] = opts.BlockDeviceMapping
+
+ return base
+}
diff --git a/openstack/compute/v2/extensions/bootfromvolume/requests_test.go b/openstack/compute/v2/extensions/bootfromvolume/requests_test.go
new file mode 100644
index 0000000..a564982
--- /dev/null
+++ b/openstack/compute/v2/extensions/bootfromvolume/requests_test.go
@@ -0,0 +1 @@
+package bootfromvolume
diff --git a/openstack/compute/v2/extensions/bootfromvolume/results.go b/openstack/compute/v2/extensions/bootfromvolume/results.go
new file mode 100644
index 0000000..ef093e8
--- /dev/null
+++ b/openstack/compute/v2/extensions/bootfromvolume/results.go
@@ -0,0 +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"`
+}