Project, group, namespace, role linking basics

This commit is contained in:
Abin Simon
2022-01-09 17:38:13 +05:30
parent 9e2d13876c
commit 36b00390fe
7 changed files with 334 additions and 314 deletions

View File

@@ -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": {

View File

@@ -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"`
}

View File

@@ -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"`
}

View File

@@ -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"`
}

View File

@@ -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,

View File

@@ -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:

View File

@@ -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) = {