Skip to content

Commit

Permalink
Added custom root disk size for openstack vms (#388)
Browse files Browse the repository at this point in the history
  • Loading branch information
afritzler authored and prashanth26 committed Jan 16, 2020
1 parent 0510de7 commit bec07c7
Show file tree
Hide file tree
Showing 12 changed files with 355 additions and 1 deletion.
1 change: 1 addition & 0 deletions kubernetes/machine_classes/openstack-machine-class.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ spec:
region: <region> # Region where to place the machine
availabilityZone: <availability_zone> # Availability zone where to place the machine
podNetworkCidr: <pod_network_cidr> # CIDR of the overlay Calico IP pool
# rootDiskSize: 100 # in GB (optional) overrides the flavor provider root disk size and use a Cinder backed block device instead
# OpenStack machine metadata block
# Be aware, that metadata keys (tags) in OpenStack can not contain special characters likes "/"
tags:
Expand Down
1 change: 1 addition & 0 deletions pkg/apis/machine/types.go
Original file line number Diff line number Diff line change
Expand Up @@ -674,6 +674,7 @@ type OpenStackMachineClassSpec struct {
Networks []OpenStackNetwork
SecretRef *corev1.SecretReference
PodNetworkCidr string
RootDiskSize int // in GB
}

type OpenStackNetwork struct {
Expand Down
1 change: 1 addition & 0 deletions pkg/apis/machine/v1alpha1/types.go
Original file line number Diff line number Diff line change
Expand Up @@ -743,6 +743,7 @@ type OpenStackMachineClassSpec struct {
Networks []OpenStackNetwork `json:"networks,omitempty"`
SecretRef *corev1.SecretReference `json:"secretRef,omitempty"`
PodNetworkCidr string `json:"podNetworkCidr"`
RootDiskSize int `json:"rootDiskSize,omitempty"` // in GB
}

type OpenStackNetwork struct {
Expand Down
2 changes: 2 additions & 0 deletions pkg/apis/machine/v1alpha1/zz_generated.conversion.go

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

3 changes: 3 additions & 0 deletions pkg/apis/machine/validation/openstackmachineclass.go
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,9 @@ func validateOpenStackMachineClassSpec(spec *machine.OpenStackMachineClassSpec,
if "" == spec.PodNetworkCidr {
allErrs = append(allErrs, field.Required(fldPath.Child("podNetworkCidr"), "PodNetworkCidr is required"))
}
if spec.RootDiskSize < 0 {
allErrs = append(allErrs, field.Required(fldPath.Child("rootDiskSize"), "RootDiskSize can not be negative"))
}

allErrs = append(allErrs, validateOsNetworks(spec.Networks, spec.PodNetworkCidr, field.NewPath("spec.networks"))...)
allErrs = append(allErrs, validateSecretRef(spec.SecretRef, field.NewPath("spec.secretRef"))...)
Expand Down
38 changes: 37 additions & 1 deletion pkg/driver/driver_openstack.go
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ import (

"github.com/gophercloud/gophercloud"
"github.com/gophercloud/gophercloud/openstack"
"github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/bootfromvolume"
"github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/keypairs"
"github.com/gophercloud/gophercloud/openstack/compute/v2/images"
"github.com/gophercloud/gophercloud/openstack/compute/v2/servers"
Expand Down Expand Up @@ -78,6 +79,7 @@ func (d *OpenStackDriver) Create() (string, string, error) {
availabilityZone := d.OpenStackMachineClass.Spec.AvailabilityZone
metadata := d.OpenStackMachineClass.Spec.Tags
podNetworkCidr := d.OpenStackMachineClass.Spec.PodNetworkCidr
rootDiskSize := d.OpenStackMachineClass.Spec.RootDiskSize

var createOpts servers.CreateOptsBuilder
var imageRef string
Expand Down Expand Up @@ -142,8 +144,28 @@ func (d *OpenStackDriver) Create() (string, string, error) {
KeyName: keyName,
}

if rootDiskSize > 0 {
blockDevices, err := resourceInstanceBlockDevicesV2(rootDiskSize, imageRef)
if err != nil {
return "", "", err
}

createOpts = &bootfromvolume.CreateOptsExt{
CreateOptsBuilder: createOpts,
BlockDevice: blockDevices,
}
}

glog.V(3).Infof("creating machine")
server, err := servers.Create(client, createOpts).Extract()

var server *servers.Server
// If a custom block_device (root disk size is provided) we need to boot from volume
if rootDiskSize > 0 {
server, err = bootfromvolume.Create(client, createOpts).Extract()
} else {
server, err = servers.Create(client, createOpts).Extract()
}

if err != nil {
metrics.APIFailedRequestCount.With(prometheus.Labels{"provider": "openstack", "service": "nova"}).Inc()
return "", "", fmt.Errorf("error creating the server: %s", err)
Expand Down Expand Up @@ -525,3 +547,17 @@ func strSliceContains(haystack []string, needle string) bool {
}
return false
}

func resourceInstanceBlockDevicesV2(rootDiskSize int, imageID string) ([]bootfromvolume.BlockDevice, error) {
blockDeviceOpts := make([]bootfromvolume.BlockDevice, 1)
blockDeviceOpts[0] = bootfromvolume.BlockDevice{
UUID: imageID,
VolumeSize: rootDiskSize,
BootIndex: 0,
DeleteOnTermination: true,
SourceType: "image",
DestinationType: "volume",
}
glog.V(2).Infof("[DEBUG] Block Device Options: %+v", blockDeviceOpts)
return blockDeviceOpts, nil
}
6 changes: 6 additions & 0 deletions pkg/openapi/openapi_generated.go

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.

0 comments on commit bec07c7

Please sign in to comment.