cli: use pre-uploaded image on OpenStack

Before, the terraform infrastructure code would upload an image on the fly.
Now, we upload images in advance and specify the image ID instead.
This commit is contained in:
Malte Poll 2024-02-19 13:33:47 +01:00
parent 3b2da12781
commit 6f9020d527
8 changed files with 22 additions and 56 deletions

View File

@ -258,8 +258,7 @@ func openStackTerraformVars(conf *config.Config, imageRef string) (*terraform.Op
Name: conf.Name, Name: conf.Name,
Cloud: toPtr(conf.Provider.OpenStack.Cloud), Cloud: toPtr(conf.Provider.OpenStack.Cloud),
FloatingIPPoolID: conf.Provider.OpenStack.FloatingIPPoolID, FloatingIPPoolID: conf.Provider.OpenStack.FloatingIPPoolID,
ImageURL: imageRef, ImageID: imageRef,
DirectDownload: *conf.Provider.OpenStack.DirectDownload,
OpenstackUserDomainName: conf.Provider.OpenStack.UserDomainName, OpenstackUserDomainName: conf.Provider.OpenStack.UserDomainName,
OpenstackUsername: conf.Provider.OpenStack.Username, OpenstackUsername: conf.Provider.OpenStack.Username,
OpenstackPassword: conf.Provider.OpenStack.Password, OpenstackPassword: conf.Provider.OpenStack.Password,

View File

@ -282,10 +282,8 @@ type OpenStackClusterVariables struct {
Cloud *string `hcl:"cloud" cty:"cloud"` Cloud *string `hcl:"cloud" cty:"cloud"`
// FloatingIPPoolID is the ID of the OpenStack floating IP pool to use for public IPs. // FloatingIPPoolID is the ID of the OpenStack floating IP pool to use for public IPs.
FloatingIPPoolID string `hcl:"floating_ip_pool_id" cty:"floating_ip_pool_id"` FloatingIPPoolID string `hcl:"floating_ip_pool_id" cty:"floating_ip_pool_id"`
// ImageURL is the URL of the OpenStack image to use. // ImageID is the ID of the OpenStack image to use.
ImageURL string `hcl:"image_id" cty:"image_id"` ImageID string `hcl:"image_id" cty:"image_id"`
// DirectDownload decides whether to download the image directly from the URL to OpenStack or to upload it from the local machine.
DirectDownload bool `hcl:"direct_download" cty:"direct_download"`
// OpenstackUserDomainName is the OpenStack user domain name to use. // OpenstackUserDomainName is the OpenStack user domain name to use.
OpenstackUserDomainName string `hcl:"openstack_user_domain_name" cty:"openstack_user_domain_name"` OpenstackUserDomainName string `hcl:"openstack_user_domain_name" cty:"openstack_user_domain_name"`
// OpenstackUsername is the OpenStack user name to use. // OpenstackUsername is the OpenStack user name to use.

View File

@ -255,8 +255,7 @@ func TestOpenStackClusterVariables(t *testing.T) {
Name: "cluster-name", Name: "cluster-name",
Cloud: toPtr("my-cloud"), Cloud: toPtr("my-cloud"),
FloatingIPPoolID: "fip-pool-0123456789abcdef", FloatingIPPoolID: "fip-pool-0123456789abcdef",
ImageURL: "https://example.com/image.raw", ImageID: "8e10b92d-8f7a-458c-91c6-59b42f82ef81",
DirectDownload: true,
OpenstackUserDomainName: "my-user-domain", OpenstackUserDomainName: "my-user-domain",
OpenstackUsername: "my-username", OpenstackUsername: "my-username",
OpenstackPassword: "my-password", OpenstackPassword: "my-password",
@ -288,8 +287,7 @@ node_groups = {
} }
cloud = "my-cloud" cloud = "my-cloud"
floating_ip_pool_id = "fip-pool-0123456789abcdef" floating_ip_pool_id = "fip-pool-0123456789abcdef"
image_id = "https://example.com/image.raw" image_id = "8e10b92d-8f7a-458c-91c6-59b42f82ef81"
direct_download = true
openstack_user_domain_name = "my-user-domain" openstack_user_domain_name = "my-user-domain"
openstack_username = "my-username" openstack_username = "my-username"
openstack_password = "my-password" openstack_password = "my-password"

View File

@ -228,9 +228,6 @@ type OpenStackConfig struct {
// Password to use inside the cluster. You can instead use the environment variable "CONSTELL_OS_PASSWORD". // Password to use inside the cluster. You can instead use the environment variable "CONSTELL_OS_PASSWORD".
Password string `yaml:"password"` Password string `yaml:"password"`
// description: | // description: |
// If enabled, downloads OS image directly from source URL to OpenStack. Otherwise, downloads image to local machine and uploads to OpenStack.
DirectDownload *bool `yaml:"directDownload" validate:"required"`
// description: |
// Deploy Yawol loadbalancer. For details see: https://github.com/stackitcloud/yawol // Deploy Yawol loadbalancer. For details see: https://github.com/stackitcloud/yawol
DeployYawolLoadBalancer *bool `yaml:"deployYawolLoadBalancer" validate:"required"` DeployYawolLoadBalancer *bool `yaml:"deployYawolLoadBalancer" validate:"required"`
// description: | // description: |
@ -363,7 +360,6 @@ func Default() *Config {
UseMarketplaceImage: toPtr(false), UseMarketplaceImage: toPtr(false),
}, },
OpenStack: &OpenStackConfig{ OpenStack: &OpenStackConfig{
DirectDownload: toPtr(true),
DeployYawolLoadBalancer: toPtr(true), DeployYawolLoadBalancer: toPtr(true),
DeployCSIDriver: toPtr(true), DeployCSIDriver: toPtr(true),
}, },
@ -912,7 +908,6 @@ func (c *Config) WithOpenStackProviderDefaults(openStackProvider string) *Config
c.Provider.OpenStack.YawolImageID = "bcd6c13e-75d1-4c3f-bf0f-8f83580cc1be" c.Provider.OpenStack.YawolImageID = "bcd6c13e-75d1-4c3f-bf0f-8f83580cc1be"
c.Provider.OpenStack.YawolFlavorID = "3b11b27e-6c73-470d-b595-1d85b95a8cdf" c.Provider.OpenStack.YawolFlavorID = "3b11b27e-6c73-470d-b595-1d85b95a8cdf"
c.Provider.OpenStack.DeployCSIDriver = toPtr(true) c.Provider.OpenStack.DeployCSIDriver = toPtr(true)
c.Provider.OpenStack.DirectDownload = toPtr(true)
for groupName, group := range c.NodeGroups { for groupName, group := range c.NodeGroups {
group.InstanceType = "2715eabe-3ffc-4c36-b02a-efa8c141a96a" group.InstanceType = "2715eabe-3ffc-4c36-b02a-efa8c141a96a"
group.StateDiskType = "storage_premium_perf6" group.StateDiskType = "storage_premium_perf6"

View File

@ -276,7 +276,7 @@ func init() {
FieldName: "openstack", FieldName: "openstack",
}, },
} }
OpenStackConfigDoc.Fields = make([]encoder.Doc, 16) OpenStackConfigDoc.Fields = make([]encoder.Doc, 15)
OpenStackConfigDoc.Fields[0].Name = "cloud" OpenStackConfigDoc.Fields[0].Name = "cloud"
OpenStackConfigDoc.Fields[0].Type = "string" OpenStackConfigDoc.Fields[0].Type = "string"
OpenStackConfigDoc.Fields[0].Note = "" OpenStackConfigDoc.Fields[0].Note = ""
@ -332,31 +332,26 @@ func init() {
OpenStackConfigDoc.Fields[10].Note = "" OpenStackConfigDoc.Fields[10].Note = ""
OpenStackConfigDoc.Fields[10].Description = "Password to use inside the cluster. You can instead use the environment variable \"CONSTELL_OS_PASSWORD\"." OpenStackConfigDoc.Fields[10].Description = "Password to use inside the cluster. You can instead use the environment variable \"CONSTELL_OS_PASSWORD\"."
OpenStackConfigDoc.Fields[10].Comments[encoder.LineComment] = "Password to use inside the cluster. You can instead use the environment variable \"CONSTELL_OS_PASSWORD\"." OpenStackConfigDoc.Fields[10].Comments[encoder.LineComment] = "Password to use inside the cluster. You can instead use the environment variable \"CONSTELL_OS_PASSWORD\"."
OpenStackConfigDoc.Fields[11].Name = "directDownload" OpenStackConfigDoc.Fields[11].Name = "deployYawolLoadBalancer"
OpenStackConfigDoc.Fields[11].Type = "bool" OpenStackConfigDoc.Fields[11].Type = "bool"
OpenStackConfigDoc.Fields[11].Note = "" OpenStackConfigDoc.Fields[11].Note = ""
OpenStackConfigDoc.Fields[11].Description = "If enabled, downloads OS image directly from source URL to OpenStack. Otherwise, downloads image to local machine and uploads to OpenStack." OpenStackConfigDoc.Fields[11].Description = "Deploy Yawol loadbalancer. For details see: https://github.com/stackitcloud/yawol"
OpenStackConfigDoc.Fields[11].Comments[encoder.LineComment] = "If enabled, downloads OS image directly from source URL to OpenStack. Otherwise, downloads image to local machine and uploads to OpenStack." OpenStackConfigDoc.Fields[11].Comments[encoder.LineComment] = "Deploy Yawol loadbalancer. For details see: https://github.com/stackitcloud/yawol"
OpenStackConfigDoc.Fields[12].Name = "deployYawolLoadBalancer" OpenStackConfigDoc.Fields[12].Name = "yawolImageID"
OpenStackConfigDoc.Fields[12].Type = "bool" OpenStackConfigDoc.Fields[12].Type = "string"
OpenStackConfigDoc.Fields[12].Note = "" OpenStackConfigDoc.Fields[12].Note = ""
OpenStackConfigDoc.Fields[12].Description = "Deploy Yawol loadbalancer. For details see: https://github.com/stackitcloud/yawol" OpenStackConfigDoc.Fields[12].Description = "OpenStack OS image used by the yawollet. For details see: https://github.com/stackitcloud/yawol"
OpenStackConfigDoc.Fields[12].Comments[encoder.LineComment] = "Deploy Yawol loadbalancer. For details see: https://github.com/stackitcloud/yawol" OpenStackConfigDoc.Fields[12].Comments[encoder.LineComment] = "OpenStack OS image used by the yawollet. For details see: https://github.com/stackitcloud/yawol"
OpenStackConfigDoc.Fields[13].Name = "yawolImageID" OpenStackConfigDoc.Fields[13].Name = "yawolFlavorID"
OpenStackConfigDoc.Fields[13].Type = "string" OpenStackConfigDoc.Fields[13].Type = "string"
OpenStackConfigDoc.Fields[13].Note = "" OpenStackConfigDoc.Fields[13].Note = ""
OpenStackConfigDoc.Fields[13].Description = "OpenStack OS image used by the yawollet. For details see: https://github.com/stackitcloud/yawol" OpenStackConfigDoc.Fields[13].Description = "OpenStack flavor id used for yawollets. For details see: https://github.com/stackitcloud/yawol"
OpenStackConfigDoc.Fields[13].Comments[encoder.LineComment] = "OpenStack OS image used by the yawollet. For details see: https://github.com/stackitcloud/yawol" OpenStackConfigDoc.Fields[13].Comments[encoder.LineComment] = "OpenStack flavor id used for yawollets. For details see: https://github.com/stackitcloud/yawol"
OpenStackConfigDoc.Fields[14].Name = "yawolFlavorID" OpenStackConfigDoc.Fields[14].Name = "deployCSIDriver"
OpenStackConfigDoc.Fields[14].Type = "string" OpenStackConfigDoc.Fields[14].Type = "bool"
OpenStackConfigDoc.Fields[14].Note = "" OpenStackConfigDoc.Fields[14].Note = ""
OpenStackConfigDoc.Fields[14].Description = "OpenStack flavor id used for yawollets. For details see: https://github.com/stackitcloud/yawol" OpenStackConfigDoc.Fields[14].Description = "Deploy Cinder CSI driver with on-node encryption. For details see: https://docs.edgeless.systems/constellation/architecture/encrypted-storage"
OpenStackConfigDoc.Fields[14].Comments[encoder.LineComment] = "OpenStack flavor id used for yawollets. For details see: https://github.com/stackitcloud/yawol" OpenStackConfigDoc.Fields[14].Comments[encoder.LineComment] = "Deploy Cinder CSI driver with on-node encryption. For details see: https://docs.edgeless.systems/constellation/architecture/encrypted-storage"
OpenStackConfigDoc.Fields[15].Name = "deployCSIDriver"
OpenStackConfigDoc.Fields[15].Type = "bool"
OpenStackConfigDoc.Fields[15].Note = ""
OpenStackConfigDoc.Fields[15].Description = "Deploy Cinder CSI driver with on-node encryption. For details see: https://docs.edgeless.systems/constellation/architecture/encrypted-storage"
OpenStackConfigDoc.Fields[15].Comments[encoder.LineComment] = "Deploy Cinder CSI driver with on-node encryption. For details see: https://docs.edgeless.systems/constellation/architecture/encrypted-storage"
QEMUConfigDoc.Type = "QEMUConfig" QEMUConfigDoc.Type = "QEMUConfig"
QEMUConfigDoc.Comments[encoder.LineComment] = "QEMUConfig holds config information for QEMU based Constellation deployments." QEMUConfigDoc.Comments[encoder.LineComment] = "QEMUConfig holds config information for QEMU based Constellation deployments."

View File

@ -389,7 +389,6 @@ func V3ToV4(path string, fileHandler file.Handler) error {
RegionName: cfgV3.Provider.OpenStack.RegionName, RegionName: cfgV3.Provider.OpenStack.RegionName,
Username: cfgV3.Provider.OpenStack.Username, Username: cfgV3.Provider.OpenStack.Username,
Password: cfgV3.Provider.OpenStack.Password, Password: cfgV3.Provider.OpenStack.Password,
DirectDownload: cfgV3.Provider.OpenStack.DirectDownload,
DeployYawolLoadBalancer: cfgV3.Provider.OpenStack.DeployYawolLoadBalancer, DeployYawolLoadBalancer: cfgV3.Provider.OpenStack.DeployYawolLoadBalancer,
YawolImageID: cfgV3.Provider.OpenStack.YawolImageID, YawolImageID: cfgV3.Provider.OpenStack.YawolImageID,
YawolFlavorID: cfgV3.Provider.OpenStack.YawolFlavorID, YawolFlavorID: cfgV3.Provider.OpenStack.YawolFlavorID,

View File

@ -55,19 +55,6 @@ resource "random_password" "init_secret" {
override_special = "_%@" override_special = "_%@"
} }
resource "openstack_images_image_v2" "image_id" {
name = local.name
image_source_url = var.image_id
web_download = var.direct_download
container_format = "bare"
disk_format = "raw"
visibility = "private"
properties = {
hw_firmware_type = "uefi"
os_type = "linux"
}
}
data "openstack_networking_network_v2" "floating_ip_pool" { data "openstack_networking_network_v2" "floating_ip_pool" {
network_id = var.floating_ip_pool_id network_id = var.floating_ip_pool_id
} }
@ -216,7 +203,7 @@ module "instance_group" {
disk_size = each.value.state_disk_size disk_size = each.value.state_disk_size
state_disk_type = each.value.state_disk_type state_disk_type = each.value.state_disk_type
availability_zone = each.value.zone availability_zone = each.value.zone
image_id = openstack_images_image_v2.image_id.image_id image_id = var.image_id
flavor_id = each.value.flavor_id flavor_id = each.value.flavor_id
security_groups = [openstack_networking_secgroup_v2.vpc_secgroup.id] security_groups = [openstack_networking_secgroup_v2.vpc_secgroup.id]
tags = local.tags tags = local.tags

View File

@ -25,7 +25,7 @@ variable "node_groups" {
variable "image_id" { variable "image_id" {
type = string type = string
description = "OS image URL for the cluster's nodes." description = "OS image ID for the cluster's nodes."
} }
variable "debug" { variable "debug" {
@ -48,11 +48,6 @@ variable "cloud" {
description = "Cloud to use within the OpenStack \"clouds.yaml\" file. Optional. If not set, environment variables are used." description = "Cloud to use within the OpenStack \"clouds.yaml\" file. Optional. If not set, environment variables are used."
} }
variable "direct_download" {
type = bool
description = "Download OS image directly from source URL to OpenStack. Otherwise, the image is downloaded to the local machine and uploads to OpenStack."
}
variable "floating_ip_pool_id" { variable "floating_ip_pool_id" {
type = string type = string
description = "Pool (network name) to use for floating IPs." description = "Pool (network name) to use for floating IPs."