diff --git a/components/usermgmt/gen/openapi/proto/rpc/v3/group.swagger.json b/components/usermgmt/gen/openapi/proto/rpc/v3/group.swagger.json index 0eb6bb8..cd110d0 100644 --- a/components/usermgmt/gen/openapi/proto/rpc/v3/group.swagger.json +++ b/components/usermgmt/gen/openapi/proto/rpc/v3/group.swagger.json @@ -1133,13 +1133,13 @@ "v3GroupSpec": { "type": "object", "properties": { - "projectroles": { + "projectnamespaceroles": { "type": "array", "items": { - "$ref": "#/definitions/v3ProjectRole" + "$ref": "#/definitions/v3ProjectNamespaceRole" }, - "description": "ProjectRole groups for permission", - "title": "ProjectRoles" + "description": "Project, namespace, role associations for permission", + "title": "ProjectNamespaceRoles" }, "users": { "type": "array", @@ -1241,199 +1241,28 @@ "project" ] }, - "v3Project": { - "type": "object", - "properties": { - "apiVersion": { - "type": "string", - "default": "system.k8smgmt.io/v3", - "description": "API Version of the resource", - "title": "API Version", - "readOnly": true - }, - "kind": { - "type": "string", - "default": "Project", - "description": "Kind of the resource", - "title": "Kind", - "readOnly": true - }, - "metadata": { - "$ref": "#/definitions/v3Metadata", - "description": "Metadata of the resource", - "title": "Metadata" - }, - "spec": { - "$ref": "#/definitions/v3ProjectSpec", - "description": "Spec of the resource", - "title": "Spec" - }, - "status": { - "$ref": "#/definitions/commonv3Status", - "description": "Status of the resource", - "title": "Status", - "readOnly": true - } - }, - "description": "Project", - "title": "Project", - "required": [ - "apiVersion", - "kind", - "metadata", - "spec" - ] - }, - "v3ProjectRole": { + "v3ProjectNamespaceRole": { "type": "object", "properties": { "project": { - "$ref": "#/definitions/v3Project", + "type": "string", "description": "Project", "title": "Project" }, + "namespace": { + "type": "string", + "format": "int64", + "description": "Namespace", + "title": "Namespace" + }, "role": { - "$ref": "#/definitions/v3Role", + "type": "string", "description": "Role", "title": "Role" } }, - "description": "Project and role pairing for permission", - "title": "ProjectRole" - }, - "v3ProjectSpec": { - "type": "object", - "properties": { - "default": { - "type": "boolean", - "description": "flag to indicate if this is the default project in the organization", - "title": "Default" - } - }, - "description": "project specification", - "title": "Project Specification" - }, - "v3Role": { - "type": "object", - "properties": { - "apiVersion": { - "type": "string", - "default": "usermgmt.k8smgmt.io/v3", - "description": "API Version of the Role resource", - "title": "API Version" - }, - "kind": { - "type": "string", - "default": "Role", - "description": "Kind of the role resource", - "title": "Kind" - }, - "metadata": { - "$ref": "#/definitions/v3Metadata", - "description": "Metadata of the role resource", - "title": "Metadata" - }, - "spec": { - "$ref": "#/definitions/v3RoleSpec", - "description": "Spec of the role resource", - "title": "Spec" - }, - "status": { - "$ref": "#/definitions/commonv3Status", - "description": "Status of the resource", - "title": "Status", - "readOnly": true - } - }, - "description": "Role", - "title": "Role", - "required": [ - "apiVersion", - "kind", - "metadata", - "spec" - ] - }, - "v3RolePermission": { - "type": "object", - "properties": { - "apiVersion": { - "type": "string", - "default": "usermgmt.k8smgmt.io/v3", - "description": "API Version of the role permission resource", - "title": "API Version" - }, - "kind": { - "type": "string", - "default": "RolePermission", - "description": "Kind of the role permission resource", - "title": "Kind" - }, - "metadata": { - "$ref": "#/definitions/v3Metadata", - "description": "Metadata of the role permission resource", - "title": "Metadata" - }, - "spec": { - "$ref": "#/definitions/v3RolePermissionSpec", - "description": "Metadata of the role permission resource", - "title": "Metadata" - }, - "status": { - "$ref": "#/definitions/commonv3Status", - "description": "Status of the resource", - "title": "Status", - "readOnly": true - } - }, - "description": "Role Permission", - "title": "RolePermission", - "required": [ - "apiVersion", - "kind", - "metadata", - "spec" - ] - }, - "v3RolePermissionSpec": { - "type": "object", - "properties": { - "permissions": { - "type": "array", - "items": { - "type": "string" - }, - "description": "List of permisions for role", - "title": "Permissions" - } - }, - "description": "RolePermisson specification", - "title": "RolePermission Specification" - }, - "v3RoleSpec": { - "type": "object", - "properties": { - "rolepermissions": { - "type": "array", - "items": { - "$ref": "#/definitions/v3RolePermission" - }, - "description": "Permissions for the role", - "title": "RolePermissions" - }, - "isGlobal": { - "type": "boolean", - "description": "Specify if this is a global role", - "title": "IsGlobal" - }, - "scope": { - "type": "string", - "description": "Scope of the rol", - "title": "Scope" - } - }, - "description": "Role specification", - "title": "Role Specification" + "description": "Project, role and namespace pairing for permission", + "title": "ProjectNamespaceRole" } }, "securityDefinitions": { diff --git a/components/usermgmt/pkg/internal/models/grouprole.go b/components/usermgmt/pkg/internal/models/grouprole.go new file mode 100644 index 0000000..e8fa0a2 --- /dev/null +++ b/components/usermgmt/pkg/internal/models/grouprole.go @@ -0,0 +1,25 @@ +package models + +import ( + "time" + + "github.com/google/uuid" + "github.com/uptrace/bun" +) + +type GroupRole struct { + bun.BaseModel `bun:"table:authsrv_grouprole,alias:grouprole"` + + ID uuid.UUID `bun:"id,type:uuid,pk,default:uuid_generate_v4()"` + Name string `bun:"name,notnull"` + Description string `bun:"description,notnull"` + CreatedAt time.Time `bun:"created_at,notnull,default:current_timestamp"` + ModifiedAt time.Time `bun:"modified_at,notnull,default:current_timestamp"` + Trash bool `bun:"trash,notnull"` + Default bool `bun:"default,notnull"` + OrganizationId uuid.UUID `bun:"organization_id,type:uuid"` + PartnerId uuid.UUID `bun:"partner_id,type:uuid"` + RoleId uuid.UUID `bun:"role_id,type:uuid"` + GroupId uuid.UUID `bun:"group_id,type:uuid"` + Active bool `bun:"active,notnull"` +} diff --git a/components/usermgmt/pkg/internal/models/projectgroupnamespace.go b/components/usermgmt/pkg/internal/models/projectgroupnamespace.go new file mode 100644 index 0000000..3a173cd --- /dev/null +++ b/components/usermgmt/pkg/internal/models/projectgroupnamespace.go @@ -0,0 +1,26 @@ +package models + +import ( + "time" + + "github.com/google/uuid" + "github.com/uptrace/bun" +) + +type ProjectGroupNamespaceRole struct { + bun.BaseModel `bun:"table:authsrv_projectgroupnamespacerole,alias:projectgroupnamespacerole"` + + ID uuid.UUID `bun:"id,type:uuid,pk,default:uuid_generate_v4()"` + Name string `bun:"name,notnull"` + Description string `bun:"description,notnull"` + CreatedAt time.Time `bun:"created_at,notnull,default:current_timestamp"` + ModifiedAt time.Time `bun:"modified_at,notnull,default:current_timestamp"` + Trash bool `bun:"trash,notnull"` + OrganizationId uuid.UUID `bun:"organization_id,type:uuid"` + PartnerId uuid.UUID `bun:"partner_id,type:uuid"` + RoleId uuid.UUID `bun:"role_id,type:uuid"` + GroupId uuid.UUID `bun:"group_id,type:uuid"` + ProjectId uuid.UUID `bun:"project_id,type:uuid"` + NamesapceId int64 `bun:"namespace_id,type:uuid"` + Active bool `bun:"active,notnull"` +} diff --git a/components/usermgmt/pkg/internal/models/projectgrouprole.go b/components/usermgmt/pkg/internal/models/projectgrouprole.go new file mode 100644 index 0000000..14d03de --- /dev/null +++ b/components/usermgmt/pkg/internal/models/projectgrouprole.go @@ -0,0 +1,26 @@ +package models + +import ( + "time" + + "github.com/google/uuid" + "github.com/uptrace/bun" +) + +type ProjectGroupRole struct { + bun.BaseModel `bun:"table:authsrv_projectgrouprole,alias:projectgrouprole"` + + ID uuid.UUID `bun:"id,type:uuid,pk,default:uuid_generate_v4()"` + Name string `bun:"name,notnull"` + Description string `bun:"description,notnull"` + CreatedAt time.Time `bun:"created_at,notnull,default:current_timestamp"` + ModifiedAt time.Time `bun:"modified_at,notnull,default:current_timestamp"` + Trash bool `bun:"trash,notnull"` + Default bool `bun:"default,notnull"` + OrganizationId uuid.UUID `bun:"organization_id,type:uuid"` + PartnerId uuid.UUID `bun:"partner_id,type:uuid"` + RoleId uuid.UUID `bun:"role_id,type:uuid"` + GroupId uuid.UUID `bun:"group_id,type:uuid"` + ProjectId uuid.UUID `bun:"project_id,type:uuid"` + Active bool `bun:"active,notnull"` +} diff --git a/components/usermgmt/pkg/service/group.go b/components/usermgmt/pkg/service/group.go index d7ebf59..94ba0bb 100644 --- a/components/usermgmt/pkg/service/group.go +++ b/components/usermgmt/pkg/service/group.go @@ -49,6 +49,98 @@ func NewGroupService(db *bun.DB) GroupService { } } +// Map roles to groups +func (s *groupService) userGroupRoleRelation(ctx context.Context, group *userv3.Group) (*userv3.Group, error) { + groupId, _ := uuid.Parse(group.GetMetadata().GetId()) + partnerId, _ := uuid.Parse(group.GetMetadata().GetPartner()) + organizationId, _ := uuid.Parse(group.GetMetadata().GetOrganization()) + + // TODO: also parse out namesapce + projectNamespaceRoles := group.GetSpec().GetProjectnamespaceroles() + + // TODO: add transactions + var pgnrs []models.ProjectGroupNamespaceRole + var pgrs []models.ProjectGroupRole + var grs []models.GroupRole + for _, pnr := range projectNamespaceRoles { + projectId, perr := uuid.Parse(pnr.GetProject()) + namespaceId := pnr.GetNamespace() + roleId, err := uuid.Parse(pnr.GetRole()) + if err != nil { + return group, err + } + switch { + case namespaceId != 0: // TODO: namespaceId can be zero? + pgnr := models.ProjectGroupNamespaceRole{ + Name: group.GetMetadata().GetName(), + Description: group.GetMetadata().GetDescription(), + CreatedAt: time.Now(), + ModifiedAt: time.Now(), + Trash: false, + RoleId: roleId, + PartnerId: partnerId, + OrganizationId: organizationId, + GroupId: groupId, + ProjectId: projectId, + NamesapceId: namespaceId, + Active: true, + } + pgnrs = append(pgnrs, pgnr) + case perr == nil: // TODO: maybe a better check? + pgr := models.ProjectGroupRole{ + Name: group.GetMetadata().GetName(), + Description: group.GetMetadata().GetDescription(), + CreatedAt: time.Now(), + ModifiedAt: time.Now(), + Trash: false, + Default: true, // TODO: what is this for? + RoleId: roleId, + PartnerId: partnerId, + OrganizationId: organizationId, + GroupId: groupId, + ProjectId: projectId, + Active: true, + } + pgrs = append(pgrs, pgr) + default: + gr := models.GroupRole{ + Name: group.GetMetadata().GetName(), + Description: group.GetMetadata().GetDescription(), + CreatedAt: time.Now(), + ModifiedAt: time.Now(), + Trash: false, + Default: true, // TODO: what is this for? + RoleId: roleId, + PartnerId: partnerId, + OrganizationId: organizationId, + GroupId: groupId, + Active: true, + } + grs = append(grs, gr) + } + } + if len(pgnrs) > 0 { + _, err := s.dao.Create(ctx, &pgnrs) + if err != nil { + return group, err + } + } + if len(pgrs) > 0 { + _, err := s.dao.Create(ctx, &pgrs) + if err != nil { + return group, err + } + } + if len(grs) > 0 { + _, err := s.dao.Create(ctx, &grs) + if err != nil { + return group, err + } + } + + return group, nil +} + // Update the users(account) mapped to each group func (s *groupService) updateGroupAccountRelation(ctx context.Context, group *userv3.Group) (*userv3.Group, error) { // TODO: use a more efficient way to update the relations @@ -88,7 +180,6 @@ func (s *groupService) updateGroupAccountRelation(ctx context.Context, group *us } func (s *groupService) Create(ctx context.Context, group *userv3.Group) (*userv3.Group, error) { - partnerId, _ := uuid.Parse(group.GetMetadata().GetPartner()) organizationId, _ := uuid.Parse(group.GetMetadata().GetOrganization()) // TODO: find out the interaction if project key is present in the group metadata @@ -122,6 +213,7 @@ func (s *groupService) Create(ctx context.Context, group *userv3.Group) (*userv3 group.Spec = &userv3.GroupSpec{ Type: createdGroup.Type, Users: group.Spec.Users, // TODO: is this the right thing to do? + Projectnamespaceroles: group.Spec.Projectnamespaceroles, // TODO: is this the right thing to do? } if group.Status != nil { group.Status = &v3.Status{ @@ -142,6 +234,16 @@ func (s *groupService) Create(ctx context.Context, group *userv3.Group) (*userv3 return group, err } + group, err = s.userGroupRoleRelation(ctx, group) + if err != nil { + group.Status = &v3.Status{ + ConditionType: "Create", + ConditionStatus: v3.ConditionStatus_StatusFailed, + LastUpdated: timestamppb.Now(), + } + return group, err + } + return group, nil } @@ -205,8 +307,6 @@ func (s *groupService) GetByID(ctx context.Context, id string) (*userv3.Group, e } func (s *groupService) GetByName(ctx context.Context, name string) (*userv3.Group, error) { - fmt.Println("name:", name) - group := &userv3.Group{ ApiVersion: apiVersion, Kind: groupKind, diff --git a/components/usermgmt/proto/types/userpb/v3/group.pb.go b/components/usermgmt/proto/types/userpb/v3/group.pb.go index ec6a581..1cd49f0 100644 --- a/components/usermgmt/proto/types/userpb/v3/group.pb.go +++ b/components/usermgmt/proto/types/userpb/v3/group.pb.go @@ -7,7 +7,7 @@ package userv3 import ( - v31 "github.com/RafaySystems/rcloud-base/components/adminsrv/proto/types/systempb/v3" + _ "github.com/RafaySystems/rcloud-base/components/adminsrv/proto/types/systempb/v3" v3 "github.com/RafaySystems/rcloud-base/components/common/proto/types/commonpb/v3" _ "github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv2/options" protoreflect "google.golang.org/protobuf/reflect/protoreflect" @@ -102,17 +102,18 @@ func (x *Group) GetStatus() *v3.Status { return nil } -type ProjectRole struct { +type ProjectNamespaceRole struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Project *v31.Project `protobuf:"bytes,1,opt,name=project,proto3" json:"project,omitempty"` - Role *Role `protobuf:"bytes,2,opt,name=role,proto3" json:"role,omitempty"` + Project string `protobuf:"bytes,1,opt,name=project,proto3" json:"project,omitempty"` + Namespace int64 `protobuf:"varint,2,opt,name=namespace,proto3" json:"namespace,omitempty"` + Role string `protobuf:"bytes,3,opt,name=role,proto3" json:"role,omitempty"` } -func (x *ProjectRole) Reset() { - *x = ProjectRole{} +func (x *ProjectNamespaceRole) Reset() { + *x = ProjectNamespaceRole{} if protoimpl.UnsafeEnabled { mi := &file_proto_types_userpb_v3_group_proto_msgTypes[1] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -120,13 +121,13 @@ func (x *ProjectRole) Reset() { } } -func (x *ProjectRole) String() string { +func (x *ProjectNamespaceRole) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ProjectRole) ProtoMessage() {} +func (*ProjectNamespaceRole) ProtoMessage() {} -func (x *ProjectRole) ProtoReflect() protoreflect.Message { +func (x *ProjectNamespaceRole) ProtoReflect() protoreflect.Message { mi := &file_proto_types_userpb_v3_group_proto_msgTypes[1] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -138,23 +139,30 @@ func (x *ProjectRole) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ProjectRole.ProtoReflect.Descriptor instead. -func (*ProjectRole) Descriptor() ([]byte, []int) { +// Deprecated: Use ProjectNamespaceRole.ProtoReflect.Descriptor instead. +func (*ProjectNamespaceRole) Descriptor() ([]byte, []int) { return file_proto_types_userpb_v3_group_proto_rawDescGZIP(), []int{1} } -func (x *ProjectRole) GetProject() *v31.Project { +func (x *ProjectNamespaceRole) GetProject() string { if x != nil { return x.Project } - return nil + return "" } -func (x *ProjectRole) GetRole() *Role { +func (x *ProjectNamespaceRole) GetNamespace() int64 { + if x != nil { + return x.Namespace + } + return 0 +} + +func (x *ProjectNamespaceRole) GetRole() string { if x != nil { return x.Role } - return nil + return "" } type GroupSpec struct { @@ -162,9 +170,9 @@ type GroupSpec struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Projectroles []*ProjectRole `protobuf:"bytes,1,rep,name=projectroles,proto3" json:"projectroles,omitempty"` - Users []string `protobuf:"bytes,2,rep,name=users,proto3" json:"users,omitempty"` - Type string `protobuf:"bytes,3,opt,name=type,proto3" json:"type,omitempty"` + Projectnamespaceroles []*ProjectNamespaceRole `protobuf:"bytes,1,rep,name=projectnamespaceroles,proto3" json:"projectnamespaceroles,omitempty"` + Users []string `protobuf:"bytes,2,rep,name=users,proto3" json:"users,omitempty"` + Type string `protobuf:"bytes,3,opt,name=type,proto3" json:"type,omitempty"` } func (x *GroupSpec) Reset() { @@ -199,9 +207,9 @@ func (*GroupSpec) Descriptor() ([]byte, []int) { return file_proto_types_userpb_v3_group_proto_rawDescGZIP(), []int{2} } -func (x *GroupSpec) GetProjectroles() []*ProjectRole { +func (x *GroupSpec) GetProjectnamespaceroles() []*ProjectNamespaceRole { if x != nil { - return x.Projectroles + return x.Projectnamespaceroles } return nil } @@ -342,83 +350,88 @@ var file_proto_types_userpb_v3_group_proto_rawDesc = []byte{ 0x3a, 0x39, 0x92, 0x41, 0x36, 0x0a, 0x34, 0x2a, 0x05, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x32, 0x05, 0x47, 0x72, 0x6f, 0x75, 0x70, 0xd2, 0x01, 0x0a, 0x61, 0x70, 0x69, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0xd2, 0x01, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0xd2, 0x01, 0x08, 0x6d, 0x65, 0x74, 0x61, - 0x64, 0x61, 0x74, 0x61, 0xd2, 0x01, 0x04, 0x73, 0x70, 0x65, 0x63, 0x22, 0xe3, 0x01, 0x0a, 0x0b, - 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x53, 0x0a, 0x07, 0x70, - 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x72, - 0x61, 0x66, 0x61, 0x79, 0x2e, 0x64, 0x65, 0x76, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x73, - 0x79, 0x73, 0x74, 0x65, 0x6d, 0x2e, 0x76, 0x33, 0x2e, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, - 0x42, 0x15, 0x92, 0x41, 0x12, 0x2a, 0x07, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x32, 0x07, - 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, - 0x12, 0x42, 0x0a, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, - 0x2e, 0x72, 0x61, 0x66, 0x61, 0x79, 0x2e, 0x64, 0x65, 0x76, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, - 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x76, 0x33, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x42, 0x0f, 0x92, - 0x41, 0x0c, 0x2a, 0x04, 0x52, 0x6f, 0x6c, 0x65, 0x32, 0x04, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x04, - 0x72, 0x6f, 0x6c, 0x65, 0x3a, 0x3b, 0x92, 0x41, 0x38, 0x0a, 0x36, 0x2a, 0x0b, 0x50, 0x72, 0x6f, - 0x6a, 0x65, 0x63, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x32, 0x27, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, - 0x74, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x20, 0x70, 0x61, 0x69, 0x72, 0x69, - 0x6e, 0x67, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x22, 0xa5, 0x02, 0x0a, 0x09, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x53, 0x70, 0x65, 0x63, 0x12, - 0x7e, 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x72, 0x61, 0x66, 0x61, 0x79, 0x2e, 0x64, 0x65, - 0x76, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x76, 0x33, 0x2e, - 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x42, 0x34, 0x92, 0x41, 0x31, - 0x2a, 0x0c, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x32, 0x21, - 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x20, 0x67, 0x72, 0x6f, 0x75, - 0x70, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x12, - 0x39, 0x0a, 0x05, 0x75, 0x73, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x42, 0x23, - 0x92, 0x41, 0x20, 0x2a, 0x05, 0x55, 0x73, 0x65, 0x72, 0x73, 0x32, 0x17, 0x4c, 0x69, 0x73, 0x74, - 0x20, 0x6f, 0x66, 0x20, 0x75, 0x73, 0x65, 0x72, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x67, 0x72, - 0x6f, 0x75, 0x70, 0x52, 0x05, 0x75, 0x73, 0x65, 0x72, 0x73, 0x12, 0x2c, 0x0a, 0x04, 0x74, 0x79, - 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x18, 0x92, 0x41, 0x15, 0x2a, 0x04, 0x54, - 0x79, 0x70, 0x65, 0x32, 0x0d, 0x54, 0x79, 0x70, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x67, 0x72, 0x6f, - 0x75, 0x70, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x2f, 0x92, 0x41, 0x2c, 0x0a, 0x2a, 0x2a, - 0x13, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x20, 0x53, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x32, 0x13, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x20, 0x73, 0x70, 0x65, 0x63, - 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xa5, 0x03, 0x0a, 0x09, 0x47, 0x72, - 0x6f, 0x75, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x5a, 0x0a, 0x0a, 0x61, 0x70, 0x69, 0x56, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x3a, 0x92, 0x41, 0x37, - 0x2a, 0x0b, 0x41, 0x50, 0x49, 0x20, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x32, 0x26, 0x41, - 0x50, 0x49, 0x20, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, - 0x65, 0x20, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x72, 0x65, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x40, 0x01, 0x52, 0x0a, 0x61, 0x70, 0x69, 0x56, 0x65, 0x72, 0x73, - 0x69, 0x6f, 0x6e, 0x12, 0x40, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x42, 0x2c, 0x92, 0x41, 0x29, 0x2a, 0x04, 0x4b, 0x69, 0x6e, 0x64, 0x32, 0x1f, 0x4b, 0x69, - 0x6e, 0x64, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x20, - 0x6c, 0x69, 0x73, 0x74, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x40, 0x01, 0x52, - 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x79, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, - 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x72, 0x61, 0x66, 0x61, 0x79, 0x2e, - 0x64, 0x65, 0x76, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, - 0x2e, 0x76, 0x33, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, - 0x42, 0x34, 0x92, 0x41, 0x31, 0x2a, 0x08, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x32, - 0x23, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, - 0x20, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x72, 0x65, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x40, 0x01, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, - 0x12, 0x5f, 0x0a, 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x1e, 0x2e, 0x72, 0x61, 0x66, 0x61, 0x79, 0x2e, 0x64, 0x65, 0x76, 0x2e, 0x74, 0x79, 0x70, 0x65, - 0x73, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x76, 0x33, 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x42, - 0x29, 0x92, 0x41, 0x26, 0x2a, 0x05, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x32, 0x1b, 0x4c, 0x69, 0x73, - 0x74, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x20, 0x72, - 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x40, 0x01, 0x52, 0x05, 0x69, 0x74, 0x65, 0x6d, - 0x73, 0x3a, 0x1e, 0x92, 0x41, 0x1b, 0x0a, 0x19, 0x2a, 0x09, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4c, - 0x69, 0x73, 0x74, 0x32, 0x0a, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x40, - 0x01, 0x42, 0x80, 0x02, 0x0a, 0x1b, 0x63, 0x6f, 0x6d, 0x2e, 0x72, 0x61, 0x66, 0x61, 0x79, 0x2e, - 0x64, 0x65, 0x76, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x76, - 0x33, 0x42, 0x0a, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, - 0x54, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x52, 0x61, 0x66, 0x61, - 0x79, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x73, 0x2f, 0x72, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2d, - 0x62, 0x61, 0x73, 0x65, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, - 0x75, 0x73, 0x65, 0x72, 0x6d, 0x67, 0x6d, 0x74, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x74, - 0x79, 0x70, 0x65, 0x73, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x70, 0x62, 0x2f, 0x76, 0x33, 0x3b, 0x75, - 0x73, 0x65, 0x72, 0x76, 0x33, 0xa2, 0x02, 0x04, 0x52, 0x44, 0x54, 0x55, 0xaa, 0x02, 0x17, 0x52, - 0x61, 0x66, 0x61, 0x79, 0x2e, 0x44, 0x65, 0x76, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x55, - 0x73, 0x65, 0x72, 0x2e, 0x56, 0x33, 0xca, 0x02, 0x17, 0x52, 0x61, 0x66, 0x61, 0x79, 0x5c, 0x44, - 0x65, 0x76, 0x5c, 0x54, 0x79, 0x70, 0x65, 0x73, 0x5c, 0x55, 0x73, 0x65, 0x72, 0x5c, 0x56, 0x33, - 0xe2, 0x02, 0x23, 0x52, 0x61, 0x66, 0x61, 0x79, 0x5c, 0x44, 0x65, 0x76, 0x5c, 0x54, 0x79, 0x70, - 0x65, 0x73, 0x5c, 0x55, 0x73, 0x65, 0x72, 0x5c, 0x56, 0x33, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, - 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x1b, 0x52, 0x61, 0x66, 0x61, 0x79, 0x3a, 0x3a, - 0x44, 0x65, 0x76, 0x3a, 0x3a, 0x54, 0x79, 0x70, 0x65, 0x73, 0x3a, 0x3a, 0x55, 0x73, 0x65, 0x72, - 0x3a, 0x3a, 0x56, 0x33, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x64, 0x61, 0x74, 0x61, 0xd2, 0x01, 0x04, 0x73, 0x70, 0x65, 0x63, 0x22, 0xf6, 0x01, 0x0a, 0x14, + 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, + 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x2f, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x15, 0x92, 0x41, 0x12, 0x2a, 0x07, 0x50, 0x72, 0x6f, 0x6a, + 0x65, 0x63, 0x74, 0x32, 0x07, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x07, 0x70, 0x72, + 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x37, 0x0a, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x42, 0x19, 0x92, 0x41, 0x16, 0x2a, 0x09, 0x4e, + 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x32, 0x09, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x52, 0x09, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x23, + 0x0a, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0f, 0x92, 0x41, + 0x0c, 0x2a, 0x04, 0x52, 0x6f, 0x6c, 0x65, 0x32, 0x04, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x04, 0x72, + 0x6f, 0x6c, 0x65, 0x3a, 0x4f, 0x92, 0x41, 0x4c, 0x0a, 0x4a, 0x2a, 0x14, 0x50, 0x72, 0x6f, 0x6a, + 0x65, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x6f, 0x6c, 0x65, + 0x32, 0x32, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x2c, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x20, + 0x61, 0x6e, 0x64, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x20, 0x70, 0x61, + 0x69, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, + 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xdd, 0x02, 0x0a, 0x09, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x53, 0x70, + 0x65, 0x63, 0x12, 0xb5, 0x01, 0x0a, 0x15, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x6e, 0x61, + 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x72, 0x61, 0x66, 0x61, 0x79, 0x2e, 0x64, 0x65, 0x76, 0x2e, 0x74, + 0x79, 0x70, 0x65, 0x73, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x76, 0x33, 0x2e, 0x50, 0x72, 0x6f, + 0x6a, 0x65, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x6f, 0x6c, + 0x65, 0x42, 0x50, 0x92, 0x41, 0x4d, 0x2a, 0x15, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x4e, + 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x32, 0x34, 0x50, + 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x2c, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x2c, 0x20, 0x72, 0x6f, 0x6c, 0x65, 0x20, 0x61, 0x73, 0x73, 0x6f, 0x63, 0x69, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, + 0x69, 0x6f, 0x6e, 0x52, 0x15, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x6e, 0x61, 0x6d, 0x65, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x39, 0x0a, 0x05, 0x75, 0x73, + 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x42, 0x23, 0x92, 0x41, 0x20, 0x2a, 0x05, + 0x55, 0x73, 0x65, 0x72, 0x73, 0x32, 0x17, 0x4c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x75, + 0x73, 0x65, 0x72, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x05, + 0x75, 0x73, 0x65, 0x72, 0x73, 0x12, 0x2c, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x42, 0x18, 0x92, 0x41, 0x15, 0x2a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x32, 0x0d, + 0x54, 0x79, 0x70, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x04, 0x74, + 0x79, 0x70, 0x65, 0x3a, 0x2f, 0x92, 0x41, 0x2c, 0x0a, 0x2a, 0x2a, 0x13, 0x47, 0x72, 0x6f, 0x75, + 0x70, 0x20, 0x53, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x32, + 0x13, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xa5, 0x03, 0x0a, 0x09, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4c, 0x69, + 0x73, 0x74, 0x12, 0x5a, 0x0a, 0x0a, 0x61, 0x70, 0x69, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x3a, 0x92, 0x41, 0x37, 0x2a, 0x0b, 0x41, 0x50, 0x49, + 0x20, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x32, 0x26, 0x41, 0x50, 0x49, 0x20, 0x56, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x67, 0x72, 0x6f, + 0x75, 0x70, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x40, 0x01, 0x52, 0x0a, 0x61, 0x70, 0x69, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x40, + 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x2c, 0x92, 0x41, + 0x29, 0x2a, 0x04, 0x4b, 0x69, 0x6e, 0x64, 0x32, 0x1f, 0x4b, 0x69, 0x6e, 0x64, 0x20, 0x6f, 0x66, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, + 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x40, 0x01, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, + 0x12, 0x79, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x72, 0x61, 0x66, 0x61, 0x79, 0x2e, 0x64, 0x65, 0x76, 0x2e, 0x74, + 0x79, 0x70, 0x65, 0x73, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4c, + 0x69, 0x73, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x42, 0x34, 0x92, 0x41, 0x31, + 0x2a, 0x08, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x32, 0x23, 0x4d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x67, 0x72, 0x6f, 0x75, + 0x70, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x40, + 0x01, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x5f, 0x0a, 0x05, 0x69, + 0x74, 0x65, 0x6d, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x72, 0x61, 0x66, + 0x61, 0x79, 0x2e, 0x64, 0x65, 0x76, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x75, 0x73, 0x65, + 0x72, 0x2e, 0x76, 0x33, 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x42, 0x29, 0x92, 0x41, 0x26, 0x2a, + 0x05, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x32, 0x1b, 0x4c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x20, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x73, 0x40, 0x01, 0x52, 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x3a, 0x1e, 0x92, 0x41, + 0x1b, 0x0a, 0x19, 0x2a, 0x09, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x32, 0x0a, + 0x47, 0x72, 0x6f, 0x75, 0x70, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x40, 0x01, 0x42, 0x80, 0x02, 0x0a, + 0x1b, 0x63, 0x6f, 0x6d, 0x2e, 0x72, 0x61, 0x66, 0x61, 0x79, 0x2e, 0x64, 0x65, 0x76, 0x2e, 0x74, + 0x79, 0x70, 0x65, 0x73, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x76, 0x33, 0x42, 0x0a, 0x47, 0x72, + 0x6f, 0x75, 0x70, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x54, 0x67, 0x69, 0x74, 0x68, + 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x52, 0x61, 0x66, 0x61, 0x79, 0x53, 0x79, 0x73, 0x74, + 0x65, 0x6d, 0x73, 0x2f, 0x72, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2d, 0x62, 0x61, 0x73, 0x65, 0x2f, + 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x6d, + 0x67, 0x6d, 0x74, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2f, + 0x75, 0x73, 0x65, 0x72, 0x70, 0x62, 0x2f, 0x76, 0x33, 0x3b, 0x75, 0x73, 0x65, 0x72, 0x76, 0x33, + 0xa2, 0x02, 0x04, 0x52, 0x44, 0x54, 0x55, 0xaa, 0x02, 0x17, 0x52, 0x61, 0x66, 0x61, 0x79, 0x2e, + 0x44, 0x65, 0x76, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x2e, 0x56, + 0x33, 0xca, 0x02, 0x17, 0x52, 0x61, 0x66, 0x61, 0x79, 0x5c, 0x44, 0x65, 0x76, 0x5c, 0x54, 0x79, + 0x70, 0x65, 0x73, 0x5c, 0x55, 0x73, 0x65, 0x72, 0x5c, 0x56, 0x33, 0xe2, 0x02, 0x23, 0x52, 0x61, + 0x66, 0x61, 0x79, 0x5c, 0x44, 0x65, 0x76, 0x5c, 0x54, 0x79, 0x70, 0x65, 0x73, 0x5c, 0x55, 0x73, + 0x65, 0x72, 0x5c, 0x56, 0x33, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0xea, 0x02, 0x1b, 0x52, 0x61, 0x66, 0x61, 0x79, 0x3a, 0x3a, 0x44, 0x65, 0x76, 0x3a, 0x3a, + 0x54, 0x79, 0x70, 0x65, 0x73, 0x3a, 0x3a, 0x55, 0x73, 0x65, 0x72, 0x3a, 0x3a, 0x56, 0x33, 0x62, + 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -435,30 +448,26 @@ func file_proto_types_userpb_v3_group_proto_rawDescGZIP() []byte { var file_proto_types_userpb_v3_group_proto_msgTypes = make([]protoimpl.MessageInfo, 4) var file_proto_types_userpb_v3_group_proto_goTypes = []interface{}{ - (*Group)(nil), // 0: rafay.dev.types.user.v3.Group - (*ProjectRole)(nil), // 1: rafay.dev.types.user.v3.ProjectRole - (*GroupSpec)(nil), // 2: rafay.dev.types.user.v3.GroupSpec - (*GroupList)(nil), // 3: rafay.dev.types.user.v3.GroupList - (*v3.Metadata)(nil), // 4: rafay.dev.types.common.v3.Metadata - (*v3.Status)(nil), // 5: rafay.dev.types.common.v3.Status - (*v31.Project)(nil), // 6: rafay.dev.types.system.v3.Project - (*Role)(nil), // 7: rafay.dev.types.user.v3.Role - (*v3.ListMetadata)(nil), // 8: rafay.dev.types.common.v3.ListMetadata + (*Group)(nil), // 0: rafay.dev.types.user.v3.Group + (*ProjectNamespaceRole)(nil), // 1: rafay.dev.types.user.v3.ProjectNamespaceRole + (*GroupSpec)(nil), // 2: rafay.dev.types.user.v3.GroupSpec + (*GroupList)(nil), // 3: rafay.dev.types.user.v3.GroupList + (*v3.Metadata)(nil), // 4: rafay.dev.types.common.v3.Metadata + (*v3.Status)(nil), // 5: rafay.dev.types.common.v3.Status + (*v3.ListMetadata)(nil), // 6: rafay.dev.types.common.v3.ListMetadata } var file_proto_types_userpb_v3_group_proto_depIdxs = []int32{ 4, // 0: rafay.dev.types.user.v3.Group.metadata:type_name -> rafay.dev.types.common.v3.Metadata 2, // 1: rafay.dev.types.user.v3.Group.spec:type_name -> rafay.dev.types.user.v3.GroupSpec 5, // 2: rafay.dev.types.user.v3.Group.status:type_name -> rafay.dev.types.common.v3.Status - 6, // 3: rafay.dev.types.user.v3.ProjectRole.project:type_name -> rafay.dev.types.system.v3.Project - 7, // 4: rafay.dev.types.user.v3.ProjectRole.role:type_name -> rafay.dev.types.user.v3.Role - 1, // 5: rafay.dev.types.user.v3.GroupSpec.projectroles:type_name -> rafay.dev.types.user.v3.ProjectRole - 8, // 6: rafay.dev.types.user.v3.GroupList.metadata:type_name -> rafay.dev.types.common.v3.ListMetadata - 0, // 7: rafay.dev.types.user.v3.GroupList.items:type_name -> rafay.dev.types.user.v3.Group - 8, // [8:8] is the sub-list for method output_type - 8, // [8:8] is the sub-list for method input_type - 8, // [8:8] is the sub-list for extension type_name - 8, // [8:8] is the sub-list for extension extendee - 0, // [0:8] is the sub-list for field type_name + 1, // 3: rafay.dev.types.user.v3.GroupSpec.projectnamespaceroles:type_name -> rafay.dev.types.user.v3.ProjectNamespaceRole + 6, // 4: rafay.dev.types.user.v3.GroupList.metadata:type_name -> rafay.dev.types.common.v3.ListMetadata + 0, // 5: rafay.dev.types.user.v3.GroupList.items:type_name -> rafay.dev.types.user.v3.Group + 6, // [6:6] is the sub-list for method output_type + 6, // [6:6] is the sub-list for method input_type + 6, // [6:6] is the sub-list for extension type_name + 6, // [6:6] is the sub-list for extension extendee + 0, // [0:6] is the sub-list for field type_name } func init() { file_proto_types_userpb_v3_group_proto_init() } @@ -481,7 +490,7 @@ func file_proto_types_userpb_v3_group_proto_init() { } } file_proto_types_userpb_v3_group_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ProjectRole); i { + switch v := v.(*ProjectNamespaceRole); i { case 0: return &v.state case 1: diff --git a/components/usermgmt/proto/types/userpb/v3/group.proto b/components/usermgmt/proto/types/userpb/v3/group.proto index 041e675..052e5f3 100644 --- a/components/usermgmt/proto/types/userpb/v3/group.proto +++ b/components/usermgmt/proto/types/userpb/v3/group.proto @@ -45,19 +45,24 @@ message Group { } ]; } -message ProjectRole { +message ProjectNamespaceRole { option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_schema) = { json_schema : { - title : "ProjectRole" - description : "Project and role pairing for permission" + title : "ProjectNamespaceRole" + description : "Project, role and namespace pairing for permission" } }; - rafay.dev.types.system.v3.Project project = 1 + string project = 1 [ (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { title : "Project" description : "Project" } ]; - rafay.dev.types.user.v3.Role role = 2 + int64 namespace = 2 + [ (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + title : "Namespace" + description : "Namespace" + } ]; + string role = 3 [ (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { title : "Role" description : "Role" @@ -71,10 +76,10 @@ message GroupSpec { description : "Group specification" } }; - repeated ProjectRole projectroles = 1 + repeated ProjectNamespaceRole projectnamespaceroles = 1 [ (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { - title : "ProjectRoles" - description : "ProjectRole groups for permission" + title : "ProjectNamespaceRoles" + description : "Project, namespace, role associations for permission" } ]; repeated string users = 2 [ (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = {