diff --git a/charts/identity/Chart.yaml b/charts/identity/Chart.yaml index efd5429..4237898 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.53-rc6 -appVersion: v0.2.53-rc6 +version: v0.2.53-rc7 +appVersion: v0.2.53-rc7 icon: https://raw.githubusercontent.com/unikorn-cloud/assets/main/images/logos/dark-on-light/icon.png diff --git a/pkg/handler/groups/client.go b/pkg/handler/groups/client.go index c317d0c..eaec346 100644 --- a/pkg/handler/groups/client.go +++ b/pkg/handler/groups/client.go @@ -53,16 +53,22 @@ func convert(in *unikornv1.Group) *openapi.GroupRead { out := &openapi.GroupRead{ Metadata: conversion.OrganizationScopedResourceReadMetadata(in, in.Spec.Tags, coreopenapi.ResourceProvisioningStatusProvisioned), Spec: openapi.GroupSpec{ - RoleIDs: in.Spec.RoleIDs, + RoleIDs: openapi.StringList{}, + UserIDs: openapi.StringList{}, + ServiceAccountIDs: openapi.StringList{}, }, } - if len(in.Spec.UserIDs) > 0 { - out.Spec.UserIDs = &in.Spec.UserIDs + if in.Spec.RoleIDs != nil { + out.Spec.RoleIDs = in.Spec.RoleIDs } - if len(in.Spec.ServiceAccountIDs) > 0 { - out.Spec.ServiceAccountIDs = &in.Spec.ServiceAccountIDs + if in.Spec.UserIDs != nil { + out.Spec.UserIDs = in.Spec.UserIDs + } + + if in.Spec.ServiceAccountIDs != nil { + out.Spec.ServiceAccountIDs = in.Spec.ServiceAccountIDs } return out @@ -156,19 +162,13 @@ func (c *Client) generate(ctx context.Context, organization *organizations.Meta, out := &unikornv1.Group{ ObjectMeta: conversion.NewObjectMetadata(&in.Metadata, organization.Namespace, info.Userinfo.Sub).WithOrganization(organization.ID).Get(), Spec: unikornv1.GroupSpec{ - Tags: conversion.GenerateTagList(in.Metadata.Tags), - RoleIDs: in.Spec.RoleIDs, + Tags: conversion.GenerateTagList(in.Metadata.Tags), + RoleIDs: in.Spec.RoleIDs, + UserIDs: in.Spec.UserIDs, + ServiceAccountIDs: in.Spec.ServiceAccountIDs, }, } - if in.Spec.UserIDs != nil { - out.Spec.UserIDs = *in.Spec.UserIDs - } - - if in.Spec.ServiceAccountIDs != nil { - out.Spec.ServiceAccountIDs = *in.Spec.ServiceAccountIDs - } - return out, nil } diff --git a/pkg/handler/projects/client.go b/pkg/handler/projects/client.go index fbefa3a..fd3020d 100644 --- a/pkg/handler/projects/client.go +++ b/pkg/handler/projects/client.go @@ -62,10 +62,13 @@ func convert(in *unikornv1.Project) *openapi.ProjectRead { out := &openapi.ProjectRead{ Metadata: conversion.OrganizationScopedResourceReadMetadata(in, in.Spec.Tags, provisioningStatus), + Spec: openapi.ProjectSpec{ + GroupIDs: openapi.GroupIDs{}, + }, } if in.Spec.GroupIDs != nil { - out.Spec.GroupIDs = &in.Spec.GroupIDs + out.Spec.GroupIDs = in.Spec.GroupIDs } return out @@ -136,24 +139,22 @@ func (c *Client) generate(ctx context.Context, organization *organizations.Meta, out := &unikornv1.Project{ ObjectMeta: conversion.NewObjectMetadata(&in.Metadata, organization.Namespace, info.Userinfo.Sub).WithOrganization(organization.ID).Get(), + Spec: unikornv1.ProjectSpec{ + Tags: conversion.GenerateTagList(in.Metadata.Tags), + GroupIDs: in.Spec.GroupIDs, + }, } - out.Spec.Tags = conversion.GenerateTagList(in.Metadata.Tags) - - if in.Spec.GroupIDs != nil { - for _, groupID := range *in.Spec.GroupIDs { - var resource unikornv1.Group + for _, groupID := range in.Spec.GroupIDs { + var resource unikornv1.Group - if err := c.client.Get(ctx, client.ObjectKey{Namespace: organization.Namespace, Name: groupID}, &resource); err != nil { - if kerrors.IsNotFound(err) { - return nil, errors.OAuth2InvalidRequest(fmt.Sprintf("group ID %s does not exist", groupID)).WithError(err) - } - - return nil, errors.OAuth2ServerError("failed to validate group ID").WithError(err) + if err := c.client.Get(ctx, client.ObjectKey{Namespace: organization.Namespace, Name: groupID}, &resource); err != nil { + if kerrors.IsNotFound(err) { + return nil, errors.OAuth2InvalidRequest(fmt.Sprintf("group ID %s does not exist", groupID)).WithError(err) } - } - out.Spec.GroupIDs = *in.Spec.GroupIDs + return nil, errors.OAuth2ServerError("failed to validate group ID").WithError(err) + } } return out, nil diff --git a/pkg/handler/serviceaccounts/client.go b/pkg/handler/serviceaccounts/client.go index 84651ce..96f81ec 100644 --- a/pkg/handler/serviceaccounts/client.go +++ b/pkg/handler/serviceaccounts/client.go @@ -78,31 +78,18 @@ func New(client client.Client, namespace, host string, oauth2 *oauth2.Authentica func convert(in *unikornv1.ServiceAccount, groups *unikornv1.GroupList) *openapi.ServiceAccountRead { out := &openapi.ServiceAccountRead{ Metadata: conversion.OrganizationScopedResourceReadMetadata(in, in.Spec.Tags, coreopenapi.ResourceProvisioningStatusProvisioned), + Spec: openapi.ServiceAccountSpec{ + GroupIDs: make(openapi.GroupIDs, 0, len(groups.Items)), + }, Status: openapi.ServiceAccountStatus{ Expiry: in.Spec.Expiry.Time, }, } - // NOTE: Deep copy as this may be reused and DeleteFunc will modify the underlying - // slice's array. - memberGroups := groups.DeepCopy() - - memberGroups.Items = slices.DeleteFunc(memberGroups.Items, func(group unikornv1.Group) bool { - return !slices.Contains(group.Spec.ServiceAccountIDs, in.Name) - }) - - var memberGroupIDs openapi.GroupIDs - - for _, group := range memberGroups.Items { - memberGroupIDs = append(memberGroupIDs, group.Name) - } - - if len(memberGroupIDs) > 0 { - if out.Spec == nil { - out.Spec = &openapi.ServiceAccountSpec{} + for _, group := range groups.Items { + if slices.Contains(group.Spec.ServiceAccountIDs, in.Name) { + out.Spec.GroupIDs = append(out.Spec.GroupIDs, group.Name) } - - out.Spec.GroupIDs = &memberGroupIDs } return out @@ -227,13 +214,13 @@ func (c *Client) listGroups(ctx context.Context, organization *organizations.Met // updateGroups takes a user name and a requested list of groups and adds to // the groups it should be a member of and removes itself from groups it shouldn't. -func (c *Client) updateGroups(ctx context.Context, serviceAccountID string, groupIDs *openapi.GroupIDs, groups *unikornv1.GroupList) error { +func (c *Client) updateGroups(ctx context.Context, serviceAccountID string, groupIDs openapi.GroupIDs, groups *unikornv1.GroupList) error { for i := range groups.Items { current := &groups.Items[i] updated := current.DeepCopy() - if groupIDs != nil && slices.Contains(*groupIDs, current.Name) { + if slices.Contains(groupIDs, current.Name) { // Add to a group where it should be a member but isn't. if slices.Contains(current.Spec.ServiceAccountIDs, serviceAccountID) { continue diff --git a/pkg/handler/users/client.go b/pkg/handler/users/client.go index 4ab0bfe..7e7ddbd 100644 --- a/pkg/handler/users/client.go +++ b/pkg/handler/users/client.go @@ -219,8 +219,9 @@ func convert(in *unikornv1.User, groups *unikornv1.GroupList) *openapi.UserRead out := &openapi.UserRead{ Metadata: conversion.OrganizationScopedResourceReadMetadata(in, in.Spec.Tags, coreopenapi.ResourceProvisioningStatusProvisioned), Spec: openapi.UserSpec{ - Subject: in.Spec.Subject, - State: convertUserState(in.Spec.State), + Subject: in.Spec.Subject, + State: convertUserState(in.Spec.State), + GroupIDs: make(openapi.GroupIDs, 0, len(groups.Items)), }, } diff --git a/pkg/openapi/schema.go b/pkg/openapi/schema.go index fefcd02..099e85f 100644 --- a/pkg/openapi/schema.go +++ b/pkg/openapi/schema.go @@ -19,248 +19,250 @@ import ( // Base64 encoded, gzipped, json marshaled Swagger object var swaggerSpec = []string{ - "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", + "//+EDv6hmk4BAA==", } // 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 fd1271a..d816b56 100644 --- a/pkg/openapi/server.spec.yaml +++ b/pkg/openapi/server.spec.yaml @@ -1439,6 +1439,8 @@ components: description: A group. type: object required: + - userIDs + - serviceAccountIDs - roleIDs properties: userIDs: @@ -1483,6 +1485,8 @@ components: projectSpec: description: A project. type: object + required: + - groupIDs properties: groupIDs: $ref: '#/components/schemas/groupIDs' @@ -1516,6 +1520,8 @@ components: serviceAccountSpec: description: A service account specification. type: object + required: + - groupIDs properties: groupIDs: $ref: '#/components/schemas/groupIDs' @@ -1537,6 +1543,7 @@ components: type: object required: - metadata + - spec - status properties: metadata: @@ -1550,6 +1557,7 @@ components: type: object required: - metadata + - spec - status properties: metadata: @@ -1568,6 +1576,7 @@ components: type: object required: - metadata + - spec properties: metadata: $ref: 'https://raw.githubusercontent.com/unikorn-cloud/core/main/pkg/openapi/common.spec.yaml#/components/schemas/resourceWriteMetadata' @@ -1831,6 +1840,9 @@ components: metadata: name: my-service-account description: A service account for doing stuff. + spec: + groupIDs: + - 0aaba80d-67ef-4799-b6d9-59f37e2ce2ad userCreateRequest: description: Body required to create a user. required: true @@ -1883,7 +1895,7 @@ components: metadata: name: my-project spec: - groups: + groupIDs: - ddde69ef-bb52-4815-9e9e-aed856c6057f updateProjectRequest: description: Project request parameters. @@ -1896,7 +1908,7 @@ components: metadata: name: my-project spec: - groups: + groupIDs: - ddde69ef-bb52-4815-9e9e-aed856c6057f quotasRequest: description: Allows the setting of quotas. @@ -2137,8 +2149,10 @@ components: creationTime: 2024-05-31T14:11:00Z provisioningStatus: provisioned spec: - usersIDs: + userIDs: - d4600d6e-e965-4b44-a808-84fb2fa36702 + serviceAccountIDs: + - a0e9c93a-3a47-4ea1-9caf-22757428a810 roleIDs: - d4600d6e-e965-4b44-a808-84fb2fa36702 groupsResponse: @@ -2158,6 +2172,8 @@ components: spec: userIDs: - d4600d6e-e965-4b44-a808-84fb2fa36702 + serviceAccountIDs: + - a0e9c93a-3a47-4ea1-9caf-22757428a810 roleIDs: - d4600d6e-e965-4b44-a808-84fb2fa36702 projectsResponse: @@ -2174,7 +2190,7 @@ components: creationTime: 2024-05-31T14:11:00Z provisioningStatus: provisioned spec: - groups: + groupIDs: - ef509cd1-c7e6-42f8-aae7-a01164dc60dc projectResponse: description: A project. @@ -2190,7 +2206,7 @@ components: creationTime: 2024-05-31T14:11:00Z provisioningStatus: provisioned spec: - groups: + groupIDs: - ef509cd1-c7e6-42f8-aae7-a01164dc60dc serviceAccountResponse: description: A service accounts. @@ -2205,6 +2221,9 @@ components: organizationId: d4600d6e-e965-4b44-a808-84fb2fa36702 creationTime: 2024-05-31T14:11:00Z provisioningStatus: provisioned + spec: + groupIDs: + - f2000047-19f8-426e-93b9-9f0a5bfa0edd status: expiry: 2025-03-14T16:10:00Z serviceAccountsResponse: @@ -2220,6 +2239,9 @@ components: organizationId: d4600d6e-e965-4b44-a808-84fb2fa36702 creationTime: 2024-05-31T14:11:00Z provisioningStatus: provisioned + spec: + groupIDs: + - f2000047-19f8-426e-93b9-9f0a5bfa0edd status: expiry: 2025-03-14T16:10:00Z serviceAccountCreateResponse: @@ -2235,6 +2257,9 @@ components: organizationId: d4600d6e-e965-4b44-a808-84fb2fa36702 creationTime: 2024-05-31T14:11:00Z provisioningStatus: provisioned + spec: + groupIDs: + - f2000047-19f8-426e-93b9-9f0a5bfa0edd status: expiry: 2025-03-14T16:10:00Z accessToken: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c diff --git a/pkg/openapi/types.go b/pkg/openapi/types.go index d32bd2a..2828780 100644 --- a/pkg/openapi/types.go +++ b/pkg/openapi/types.go @@ -210,10 +210,10 @@ type GroupSpec struct { RoleIDs StringList `json:"roleIDs"` // ServiceAccountIDs A list of strings. - ServiceAccountIDs *StringList `json:"serviceAccountIDs,omitempty"` + ServiceAccountIDs StringList `json:"serviceAccountIDs"` // UserIDs A list of strings. - UserIDs *StringList `json:"userIDs,omitempty"` + UserIDs StringList `json:"userIDs"` } // GroupWrite A group when created or updated. @@ -396,7 +396,7 @@ type ProjectRead struct { // ProjectSpec A project. type ProjectSpec struct { // GroupIDs A list of group IDs. - GroupIDs *GroupIDs `json:"groupIDs,omitempty"` + GroupIDs GroupIDs `json:"groupIDs"` } // ProjectWrite A project when created or updated. @@ -507,7 +507,7 @@ type ServiceAccountCreate struct { Metadata externalRef0.OrganizationScopedResourceReadMetadata `json:"metadata"` // Spec A service account specification. - Spec *ServiceAccountSpec `json:"spec,omitempty"` + Spec ServiceAccountSpec `json:"spec"` // Status A service account status. Status ServiceAccountStatus `json:"status"` @@ -518,7 +518,7 @@ type ServiceAccountRead struct { Metadata externalRef0.OrganizationScopedResourceReadMetadata `json:"metadata"` // Spec A service account specification. - Spec *ServiceAccountSpec `json:"spec,omitempty"` + Spec ServiceAccountSpec `json:"spec"` // Status A service account status. Status ServiceAccountStatus `json:"status"` @@ -527,7 +527,7 @@ type ServiceAccountRead struct { // ServiceAccountSpec A service account specification. type ServiceAccountSpec struct { // GroupIDs A list of group IDs. - GroupIDs *GroupIDs `json:"groupIDs,omitempty"` + GroupIDs GroupIDs `json:"groupIDs"` } // ServiceAccountStatus A service account status. @@ -545,7 +545,7 @@ type ServiceAccountWrite struct { Metadata externalRef0.ResourceWriteMetadata `json:"metadata"` // Spec A service account specification. - Spec *ServiceAccountSpec `json:"spec,omitempty"` + Spec ServiceAccountSpec `json:"spec"` } // ServiceAccounts A list of service accounts.