From 12d5a82882a52b5a0d8ae2972fe6de086024ca8d Mon Sep 17 00:00:00 2001 From: Simon Murray Date: Thu, 5 Dec 2024 11:02:00 +0000 Subject: [PATCH] Add Image Sizes (#88) When selecting an image based on metadata we need to raise an error, or select a version that will actual fit on the selected flavor, or limit flavor selection to those that will work with the image. Or vice versa! --- charts/region/Chart.yaml | 4 +- pkg/handler/handler.go | 1 + pkg/openapi/schema.go | 281 ++++++++++++++-------------- pkg/openapi/server.spec.yaml | 5 + pkg/openapi/types.go | 3 + pkg/providers/openstack/provider.go | 8 + pkg/providers/types.go | 2 + 7 files changed, 162 insertions(+), 142 deletions(-) diff --git a/charts/region/Chart.yaml b/charts/region/Chart.yaml index 2efe344..1bd6540 100644 --- a/charts/region/Chart.yaml +++ b/charts/region/Chart.yaml @@ -4,8 +4,8 @@ description: A Helm chart for deploying Unikorn's Region Controller type: application -version: v0.1.47-rc3 -appVersion: v0.1.47-rc3 +version: v0.1.47-rc4 +appVersion: v0.1.47-rc4 icon: https://raw.githubusercontent.com/unikorn-cloud/assets/main/images/logos/dark-on-light/icon.png diff --git a/pkg/handler/handler.go b/pkg/handler/handler.go index 8d0535d..646a946 100644 --- a/pkg/handler/handler.go +++ b/pkg/handler/handler.go @@ -288,6 +288,7 @@ func convertImage(in providers.Image) openapi.Image { CreationTime: in.Created, }, Spec: openapi.ImageSpec{ + SizeGiB: in.SizeGiB, Virtualization: convertImageVirtualization(in.Virtualization), Os: openapi.ImageOS{ Kernel: convertOsKernel(in.OS.Kernel), diff --git a/pkg/openapi/schema.go b/pkg/openapi/schema.go index eed1d93..4cc3e17 100644 --- a/pkg/openapi/schema.go +++ b/pkg/openapi/schema.go @@ -19,146 +19,147 @@ import ( // Base64 encoded, gzipped, json marshaled Swagger object var swaggerSpec = []string{ - "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", } // GetSwagger returns the content of the embedded swagger specification file diff --git a/pkg/openapi/server.spec.yaml b/pkg/openapi/server.spec.yaml index 9e98526..d22ac56 100644 --- a/pkg/openapi/server.spec.yaml +++ b/pkg/openapi/server.spec.yaml @@ -775,9 +775,13 @@ components: description: An image. type: object required: + - sizeGiB - virtualization - os properties: + sizeGiB: + description: Minimum disk size required to use the image in GiB. + type: integer virtualization: $ref: '#/components/schemas/imageVirtualization' os: @@ -1480,6 +1484,7 @@ components: name: ubu2204-v1.25.6-gpu-525.85.05-7ced4154 creationTime: 2023-02-22T12:04:13Z spec: + sizeGiB: 10 virtualization: virtualized os: kernel: linux diff --git a/pkg/openapi/types.go b/pkg/openapi/types.go index dc87923..62a65d1 100644 --- a/pkg/openapi/types.go +++ b/pkg/openapi/types.go @@ -271,6 +271,9 @@ type ImageSpec struct { // Os An operating system description. Os ImageOS `json:"os"` + // SizeGiB Minimum disk size required to use the image in GiB. + SizeGiB int `json:"sizeGiB"` + // SoftwareVersions Image preinstalled version version metadata. SoftwareVersions *SoftwareVersions `json:"softwareVersions,omitempty"` diff --git a/pkg/providers/openstack/provider.go b/pkg/providers/openstack/provider.go index 69c62b2..7cf044c 100644 --- a/pkg/providers/openstack/provider.go +++ b/pkg/providers/openstack/provider.go @@ -363,11 +363,19 @@ func (p *Provider) Images(ctx context.Context) (providers.ImageList, error) { virtualization, _ := image.Properties["unikorn:virtualization"].(string) + size := image.MinDiskGigabytes + + if size == 0 { + // Round up to the nearest GiB. + size = int((image.VirtualSize + (1 << 30) - 1) >> 30) + } + providerImage := providers.Image{ ID: image.ID, Name: image.Name, Created: image.CreatedAt, Modified: image.UpdatedAt, + SizeGiB: size, Virtualization: providers.ImageVirtualization(virtualization), OS: p.imageOS(image), Packages: p.imagePackages(image), diff --git a/pkg/providers/types.go b/pkg/providers/types.go index 1d1ff61..2f823bd 100644 --- a/pkg/providers/types.go +++ b/pkg/providers/types.go @@ -90,6 +90,8 @@ type Image struct { Created time.Time // Modified is when the image was modified. Modified time.Time + // SizeGiB is the minumum disk size for the image in GiB. + SizeGiB int // ImageVirtualization defines how the image can be used. Virtualization ImageVirtualization // GPU is any GPU specific configuration for scheduling on a specific flavor type.