From 9d990ea5da6286423c0d22a927a6026a6b096975 Mon Sep 17 00:00:00 2001 From: Achilleas Koutsou Date: Mon, 16 Oct 2023 18:34:48 +0200 Subject: [PATCH] cloudapi: separate target selection from initialisation Separate the target selection in GetTarget() into two steps. First determine the default target name for the image type and then use the name to initialise the target object. This is a bit more work (and double switching) but will be needed to support selecting targets externally. --- internal/cloudapi/v2/imagerequest.go | 50 ++++++++++++++++++++++------ 1 file changed, 40 insertions(+), 10 deletions(-) diff --git a/internal/cloudapi/v2/imagerequest.go b/internal/cloudapi/v2/imagerequest.go index cc6c1ca7d..e5a695940 100644 --- a/internal/cloudapi/v2/imagerequest.go +++ b/internal/cloudapi/v2/imagerequest.go @@ -220,10 +220,10 @@ func newOCITarget(ir *ImageRequest, imageType distro.ImageType) (*target.Target, return t, nil } -// GetImageTarget returns the target for the selected image type -func (ir *ImageRequest) GetTarget(request *ComposeRequest, imageType distro.ImageType) (irTarget *target.Target, err error) { - // oneOf is not supported by the openapi generator so marshal and unmarshal the uploadrequest based on the type - switch ir.ImageType { +// Returns the name of the default target for a given image type name or error +// if the image type name is unknown. +func getDefaultTarget(imageType ImageTypes) (UploadTypes, error) { + switch imageType { case ImageTypesAws: fallthrough case ImageTypesAwsRhui: @@ -231,7 +231,7 @@ func (ir *ImageRequest) GetTarget(request *ComposeRequest, imageType distro.Imag case ImageTypesAwsHaRhui: fallthrough case ImageTypesAwsSapRhui: - irTarget, err = newAWSTarget(ir, imageType) + return UploadTypesAws, nil case ImageTypesGuestImage: fallthrough @@ -254,17 +254,17 @@ func (ir *ImageRequest) GetTarget(request *ComposeRequest, imageType distro.Imag case ImageTypesIotCommit: fallthrough case ImageTypesIotRawImage: - irTarget, err = newAWSS3Target(ir, imageType) + return UploadTypesAwsS3, nil case ImageTypesEdgeContainer: fallthrough case ImageTypesIotContainer: - irTarget, err = newContainerTarget(ir, request, imageType) + return UploadTypesContainer, nil case ImageTypesGcp: fallthrough case ImageTypesGcpRhui: - irTarget, err = newGCPTarget(ir, imageType) + return UploadTypesGcp, nil case ImageTypesAzure: fallthrough @@ -273,13 +273,43 @@ func (ir *ImageRequest) GetTarget(request *ComposeRequest, imageType distro.Imag case ImageTypesAzureEap7Rhui: fallthrough case ImageTypesAzureSapRhui: - irTarget, err = newAzureTarget(ir, imageType) + return UploadTypesAzure, nil case ImageTypesOci: + return UploadTypesOciObjectstorage, nil + + default: + return "", HTTPError(ErrorUnsupportedImageType) + } +} + +// GetTarget returns the target for the selected image type. +func (ir *ImageRequest) GetTarget(request *ComposeRequest, imageType distro.ImageType) (irTarget *target.Target, err error) { + uploadTarget, err := getDefaultTarget(ir.ImageType) + if err != nil { + return nil, err + } + switch uploadTarget { + case UploadTypesAws: + irTarget, err = newAWSTarget(ir, imageType) + + case UploadTypesAwsS3: + irTarget, err = newAWSS3Target(ir, imageType) + + case UploadTypesContainer: + irTarget, err = newContainerTarget(ir, request, imageType) + + case UploadTypesGcp: + irTarget, err = newGCPTarget(ir, imageType) + + case UploadTypesAzure: + irTarget, err = newAzureTarget(ir, imageType) + + case UploadTypesOciObjectstorage: irTarget, err = newOCITarget(ir, imageType) default: - return nil, HTTPError(ErrorUnsupportedImageType) + return nil, HTTPError(ErrorInvalidUploadTarget) } if err != nil { return nil, err