Skip to content

Commit

Permalink
Add boot from volume support
Browse files Browse the repository at this point in the history
  • Loading branch information
Fedosin committed Sep 25, 2019
1 parent 6148140 commit 87e0440
Show file tree
Hide file tree
Showing 8 changed files with 504 additions and 9 deletions.
4 changes: 3 additions & 1 deletion Gopkg.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions pkg/apis/openstackproviderconfig/v1alpha1/types.go
Original file line number Diff line number Diff line change
Expand Up @@ -175,6 +175,7 @@ type RootVolume struct {
SourceType string `json:"sourceType,omitempty"`
SourceUUID string `json:"sourceUUID,omitempty"`
DeviceType string `json:"deviceType"`
VolumeType string `json:"volumeType,omitempty"`
Size int `json:"diskSize,omitempty"`
}

Expand Down
49 changes: 41 additions & 8 deletions pkg/cloud/openstack/clients/machineservice.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ import (

"github.com/gophercloud/gophercloud"
"github.com/gophercloud/gophercloud/openstack"
"github.com/gophercloud/gophercloud/openstack/blockstorage/v3/volumes"
"github.com/gophercloud/gophercloud/openstack/common/extensions"
"github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/attachinterfaces"
"github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/bootfromvolume"
Expand Down Expand Up @@ -78,6 +79,7 @@ type InstanceService struct {
identityClient *gophercloud.ServiceClient
networkClient *gophercloud.ServiceClient
imagesClient *gophercloud.ServiceClient
volumeClient *gophercloud.ServiceClient

regionName string
}
Expand Down Expand Up @@ -224,12 +226,20 @@ func NewInstanceServiceFromCloud(cloud clientconfig.Cloud) (*InstanceService, er
return nil, fmt.Errorf("Create ImageClient err: %v", err)
}

volumeClient, err := openstack.NewBlockStorageV3(provider, gophercloud.EndpointOpts{
Region: clientOpts.RegionName,
})
if err != nil {
return nil, fmt.Errorf("Create VolumeClient err: %v", err)
}

return &InstanceService{
provider: provider,
identityClient: identityClient,
computeClient: serverClient,
networkClient: networkingClient,
imagesClient: imagesClient,
volumeClient: volumeClient,
regionName: clientOpts.RegionName,
}, nil
}
Expand Down Expand Up @@ -413,7 +423,6 @@ func getImageID(is *InstanceService, imageName string) (string, error) {

// InstanceCreate creates a compute instance
func (is *InstanceService) InstanceCreate(clusterName string, name string, clusterSpec *openstackconfigv1.OpenstackClusterProviderSpec, config *openstackconfigv1.OpenstackProviderSpec, cmd string, keyName string, configClient configclient.ConfigV1Interface) (instance *Instance, err error) {
var createOpts servers.CreateOptsBuilder
if config == nil {
return nil, fmt.Errorf("create Options need be specified to create instace")
}
Expand Down Expand Up @@ -590,7 +599,7 @@ func (is *InstanceService) InstanceCreate(clusterName string, name string, clust
return nil, fmt.Errorf("Create new server err: %v", err)
}

serverCreateOpts := servers.CreateOpts{
var serverCreateOpts servers.CreateOptsBuilder = servers.CreateOpts{
Name: name,
ImageRef: imageID,
FlavorName: config.Flavor,
Expand All @@ -608,21 +617,44 @@ func (is *InstanceService) InstanceCreate(clusterName string, name string, clust
if config.RootVolume != nil && config.RootVolume.Size != 0 {
var blocks []bootfromvolume.BlockDevice

imageID, err := getImageID(is, config.RootVolume.SourceUUID)
if err != nil {
return nil, fmt.Errorf("Create new server err: %v", err)
}

// Create a volume first
volumeCreateOpts := volumes.CreateOpts{
Size: config.RootVolume.Size,
VolumeType: config.RootVolume.VolumeType,
ImageID: imageID,
// The same name as the instance
Name: name,
}

volume, err := volumes.Create(is.volumeClient, volumeCreateOpts).Extract()
if err != nil {
return nil, fmt.Errorf("Create bootable volume err: %v", err)
}

err = volumes.WaitForStatus(is.volumeClient, volume.ID, "available", 300)
if err != nil {
return nil, fmt.Errorf("Create bootable volume err: %v", err)
}

block := bootfromvolume.BlockDevice{
SourceType: bootfromvolume.SourceType(config.RootVolume.SourceType),
SourceType: bootfromvolume.SourceVolume,
BootIndex: 0,
UUID: config.RootVolume.SourceUUID,
UUID: volume.ID,
DeleteOnTermination: true,
DestinationType: bootfromvolume.DestinationVolume,
VolumeSize: config.RootVolume.Size,
DeviceType: config.RootVolume.DeviceType,
}
blocks = append(blocks, block)

createOpts = bootfromvolume.CreateOptsExt{
CreateOptsBuilder: createOpts,
serverCreateOpts = bootfromvolume.CreateOptsExt{
CreateOptsBuilder: serverCreateOpts,
BlockDevice: blocks,
}

}

server, err := servers.Create(is.computeClient, keypairs.CreateOptsExt{
Expand All @@ -632,6 +664,7 @@ func (is *InstanceService) InstanceCreate(clusterName string, name string, clust
if err != nil {
return nil, fmt.Errorf("Create new server err: %v", err)
}

is.computeClient.Microversion = ""
return serverToInstance(server), nil
}
Expand Down

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading

0 comments on commit 87e0440

Please sign in to comment.