diff --git a/internal/v1/api.go b/internal/v1/api.go index 04b68bb07..0303d1693 100644 --- a/internal/v1/api.go +++ b/internal/v1/api.go @@ -227,6 +227,23 @@ type BlueprintItem struct { Version int `json:"version"` } +// BlueprintResponse defines model for BlueprintResponse. +type BlueprintResponse struct { + Customizations Customizations `json:"customizations"` + Description string `json:"description"` + + // Distribution List of all distributions that image builder supports. A user might not have access to + // restricted distributions. + // + // Restricted distributions include the RHEL nightlies and the Fedora distributions. + Distribution Distributions `json:"distribution"` + Id openapi_types.UUID `json:"id"` + + // ImageRequests Array of image requests. Having more image requests in a single blueprint is currently not supported. + ImageRequests []ImageRequest `json:"image_requests"` + Name string `json:"name"` +} + // BlueprintsResponse defines model for BlueprintsResponse. type BlueprintsResponse struct { Data []BlueprintItem `json:"data"` @@ -1695,6 +1712,9 @@ type ServerInterface interface { // create blueprint // (POST /experimental/blueprints) CreateBlueprint(ctx echo.Context) error + // get detail of a blueprint + // (GET /experimental/blueprints/{id}) + GetBlueprint(ctx echo.Context, id openapi_types.UUID) error // update blueprint // (PUT /experimental/blueprints/{id}) UpdateBlueprint(ctx echo.Context, id openapi_types.UUID) error @@ -1948,6 +1968,22 @@ func (w *ServerInterfaceWrapper) CreateBlueprint(ctx echo.Context) error { return err } +// GetBlueprint converts echo context to params. +func (w *ServerInterfaceWrapper) GetBlueprint(ctx echo.Context) error { + var err error + // ------------- Path parameter "id" ------------- + var id openapi_types.UUID + + err = runtime.BindStyledParameterWithLocation("simple", false, "id", runtime.ParamLocationPath, ctx.Param("id"), &id) + if err != nil { + return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter id: %s", err)) + } + + // Invoke the callback with all the unmarshalled arguments + err = w.Handler.GetBlueprint(ctx, id) + return err +} + // UpdateBlueprint converts echo context to params. func (w *ServerInterfaceWrapper) UpdateBlueprint(ctx echo.Context) error { var err error @@ -2179,6 +2215,7 @@ func RegisterHandlersWithBaseURL(router EchoRouter, si ServerInterface, baseURL router.GET(baseURL+"/distributions", wrapper.GetDistributions) router.GET(baseURL+"/experimental/blueprints", wrapper.GetBlueprints) router.POST(baseURL+"/experimental/blueprints", wrapper.CreateBlueprint) + router.GET(baseURL+"/experimental/blueprints/:id", wrapper.GetBlueprint) router.PUT(baseURL+"/experimental/blueprints/:id", wrapper.UpdateBlueprint) router.POST(baseURL+"/experimental/blueprints/:id/compose", wrapper.ComposeBlueprint) router.GET(baseURL+"/experimental/blueprints/:id/composes", wrapper.GetBlueprintComposes) @@ -2194,164 +2231,165 @@ 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/v1/api.yaml b/internal/v1/api.yaml index d63176ed3..c88f88cd5 100644 --- a/internal/v1/api.yaml +++ b/internal/v1/api.yaml @@ -483,16 +483,16 @@ paths: schema: $ref: '#/components/schemas/HTTPErrorList' /experimental/blueprints/{id}: + parameters: + - in: path + name: id + schema: + type: string + format: uuid + example: '123e4567-e89b-12d3-a456-426655440000' + required: true + description: UUID of a blueprint put: - parameters: - - in: path - name: id - schema: - type: string - format: uuid - example: '123e4567-e89b-12d3-a456-426655440000' - required: true - description: UUID of a blueprint summary: update blueprint description: "update blueprint" operationId: updateBlueprint @@ -518,6 +518,25 @@ paths: application/json: schema: $ref: '#/components/schemas/HTTPErrorList' + get: + summary: get detail of a blueprint + description: "get a blueprint detail" + operationId: getBlueprint + tags: + - blueprint + responses: + '200': + description: detail of a blueprint + content: + application/json: + schema: + $ref: '#/components/schemas/BlueprintResponse' + '404': + description: blueprint was not found + content: + application/json: + schema: + $ref: '#/components/schemas/HTTPErrorList' /experimental/blueprints/{id}/compose: post: parameters: @@ -901,7 +920,35 @@ components: description: type: string last_modified_at: - type: string + type: string + BlueprintResponse: + required: + - id + - name + - description + - distribution + - image_requests + - customizations + properties: + id: + type: string + format: uuid + name: + type: string + description: + type: string + distribution: + $ref: '#/components/schemas/Distributions' + image_requests: + type: array + minItems: 1 + items: + $ref: '#/components/schemas/ImageRequest' + uniqueItems: true + description: | + Array of image requests. Having more image requests in a single blueprint is currently not supported. + customizations: + $ref: '#/components/schemas/Customizations' Distributions: type: string description: | diff --git a/internal/v1/handler_blueprints.go b/internal/v1/handler_blueprints.go index 84522ccc1..795deaf60 100644 --- a/internal/v1/handler_blueprints.go +++ b/internal/v1/handler_blueprints.go @@ -71,6 +71,33 @@ func (h *Handlers) CreateBlueprint(ctx echo.Context) error { }) } +func (h *Handlers) GetBlueprint(ctx echo.Context, id openapi_types.UUID) error { + userID, err := h.server.getIdentity(ctx) + if err != nil { + return err + } + + blueprintEntry, err := h.server.db.GetBlueprint(id, userID.OrgID(), userID.AccountNumber()) + if err != nil { + return err + } + blueprint, err := BlueprintFromEntry(blueprintEntry) + if err != nil { + return err + } + + blueprintResponse := BlueprintResponse{ + Id: id, + Name: blueprintEntry.Name, + Description: blueprintEntry.Description, + ImageRequests: blueprint.ImageRequests, + Distribution: blueprint.Distribution, + Customizations: blueprint.Customizations, + } + + return ctx.JSON(http.StatusOK, blueprintResponse) +} + func (h *Handlers) UpdateBlueprint(ctx echo.Context, blueprintId uuid.UUID) error { userID, err := h.server.getIdentity(ctx) if err != nil { diff --git a/internal/v1/handler_blueprints_test.go b/internal/v1/handler_blueprints_test.go index 98f327615..7ca20637a 100644 --- a/internal/v1/handler_blueprints_test.go +++ b/internal/v1/handler_blueprints_test.go @@ -167,3 +167,73 @@ func TestHandlers_GetBlueprintComposes(t *testing.T) { require.Equal(t, 2, len(result.Data)) require.Equal(t, 2, result.Meta.Count) } + +func TestHandlers_GetBlueprint(t *testing.T) { + dbase, err := dbc.NewDB() + require.NoError(t, err) + + db_srv, tokenSrv := startServer(t, "", "", &ServerConfig{ + DBase: dbase, + DistributionsDir: "../../distributions", + }) + defer func() { + err := db_srv.Shutdown(context.Background()) + require.NoError(t, err) + }() + defer tokenSrv.Close() + + id := uuid.New() + versionId := uuid.New() + + uploadOptions := UploadRequest_Options{} + err = uploadOptions.FromAWSUploadRequestOptions(AWSUploadRequestOptions{ + ShareWithAccounts: common.ToPtr([]string{"test-account"}), + }) + require.NoError(t, err) + name := "blueprint" + description := "desc" + blueprint := BlueprintBody{ + Customizations: Customizations{ + Packages: common.ToPtr([]string{"nginx"}), + }, + Distribution: "centos-8", + ImageRequests: []ImageRequest{ + { + Architecture: ImageRequestArchitectureX8664, + ImageType: ImageTypesAws, + UploadRequest: UploadRequest{ + Type: UploadTypesAws, + Options: uploadOptions, + }, + }, + { + Architecture: ImageRequestArchitectureAarch64, + ImageType: ImageTypesAws, + UploadRequest: UploadRequest{ + Type: UploadTypesAws, + Options: uploadOptions, + }, + }, + }, + } + + var message []byte + message, err = json.Marshal(blueprint) + require.NoError(t, err) + err = dbase.InsertBlueprint(id, versionId, "000000", "000000", name, description, message) + require.NoError(t, err) + + respStatusCode, body := tutils.GetResponseBody(t, fmt.Sprintf("http://localhost:8086/api/image-builder/v1/experimental/blueprints/%s", id.String()), &tutils.AuthString0) + require.Equal(t, http.StatusOK, respStatusCode) + + var result BlueprintResponse + require.Equal(t, 200, respStatusCode) + err = json.Unmarshal([]byte(body), &result) + require.NoError(t, err) + require.Equal(t, id, result.Id) + require.Equal(t, description, result.Description) + require.Equal(t, name, result.Name) + require.Equal(t, blueprint.ImageRequests, result.ImageRequests) + require.Equal(t, blueprint.Distribution, result.Distribution) + require.Equal(t, blueprint.Customizations, result.Customizations) +}