diff --git a/internal/cloudapi/v2/openapi.v2.gen.go b/internal/cloudapi/v2/openapi.v2.gen.go index 229687f06..8e041aa91 100644 --- a/internal/cloudapi/v2/openapi.v2.gen.go +++ b/internal/cloudapi/v2/openapi.v2.gen.go @@ -235,11 +235,11 @@ type GCPUploadStatus struct { // ImageRequest defines model for ImageRequest. type ImageRequest struct { - Architecture string `json:"architecture"` - ImageType ImageTypes `json:"image_type"` - Ostree *OSTree `json:"ostree,omitempty"` - Repositories []Repository `json:"repositories"` - UploadOptions UploadOptions `json:"upload_options"` + Architecture string `json:"architecture"` + ImageType ImageTypes `json:"image_type"` + Ostree *OSTree `json:"ostree,omitempty"` + Repositories []Repository `json:"repositories"` + UploadOptions *UploadOptions `json:"upload_options,omitempty"` } // ImageStatus defines model for ImageStatus. @@ -538,68 +538,68 @@ func RegisterHandlersWithBaseURL(router EchoRouter, si ServerInterface, baseURL // 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/internal/cloudapi/v2/openapi.v2.yml b/internal/cloudapi/v2/openapi.v2.yml index 32825a578..ec41e99ed 100644 --- a/internal/cloudapi/v2/openapi.v2.yml +++ b/internal/cloudapi/v2/openapi.v2.yml @@ -497,7 +497,6 @@ components: - architecture - image_type - repositories - - upload_options properties: architecture: type: string diff --git a/internal/cloudapi/v2/v2.go b/internal/cloudapi/v2/v2.go index 54bd9c45c..499963ad8 100644 --- a/internal/cloudapi/v2/v2.go +++ b/internal/cloudapi/v2/v2.go @@ -299,133 +299,6 @@ func (h *apiHandlers) PostCompose(ctx echo.Context) error { } } - var irTarget *target.Target - /* oneOf is not supported by the openapi generator so marshal and unmarshal the uploadrequest based on the type */ - switch ir.ImageType { - case ImageTypesAws: - var awsUploadOptions AWSEC2UploadOptions - jsonUploadOptions, err := json.Marshal(ir.UploadOptions) - if err != nil { - return HTTPError(ErrorJSONMarshallingError) - } - err = json.Unmarshal(jsonUploadOptions, &awsUploadOptions) - if err != nil { - return HTTPError(ErrorJSONUnMarshallingError) - } - - // For service maintenance, images are discovered by the "Name:composer-api-*" - // tag filter. Currently all image names in the service are generated, so they're - // guaranteed to be unique as well. If users are ever allowed to name their images, - // an extra tag should be added. - key := fmt.Sprintf("composer-api-%s", uuid.New().String()) - t := target.NewAWSTarget(&target.AWSTargetOptions{ - Filename: imageType.Filename(), - Region: awsUploadOptions.Region, - Bucket: h.server.awsBucket, - Key: key, - ShareWithAccounts: awsUploadOptions.ShareWithAccounts, - }) - if awsUploadOptions.SnapshotName != nil { - t.ImageName = *awsUploadOptions.SnapshotName - } else { - t.ImageName = key - } - - irTarget = t - case ImageTypesGuestImage: - fallthrough - case ImageTypesVsphere: - fallthrough - case ImageTypesImageInstaller: - fallthrough - case ImageTypesEdgeInstaller: - fallthrough - case ImageTypesEdgeContainer: - fallthrough - case ImageTypesEdgeCommit: - var awsS3UploadOptions AWSS3UploadOptions - jsonUploadOptions, err := json.Marshal(ir.UploadOptions) - if err != nil { - return HTTPError(ErrorJSONMarshallingError) - } - err = json.Unmarshal(jsonUploadOptions, &awsS3UploadOptions) - if err != nil { - return HTTPError(ErrorJSONUnMarshallingError) - } - - key := fmt.Sprintf("composer-api-%s", uuid.New().String()) - t := target.NewAWSS3Target(&target.AWSS3TargetOptions{ - Filename: imageType.Filename(), - Region: awsS3UploadOptions.Region, - Bucket: h.server.awsBucket, - Key: key, - }) - t.ImageName = key - - irTarget = t - case ImageTypesGcp: - var gcpUploadOptions GCPUploadOptions - jsonUploadOptions, err := json.Marshal(ir.UploadOptions) - if err != nil { - return HTTPError(ErrorJSONMarshallingError) - } - err = json.Unmarshal(jsonUploadOptions, &gcpUploadOptions) - if err != nil { - return HTTPError(ErrorJSONUnMarshallingError) - } - - var share []string - if gcpUploadOptions.ShareWithAccounts != nil { - share = *gcpUploadOptions.ShareWithAccounts - } - - object := fmt.Sprintf("composer-api-%s", uuid.New().String()) - t := target.NewGCPTarget(&target.GCPTargetOptions{ - Filename: imageType.Filename(), - Region: gcpUploadOptions.Region, - Os: "", // not exposed in cloudapi for now - Bucket: gcpUploadOptions.Bucket, - Object: object, - ShareWithAccounts: share, - }) - // Import will fail if an image with this name already exists - if gcpUploadOptions.ImageName != nil { - t.ImageName = *gcpUploadOptions.ImageName - } else { - t.ImageName = object - } - - irTarget = t - case ImageTypesAzure: - var azureUploadOptions AzureUploadOptions - jsonUploadOptions, err := json.Marshal(ir.UploadOptions) - if err != nil { - return HTTPError(ErrorJSONMarshallingError) - } - err = json.Unmarshal(jsonUploadOptions, &azureUploadOptions) - if err != nil { - return HTTPError(ErrorJSONUnMarshallingError) - } - t := target.NewAzureImageTarget(&target.AzureImageTargetOptions{ - Filename: imageType.Filename(), - TenantID: azureUploadOptions.TenantId, - Location: azureUploadOptions.Location, - SubscriptionID: azureUploadOptions.SubscriptionId, - ResourceGroup: azureUploadOptions.ResourceGroup, - }) - - if azureUploadOptions.ImageName != nil { - t.ImageName = *azureUploadOptions.ImageName - } else { - // if ImageName wasn't given, generate a random one - t.ImageName = fmt.Sprintf("composer-api-%s", uuid.New().String()) - } - - irTarget = t - default: - return HTTPError(ErrorUnsupportedImageType) - } - manifestJobID, err := h.server.workers.EnqueueManifestJobByID(&worker.ManifestJobByID{}, depsolveJobID) if err != nil { return HTTPErrorWithInternal(ErrorEnqueueingJob, err) @@ -433,6 +306,10 @@ func (h *apiHandlers) PostCompose(ctx echo.Context) error { var id uuid.UUID if request.Koji != nil { + if ir.UploadOptions != nil { + return HTTPError(ErrorJSONUnMarshallingError) + } + kojiDirectory := "osbuild-composer-koji-" + uuid.New().String() initID, err := h.server.workers.EnqueueKojiInit(&worker.KojiInitJob{ @@ -483,6 +360,136 @@ func (h *apiHandlers) PostCompose(ctx echo.Context) error { panic(err) } } else { + var irTarget *target.Target + if ir.UploadOptions == nil { + return HTTPError(ErrorJSONUnMarshallingError) + } + /* oneOf is not supported by the openapi generator so marshal and unmarshal the uploadrequest based on the type */ + switch ir.ImageType { + case ImageTypesAws: + var awsUploadOptions AWSEC2UploadOptions + jsonUploadOptions, err := json.Marshal(*ir.UploadOptions) + if err != nil { + return HTTPError(ErrorJSONMarshallingError) + } + err = json.Unmarshal(jsonUploadOptions, &awsUploadOptions) + if err != nil { + return HTTPError(ErrorJSONUnMarshallingError) + } + + // For service maintenance, images are discovered by the "Name:composer-api-*" + // tag filter. Currently all image names in the service are generated, so they're + // guaranteed to be unique as well. If users are ever allowed to name their images, + // an extra tag should be added. + key := fmt.Sprintf("composer-api-%s", uuid.New().String()) + t := target.NewAWSTarget(&target.AWSTargetOptions{ + Filename: imageType.Filename(), + Region: awsUploadOptions.Region, + Bucket: h.server.awsBucket, + Key: key, + ShareWithAccounts: awsUploadOptions.ShareWithAccounts, + }) + if awsUploadOptions.SnapshotName != nil { + t.ImageName = *awsUploadOptions.SnapshotName + } else { + t.ImageName = key + } + + irTarget = t + case ImageTypesGuestImage: + fallthrough + case ImageTypesVsphere: + fallthrough + case ImageTypesImageInstaller: + fallthrough + case ImageTypesEdgeInstaller: + fallthrough + case ImageTypesEdgeContainer: + fallthrough + case ImageTypesEdgeCommit: + var awsS3UploadOptions AWSS3UploadOptions + jsonUploadOptions, err := json.Marshal(*ir.UploadOptions) + if err != nil { + return HTTPError(ErrorJSONMarshallingError) + } + err = json.Unmarshal(jsonUploadOptions, &awsS3UploadOptions) + if err != nil { + return HTTPError(ErrorJSONUnMarshallingError) + } + + key := fmt.Sprintf("composer-api-%s", uuid.New().String()) + t := target.NewAWSS3Target(&target.AWSS3TargetOptions{ + Filename: imageType.Filename(), + Region: awsS3UploadOptions.Region, + Bucket: h.server.awsBucket, + Key: key, + }) + t.ImageName = key + + irTarget = t + case ImageTypesGcp: + var gcpUploadOptions GCPUploadOptions + jsonUploadOptions, err := json.Marshal(*ir.UploadOptions) + if err != nil { + return HTTPError(ErrorJSONMarshallingError) + } + err = json.Unmarshal(jsonUploadOptions, &gcpUploadOptions) + if err != nil { + return HTTPError(ErrorJSONUnMarshallingError) + } + + var share []string + if gcpUploadOptions.ShareWithAccounts != nil { + share = *gcpUploadOptions.ShareWithAccounts + } + + object := fmt.Sprintf("composer-api-%s", uuid.New().String()) + t := target.NewGCPTarget(&target.GCPTargetOptions{ + Filename: imageType.Filename(), + Region: gcpUploadOptions.Region, + Os: "", // not exposed in cloudapi for now + Bucket: gcpUploadOptions.Bucket, + Object: object, + ShareWithAccounts: share, + }) + // Import will fail if an image with this name already exists + if gcpUploadOptions.ImageName != nil { + t.ImageName = *gcpUploadOptions.ImageName + } else { + t.ImageName = object + } + + irTarget = t + case ImageTypesAzure: + var azureUploadOptions AzureUploadOptions + jsonUploadOptions, err := json.Marshal(*ir.UploadOptions) + if err != nil { + return HTTPError(ErrorJSONMarshallingError) + } + err = json.Unmarshal(jsonUploadOptions, &azureUploadOptions) + if err != nil { + return HTTPError(ErrorJSONUnMarshallingError) + } + t := target.NewAzureImageTarget(&target.AzureImageTargetOptions{ + Filename: imageType.Filename(), + TenantID: azureUploadOptions.TenantId, + Location: azureUploadOptions.Location, + SubscriptionID: azureUploadOptions.SubscriptionId, + ResourceGroup: azureUploadOptions.ResourceGroup, + }) + + if azureUploadOptions.ImageName != nil { + t.ImageName = *azureUploadOptions.ImageName + } else { + // if ImageName wasn't given, generate a random one + t.ImageName = fmt.Sprintf("composer-api-%s", uuid.New().String()) + } + + irTarget = t + default: + return HTTPError(ErrorUnsupportedImageType) + } + id, err = h.server.workers.EnqueueOSBuildAsDependency(arch.Name(), &worker.OSBuildJob{ Targets: []*target.Target{irTarget}, Exports: imageType.Exports(), diff --git a/internal/cloudapi/v2/v2_test.go b/internal/cloudapi/v2/v2_test.go index eb2f731c5..74c869025 100644 --- a/internal/cloudapi/v2/v2_test.go +++ b/internal/cloudapi/v2/v2_test.go @@ -248,6 +248,29 @@ func TestCompose(t *testing.T) { "href": "/api/image-builder-composer/v2/compose", "kind": "ComposeId" }`, "id") + test.TestRoute(t, srv.Handler("/api/image-builder-composer/v2"), false, "POST", "/api/image-builder-composer/v2/compose", fmt.Sprintf(` + { + "distribution": "%s", + "koji":{ + "name": "name", + "version": "version", + "release": "release", + "server": "https://koji.example.com", + "task_id": 42 + }, + "image_request":{ + "architecture": "%s", + "image_type": "aws", + "repositories": [{ + "baseurl": "somerepo.org", + "rhsm": false + }] + } + }`, test_distro.TestDistroName, test_distro.TestArch3Name), http.StatusCreated, ` + { + "href": "/api/image-builder-composer/v2/compose", + "kind": "ComposeId" + }`, "id") } func TestComposeStatusSuccess(t *testing.T) {