diff --git a/doc/index.html b/doc/index.html index 5120e158..9ab2327b 100644 --- a/doc/index.html +++ b/doc/index.html @@ -252,6 +252,18 @@

Table of Contents

XFile-level Extensions +
  • + XFile-level Extensions +
  • + +
  • + XFile-level Extensions +
  • + +
  • + XFile-level Extensions +
  • + @@ -2820,6 +2832,30 @@

    File-level Extensio

    Keys trimmed enforces all map keys and values to be trimmed, e.g. no whitespaces at the begin and end

    + + machine_roles_keys_valid + bool + .buf.validate.MapRules + 80068955 +

    MachineRolesKeysValid ensures that machine roles keys met our requirements

    + + + + project_roles_keys_valid + bool + .buf.validate.MapRules + 80068953 +

    ProjectRolesKeysValid ensures that project roles keys met our requirements

    + + + + tenant_roles_keys_valid + bool + .buf.validate.MapRules + 80068954 +

    TenantRolesKeysValid ensures that tenant roles keys met our requirements

    + + all_trimmed bool @@ -4091,7 +4127,7 @@

    MethodPermission

    Token

    -

    Token generates a jwt authentication token to access the api

    There are two different types of tokens, api- and user- tokens

    A user token is used to authenticate end user requests for example from a cli.

    The configured roles in a user token are expanded in the api server

    based on the memberships in other projects and tenants based on the role granted there.

    User tokens will never contain permissions.

    Permissions are always derived from the tenant and project roles and memberships.

    The api token should be used to authenticate services.

    In contrast to a user token, the api token permissions and roles apply as configured during the token create process.

    +

    Token generates a jwt authentication token to access the api

    There are two different types of tokens, api- and user- tokens

    A user token is used to authenticate end user requests for example from a cli.

    The configured roles in a user token are expanded in the api server

    based on the memberships in other projects and tenants based on the role granted there.

    User tokens will never contain permissions.

    Permissions are always derived from the tenant and project roles and memberships.

    The api token should be used to authenticate services.

    In contrast to a user token, the api token permissions and roles apply as configured during the token create process.

    Message level validation, can be developed using https://protovalidate.com/playground

    diff --git a/go.mod b/go.mod index 4f757dcc..cd68f446 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module github.com/metal-stack/api go 1.26 require ( - buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.36.11-20260415201107-50325440f8f2.1 + buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.36.11-20260709200747-435963d16310.1 buf.build/go/protovalidate v1.2.0 connectrpc.com/connect v1.20.0 github.com/bufbuild/protocompile v0.14.1 @@ -21,18 +21,18 @@ require ( cel.dev/expr v0.25.2 // indirect github.com/antlr4-go/antlr/v4 v4.13.1 // indirect github.com/davecgh/go-spew v1.1.1 // indirect - github.com/google/cel-go v0.29.1 // indirect + github.com/google/cel-go v0.29.2 // indirect github.com/klauspost/compress v1.19.0 // indirect github.com/kr/pretty v0.3.1 // indirect github.com/minio/minlz v1.1.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/stretchr/objx v0.5.3 // indirect go.yaml.in/yaml/v3 v3.0.4 // indirect - golang.org/x/exp v0.0.0-20260611194520-c48552f49976 // indirect - golang.org/x/sys v0.43.0 // indirect - golang.org/x/text v0.38.0 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20260630182238-925bb5da69e7 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20260630182238-925bb5da69e7 // indirect + golang.org/x/exp v0.0.0-20260709172345-9ea1abe57597 // indirect + golang.org/x/sys v0.47.0 // indirect + golang.org/x/text v0.40.0 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20260706201446-f0a921348800 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20260706201446-f0a921348800 // indirect gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index 8c9816a8..6fd9cbe2 100644 --- a/go.sum +++ b/go.sum @@ -1,5 +1,5 @@ -buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.36.11-20260415201107-50325440f8f2.1 h1:s6hzCXtND/ICdGPTMGk7C+/BFlr2Jg5GyH0NKf4XGXg= -buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.36.11-20260415201107-50325440f8f2.1/go.mod h1:tvtbpgaVXZX4g6Pn+AnzFycuRK3MOz5HJfEGeEllXYM= +buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.36.11-20260709200747-435963d16310.1 h1:fXh8CsdNpjRr8R5vFdqtIxPt/Lno2IIJlYOdZBIZn0w= +buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.36.11-20260709200747-435963d16310.1/go.mod h1:tvtbpgaVXZX4g6Pn+AnzFycuRK3MOz5HJfEGeEllXYM= buf.build/go/protovalidate v1.2.0 h1:DQVrUWkmGTBij+kOYv/x2LLxwcLaGKMdzShj1/6/3H0= buf.build/go/protovalidate v1.2.0/go.mod h1:7rYiQEhqvAipoazpVNBBH2S2f8bjG4huMVy1V2Yofn4= cel.dev/expr v0.25.2 h1:K6j46C81hXtZQfuX60cVWQFBJahKSE2gfRbNuvr5bFs= @@ -21,8 +21,8 @@ github.com/golang-jwt/jwt/v5 v5.3.1 h1:kYf81DTWFe7t+1VvL7eS+jKFVWaUnK9cB1qbwn63Y github.com/golang-jwt/jwt/v5 v5.3.1/go.mod h1:fxCRLWMO43lRc8nhHWY6LGqRcf+1gQWArsqaEUEa5bE= github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= -github.com/google/cel-go v0.29.1 h1:8Gx3S5HPop5XPOHtZI8vkaGk+DBW/nn9fkpNPbh5dBk= -github.com/google/cel-go v0.29.1/go.mod h1:X0bD6iVNR8pkROSOoHVdgTkzmRcosof7WQqCD6wcMc8= +github.com/google/cel-go v0.29.2 h1:ZtDxkeiMmz0mxbKDYiNkE5Lk7V5edMRcaaDf2jX002k= +github.com/google/cel-go v0.29.2/go.mod h1:X0bD6iVNR8pkROSOoHVdgTkzmRcosof7WQqCD6wcMc8= github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= @@ -53,18 +53,18 @@ github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= -golang.org/x/exp v0.0.0-20260611194520-c48552f49976 h1:X8Hz2ImujgbmetVuW+w2YkyZChE3cBpZi2P158rTG9M= -golang.org/x/exp v0.0.0-20260611194520-c48552f49976/go.mod h1:vnf4pv9iKZXY58sQE1L86zmNWJ4159e1RkcWiLCkeEY= -golang.org/x/net v0.53.0 h1:d+qAbo5L0orcWAr0a9JweQpjXF19LMXJE8Ey7hwOdUA= -golang.org/x/net v0.53.0/go.mod h1:JvMuJH7rrdiCfbeHoo3fCQU24Lf5JJwT9W3sJFulfgs= -golang.org/x/sys v0.43.0 h1:Rlag2XtaFTxp19wS8MXlJwTvoh8ArU6ezoyFsMyCTNI= -golang.org/x/sys v0.43.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= -golang.org/x/text v0.38.0 h1:sXmwo9DwP3OK9EZ7PqAdaooSGozfl/3a6/xJcbzPRhE= -golang.org/x/text v0.38.0/go.mod h1:YXZt3QhHUKYT53r2lLKFIVi6Ao1jdzrTR/KQ09qyxF4= -google.golang.org/genproto/googleapis/api v0.0.0-20260630182238-925bb5da69e7 h1:jQ9p21COKWjP3VwuFrNRiiOTMh3mPpN45R7SLrH/HUU= -google.golang.org/genproto/googleapis/api v0.0.0-20260630182238-925bb5da69e7/go.mod h1:KqHwBx2upmfa1XSi1WuRvC+2VGCLtooKkfmyvRbUmqA= -google.golang.org/genproto/googleapis/rpc v0.0.0-20260630182238-925bb5da69e7 h1:eM/YSd5bBFagF51o1E745Ta7RwzpW0h+z+QDNZOgmQ8= -google.golang.org/genproto/googleapis/rpc v0.0.0-20260630182238-925bb5da69e7/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= +golang.org/x/exp v0.0.0-20260709172345-9ea1abe57597 h1:qLvzZeaANDgyVOA8pyHCOStGlXn0rseXma+GQjeuv2g= +golang.org/x/exp v0.0.0-20260709172345-9ea1abe57597/go.mod h1:EdfpwwqSu+0Li0mzskwHU6FWDV3t9Q+RZDo3QMUtL3Q= +golang.org/x/net v0.55.0 h1:bcvxaJn3e1U6InsFWt1JUq1aSjnRxLzT2rtD2KfkDF8= +golang.org/x/net v0.55.0/go.mod h1:L5U2KuzuOe1lY7Z+aWVIKK6qEeJXnXV9yzGA+WCHJww= +golang.org/x/sys v0.47.0 h1:o7XGOvZQCADBQQ4Y7VNq2dRWQR7JmOUW8Kxx4ZsNgWs= +golang.org/x/sys v0.47.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= +golang.org/x/text v0.40.0 h1:Ub2Z6/xjgF1WrYQz2nuITOEegKFtiIy+rieRJ5lHZKs= +golang.org/x/text v0.40.0/go.mod h1:hpnzDAfGV753zIKo+wk3u1bVKCGPbrnF7+7LBF/UHVY= +google.golang.org/genproto/googleapis/api v0.0.0-20260706201446-f0a921348800 h1:admdQBe8jR3VWhBsUrAOaF2Qw6K/+p5pSm1GN8+6Fw4= +google.golang.org/genproto/googleapis/api v0.0.0-20260706201446-f0a921348800/go.mod h1:FPk7EXUKMtImne7AmknoYjT4QXqKIzzRbeQIXzLk6fQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260706201446-f0a921348800 h1:qEHAMpSaUhtD0p3NbEEI83HwNGFxEwaSJ1G9PLnCBZE= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260706201446-f0a921348800/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= google.golang.org/grpc v1.82.0 h1:vguDnZUPjE26w09A63VoxZPnvPjB5Riyc0mkXPFmAIU= google.golang.org/grpc v1.82.0/go.mod h1:yzTZ1TB1Z3SG+LIYaI+WiE8D5+PZ3ArnrSp8zF3+/ZA= google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE= diff --git a/go/metalstack/api/v2/predefined_rules.pb.go b/go/metalstack/api/v2/predefined_rules.pb.go index b5e92590..ebdd9f5f 100644 --- a/go/metalstack/api/v2/predefined_rules.pb.go +++ b/go/metalstack/api/v2/predefined_rules.pb.go @@ -166,6 +166,30 @@ var file_metalstack_api_v2_predefined_rules_proto_extTypes = []protoimpl.Extensi Tag: "varint,80068952,opt,name=keys_trimmed", Filename: "metalstack/api/v2/predefined_rules.proto", }, + { + ExtendedType: (*validate.MapRules)(nil), + ExtensionType: (*bool)(nil), + Field: 80068953, + Name: "metalstack.api.v2.project_roles_keys_valid", + Tag: "varint,80068953,opt,name=project_roles_keys_valid", + Filename: "metalstack/api/v2/predefined_rules.proto", + }, + { + ExtendedType: (*validate.MapRules)(nil), + ExtensionType: (*bool)(nil), + Field: 80068954, + Name: "metalstack.api.v2.tenant_roles_keys_valid", + Tag: "varint,80068954,opt,name=tenant_roles_keys_valid", + Filename: "metalstack/api/v2/predefined_rules.proto", + }, + { + ExtendedType: (*validate.MapRules)(nil), + ExtensionType: (*bool)(nil), + Field: 80068955, + Name: "metalstack.api.v2.machine_roles_keys_valid", + Tag: "varint,80068955,opt,name=machine_roles_keys_valid", + Filename: "metalstack/api/v2/predefined_rules.proto", + }, } // Extension fields to validate.StringRules. @@ -250,6 +274,18 @@ var ( // // optional bool keys_trimmed = 80068952; E_KeysTrimmed = &file_metalstack_api_v2_predefined_rules_proto_extTypes[17] + // ProjectRolesKeysValid ensures that project roles keys met our requirements + // + // optional bool project_roles_keys_valid = 80068953; + E_ProjectRolesKeysValid = &file_metalstack_api_v2_predefined_rules_proto_extTypes[18] + // TenantRolesKeysValid ensures that tenant roles keys met our requirements + // + // optional bool tenant_roles_keys_valid = 80068954; + E_TenantRolesKeysValid = &file_metalstack_api_v2_predefined_rules_proto_extTypes[19] + // MachineRolesKeysValid ensures that machine roles keys met our requirements + // + // optional bool machine_roles_keys_valid = 80068955; + E_MachineRolesKeysValid = &file_metalstack_api_v2_predefined_rules_proto_extTypes[20] ) var File_metalstack_api_v2_predefined_rules_proto protoreflect.FileDescriptor @@ -314,7 +350,16 @@ const file_metalstack_api_v2_predefined_rules_proto_rawDesc = "" + "\x1bmap.keys_and_values_trimmed\x125keys and values must not start or end with whitespace\x1aTthis.all(k, k.trim().size() == k.size()) && this.all(v, v.trim().size() == v.size())R\x14keysAndValuesTrimmed:\xab\x01\n" + "\fkeys_trimmed\x12\x16.buf.validate.MapRules\x18\u0602\x97& \x01(\bBm\xc2Hj\n" + "h\n" + - "\x10map.keys_trimmed\x12*keys must not start or end with whitespace\x1a(this.all(k, k.trim().size() == k.size())R\vkeysTrimmedB\xca\x01\n" + + "\x10map.keys_trimmed\x12*keys must not start or end with whitespace\x1a(this.all(k, k.trim().size() == k.size())R\vkeysTrimmed:\x92\x02\n" + + "\x18project_roles_keys_valid\x12\x16.buf.validate.MapRules\x18ق\x97& \x01(\bB\xbd\x01\xc2H\xb9\x01\n" + + "\xb6\x01\n" + + "\x17project_roles.key.valid\x12&subject must be a '*', or a valid UUID\x1asthis.all(k, k == '*' || k.matches('^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$'))R\x15projectRolesKeysValid:\xe8\x01\n" + + "\x17tenant_roles_keys_valid\x12\x16.buf.validate.MapRules\x18ڂ\x97& \x01(\bB\x95\x01\xc2H\x91\x01\n" + + "\x8e\x01\n" + + "\x16tenant_roles.key.valid\x123subject must be '*' or between 2 and 128 characters\x1a?this.all(k, k == '*' || this.size() >= 2 || this.size() <=128 )R\x14tenantRolesKeysValid:\xa9\x02\n" + + "\x18machine_roles_keys_valid\x12\x16.buf.validate.MapRules\x18ۂ\x97& \x01(\bB\xd4\x01\xc2H\xd0\x01\n" + + "\xcd\x01\n" + + "\x17machine_roles.key.valid\x122subject must be empty string, '*', or a valid UUID\x1a~this.all(k, k == '' || k == '*' || k.matches('^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$'))R\x15machineRolesKeysValidB\xca\x01\n" + "\x15com.metalstack.api.v2B\x14PredefinedRulesProtoP\x01Z5github.com/metal-stack/api/go/metalstack/api/v2;apiv2\xa2\x02\x03MAX\xaa\x02\x11Metalstack.Api.V2\xca\x02\x11Metalstack\\Api\\V2\xe2\x02\x1dMetalstack\\Api\\V2\\GPBMetadata\xea\x02\x13Metalstack::Api::V2" var file_metalstack_api_v2_predefined_rules_proto_goTypes = []any{ @@ -341,10 +386,13 @@ var file_metalstack_api_v2_predefined_rules_proto_depIdxs = []int32{ 1, // 15: metalstack.api.v2.all_trimmed:extendee -> buf.validate.RepeatedRules 2, // 16: metalstack.api.v2.keys_and_values_trimmed:extendee -> buf.validate.MapRules 2, // 17: metalstack.api.v2.keys_trimmed:extendee -> buf.validate.MapRules - 18, // [18:18] is the sub-list for method output_type - 18, // [18:18] is the sub-list for method input_type - 18, // [18:18] is the sub-list for extension type_name - 0, // [0:18] is the sub-list for extension extendee + 2, // 18: metalstack.api.v2.project_roles_keys_valid:extendee -> buf.validate.MapRules + 2, // 19: metalstack.api.v2.tenant_roles_keys_valid:extendee -> buf.validate.MapRules + 2, // 20: metalstack.api.v2.machine_roles_keys_valid:extendee -> buf.validate.MapRules + 21, // [21:21] is the sub-list for method output_type + 21, // [21:21] is the sub-list for method input_type + 21, // [21:21] is the sub-list for extension type_name + 0, // [0:21] is the sub-list for extension extendee 0, // [0:0] is the sub-list for field type_name } @@ -360,7 +408,7 @@ func file_metalstack_api_v2_predefined_rules_proto_init() { RawDescriptor: unsafe.Slice(unsafe.StringData(file_metalstack_api_v2_predefined_rules_proto_rawDesc), len(file_metalstack_api_v2_predefined_rules_proto_rawDesc)), NumEnums: 0, NumMessages: 0, - NumExtensions: 18, + NumExtensions: 21, NumServices: 0, }, GoTypes: file_metalstack_api_v2_predefined_rules_proto_goTypes, diff --git a/go/metalstack/api/v2/token.pb.go b/go/metalstack/api/v2/token.pb.go index 87c6c785..0e5acb26 100644 --- a/go/metalstack/api/v2/token.pb.go +++ b/go/metalstack/api/v2/token.pb.go @@ -1098,8 +1098,7 @@ var File_metalstack_api_v2_token_proto protoreflect.FileDescriptor const file_metalstack_api_v2_token_proto_rawDesc = "" + "\n" + - "\x1dmetalstack/api/v2/token.proto\x12\x11metalstack.api.v2\x1a\x1bbuf/validate/validate.proto\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1emetalstack/api/v2/common.proto\x1a(metalstack/api/v2/predefined_rules.proto\"\x93\n" + - "\n" + + "\x1dmetalstack/api/v2/token.proto\x12\x11metalstack.api.v2\x1a\x1bbuf/validate/validate.proto\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1emetalstack/api/v2/common.proto\x1a(metalstack/api/v2/predefined_rules.proto\"\xc2\t\n" + "\x05Token\x12\x1c\n" + "\x04uuid\x18\x01 \x01(\tB\b\xbaH\x05r\x03\xb0\x01\x01R\x04uuid\x12\x1f\n" + "\x04user\x18\x02 \x01(\tB\v\xbaH\br\x06\xf8\xb3\xae\xb1\x02\x01R\x04user\x12+\n" + @@ -1109,15 +1108,15 @@ const file_metalstack_api_v2_token_proto_rawDesc = "" + "\aexpires\x18\x06 \x01(\v2\x1a.google.protobuf.TimestampR\aexpires\x127\n" + "\tissued_at\x18\a \x01(\v2\x1a.google.protobuf.TimestampR\bissuedAt\x12E\n" + "\n" + - "token_type\x18\b \x01(\x0e2\x1c.metalstack.api.v2.TokenTypeB\b\xbaH\x05\x82\x01\x02\x10\x01R\ttokenType\x12O\n" + - "\rproject_roles\x18\t \x03(\v2*.metalstack.api.v2.Token.ProjectRolesEntryR\fprojectRoles\x12L\n" + + "token_type\x18\b \x01(\x0e2\x1c.metalstack.api.v2.TokenTypeB\b\xbaH\x05\x82\x01\x02\x10\x01R\ttokenType\x12j\n" + + "\rproject_roles\x18\t \x03(\v2*.metalstack.api.v2.Token.ProjectRolesEntryB\x19\xbaH\x16\x9a\x01\x13\xc0\x95\xb8\xb1\x02\x01ȕ\xb8\xb1\x02\x01*\x05\x82\x01\x02\x10\x01R\fprojectRoles\x12g\n" + "\ftenant_roles\x18\n" + - " \x03(\v2).metalstack.api.v2.Token.TenantRolesEntryR\vtenantRoles\x12J\n" + + " \x03(\v2).metalstack.api.v2.Token.TenantRolesEntryB\x19\xbaH\x16\x9a\x01\x13\xc0\x95\xb8\xb1\x02\x01Е\xb8\xb1\x02\x01*\x05\x82\x01\x02\x10\x01R\vtenantRoles\x12J\n" + "\n" + "admin_role\x18\v \x01(\x0e2\x1c.metalstack.api.v2.AdminRoleB\b\xbaH\x05\x82\x01\x02\x10\x01H\x00R\tadminRole\x88\x01\x01\x12J\n" + "\n" + - "infra_role\x18\f \x01(\x0e2\x1c.metalstack.api.v2.InfraRoleB\b\xbaH\x05\x82\x01\x02\x10\x01H\x01R\tinfraRole\x88\x01\x01\x12O\n" + - "\rmachine_roles\x18\r \x03(\v2*.metalstack.api.v2.Token.MachineRolesEntryR\fmachineRoles\x1a_\n" + + "infra_role\x18\f \x01(\x0e2\x1c.metalstack.api.v2.InfraRoleB\b\xbaH\x05\x82\x01\x02\x10\x01H\x01R\tinfraRole\x88\x01\x01\x12j\n" + + "\rmachine_roles\x18\r \x03(\v2*.metalstack.api.v2.Token.MachineRolesEntryB\x19\xbaH\x16\x9a\x01\x13\xc0\x95\xb8\xb1\x02\x01ؕ\xb8\xb1\x02\x01*\x05\x82\x01\x02\x10\x01R\fmachineRoles\x1a_\n" + "\x11ProjectRolesEntry\x12\x10\n" + "\x03key\x18\x01 \x01(\tR\x03key\x124\n" + "\x05value\x18\x02 \x01(\x0e2\x1e.metalstack.api.v2.ProjectRoleR\x05value:\x028\x01\x1a]\n" + @@ -1126,23 +1125,20 @@ const file_metalstack_api_v2_token_proto_rawDesc = "" + "\x05value\x18\x02 \x01(\x0e2\x1d.metalstack.api.v2.TenantRoleR\x05value:\x028\x01\x1a_\n" + "\x11MachineRolesEntry\x12\x10\n" + "\x03key\x18\x01 \x01(\tR\x03key\x124\n" + - "\x05value\x18\x02 \x01(\x0e2\x1e.metalstack.api.v2.MachineRoleR\x05value:\x028\x01:\x9f\x01\xbaH\x9b\x01\x1a\x98\x01\n" + - "\x1btoken.permissions.usertoken\x12)token type user must not have permissions\x1aN(this.token_type == 2 && this.permissions.size() == 0) || this.token_type != 2B\r\n" + + "\x05value\x18\x02 \x01(\x0e2\x1e.metalstack.api.v2.MachineRoleR\x05value:\x028\x01B\r\n" + "\v_admin_roleB\r\n" + - "\v_infra_role\"\xb3\n" + - "\n" + + "\v_infra_role\"\xeb\b\n" + "\x19TokenServiceCreateRequest\x12-\n" + "\vdescription\x18\x01 \x01(\tB\v\xbaH\br\x06ȳ\xae\xb1\x02\x01R\vdescription\x12O\n" + "\vpermissions\x18\x02 \x03(\v2#.metalstack.api.v2.MethodPermissionB\b\xbaH\x05\x92\x01\x02\x10dR\vpermissions\x12G\n" + - "\aexpires\x18\x03 \x01(\v2\x19.google.protobuf.DurationB\x12\xbaH\x0f\xaa\x01\f\x1a\x05\b\x81\xe7\x84\x0f2\x03\b\xd8\x04R\aexpires\x12\x7f\n" + - "\rproject_roles\x18\x04 \x03(\v2>.metalstack.api.v2.TokenServiceCreateRequest.ProjectRolesEntryB\x1a\xbaH\x17\x9a\x01\x14\xc0\x95\xb8\xb1\x02\x01\"\x05r\x03\xb0\x01\x01*\x05\x82\x01\x02\x10\x01R\fprojectRoles\x12~\n" + - "\ftenant_roles\x18\x05 \x03(\v2=.metalstack.api.v2.TokenServiceCreateRequest.TenantRolesEntryB\x1c\xbaH\x19\x9a\x01\x16\xc0\x95\xb8\xb1\x02\x01\"\ar\x05\x10\x03\x18\x80\x01*\x05\x82\x01\x02\x10\x01R\vtenantRoles\x12J\n" + + "\aexpires\x18\x03 \x01(\v2\x19.google.protobuf.DurationB\x12\xbaH\x0f\xaa\x01\f\x1a\x05\b\x81\xe7\x84\x0f2\x03\b\xd8\x04R\aexpires\x12~\n" + + "\rproject_roles\x18\x04 \x03(\v2>.metalstack.api.v2.TokenServiceCreateRequest.ProjectRolesEntryB\x19\xbaH\x16\x9a\x01\x13\xc0\x95\xb8\xb1\x02\x01ȕ\xb8\xb1\x02\x01*\x05\x82\x01\x02\x10\x01R\fprojectRoles\x12{\n" + + "\ftenant_roles\x18\x05 \x03(\v2=.metalstack.api.v2.TokenServiceCreateRequest.TenantRolesEntryB\x19\xbaH\x16\x9a\x01\x13\xc0\x95\xb8\xb1\x02\x01Е\xb8\xb1\x02\x01*\x05\x82\x01\x02\x10\x01R\vtenantRoles\x12J\n" + "\n" + "admin_role\x18\x06 \x01(\x0e2\x1c.metalstack.api.v2.AdminRoleB\b\xbaH\x05\x82\x01\x02\x10\x01H\x00R\tadminRole\x88\x01\x01\x12J\n" + "\n" + - "infra_role\x18\a \x01(\x0e2\x1c.metalstack.api.v2.InfraRoleB\b\xbaH\x05\x82\x01\x02\x10\x01H\x01R\tinfraRole\x88\x01\x01\x12\xc1\x02\n" + - "\rmachine_roles\x18\b \x03(\v2>.metalstack.api.v2.TokenServiceCreateRequest.MachineRolesEntryB\xdb\x01\xbaH\xd7\x01\xba\x01\xc9\x01\n" + - "\x12machine_roles_keys\x123map keys must be empty string, '*', or a valid UUID\x1a~this.all(k, k == '' || k == '*' || k.matches('^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$'))\x9a\x01\a*\x05\x82\x01\x02\x10\x01R\fmachineRoles\x121\n" + + "infra_role\x18\a \x01(\x0e2\x1c.metalstack.api.v2.InfraRoleB\b\xbaH\x05\x82\x01\x02\x10\x01H\x01R\tinfraRole\x88\x01\x01\x12~\n" + + "\rmachine_roles\x18\b \x03(\v2>.metalstack.api.v2.TokenServiceCreateRequest.MachineRolesEntryB\x19\xbaH\x16\x9a\x01\x13\xc0\x95\xb8\xb1\x02\x01ؕ\xb8\xb1\x02\x01*\x05\x82\x01\x02\x10\x01R\fmachineRoles\x121\n" + "\x06labels\x18\t \x01(\v2\x19.metalstack.api.v2.LabelsR\x06labels\x1a_\n" + "\x11ProjectRolesEntry\x12\x10\n" + "\x03key\x18\x01 \x01(\tR\x03key\x124\n" + @@ -1167,22 +1163,20 @@ const file_metalstack_api_v2_token_proto_rawDesc = "" + "\x06tokens\x18\x01 \x03(\v2\x18.metalstack.api.v2.TokenR\x06tokens\"9\n" + "\x19TokenServiceRevokeRequest\x12\x1c\n" + "\x04uuid\x18\x01 \x01(\tB\b\xbaH\x05r\x03\xb0\x01\x01R\x04uuid\"\x1c\n" + - "\x1aTokenServiceRevokeResponse\"\xe1\n" + - "\n" + + "\x1aTokenServiceRevokeResponse\"\x99\t\n" + "\x19TokenServiceUpdateRequest\x12\x1c\n" + "\x04uuid\x18\x01 \x01(\tB\b\xbaH\x05r\x03\xb0\x01\x01R\x04uuid\x12F\n" + "\vupdate_meta\x18\x02 \x01(\v2\x1d.metalstack.api.v2.UpdateMetaB\x06\xbaH\x03\xc8\x01\x00R\n" + "updateMeta\x122\n" + "\vdescription\x18\x03 \x01(\tB\v\xbaH\br\x06ȳ\xae\xb1\x02\x01H\x00R\vdescription\x88\x01\x01\x12E\n" + - "\vpermissions\x18\x04 \x03(\v2#.metalstack.api.v2.MethodPermissionR\vpermissions\x12\x7f\n" + - "\rproject_roles\x18\x05 \x03(\v2>.metalstack.api.v2.TokenServiceUpdateRequest.ProjectRolesEntryB\x1a\xbaH\x17\x9a\x01\x14\xc0\x95\xb8\xb1\x02\x01\"\x05r\x03\xb0\x01\x01*\x05\x82\x01\x02\x10\x01R\fprojectRoles\x12~\n" + - "\ftenant_roles\x18\x06 \x03(\v2=.metalstack.api.v2.TokenServiceUpdateRequest.TenantRolesEntryB\x1c\xbaH\x19\x9a\x01\x16\xc0\x95\xb8\xb1\x02\x01\"\ar\x05\x10\x03\x18\x80\x01*\x05\x82\x01\x02\x10\x01R\vtenantRoles\x12J\n" + + "\vpermissions\x18\x04 \x03(\v2#.metalstack.api.v2.MethodPermissionR\vpermissions\x12~\n" + + "\rproject_roles\x18\x05 \x03(\v2>.metalstack.api.v2.TokenServiceUpdateRequest.ProjectRolesEntryB\x19\xbaH\x16\x9a\x01\x13\xc0\x95\xb8\xb1\x02\x01ȕ\xb8\xb1\x02\x01*\x05\x82\x01\x02\x10\x01R\fprojectRoles\x12{\n" + + "\ftenant_roles\x18\x06 \x03(\v2=.metalstack.api.v2.TokenServiceUpdateRequest.TenantRolesEntryB\x19\xbaH\x16\x9a\x01\x13\xc0\x95\xb8\xb1\x02\x01Е\xb8\xb1\x02\x01*\x05\x82\x01\x02\x10\x01R\vtenantRoles\x12J\n" + "\n" + "admin_role\x18\a \x01(\x0e2\x1c.metalstack.api.v2.AdminRoleB\b\xbaH\x05\x82\x01\x02\x10\x01H\x01R\tadminRole\x88\x01\x01\x12J\n" + "\n" + - "infra_role\x18\b \x01(\x0e2\x1c.metalstack.api.v2.InfraRoleB\b\xbaH\x05\x82\x01\x02\x10\x01H\x02R\tinfraRole\x88\x01\x01\x12\xc1\x02\n" + - "\rmachine_roles\x18\t \x03(\v2>.metalstack.api.v2.TokenServiceUpdateRequest.MachineRolesEntryB\xdb\x01\xbaH\xd7\x01\xba\x01\xc9\x01\n" + - "\x12machine_roles_keys\x123map keys must be empty string, '*', or a valid UUID\x1a~this.all(k, k == '' || k == '*' || k.matches('^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$'))\x9a\x01\a*\x05\x82\x01\x02\x10\x01R\fmachineRoles\x127\n" + + "infra_role\x18\b \x01(\x0e2\x1c.metalstack.api.v2.InfraRoleB\b\xbaH\x05\x82\x01\x02\x10\x01H\x02R\tinfraRole\x88\x01\x01\x12~\n" + + "\rmachine_roles\x18\t \x03(\v2>.metalstack.api.v2.TokenServiceUpdateRequest.MachineRolesEntryB\x19\xbaH\x16\x9a\x01\x13\xc0\x95\xb8\xb1\x02\x01ؕ\xb8\xb1\x02\x01*\x05\x82\x01\x02\x10\x01R\fmachineRoles\x127\n" + "\x06labels\x18\n" + " \x01(\v2\x1f.metalstack.api.v2.UpdateLabelsR\x06labels\x1a_\n" + "\x11ProjectRolesEntry\x12\x10\n" + diff --git a/go/tests/validation/token_test.go b/go/tests/validation/token_test.go index 4d5a7079..30e5f097 100644 --- a/go/tests/validation/token_test.go +++ b/go/tests/validation/token_test.go @@ -33,7 +33,7 @@ func TestValidateToken(t *testing.T) { }, wantErr: true, wantErrorMessage: `validation errors: - - project_roles["p42"]: must be a valid UUID + - project_roles: subject must be a '*', or a valid UUID - project_roles["p42"]: value must be one of the defined enum values`, }, { @@ -103,7 +103,7 @@ func TestValidateToken(t *testing.T) { }, }, wantErr: true, - wantErrorMessage: "validation error: machine_roles: map keys must be empty string, '*', or a valid UUID", + wantErrorMessage: "validation error: machine_roles: subject must be empty string, '*', or a valid UUID", }, { name: "InValid Token, api token with machineroles with invalid key", @@ -116,7 +116,7 @@ func TestValidateToken(t *testing.T) { }, }, wantErr: true, - wantErrorMessage: "validation error: machine_roles: map keys must be empty string, '*', or a valid UUID", + wantErrorMessage: "validation error: machine_roles: subject must be empty string, '*', or a valid UUID", }, { name: "InValid Token Create Request, token role not trimmed", diff --git a/js/buf/validate/validate_pb.d.ts b/js/buf/validate/validate_pb.d.ts index d69d03ff..8b4d2efb 100644 --- a/js/buf/validate/validate_pb.d.ts +++ b/js/buf/validate/validate_pb.d.ts @@ -1549,7 +1549,7 @@ export type UInt64Rules = Message<"buf.validate.UInt64Rules"> & { * message MyUInt64 { * uint64 value = 1 [ * (buf.validate.field).uint64.example = 1, - * (buf.validate.field).uint64.example = -10 + * (buf.validate.field).uint64.example = 10 * ]; * } * ``` @@ -2618,8 +2618,8 @@ export type BoolRules = Message<"buf.validate.BoolRules"> & { * ```proto * message MyBool { * bool value = 1 [ - * (buf.validate.field).bool.example = 1, - * (buf.validate.field).bool.example = 2 + * (buf.validate.field).bool.example = true, + * (buf.validate.field).bool.example = false * ]; * } * ``` @@ -2833,7 +2833,7 @@ export type StringRules = Message<"buf.validate.StringRules"> & { * ```proto * message MyString { * // must be in list ["apple", "banana"] - * string value = 1 [(buf.validate.field).string.in = "apple", (buf.validate.field).string.in = "banana"]; + * string value = 1 [(buf.validate.field).string = { in: ["apple", "banana"] }]; * } * ``` * @@ -2847,7 +2847,7 @@ export type StringRules = Message<"buf.validate.StringRules"> & { * ```proto * message MyString { * // value must not be in list ["orange", "grape"] - * string value = 1 [(buf.validate.field).string.not_in = "orange", (buf.validate.field).string.not_in = "grape"]; + * string value = 1 [(buf.validate.field).string = { not_in: ["orange", "grape"] }]; * } * ``` * @@ -3491,7 +3491,7 @@ export type BytesRules = Message<"buf.validate.BytesRules"> & { * ```proto * message MyBytes { * // value must in ["\x01\x02", "\x02\x03", "\x03\x04"] - * optional bytes value = 1 [(buf.validate.field).bytes.in = {"\x01\x02", "\x02\x03", "\x03\x04"}]; + * optional bytes value = 1 [(buf.validate.field).bytes = { in: ["\x01\x02", "\x02\x03", "\x03\x04"] }]; * } * ``` * @@ -3507,7 +3507,7 @@ export type BytesRules = Message<"buf.validate.BytesRules"> & { * ```proto * message MyBytes { * // value must not in ["\x01\x02", "\x02\x03", "\x03\x04"] - * optional bytes value = 1 [(buf.validate.field).bytes.not_in = {"\x01\x02", "\x02\x03", "\x03\x04"}]; + * optional bytes value = 1 [(buf.validate.field).bytes = { not_in: ["\x01\x02", "\x02\x03", "\x03\x04"] }]; * } * ``` * @@ -3713,8 +3713,10 @@ export type EnumRules = Message<"buf.validate.EnumRules"> & { * } * * message MyMessage { + * MyEnum value = 1 [ * (buf.validate.field).enum.example = 1, * (buf.validate.field).enum.example = 2 + * ]; * } * ``` * @@ -3948,7 +3950,7 @@ export type DurationRules = Message<"buf.validate.DurationRules"> & { * ```proto * message MyDuration { * // value must equal 5s - * google.protobuf.Duration value = 1 [(buf.validate.field).duration.const = "5s"]; + * google.protobuf.Duration value = 1 [(buf.validate.field).duration.const = { seconds: 5 }]; * } * ``` * @@ -3967,7 +3969,7 @@ export type DurationRules = Message<"buf.validate.DurationRules"> & { * ```proto * message MyDuration { * // must be less than 5s - * google.protobuf.Duration value = 1 [(buf.validate.field).duration.lt = "5s"]; + * google.protobuf.Duration value = 1 [(buf.validate.field).duration.lt = { seconds: 5 }]; * } * ``` * @@ -3984,7 +3986,7 @@ export type DurationRules = Message<"buf.validate.DurationRules"> & { * ```proto * message MyDuration { * // must be less than or equal to 10s - * google.protobuf.Duration value = 1 [(buf.validate.field).duration.lte = "10s"]; + * google.protobuf.Duration value = 1 [(buf.validate.field).duration.lte = { seconds: 10 }]; * } * ``` * @@ -4061,7 +4063,9 @@ export type DurationRules = Message<"buf.validate.DurationRules"> & { * ```proto * message MyDuration { * // must be in list [1s, 2s, 3s] - * google.protobuf.Duration value = 1 [(buf.validate.field).duration.in = ["1s", "2s", "3s"]]; + * google.protobuf.Duration value = 1 [(buf.validate.field).duration = { + * in: [{ seconds: 1 }, { seconds: 2 }, { seconds: 3 }] + * }]; * } * ``` * @@ -4077,7 +4081,9 @@ export type DurationRules = Message<"buf.validate.DurationRules"> & { * ```proto * message MyDuration { * // value must not be in list [1s, 2s, 3s] - * google.protobuf.Duration value = 1 [(buf.validate.field).duration.not_in = ["1s", "2s", "3s"]]; + * google.protobuf.Duration value = 1 [(buf.validate.field).duration = { + * not_in: [{ seconds: 1 }, { seconds: 2 }, { seconds: 3 }] + * }]; * } * ``` * @@ -4093,7 +4099,7 @@ export type DurationRules = Message<"buf.validate.DurationRules"> & { * message MyDuration { * google.protobuf.Duration value = 1 [ * (buf.validate.field).duration.example = { seconds: 1 }, - * (buf.validate.field).duration.example = { seconds: 2 }, + * (buf.validate.field).duration.example = { seconds: 2 } * ]; * } * ``` @@ -4177,7 +4183,7 @@ export type FieldMaskRules = Message<"buf.validate.FieldMaskRules"> & { * message MyFieldMask { * google.protobuf.FieldMask value = 1 [ * (buf.validate.field).field_mask.example = { paths: ["a", "b"] }, - * (buf.validate.field).field_mask.example = { paths: ["c.a", "d"] }, + * (buf.validate.field).field_mask.example = { paths: ["c.a", "d"] } * ]; * } * ``` @@ -4356,7 +4362,7 @@ export type TimestampRules = Message<"buf.validate.TimestampRules"> & { * message MyTimestamp { * google.protobuf.Timestamp value = 1 [ * (buf.validate.field).timestamp.example = { seconds: 1672444800 }, - * (buf.validate.field).timestamp.example = { seconds: 1672531200 }, + * (buf.validate.field).timestamp.example = { seconds: 1672531200 } * ]; * } * ``` @@ -4475,7 +4481,7 @@ export type Violation = Message<"buf.validate.Violation"> & { * bool b = 2 [(buf.validate.field).cel = { * id: "custom_rule", * expression: "!this ? 'b must be true': ''" - * }] + * }]; * } * ``` * @@ -4810,7 +4816,7 @@ export declare const field: GenExtension; * * ```proto * extend buf.validate.Int32Rules { - * bool is_zero [(buf.validate.predefined).cel = { + * bool is_zero = 1001 [(buf.validate.predefined).cel = { * id: "int32.is_zero", * message: "must be zero", * expression: "!rule || this == 0", diff --git a/js/buf/validate/validate_pb.js b/js/buf/validate/validate_pb.js index 766d6e7c..512b8e86 100644 --- a/js/buf/validate/validate_pb.js +++ b/js/buf/validate/validate_pb.js @@ -339,7 +339,7 @@ export const field = /*@__PURE__*/ extDesc(file_buf_validate_validate, 2); * * ```proto * extend buf.validate.Int32Rules { - * bool is_zero [(buf.validate.predefined).cel = { + * bool is_zero = 1001 [(buf.validate.predefined).cel = { * id: "int32.is_zero", * message: "must be zero", * expression: "!rule || this == 0", diff --git a/js/buf/validate/validate_pb.ts b/js/buf/validate/validate_pb.ts index 5dbd31db..20b37755 100644 --- a/js/buf/validate/validate_pb.ts +++ b/js/buf/validate/validate_pb.ts @@ -1636,7 +1636,7 @@ export type UInt64Rules = Message<"buf.validate.UInt64Rules"> & { * message MyUInt64 { * uint64 value = 1 [ * (buf.validate.field).uint64.example = 1, - * (buf.validate.field).uint64.example = -10 + * (buf.validate.field).uint64.example = 10 * ]; * } * ``` @@ -2721,8 +2721,8 @@ export type BoolRules = Message<"buf.validate.BoolRules"> & { * ```proto * message MyBool { * bool value = 1 [ - * (buf.validate.field).bool.example = 1, - * (buf.validate.field).bool.example = 2 + * (buf.validate.field).bool.example = true, + * (buf.validate.field).bool.example = false * ]; * } * ``` @@ -2951,7 +2951,7 @@ export type StringRules = Message<"buf.validate.StringRules"> & { * ```proto * message MyString { * // must be in list ["apple", "banana"] - * string value = 1 [(buf.validate.field).string.in = "apple", (buf.validate.field).string.in = "banana"]; + * string value = 1 [(buf.validate.field).string = { in: ["apple", "banana"] }]; * } * ``` * @@ -2966,7 +2966,7 @@ export type StringRules = Message<"buf.validate.StringRules"> & { * ```proto * message MyString { * // value must not be in list ["orange", "grape"] - * string value = 1 [(buf.validate.field).string.not_in = "orange", (buf.validate.field).string.not_in = "grape"]; + * string value = 1 [(buf.validate.field).string = { not_in: ["orange", "grape"] }]; * } * ``` * @@ -3621,7 +3621,7 @@ export type BytesRules = Message<"buf.validate.BytesRules"> & { * ```proto * message MyBytes { * // value must in ["\x01\x02", "\x02\x03", "\x03\x04"] - * optional bytes value = 1 [(buf.validate.field).bytes.in = {"\x01\x02", "\x02\x03", "\x03\x04"}]; + * optional bytes value = 1 [(buf.validate.field).bytes = { in: ["\x01\x02", "\x02\x03", "\x03\x04"] }]; * } * ``` * @@ -3638,7 +3638,7 @@ export type BytesRules = Message<"buf.validate.BytesRules"> & { * ```proto * message MyBytes { * // value must not in ["\x01\x02", "\x02\x03", "\x03\x04"] - * optional bytes value = 1 [(buf.validate.field).bytes.not_in = {"\x01\x02", "\x02\x03", "\x03\x04"}]; + * optional bytes value = 1 [(buf.validate.field).bytes = { not_in: ["\x01\x02", "\x02\x03", "\x03\x04"] }]; * } * ``` * @@ -3850,8 +3850,10 @@ export type EnumRules = Message<"buf.validate.EnumRules"> & { * } * * message MyMessage { + * MyEnum value = 1 [ * (buf.validate.field).enum.example = 1, * (buf.validate.field).enum.example = 2 + * ]; * } * ``` * @@ -4104,7 +4106,7 @@ export type DurationRules = Message<"buf.validate.DurationRules"> & { * ```proto * message MyDuration { * // value must equal 5s - * google.protobuf.Duration value = 1 [(buf.validate.field).duration.const = "5s"]; + * google.protobuf.Duration value = 1 [(buf.validate.field).duration.const = { seconds: 5 }]; * } * ``` * @@ -4124,7 +4126,7 @@ export type DurationRules = Message<"buf.validate.DurationRules"> & { * ```proto * message MyDuration { * // must be less than 5s - * google.protobuf.Duration value = 1 [(buf.validate.field).duration.lt = "5s"]; + * google.protobuf.Duration value = 1 [(buf.validate.field).duration.lt = { seconds: 5 }]; * } * ``` * @@ -4141,7 +4143,7 @@ export type DurationRules = Message<"buf.validate.DurationRules"> & { * ```proto * message MyDuration { * // must be less than or equal to 10s - * google.protobuf.Duration value = 1 [(buf.validate.field).duration.lte = "10s"]; + * google.protobuf.Duration value = 1 [(buf.validate.field).duration.lte = { seconds: 10 }]; * } * ``` * @@ -4214,7 +4216,9 @@ export type DurationRules = Message<"buf.validate.DurationRules"> & { * ```proto * message MyDuration { * // must be in list [1s, 2s, 3s] - * google.protobuf.Duration value = 1 [(buf.validate.field).duration.in = ["1s", "2s", "3s"]]; + * google.protobuf.Duration value = 1 [(buf.validate.field).duration = { + * in: [{ seconds: 1 }, { seconds: 2 }, { seconds: 3 }] + * }]; * } * ``` * @@ -4231,7 +4235,9 @@ export type DurationRules = Message<"buf.validate.DurationRules"> & { * ```proto * message MyDuration { * // value must not be in list [1s, 2s, 3s] - * google.protobuf.Duration value = 1 [(buf.validate.field).duration.not_in = ["1s", "2s", "3s"]]; + * google.protobuf.Duration value = 1 [(buf.validate.field).duration = { + * not_in: [{ seconds: 1 }, { seconds: 2 }, { seconds: 3 }] + * }]; * } * ``` * @@ -4248,7 +4254,7 @@ export type DurationRules = Message<"buf.validate.DurationRules"> & { * message MyDuration { * google.protobuf.Duration value = 1 [ * (buf.validate.field).duration.example = { seconds: 1 }, - * (buf.validate.field).duration.example = { seconds: 2 }, + * (buf.validate.field).duration.example = { seconds: 2 } * ]; * } * ``` @@ -4338,7 +4344,7 @@ export type FieldMaskRules = Message<"buf.validate.FieldMaskRules"> & { * message MyFieldMask { * google.protobuf.FieldMask value = 1 [ * (buf.validate.field).field_mask.example = { paths: ["a", "b"] }, - * (buf.validate.field).field_mask.example = { paths: ["c.a", "d"] }, + * (buf.validate.field).field_mask.example = { paths: ["c.a", "d"] } * ]; * } * ``` @@ -4518,7 +4524,7 @@ export type TimestampRules = Message<"buf.validate.TimestampRules"> & { * message MyTimestamp { * google.protobuf.Timestamp value = 1 [ * (buf.validate.field).timestamp.example = { seconds: 1672444800 }, - * (buf.validate.field).timestamp.example = { seconds: 1672531200 }, + * (buf.validate.field).timestamp.example = { seconds: 1672531200 } * ]; * } * ``` @@ -4644,7 +4650,7 @@ export type Violation = Message<"buf.validate.Violation"> & { * bool b = 2 [(buf.validate.field).cel = { * id: "custom_rule", * expression: "!this ? 'b must be true': ''" - * }] + * }]; * } * ``` * @@ -5009,7 +5015,7 @@ export const field: GenExtension = /*@__PURE__*/ * * ```proto * extend buf.validate.Int32Rules { - * bool is_zero [(buf.validate.predefined).cel = { + * bool is_zero = 1001 [(buf.validate.predefined).cel = { * id: "int32.is_zero", * message: "must be zero", * expression: "!rule || this == 0", diff --git a/js/metalstack/api/v2/predefined_rules_pb.d.ts b/js/metalstack/api/v2/predefined_rules_pb.d.ts index f9d13cf0..adcf8083 100644 --- a/js/metalstack/api/v2/predefined_rules_pb.d.ts +++ b/js/metalstack/api/v2/predefined_rules_pb.d.ts @@ -112,3 +112,21 @@ export declare const keys_and_values_trimmed: GenExtension; * @generated from extension: optional bool keys_trimmed = 80068952; */ export declare const keys_trimmed: GenExtension; +/** + * ProjectRolesKeysValid ensures that project roles keys met our requirements + * + * @generated from extension: optional bool project_roles_keys_valid = 80068953; + */ +export declare const project_roles_keys_valid: GenExtension; +/** + * TenantRolesKeysValid ensures that tenant roles keys met our requirements + * + * @generated from extension: optional bool tenant_roles_keys_valid = 80068954; + */ +export declare const tenant_roles_keys_valid: GenExtension; +/** + * MachineRolesKeysValid ensures that machine roles keys met our requirements + * + * @generated from extension: optional bool machine_roles_keys_valid = 80068955; + */ +export declare const machine_roles_keys_valid: GenExtension; diff --git a/js/metalstack/api/v2/predefined_rules_pb.js b/js/metalstack/api/v2/predefined_rules_pb.js index 7aac13fd..1fde5a62 100644 --- a/js/metalstack/api/v2/predefined_rules_pb.js +++ b/js/metalstack/api/v2/predefined_rules_pb.js @@ -6,7 +6,7 @@ import { file_buf_validate_validate } from "../../../buf/validate/validate_pb"; /** * Describes the file metalstack/api/v2/predefined_rules.proto. */ -export const file_metalstack_api_v2_predefined_rules = /*@__PURE__*/ fileDesc("CihtZXRhbHN0YWNrL2FwaS92Mi9wcmVkZWZpbmVkX3J1bGVzLnByb3RvEhFtZXRhbHN0YWNrLmFwaS52Mjq4AQoKbWFjYWRkcmVzcxIZLmJ1Zi52YWxpZGF0ZS5TdHJpbmdSdWxlcxi35pUmIAEoCEJ6wkh3CnUKEXN0cmluZy5tYWNhZGRyZXNzEiZ0aGlzIHN0cmluZyBtdXN0IGJlIGEgdmFsaWQgbWFjYWRkcmVzcxo4dGhpcy5tYXRjaGVzKCdeKFswLTlBLUZhLWZdezJ9WzpdKXs1fShbMC05QS1GYS1mXXsyfSkkJylSCm1hY2FkZHJlc3M6mQEKB2lzX25hbWUSGS5idWYudmFsaWRhdGUuU3RyaW5nUnVsZXMYuOaVJiABKAhCYsJIXwpdCg5zdHJpbmcuaXNfbmFtZRIjbXVzdCBiZSB3aXRoaW4gMiBhbmQgMTI4IGNoYXJhY3RlcnMaJnRoaXMuc2l6ZSgpID49IDIgJiYgdGhpcy5zaXplKCkgPD0gMTI4UgZpc05hbWU6mgEKDmlzX2Rlc2NyaXB0aW9uEhkuYnVmLnZhbGlkYXRlLlN0cmluZ1J1bGVzGLnmlSYgASgIQlXCSFIKUAoVc3RyaW5nLmlzX2Rlc2NyaXB0aW9uEiNtdXN0IGJlIHNob3J0ZXIgdGhhbiAyNTYgY2hhcmFjdGVycxoSdGhpcy5zaXplKCkgPD0gMjU2Ug1pc0Rlc2NyaXB0aW9uOqgBCgxpc19wYXJ0aXRpb24SGS5idWYudmFsaWRhdGUuU3RyaW5nUnVsZXMYuuaVJiABKAhCZ8JIZApiChNzdHJpbmcuaXNfcGFydGl0aW9uEiNtdXN0IGJlIHdpdGhpbiAyIGFuZCAxMjggY2hhcmFjdGVycxomdGhpcy5zaXplKCkgPj0gMiAmJiB0aGlzLnNpemUoKSA8PSAxMjhSC2lzUGFydGl0aW9uOoIBCglpc19wcmVmaXgSGS5idWYudmFsaWRhdGUuU3RyaW5nUnVsZXMYu+aVJiABKAhCR8JIRApCCg9zdHJpbmcucHJlZml4ZXMSHGdpdmVuIHByZWZpeGVzIG11c3QgYmUgdmFsaWQaEXRoaXMuaXNJcFByZWZpeCgpUghpc1ByZWZpeDptCgZpc191cmkSGS5idWYudmFsaWRhdGUuU3RyaW5nUnVsZXMYvOaVJiABKAhCOMJINQozCgpzdHJpbmcudXJpEhdnaXZlbiB1cmkgbXVzdCBiZSB2YWxpZBoMdGhpcy5pc1VyaSgpUgVpc1VyaTqnAQoRaXNfaXBfb3JfaG9zdG5hbWUSGS5idWYudmFsaWRhdGUuU3RyaW5nUnVsZXMYveaVJiABKAhCXsJIWwpZCg12YWxpZF9hZGRyZXNzEiZtdXN0IGJlIGEgdmFsaWQgSVAgYWRkcmVzcyBvciBob3N0bmFtZRogdGhpcy5pc0lwKCkgfHwgdGhpcy5pc0hvc3RuYW1lKClSDmlzSXBPckhvc3RuYW1lOp0BCgd0cmltbWVkEhkuYnVmLnZhbGlkYXRlLlN0cmluZ1J1bGVzGL7mlSYgASgIQmXCSGIKYAoOc3RyaW5nLnRyaW1tZWQSK3ZhbHVlIG11c3Qgbm90IHN0YXJ0IG9yIGVuZCB3aXRoIHdoaXRlc3BhY2UaIXRoaXMudHJpbSgpLnNpemUoKSA9PSB0aGlzLnNpemUoKVIHdHJpbW1lZDqZAQoHaXNfdXNlchIZLmJ1Zi52YWxpZGF0ZS5TdHJpbmdSdWxlcxi/5pUmIAEoCEJiwkhfCl0KDnN0cmluZy5pc191c2VyEiNtdXN0IGJlIHdpdGhpbiAyIGFuZCA1MTIgY2hhcmFjdGVycxomdGhpcy5zaXplKCkgPj0gMiAmJiB0aGlzLnNpemUoKSA8PSA1MTJSBmlzVXNlcjqfAQoJaXNfb3B0aW9uEhkuYnVmLnZhbGlkYXRlLlN0cmluZ1J1bGVzGMDmlSYgASgIQmTCSGEKXwoQc3RyaW5nLmlzX29wdGlvbhIjbXVzdCBiZSB3aXRoaW4gMSBhbmQgMTI4IGNoYXJhY3RlcnMaJnRoaXMuc2l6ZSgpID49IDEgJiYgdGhpcy5zaXplKCkgPD0gMTI4Ughpc09wdGlvbjqYAQoGaXNfa2V5EhkuYnVmLnZhbGlkYXRlLlN0cmluZ1J1bGVzGMHmlSYgASgIQmPCSGAKXgoNc3RyaW5nLmlzX2tleRIkbXVzdCBiZSB3aXRoaW4gMSBhbmQgODE5MiBjaGFyYWN0ZXJzGid0aGlzLnNpemUoKSA+PSAxICYmIHRoaXMuc2l6ZSgpIDw9IDgxOTJSBWlzS2V5OrABCg9pc190ZW5hbnRfbG9naW4SGS5idWYudmFsaWRhdGUuU3RyaW5nUnVsZXMYwuaVJiABKAhCasJIZwplChZzdHJpbmcuaXNfdGVuYW50X2xvZ2luEiNtdXN0IGJlIHdpdGhpbiAyIGFuZCAyNTYgY2hhcmFjdGVycxomdGhpcy5zaXplKCkgPj0gMiAmJiB0aGlzLnNpemUoKSA8PSAyNTZSDWlzVGVuYW50TG9naW46jwEKCHByZWZpeGVzEhsuYnVmLnZhbGlkYXRlLlJlcGVhdGVkUnVsZXMYx7SWJiABKAhCU8JIUApOChFyZXBlYXRlZC5wcmVmaXhlcxIcZ2l2ZW4gcHJlZml4ZXMgbXVzdCBiZSB2YWxpZBobdGhpcy5hbGwobSwgbS5pc0lwUHJlZml4KCkpUghwcmVmaXhlczp1CgNpcHMSGy5idWYudmFsaWRhdGUuUmVwZWF0ZWRSdWxlcxjItJYmIAEoCEJDwkhACj4KDHJlcGVhdGVkLmlwcxIXZ2l2ZW4gaXBzIG11c3QgYmUgdmFsaWQaFXRoaXMuYWxsKG0sIG0uaXNJcCgpKVIDaXBzOuYBChFhcmVfaG9zdF9hbmRfcG9ydBIbLmJ1Zi52YWxpZGF0ZS5SZXBlYXRlZFJ1bGVzGMm0liYgASgIQpoBwkiWAQqTAQoacmVwZWF0ZWQuYXJlX2hvc3RfYW5kX3BvcnQSUGdpdmVuIGVudHJpZXMgbXVzdCBhbGwgYmUgaW4gdGhlIGZvcm0gb2YgPGlwIHwgaG9zdD46PHBvcnQ+IGJ1dCBwb3J0IGlzIG9wdGlvbmFsGiN0aGlzLmFsbChtLCBtLmlzSG9zdEFuZFBvcnQoZmFsc2UpKVIOYXJlSG9zdEFuZFBvcnQ6ugEKC2FsbF90cmltbWVkEhsuYnVmLnZhbGlkYXRlLlJlcGVhdGVkUnVsZXMYyrSWJiABKAhCecJIdgp0ChRyZXBlYXRlZC5hbGxfdHJpbW1lZBIyZ2l2ZW4gdmFsdWVzIG11c3Qgbm90IHN0YXJ0IG9yIGVuZCB3aXRoIHdoaXRlc3BhY2UaKHRoaXMuYWxsKG0sIG0udHJpbSgpLnNpemUoKSA9PSBtLnNpemUoKSlSCmFsbFRyaW1tZWQ6hAIKF2tleXNfYW5kX3ZhbHVlc190cmltbWVkEhYuYnVmLnZhbGlkYXRlLk1hcFJ1bGVzGNeClyYgASgIQrEBwkitAQqqAQobbWFwLmtleXNfYW5kX3ZhbHVlc190cmltbWVkEjVrZXlzIGFuZCB2YWx1ZXMgbXVzdCBub3Qgc3RhcnQgb3IgZW5kIHdpdGggd2hpdGVzcGFjZRpUdGhpcy5hbGwoaywgay50cmltKCkuc2l6ZSgpID09IGsuc2l6ZSgpKSAmJiB0aGlzLmFsbCh2LCB2LnRyaW0oKS5zaXplKCkgPT0gdi5zaXplKCkpUhRrZXlzQW5kVmFsdWVzVHJpbW1lZDqrAQoMa2V5c190cmltbWVkEhYuYnVmLnZhbGlkYXRlLk1hcFJ1bGVzGNiClyYgASgIQm3CSGoKaAoQbWFwLmtleXNfdHJpbW1lZBIqa2V5cyBtdXN0IG5vdCBzdGFydCBvciBlbmQgd2l0aCB3aGl0ZXNwYWNlGih0aGlzLmFsbChrLCBrLnRyaW0oKS5zaXplKCkgPT0gay5zaXplKCkpUgtrZXlzVHJpbW1lZELKAQoVY29tLm1ldGFsc3RhY2suYXBpLnYyQhRQcmVkZWZpbmVkUnVsZXNQcm90b1ABWjVnaXRodWIuY29tL21ldGFsLXN0YWNrL2FwaS9nby9tZXRhbHN0YWNrL2FwaS92MjthcGl2MqICA01BWKoCEU1ldGFsc3RhY2suQXBpLlYyygIRTWV0YWxzdGFja1xBcGlcVjLiAh1NZXRhbHN0YWNrXEFwaVxWMlxHUEJNZXRhZGF0YeoCE01ldGFsc3RhY2s6OkFwaTo6VjI", [file_buf_validate_validate]); +export const file_metalstack_api_v2_predefined_rules = /*@__PURE__*/ fileDesc("CihtZXRhbHN0YWNrL2FwaS92Mi9wcmVkZWZpbmVkX3J1bGVzLnByb3RvEhFtZXRhbHN0YWNrLmFwaS52Mjq4AQoKbWFjYWRkcmVzcxIZLmJ1Zi52YWxpZGF0ZS5TdHJpbmdSdWxlcxi35pUmIAEoCEJ6wkh3CnUKEXN0cmluZy5tYWNhZGRyZXNzEiZ0aGlzIHN0cmluZyBtdXN0IGJlIGEgdmFsaWQgbWFjYWRkcmVzcxo4dGhpcy5tYXRjaGVzKCdeKFswLTlBLUZhLWZdezJ9WzpdKXs1fShbMC05QS1GYS1mXXsyfSkkJylSCm1hY2FkZHJlc3M6mQEKB2lzX25hbWUSGS5idWYudmFsaWRhdGUuU3RyaW5nUnVsZXMYuOaVJiABKAhCYsJIXwpdCg5zdHJpbmcuaXNfbmFtZRIjbXVzdCBiZSB3aXRoaW4gMiBhbmQgMTI4IGNoYXJhY3RlcnMaJnRoaXMuc2l6ZSgpID49IDIgJiYgdGhpcy5zaXplKCkgPD0gMTI4UgZpc05hbWU6mgEKDmlzX2Rlc2NyaXB0aW9uEhkuYnVmLnZhbGlkYXRlLlN0cmluZ1J1bGVzGLnmlSYgASgIQlXCSFIKUAoVc3RyaW5nLmlzX2Rlc2NyaXB0aW9uEiNtdXN0IGJlIHNob3J0ZXIgdGhhbiAyNTYgY2hhcmFjdGVycxoSdGhpcy5zaXplKCkgPD0gMjU2Ug1pc0Rlc2NyaXB0aW9uOqgBCgxpc19wYXJ0aXRpb24SGS5idWYudmFsaWRhdGUuU3RyaW5nUnVsZXMYuuaVJiABKAhCZ8JIZApiChNzdHJpbmcuaXNfcGFydGl0aW9uEiNtdXN0IGJlIHdpdGhpbiAyIGFuZCAxMjggY2hhcmFjdGVycxomdGhpcy5zaXplKCkgPj0gMiAmJiB0aGlzLnNpemUoKSA8PSAxMjhSC2lzUGFydGl0aW9uOoIBCglpc19wcmVmaXgSGS5idWYudmFsaWRhdGUuU3RyaW5nUnVsZXMYu+aVJiABKAhCR8JIRApCCg9zdHJpbmcucHJlZml4ZXMSHGdpdmVuIHByZWZpeGVzIG11c3QgYmUgdmFsaWQaEXRoaXMuaXNJcFByZWZpeCgpUghpc1ByZWZpeDptCgZpc191cmkSGS5idWYudmFsaWRhdGUuU3RyaW5nUnVsZXMYvOaVJiABKAhCOMJINQozCgpzdHJpbmcudXJpEhdnaXZlbiB1cmkgbXVzdCBiZSB2YWxpZBoMdGhpcy5pc1VyaSgpUgVpc1VyaTqnAQoRaXNfaXBfb3JfaG9zdG5hbWUSGS5idWYudmFsaWRhdGUuU3RyaW5nUnVsZXMYveaVJiABKAhCXsJIWwpZCg12YWxpZF9hZGRyZXNzEiZtdXN0IGJlIGEgdmFsaWQgSVAgYWRkcmVzcyBvciBob3N0bmFtZRogdGhpcy5pc0lwKCkgfHwgdGhpcy5pc0hvc3RuYW1lKClSDmlzSXBPckhvc3RuYW1lOp0BCgd0cmltbWVkEhkuYnVmLnZhbGlkYXRlLlN0cmluZ1J1bGVzGL7mlSYgASgIQmXCSGIKYAoOc3RyaW5nLnRyaW1tZWQSK3ZhbHVlIG11c3Qgbm90IHN0YXJ0IG9yIGVuZCB3aXRoIHdoaXRlc3BhY2UaIXRoaXMudHJpbSgpLnNpemUoKSA9PSB0aGlzLnNpemUoKVIHdHJpbW1lZDqZAQoHaXNfdXNlchIZLmJ1Zi52YWxpZGF0ZS5TdHJpbmdSdWxlcxi/5pUmIAEoCEJiwkhfCl0KDnN0cmluZy5pc191c2VyEiNtdXN0IGJlIHdpdGhpbiAyIGFuZCA1MTIgY2hhcmFjdGVycxomdGhpcy5zaXplKCkgPj0gMiAmJiB0aGlzLnNpemUoKSA8PSA1MTJSBmlzVXNlcjqfAQoJaXNfb3B0aW9uEhkuYnVmLnZhbGlkYXRlLlN0cmluZ1J1bGVzGMDmlSYgASgIQmTCSGEKXwoQc3RyaW5nLmlzX29wdGlvbhIjbXVzdCBiZSB3aXRoaW4gMSBhbmQgMTI4IGNoYXJhY3RlcnMaJnRoaXMuc2l6ZSgpID49IDEgJiYgdGhpcy5zaXplKCkgPD0gMTI4Ughpc09wdGlvbjqYAQoGaXNfa2V5EhkuYnVmLnZhbGlkYXRlLlN0cmluZ1J1bGVzGMHmlSYgASgIQmPCSGAKXgoNc3RyaW5nLmlzX2tleRIkbXVzdCBiZSB3aXRoaW4gMSBhbmQgODE5MiBjaGFyYWN0ZXJzGid0aGlzLnNpemUoKSA+PSAxICYmIHRoaXMuc2l6ZSgpIDw9IDgxOTJSBWlzS2V5OrABCg9pc190ZW5hbnRfbG9naW4SGS5idWYudmFsaWRhdGUuU3RyaW5nUnVsZXMYwuaVJiABKAhCasJIZwplChZzdHJpbmcuaXNfdGVuYW50X2xvZ2luEiNtdXN0IGJlIHdpdGhpbiAyIGFuZCAyNTYgY2hhcmFjdGVycxomdGhpcy5zaXplKCkgPj0gMiAmJiB0aGlzLnNpemUoKSA8PSAyNTZSDWlzVGVuYW50TG9naW46jwEKCHByZWZpeGVzEhsuYnVmLnZhbGlkYXRlLlJlcGVhdGVkUnVsZXMYx7SWJiABKAhCU8JIUApOChFyZXBlYXRlZC5wcmVmaXhlcxIcZ2l2ZW4gcHJlZml4ZXMgbXVzdCBiZSB2YWxpZBobdGhpcy5hbGwobSwgbS5pc0lwUHJlZml4KCkpUghwcmVmaXhlczp1CgNpcHMSGy5idWYudmFsaWRhdGUuUmVwZWF0ZWRSdWxlcxjItJYmIAEoCEJDwkhACj4KDHJlcGVhdGVkLmlwcxIXZ2l2ZW4gaXBzIG11c3QgYmUgdmFsaWQaFXRoaXMuYWxsKG0sIG0uaXNJcCgpKVIDaXBzOuYBChFhcmVfaG9zdF9hbmRfcG9ydBIbLmJ1Zi52YWxpZGF0ZS5SZXBlYXRlZFJ1bGVzGMm0liYgASgIQpoBwkiWAQqTAQoacmVwZWF0ZWQuYXJlX2hvc3RfYW5kX3BvcnQSUGdpdmVuIGVudHJpZXMgbXVzdCBhbGwgYmUgaW4gdGhlIGZvcm0gb2YgPGlwIHwgaG9zdD46PHBvcnQ+IGJ1dCBwb3J0IGlzIG9wdGlvbmFsGiN0aGlzLmFsbChtLCBtLmlzSG9zdEFuZFBvcnQoZmFsc2UpKVIOYXJlSG9zdEFuZFBvcnQ6ugEKC2FsbF90cmltbWVkEhsuYnVmLnZhbGlkYXRlLlJlcGVhdGVkUnVsZXMYyrSWJiABKAhCecJIdgp0ChRyZXBlYXRlZC5hbGxfdHJpbW1lZBIyZ2l2ZW4gdmFsdWVzIG11c3Qgbm90IHN0YXJ0IG9yIGVuZCB3aXRoIHdoaXRlc3BhY2UaKHRoaXMuYWxsKG0sIG0udHJpbSgpLnNpemUoKSA9PSBtLnNpemUoKSlSCmFsbFRyaW1tZWQ6hAIKF2tleXNfYW5kX3ZhbHVlc190cmltbWVkEhYuYnVmLnZhbGlkYXRlLk1hcFJ1bGVzGNeClyYgASgIQrEBwkitAQqqAQobbWFwLmtleXNfYW5kX3ZhbHVlc190cmltbWVkEjVrZXlzIGFuZCB2YWx1ZXMgbXVzdCBub3Qgc3RhcnQgb3IgZW5kIHdpdGggd2hpdGVzcGFjZRpUdGhpcy5hbGwoaywgay50cmltKCkuc2l6ZSgpID09IGsuc2l6ZSgpKSAmJiB0aGlzLmFsbCh2LCB2LnRyaW0oKS5zaXplKCkgPT0gdi5zaXplKCkpUhRrZXlzQW5kVmFsdWVzVHJpbW1lZDqrAQoMa2V5c190cmltbWVkEhYuYnVmLnZhbGlkYXRlLk1hcFJ1bGVzGNiClyYgASgIQm3CSGoKaAoQbWFwLmtleXNfdHJpbW1lZBIqa2V5cyBtdXN0IG5vdCBzdGFydCBvciBlbmQgd2l0aCB3aGl0ZXNwYWNlGih0aGlzLmFsbChrLCBrLnRyaW0oKS5zaXplKCkgPT0gay5zaXplKCkpUgtrZXlzVHJpbW1lZDqSAgoYcHJvamVjdF9yb2xlc19rZXlzX3ZhbGlkEhYuYnVmLnZhbGlkYXRlLk1hcFJ1bGVzGNmClyYgASgIQr0Bwki5AQq2AQoXcHJvamVjdF9yb2xlcy5rZXkudmFsaWQSJnN1YmplY3QgbXVzdCBiZSBhICcqJywgb3IgYSB2YWxpZCBVVUlEGnN0aGlzLmFsbChrLCBrID09ICcqJyB8fCBrLm1hdGNoZXMoJ15bMC05YS1mQS1GXXs4fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXsxMn0kJykpUhVwcm9qZWN0Um9sZXNLZXlzVmFsaWQ66AEKF3RlbmFudF9yb2xlc19rZXlzX3ZhbGlkEhYuYnVmLnZhbGlkYXRlLk1hcFJ1bGVzGNqClyYgASgIQpUBwkiRAQqOAQoWdGVuYW50X3JvbGVzLmtleS52YWxpZBIzc3ViamVjdCBtdXN0IGJlICcqJyBvciBiZXR3ZWVuIDIgYW5kIDEyOCBjaGFyYWN0ZXJzGj90aGlzLmFsbChrLCBrID09ICcqJyB8fCB0aGlzLnNpemUoKSA+PSAyIHx8IHRoaXMuc2l6ZSgpIDw9MTI4IClSFHRlbmFudFJvbGVzS2V5c1ZhbGlkOqkCChhtYWNoaW5lX3JvbGVzX2tleXNfdmFsaWQSFi5idWYudmFsaWRhdGUuTWFwUnVsZXMY24KXJiABKAhC1AHCSNABCs0BChdtYWNoaW5lX3JvbGVzLmtleS52YWxpZBIyc3ViamVjdCBtdXN0IGJlIGVtcHR5IHN0cmluZywgJyonLCBvciBhIHZhbGlkIFVVSUQafnRoaXMuYWxsKGssIGsgPT0gJycgfHwgayA9PSAnKicgfHwgay5tYXRjaGVzKCdeWzAtOWEtZkEtRl17OH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17MTJ9JCcpKVIVbWFjaGluZVJvbGVzS2V5c1ZhbGlkQsoBChVjb20ubWV0YWxzdGFjay5hcGkudjJCFFByZWRlZmluZWRSdWxlc1Byb3RvUAFaNWdpdGh1Yi5jb20vbWV0YWwtc3RhY2svYXBpL2dvL21ldGFsc3RhY2svYXBpL3YyO2FwaXYyogIDTUFYqgIRTWV0YWxzdGFjay5BcGkuVjLKAhFNZXRhbHN0YWNrXEFwaVxWMuICHU1ldGFsc3RhY2tcQXBpXFYyXEdQQk1ldGFkYXRh6gITTWV0YWxzdGFjazo6QXBpOjpWMg", [file_buf_validate_validate]); /** * Macaddress returns true if the given string is a valid macaddress * @@ -115,3 +115,21 @@ export const keys_and_values_trimmed = /*@__PURE__*/ extDesc(file_metalstack_api * @generated from extension: optional bool keys_trimmed = 80068952; */ export const keys_trimmed = /*@__PURE__*/ extDesc(file_metalstack_api_v2_predefined_rules, 17); +/** + * ProjectRolesKeysValid ensures that project roles keys met our requirements + * + * @generated from extension: optional bool project_roles_keys_valid = 80068953; + */ +export const project_roles_keys_valid = /*@__PURE__*/ extDesc(file_metalstack_api_v2_predefined_rules, 18); +/** + * TenantRolesKeysValid ensures that tenant roles keys met our requirements + * + * @generated from extension: optional bool tenant_roles_keys_valid = 80068954; + */ +export const tenant_roles_keys_valid = /*@__PURE__*/ extDesc(file_metalstack_api_v2_predefined_rules, 19); +/** + * MachineRolesKeysValid ensures that machine roles keys met our requirements + * + * @generated from extension: optional bool machine_roles_keys_valid = 80068955; + */ +export const machine_roles_keys_valid = /*@__PURE__*/ extDesc(file_metalstack_api_v2_predefined_rules, 20); diff --git a/js/metalstack/api/v2/predefined_rules_pb.ts b/js/metalstack/api/v2/predefined_rules_pb.ts index 69305d52..d96d97f9 100644 --- a/js/metalstack/api/v2/predefined_rules_pb.ts +++ b/js/metalstack/api/v2/predefined_rules_pb.ts @@ -11,7 +11,7 @@ import { file_buf_validate_validate } from "../../../buf/validate/validate_pb"; * Describes the file metalstack/api/v2/predefined_rules.proto. */ export const file_metalstack_api_v2_predefined_rules: GenFile = /*@__PURE__*/ - fileDesc("CihtZXRhbHN0YWNrL2FwaS92Mi9wcmVkZWZpbmVkX3J1bGVzLnByb3RvEhFtZXRhbHN0YWNrLmFwaS52Mjq4AQoKbWFjYWRkcmVzcxIZLmJ1Zi52YWxpZGF0ZS5TdHJpbmdSdWxlcxi35pUmIAEoCEJ6wkh3CnUKEXN0cmluZy5tYWNhZGRyZXNzEiZ0aGlzIHN0cmluZyBtdXN0IGJlIGEgdmFsaWQgbWFjYWRkcmVzcxo4dGhpcy5tYXRjaGVzKCdeKFswLTlBLUZhLWZdezJ9WzpdKXs1fShbMC05QS1GYS1mXXsyfSkkJylSCm1hY2FkZHJlc3M6mQEKB2lzX25hbWUSGS5idWYudmFsaWRhdGUuU3RyaW5nUnVsZXMYuOaVJiABKAhCYsJIXwpdCg5zdHJpbmcuaXNfbmFtZRIjbXVzdCBiZSB3aXRoaW4gMiBhbmQgMTI4IGNoYXJhY3RlcnMaJnRoaXMuc2l6ZSgpID49IDIgJiYgdGhpcy5zaXplKCkgPD0gMTI4UgZpc05hbWU6mgEKDmlzX2Rlc2NyaXB0aW9uEhkuYnVmLnZhbGlkYXRlLlN0cmluZ1J1bGVzGLnmlSYgASgIQlXCSFIKUAoVc3RyaW5nLmlzX2Rlc2NyaXB0aW9uEiNtdXN0IGJlIHNob3J0ZXIgdGhhbiAyNTYgY2hhcmFjdGVycxoSdGhpcy5zaXplKCkgPD0gMjU2Ug1pc0Rlc2NyaXB0aW9uOqgBCgxpc19wYXJ0aXRpb24SGS5idWYudmFsaWRhdGUuU3RyaW5nUnVsZXMYuuaVJiABKAhCZ8JIZApiChNzdHJpbmcuaXNfcGFydGl0aW9uEiNtdXN0IGJlIHdpdGhpbiAyIGFuZCAxMjggY2hhcmFjdGVycxomdGhpcy5zaXplKCkgPj0gMiAmJiB0aGlzLnNpemUoKSA8PSAxMjhSC2lzUGFydGl0aW9uOoIBCglpc19wcmVmaXgSGS5idWYudmFsaWRhdGUuU3RyaW5nUnVsZXMYu+aVJiABKAhCR8JIRApCCg9zdHJpbmcucHJlZml4ZXMSHGdpdmVuIHByZWZpeGVzIG11c3QgYmUgdmFsaWQaEXRoaXMuaXNJcFByZWZpeCgpUghpc1ByZWZpeDptCgZpc191cmkSGS5idWYudmFsaWRhdGUuU3RyaW5nUnVsZXMYvOaVJiABKAhCOMJINQozCgpzdHJpbmcudXJpEhdnaXZlbiB1cmkgbXVzdCBiZSB2YWxpZBoMdGhpcy5pc1VyaSgpUgVpc1VyaTqnAQoRaXNfaXBfb3JfaG9zdG5hbWUSGS5idWYudmFsaWRhdGUuU3RyaW5nUnVsZXMYveaVJiABKAhCXsJIWwpZCg12YWxpZF9hZGRyZXNzEiZtdXN0IGJlIGEgdmFsaWQgSVAgYWRkcmVzcyBvciBob3N0bmFtZRogdGhpcy5pc0lwKCkgfHwgdGhpcy5pc0hvc3RuYW1lKClSDmlzSXBPckhvc3RuYW1lOp0BCgd0cmltbWVkEhkuYnVmLnZhbGlkYXRlLlN0cmluZ1J1bGVzGL7mlSYgASgIQmXCSGIKYAoOc3RyaW5nLnRyaW1tZWQSK3ZhbHVlIG11c3Qgbm90IHN0YXJ0IG9yIGVuZCB3aXRoIHdoaXRlc3BhY2UaIXRoaXMudHJpbSgpLnNpemUoKSA9PSB0aGlzLnNpemUoKVIHdHJpbW1lZDqZAQoHaXNfdXNlchIZLmJ1Zi52YWxpZGF0ZS5TdHJpbmdSdWxlcxi/5pUmIAEoCEJiwkhfCl0KDnN0cmluZy5pc191c2VyEiNtdXN0IGJlIHdpdGhpbiAyIGFuZCA1MTIgY2hhcmFjdGVycxomdGhpcy5zaXplKCkgPj0gMiAmJiB0aGlzLnNpemUoKSA8PSA1MTJSBmlzVXNlcjqfAQoJaXNfb3B0aW9uEhkuYnVmLnZhbGlkYXRlLlN0cmluZ1J1bGVzGMDmlSYgASgIQmTCSGEKXwoQc3RyaW5nLmlzX29wdGlvbhIjbXVzdCBiZSB3aXRoaW4gMSBhbmQgMTI4IGNoYXJhY3RlcnMaJnRoaXMuc2l6ZSgpID49IDEgJiYgdGhpcy5zaXplKCkgPD0gMTI4Ughpc09wdGlvbjqYAQoGaXNfa2V5EhkuYnVmLnZhbGlkYXRlLlN0cmluZ1J1bGVzGMHmlSYgASgIQmPCSGAKXgoNc3RyaW5nLmlzX2tleRIkbXVzdCBiZSB3aXRoaW4gMSBhbmQgODE5MiBjaGFyYWN0ZXJzGid0aGlzLnNpemUoKSA+PSAxICYmIHRoaXMuc2l6ZSgpIDw9IDgxOTJSBWlzS2V5OrABCg9pc190ZW5hbnRfbG9naW4SGS5idWYudmFsaWRhdGUuU3RyaW5nUnVsZXMYwuaVJiABKAhCasJIZwplChZzdHJpbmcuaXNfdGVuYW50X2xvZ2luEiNtdXN0IGJlIHdpdGhpbiAyIGFuZCAyNTYgY2hhcmFjdGVycxomdGhpcy5zaXplKCkgPj0gMiAmJiB0aGlzLnNpemUoKSA8PSAyNTZSDWlzVGVuYW50TG9naW46jwEKCHByZWZpeGVzEhsuYnVmLnZhbGlkYXRlLlJlcGVhdGVkUnVsZXMYx7SWJiABKAhCU8JIUApOChFyZXBlYXRlZC5wcmVmaXhlcxIcZ2l2ZW4gcHJlZml4ZXMgbXVzdCBiZSB2YWxpZBobdGhpcy5hbGwobSwgbS5pc0lwUHJlZml4KCkpUghwcmVmaXhlczp1CgNpcHMSGy5idWYudmFsaWRhdGUuUmVwZWF0ZWRSdWxlcxjItJYmIAEoCEJDwkhACj4KDHJlcGVhdGVkLmlwcxIXZ2l2ZW4gaXBzIG11c3QgYmUgdmFsaWQaFXRoaXMuYWxsKG0sIG0uaXNJcCgpKVIDaXBzOuYBChFhcmVfaG9zdF9hbmRfcG9ydBIbLmJ1Zi52YWxpZGF0ZS5SZXBlYXRlZFJ1bGVzGMm0liYgASgIQpoBwkiWAQqTAQoacmVwZWF0ZWQuYXJlX2hvc3RfYW5kX3BvcnQSUGdpdmVuIGVudHJpZXMgbXVzdCBhbGwgYmUgaW4gdGhlIGZvcm0gb2YgPGlwIHwgaG9zdD46PHBvcnQ+IGJ1dCBwb3J0IGlzIG9wdGlvbmFsGiN0aGlzLmFsbChtLCBtLmlzSG9zdEFuZFBvcnQoZmFsc2UpKVIOYXJlSG9zdEFuZFBvcnQ6ugEKC2FsbF90cmltbWVkEhsuYnVmLnZhbGlkYXRlLlJlcGVhdGVkUnVsZXMYyrSWJiABKAhCecJIdgp0ChRyZXBlYXRlZC5hbGxfdHJpbW1lZBIyZ2l2ZW4gdmFsdWVzIG11c3Qgbm90IHN0YXJ0IG9yIGVuZCB3aXRoIHdoaXRlc3BhY2UaKHRoaXMuYWxsKG0sIG0udHJpbSgpLnNpemUoKSA9PSBtLnNpemUoKSlSCmFsbFRyaW1tZWQ6hAIKF2tleXNfYW5kX3ZhbHVlc190cmltbWVkEhYuYnVmLnZhbGlkYXRlLk1hcFJ1bGVzGNeClyYgASgIQrEBwkitAQqqAQobbWFwLmtleXNfYW5kX3ZhbHVlc190cmltbWVkEjVrZXlzIGFuZCB2YWx1ZXMgbXVzdCBub3Qgc3RhcnQgb3IgZW5kIHdpdGggd2hpdGVzcGFjZRpUdGhpcy5hbGwoaywgay50cmltKCkuc2l6ZSgpID09IGsuc2l6ZSgpKSAmJiB0aGlzLmFsbCh2LCB2LnRyaW0oKS5zaXplKCkgPT0gdi5zaXplKCkpUhRrZXlzQW5kVmFsdWVzVHJpbW1lZDqrAQoMa2V5c190cmltbWVkEhYuYnVmLnZhbGlkYXRlLk1hcFJ1bGVzGNiClyYgASgIQm3CSGoKaAoQbWFwLmtleXNfdHJpbW1lZBIqa2V5cyBtdXN0IG5vdCBzdGFydCBvciBlbmQgd2l0aCB3aGl0ZXNwYWNlGih0aGlzLmFsbChrLCBrLnRyaW0oKS5zaXplKCkgPT0gay5zaXplKCkpUgtrZXlzVHJpbW1lZELKAQoVY29tLm1ldGFsc3RhY2suYXBpLnYyQhRQcmVkZWZpbmVkUnVsZXNQcm90b1ABWjVnaXRodWIuY29tL21ldGFsLXN0YWNrL2FwaS9nby9tZXRhbHN0YWNrL2FwaS92MjthcGl2MqICA01BWKoCEU1ldGFsc3RhY2suQXBpLlYyygIRTWV0YWxzdGFja1xBcGlcVjLiAh1NZXRhbHN0YWNrXEFwaVxWMlxHUEJNZXRhZGF0YeoCE01ldGFsc3RhY2s6OkFwaTo6VjI", [file_buf_validate_validate]); + fileDesc("CihtZXRhbHN0YWNrL2FwaS92Mi9wcmVkZWZpbmVkX3J1bGVzLnByb3RvEhFtZXRhbHN0YWNrLmFwaS52Mjq4AQoKbWFjYWRkcmVzcxIZLmJ1Zi52YWxpZGF0ZS5TdHJpbmdSdWxlcxi35pUmIAEoCEJ6wkh3CnUKEXN0cmluZy5tYWNhZGRyZXNzEiZ0aGlzIHN0cmluZyBtdXN0IGJlIGEgdmFsaWQgbWFjYWRkcmVzcxo4dGhpcy5tYXRjaGVzKCdeKFswLTlBLUZhLWZdezJ9WzpdKXs1fShbMC05QS1GYS1mXXsyfSkkJylSCm1hY2FkZHJlc3M6mQEKB2lzX25hbWUSGS5idWYudmFsaWRhdGUuU3RyaW5nUnVsZXMYuOaVJiABKAhCYsJIXwpdCg5zdHJpbmcuaXNfbmFtZRIjbXVzdCBiZSB3aXRoaW4gMiBhbmQgMTI4IGNoYXJhY3RlcnMaJnRoaXMuc2l6ZSgpID49IDIgJiYgdGhpcy5zaXplKCkgPD0gMTI4UgZpc05hbWU6mgEKDmlzX2Rlc2NyaXB0aW9uEhkuYnVmLnZhbGlkYXRlLlN0cmluZ1J1bGVzGLnmlSYgASgIQlXCSFIKUAoVc3RyaW5nLmlzX2Rlc2NyaXB0aW9uEiNtdXN0IGJlIHNob3J0ZXIgdGhhbiAyNTYgY2hhcmFjdGVycxoSdGhpcy5zaXplKCkgPD0gMjU2Ug1pc0Rlc2NyaXB0aW9uOqgBCgxpc19wYXJ0aXRpb24SGS5idWYudmFsaWRhdGUuU3RyaW5nUnVsZXMYuuaVJiABKAhCZ8JIZApiChNzdHJpbmcuaXNfcGFydGl0aW9uEiNtdXN0IGJlIHdpdGhpbiAyIGFuZCAxMjggY2hhcmFjdGVycxomdGhpcy5zaXplKCkgPj0gMiAmJiB0aGlzLnNpemUoKSA8PSAxMjhSC2lzUGFydGl0aW9uOoIBCglpc19wcmVmaXgSGS5idWYudmFsaWRhdGUuU3RyaW5nUnVsZXMYu+aVJiABKAhCR8JIRApCCg9zdHJpbmcucHJlZml4ZXMSHGdpdmVuIHByZWZpeGVzIG11c3QgYmUgdmFsaWQaEXRoaXMuaXNJcFByZWZpeCgpUghpc1ByZWZpeDptCgZpc191cmkSGS5idWYudmFsaWRhdGUuU3RyaW5nUnVsZXMYvOaVJiABKAhCOMJINQozCgpzdHJpbmcudXJpEhdnaXZlbiB1cmkgbXVzdCBiZSB2YWxpZBoMdGhpcy5pc1VyaSgpUgVpc1VyaTqnAQoRaXNfaXBfb3JfaG9zdG5hbWUSGS5idWYudmFsaWRhdGUuU3RyaW5nUnVsZXMYveaVJiABKAhCXsJIWwpZCg12YWxpZF9hZGRyZXNzEiZtdXN0IGJlIGEgdmFsaWQgSVAgYWRkcmVzcyBvciBob3N0bmFtZRogdGhpcy5pc0lwKCkgfHwgdGhpcy5pc0hvc3RuYW1lKClSDmlzSXBPckhvc3RuYW1lOp0BCgd0cmltbWVkEhkuYnVmLnZhbGlkYXRlLlN0cmluZ1J1bGVzGL7mlSYgASgIQmXCSGIKYAoOc3RyaW5nLnRyaW1tZWQSK3ZhbHVlIG11c3Qgbm90IHN0YXJ0IG9yIGVuZCB3aXRoIHdoaXRlc3BhY2UaIXRoaXMudHJpbSgpLnNpemUoKSA9PSB0aGlzLnNpemUoKVIHdHJpbW1lZDqZAQoHaXNfdXNlchIZLmJ1Zi52YWxpZGF0ZS5TdHJpbmdSdWxlcxi/5pUmIAEoCEJiwkhfCl0KDnN0cmluZy5pc191c2VyEiNtdXN0IGJlIHdpdGhpbiAyIGFuZCA1MTIgY2hhcmFjdGVycxomdGhpcy5zaXplKCkgPj0gMiAmJiB0aGlzLnNpemUoKSA8PSA1MTJSBmlzVXNlcjqfAQoJaXNfb3B0aW9uEhkuYnVmLnZhbGlkYXRlLlN0cmluZ1J1bGVzGMDmlSYgASgIQmTCSGEKXwoQc3RyaW5nLmlzX29wdGlvbhIjbXVzdCBiZSB3aXRoaW4gMSBhbmQgMTI4IGNoYXJhY3RlcnMaJnRoaXMuc2l6ZSgpID49IDEgJiYgdGhpcy5zaXplKCkgPD0gMTI4Ughpc09wdGlvbjqYAQoGaXNfa2V5EhkuYnVmLnZhbGlkYXRlLlN0cmluZ1J1bGVzGMHmlSYgASgIQmPCSGAKXgoNc3RyaW5nLmlzX2tleRIkbXVzdCBiZSB3aXRoaW4gMSBhbmQgODE5MiBjaGFyYWN0ZXJzGid0aGlzLnNpemUoKSA+PSAxICYmIHRoaXMuc2l6ZSgpIDw9IDgxOTJSBWlzS2V5OrABCg9pc190ZW5hbnRfbG9naW4SGS5idWYudmFsaWRhdGUuU3RyaW5nUnVsZXMYwuaVJiABKAhCasJIZwplChZzdHJpbmcuaXNfdGVuYW50X2xvZ2luEiNtdXN0IGJlIHdpdGhpbiAyIGFuZCAyNTYgY2hhcmFjdGVycxomdGhpcy5zaXplKCkgPj0gMiAmJiB0aGlzLnNpemUoKSA8PSAyNTZSDWlzVGVuYW50TG9naW46jwEKCHByZWZpeGVzEhsuYnVmLnZhbGlkYXRlLlJlcGVhdGVkUnVsZXMYx7SWJiABKAhCU8JIUApOChFyZXBlYXRlZC5wcmVmaXhlcxIcZ2l2ZW4gcHJlZml4ZXMgbXVzdCBiZSB2YWxpZBobdGhpcy5hbGwobSwgbS5pc0lwUHJlZml4KCkpUghwcmVmaXhlczp1CgNpcHMSGy5idWYudmFsaWRhdGUuUmVwZWF0ZWRSdWxlcxjItJYmIAEoCEJDwkhACj4KDHJlcGVhdGVkLmlwcxIXZ2l2ZW4gaXBzIG11c3QgYmUgdmFsaWQaFXRoaXMuYWxsKG0sIG0uaXNJcCgpKVIDaXBzOuYBChFhcmVfaG9zdF9hbmRfcG9ydBIbLmJ1Zi52YWxpZGF0ZS5SZXBlYXRlZFJ1bGVzGMm0liYgASgIQpoBwkiWAQqTAQoacmVwZWF0ZWQuYXJlX2hvc3RfYW5kX3BvcnQSUGdpdmVuIGVudHJpZXMgbXVzdCBhbGwgYmUgaW4gdGhlIGZvcm0gb2YgPGlwIHwgaG9zdD46PHBvcnQ+IGJ1dCBwb3J0IGlzIG9wdGlvbmFsGiN0aGlzLmFsbChtLCBtLmlzSG9zdEFuZFBvcnQoZmFsc2UpKVIOYXJlSG9zdEFuZFBvcnQ6ugEKC2FsbF90cmltbWVkEhsuYnVmLnZhbGlkYXRlLlJlcGVhdGVkUnVsZXMYyrSWJiABKAhCecJIdgp0ChRyZXBlYXRlZC5hbGxfdHJpbW1lZBIyZ2l2ZW4gdmFsdWVzIG11c3Qgbm90IHN0YXJ0IG9yIGVuZCB3aXRoIHdoaXRlc3BhY2UaKHRoaXMuYWxsKG0sIG0udHJpbSgpLnNpemUoKSA9PSBtLnNpemUoKSlSCmFsbFRyaW1tZWQ6hAIKF2tleXNfYW5kX3ZhbHVlc190cmltbWVkEhYuYnVmLnZhbGlkYXRlLk1hcFJ1bGVzGNeClyYgASgIQrEBwkitAQqqAQobbWFwLmtleXNfYW5kX3ZhbHVlc190cmltbWVkEjVrZXlzIGFuZCB2YWx1ZXMgbXVzdCBub3Qgc3RhcnQgb3IgZW5kIHdpdGggd2hpdGVzcGFjZRpUdGhpcy5hbGwoaywgay50cmltKCkuc2l6ZSgpID09IGsuc2l6ZSgpKSAmJiB0aGlzLmFsbCh2LCB2LnRyaW0oKS5zaXplKCkgPT0gdi5zaXplKCkpUhRrZXlzQW5kVmFsdWVzVHJpbW1lZDqrAQoMa2V5c190cmltbWVkEhYuYnVmLnZhbGlkYXRlLk1hcFJ1bGVzGNiClyYgASgIQm3CSGoKaAoQbWFwLmtleXNfdHJpbW1lZBIqa2V5cyBtdXN0IG5vdCBzdGFydCBvciBlbmQgd2l0aCB3aGl0ZXNwYWNlGih0aGlzLmFsbChrLCBrLnRyaW0oKS5zaXplKCkgPT0gay5zaXplKCkpUgtrZXlzVHJpbW1lZDqSAgoYcHJvamVjdF9yb2xlc19rZXlzX3ZhbGlkEhYuYnVmLnZhbGlkYXRlLk1hcFJ1bGVzGNmClyYgASgIQr0Bwki5AQq2AQoXcHJvamVjdF9yb2xlcy5rZXkudmFsaWQSJnN1YmplY3QgbXVzdCBiZSBhICcqJywgb3IgYSB2YWxpZCBVVUlEGnN0aGlzLmFsbChrLCBrID09ICcqJyB8fCBrLm1hdGNoZXMoJ15bMC05YS1mQS1GXXs4fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXsxMn0kJykpUhVwcm9qZWN0Um9sZXNLZXlzVmFsaWQ66AEKF3RlbmFudF9yb2xlc19rZXlzX3ZhbGlkEhYuYnVmLnZhbGlkYXRlLk1hcFJ1bGVzGNqClyYgASgIQpUBwkiRAQqOAQoWdGVuYW50X3JvbGVzLmtleS52YWxpZBIzc3ViamVjdCBtdXN0IGJlICcqJyBvciBiZXR3ZWVuIDIgYW5kIDEyOCBjaGFyYWN0ZXJzGj90aGlzLmFsbChrLCBrID09ICcqJyB8fCB0aGlzLnNpemUoKSA+PSAyIHx8IHRoaXMuc2l6ZSgpIDw9MTI4IClSFHRlbmFudFJvbGVzS2V5c1ZhbGlkOqkCChhtYWNoaW5lX3JvbGVzX2tleXNfdmFsaWQSFi5idWYudmFsaWRhdGUuTWFwUnVsZXMY24KXJiABKAhC1AHCSNABCs0BChdtYWNoaW5lX3JvbGVzLmtleS52YWxpZBIyc3ViamVjdCBtdXN0IGJlIGVtcHR5IHN0cmluZywgJyonLCBvciBhIHZhbGlkIFVVSUQafnRoaXMuYWxsKGssIGsgPT0gJycgfHwgayA9PSAnKicgfHwgay5tYXRjaGVzKCdeWzAtOWEtZkEtRl17OH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17MTJ9JCcpKVIVbWFjaGluZVJvbGVzS2V5c1ZhbGlkQsoBChVjb20ubWV0YWxzdGFjay5hcGkudjJCFFByZWRlZmluZWRSdWxlc1Byb3RvUAFaNWdpdGh1Yi5jb20vbWV0YWwtc3RhY2svYXBpL2dvL21ldGFsc3RhY2svYXBpL3YyO2FwaXYyogIDTUFYqgIRTWV0YWxzdGFjay5BcGkuVjLKAhFNZXRhbHN0YWNrXEFwaVxWMuICHU1ldGFsc3RhY2tcQXBpXFYyXEdQQk1ldGFkYXRh6gITTWV0YWxzdGFjazo6QXBpOjpWMg", [file_buf_validate_validate]); /** * Macaddress returns true if the given string is a valid macaddress @@ -157,3 +157,27 @@ export const keys_and_values_trimmed: GenExtension = /*@__PUR export const keys_trimmed: GenExtension = /*@__PURE__*/ extDesc(file_metalstack_api_v2_predefined_rules, 17); +/** + * ProjectRolesKeysValid ensures that project roles keys met our requirements + * + * @generated from extension: optional bool project_roles_keys_valid = 80068953; + */ +export const project_roles_keys_valid: GenExtension = /*@__PURE__*/ + extDesc(file_metalstack_api_v2_predefined_rules, 18); + +/** + * TenantRolesKeysValid ensures that tenant roles keys met our requirements + * + * @generated from extension: optional bool tenant_roles_keys_valid = 80068954; + */ +export const tenant_roles_keys_valid: GenExtension = /*@__PURE__*/ + extDesc(file_metalstack_api_v2_predefined_rules, 19); + +/** + * MachineRolesKeysValid ensures that machine roles keys met our requirements + * + * @generated from extension: optional bool machine_roles_keys_valid = 80068955; + */ +export const machine_roles_keys_valid: GenExtension = /*@__PURE__*/ + extDesc(file_metalstack_api_v2_predefined_rules, 20); + diff --git a/js/metalstack/api/v2/token_pb.d.ts b/js/metalstack/api/v2/token_pb.d.ts index 829a5552..e761246b 100644 --- a/js/metalstack/api/v2/token_pb.d.ts +++ b/js/metalstack/api/v2/token_pb.d.ts @@ -20,6 +20,8 @@ export declare const file_metalstack_api_v2_token: GenFile; * The api token should be used to authenticate services. * In contrast to a user token, the api token permissions and roles apply as configured during the token create process. * + * Message level validation, can be developed using https://protovalidate.com/playground + * * @generated from message metalstack.api.v2.Token */ export type Token = Message<"metalstack.api.v2.Token"> & { diff --git a/js/metalstack/api/v2/token_pb.js b/js/metalstack/api/v2/token_pb.js index 23ed5eba..3edb9b3a 100644 --- a/js/metalstack/api/v2/token_pb.js +++ b/js/metalstack/api/v2/token_pb.js @@ -9,7 +9,7 @@ import { file_metalstack_api_v2_predefined_rules } from "./predefined_rules_pb"; /** * Describes the file metalstack/api/v2/token.proto. */ -export const file_metalstack_api_v2_token = /*@__PURE__*/ fileDesc("Ch1tZXRhbHN0YWNrL2FwaS92Mi90b2tlbi5wcm90bxIRbWV0YWxzdGFjay5hcGkudjIi5ggKBVRva2VuEhYKBHV1aWQYASABKAlCCLpIBXIDsAEBEhkKBHVzZXIYAiABKAlCC7pICHIG+LOusQIBEiUKBG1ldGEYAyABKAsyFy5tZXRhbHN0YWNrLmFwaS52Mi5NZXRhEiAKC2Rlc2NyaXB0aW9uGAQgASgJQgu6SAhyBsizrrECARJDCgtwZXJtaXNzaW9ucxgFIAMoCzIjLm1ldGFsc3RhY2suYXBpLnYyLk1ldGhvZFBlcm1pc3Npb25CCbpIBpIBAxD0AxIrCgdleHBpcmVzGAYgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBItCglpc3N1ZWRfYXQYByABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEjoKCnRva2VuX3R5cGUYCCABKA4yHC5tZXRhbHN0YWNrLmFwaS52Mi5Ub2tlblR5cGVCCLpIBYIBAhABEkEKDXByb2plY3Rfcm9sZXMYCSADKAsyKi5tZXRhbHN0YWNrLmFwaS52Mi5Ub2tlbi5Qcm9qZWN0Um9sZXNFbnRyeRI/Cgx0ZW5hbnRfcm9sZXMYCiADKAsyKS5tZXRhbHN0YWNrLmFwaS52Mi5Ub2tlbi5UZW5hbnRSb2xlc0VudHJ5Ej8KCmFkbWluX3JvbGUYCyABKA4yHC5tZXRhbHN0YWNrLmFwaS52Mi5BZG1pblJvbGVCCLpIBYIBAhABSACIAQESPwoKaW5mcmFfcm9sZRgMIAEoDjIcLm1ldGFsc3RhY2suYXBpLnYyLkluZnJhUm9sZUIIukgFggECEAFIAYgBARJBCg1tYWNoaW5lX3JvbGVzGA0gAygLMioubWV0YWxzdGFjay5hcGkudjIuVG9rZW4uTWFjaGluZVJvbGVzRW50cnkaUwoRUHJvamVjdFJvbGVzRW50cnkSCwoDa2V5GAEgASgJEi0KBXZhbHVlGAIgASgOMh4ubWV0YWxzdGFjay5hcGkudjIuUHJvamVjdFJvbGU6AjgBGlEKEFRlbmFudFJvbGVzRW50cnkSCwoDa2V5GAEgASgJEiwKBXZhbHVlGAIgASgOMh0ubWV0YWxzdGFjay5hcGkudjIuVGVuYW50Um9sZToCOAEaUwoRTWFjaGluZVJvbGVzRW50cnkSCwoDa2V5GAEgASgJEi0KBXZhbHVlGAIgASgOMh4ubWV0YWxzdGFjay5hcGkudjIuTWFjaGluZVJvbGU6AjgBOp8BukibARqYAQobdG9rZW4ucGVybWlzc2lvbnMudXNlcnRva2VuEil0b2tlbiB0eXBlIHVzZXIgbXVzdCBub3QgaGF2ZSBwZXJtaXNzaW9ucxpOKHRoaXMudG9rZW5fdHlwZSA9PSAyICYmIHRoaXMucGVybWlzc2lvbnMuc2l6ZSgpID09IDApIHx8IHRoaXMudG9rZW5fdHlwZSAhPSAyQg0KC19hZG1pbl9yb2xlQg0KC19pbmZyYV9yb2xlIqUJChlUb2tlblNlcnZpY2VDcmVhdGVSZXF1ZXN0EiAKC2Rlc2NyaXB0aW9uGAEgASgJQgu6SAhyBsizrrECARJCCgtwZXJtaXNzaW9ucxgCIAMoCzIjLm1ldGFsc3RhY2suYXBpLnYyLk1ldGhvZFBlcm1pc3Npb25CCLpIBZIBAhBkEj4KB2V4cGlyZXMYAyABKAsyGS5nb29nbGUucHJvdG9idWYuRHVyYXRpb25CErpID6oBDBoFCIHnhA8yAwjYBBJxCg1wcm9qZWN0X3JvbGVzGAQgAygLMj4ubWV0YWxzdGFjay5hcGkudjIuVG9rZW5TZXJ2aWNlQ3JlYXRlUmVxdWVzdC5Qcm9qZWN0Um9sZXNFbnRyeUIaukgXmgEUwJW4sQIBIgVyA7ABASoFggECEAEScQoMdGVuYW50X3JvbGVzGAUgAygLMj0ubWV0YWxzdGFjay5hcGkudjIuVG9rZW5TZXJ2aWNlQ3JlYXRlUmVxdWVzdC5UZW5hbnRSb2xlc0VudHJ5Qhy6SBmaARbAlbixAgEiB3IFEAMYgAEqBYIBAhABEj8KCmFkbWluX3JvbGUYBiABKA4yHC5tZXRhbHN0YWNrLmFwaS52Mi5BZG1pblJvbGVCCLpIBYIBAhABSACIAQESPwoKaW5mcmFfcm9sZRgHIAEoDjIcLm1ldGFsc3RhY2suYXBpLnYyLkluZnJhUm9sZUIIukgFggECEAFIAYgBARKzAgoNbWFjaGluZV9yb2xlcxgIIAMoCzI+Lm1ldGFsc3RhY2suYXBpLnYyLlRva2VuU2VydmljZUNyZWF0ZVJlcXVlc3QuTWFjaGluZVJvbGVzRW50cnlC2wG6SNcBugHJAQoSbWFjaGluZV9yb2xlc19rZXlzEjNtYXAga2V5cyBtdXN0IGJlIGVtcHR5IHN0cmluZywgJyonLCBvciBhIHZhbGlkIFVVSUQafnRoaXMuYWxsKGssIGsgPT0gJycgfHwgayA9PSAnKicgfHwgay5tYXRjaGVzKCdeWzAtOWEtZkEtRl17OH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17MTJ9JCcpKZoBByoFggECEAESKQoGbGFiZWxzGAkgASgLMhkubWV0YWxzdGFjay5hcGkudjIuTGFiZWxzGlMKEVByb2plY3RSb2xlc0VudHJ5EgsKA2tleRgBIAEoCRItCgV2YWx1ZRgCIAEoDjIeLm1ldGFsc3RhY2suYXBpLnYyLlByb2plY3RSb2xlOgI4ARpRChBUZW5hbnRSb2xlc0VudHJ5EgsKA2tleRgBIAEoCRIsCgV2YWx1ZRgCIAEoDjIdLm1ldGFsc3RhY2suYXBpLnYyLlRlbmFudFJvbGU6AjgBGlMKEU1hY2hpbmVSb2xlc0VudHJ5EgsKA2tleRgBIAEoCRItCgV2YWx1ZRgCIAEoDjIeLm1ldGFsc3RhY2suYXBpLnYyLk1hY2hpbmVSb2xlOgI4AUINCgtfYWRtaW5fcm9sZUINCgtfaW5mcmFfcm9sZSJJChBNZXRob2RQZXJtaXNzaW9uEhkKB3N1YmplY3QYASABKAlCCLpIBXIDGIACEhoKB21ldGhvZHMYAiADKAlCCbpIBpIBAxD0AyJVChpUb2tlblNlcnZpY2VDcmVhdGVSZXNwb25zZRInCgV0b2tlbhgBIAEoCzIYLm1ldGFsc3RhY2suYXBpLnYyLlRva2VuEg4KBnNlY3JldBgCIAEoCSJHChdUb2tlblNlcnZpY2VMaXN0UmVxdWVzdBIsCgVxdWVyeRgBIAEoCzIdLm1ldGFsc3RhY2suYXBpLnYyLlRva2VuUXVlcnkiRAoYVG9rZW5TZXJ2aWNlTGlzdFJlc3BvbnNlEigKBnRva2VucxgBIAMoCzIYLm1ldGFsc3RhY2suYXBpLnYyLlRva2VuIjMKGVRva2VuU2VydmljZVJldm9rZVJlcXVlc3QSFgoEdXVpZBgBIAEoCUIIukgFcgOwAQEiHAoaVG9rZW5TZXJ2aWNlUmV2b2tlUmVzcG9uc2UiygkKGVRva2VuU2VydmljZVVwZGF0ZVJlcXVlc3QSFgoEdXVpZBgBIAEoCUIIukgFcgOwAQESOgoLdXBkYXRlX21ldGEYAiABKAsyHS5tZXRhbHN0YWNrLmFwaS52Mi5VcGRhdGVNZXRhQga6SAPIAQASJQoLZGVzY3JpcHRpb24YAyABKAlCC7pICHIGyLOusQIBSACIAQESOAoLcGVybWlzc2lvbnMYBCADKAsyIy5tZXRhbHN0YWNrLmFwaS52Mi5NZXRob2RQZXJtaXNzaW9uEnEKDXByb2plY3Rfcm9sZXMYBSADKAsyPi5tZXRhbHN0YWNrLmFwaS52Mi5Ub2tlblNlcnZpY2VVcGRhdGVSZXF1ZXN0LlByb2plY3RSb2xlc0VudHJ5Qhq6SBeaARTAlbixAgEiBXIDsAEBKgWCAQIQARJxCgx0ZW5hbnRfcm9sZXMYBiADKAsyPS5tZXRhbHN0YWNrLmFwaS52Mi5Ub2tlblNlcnZpY2VVcGRhdGVSZXF1ZXN0LlRlbmFudFJvbGVzRW50cnlCHLpIGZoBFsCVuLECASIHcgUQAxiAASoFggECEAESPwoKYWRtaW5fcm9sZRgHIAEoDjIcLm1ldGFsc3RhY2suYXBpLnYyLkFkbWluUm9sZUIIukgFggECEAFIAYgBARI/CgppbmZyYV9yb2xlGAggASgOMhwubWV0YWxzdGFjay5hcGkudjIuSW5mcmFSb2xlQgi6SAWCAQIQAUgCiAEBErMCCg1tYWNoaW5lX3JvbGVzGAkgAygLMj4ubWV0YWxzdGFjay5hcGkudjIuVG9rZW5TZXJ2aWNlVXBkYXRlUmVxdWVzdC5NYWNoaW5lUm9sZXNFbnRyeULbAbpI1wG6AckBChJtYWNoaW5lX3JvbGVzX2tleXMSM21hcCBrZXlzIG11c3QgYmUgZW1wdHkgc3RyaW5nLCAnKicsIG9yIGEgdmFsaWQgVVVJRBp+dGhpcy5hbGwoaywgayA9PSAnJyB8fCBrID09ICcqJyB8fCBrLm1hdGNoZXMoJ15bMC05YS1mQS1GXXs4fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXsxMn0kJykpmgEHKgWCAQIQARIvCgZsYWJlbHMYCiABKAsyHy5tZXRhbHN0YWNrLmFwaS52Mi5VcGRhdGVMYWJlbHMaUwoRUHJvamVjdFJvbGVzRW50cnkSCwoDa2V5GAEgASgJEi0KBXZhbHVlGAIgASgOMh4ubWV0YWxzdGFjay5hcGkudjIuUHJvamVjdFJvbGU6AjgBGlEKEFRlbmFudFJvbGVzRW50cnkSCwoDa2V5GAEgASgJEiwKBXZhbHVlGAIgASgOMh0ubWV0YWxzdGFjay5hcGkudjIuVGVuYW50Um9sZToCOAEaUwoRTWFjaGluZVJvbGVzRW50cnkSCwoDa2V5GAEgASgJEi0KBXZhbHVlGAIgASgOMh4ubWV0YWxzdGFjay5hcGkudjIuTWFjaGluZVJvbGU6AjgBQg4KDF9kZXNjcmlwdGlvbkINCgtfYWRtaW5fcm9sZUINCgtfaW5mcmFfcm9sZSJFChpUb2tlblNlcnZpY2VVcGRhdGVSZXNwb25zZRInCgV0b2tlbhgBIAEoCzIYLm1ldGFsc3RhY2suYXBpLnYyLlRva2VuIjAKFlRva2VuU2VydmljZUdldFJlcXVlc3QSFgoEdXVpZBgBIAEoCUIIukgFcgOwAQEiQgoXVG9rZW5TZXJ2aWNlR2V0UmVzcG9uc2USJwoFdG9rZW4YASABKAsyGC5tZXRhbHN0YWNrLmFwaS52Mi5Ub2tlbiIcChpUb2tlblNlcnZpY2VSZWZyZXNoUmVxdWVzdCJWChtUb2tlblNlcnZpY2VSZWZyZXNoUmVzcG9uc2USJwoFdG9rZW4YASABKAsyGC5tZXRhbHN0YWNrLmFwaS52Mi5Ub2tlbhIOCgZzZWNyZXQYAiABKAkinQIKClRva2VuUXVlcnkSGwoEdXVpZBgBIAEoCUIIukgFcgOwAQFIAIgBARIeCgR1c2VyGAIgASgJQgu6SAhyBvizrrECAUgBiAEBEiUKC2Rlc2NyaXB0aW9uGAMgASgJQgu6SAhyBsizrrECAUgCiAEBEi4KBmxhYmVscxgEIAEoCzIZLm1ldGFsc3RhY2suYXBpLnYyLkxhYmVsc0gDiAEBEj8KCnRva2VuX3R5cGUYBSABKA4yHC5tZXRhbHN0YWNrLmFwaS52Mi5Ub2tlblR5cGVCCLpIBYIBAhABSASIAQFCBwoFX3V1aWRCBwoFX3VzZXJCDgoMX2Rlc2NyaXB0aW9uQgkKB19sYWJlbHNCDQoLX3Rva2VuX3R5cGUqUAoJVG9rZW5UeXBlEhoKFlRPS0VOX1RZUEVfVU5TUEVDSUZJRUQQABISCg5UT0tFTl9UWVBFX0FQSRABEhMKD1RPS0VOX1RZUEVfVVNFUhACMqgFCgxUb2tlblNlcnZpY2USZgoDR2V0EikubWV0YWxzdGFjay5hcGkudjIuVG9rZW5TZXJ2aWNlR2V0UmVxdWVzdBoqLm1ldGFsc3RhY2suYXBpLnYyLlRva2VuU2VydmljZUdldFJlc3BvbnNlIgjY8xgC4PMYARJvCgZDcmVhdGUSLC5tZXRhbHN0YWNrLmFwaS52Mi5Ub2tlblNlcnZpY2VDcmVhdGVSZXF1ZXN0Gi0ubWV0YWxzdGFjay5hcGkudjIuVG9rZW5TZXJ2aWNlQ3JlYXRlUmVzcG9uc2UiCNjzGALg8xgBEm8KBlVwZGF0ZRIsLm1ldGFsc3RhY2suYXBpLnYyLlRva2VuU2VydmljZVVwZGF0ZVJlcXVlc3QaLS5tZXRhbHN0YWNrLmFwaS52Mi5Ub2tlblNlcnZpY2VVcGRhdGVSZXNwb25zZSII2PMYAuDzGAESaQoETGlzdBIqLm1ldGFsc3RhY2suYXBpLnYyLlRva2VuU2VydmljZUxpc3RSZXF1ZXN0GisubWV0YWxzdGFjay5hcGkudjIuVG9rZW5TZXJ2aWNlTGlzdFJlc3BvbnNlIgjY8xgC4PMYARJvCgZSZXZva2USLC5tZXRhbHN0YWNrLmFwaS52Mi5Ub2tlblNlcnZpY2VSZXZva2VSZXF1ZXN0Gi0ubWV0YWxzdGFjay5hcGkudjIuVG9rZW5TZXJ2aWNlUmV2b2tlUmVzcG9uc2UiCNjzGALg8xgBEnIKB1JlZnJlc2gSLS5tZXRhbHN0YWNrLmFwaS52Mi5Ub2tlblNlcnZpY2VSZWZyZXNoUmVxdWVzdBouLm1ldGFsc3RhY2suYXBpLnYyLlRva2VuU2VydmljZVJlZnJlc2hSZXNwb25zZSII2PMYAuDzGAFCwAEKFWNvbS5tZXRhbHN0YWNrLmFwaS52MkIKVG9rZW5Qcm90b1ABWjVnaXRodWIuY29tL21ldGFsLXN0YWNrL2FwaS9nby9tZXRhbHN0YWNrL2FwaS92MjthcGl2MqICA01BWKoCEU1ldGFsc3RhY2suQXBpLlYyygIRTWV0YWxzdGFja1xBcGlcVjLiAh1NZXRhbHN0YWNrXEFwaVxWMlxHUEJNZXRhZGF0YeoCE01ldGFsc3RhY2s6OkFwaTo6VjJiBnByb3RvMw", [file_buf_validate_validate, file_google_protobuf_duration, file_google_protobuf_timestamp, file_metalstack_api_v2_common, file_metalstack_api_v2_predefined_rules]); +export const file_metalstack_api_v2_token = /*@__PURE__*/ fileDesc("Ch1tZXRhbHN0YWNrL2FwaS92Mi90b2tlbi5wcm90bxIRbWV0YWxzdGFjay5hcGkudjIilQgKBVRva2VuEhYKBHV1aWQYASABKAlCCLpIBXIDsAEBEhkKBHVzZXIYAiABKAlCC7pICHIG+LOusQIBEiUKBG1ldGEYAyABKAsyFy5tZXRhbHN0YWNrLmFwaS52Mi5NZXRhEiAKC2Rlc2NyaXB0aW9uGAQgASgJQgu6SAhyBsizrrECARJDCgtwZXJtaXNzaW9ucxgFIAMoCzIjLm1ldGFsc3RhY2suYXBpLnYyLk1ldGhvZFBlcm1pc3Npb25CCbpIBpIBAxD0AxIrCgdleHBpcmVzGAYgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBItCglpc3N1ZWRfYXQYByABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEjoKCnRva2VuX3R5cGUYCCABKA4yHC5tZXRhbHN0YWNrLmFwaS52Mi5Ub2tlblR5cGVCCLpIBYIBAhABElwKDXByb2plY3Rfcm9sZXMYCSADKAsyKi5tZXRhbHN0YWNrLmFwaS52Mi5Ub2tlbi5Qcm9qZWN0Um9sZXNFbnRyeUIZukgWmgETwJW4sQIByJW4sQIBKgWCAQIQARJaCgx0ZW5hbnRfcm9sZXMYCiADKAsyKS5tZXRhbHN0YWNrLmFwaS52Mi5Ub2tlbi5UZW5hbnRSb2xlc0VudHJ5Qhm6SBaaARPAlbixAgHQlbixAgEqBYIBAhABEj8KCmFkbWluX3JvbGUYCyABKA4yHC5tZXRhbHN0YWNrLmFwaS52Mi5BZG1pblJvbGVCCLpIBYIBAhABSACIAQESPwoKaW5mcmFfcm9sZRgMIAEoDjIcLm1ldGFsc3RhY2suYXBpLnYyLkluZnJhUm9sZUIIukgFggECEAFIAYgBARJcCg1tYWNoaW5lX3JvbGVzGA0gAygLMioubWV0YWxzdGFjay5hcGkudjIuVG9rZW4uTWFjaGluZVJvbGVzRW50cnlCGbpIFpoBE8CVuLECAdiVuLECASoFggECEAEaUwoRUHJvamVjdFJvbGVzRW50cnkSCwoDa2V5GAEgASgJEi0KBXZhbHVlGAIgASgOMh4ubWV0YWxzdGFjay5hcGkudjIuUHJvamVjdFJvbGU6AjgBGlEKEFRlbmFudFJvbGVzRW50cnkSCwoDa2V5GAEgASgJEiwKBXZhbHVlGAIgASgOMh0ubWV0YWxzdGFjay5hcGkudjIuVGVuYW50Um9sZToCOAEaUwoRTWFjaGluZVJvbGVzRW50cnkSCwoDa2V5GAEgASgJEi0KBXZhbHVlGAIgASgOMh4ubWV0YWxzdGFjay5hcGkudjIuTWFjaGluZVJvbGU6AjgBQg0KC19hZG1pbl9yb2xlQg0KC19pbmZyYV9yb2xlIt0HChlUb2tlblNlcnZpY2VDcmVhdGVSZXF1ZXN0EiAKC2Rlc2NyaXB0aW9uGAEgASgJQgu6SAhyBsizrrECARJCCgtwZXJtaXNzaW9ucxgCIAMoCzIjLm1ldGFsc3RhY2suYXBpLnYyLk1ldGhvZFBlcm1pc3Npb25CCLpIBZIBAhBkEj4KB2V4cGlyZXMYAyABKAsyGS5nb29nbGUucHJvdG9idWYuRHVyYXRpb25CErpID6oBDBoFCIHnhA8yAwjYBBJwCg1wcm9qZWN0X3JvbGVzGAQgAygLMj4ubWV0YWxzdGFjay5hcGkudjIuVG9rZW5TZXJ2aWNlQ3JlYXRlUmVxdWVzdC5Qcm9qZWN0Um9sZXNFbnRyeUIZukgWmgETwJW4sQIByJW4sQIBKgWCAQIQARJuCgx0ZW5hbnRfcm9sZXMYBSADKAsyPS5tZXRhbHN0YWNrLmFwaS52Mi5Ub2tlblNlcnZpY2VDcmVhdGVSZXF1ZXN0LlRlbmFudFJvbGVzRW50cnlCGbpIFpoBE8CVuLECAdCVuLECASoFggECEAESPwoKYWRtaW5fcm9sZRgGIAEoDjIcLm1ldGFsc3RhY2suYXBpLnYyLkFkbWluUm9sZUIIukgFggECEAFIAIgBARI/CgppbmZyYV9yb2xlGAcgASgOMhwubWV0YWxzdGFjay5hcGkudjIuSW5mcmFSb2xlQgi6SAWCAQIQAUgBiAEBEnAKDW1hY2hpbmVfcm9sZXMYCCADKAsyPi5tZXRhbHN0YWNrLmFwaS52Mi5Ub2tlblNlcnZpY2VDcmVhdGVSZXF1ZXN0Lk1hY2hpbmVSb2xlc0VudHJ5Qhm6SBaaARPAlbixAgHYlbixAgEqBYIBAhABEikKBmxhYmVscxgJIAEoCzIZLm1ldGFsc3RhY2suYXBpLnYyLkxhYmVscxpTChFQcm9qZWN0Um9sZXNFbnRyeRILCgNrZXkYASABKAkSLQoFdmFsdWUYAiABKA4yHi5tZXRhbHN0YWNrLmFwaS52Mi5Qcm9qZWN0Um9sZToCOAEaUQoQVGVuYW50Um9sZXNFbnRyeRILCgNrZXkYASABKAkSLAoFdmFsdWUYAiABKA4yHS5tZXRhbHN0YWNrLmFwaS52Mi5UZW5hbnRSb2xlOgI4ARpTChFNYWNoaW5lUm9sZXNFbnRyeRILCgNrZXkYASABKAkSLQoFdmFsdWUYAiABKA4yHi5tZXRhbHN0YWNrLmFwaS52Mi5NYWNoaW5lUm9sZToCOAFCDQoLX2FkbWluX3JvbGVCDQoLX2luZnJhX3JvbGUiSQoQTWV0aG9kUGVybWlzc2lvbhIZCgdzdWJqZWN0GAEgASgJQgi6SAVyAxiAAhIaCgdtZXRob2RzGAIgAygJQgm6SAaSAQMQ9AMiVQoaVG9rZW5TZXJ2aWNlQ3JlYXRlUmVzcG9uc2USJwoFdG9rZW4YASABKAsyGC5tZXRhbHN0YWNrLmFwaS52Mi5Ub2tlbhIOCgZzZWNyZXQYAiABKAkiRwoXVG9rZW5TZXJ2aWNlTGlzdFJlcXVlc3QSLAoFcXVlcnkYASABKAsyHS5tZXRhbHN0YWNrLmFwaS52Mi5Ub2tlblF1ZXJ5IkQKGFRva2VuU2VydmljZUxpc3RSZXNwb25zZRIoCgZ0b2tlbnMYASADKAsyGC5tZXRhbHN0YWNrLmFwaS52Mi5Ub2tlbiIzChlUb2tlblNlcnZpY2VSZXZva2VSZXF1ZXN0EhYKBHV1aWQYASABKAlCCLpIBXIDsAEBIhwKGlRva2VuU2VydmljZVJldm9rZVJlc3BvbnNlIoIIChlUb2tlblNlcnZpY2VVcGRhdGVSZXF1ZXN0EhYKBHV1aWQYASABKAlCCLpIBXIDsAEBEjoKC3VwZGF0ZV9tZXRhGAIgASgLMh0ubWV0YWxzdGFjay5hcGkudjIuVXBkYXRlTWV0YUIGukgDyAEAEiUKC2Rlc2NyaXB0aW9uGAMgASgJQgu6SAhyBsizrrECAUgAiAEBEjgKC3Blcm1pc3Npb25zGAQgAygLMiMubWV0YWxzdGFjay5hcGkudjIuTWV0aG9kUGVybWlzc2lvbhJwCg1wcm9qZWN0X3JvbGVzGAUgAygLMj4ubWV0YWxzdGFjay5hcGkudjIuVG9rZW5TZXJ2aWNlVXBkYXRlUmVxdWVzdC5Qcm9qZWN0Um9sZXNFbnRyeUIZukgWmgETwJW4sQIByJW4sQIBKgWCAQIQARJuCgx0ZW5hbnRfcm9sZXMYBiADKAsyPS5tZXRhbHN0YWNrLmFwaS52Mi5Ub2tlblNlcnZpY2VVcGRhdGVSZXF1ZXN0LlRlbmFudFJvbGVzRW50cnlCGbpIFpoBE8CVuLECAdCVuLECASoFggECEAESPwoKYWRtaW5fcm9sZRgHIAEoDjIcLm1ldGFsc3RhY2suYXBpLnYyLkFkbWluUm9sZUIIukgFggECEAFIAYgBARI/CgppbmZyYV9yb2xlGAggASgOMhwubWV0YWxzdGFjay5hcGkudjIuSW5mcmFSb2xlQgi6SAWCAQIQAUgCiAEBEnAKDW1hY2hpbmVfcm9sZXMYCSADKAsyPi5tZXRhbHN0YWNrLmFwaS52Mi5Ub2tlblNlcnZpY2VVcGRhdGVSZXF1ZXN0Lk1hY2hpbmVSb2xlc0VudHJ5Qhm6SBaaARPAlbixAgHYlbixAgEqBYIBAhABEi8KBmxhYmVscxgKIAEoCzIfLm1ldGFsc3RhY2suYXBpLnYyLlVwZGF0ZUxhYmVscxpTChFQcm9qZWN0Um9sZXNFbnRyeRILCgNrZXkYASABKAkSLQoFdmFsdWUYAiABKA4yHi5tZXRhbHN0YWNrLmFwaS52Mi5Qcm9qZWN0Um9sZToCOAEaUQoQVGVuYW50Um9sZXNFbnRyeRILCgNrZXkYASABKAkSLAoFdmFsdWUYAiABKA4yHS5tZXRhbHN0YWNrLmFwaS52Mi5UZW5hbnRSb2xlOgI4ARpTChFNYWNoaW5lUm9sZXNFbnRyeRILCgNrZXkYASABKAkSLQoFdmFsdWUYAiABKA4yHi5tZXRhbHN0YWNrLmFwaS52Mi5NYWNoaW5lUm9sZToCOAFCDgoMX2Rlc2NyaXB0aW9uQg0KC19hZG1pbl9yb2xlQg0KC19pbmZyYV9yb2xlIkUKGlRva2VuU2VydmljZVVwZGF0ZVJlc3BvbnNlEicKBXRva2VuGAEgASgLMhgubWV0YWxzdGFjay5hcGkudjIuVG9rZW4iMAoWVG9rZW5TZXJ2aWNlR2V0UmVxdWVzdBIWCgR1dWlkGAEgASgJQgi6SAVyA7ABASJCChdUb2tlblNlcnZpY2VHZXRSZXNwb25zZRInCgV0b2tlbhgBIAEoCzIYLm1ldGFsc3RhY2suYXBpLnYyLlRva2VuIhwKGlRva2VuU2VydmljZVJlZnJlc2hSZXF1ZXN0IlYKG1Rva2VuU2VydmljZVJlZnJlc2hSZXNwb25zZRInCgV0b2tlbhgBIAEoCzIYLm1ldGFsc3RhY2suYXBpLnYyLlRva2VuEg4KBnNlY3JldBgCIAEoCSKdAgoKVG9rZW5RdWVyeRIbCgR1dWlkGAEgASgJQgi6SAVyA7ABAUgAiAEBEh4KBHVzZXIYAiABKAlCC7pICHIG+LOusQIBSAGIAQESJQoLZGVzY3JpcHRpb24YAyABKAlCC7pICHIGyLOusQIBSAKIAQESLgoGbGFiZWxzGAQgASgLMhkubWV0YWxzdGFjay5hcGkudjIuTGFiZWxzSAOIAQESPwoKdG9rZW5fdHlwZRgFIAEoDjIcLm1ldGFsc3RhY2suYXBpLnYyLlRva2VuVHlwZUIIukgFggECEAFIBIgBAUIHCgVfdXVpZEIHCgVfdXNlckIOCgxfZGVzY3JpcHRpb25CCQoHX2xhYmVsc0INCgtfdG9rZW5fdHlwZSpQCglUb2tlblR5cGUSGgoWVE9LRU5fVFlQRV9VTlNQRUNJRklFRBAAEhIKDlRPS0VOX1RZUEVfQVBJEAESEwoPVE9LRU5fVFlQRV9VU0VSEAIyqAUKDFRva2VuU2VydmljZRJmCgNHZXQSKS5tZXRhbHN0YWNrLmFwaS52Mi5Ub2tlblNlcnZpY2VHZXRSZXF1ZXN0GioubWV0YWxzdGFjay5hcGkudjIuVG9rZW5TZXJ2aWNlR2V0UmVzcG9uc2UiCNjzGALg8xgBEm8KBkNyZWF0ZRIsLm1ldGFsc3RhY2suYXBpLnYyLlRva2VuU2VydmljZUNyZWF0ZVJlcXVlc3QaLS5tZXRhbHN0YWNrLmFwaS52Mi5Ub2tlblNlcnZpY2VDcmVhdGVSZXNwb25zZSII2PMYAuDzGAESbwoGVXBkYXRlEiwubWV0YWxzdGFjay5hcGkudjIuVG9rZW5TZXJ2aWNlVXBkYXRlUmVxdWVzdBotLm1ldGFsc3RhY2suYXBpLnYyLlRva2VuU2VydmljZVVwZGF0ZVJlc3BvbnNlIgjY8xgC4PMYARJpCgRMaXN0EioubWV0YWxzdGFjay5hcGkudjIuVG9rZW5TZXJ2aWNlTGlzdFJlcXVlc3QaKy5tZXRhbHN0YWNrLmFwaS52Mi5Ub2tlblNlcnZpY2VMaXN0UmVzcG9uc2UiCNjzGALg8xgBEm8KBlJldm9rZRIsLm1ldGFsc3RhY2suYXBpLnYyLlRva2VuU2VydmljZVJldm9rZVJlcXVlc3QaLS5tZXRhbHN0YWNrLmFwaS52Mi5Ub2tlblNlcnZpY2VSZXZva2VSZXNwb25zZSII2PMYAuDzGAEScgoHUmVmcmVzaBItLm1ldGFsc3RhY2suYXBpLnYyLlRva2VuU2VydmljZVJlZnJlc2hSZXF1ZXN0Gi4ubWV0YWxzdGFjay5hcGkudjIuVG9rZW5TZXJ2aWNlUmVmcmVzaFJlc3BvbnNlIgjY8xgC4PMYAULAAQoVY29tLm1ldGFsc3RhY2suYXBpLnYyQgpUb2tlblByb3RvUAFaNWdpdGh1Yi5jb20vbWV0YWwtc3RhY2svYXBpL2dvL21ldGFsc3RhY2svYXBpL3YyO2FwaXYyogIDTUFYqgIRTWV0YWxzdGFjay5BcGkuVjLKAhFNZXRhbHN0YWNrXEFwaVxWMuICHU1ldGFsc3RhY2tcQXBpXFYyXEdQQk1ldGFkYXRh6gITTWV0YWxzdGFjazo6QXBpOjpWMmIGcHJvdG8z", [file_buf_validate_validate, file_google_protobuf_duration, file_google_protobuf_timestamp, file_metalstack_api_v2_common, file_metalstack_api_v2_predefined_rules]); /** * Describes the message metalstack.api.v2.Token. * Use `create(TokenSchema)` to create a new message. diff --git a/js/metalstack/api/v2/token_pb.ts b/js/metalstack/api/v2/token_pb.ts index 51f0a9b2..9d6ad7c3 100644 --- a/js/metalstack/api/v2/token_pb.ts +++ b/js/metalstack/api/v2/token_pb.ts @@ -16,7 +16,7 @@ import type { Message } from "@bufbuild/protobuf"; * Describes the file metalstack/api/v2/token.proto. */ export const file_metalstack_api_v2_token: GenFile = /*@__PURE__*/ - fileDesc("Ch1tZXRhbHN0YWNrL2FwaS92Mi90b2tlbi5wcm90bxIRbWV0YWxzdGFjay5hcGkudjIi5ggKBVRva2VuEhYKBHV1aWQYASABKAlCCLpIBXIDsAEBEhkKBHVzZXIYAiABKAlCC7pICHIG+LOusQIBEiUKBG1ldGEYAyABKAsyFy5tZXRhbHN0YWNrLmFwaS52Mi5NZXRhEiAKC2Rlc2NyaXB0aW9uGAQgASgJQgu6SAhyBsizrrECARJDCgtwZXJtaXNzaW9ucxgFIAMoCzIjLm1ldGFsc3RhY2suYXBpLnYyLk1ldGhvZFBlcm1pc3Npb25CCbpIBpIBAxD0AxIrCgdleHBpcmVzGAYgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBItCglpc3N1ZWRfYXQYByABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEjoKCnRva2VuX3R5cGUYCCABKA4yHC5tZXRhbHN0YWNrLmFwaS52Mi5Ub2tlblR5cGVCCLpIBYIBAhABEkEKDXByb2plY3Rfcm9sZXMYCSADKAsyKi5tZXRhbHN0YWNrLmFwaS52Mi5Ub2tlbi5Qcm9qZWN0Um9sZXNFbnRyeRI/Cgx0ZW5hbnRfcm9sZXMYCiADKAsyKS5tZXRhbHN0YWNrLmFwaS52Mi5Ub2tlbi5UZW5hbnRSb2xlc0VudHJ5Ej8KCmFkbWluX3JvbGUYCyABKA4yHC5tZXRhbHN0YWNrLmFwaS52Mi5BZG1pblJvbGVCCLpIBYIBAhABSACIAQESPwoKaW5mcmFfcm9sZRgMIAEoDjIcLm1ldGFsc3RhY2suYXBpLnYyLkluZnJhUm9sZUIIukgFggECEAFIAYgBARJBCg1tYWNoaW5lX3JvbGVzGA0gAygLMioubWV0YWxzdGFjay5hcGkudjIuVG9rZW4uTWFjaGluZVJvbGVzRW50cnkaUwoRUHJvamVjdFJvbGVzRW50cnkSCwoDa2V5GAEgASgJEi0KBXZhbHVlGAIgASgOMh4ubWV0YWxzdGFjay5hcGkudjIuUHJvamVjdFJvbGU6AjgBGlEKEFRlbmFudFJvbGVzRW50cnkSCwoDa2V5GAEgASgJEiwKBXZhbHVlGAIgASgOMh0ubWV0YWxzdGFjay5hcGkudjIuVGVuYW50Um9sZToCOAEaUwoRTWFjaGluZVJvbGVzRW50cnkSCwoDa2V5GAEgASgJEi0KBXZhbHVlGAIgASgOMh4ubWV0YWxzdGFjay5hcGkudjIuTWFjaGluZVJvbGU6AjgBOp8BukibARqYAQobdG9rZW4ucGVybWlzc2lvbnMudXNlcnRva2VuEil0b2tlbiB0eXBlIHVzZXIgbXVzdCBub3QgaGF2ZSBwZXJtaXNzaW9ucxpOKHRoaXMudG9rZW5fdHlwZSA9PSAyICYmIHRoaXMucGVybWlzc2lvbnMuc2l6ZSgpID09IDApIHx8IHRoaXMudG9rZW5fdHlwZSAhPSAyQg0KC19hZG1pbl9yb2xlQg0KC19pbmZyYV9yb2xlIqUJChlUb2tlblNlcnZpY2VDcmVhdGVSZXF1ZXN0EiAKC2Rlc2NyaXB0aW9uGAEgASgJQgu6SAhyBsizrrECARJCCgtwZXJtaXNzaW9ucxgCIAMoCzIjLm1ldGFsc3RhY2suYXBpLnYyLk1ldGhvZFBlcm1pc3Npb25CCLpIBZIBAhBkEj4KB2V4cGlyZXMYAyABKAsyGS5nb29nbGUucHJvdG9idWYuRHVyYXRpb25CErpID6oBDBoFCIHnhA8yAwjYBBJxCg1wcm9qZWN0X3JvbGVzGAQgAygLMj4ubWV0YWxzdGFjay5hcGkudjIuVG9rZW5TZXJ2aWNlQ3JlYXRlUmVxdWVzdC5Qcm9qZWN0Um9sZXNFbnRyeUIaukgXmgEUwJW4sQIBIgVyA7ABASoFggECEAEScQoMdGVuYW50X3JvbGVzGAUgAygLMj0ubWV0YWxzdGFjay5hcGkudjIuVG9rZW5TZXJ2aWNlQ3JlYXRlUmVxdWVzdC5UZW5hbnRSb2xlc0VudHJ5Qhy6SBmaARbAlbixAgEiB3IFEAMYgAEqBYIBAhABEj8KCmFkbWluX3JvbGUYBiABKA4yHC5tZXRhbHN0YWNrLmFwaS52Mi5BZG1pblJvbGVCCLpIBYIBAhABSACIAQESPwoKaW5mcmFfcm9sZRgHIAEoDjIcLm1ldGFsc3RhY2suYXBpLnYyLkluZnJhUm9sZUIIukgFggECEAFIAYgBARKzAgoNbWFjaGluZV9yb2xlcxgIIAMoCzI+Lm1ldGFsc3RhY2suYXBpLnYyLlRva2VuU2VydmljZUNyZWF0ZVJlcXVlc3QuTWFjaGluZVJvbGVzRW50cnlC2wG6SNcBugHJAQoSbWFjaGluZV9yb2xlc19rZXlzEjNtYXAga2V5cyBtdXN0IGJlIGVtcHR5IHN0cmluZywgJyonLCBvciBhIHZhbGlkIFVVSUQafnRoaXMuYWxsKGssIGsgPT0gJycgfHwgayA9PSAnKicgfHwgay5tYXRjaGVzKCdeWzAtOWEtZkEtRl17OH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17MTJ9JCcpKZoBByoFggECEAESKQoGbGFiZWxzGAkgASgLMhkubWV0YWxzdGFjay5hcGkudjIuTGFiZWxzGlMKEVByb2plY3RSb2xlc0VudHJ5EgsKA2tleRgBIAEoCRItCgV2YWx1ZRgCIAEoDjIeLm1ldGFsc3RhY2suYXBpLnYyLlByb2plY3RSb2xlOgI4ARpRChBUZW5hbnRSb2xlc0VudHJ5EgsKA2tleRgBIAEoCRIsCgV2YWx1ZRgCIAEoDjIdLm1ldGFsc3RhY2suYXBpLnYyLlRlbmFudFJvbGU6AjgBGlMKEU1hY2hpbmVSb2xlc0VudHJ5EgsKA2tleRgBIAEoCRItCgV2YWx1ZRgCIAEoDjIeLm1ldGFsc3RhY2suYXBpLnYyLk1hY2hpbmVSb2xlOgI4AUINCgtfYWRtaW5fcm9sZUINCgtfaW5mcmFfcm9sZSJJChBNZXRob2RQZXJtaXNzaW9uEhkKB3N1YmplY3QYASABKAlCCLpIBXIDGIACEhoKB21ldGhvZHMYAiADKAlCCbpIBpIBAxD0AyJVChpUb2tlblNlcnZpY2VDcmVhdGVSZXNwb25zZRInCgV0b2tlbhgBIAEoCzIYLm1ldGFsc3RhY2suYXBpLnYyLlRva2VuEg4KBnNlY3JldBgCIAEoCSJHChdUb2tlblNlcnZpY2VMaXN0UmVxdWVzdBIsCgVxdWVyeRgBIAEoCzIdLm1ldGFsc3RhY2suYXBpLnYyLlRva2VuUXVlcnkiRAoYVG9rZW5TZXJ2aWNlTGlzdFJlc3BvbnNlEigKBnRva2VucxgBIAMoCzIYLm1ldGFsc3RhY2suYXBpLnYyLlRva2VuIjMKGVRva2VuU2VydmljZVJldm9rZVJlcXVlc3QSFgoEdXVpZBgBIAEoCUIIukgFcgOwAQEiHAoaVG9rZW5TZXJ2aWNlUmV2b2tlUmVzcG9uc2UiygkKGVRva2VuU2VydmljZVVwZGF0ZVJlcXVlc3QSFgoEdXVpZBgBIAEoCUIIukgFcgOwAQESOgoLdXBkYXRlX21ldGEYAiABKAsyHS5tZXRhbHN0YWNrLmFwaS52Mi5VcGRhdGVNZXRhQga6SAPIAQASJQoLZGVzY3JpcHRpb24YAyABKAlCC7pICHIGyLOusQIBSACIAQESOAoLcGVybWlzc2lvbnMYBCADKAsyIy5tZXRhbHN0YWNrLmFwaS52Mi5NZXRob2RQZXJtaXNzaW9uEnEKDXByb2plY3Rfcm9sZXMYBSADKAsyPi5tZXRhbHN0YWNrLmFwaS52Mi5Ub2tlblNlcnZpY2VVcGRhdGVSZXF1ZXN0LlByb2plY3RSb2xlc0VudHJ5Qhq6SBeaARTAlbixAgEiBXIDsAEBKgWCAQIQARJxCgx0ZW5hbnRfcm9sZXMYBiADKAsyPS5tZXRhbHN0YWNrLmFwaS52Mi5Ub2tlblNlcnZpY2VVcGRhdGVSZXF1ZXN0LlRlbmFudFJvbGVzRW50cnlCHLpIGZoBFsCVuLECASIHcgUQAxiAASoFggECEAESPwoKYWRtaW5fcm9sZRgHIAEoDjIcLm1ldGFsc3RhY2suYXBpLnYyLkFkbWluUm9sZUIIukgFggECEAFIAYgBARI/CgppbmZyYV9yb2xlGAggASgOMhwubWV0YWxzdGFjay5hcGkudjIuSW5mcmFSb2xlQgi6SAWCAQIQAUgCiAEBErMCCg1tYWNoaW5lX3JvbGVzGAkgAygLMj4ubWV0YWxzdGFjay5hcGkudjIuVG9rZW5TZXJ2aWNlVXBkYXRlUmVxdWVzdC5NYWNoaW5lUm9sZXNFbnRyeULbAbpI1wG6AckBChJtYWNoaW5lX3JvbGVzX2tleXMSM21hcCBrZXlzIG11c3QgYmUgZW1wdHkgc3RyaW5nLCAnKicsIG9yIGEgdmFsaWQgVVVJRBp+dGhpcy5hbGwoaywgayA9PSAnJyB8fCBrID09ICcqJyB8fCBrLm1hdGNoZXMoJ15bMC05YS1mQS1GXXs4fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXs0fS1bMC05YS1mQS1GXXsxMn0kJykpmgEHKgWCAQIQARIvCgZsYWJlbHMYCiABKAsyHy5tZXRhbHN0YWNrLmFwaS52Mi5VcGRhdGVMYWJlbHMaUwoRUHJvamVjdFJvbGVzRW50cnkSCwoDa2V5GAEgASgJEi0KBXZhbHVlGAIgASgOMh4ubWV0YWxzdGFjay5hcGkudjIuUHJvamVjdFJvbGU6AjgBGlEKEFRlbmFudFJvbGVzRW50cnkSCwoDa2V5GAEgASgJEiwKBXZhbHVlGAIgASgOMh0ubWV0YWxzdGFjay5hcGkudjIuVGVuYW50Um9sZToCOAEaUwoRTWFjaGluZVJvbGVzRW50cnkSCwoDa2V5GAEgASgJEi0KBXZhbHVlGAIgASgOMh4ubWV0YWxzdGFjay5hcGkudjIuTWFjaGluZVJvbGU6AjgBQg4KDF9kZXNjcmlwdGlvbkINCgtfYWRtaW5fcm9sZUINCgtfaW5mcmFfcm9sZSJFChpUb2tlblNlcnZpY2VVcGRhdGVSZXNwb25zZRInCgV0b2tlbhgBIAEoCzIYLm1ldGFsc3RhY2suYXBpLnYyLlRva2VuIjAKFlRva2VuU2VydmljZUdldFJlcXVlc3QSFgoEdXVpZBgBIAEoCUIIukgFcgOwAQEiQgoXVG9rZW5TZXJ2aWNlR2V0UmVzcG9uc2USJwoFdG9rZW4YASABKAsyGC5tZXRhbHN0YWNrLmFwaS52Mi5Ub2tlbiIcChpUb2tlblNlcnZpY2VSZWZyZXNoUmVxdWVzdCJWChtUb2tlblNlcnZpY2VSZWZyZXNoUmVzcG9uc2USJwoFdG9rZW4YASABKAsyGC5tZXRhbHN0YWNrLmFwaS52Mi5Ub2tlbhIOCgZzZWNyZXQYAiABKAkinQIKClRva2VuUXVlcnkSGwoEdXVpZBgBIAEoCUIIukgFcgOwAQFIAIgBARIeCgR1c2VyGAIgASgJQgu6SAhyBvizrrECAUgBiAEBEiUKC2Rlc2NyaXB0aW9uGAMgASgJQgu6SAhyBsizrrECAUgCiAEBEi4KBmxhYmVscxgEIAEoCzIZLm1ldGFsc3RhY2suYXBpLnYyLkxhYmVsc0gDiAEBEj8KCnRva2VuX3R5cGUYBSABKA4yHC5tZXRhbHN0YWNrLmFwaS52Mi5Ub2tlblR5cGVCCLpIBYIBAhABSASIAQFCBwoFX3V1aWRCBwoFX3VzZXJCDgoMX2Rlc2NyaXB0aW9uQgkKB19sYWJlbHNCDQoLX3Rva2VuX3R5cGUqUAoJVG9rZW5UeXBlEhoKFlRPS0VOX1RZUEVfVU5TUEVDSUZJRUQQABISCg5UT0tFTl9UWVBFX0FQSRABEhMKD1RPS0VOX1RZUEVfVVNFUhACMqgFCgxUb2tlblNlcnZpY2USZgoDR2V0EikubWV0YWxzdGFjay5hcGkudjIuVG9rZW5TZXJ2aWNlR2V0UmVxdWVzdBoqLm1ldGFsc3RhY2suYXBpLnYyLlRva2VuU2VydmljZUdldFJlc3BvbnNlIgjY8xgC4PMYARJvCgZDcmVhdGUSLC5tZXRhbHN0YWNrLmFwaS52Mi5Ub2tlblNlcnZpY2VDcmVhdGVSZXF1ZXN0Gi0ubWV0YWxzdGFjay5hcGkudjIuVG9rZW5TZXJ2aWNlQ3JlYXRlUmVzcG9uc2UiCNjzGALg8xgBEm8KBlVwZGF0ZRIsLm1ldGFsc3RhY2suYXBpLnYyLlRva2VuU2VydmljZVVwZGF0ZVJlcXVlc3QaLS5tZXRhbHN0YWNrLmFwaS52Mi5Ub2tlblNlcnZpY2VVcGRhdGVSZXNwb25zZSII2PMYAuDzGAESaQoETGlzdBIqLm1ldGFsc3RhY2suYXBpLnYyLlRva2VuU2VydmljZUxpc3RSZXF1ZXN0GisubWV0YWxzdGFjay5hcGkudjIuVG9rZW5TZXJ2aWNlTGlzdFJlc3BvbnNlIgjY8xgC4PMYARJvCgZSZXZva2USLC5tZXRhbHN0YWNrLmFwaS52Mi5Ub2tlblNlcnZpY2VSZXZva2VSZXF1ZXN0Gi0ubWV0YWxzdGFjay5hcGkudjIuVG9rZW5TZXJ2aWNlUmV2b2tlUmVzcG9uc2UiCNjzGALg8xgBEnIKB1JlZnJlc2gSLS5tZXRhbHN0YWNrLmFwaS52Mi5Ub2tlblNlcnZpY2VSZWZyZXNoUmVxdWVzdBouLm1ldGFsc3RhY2suYXBpLnYyLlRva2VuU2VydmljZVJlZnJlc2hSZXNwb25zZSII2PMYAuDzGAFCwAEKFWNvbS5tZXRhbHN0YWNrLmFwaS52MkIKVG9rZW5Qcm90b1ABWjVnaXRodWIuY29tL21ldGFsLXN0YWNrL2FwaS9nby9tZXRhbHN0YWNrL2FwaS92MjthcGl2MqICA01BWKoCEU1ldGFsc3RhY2suQXBpLlYyygIRTWV0YWxzdGFja1xBcGlcVjLiAh1NZXRhbHN0YWNrXEFwaVxWMlxHUEJNZXRhZGF0YeoCE01ldGFsc3RhY2s6OkFwaTo6VjJiBnByb3RvMw", [file_buf_validate_validate, file_google_protobuf_duration, file_google_protobuf_timestamp, file_metalstack_api_v2_common, file_metalstack_api_v2_predefined_rules]); + fileDesc("Ch1tZXRhbHN0YWNrL2FwaS92Mi90b2tlbi5wcm90bxIRbWV0YWxzdGFjay5hcGkudjIilQgKBVRva2VuEhYKBHV1aWQYASABKAlCCLpIBXIDsAEBEhkKBHVzZXIYAiABKAlCC7pICHIG+LOusQIBEiUKBG1ldGEYAyABKAsyFy5tZXRhbHN0YWNrLmFwaS52Mi5NZXRhEiAKC2Rlc2NyaXB0aW9uGAQgASgJQgu6SAhyBsizrrECARJDCgtwZXJtaXNzaW9ucxgFIAMoCzIjLm1ldGFsc3RhY2suYXBpLnYyLk1ldGhvZFBlcm1pc3Npb25CCbpIBpIBAxD0AxIrCgdleHBpcmVzGAYgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBItCglpc3N1ZWRfYXQYByABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEjoKCnRva2VuX3R5cGUYCCABKA4yHC5tZXRhbHN0YWNrLmFwaS52Mi5Ub2tlblR5cGVCCLpIBYIBAhABElwKDXByb2plY3Rfcm9sZXMYCSADKAsyKi5tZXRhbHN0YWNrLmFwaS52Mi5Ub2tlbi5Qcm9qZWN0Um9sZXNFbnRyeUIZukgWmgETwJW4sQIByJW4sQIBKgWCAQIQARJaCgx0ZW5hbnRfcm9sZXMYCiADKAsyKS5tZXRhbHN0YWNrLmFwaS52Mi5Ub2tlbi5UZW5hbnRSb2xlc0VudHJ5Qhm6SBaaARPAlbixAgHQlbixAgEqBYIBAhABEj8KCmFkbWluX3JvbGUYCyABKA4yHC5tZXRhbHN0YWNrLmFwaS52Mi5BZG1pblJvbGVCCLpIBYIBAhABSACIAQESPwoKaW5mcmFfcm9sZRgMIAEoDjIcLm1ldGFsc3RhY2suYXBpLnYyLkluZnJhUm9sZUIIukgFggECEAFIAYgBARJcCg1tYWNoaW5lX3JvbGVzGA0gAygLMioubWV0YWxzdGFjay5hcGkudjIuVG9rZW4uTWFjaGluZVJvbGVzRW50cnlCGbpIFpoBE8CVuLECAdiVuLECASoFggECEAEaUwoRUHJvamVjdFJvbGVzRW50cnkSCwoDa2V5GAEgASgJEi0KBXZhbHVlGAIgASgOMh4ubWV0YWxzdGFjay5hcGkudjIuUHJvamVjdFJvbGU6AjgBGlEKEFRlbmFudFJvbGVzRW50cnkSCwoDa2V5GAEgASgJEiwKBXZhbHVlGAIgASgOMh0ubWV0YWxzdGFjay5hcGkudjIuVGVuYW50Um9sZToCOAEaUwoRTWFjaGluZVJvbGVzRW50cnkSCwoDa2V5GAEgASgJEi0KBXZhbHVlGAIgASgOMh4ubWV0YWxzdGFjay5hcGkudjIuTWFjaGluZVJvbGU6AjgBQg0KC19hZG1pbl9yb2xlQg0KC19pbmZyYV9yb2xlIt0HChlUb2tlblNlcnZpY2VDcmVhdGVSZXF1ZXN0EiAKC2Rlc2NyaXB0aW9uGAEgASgJQgu6SAhyBsizrrECARJCCgtwZXJtaXNzaW9ucxgCIAMoCzIjLm1ldGFsc3RhY2suYXBpLnYyLk1ldGhvZFBlcm1pc3Npb25CCLpIBZIBAhBkEj4KB2V4cGlyZXMYAyABKAsyGS5nb29nbGUucHJvdG9idWYuRHVyYXRpb25CErpID6oBDBoFCIHnhA8yAwjYBBJwCg1wcm9qZWN0X3JvbGVzGAQgAygLMj4ubWV0YWxzdGFjay5hcGkudjIuVG9rZW5TZXJ2aWNlQ3JlYXRlUmVxdWVzdC5Qcm9qZWN0Um9sZXNFbnRyeUIZukgWmgETwJW4sQIByJW4sQIBKgWCAQIQARJuCgx0ZW5hbnRfcm9sZXMYBSADKAsyPS5tZXRhbHN0YWNrLmFwaS52Mi5Ub2tlblNlcnZpY2VDcmVhdGVSZXF1ZXN0LlRlbmFudFJvbGVzRW50cnlCGbpIFpoBE8CVuLECAdCVuLECASoFggECEAESPwoKYWRtaW5fcm9sZRgGIAEoDjIcLm1ldGFsc3RhY2suYXBpLnYyLkFkbWluUm9sZUIIukgFggECEAFIAIgBARI/CgppbmZyYV9yb2xlGAcgASgOMhwubWV0YWxzdGFjay5hcGkudjIuSW5mcmFSb2xlQgi6SAWCAQIQAUgBiAEBEnAKDW1hY2hpbmVfcm9sZXMYCCADKAsyPi5tZXRhbHN0YWNrLmFwaS52Mi5Ub2tlblNlcnZpY2VDcmVhdGVSZXF1ZXN0Lk1hY2hpbmVSb2xlc0VudHJ5Qhm6SBaaARPAlbixAgHYlbixAgEqBYIBAhABEikKBmxhYmVscxgJIAEoCzIZLm1ldGFsc3RhY2suYXBpLnYyLkxhYmVscxpTChFQcm9qZWN0Um9sZXNFbnRyeRILCgNrZXkYASABKAkSLQoFdmFsdWUYAiABKA4yHi5tZXRhbHN0YWNrLmFwaS52Mi5Qcm9qZWN0Um9sZToCOAEaUQoQVGVuYW50Um9sZXNFbnRyeRILCgNrZXkYASABKAkSLAoFdmFsdWUYAiABKA4yHS5tZXRhbHN0YWNrLmFwaS52Mi5UZW5hbnRSb2xlOgI4ARpTChFNYWNoaW5lUm9sZXNFbnRyeRILCgNrZXkYASABKAkSLQoFdmFsdWUYAiABKA4yHi5tZXRhbHN0YWNrLmFwaS52Mi5NYWNoaW5lUm9sZToCOAFCDQoLX2FkbWluX3JvbGVCDQoLX2luZnJhX3JvbGUiSQoQTWV0aG9kUGVybWlzc2lvbhIZCgdzdWJqZWN0GAEgASgJQgi6SAVyAxiAAhIaCgdtZXRob2RzGAIgAygJQgm6SAaSAQMQ9AMiVQoaVG9rZW5TZXJ2aWNlQ3JlYXRlUmVzcG9uc2USJwoFdG9rZW4YASABKAsyGC5tZXRhbHN0YWNrLmFwaS52Mi5Ub2tlbhIOCgZzZWNyZXQYAiABKAkiRwoXVG9rZW5TZXJ2aWNlTGlzdFJlcXVlc3QSLAoFcXVlcnkYASABKAsyHS5tZXRhbHN0YWNrLmFwaS52Mi5Ub2tlblF1ZXJ5IkQKGFRva2VuU2VydmljZUxpc3RSZXNwb25zZRIoCgZ0b2tlbnMYASADKAsyGC5tZXRhbHN0YWNrLmFwaS52Mi5Ub2tlbiIzChlUb2tlblNlcnZpY2VSZXZva2VSZXF1ZXN0EhYKBHV1aWQYASABKAlCCLpIBXIDsAEBIhwKGlRva2VuU2VydmljZVJldm9rZVJlc3BvbnNlIoIIChlUb2tlblNlcnZpY2VVcGRhdGVSZXF1ZXN0EhYKBHV1aWQYASABKAlCCLpIBXIDsAEBEjoKC3VwZGF0ZV9tZXRhGAIgASgLMh0ubWV0YWxzdGFjay5hcGkudjIuVXBkYXRlTWV0YUIGukgDyAEAEiUKC2Rlc2NyaXB0aW9uGAMgASgJQgu6SAhyBsizrrECAUgAiAEBEjgKC3Blcm1pc3Npb25zGAQgAygLMiMubWV0YWxzdGFjay5hcGkudjIuTWV0aG9kUGVybWlzc2lvbhJwCg1wcm9qZWN0X3JvbGVzGAUgAygLMj4ubWV0YWxzdGFjay5hcGkudjIuVG9rZW5TZXJ2aWNlVXBkYXRlUmVxdWVzdC5Qcm9qZWN0Um9sZXNFbnRyeUIZukgWmgETwJW4sQIByJW4sQIBKgWCAQIQARJuCgx0ZW5hbnRfcm9sZXMYBiADKAsyPS5tZXRhbHN0YWNrLmFwaS52Mi5Ub2tlblNlcnZpY2VVcGRhdGVSZXF1ZXN0LlRlbmFudFJvbGVzRW50cnlCGbpIFpoBE8CVuLECAdCVuLECASoFggECEAESPwoKYWRtaW5fcm9sZRgHIAEoDjIcLm1ldGFsc3RhY2suYXBpLnYyLkFkbWluUm9sZUIIukgFggECEAFIAYgBARI/CgppbmZyYV9yb2xlGAggASgOMhwubWV0YWxzdGFjay5hcGkudjIuSW5mcmFSb2xlQgi6SAWCAQIQAUgCiAEBEnAKDW1hY2hpbmVfcm9sZXMYCSADKAsyPi5tZXRhbHN0YWNrLmFwaS52Mi5Ub2tlblNlcnZpY2VVcGRhdGVSZXF1ZXN0Lk1hY2hpbmVSb2xlc0VudHJ5Qhm6SBaaARPAlbixAgHYlbixAgEqBYIBAhABEi8KBmxhYmVscxgKIAEoCzIfLm1ldGFsc3RhY2suYXBpLnYyLlVwZGF0ZUxhYmVscxpTChFQcm9qZWN0Um9sZXNFbnRyeRILCgNrZXkYASABKAkSLQoFdmFsdWUYAiABKA4yHi5tZXRhbHN0YWNrLmFwaS52Mi5Qcm9qZWN0Um9sZToCOAEaUQoQVGVuYW50Um9sZXNFbnRyeRILCgNrZXkYASABKAkSLAoFdmFsdWUYAiABKA4yHS5tZXRhbHN0YWNrLmFwaS52Mi5UZW5hbnRSb2xlOgI4ARpTChFNYWNoaW5lUm9sZXNFbnRyeRILCgNrZXkYASABKAkSLQoFdmFsdWUYAiABKA4yHi5tZXRhbHN0YWNrLmFwaS52Mi5NYWNoaW5lUm9sZToCOAFCDgoMX2Rlc2NyaXB0aW9uQg0KC19hZG1pbl9yb2xlQg0KC19pbmZyYV9yb2xlIkUKGlRva2VuU2VydmljZVVwZGF0ZVJlc3BvbnNlEicKBXRva2VuGAEgASgLMhgubWV0YWxzdGFjay5hcGkudjIuVG9rZW4iMAoWVG9rZW5TZXJ2aWNlR2V0UmVxdWVzdBIWCgR1dWlkGAEgASgJQgi6SAVyA7ABASJCChdUb2tlblNlcnZpY2VHZXRSZXNwb25zZRInCgV0b2tlbhgBIAEoCzIYLm1ldGFsc3RhY2suYXBpLnYyLlRva2VuIhwKGlRva2VuU2VydmljZVJlZnJlc2hSZXF1ZXN0IlYKG1Rva2VuU2VydmljZVJlZnJlc2hSZXNwb25zZRInCgV0b2tlbhgBIAEoCzIYLm1ldGFsc3RhY2suYXBpLnYyLlRva2VuEg4KBnNlY3JldBgCIAEoCSKdAgoKVG9rZW5RdWVyeRIbCgR1dWlkGAEgASgJQgi6SAVyA7ABAUgAiAEBEh4KBHVzZXIYAiABKAlCC7pICHIG+LOusQIBSAGIAQESJQoLZGVzY3JpcHRpb24YAyABKAlCC7pICHIGyLOusQIBSAKIAQESLgoGbGFiZWxzGAQgASgLMhkubWV0YWxzdGFjay5hcGkudjIuTGFiZWxzSAOIAQESPwoKdG9rZW5fdHlwZRgFIAEoDjIcLm1ldGFsc3RhY2suYXBpLnYyLlRva2VuVHlwZUIIukgFggECEAFIBIgBAUIHCgVfdXVpZEIHCgVfdXNlckIOCgxfZGVzY3JpcHRpb25CCQoHX2xhYmVsc0INCgtfdG9rZW5fdHlwZSpQCglUb2tlblR5cGUSGgoWVE9LRU5fVFlQRV9VTlNQRUNJRklFRBAAEhIKDlRPS0VOX1RZUEVfQVBJEAESEwoPVE9LRU5fVFlQRV9VU0VSEAIyqAUKDFRva2VuU2VydmljZRJmCgNHZXQSKS5tZXRhbHN0YWNrLmFwaS52Mi5Ub2tlblNlcnZpY2VHZXRSZXF1ZXN0GioubWV0YWxzdGFjay5hcGkudjIuVG9rZW5TZXJ2aWNlR2V0UmVzcG9uc2UiCNjzGALg8xgBEm8KBkNyZWF0ZRIsLm1ldGFsc3RhY2suYXBpLnYyLlRva2VuU2VydmljZUNyZWF0ZVJlcXVlc3QaLS5tZXRhbHN0YWNrLmFwaS52Mi5Ub2tlblNlcnZpY2VDcmVhdGVSZXNwb25zZSII2PMYAuDzGAESbwoGVXBkYXRlEiwubWV0YWxzdGFjay5hcGkudjIuVG9rZW5TZXJ2aWNlVXBkYXRlUmVxdWVzdBotLm1ldGFsc3RhY2suYXBpLnYyLlRva2VuU2VydmljZVVwZGF0ZVJlc3BvbnNlIgjY8xgC4PMYARJpCgRMaXN0EioubWV0YWxzdGFjay5hcGkudjIuVG9rZW5TZXJ2aWNlTGlzdFJlcXVlc3QaKy5tZXRhbHN0YWNrLmFwaS52Mi5Ub2tlblNlcnZpY2VMaXN0UmVzcG9uc2UiCNjzGALg8xgBEm8KBlJldm9rZRIsLm1ldGFsc3RhY2suYXBpLnYyLlRva2VuU2VydmljZVJldm9rZVJlcXVlc3QaLS5tZXRhbHN0YWNrLmFwaS52Mi5Ub2tlblNlcnZpY2VSZXZva2VSZXNwb25zZSII2PMYAuDzGAEScgoHUmVmcmVzaBItLm1ldGFsc3RhY2suYXBpLnYyLlRva2VuU2VydmljZVJlZnJlc2hSZXF1ZXN0Gi4ubWV0YWxzdGFjay5hcGkudjIuVG9rZW5TZXJ2aWNlUmVmcmVzaFJlc3BvbnNlIgjY8xgC4PMYAULAAQoVY29tLm1ldGFsc3RhY2suYXBpLnYyQgpUb2tlblByb3RvUAFaNWdpdGh1Yi5jb20vbWV0YWwtc3RhY2svYXBpL2dvL21ldGFsc3RhY2svYXBpL3YyO2FwaXYyogIDTUFYqgIRTWV0YWxzdGFjay5BcGkuVjLKAhFNZXRhbHN0YWNrXEFwaVxWMuICHU1ldGFsc3RhY2tcQXBpXFYyXEdQQk1ldGFkYXRh6gITTWV0YWxzdGFjazo6QXBpOjpWMmIGcHJvdG8z", [file_buf_validate_validate, file_google_protobuf_duration, file_google_protobuf_timestamp, file_metalstack_api_v2_common, file_metalstack_api_v2_predefined_rules]); /** * Token generates a jwt authentication token to access the api @@ -32,6 +32,8 @@ export const file_metalstack_api_v2_token: GenFile = /*@__PURE__*/ * The api token should be used to authenticate services. * In contrast to a user token, the api token permissions and roles apply as configured during the token create process. * + * Message level validation, can be developed using https://protovalidate.com/playground + * * @generated from message metalstack.api.v2.Token */ export type Token = Message<"metalstack.api.v2.Token"> & { diff --git a/proto/buf.lock b/proto/buf.lock index 709ae023..7b474667 100644 --- a/proto/buf.lock +++ b/proto/buf.lock @@ -2,5 +2,5 @@ version: v2 deps: - name: buf.build/bufbuild/protovalidate - commit: 50325440f8f24053b047484a6bf60b76 - digest: b5:74cb6f5c0853c3c10aafc701614194bbd63326bdb8ef4068214454b8894b03ba4113e04b3a33a8321cdf05336e37db4dc14a5e2495db8462566914f36086ba31 + commit: 435963d1631043e694e56e6bcc3c79c3 + digest: b5:f4ea07ad2dd94bd7243562f9908b9fb104feef8076040c89d9f7c1dedc074de4d4ce2b997686ef4400f3eccb765a7cfc20ed4acdd70b9a3699351245c61dba97 diff --git a/proto/metalstack/api/v2/predefined_rules.proto b/proto/metalstack/api/v2/predefined_rules.proto index c903ac5e..5d3335ff 100644 --- a/proto/metalstack/api/v2/predefined_rules.proto +++ b/proto/metalstack/api/v2/predefined_rules.proto @@ -122,4 +122,22 @@ extend buf.validate.MapRules { message: "keys must not start or end with whitespace" expression: "this.all(k, k.trim().size() == k.size())" }]; + // ProjectRolesKeysValid ensures that project roles keys met our requirements + optional bool project_roles_keys_valid = 80068953 [(buf.validate.predefined).cel = { + id: "project_roles.key.valid" + message: "subject must be a '*', or a valid UUID" + expression: "this.all(k, k == '*' || k.matches('^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$'))" + }]; + // TenantRolesKeysValid ensures that tenant roles keys met our requirements + optional bool tenant_roles_keys_valid = 80068954 [(buf.validate.predefined).cel = { + id: "tenant_roles.key.valid" + message: "subject must be '*' or between 2 and 128 characters" + expression: "this.all(k, k == '*' || this.size() >= 2 || this.size() <=128 )" + }]; + // MachineRolesKeysValid ensures that machine roles keys met our requirements + optional bool machine_roles_keys_valid = 80068955 [(buf.validate.predefined).cel = { + id: "machine_roles.key.valid" + message: "subject must be empty string, '*', or a valid UUID" + expression: "this.all(k, k == '' || k == '*' || k.matches('^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$'))" + }]; } diff --git a/proto/metalstack/api/v2/token.proto b/proto/metalstack/api/v2/token.proto index 2a516584..eacbeb01 100644 --- a/proto/metalstack/api/v2/token.proto +++ b/proto/metalstack/api/v2/token.proto @@ -56,11 +56,7 @@ service TokenService { // In contrast to a user token, the api token permissions and roles apply as configured during the token create process. message Token { // Message level validation, can be developed using https://protovalidate.com/playground - option (buf.validate.message).cel = { - id: "token.permissions.usertoken" - message: "token type user must not have permissions" - expression: "(this.token_type == 2 && this.permissions.size() == 0) || this.token_type != 2" - }; + // Uuid of the jwt token, used to reference it by revoke string uuid = 1 [(buf.validate.field).string.uuid = true]; // User who created this token @@ -78,16 +74,28 @@ message Token { // TokenType describes the type of this token TokenType token_type = 8 [(buf.validate.field).enum.defined_only = true]; // ProjectRoles associates a project id with the corresponding role of the token owner - map project_roles = 9; + map project_roles = 9 [ + (buf.validate.field).map.(metalstack.api.v2.project_roles_keys_valid) = true, + (buf.validate.field).map.values = {enum: {defined_only: true}}, + (buf.validate.field).map.(metalstack.api.v2.keys_trimmed) = true + ]; // TenantRoles associates a tenant id with the corresponding role of the token owner - map tenant_roles = 10; + map tenant_roles = 10 [ + (buf.validate.field).map.(metalstack.api.v2.tenant_roles_keys_valid) = true, + (buf.validate.field).map.values = {enum: {defined_only: true}}, + (buf.validate.field).map.(metalstack.api.v2.keys_trimmed) = true + ]; // AdminRole defines the admin role of the token owner optional AdminRole admin_role = 11 [(buf.validate.field).enum.defined_only = true]; // InfraRole defines the infrastructure role of the token owner optional InfraRole infra_role = 12 [(buf.validate.field).enum.defined_only = true]; // MachineRoles associates a machine uuid with the corresponding role of the token owner // TODO: decide if we need this map from machine.uuid->role, we could instead use the subject in the token instead - map machine_roles = 13; + map machine_roles = 13 [ + (buf.validate.field).map.(metalstack.api.v2.machine_roles_keys_valid) = true, + (buf.validate.field).map.values = {enum: {defined_only: true}}, + (buf.validate.field).map.(metalstack.api.v2.keys_trimmed) = true + ]; } // TokenType specifies different use cases of tokens @@ -108,28 +116,20 @@ message TokenServiceCreateRequest { repeated MethodPermission permissions = 2 [(buf.validate.field).repeated.max_items = 100]; // Expires gives the duration since now, after which this token can not be used anymore google.protobuf.Duration expires = 3 [(buf.validate.field).duration = { + // Max token lifetime is one year lt: {seconds: 31536001} gte: {seconds: 600} }]; // ProjectRoles associates a project id with the corresponding role of the token owner map project_roles = 4 [ - (buf.validate.field).map = { - keys: {string: {uuid: true}} - values: {enum: {defined_only: true}} - }, + (buf.validate.field).map.(metalstack.api.v2.project_roles_keys_valid) = true, + (buf.validate.field).map.values = {enum: {defined_only: true}}, (buf.validate.field).map.(metalstack.api.v2.keys_trimmed) = true ]; // TenantRoles associates a tenant id with the corresponding role of the token owner map tenant_roles = 5 [ - (buf.validate.field).map = { - keys: { - string: { - min_len: 3 - max_len: 128 - } - } - values: {enum: {defined_only: true}} - }, + (buf.validate.field).map.(metalstack.api.v2.tenant_roles_keys_valid) = true, + (buf.validate.field).map.values = {enum: {defined_only: true}}, (buf.validate.field).map.(metalstack.api.v2.keys_trimmed) = true ]; // AdminRole defines the admin role of the token owner @@ -138,13 +138,9 @@ message TokenServiceCreateRequest { optional InfraRole infra_role = 7 [(buf.validate.field).enum.defined_only = true]; // MachineRoles associates a machine uuid with the corresponding role of the token owner map machine_roles = 8 [ - (buf.validate.field).cel = { - id: "machine_roles_keys" - message: "map keys must be empty string, '*', or a valid UUID" - // UUID regex pattern: 8-4-4-4-12 hex digits - expression: "this.all(k, k == '' || k == '*' || k.matches('^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$'))" - }, - (buf.validate.field).map.values = {enum: {defined_only: true}} + (buf.validate.field).map.(metalstack.api.v2.machine_roles_keys_valid) = true, + (buf.validate.field).map.values = {enum: {defined_only: true}}, + (buf.validate.field).map.(metalstack.api.v2.keys_trimmed) = true ]; // Labels on this token Labels labels = 9; @@ -205,23 +201,14 @@ message TokenServiceUpdateRequest { repeated MethodPermission permissions = 4; // ProjectRoles associates a project id with the corresponding role of the token owner map project_roles = 5 [ - (buf.validate.field).map = { - keys: {string: {uuid: true}} - values: {enum: {defined_only: true}} - }, + (buf.validate.field).map.(metalstack.api.v2.project_roles_keys_valid) = true, + (buf.validate.field).map.values = {enum: {defined_only: true}}, (buf.validate.field).map.(metalstack.api.v2.keys_trimmed) = true ]; // TenantRoles associates a tenant id with the corresponding role of the token owner map tenant_roles = 6 [ - (buf.validate.field).map = { - keys: { - string: { - min_len: 3 - max_len: 128 - } - } - values: {enum: {defined_only: true}} - }, + (buf.validate.field).map.(metalstack.api.v2.tenant_roles_keys_valid) = true, + (buf.validate.field).map.values = {enum: {defined_only: true}}, (buf.validate.field).map.(metalstack.api.v2.keys_trimmed) = true ]; // AdminRole defines the admin role of the token owner @@ -230,13 +217,9 @@ message TokenServiceUpdateRequest { optional InfraRole infra_role = 8 [(buf.validate.field).enum.defined_only = true]; // MachineRoles associates a machine uuid with the corresponding role of the token owner map machine_roles = 9 [ - (buf.validate.field).cel = { - id: "machine_roles_keys" - message: "map keys must be empty string, '*', or a valid UUID" - // UUID regex pattern: 8-4-4-4-12 hex digits - expression: "this.all(k, k == '' || k == '*' || k.matches('^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$'))" - }, - (buf.validate.field).map.values = {enum: {defined_only: true}} + (buf.validate.field).map.(metalstack.api.v2.machine_roles_keys_valid) = true, + (buf.validate.field).map.values = {enum: {defined_only: true}}, + (buf.validate.field).map.(metalstack.api.v2.keys_trimmed) = true ]; // Labels on this token UpdateLabels labels = 10; diff --git a/python/metalstack/api/v2/predefined_rules_pb2.py b/python/metalstack/api/v2/predefined_rules_pb2.py index a8f54233..b1e5a8c9 100644 --- a/python/metalstack/api/v2/predefined_rules_pb2.py +++ b/python/metalstack/api/v2/predefined_rules_pb2.py @@ -25,7 +25,7 @@ from buf.validate import validate_pb2 as buf_dot_validate_dot_validate__pb2 -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n(metalstack/api/v2/predefined_rules.proto\x12\x11metalstack.api.v2\x1a\x1b\x62uf/validate/validate.proto:\xb8\x01\n\nmacaddress\x12\x19.buf.validate.StringRules\x18\xb7\xe6\x95& \x01(\x08\x42z\xc2Hw\nu\n\x11string.macaddress\x12&this string must be a valid macaddress\x1a\x38this.matches(\'^([0-9A-Fa-f]{2}[:]){5}([0-9A-Fa-f]{2})$\')R\nmacaddress:\x99\x01\n\x07is_name\x12\x19.buf.validate.StringRules\x18\xb8\xe6\x95& \x01(\x08\x42\x62\xc2H_\n]\n\x0estring.is_name\x12#must be within 2 and 128 characters\x1a&this.size() >= 2 && this.size() <= 128R\x06isName:\x9a\x01\n\x0eis_description\x12\x19.buf.validate.StringRules\x18\xb9\xe6\x95& \x01(\x08\x42U\xc2HR\nP\n\x15string.is_description\x12#must be shorter than 256 characters\x1a\x12this.size() <= 256R\risDescription:\xa8\x01\n\x0cis_partition\x12\x19.buf.validate.StringRules\x18\xba\xe6\x95& \x01(\x08\x42g\xc2Hd\nb\n\x13string.is_partition\x12#must be within 2 and 128 characters\x1a&this.size() >= 2 && this.size() <= 128R\x0bisPartition:\x82\x01\n\tis_prefix\x12\x19.buf.validate.StringRules\x18\xbb\xe6\x95& \x01(\x08\x42G\xc2HD\nB\n\x0fstring.prefixes\x12\x1cgiven prefixes must be valid\x1a\x11this.isIpPrefix()R\x08isPrefix:m\n\x06is_uri\x12\x19.buf.validate.StringRules\x18\xbc\xe6\x95& \x01(\x08\x42\x38\xc2H5\n3\n\nstring.uri\x12\x17given uri must be valid\x1a\x0cthis.isUri()R\x05isUri:\xa7\x01\n\x11is_ip_or_hostname\x12\x19.buf.validate.StringRules\x18\xbd\xe6\x95& \x01(\x08\x42^\xc2H[\nY\n\rvalid_address\x12&must be a valid IP address or hostname\x1a this.isIp() || this.isHostname()R\x0eisIpOrHostname:\x9d\x01\n\x07trimmed\x12\x19.buf.validate.StringRules\x18\xbe\xe6\x95& \x01(\x08\x42\x65\xc2Hb\n`\n\x0estring.trimmed\x12+value must not start or end with whitespace\x1a!this.trim().size() == this.size()R\x07trimmed:\x99\x01\n\x07is_user\x12\x19.buf.validate.StringRules\x18\xbf\xe6\x95& \x01(\x08\x42\x62\xc2H_\n]\n\x0estring.is_user\x12#must be within 2 and 512 characters\x1a&this.size() >= 2 && this.size() <= 512R\x06isUser:\x9f\x01\n\tis_option\x12\x19.buf.validate.StringRules\x18\xc0\xe6\x95& \x01(\x08\x42\x64\xc2Ha\n_\n\x10string.is_option\x12#must be within 1 and 128 characters\x1a&this.size() >= 1 && this.size() <= 128R\x08isOption:\x98\x01\n\x06is_key\x12\x19.buf.validate.StringRules\x18\xc1\xe6\x95& \x01(\x08\x42\x63\xc2H`\n^\n\rstring.is_key\x12$must be within 1 and 8192 characters\x1a\'this.size() >= 1 && this.size() <= 8192R\x05isKey:\xb0\x01\n\x0fis_tenant_login\x12\x19.buf.validate.StringRules\x18\xc2\xe6\x95& \x01(\x08\x42j\xc2Hg\ne\n\x16string.is_tenant_login\x12#must be within 2 and 256 characters\x1a&this.size() >= 2 && this.size() <= 256R\risTenantLogin:\x8f\x01\n\x08prefixes\x12\x1b.buf.validate.RepeatedRules\x18\xc7\xb4\x96& \x01(\x08\x42S\xc2HP\nN\n\x11repeated.prefixes\x12\x1cgiven prefixes must be valid\x1a\x1bthis.all(m, m.isIpPrefix())R\x08prefixes:u\n\x03ips\x12\x1b.buf.validate.RepeatedRules\x18\xc8\xb4\x96& \x01(\x08\x42\x43\xc2H@\n>\n\x0crepeated.ips\x12\x17given ips must be valid\x1a\x15this.all(m, m.isIp())R\x03ips:\xe6\x01\n\x11\x61re_host_and_port\x12\x1b.buf.validate.RepeatedRules\x18\xc9\xb4\x96& \x01(\x08\x42\x9a\x01\xc2H\x96\x01\n\x93\x01\n\x1arepeated.are_host_and_port\x12Pgiven entries must all be in the form of : but port is optional\x1a#this.all(m, m.isHostAndPort(false))R\x0e\x61reHostAndPort:\xba\x01\n\x0b\x61ll_trimmed\x12\x1b.buf.validate.RepeatedRules\x18\xca\xb4\x96& \x01(\x08\x42y\xc2Hv\nt\n\x14repeated.all_trimmed\x12\x32given values must not start or end with whitespace\x1a(this.all(m, m.trim().size() == m.size())R\nallTrimmed:\x84\x02\n\x17keys_and_values_trimmed\x12\x16.buf.validate.MapRules\x18\xd7\x82\x97& \x01(\x08\x42\xb1\x01\xc2H\xad\x01\n\xaa\x01\n\x1bmap.keys_and_values_trimmed\x12\x35keys and values must not start or end with whitespace\x1aTthis.all(k, k.trim().size() == k.size()) && this.all(v, v.trim().size() == v.size())R\x14keysAndValuesTrimmed:\xab\x01\n\x0ckeys_trimmed\x12\x16.buf.validate.MapRules\x18\xd8\x82\x97& \x01(\x08\x42m\xc2Hj\nh\n\x10map.keys_trimmed\x12*keys must not start or end with whitespace\x1a(this.all(k, k.trim().size() == k.size())R\x0bkeysTrimmedB\xca\x01\n\x15\x63om.metalstack.api.v2B\x14PredefinedRulesProtoP\x01Z5github.com/metal-stack/api/go/metalstack/api/v2;apiv2\xa2\x02\x03MAX\xaa\x02\x11Metalstack.Api.V2\xca\x02\x11Metalstack\\Api\\V2\xe2\x02\x1dMetalstack\\Api\\V2\\GPBMetadata\xea\x02\x13Metalstack::Api::V2') +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n(metalstack/api/v2/predefined_rules.proto\x12\x11metalstack.api.v2\x1a\x1b\x62uf/validate/validate.proto:\xb8\x01\n\nmacaddress\x12\x19.buf.validate.StringRules\x18\xb7\xe6\x95& \x01(\x08\x42z\xc2Hw\nu\n\x11string.macaddress\x12&this string must be a valid macaddress\x1a\x38this.matches(\'^([0-9A-Fa-f]{2}[:]){5}([0-9A-Fa-f]{2})$\')R\nmacaddress:\x99\x01\n\x07is_name\x12\x19.buf.validate.StringRules\x18\xb8\xe6\x95& \x01(\x08\x42\x62\xc2H_\n]\n\x0estring.is_name\x12#must be within 2 and 128 characters\x1a&this.size() >= 2 && this.size() <= 128R\x06isName:\x9a\x01\n\x0eis_description\x12\x19.buf.validate.StringRules\x18\xb9\xe6\x95& \x01(\x08\x42U\xc2HR\nP\n\x15string.is_description\x12#must be shorter than 256 characters\x1a\x12this.size() <= 256R\risDescription:\xa8\x01\n\x0cis_partition\x12\x19.buf.validate.StringRules\x18\xba\xe6\x95& \x01(\x08\x42g\xc2Hd\nb\n\x13string.is_partition\x12#must be within 2 and 128 characters\x1a&this.size() >= 2 && this.size() <= 128R\x0bisPartition:\x82\x01\n\tis_prefix\x12\x19.buf.validate.StringRules\x18\xbb\xe6\x95& \x01(\x08\x42G\xc2HD\nB\n\x0fstring.prefixes\x12\x1cgiven prefixes must be valid\x1a\x11this.isIpPrefix()R\x08isPrefix:m\n\x06is_uri\x12\x19.buf.validate.StringRules\x18\xbc\xe6\x95& \x01(\x08\x42\x38\xc2H5\n3\n\nstring.uri\x12\x17given uri must be valid\x1a\x0cthis.isUri()R\x05isUri:\xa7\x01\n\x11is_ip_or_hostname\x12\x19.buf.validate.StringRules\x18\xbd\xe6\x95& \x01(\x08\x42^\xc2H[\nY\n\rvalid_address\x12&must be a valid IP address or hostname\x1a this.isIp() || this.isHostname()R\x0eisIpOrHostname:\x9d\x01\n\x07trimmed\x12\x19.buf.validate.StringRules\x18\xbe\xe6\x95& \x01(\x08\x42\x65\xc2Hb\n`\n\x0estring.trimmed\x12+value must not start or end with whitespace\x1a!this.trim().size() == this.size()R\x07trimmed:\x99\x01\n\x07is_user\x12\x19.buf.validate.StringRules\x18\xbf\xe6\x95& \x01(\x08\x42\x62\xc2H_\n]\n\x0estring.is_user\x12#must be within 2 and 512 characters\x1a&this.size() >= 2 && this.size() <= 512R\x06isUser:\x9f\x01\n\tis_option\x12\x19.buf.validate.StringRules\x18\xc0\xe6\x95& \x01(\x08\x42\x64\xc2Ha\n_\n\x10string.is_option\x12#must be within 1 and 128 characters\x1a&this.size() >= 1 && this.size() <= 128R\x08isOption:\x98\x01\n\x06is_key\x12\x19.buf.validate.StringRules\x18\xc1\xe6\x95& \x01(\x08\x42\x63\xc2H`\n^\n\rstring.is_key\x12$must be within 1 and 8192 characters\x1a\'this.size() >= 1 && this.size() <= 8192R\x05isKey:\xb0\x01\n\x0fis_tenant_login\x12\x19.buf.validate.StringRules\x18\xc2\xe6\x95& \x01(\x08\x42j\xc2Hg\ne\n\x16string.is_tenant_login\x12#must be within 2 and 256 characters\x1a&this.size() >= 2 && this.size() <= 256R\risTenantLogin:\x8f\x01\n\x08prefixes\x12\x1b.buf.validate.RepeatedRules\x18\xc7\xb4\x96& \x01(\x08\x42S\xc2HP\nN\n\x11repeated.prefixes\x12\x1cgiven prefixes must be valid\x1a\x1bthis.all(m, m.isIpPrefix())R\x08prefixes:u\n\x03ips\x12\x1b.buf.validate.RepeatedRules\x18\xc8\xb4\x96& \x01(\x08\x42\x43\xc2H@\n>\n\x0crepeated.ips\x12\x17given ips must be valid\x1a\x15this.all(m, m.isIp())R\x03ips:\xe6\x01\n\x11\x61re_host_and_port\x12\x1b.buf.validate.RepeatedRules\x18\xc9\xb4\x96& \x01(\x08\x42\x9a\x01\xc2H\x96\x01\n\x93\x01\n\x1arepeated.are_host_and_port\x12Pgiven entries must all be in the form of : but port is optional\x1a#this.all(m, m.isHostAndPort(false))R\x0e\x61reHostAndPort:\xba\x01\n\x0b\x61ll_trimmed\x12\x1b.buf.validate.RepeatedRules\x18\xca\xb4\x96& \x01(\x08\x42y\xc2Hv\nt\n\x14repeated.all_trimmed\x12\x32given values must not start or end with whitespace\x1a(this.all(m, m.trim().size() == m.size())R\nallTrimmed:\x84\x02\n\x17keys_and_values_trimmed\x12\x16.buf.validate.MapRules\x18\xd7\x82\x97& \x01(\x08\x42\xb1\x01\xc2H\xad\x01\n\xaa\x01\n\x1bmap.keys_and_values_trimmed\x12\x35keys and values must not start or end with whitespace\x1aTthis.all(k, k.trim().size() == k.size()) && this.all(v, v.trim().size() == v.size())R\x14keysAndValuesTrimmed:\xab\x01\n\x0ckeys_trimmed\x12\x16.buf.validate.MapRules\x18\xd8\x82\x97& \x01(\x08\x42m\xc2Hj\nh\n\x10map.keys_trimmed\x12*keys must not start or end with whitespace\x1a(this.all(k, k.trim().size() == k.size())R\x0bkeysTrimmed:\x92\x02\n\x18project_roles_keys_valid\x12\x16.buf.validate.MapRules\x18\xd9\x82\x97& \x01(\x08\x42\xbd\x01\xc2H\xb9\x01\n\xb6\x01\n\x17project_roles.key.valid\x12&subject must be a \'*\', or a valid UUID\x1asthis.all(k, k == \'*\' || k.matches(\'^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$\'))R\x15projectRolesKeysValid:\xe8\x01\n\x17tenant_roles_keys_valid\x12\x16.buf.validate.MapRules\x18\xda\x82\x97& \x01(\x08\x42\x95\x01\xc2H\x91\x01\n\x8e\x01\n\x16tenant_roles.key.valid\x12\x33subject must be \'*\' or between 2 and 128 characters\x1a?this.all(k, k == \'*\' || this.size() >= 2 || this.size() <=128 )R\x14tenantRolesKeysValid:\xa9\x02\n\x18machine_roles_keys_valid\x12\x16.buf.validate.MapRules\x18\xdb\x82\x97& \x01(\x08\x42\xd4\x01\xc2H\xd0\x01\n\xcd\x01\n\x17machine_roles.key.valid\x12\x32subject must be empty string, \'*\', or a valid UUID\x1a~this.all(k, k == \'\' || k == \'*\' || k.matches(\'^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$\'))R\x15machineRolesKeysValidB\xca\x01\n\x15\x63om.metalstack.api.v2B\x14PredefinedRulesProtoP\x01Z5github.com/metal-stack/api/go/metalstack/api/v2;apiv2\xa2\x02\x03MAX\xaa\x02\x11Metalstack.Api.V2\xca\x02\x11Metalstack\\Api\\V2\xe2\x02\x1dMetalstack\\Api\\V2\\GPBMetadata\xea\x02\x13Metalstack::Api::V2') _globals = globals() _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) @@ -69,4 +69,10 @@ _globals['keys_and_values_trimmed']._serialized_options = b'\302H\255\001\n\252\001\n\033map.keys_and_values_trimmed\0225keys and values must not start or end with whitespace\032Tthis.all(k, k.trim().size() == k.size()) && this.all(v, v.trim().size() == v.size())' _globals['keys_trimmed']._loaded_options = None _globals['keys_trimmed']._serialized_options = b'\302Hj\nh\n\020map.keys_trimmed\022*keys must not start or end with whitespace\032(this.all(k, k.trim().size() == k.size())' + _globals['project_roles_keys_valid']._loaded_options = None + _globals['project_roles_keys_valid']._serialized_options = b'\302H\271\001\n\266\001\n\027project_roles.key.valid\022&subject must be a \'*\', or a valid UUID\032sthis.all(k, k == \'*\' || k.matches(\'^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$\'))' + _globals['tenant_roles_keys_valid']._loaded_options = None + _globals['tenant_roles_keys_valid']._serialized_options = b'\302H\221\001\n\216\001\n\026tenant_roles.key.valid\0223subject must be \'*\' or between 2 and 128 characters\032?this.all(k, k == \'*\' || this.size() >= 2 || this.size() <=128 )' + _globals['machine_roles_keys_valid']._loaded_options = None + _globals['machine_roles_keys_valid']._serialized_options = b'\302H\320\001\n\315\001\n\027machine_roles.key.valid\0222subject must be empty string, \'*\', or a valid UUID\032~this.all(k, k == \'\' || k == \'*\' || k.matches(\'^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$\'))' # @@protoc_insertion_point(module_scope) diff --git a/python/metalstack/api/v2/predefined_rules_pb2.pyi b/python/metalstack/api/v2/predefined_rules_pb2.pyi index d46dbfc7..f76fae01 100644 --- a/python/metalstack/api/v2/predefined_rules_pb2.pyi +++ b/python/metalstack/api/v2/predefined_rules_pb2.pyi @@ -39,3 +39,9 @@ KEYS_AND_VALUES_TRIMMED_FIELD_NUMBER: _ClassVar[int] keys_and_values_trimmed: _descriptor.FieldDescriptor KEYS_TRIMMED_FIELD_NUMBER: _ClassVar[int] keys_trimmed: _descriptor.FieldDescriptor +PROJECT_ROLES_KEYS_VALID_FIELD_NUMBER: _ClassVar[int] +project_roles_keys_valid: _descriptor.FieldDescriptor +TENANT_ROLES_KEYS_VALID_FIELD_NUMBER: _ClassVar[int] +tenant_roles_keys_valid: _descriptor.FieldDescriptor +MACHINE_ROLES_KEYS_VALID_FIELD_NUMBER: _ClassVar[int] +machine_roles_keys_valid: _descriptor.FieldDescriptor diff --git a/python/metalstack/api/v2/token_pb2.py b/python/metalstack/api/v2/token_pb2.py index 06d4bc4e..c9ac7b3a 100644 --- a/python/metalstack/api/v2/token_pb2.py +++ b/python/metalstack/api/v2/token_pb2.py @@ -29,7 +29,7 @@ from metalstack.api.v2 import predefined_rules_pb2 as metalstack_dot_api_dot_v2_dot_predefined__rules__pb2 -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1dmetalstack/api/v2/token.proto\x12\x11metalstack.api.v2\x1a\x1b\x62uf/validate/validate.proto\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1emetalstack/api/v2/common.proto\x1a(metalstack/api/v2/predefined_rules.proto\"\x93\n\n\x05Token\x12\x1c\n\x04uuid\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x04uuid\x12\x1f\n\x04user\x18\x02 \x01(\tB\x0b\xbaH\x08r\x06\xf8\xb3\xae\xb1\x02\x01R\x04user\x12+\n\x04meta\x18\x03 \x01(\x0b\x32\x17.metalstack.api.v2.MetaR\x04meta\x12-\n\x0b\x64\x65scription\x18\x04 \x01(\tB\x0b\xbaH\x08r\x06\xc8\xb3\xae\xb1\x02\x01R\x0b\x64\x65scription\x12P\n\x0bpermissions\x18\x05 \x03(\x0b\x32#.metalstack.api.v2.MethodPermissionB\t\xbaH\x06\x92\x01\x03\x10\xf4\x03R\x0bpermissions\x12\x34\n\x07\x65xpires\x18\x06 \x01(\x0b\x32\x1a.google.protobuf.TimestampR\x07\x65xpires\x12\x37\n\tissued_at\x18\x07 \x01(\x0b\x32\x1a.google.protobuf.TimestampR\x08issuedAt\x12\x45\n\ntoken_type\x18\x08 \x01(\x0e\x32\x1c.metalstack.api.v2.TokenTypeB\x08\xbaH\x05\x82\x01\x02\x10\x01R\ttokenType\x12O\n\rproject_roles\x18\t \x03(\x0b\x32*.metalstack.api.v2.Token.ProjectRolesEntryR\x0cprojectRoles\x12L\n\x0ctenant_roles\x18\n \x03(\x0b\x32).metalstack.api.v2.Token.TenantRolesEntryR\x0btenantRoles\x12J\n\nadmin_role\x18\x0b \x01(\x0e\x32\x1c.metalstack.api.v2.AdminRoleB\x08\xbaH\x05\x82\x01\x02\x10\x01H\x00R\tadminRole\x88\x01\x01\x12J\n\ninfra_role\x18\x0c \x01(\x0e\x32\x1c.metalstack.api.v2.InfraRoleB\x08\xbaH\x05\x82\x01\x02\x10\x01H\x01R\tinfraRole\x88\x01\x01\x12O\n\rmachine_roles\x18\r \x03(\x0b\x32*.metalstack.api.v2.Token.MachineRolesEntryR\x0cmachineRoles\x1a_\n\x11ProjectRolesEntry\x12\x10\n\x03key\x18\x01 \x01(\tR\x03key\x12\x34\n\x05value\x18\x02 \x01(\x0e\x32\x1e.metalstack.api.v2.ProjectRoleR\x05value:\x02\x38\x01\x1a]\n\x10TenantRolesEntry\x12\x10\n\x03key\x18\x01 \x01(\tR\x03key\x12\x33\n\x05value\x18\x02 \x01(\x0e\x32\x1d.metalstack.api.v2.TenantRoleR\x05value:\x02\x38\x01\x1a_\n\x11MachineRolesEntry\x12\x10\n\x03key\x18\x01 \x01(\tR\x03key\x12\x34\n\x05value\x18\x02 \x01(\x0e\x32\x1e.metalstack.api.v2.MachineRoleR\x05value:\x02\x38\x01:\x9f\x01\xbaH\x9b\x01\x1a\x98\x01\n\x1btoken.permissions.usertoken\x12)token type user must not have permissions\x1aN(this.token_type == 2 && this.permissions.size() == 0) || this.token_type != 2B\r\n\x0b_admin_roleB\r\n\x0b_infra_role\"\xb3\n\n\x19TokenServiceCreateRequest\x12-\n\x0b\x64\x65scription\x18\x01 \x01(\tB\x0b\xbaH\x08r\x06\xc8\xb3\xae\xb1\x02\x01R\x0b\x64\x65scription\x12O\n\x0bpermissions\x18\x02 \x03(\x0b\x32#.metalstack.api.v2.MethodPermissionB\x08\xbaH\x05\x92\x01\x02\x10\x64R\x0bpermissions\x12G\n\x07\x65xpires\x18\x03 \x01(\x0b\x32\x19.google.protobuf.DurationB\x12\xbaH\x0f\xaa\x01\x0c\x1a\x05\x08\x81\xe7\x84\x0f\x32\x03\x08\xd8\x04R\x07\x65xpires\x12\x7f\n\rproject_roles\x18\x04 \x03(\x0b\x32>.metalstack.api.v2.TokenServiceCreateRequest.ProjectRolesEntryB\x1a\xbaH\x17\x9a\x01\x14\"\x05r\x03\xb0\x01\x01*\x05\x82\x01\x02\x10\x01\xc0\x95\xb8\xb1\x02\x01R\x0cprojectRoles\x12~\n\x0ctenant_roles\x18\x05 \x03(\x0b\x32=.metalstack.api.v2.TokenServiceCreateRequest.TenantRolesEntryB\x1c\xbaH\x19\x9a\x01\x16\"\x07r\x05\x10\x03\x18\x80\x01*\x05\x82\x01\x02\x10\x01\xc0\x95\xb8\xb1\x02\x01R\x0btenantRoles\x12J\n\nadmin_role\x18\x06 \x01(\x0e\x32\x1c.metalstack.api.v2.AdminRoleB\x08\xbaH\x05\x82\x01\x02\x10\x01H\x00R\tadminRole\x88\x01\x01\x12J\n\ninfra_role\x18\x07 \x01(\x0e\x32\x1c.metalstack.api.v2.InfraRoleB\x08\xbaH\x05\x82\x01\x02\x10\x01H\x01R\tinfraRole\x88\x01\x01\x12\xc1\x02\n\rmachine_roles\x18\x08 \x03(\x0b\x32>.metalstack.api.v2.TokenServiceCreateRequest.MachineRolesEntryB\xdb\x01\xbaH\xd7\x01\x9a\x01\x07*\x05\x82\x01\x02\x10\x01\xba\x01\xc9\x01\n\x12machine_roles_keys\x12\x33map keys must be empty string, \'*\', or a valid UUID\x1a~this.all(k, k == \'\' || k == \'*\' || k.matches(\'^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$\'))R\x0cmachineRoles\x12\x31\n\x06labels\x18\t \x01(\x0b\x32\x19.metalstack.api.v2.LabelsR\x06labels\x1a_\n\x11ProjectRolesEntry\x12\x10\n\x03key\x18\x01 \x01(\tR\x03key\x12\x34\n\x05value\x18\x02 \x01(\x0e\x32\x1e.metalstack.api.v2.ProjectRoleR\x05value:\x02\x38\x01\x1a]\n\x10TenantRolesEntry\x12\x10\n\x03key\x18\x01 \x01(\tR\x03key\x12\x33\n\x05value\x18\x02 \x01(\x0e\x32\x1d.metalstack.api.v2.TenantRoleR\x05value:\x02\x38\x01\x1a_\n\x11MachineRolesEntry\x12\x10\n\x03key\x18\x01 \x01(\tR\x03key\x12\x34\n\x05value\x18\x02 \x01(\x0e\x32\x1e.metalstack.api.v2.MachineRoleR\x05value:\x02\x38\x01\x42\r\n\x0b_admin_roleB\r\n\x0b_infra_role\"[\n\x10MethodPermission\x12\"\n\x07subject\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\x18\x80\x02R\x07subject\x12#\n\x07methods\x18\x02 \x03(\tB\t\xbaH\x06\x92\x01\x03\x10\xf4\x03R\x07methods\"d\n\x1aTokenServiceCreateResponse\x12.\n\x05token\x18\x01 \x01(\x0b\x32\x18.metalstack.api.v2.TokenR\x05token\x12\x16\n\x06secret\x18\x02 \x01(\tR\x06secret\"N\n\x17TokenServiceListRequest\x12\x33\n\x05query\x18\x01 \x01(\x0b\x32\x1d.metalstack.api.v2.TokenQueryR\x05query\"L\n\x18TokenServiceListResponse\x12\x30\n\x06tokens\x18\x01 \x03(\x0b\x32\x18.metalstack.api.v2.TokenR\x06tokens\"9\n\x19TokenServiceRevokeRequest\x12\x1c\n\x04uuid\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x04uuid\"\x1c\n\x1aTokenServiceRevokeResponse\"\xe1\n\n\x19TokenServiceUpdateRequest\x12\x1c\n\x04uuid\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x04uuid\x12\x46\n\x0bupdate_meta\x18\x02 \x01(\x0b\x32\x1d.metalstack.api.v2.UpdateMetaB\x06\xbaH\x03\xc8\x01\x00R\nupdateMeta\x12\x32\n\x0b\x64\x65scription\x18\x03 \x01(\tB\x0b\xbaH\x08r\x06\xc8\xb3\xae\xb1\x02\x01H\x00R\x0b\x64\x65scription\x88\x01\x01\x12\x45\n\x0bpermissions\x18\x04 \x03(\x0b\x32#.metalstack.api.v2.MethodPermissionR\x0bpermissions\x12\x7f\n\rproject_roles\x18\x05 \x03(\x0b\x32>.metalstack.api.v2.TokenServiceUpdateRequest.ProjectRolesEntryB\x1a\xbaH\x17\x9a\x01\x14\"\x05r\x03\xb0\x01\x01*\x05\x82\x01\x02\x10\x01\xc0\x95\xb8\xb1\x02\x01R\x0cprojectRoles\x12~\n\x0ctenant_roles\x18\x06 \x03(\x0b\x32=.metalstack.api.v2.TokenServiceUpdateRequest.TenantRolesEntryB\x1c\xbaH\x19\x9a\x01\x16\"\x07r\x05\x10\x03\x18\x80\x01*\x05\x82\x01\x02\x10\x01\xc0\x95\xb8\xb1\x02\x01R\x0btenantRoles\x12J\n\nadmin_role\x18\x07 \x01(\x0e\x32\x1c.metalstack.api.v2.AdminRoleB\x08\xbaH\x05\x82\x01\x02\x10\x01H\x01R\tadminRole\x88\x01\x01\x12J\n\ninfra_role\x18\x08 \x01(\x0e\x32\x1c.metalstack.api.v2.InfraRoleB\x08\xbaH\x05\x82\x01\x02\x10\x01H\x02R\tinfraRole\x88\x01\x01\x12\xc1\x02\n\rmachine_roles\x18\t \x03(\x0b\x32>.metalstack.api.v2.TokenServiceUpdateRequest.MachineRolesEntryB\xdb\x01\xbaH\xd7\x01\x9a\x01\x07*\x05\x82\x01\x02\x10\x01\xba\x01\xc9\x01\n\x12machine_roles_keys\x12\x33map keys must be empty string, \'*\', or a valid UUID\x1a~this.all(k, k == \'\' || k == \'*\' || k.matches(\'^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$\'))R\x0cmachineRoles\x12\x37\n\x06labels\x18\n \x01(\x0b\x32\x1f.metalstack.api.v2.UpdateLabelsR\x06labels\x1a_\n\x11ProjectRolesEntry\x12\x10\n\x03key\x18\x01 \x01(\tR\x03key\x12\x34\n\x05value\x18\x02 \x01(\x0e\x32\x1e.metalstack.api.v2.ProjectRoleR\x05value:\x02\x38\x01\x1a]\n\x10TenantRolesEntry\x12\x10\n\x03key\x18\x01 \x01(\tR\x03key\x12\x33\n\x05value\x18\x02 \x01(\x0e\x32\x1d.metalstack.api.v2.TenantRoleR\x05value:\x02\x38\x01\x1a_\n\x11MachineRolesEntry\x12\x10\n\x03key\x18\x01 \x01(\tR\x03key\x12\x34\n\x05value\x18\x02 \x01(\x0e\x32\x1e.metalstack.api.v2.MachineRoleR\x05value:\x02\x38\x01\x42\x0e\n\x0c_descriptionB\r\n\x0b_admin_roleB\r\n\x0b_infra_role\"L\n\x1aTokenServiceUpdateResponse\x12.\n\x05token\x18\x01 \x01(\x0b\x32\x18.metalstack.api.v2.TokenR\x05token\"6\n\x16TokenServiceGetRequest\x12\x1c\n\x04uuid\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x04uuid\"I\n\x17TokenServiceGetResponse\x12.\n\x05token\x18\x01 \x01(\x0b\x32\x18.metalstack.api.v2.TokenR\x05token\"\x1c\n\x1aTokenServiceRefreshRequest\"e\n\x1bTokenServiceRefreshResponse\x12.\n\x05token\x18\x01 \x01(\x0b\x32\x18.metalstack.api.v2.TokenR\x05token\x12\x16\n\x06secret\x18\x02 \x01(\tR\x06secret\"\xc9\x02\n\nTokenQuery\x12!\n\x04uuid\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01H\x00R\x04uuid\x88\x01\x01\x12$\n\x04user\x18\x02 \x01(\tB\x0b\xbaH\x08r\x06\xf8\xb3\xae\xb1\x02\x01H\x01R\x04user\x88\x01\x01\x12\x32\n\x0b\x64\x65scription\x18\x03 \x01(\tB\x0b\xbaH\x08r\x06\xc8\xb3\xae\xb1\x02\x01H\x02R\x0b\x64\x65scription\x88\x01\x01\x12\x36\n\x06labels\x18\x04 \x01(\x0b\x32\x19.metalstack.api.v2.LabelsH\x03R\x06labels\x88\x01\x01\x12J\n\ntoken_type\x18\x05 \x01(\x0e\x32\x1c.metalstack.api.v2.TokenTypeB\x08\xbaH\x05\x82\x01\x02\x10\x01H\x04R\ttokenType\x88\x01\x01\x42\x07\n\x05_uuidB\x07\n\x05_userB\x0e\n\x0c_descriptionB\t\n\x07_labelsB\r\n\x0b_token_type*P\n\tTokenType\x12\x1a\n\x16TOKEN_TYPE_UNSPECIFIED\x10\x00\x12\x12\n\x0eTOKEN_TYPE_API\x10\x01\x12\x13\n\x0fTOKEN_TYPE_USER\x10\x02\x32\xa8\x05\n\x0cTokenService\x12\x66\n\x03Get\x12).metalstack.api.v2.TokenServiceGetRequest\x1a*.metalstack.api.v2.TokenServiceGetResponse\"\x08\xd8\xf3\x18\x02\xe0\xf3\x18\x01\x12o\n\x06\x43reate\x12,.metalstack.api.v2.TokenServiceCreateRequest\x1a-.metalstack.api.v2.TokenServiceCreateResponse\"\x08\xd8\xf3\x18\x02\xe0\xf3\x18\x01\x12o\n\x06Update\x12,.metalstack.api.v2.TokenServiceUpdateRequest\x1a-.metalstack.api.v2.TokenServiceUpdateResponse\"\x08\xd8\xf3\x18\x02\xe0\xf3\x18\x01\x12i\n\x04List\x12*.metalstack.api.v2.TokenServiceListRequest\x1a+.metalstack.api.v2.TokenServiceListResponse\"\x08\xd8\xf3\x18\x02\xe0\xf3\x18\x01\x12o\n\x06Revoke\x12,.metalstack.api.v2.TokenServiceRevokeRequest\x1a-.metalstack.api.v2.TokenServiceRevokeResponse\"\x08\xd8\xf3\x18\x02\xe0\xf3\x18\x01\x12r\n\x07Refresh\x12-.metalstack.api.v2.TokenServiceRefreshRequest\x1a..metalstack.api.v2.TokenServiceRefreshResponse\"\x08\xd8\xf3\x18\x02\xe0\xf3\x18\x01\x42\xc0\x01\n\x15\x63om.metalstack.api.v2B\nTokenProtoP\x01Z5github.com/metal-stack/api/go/metalstack/api/v2;apiv2\xa2\x02\x03MAX\xaa\x02\x11Metalstack.Api.V2\xca\x02\x11Metalstack\\Api\\V2\xe2\x02\x1dMetalstack\\Api\\V2\\GPBMetadata\xea\x02\x13Metalstack::Api::V2b\x06proto3') +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1dmetalstack/api/v2/token.proto\x12\x11metalstack.api.v2\x1a\x1b\x62uf/validate/validate.proto\x1a\x1egoogle/protobuf/duration.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1emetalstack/api/v2/common.proto\x1a(metalstack/api/v2/predefined_rules.proto\"\xc2\t\n\x05Token\x12\x1c\n\x04uuid\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x04uuid\x12\x1f\n\x04user\x18\x02 \x01(\tB\x0b\xbaH\x08r\x06\xf8\xb3\xae\xb1\x02\x01R\x04user\x12+\n\x04meta\x18\x03 \x01(\x0b\x32\x17.metalstack.api.v2.MetaR\x04meta\x12-\n\x0b\x64\x65scription\x18\x04 \x01(\tB\x0b\xbaH\x08r\x06\xc8\xb3\xae\xb1\x02\x01R\x0b\x64\x65scription\x12P\n\x0bpermissions\x18\x05 \x03(\x0b\x32#.metalstack.api.v2.MethodPermissionB\t\xbaH\x06\x92\x01\x03\x10\xf4\x03R\x0bpermissions\x12\x34\n\x07\x65xpires\x18\x06 \x01(\x0b\x32\x1a.google.protobuf.TimestampR\x07\x65xpires\x12\x37\n\tissued_at\x18\x07 \x01(\x0b\x32\x1a.google.protobuf.TimestampR\x08issuedAt\x12\x45\n\ntoken_type\x18\x08 \x01(\x0e\x32\x1c.metalstack.api.v2.TokenTypeB\x08\xbaH\x05\x82\x01\x02\x10\x01R\ttokenType\x12j\n\rproject_roles\x18\t \x03(\x0b\x32*.metalstack.api.v2.Token.ProjectRolesEntryB\x19\xbaH\x16\x9a\x01\x13*\x05\x82\x01\x02\x10\x01\xc0\x95\xb8\xb1\x02\x01\xc8\x95\xb8\xb1\x02\x01R\x0cprojectRoles\x12g\n\x0ctenant_roles\x18\n \x03(\x0b\x32).metalstack.api.v2.Token.TenantRolesEntryB\x19\xbaH\x16\x9a\x01\x13*\x05\x82\x01\x02\x10\x01\xc0\x95\xb8\xb1\x02\x01\xd0\x95\xb8\xb1\x02\x01R\x0btenantRoles\x12J\n\nadmin_role\x18\x0b \x01(\x0e\x32\x1c.metalstack.api.v2.AdminRoleB\x08\xbaH\x05\x82\x01\x02\x10\x01H\x00R\tadminRole\x88\x01\x01\x12J\n\ninfra_role\x18\x0c \x01(\x0e\x32\x1c.metalstack.api.v2.InfraRoleB\x08\xbaH\x05\x82\x01\x02\x10\x01H\x01R\tinfraRole\x88\x01\x01\x12j\n\rmachine_roles\x18\r \x03(\x0b\x32*.metalstack.api.v2.Token.MachineRolesEntryB\x19\xbaH\x16\x9a\x01\x13*\x05\x82\x01\x02\x10\x01\xc0\x95\xb8\xb1\x02\x01\xd8\x95\xb8\xb1\x02\x01R\x0cmachineRoles\x1a_\n\x11ProjectRolesEntry\x12\x10\n\x03key\x18\x01 \x01(\tR\x03key\x12\x34\n\x05value\x18\x02 \x01(\x0e\x32\x1e.metalstack.api.v2.ProjectRoleR\x05value:\x02\x38\x01\x1a]\n\x10TenantRolesEntry\x12\x10\n\x03key\x18\x01 \x01(\tR\x03key\x12\x33\n\x05value\x18\x02 \x01(\x0e\x32\x1d.metalstack.api.v2.TenantRoleR\x05value:\x02\x38\x01\x1a_\n\x11MachineRolesEntry\x12\x10\n\x03key\x18\x01 \x01(\tR\x03key\x12\x34\n\x05value\x18\x02 \x01(\x0e\x32\x1e.metalstack.api.v2.MachineRoleR\x05value:\x02\x38\x01\x42\r\n\x0b_admin_roleB\r\n\x0b_infra_role\"\xeb\x08\n\x19TokenServiceCreateRequest\x12-\n\x0b\x64\x65scription\x18\x01 \x01(\tB\x0b\xbaH\x08r\x06\xc8\xb3\xae\xb1\x02\x01R\x0b\x64\x65scription\x12O\n\x0bpermissions\x18\x02 \x03(\x0b\x32#.metalstack.api.v2.MethodPermissionB\x08\xbaH\x05\x92\x01\x02\x10\x64R\x0bpermissions\x12G\n\x07\x65xpires\x18\x03 \x01(\x0b\x32\x19.google.protobuf.DurationB\x12\xbaH\x0f\xaa\x01\x0c\x1a\x05\x08\x81\xe7\x84\x0f\x32\x03\x08\xd8\x04R\x07\x65xpires\x12~\n\rproject_roles\x18\x04 \x03(\x0b\x32>.metalstack.api.v2.TokenServiceCreateRequest.ProjectRolesEntryB\x19\xbaH\x16\x9a\x01\x13*\x05\x82\x01\x02\x10\x01\xc0\x95\xb8\xb1\x02\x01\xc8\x95\xb8\xb1\x02\x01R\x0cprojectRoles\x12{\n\x0ctenant_roles\x18\x05 \x03(\x0b\x32=.metalstack.api.v2.TokenServiceCreateRequest.TenantRolesEntryB\x19\xbaH\x16\x9a\x01\x13*\x05\x82\x01\x02\x10\x01\xc0\x95\xb8\xb1\x02\x01\xd0\x95\xb8\xb1\x02\x01R\x0btenantRoles\x12J\n\nadmin_role\x18\x06 \x01(\x0e\x32\x1c.metalstack.api.v2.AdminRoleB\x08\xbaH\x05\x82\x01\x02\x10\x01H\x00R\tadminRole\x88\x01\x01\x12J\n\ninfra_role\x18\x07 \x01(\x0e\x32\x1c.metalstack.api.v2.InfraRoleB\x08\xbaH\x05\x82\x01\x02\x10\x01H\x01R\tinfraRole\x88\x01\x01\x12~\n\rmachine_roles\x18\x08 \x03(\x0b\x32>.metalstack.api.v2.TokenServiceCreateRequest.MachineRolesEntryB\x19\xbaH\x16\x9a\x01\x13*\x05\x82\x01\x02\x10\x01\xc0\x95\xb8\xb1\x02\x01\xd8\x95\xb8\xb1\x02\x01R\x0cmachineRoles\x12\x31\n\x06labels\x18\t \x01(\x0b\x32\x19.metalstack.api.v2.LabelsR\x06labels\x1a_\n\x11ProjectRolesEntry\x12\x10\n\x03key\x18\x01 \x01(\tR\x03key\x12\x34\n\x05value\x18\x02 \x01(\x0e\x32\x1e.metalstack.api.v2.ProjectRoleR\x05value:\x02\x38\x01\x1a]\n\x10TenantRolesEntry\x12\x10\n\x03key\x18\x01 \x01(\tR\x03key\x12\x33\n\x05value\x18\x02 \x01(\x0e\x32\x1d.metalstack.api.v2.TenantRoleR\x05value:\x02\x38\x01\x1a_\n\x11MachineRolesEntry\x12\x10\n\x03key\x18\x01 \x01(\tR\x03key\x12\x34\n\x05value\x18\x02 \x01(\x0e\x32\x1e.metalstack.api.v2.MachineRoleR\x05value:\x02\x38\x01\x42\r\n\x0b_admin_roleB\r\n\x0b_infra_role\"[\n\x10MethodPermission\x12\"\n\x07subject\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\x18\x80\x02R\x07subject\x12#\n\x07methods\x18\x02 \x03(\tB\t\xbaH\x06\x92\x01\x03\x10\xf4\x03R\x07methods\"d\n\x1aTokenServiceCreateResponse\x12.\n\x05token\x18\x01 \x01(\x0b\x32\x18.metalstack.api.v2.TokenR\x05token\x12\x16\n\x06secret\x18\x02 \x01(\tR\x06secret\"N\n\x17TokenServiceListRequest\x12\x33\n\x05query\x18\x01 \x01(\x0b\x32\x1d.metalstack.api.v2.TokenQueryR\x05query\"L\n\x18TokenServiceListResponse\x12\x30\n\x06tokens\x18\x01 \x03(\x0b\x32\x18.metalstack.api.v2.TokenR\x06tokens\"9\n\x19TokenServiceRevokeRequest\x12\x1c\n\x04uuid\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x04uuid\"\x1c\n\x1aTokenServiceRevokeResponse\"\x99\t\n\x19TokenServiceUpdateRequest\x12\x1c\n\x04uuid\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x04uuid\x12\x46\n\x0bupdate_meta\x18\x02 \x01(\x0b\x32\x1d.metalstack.api.v2.UpdateMetaB\x06\xbaH\x03\xc8\x01\x00R\nupdateMeta\x12\x32\n\x0b\x64\x65scription\x18\x03 \x01(\tB\x0b\xbaH\x08r\x06\xc8\xb3\xae\xb1\x02\x01H\x00R\x0b\x64\x65scription\x88\x01\x01\x12\x45\n\x0bpermissions\x18\x04 \x03(\x0b\x32#.metalstack.api.v2.MethodPermissionR\x0bpermissions\x12~\n\rproject_roles\x18\x05 \x03(\x0b\x32>.metalstack.api.v2.TokenServiceUpdateRequest.ProjectRolesEntryB\x19\xbaH\x16\x9a\x01\x13*\x05\x82\x01\x02\x10\x01\xc0\x95\xb8\xb1\x02\x01\xc8\x95\xb8\xb1\x02\x01R\x0cprojectRoles\x12{\n\x0ctenant_roles\x18\x06 \x03(\x0b\x32=.metalstack.api.v2.TokenServiceUpdateRequest.TenantRolesEntryB\x19\xbaH\x16\x9a\x01\x13*\x05\x82\x01\x02\x10\x01\xc0\x95\xb8\xb1\x02\x01\xd0\x95\xb8\xb1\x02\x01R\x0btenantRoles\x12J\n\nadmin_role\x18\x07 \x01(\x0e\x32\x1c.metalstack.api.v2.AdminRoleB\x08\xbaH\x05\x82\x01\x02\x10\x01H\x01R\tadminRole\x88\x01\x01\x12J\n\ninfra_role\x18\x08 \x01(\x0e\x32\x1c.metalstack.api.v2.InfraRoleB\x08\xbaH\x05\x82\x01\x02\x10\x01H\x02R\tinfraRole\x88\x01\x01\x12~\n\rmachine_roles\x18\t \x03(\x0b\x32>.metalstack.api.v2.TokenServiceUpdateRequest.MachineRolesEntryB\x19\xbaH\x16\x9a\x01\x13*\x05\x82\x01\x02\x10\x01\xc0\x95\xb8\xb1\x02\x01\xd8\x95\xb8\xb1\x02\x01R\x0cmachineRoles\x12\x37\n\x06labels\x18\n \x01(\x0b\x32\x1f.metalstack.api.v2.UpdateLabelsR\x06labels\x1a_\n\x11ProjectRolesEntry\x12\x10\n\x03key\x18\x01 \x01(\tR\x03key\x12\x34\n\x05value\x18\x02 \x01(\x0e\x32\x1e.metalstack.api.v2.ProjectRoleR\x05value:\x02\x38\x01\x1a]\n\x10TenantRolesEntry\x12\x10\n\x03key\x18\x01 \x01(\tR\x03key\x12\x33\n\x05value\x18\x02 \x01(\x0e\x32\x1d.metalstack.api.v2.TenantRoleR\x05value:\x02\x38\x01\x1a_\n\x11MachineRolesEntry\x12\x10\n\x03key\x18\x01 \x01(\tR\x03key\x12\x34\n\x05value\x18\x02 \x01(\x0e\x32\x1e.metalstack.api.v2.MachineRoleR\x05value:\x02\x38\x01\x42\x0e\n\x0c_descriptionB\r\n\x0b_admin_roleB\r\n\x0b_infra_role\"L\n\x1aTokenServiceUpdateResponse\x12.\n\x05token\x18\x01 \x01(\x0b\x32\x18.metalstack.api.v2.TokenR\x05token\"6\n\x16TokenServiceGetRequest\x12\x1c\n\x04uuid\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01R\x04uuid\"I\n\x17TokenServiceGetResponse\x12.\n\x05token\x18\x01 \x01(\x0b\x32\x18.metalstack.api.v2.TokenR\x05token\"\x1c\n\x1aTokenServiceRefreshRequest\"e\n\x1bTokenServiceRefreshResponse\x12.\n\x05token\x18\x01 \x01(\x0b\x32\x18.metalstack.api.v2.TokenR\x05token\x12\x16\n\x06secret\x18\x02 \x01(\tR\x06secret\"\xc9\x02\n\nTokenQuery\x12!\n\x04uuid\x18\x01 \x01(\tB\x08\xbaH\x05r\x03\xb0\x01\x01H\x00R\x04uuid\x88\x01\x01\x12$\n\x04user\x18\x02 \x01(\tB\x0b\xbaH\x08r\x06\xf8\xb3\xae\xb1\x02\x01H\x01R\x04user\x88\x01\x01\x12\x32\n\x0b\x64\x65scription\x18\x03 \x01(\tB\x0b\xbaH\x08r\x06\xc8\xb3\xae\xb1\x02\x01H\x02R\x0b\x64\x65scription\x88\x01\x01\x12\x36\n\x06labels\x18\x04 \x01(\x0b\x32\x19.metalstack.api.v2.LabelsH\x03R\x06labels\x88\x01\x01\x12J\n\ntoken_type\x18\x05 \x01(\x0e\x32\x1c.metalstack.api.v2.TokenTypeB\x08\xbaH\x05\x82\x01\x02\x10\x01H\x04R\ttokenType\x88\x01\x01\x42\x07\n\x05_uuidB\x07\n\x05_userB\x0e\n\x0c_descriptionB\t\n\x07_labelsB\r\n\x0b_token_type*P\n\tTokenType\x12\x1a\n\x16TOKEN_TYPE_UNSPECIFIED\x10\x00\x12\x12\n\x0eTOKEN_TYPE_API\x10\x01\x12\x13\n\x0fTOKEN_TYPE_USER\x10\x02\x32\xa8\x05\n\x0cTokenService\x12\x66\n\x03Get\x12).metalstack.api.v2.TokenServiceGetRequest\x1a*.metalstack.api.v2.TokenServiceGetResponse\"\x08\xd8\xf3\x18\x02\xe0\xf3\x18\x01\x12o\n\x06\x43reate\x12,.metalstack.api.v2.TokenServiceCreateRequest\x1a-.metalstack.api.v2.TokenServiceCreateResponse\"\x08\xd8\xf3\x18\x02\xe0\xf3\x18\x01\x12o\n\x06Update\x12,.metalstack.api.v2.TokenServiceUpdateRequest\x1a-.metalstack.api.v2.TokenServiceUpdateResponse\"\x08\xd8\xf3\x18\x02\xe0\xf3\x18\x01\x12i\n\x04List\x12*.metalstack.api.v2.TokenServiceListRequest\x1a+.metalstack.api.v2.TokenServiceListResponse\"\x08\xd8\xf3\x18\x02\xe0\xf3\x18\x01\x12o\n\x06Revoke\x12,.metalstack.api.v2.TokenServiceRevokeRequest\x1a-.metalstack.api.v2.TokenServiceRevokeResponse\"\x08\xd8\xf3\x18\x02\xe0\xf3\x18\x01\x12r\n\x07Refresh\x12-.metalstack.api.v2.TokenServiceRefreshRequest\x1a..metalstack.api.v2.TokenServiceRefreshResponse\"\x08\xd8\xf3\x18\x02\xe0\xf3\x18\x01\x42\xc0\x01\n\x15\x63om.metalstack.api.v2B\nTokenProtoP\x01Z5github.com/metal-stack/api/go/metalstack/api/v2;apiv2\xa2\x02\x03MAX\xaa\x02\x11Metalstack.Api.V2\xca\x02\x11Metalstack\\Api\\V2\xe2\x02\x1dMetalstack\\Api\\V2\\GPBMetadata\xea\x02\x13Metalstack::Api::V2b\x06proto3') _globals = globals() _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) @@ -53,12 +53,16 @@ _globals['_TOKEN'].fields_by_name['permissions']._serialized_options = b'\272H\006\222\001\003\020\364\003' _globals['_TOKEN'].fields_by_name['token_type']._loaded_options = None _globals['_TOKEN'].fields_by_name['token_type']._serialized_options = b'\272H\005\202\001\002\020\001' + _globals['_TOKEN'].fields_by_name['project_roles']._loaded_options = None + _globals['_TOKEN'].fields_by_name['project_roles']._serialized_options = b'\272H\026\232\001\023*\005\202\001\002\020\001\300\225\270\261\002\001\310\225\270\261\002\001' + _globals['_TOKEN'].fields_by_name['tenant_roles']._loaded_options = None + _globals['_TOKEN'].fields_by_name['tenant_roles']._serialized_options = b'\272H\026\232\001\023*\005\202\001\002\020\001\300\225\270\261\002\001\320\225\270\261\002\001' _globals['_TOKEN'].fields_by_name['admin_role']._loaded_options = None _globals['_TOKEN'].fields_by_name['admin_role']._serialized_options = b'\272H\005\202\001\002\020\001' _globals['_TOKEN'].fields_by_name['infra_role']._loaded_options = None _globals['_TOKEN'].fields_by_name['infra_role']._serialized_options = b'\272H\005\202\001\002\020\001' - _globals['_TOKEN']._loaded_options = None - _globals['_TOKEN']._serialized_options = b'\272H\233\001\032\230\001\n\033token.permissions.usertoken\022)token type user must not have permissions\032N(this.token_type == 2 && this.permissions.size() == 0) || this.token_type != 2' + _globals['_TOKEN'].fields_by_name['machine_roles']._loaded_options = None + _globals['_TOKEN'].fields_by_name['machine_roles']._serialized_options = b'\272H\026\232\001\023*\005\202\001\002\020\001\300\225\270\261\002\001\330\225\270\261\002\001' _globals['_TOKENSERVICECREATEREQUEST_PROJECTROLESENTRY']._loaded_options = None _globals['_TOKENSERVICECREATEREQUEST_PROJECTROLESENTRY']._serialized_options = b'8\001' _globals['_TOKENSERVICECREATEREQUEST_TENANTROLESENTRY']._loaded_options = None @@ -72,15 +76,15 @@ _globals['_TOKENSERVICECREATEREQUEST'].fields_by_name['expires']._loaded_options = None _globals['_TOKENSERVICECREATEREQUEST'].fields_by_name['expires']._serialized_options = b'\272H\017\252\001\014\032\005\010\201\347\204\0172\003\010\330\004' _globals['_TOKENSERVICECREATEREQUEST'].fields_by_name['project_roles']._loaded_options = None - _globals['_TOKENSERVICECREATEREQUEST'].fields_by_name['project_roles']._serialized_options = b'\272H\027\232\001\024\"\005r\003\260\001\001*\005\202\001\002\020\001\300\225\270\261\002\001' + _globals['_TOKENSERVICECREATEREQUEST'].fields_by_name['project_roles']._serialized_options = b'\272H\026\232\001\023*\005\202\001\002\020\001\300\225\270\261\002\001\310\225\270\261\002\001' _globals['_TOKENSERVICECREATEREQUEST'].fields_by_name['tenant_roles']._loaded_options = None - _globals['_TOKENSERVICECREATEREQUEST'].fields_by_name['tenant_roles']._serialized_options = b'\272H\031\232\001\026\"\007r\005\020\003\030\200\001*\005\202\001\002\020\001\300\225\270\261\002\001' + _globals['_TOKENSERVICECREATEREQUEST'].fields_by_name['tenant_roles']._serialized_options = b'\272H\026\232\001\023*\005\202\001\002\020\001\300\225\270\261\002\001\320\225\270\261\002\001' _globals['_TOKENSERVICECREATEREQUEST'].fields_by_name['admin_role']._loaded_options = None _globals['_TOKENSERVICECREATEREQUEST'].fields_by_name['admin_role']._serialized_options = b'\272H\005\202\001\002\020\001' _globals['_TOKENSERVICECREATEREQUEST'].fields_by_name['infra_role']._loaded_options = None _globals['_TOKENSERVICECREATEREQUEST'].fields_by_name['infra_role']._serialized_options = b'\272H\005\202\001\002\020\001' _globals['_TOKENSERVICECREATEREQUEST'].fields_by_name['machine_roles']._loaded_options = None - _globals['_TOKENSERVICECREATEREQUEST'].fields_by_name['machine_roles']._serialized_options = b'\272H\327\001\232\001\007*\005\202\001\002\020\001\272\001\311\001\n\022machine_roles_keys\0223map keys must be empty string, \'*\', or a valid UUID\032~this.all(k, k == \'\' || k == \'*\' || k.matches(\'^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$\'))' + _globals['_TOKENSERVICECREATEREQUEST'].fields_by_name['machine_roles']._serialized_options = b'\272H\026\232\001\023*\005\202\001\002\020\001\300\225\270\261\002\001\330\225\270\261\002\001' _globals['_METHODPERMISSION'].fields_by_name['subject']._loaded_options = None _globals['_METHODPERMISSION'].fields_by_name['subject']._serialized_options = b'\272H\005r\003\030\200\002' _globals['_METHODPERMISSION'].fields_by_name['methods']._loaded_options = None @@ -100,15 +104,15 @@ _globals['_TOKENSERVICEUPDATEREQUEST'].fields_by_name['description']._loaded_options = None _globals['_TOKENSERVICEUPDATEREQUEST'].fields_by_name['description']._serialized_options = b'\272H\010r\006\310\263\256\261\002\001' _globals['_TOKENSERVICEUPDATEREQUEST'].fields_by_name['project_roles']._loaded_options = None - _globals['_TOKENSERVICEUPDATEREQUEST'].fields_by_name['project_roles']._serialized_options = b'\272H\027\232\001\024\"\005r\003\260\001\001*\005\202\001\002\020\001\300\225\270\261\002\001' + _globals['_TOKENSERVICEUPDATEREQUEST'].fields_by_name['project_roles']._serialized_options = b'\272H\026\232\001\023*\005\202\001\002\020\001\300\225\270\261\002\001\310\225\270\261\002\001' _globals['_TOKENSERVICEUPDATEREQUEST'].fields_by_name['tenant_roles']._loaded_options = None - _globals['_TOKENSERVICEUPDATEREQUEST'].fields_by_name['tenant_roles']._serialized_options = b'\272H\031\232\001\026\"\007r\005\020\003\030\200\001*\005\202\001\002\020\001\300\225\270\261\002\001' + _globals['_TOKENSERVICEUPDATEREQUEST'].fields_by_name['tenant_roles']._serialized_options = b'\272H\026\232\001\023*\005\202\001\002\020\001\300\225\270\261\002\001\320\225\270\261\002\001' _globals['_TOKENSERVICEUPDATEREQUEST'].fields_by_name['admin_role']._loaded_options = None _globals['_TOKENSERVICEUPDATEREQUEST'].fields_by_name['admin_role']._serialized_options = b'\272H\005\202\001\002\020\001' _globals['_TOKENSERVICEUPDATEREQUEST'].fields_by_name['infra_role']._loaded_options = None _globals['_TOKENSERVICEUPDATEREQUEST'].fields_by_name['infra_role']._serialized_options = b'\272H\005\202\001\002\020\001' _globals['_TOKENSERVICEUPDATEREQUEST'].fields_by_name['machine_roles']._loaded_options = None - _globals['_TOKENSERVICEUPDATEREQUEST'].fields_by_name['machine_roles']._serialized_options = b'\272H\327\001\232\001\007*\005\202\001\002\020\001\272\001\311\001\n\022machine_roles_keys\0223map keys must be empty string, \'*\', or a valid UUID\032~this.all(k, k == \'\' || k == \'*\' || k.matches(\'^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$\'))' + _globals['_TOKENSERVICEUPDATEREQUEST'].fields_by_name['machine_roles']._serialized_options = b'\272H\026\232\001\023*\005\202\001\002\020\001\300\225\270\261\002\001\330\225\270\261\002\001' _globals['_TOKENSERVICEGETREQUEST'].fields_by_name['uuid']._loaded_options = None _globals['_TOKENSERVICEGETREQUEST'].fields_by_name['uuid']._serialized_options = b'\272H\005r\003\260\001\001' _globals['_TOKENQUERY'].fields_by_name['uuid']._loaded_options = None @@ -131,56 +135,56 @@ _globals['_TOKENSERVICE'].methods_by_name['Revoke']._serialized_options = b'\330\363\030\002\340\363\030\001' _globals['_TOKENSERVICE'].methods_by_name['Refresh']._loaded_options = None _globals['_TOKENSERVICE'].methods_by_name['Refresh']._serialized_options = b'\330\363\030\002\340\363\030\001' - _globals['_TOKENTYPE']._serialized_start=5352 - _globals['_TOKENTYPE']._serialized_end=5432 + _globals['_TOKENTYPE']._serialized_start=4871 + _globals['_TOKENTYPE']._serialized_end=4951 _globals['_TOKEN']._serialized_start=221 - _globals['_TOKEN']._serialized_end=1520 - _globals['_TOKEN_PROJECTROLESENTRY']._serialized_start=1041 - _globals['_TOKEN_PROJECTROLESENTRY']._serialized_end=1136 - _globals['_TOKEN_TENANTROLESENTRY']._serialized_start=1138 - _globals['_TOKEN_TENANTROLESENTRY']._serialized_end=1231 - _globals['_TOKEN_MACHINEROLESENTRY']._serialized_start=1233 - _globals['_TOKEN_MACHINEROLESENTRY']._serialized_end=1328 - _globals['_TOKENSERVICECREATEREQUEST']._serialized_start=1523 - _globals['_TOKENSERVICECREATEREQUEST']._serialized_end=2854 - _globals['_TOKENSERVICECREATEREQUEST_PROJECTROLESENTRY']._serialized_start=1041 - _globals['_TOKENSERVICECREATEREQUEST_PROJECTROLESENTRY']._serialized_end=1136 - _globals['_TOKENSERVICECREATEREQUEST_TENANTROLESENTRY']._serialized_start=1138 - _globals['_TOKENSERVICECREATEREQUEST_TENANTROLESENTRY']._serialized_end=1231 - _globals['_TOKENSERVICECREATEREQUEST_MACHINEROLESENTRY']._serialized_start=1233 - _globals['_TOKENSERVICECREATEREQUEST_MACHINEROLESENTRY']._serialized_end=1328 - _globals['_METHODPERMISSION']._serialized_start=2856 - _globals['_METHODPERMISSION']._serialized_end=2947 - _globals['_TOKENSERVICECREATERESPONSE']._serialized_start=2949 - _globals['_TOKENSERVICECREATERESPONSE']._serialized_end=3049 - _globals['_TOKENSERVICELISTREQUEST']._serialized_start=3051 - _globals['_TOKENSERVICELISTREQUEST']._serialized_end=3129 - _globals['_TOKENSERVICELISTRESPONSE']._serialized_start=3131 - _globals['_TOKENSERVICELISTRESPONSE']._serialized_end=3207 - _globals['_TOKENSERVICEREVOKEREQUEST']._serialized_start=3209 - _globals['_TOKENSERVICEREVOKEREQUEST']._serialized_end=3266 - _globals['_TOKENSERVICEREVOKERESPONSE']._serialized_start=3268 - _globals['_TOKENSERVICEREVOKERESPONSE']._serialized_end=3296 - _globals['_TOKENSERVICEUPDATEREQUEST']._serialized_start=3299 - _globals['_TOKENSERVICEUPDATEREQUEST']._serialized_end=4676 - _globals['_TOKENSERVICEUPDATEREQUEST_PROJECTROLESENTRY']._serialized_start=1041 - _globals['_TOKENSERVICEUPDATEREQUEST_PROJECTROLESENTRY']._serialized_end=1136 - _globals['_TOKENSERVICEUPDATEREQUEST_TENANTROLESENTRY']._serialized_start=1138 - _globals['_TOKENSERVICEUPDATEREQUEST_TENANTROLESENTRY']._serialized_end=1231 - _globals['_TOKENSERVICEUPDATEREQUEST_MACHINEROLESENTRY']._serialized_start=1233 - _globals['_TOKENSERVICEUPDATEREQUEST_MACHINEROLESENTRY']._serialized_end=1328 - _globals['_TOKENSERVICEUPDATERESPONSE']._serialized_start=4678 - _globals['_TOKENSERVICEUPDATERESPONSE']._serialized_end=4754 - _globals['_TOKENSERVICEGETREQUEST']._serialized_start=4756 - _globals['_TOKENSERVICEGETREQUEST']._serialized_end=4810 - _globals['_TOKENSERVICEGETRESPONSE']._serialized_start=4812 - _globals['_TOKENSERVICEGETRESPONSE']._serialized_end=4885 - _globals['_TOKENSERVICEREFRESHREQUEST']._serialized_start=4887 - _globals['_TOKENSERVICEREFRESHREQUEST']._serialized_end=4915 - _globals['_TOKENSERVICEREFRESHRESPONSE']._serialized_start=4917 - _globals['_TOKENSERVICEREFRESHRESPONSE']._serialized_end=5018 - _globals['_TOKENQUERY']._serialized_start=5021 - _globals['_TOKENQUERY']._serialized_end=5350 - _globals['_TOKENSERVICE']._serialized_start=5435 - _globals['_TOKENSERVICE']._serialized_end=6115 + _globals['_TOKEN']._serialized_end=1439 + _globals['_TOKEN_PROJECTROLESENTRY']._serialized_start=1122 + _globals['_TOKEN_PROJECTROLESENTRY']._serialized_end=1217 + _globals['_TOKEN_TENANTROLESENTRY']._serialized_start=1219 + _globals['_TOKEN_TENANTROLESENTRY']._serialized_end=1312 + _globals['_TOKEN_MACHINEROLESENTRY']._serialized_start=1314 + _globals['_TOKEN_MACHINEROLESENTRY']._serialized_end=1409 + _globals['_TOKENSERVICECREATEREQUEST']._serialized_start=1442 + _globals['_TOKENSERVICECREATEREQUEST']._serialized_end=2573 + _globals['_TOKENSERVICECREATEREQUEST_PROJECTROLESENTRY']._serialized_start=1122 + _globals['_TOKENSERVICECREATEREQUEST_PROJECTROLESENTRY']._serialized_end=1217 + _globals['_TOKENSERVICECREATEREQUEST_TENANTROLESENTRY']._serialized_start=1219 + _globals['_TOKENSERVICECREATEREQUEST_TENANTROLESENTRY']._serialized_end=1312 + _globals['_TOKENSERVICECREATEREQUEST_MACHINEROLESENTRY']._serialized_start=1314 + _globals['_TOKENSERVICECREATEREQUEST_MACHINEROLESENTRY']._serialized_end=1409 + _globals['_METHODPERMISSION']._serialized_start=2575 + _globals['_METHODPERMISSION']._serialized_end=2666 + _globals['_TOKENSERVICECREATERESPONSE']._serialized_start=2668 + _globals['_TOKENSERVICECREATERESPONSE']._serialized_end=2768 + _globals['_TOKENSERVICELISTREQUEST']._serialized_start=2770 + _globals['_TOKENSERVICELISTREQUEST']._serialized_end=2848 + _globals['_TOKENSERVICELISTRESPONSE']._serialized_start=2850 + _globals['_TOKENSERVICELISTRESPONSE']._serialized_end=2926 + _globals['_TOKENSERVICEREVOKEREQUEST']._serialized_start=2928 + _globals['_TOKENSERVICEREVOKEREQUEST']._serialized_end=2985 + _globals['_TOKENSERVICEREVOKERESPONSE']._serialized_start=2987 + _globals['_TOKENSERVICEREVOKERESPONSE']._serialized_end=3015 + _globals['_TOKENSERVICEUPDATEREQUEST']._serialized_start=3018 + _globals['_TOKENSERVICEUPDATEREQUEST']._serialized_end=4195 + _globals['_TOKENSERVICEUPDATEREQUEST_PROJECTROLESENTRY']._serialized_start=1122 + _globals['_TOKENSERVICEUPDATEREQUEST_PROJECTROLESENTRY']._serialized_end=1217 + _globals['_TOKENSERVICEUPDATEREQUEST_TENANTROLESENTRY']._serialized_start=1219 + _globals['_TOKENSERVICEUPDATEREQUEST_TENANTROLESENTRY']._serialized_end=1312 + _globals['_TOKENSERVICEUPDATEREQUEST_MACHINEROLESENTRY']._serialized_start=1314 + _globals['_TOKENSERVICEUPDATEREQUEST_MACHINEROLESENTRY']._serialized_end=1409 + _globals['_TOKENSERVICEUPDATERESPONSE']._serialized_start=4197 + _globals['_TOKENSERVICEUPDATERESPONSE']._serialized_end=4273 + _globals['_TOKENSERVICEGETREQUEST']._serialized_start=4275 + _globals['_TOKENSERVICEGETREQUEST']._serialized_end=4329 + _globals['_TOKENSERVICEGETRESPONSE']._serialized_start=4331 + _globals['_TOKENSERVICEGETRESPONSE']._serialized_end=4404 + _globals['_TOKENSERVICEREFRESHREQUEST']._serialized_start=4406 + _globals['_TOKENSERVICEREFRESHREQUEST']._serialized_end=4434 + _globals['_TOKENSERVICEREFRESHRESPONSE']._serialized_start=4436 + _globals['_TOKENSERVICEREFRESHRESPONSE']._serialized_end=4537 + _globals['_TOKENQUERY']._serialized_start=4540 + _globals['_TOKENQUERY']._serialized_end=4869 + _globals['_TOKENSERVICE']._serialized_start=4954 + _globals['_TOKENSERVICE']._serialized_end=5634 # @@protoc_insertion_point(module_scope)