diff --git a/charts/identity/Chart.yaml b/charts/identity/Chart.yaml index 844097e7..c164a15d 100644 --- a/charts/identity/Chart.yaml +++ b/charts/identity/Chart.yaml @@ -4,8 +4,8 @@ description: A Helm chart for deploying Unikorn's IdP type: application -version: v0.2.27 -appVersion: v0.2.27 +version: v0.2.28 +appVersion: v0.2.28 icon: https://raw.githubusercontent.com/unikorn-cloud/assets/main/images/logos/dark-on-light/icon.png diff --git a/go.mod b/go.mod index 14b34875..948677d2 100644 --- a/go.mod +++ b/go.mod @@ -11,7 +11,7 @@ require ( github.com/oapi-codegen/runtime v1.1.1 github.com/spf13/pflag v1.0.5 github.com/stretchr/testify v1.9.0 - github.com/unikorn-cloud/core v0.1.61 + github.com/unikorn-cloud/core v0.1.62 go.opentelemetry.io/otel v1.28.0 go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.28.0 go.opentelemetry.io/otel/sdk v1.28.0 diff --git a/go.sum b/go.sum index 86dbc6e6..d45479be 100644 --- a/go.sum +++ b/go.sum @@ -127,8 +127,8 @@ github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsT github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/ugorji/go/codec v1.2.12 h1:9LC83zGrHhuUA9l16C9AHXAqEV/2wBQ4nkvumAE65EE= github.com/ugorji/go/codec v1.2.12/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= -github.com/unikorn-cloud/core v0.1.61 h1:mnQ+43wKTsXYHRztiC0ddUS+ZZ2OaIdy5JYjDlaRpg4= -github.com/unikorn-cloud/core v0.1.61/go.mod h1:Cd0zU1LrKo+OwnnCwuTQ+QL3yibnkjDHtkujfDM4AdE= +github.com/unikorn-cloud/core v0.1.62 h1:EbXZxQxBIYjWC/LVLw8xAd46609u5GLc2DxnrZnLYxE= +github.com/unikorn-cloud/core v0.1.62/go.mod h1:Cd0zU1LrKo+OwnnCwuTQ+QL3yibnkjDHtkujfDM4AdE= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= diff --git a/pkg/handler/groups/client.go b/pkg/handler/groups/client.go index 6a4e93c4..2ac8f3f7 100644 --- a/pkg/handler/groups/client.go +++ b/pkg/handler/groups/client.go @@ -156,26 +156,22 @@ func (c *Client) generate(ctx context.Context, organization *organizations.Meta, return out, nil } -func (c *Client) Create(ctx context.Context, organizationID string, request *openapi.GroupWrite) error { +func (c *Client) Create(ctx context.Context, organizationID string, request *openapi.GroupWrite) (*openapi.GroupRead, error) { organization, err := organizations.New(c.client, c.namespace).GetMetadata(ctx, organizationID) if err != nil { - return err + return nil, err } resource, err := c.generate(ctx, organization, request) if err != nil { - return err + return nil, err } if err := c.client.Create(ctx, resource); err != nil { - if kerrors.IsAlreadyExists(err) { - return errors.HTTPConflict() - } - - return errors.OAuth2ServerError("failed to create group").WithError(err) + return nil, errors.OAuth2ServerError("failed to create group").WithError(err) } - return nil + return convert(resource), nil } func (c *Client) Update(ctx context.Context, organizationID, groupID string, request *openapi.GroupWrite) error { diff --git a/pkg/handler/handler.go b/pkg/handler/handler.go index 64e5f3be..544bbbac 100644 --- a/pkg/handler/handler.go +++ b/pkg/handler/handler.go @@ -226,13 +226,14 @@ func (h *Handler) PostApiV1OrganizationsOrganizationIDOauth2providers(w http.Res return } - if err := oauth2providers.New(h.client, h.namespace).Create(r.Context(), organizationID, request); err != nil { + result, err := oauth2providers.New(h.client, h.namespace).Create(r.Context(), organizationID, request) + if err != nil { errors.HandleError(w, r, err) return } h.setUncacheable(w) - w.WriteHeader(http.StatusCreated) + util.WriteJSONResponse(w, r, http.StatusCreated, result) } func (h *Handler) PutApiV1OrganizationsOrganizationIDOauth2providersProviderID(w http.ResponseWriter, r *http.Request, organizationID openapi.OrganizationIDParameter, providerID openapi.Oauth2ProvderIDParameter) { @@ -366,13 +367,14 @@ func (h *Handler) PostApiV1OrganizationsOrganizationIDGroups(w http.ResponseWrit return } - if err := groups.New(h.client, h.namespace).Create(r.Context(), organizationID, request); err != nil { + result, err := groups.New(h.client, h.namespace).Create(r.Context(), organizationID, request) + if err != nil { errors.HandleError(w, r, err) return } h.setUncacheable(w) - w.WriteHeader(http.StatusCreated) + util.WriteJSONResponse(w, r, http.StatusCreated, result) } func (h *Handler) GetApiV1OrganizationsOrganizationIDGroupsGroupid(w http.ResponseWriter, r *http.Request, organizationID openapi.OrganizationIDParameter, groupID openapi.GroupidParameter) { @@ -457,13 +459,14 @@ func (h *Handler) PostApiV1OrganizationsOrganizationIDProjects(w http.ResponseWr return } - if err := projects.New(h.client, h.namespace).Create(r.Context(), organizationID, request); err != nil { + result, err := projects.New(h.client, h.namespace).Create(r.Context(), organizationID, request) + if err != nil { errors.HandleError(w, r, err) return } h.setUncacheable(w) - w.WriteHeader(http.StatusAccepted) + util.WriteJSONResponse(w, r, http.StatusAccepted, result) } func (h *Handler) GetApiV1OrganizationsOrganizationIDProjectsProjectID(w http.ResponseWriter, r *http.Request, organizationID openapi.OrganizationIDParameter, projectID openapi.ProjectIDParameter) { diff --git a/pkg/handler/oauth2providers/client.go b/pkg/handler/oauth2providers/client.go index 6e1f2507..8cd343c7 100644 --- a/pkg/handler/oauth2providers/client.go +++ b/pkg/handler/oauth2providers/client.go @@ -139,23 +139,19 @@ func (c *Client) generate(ctx context.Context, organization *organizations.Meta, return out } -func (c *Client) Create(ctx context.Context, organizationID string, request *openapi.Oauth2ProviderWrite) error { +func (c *Client) Create(ctx context.Context, organizationID string, request *openapi.Oauth2ProviderWrite) (*openapi.Oauth2ProviderRead, error) { organization, err := organizations.New(c.client, c.namespace).GetMetadata(ctx, organizationID) if err != nil { - return err + return nil, err } resource := c.generate(ctx, organization, request) if err := c.client.Create(ctx, resource); err != nil { - if kerrors.IsAlreadyExists(err) { - return errors.HTTPConflict() - } - - return errors.OAuth2ServerError("failed to create oauth2 provider").WithError(err) + return nil, errors.OAuth2ServerError("failed to create oauth2 provider").WithError(err) } - return nil + return convert(resource), nil } func (c *Client) Update(ctx context.Context, organizationID, providerID string, request *openapi.Oauth2ProviderWrite) error { diff --git a/pkg/handler/projects/client.go b/pkg/handler/projects/client.go index eb07a138..4df91966 100644 --- a/pkg/handler/projects/client.go +++ b/pkg/handler/projects/client.go @@ -152,27 +152,22 @@ func (c *Client) generate(ctx context.Context, organization *organizations.Meta, } // Create creates the implicit project indentified by the JTW claims. -func (c *Client) Create(ctx context.Context, organizationID string, request *openapi.ProjectWrite) error { +func (c *Client) Create(ctx context.Context, organizationID string, request *openapi.ProjectWrite) (*openapi.ProjectRead, error) { organization, err := organizations.New(c.client, c.namespace).GetMetadata(ctx, organizationID) if err != nil { - return err + return nil, err } resource, err := c.generate(ctx, organization, request) if err != nil { - return err + return nil, err } if err := c.client.Create(ctx, resource); err != nil { - // TODO: we can do a cached lookup to save the API traffic. - if kerrors.IsAlreadyExists(err) { - return errors.HTTPConflict() - } - - return errors.OAuth2ServerError("failed to create project").WithError(err) + return nil, errors.OAuth2ServerError("failed to create project").WithError(err) } - return nil + return convert(resource), nil } func (c *Client) Update(ctx context.Context, organizationID, projectID string, request *openapi.ProjectWrite) error { diff --git a/pkg/openapi/client.go b/pkg/openapi/client.go index b81f68ee..6c1833cf 100644 --- a/pkg/openapi/client.go +++ b/pkg/openapi/client.go @@ -2042,6 +2042,7 @@ func (r GetApiV1OrganizationsOrganizationIDGroupsResponse) StatusCode() int { type PostApiV1OrganizationsOrganizationIDGroupsResponse struct { Body []byte HTTPResponse *http.Response + JSON201 *GroupResponse JSON401 *externalRef0.UnauthorizedResponse JSON403 *externalRef0.ForbiddenResponse JSON409 *externalRef0.ConflictResponse @@ -2168,6 +2169,7 @@ func (r GetApiV1OrganizationsOrganizationIDOauth2providersResponse) StatusCode() type PostApiV1OrganizationsOrganizationIDOauth2providersResponse struct { Body []byte HTTPResponse *http.Response + JSON201 *Oauth2ProviderResponse JSON401 *externalRef0.UnauthorizedResponse JSON403 *externalRef0.ForbiddenResponse JSON409 *externalRef0.ConflictResponse @@ -2268,6 +2270,7 @@ func (r GetApiV1OrganizationsOrganizationIDProjectsResponse) StatusCode() int { type PostApiV1OrganizationsOrganizationIDProjectsResponse struct { Body []byte HTTPResponse *http.Response + JSON202 *ProjectResponse JSON400 *externalRef0.BadRequestResponse JSON401 *externalRef0.UnauthorizedResponse JSON403 *externalRef0.ForbiddenResponse @@ -3202,6 +3205,13 @@ func ParsePostApiV1OrganizationsOrganizationIDGroupsResponse(rsp *http.Response) } switch { + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 201: + var dest GroupResponse + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSON201 = &dest + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 401: var dest externalRef0.UnauthorizedResponse if err := json.Unmarshal(bodyBytes, &dest); err != nil { @@ -3444,6 +3454,13 @@ func ParsePostApiV1OrganizationsOrganizationIDOauth2providersResponse(rsp *http. } switch { + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 201: + var dest Oauth2ProviderResponse + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSON201 = &dest + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 401: var dest externalRef0.UnauthorizedResponse if err := json.Unmarshal(bodyBytes, &dest); err != nil { @@ -3632,6 +3649,13 @@ func ParsePostApiV1OrganizationsOrganizationIDProjectsResponse(rsp *http.Respons } switch { + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 202: + var dest ProjectResponse + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSON202 = &dest + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 400: var dest externalRef0.BadRequestResponse if err := json.Unmarshal(bodyBytes, &dest); err != nil { diff --git a/pkg/openapi/schema.go b/pkg/openapi/schema.go index 693d5fcf..3eb6d96f 100644 --- a/pkg/openapi/schema.go +++ b/pkg/openapi/schema.go @@ -19,204 +19,205 @@ import ( // Base64 encoded, gzipped, json marshaled Swagger object var swaggerSpec = []string{ - "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", + "SNfCxELRAAA=", } // 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 662a53ae..4d7a2474 100644 --- a/pkg/openapi/server.spec.yaml +++ b/pkg/openapi/server.spec.yaml @@ -264,7 +264,7 @@ paths: $ref: '#/components/requestBodies/oauth2ProviderRequest' responses: '201': - description: Organizational identity provider created. + $ref: '#/components/responses/oauth2ProviderResponse' '401': $ref: 'https://raw.githubusercontent.com/unikorn-cloud/core/main/pkg/openapi/common.spec.yaml#/components/responses/unauthorizedResponse' '403': @@ -368,7 +368,7 @@ paths: $ref: '#/components/requestBodies/createGroupRequest' responses: '201': - description: Group successfully created and returned. + $ref: '#/components/responses/groupResponse' '401': $ref: 'https://raw.githubusercontent.com/unikorn-cloud/core/main/pkg/openapi/common.spec.yaml#/components/responses/unauthorizedResponse' '403': @@ -465,7 +465,7 @@ paths: $ref: '#/components/requestBodies/createProjectRequest' responses: '202': - $ref: 'https://raw.githubusercontent.com/unikorn-cloud/core/main/pkg/openapi/common.spec.yaml#/components/responses/acceptedResponse' + $ref: '#/components/responses/projectResponse' '400': $ref: 'https://raw.githubusercontent.com/unikorn-cloud/core/main/pkg/openapi/common.spec.yaml#/components/responses/badRequestResponse' '401': @@ -1327,6 +1327,23 @@ components: spec: issuer: https://accounts.google.com clientID: 111069338664-poc0c81dgsfudr0rbupj0unurjcvt12e.apps.googleusercontent.com + oauth2ProviderResponse: + description: |- + An oauth2 provider. + content: + application/json: + schema: + $ref: '#/components/schemas/oauth2ProviderRead' + example: + metadata: + id: a142f641-7fd6-4ab9-a875-344c7ebadc53 + name: google-identity + organizationId: d4600d6e-e965-4b44-a808-84fb2fa36702 + creationTime: 2024-05-31T14:11:00Z + provisioningStatus: provisioned + spec: + issuer: https://accounts.google.com + clientID: 111069338664-poc0c81dgsfudr0rbupj0unurjcvt12e.apps.googleusercontent.com oauth2ProvidersResponse: description: |- A list of oauth2 providers. diff --git a/pkg/openapi/types.go b/pkg/openapi/types.go index 6dc0f0e4..15230fda 100644 --- a/pkg/openapi/types.go +++ b/pkg/openapi/types.go @@ -504,6 +504,9 @@ type GroupsResponse = Groups // committee. Consult the relevant documentation for further details. type JwksResponse = JsonWebKeySet +// Oauth2ProviderResponse An OAuth2 provider when read. +type Oauth2ProviderResponse = Oauth2ProviderRead + // Oauth2ProvidersResponse A list of oauth2 providers. type Oauth2ProvidersResponse = Oauth2Providers