diff --git a/generate/generate.go b/generate/generate.go index 29e4970d..6910ff42 100644 --- a/generate/generate.go +++ b/generate/generate.go @@ -143,48 +143,27 @@ func servicePermissions(root string) (*permissions.ServicePermissions, error) { } auditable[methodName] = true // Tenant - switch *methodOpt.IdentifierValue { - case v1.TenantRole_TENANT_ROLE_OWNER.String(): - roles.Tenant[v1.TenantRole_TENANT_ROLE_OWNER.String()] = append(roles.Tenant[v1.TenantRole_TENANT_ROLE_OWNER.String()], methodName) - visibility.Tenant[methodName] = true - case v1.TenantRole_TENANT_ROLE_EDITOR.String(): - roles.Tenant[v1.TenantRole_TENANT_ROLE_EDITOR.String()] = append(roles.Tenant[v1.TenantRole_TENANT_ROLE_EDITOR.String()], methodName) - visibility.Tenant[methodName] = true - case v1.TenantRole_TENANT_ROLE_VIEWER.String(): - roles.Tenant[v1.TenantRole_TENANT_ROLE_VIEWER.String()] = append(roles.Tenant[v1.TenantRole_TENANT_ROLE_VIEWER.String()], methodName) - visibility.Tenant[methodName] = true - case v1.TenantRole_TENANT_ROLE_GUEST.String(): - roles.Tenant[v1.TenantRole_TENANT_ROLE_GUEST.String()] = append(roles.Tenant[v1.TenantRole_TENANT_ROLE_GUEST.String()], methodName) + switch role := *methodOpt.IdentifierValue; role { + case v1.TenantRole_TENANT_ROLE_OWNER.String(), v1.TenantRole_TENANT_ROLE_EDITOR.String(), v1.TenantRole_TENANT_ROLE_VIEWER.String(), v1.TenantRole_TENANT_ROLE_GUEST.String(): + roles.Tenant[role] = append(roles.Tenant[role], methodName) visibility.Tenant[methodName] = true case v1.TenantRole_TENANT_ROLE_UNSPECIFIED.String(): // noop // Project - case v1.ProjectRole_PROJECT_ROLE_OWNER.String(): - roles.Project[v1.ProjectRole_PROJECT_ROLE_OWNER.String()] = append(roles.Project[v1.ProjectRole_PROJECT_ROLE_OWNER.String()], methodName) - visibility.Project[methodName] = true - case v1.ProjectRole_PROJECT_ROLE_EDITOR.String(): + case v1.ProjectRole_PROJECT_ROLE_OWNER.String(), v1.ProjectRole_PROJECT_ROLE_EDITOR.String(), v1.ProjectRole_PROJECT_ROLE_VIEWER.String(): + roles.Project[role] = append(roles.Project[role], methodName) visibility.Project[methodName] = true - roles.Project[v1.ProjectRole_PROJECT_ROLE_EDITOR.String()] = append(roles.Project[v1.ProjectRole_PROJECT_ROLE_EDITOR.String()], methodName) - case v1.ProjectRole_PROJECT_ROLE_VIEWER.String(): - visibility.Project[methodName] = true - roles.Project[v1.ProjectRole_PROJECT_ROLE_VIEWER.String()] = append(roles.Project[v1.ProjectRole_PROJECT_ROLE_VIEWER.String()], methodName) case v1.ProjectRole_PROJECT_ROLE_UNSPECIFIED.String(): // noop // Admin - case v1.AdminRole_ADMIN_ROLE_EDITOR.String(): - roles.Admin[v1.AdminRole_ADMIN_ROLE_EDITOR.String()] = append(roles.Admin[v1.AdminRole_ADMIN_ROLE_EDITOR.String()], methodName) - visibility.Admin[methodName] = true - case v1.AdminRole_ADMIN_ROLE_VIEWER.String(): - roles.Admin[v1.AdminRole_ADMIN_ROLE_VIEWER.String()] = append(roles.Admin[v1.AdminRole_ADMIN_ROLE_VIEWER.String()], methodName) + case v1.AdminRole_ADMIN_ROLE_EDITOR.String(), v1.AdminRole_ADMIN_ROLE_VIEWER.String(): + roles.Admin[role] = append(roles.Admin[role], methodName) visibility.Admin[methodName] = true case v1.AdminRole_ADMIN_ROLE_UNSPECIFIED.String(): // noop // Infra - case v1.InfraRole_INFRA_ROLE_EDITOR.String(): - roles.Infra[v1.InfraRole_INFRA_ROLE_EDITOR.String()] = append(roles.Infra[v1.InfraRole_INFRA_ROLE_EDITOR.String()], methodName) - visibility.Infra[methodName] = true - case v1.InfraRole_INFRA_ROLE_VIEWER.String(): - roles.Infra[v1.InfraRole_INFRA_ROLE_VIEWER.String()] = append(roles.Infra[v1.InfraRole_INFRA_ROLE_VIEWER.String()], methodName) + case v1.InfraRole_INFRA_ROLE_EDITOR.String(), v1.InfraRole_INFRA_ROLE_VIEWER.String(): + roles.Infra[role] = append(roles.Infra[role], methodName) visibility.Infra[methodName] = true case v1.InfraRole_INFRA_ROLE_UNSPECIFIED.String(): // noop diff --git a/go.mod b/go.mod index db4089c2..b0f7bdb8 100644 --- a/go.mod +++ b/go.mod @@ -3,8 +3,8 @@ module github.com/metal-stack/api go 1.25 require ( - buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.36.10-20250912141014-52f32327d4b0.1 - buf.build/go/protovalidate v1.0.1 + buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.36.10-20251209175733-2a1774d88802.1 + buf.build/go/protovalidate v1.1.0 connectrpc.com/connect v1.19.1 github.com/bufbuild/protocompile v0.14.1 github.com/go-task/slim-sprig/v3 v3.0.0 @@ -20,16 +20,16 @@ require ( 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.26.1 // indirect - github.com/klauspost/compress v1.18.1 // indirect + github.com/klauspost/compress v1.18.2 // indirect github.com/kr/pretty v0.3.1 // indirect github.com/minio/minlz v1.0.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/stoewer/go-strcase v1.3.1 // indirect github.com/stretchr/objx v0.5.3 // indirect - golang.org/x/exp v0.0.0-20251113190631-e25ba8c21ef6 // indirect - golang.org/x/text v0.31.0 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20251111163417-95abcf5c77ba // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20251111163417-95abcf5c77ba // indirect + golang.org/x/exp v0.0.0-20251209150349-8475f28825e9 // indirect + golang.org/x/text v0.32.0 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20251202230838-ff82c1b0f217 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20251202230838-ff82c1b0f217 // 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 913c918f..17f2eb64 100644 --- a/go.sum +++ b/go.sum @@ -1,7 +1,7 @@ -buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.36.10-20250912141014-52f32327d4b0.1 h1:31on4W/yPcV4nZHL4+UCiCvLPsMqe/vJcNg8Rci0scc= -buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.36.10-20250912141014-52f32327d4b0.1/go.mod h1:fUl8CEN/6ZAMk6bP8ahBJPUJw7rbp+j4x+wCcYi2IG4= -buf.build/go/protovalidate v1.0.1 h1:Fwmf08OOUuKVeMvEnDmcKxQam4PJc/zFgvVX64BhTms= -buf.build/go/protovalidate v1.0.1/go.mod h1:SoZmvk/3ZzOVg9YSkTdm4grMAByjf8zgZq4ZNaLZXoQ= +buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.36.10-20251209175733-2a1774d88802.1 h1:ZnX3qpF/pDiYrf+Q3p+/zCzZ5ELSpszy5hdVarDMSV4= +buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.36.10-20251209175733-2a1774d88802.1/go.mod h1:fUl8CEN/6ZAMk6bP8ahBJPUJw7rbp+j4x+wCcYi2IG4= +buf.build/go/protovalidate v1.1.0 h1:pQqEQRpOo4SqS60qkvmhLTTQU9JwzEvdyiqAtXa5SeY= +buf.build/go/protovalidate v1.1.0/go.mod h1:bGZcPiAQDC3ErCHK3t74jSoJDFOs2JH3d7LWuTEIdss= cel.dev/expr v0.25.1 h1:1KrZg61W6TWSxuNZ37Xy49ps13NUovb66QLprthtwi4= cel.dev/expr v0.25.1/go.mod h1:hrXvqGP6G6gyx8UAHSHJ5RGk//1Oj5nXQ2NI02Nrsg4= connectrpc.com/connect v1.19.1 h1:R5M57z05+90EfEvCY1b7hBxDVOUl45PrtXtAV2fOC14= @@ -24,8 +24,8 @@ github.com/google/cel-go v0.26.1 h1:iPbVVEdkhTX++hpe3lzSk7D3G3QSYqLGoHOcEio+UXQ= github.com/google/cel-go v0.26.1/go.mod h1:A9O8OU9rdvrK5MQyrqfIxo1a0u4g3sF8KB6PUIaryMM= 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/klauspost/compress v1.18.1 h1:bcSGx7UbpBqMChDtsF28Lw6v/G94LPrrbMbdC3JH2co= -github.com/klauspost/compress v1.18.1/go.mod h1:ZQFFVG+MdnR0P+l6wpXgIL4NTtwiKIdBnrBd8Nrxr+0= +github.com/klauspost/compress v1.18.2 h1:iiPHWW0YrcFgpBYhsA6D1+fqHssJscY/Tm/y2Uqnapk= +github.com/klauspost/compress v1.18.2/go.mod h1:R0h/fSBs8DE4ENlcrlib3PsXS61voFxhIs2DeRhCvJ4= github.com/klauspost/connect-compress/v2 v2.1.0 h1:8fM8QrVeHT69e5VVSh4yjDaQASYIvOp2uMZq7nVLj2U= github.com/klauspost/connect-compress/v2 v2.1.0/go.mod h1:Ayurh2wscMMx3AwdGGVL+ylSR5316WfApREDgsqHyH8= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= @@ -56,14 +56,14 @@ github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= -golang.org/x/exp v0.0.0-20251113190631-e25ba8c21ef6 h1:zfMcR1Cs4KNuomFFgGefv5N0czO2XZpUbxGUy8i8ug0= -golang.org/x/exp v0.0.0-20251113190631-e25ba8c21ef6/go.mod h1:46edojNIoXTNOhySWIWdix628clX9ODXwPsQuG6hsK0= -golang.org/x/text v0.31.0 h1:aC8ghyu4JhP8VojJ2lEHBnochRno1sgL6nEi9WGFGMM= -golang.org/x/text v0.31.0/go.mod h1:tKRAlv61yKIjGGHX/4tP1LTbc13YSec1pxVEWXzfoeM= -google.golang.org/genproto/googleapis/api v0.0.0-20251111163417-95abcf5c77ba h1:B14OtaXuMaCQsl2deSvNkyPKIzq3BjfxQp8d00QyWx4= -google.golang.org/genproto/googleapis/api v0.0.0-20251111163417-95abcf5c77ba/go.mod h1:G5IanEx8/PgI9w6CFcYQf7jMtHQhZruvfM1i3qOqk5U= -google.golang.org/genproto/googleapis/rpc v0.0.0-20251111163417-95abcf5c77ba h1:UKgtfRM7Yh93Sya0Fo8ZzhDP4qBckrrxEr2oF5UIVb8= -google.golang.org/genproto/googleapis/rpc v0.0.0-20251111163417-95abcf5c77ba/go.mod h1:7i2o+ce6H/6BluujYR+kqX3GKH+dChPTQU19wjRPiGk= +golang.org/x/exp v0.0.0-20251209150349-8475f28825e9 h1:MDfG8Cvcqlt9XXrmEiD4epKn7VJHZO84hejP9Jmp0MM= +golang.org/x/exp v0.0.0-20251209150349-8475f28825e9/go.mod h1:EPRbTFwzwjXj9NpYyyrvenVh9Y+GFeEvMNh7Xuz7xgU= +golang.org/x/text v0.32.0 h1:ZD01bjUt1FQ9WJ0ClOL5vxgxOI/sVCNgX1YtKwcY0mU= +golang.org/x/text v0.32.0/go.mod h1:o/rUWzghvpD5TXrTIBuJU77MTaN0ljMWE47kxGJQ7jY= +google.golang.org/genproto/googleapis/api v0.0.0-20251202230838-ff82c1b0f217 h1:fCvbg86sFXwdrl5LgVcTEvNC+2txB5mgROGmRL5mrls= +google.golang.org/genproto/googleapis/api v0.0.0-20251202230838-ff82c1b0f217/go.mod h1:+rXWjjaukWZun3mLfjmVnQi18E1AsFbDN9QdJ5YXLto= +google.golang.org/genproto/googleapis/rpc v0.0.0-20251202230838-ff82c1b0f217 h1:gRkg/vSppuSQoDjxyiGfN4Upv/h/DQmIR10ZU8dh4Ww= +google.golang.org/genproto/googleapis/rpc v0.0.0-20251202230838-ff82c1b0f217/go.mod h1:7i2o+ce6H/6BluujYR+kqX3GKH+dChPTQU19wjRPiGk= google.golang.org/protobuf v1.36.10 h1:AYd7cD/uASjIL6Q9LiTjz8JLcrh/88q5UObnmY3aOOE= google.golang.org/protobuf v1.36.10/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff --git a/go/tests/mocks/client/Adminv2.go b/go/tests/mocks/client/Adminv2.go index ae2ac1a0..8ebd1022 100644 --- a/go/tests/mocks/client/Adminv2.go +++ b/go/tests/mocks/client/Adminv2.go @@ -312,6 +312,52 @@ func (_c *Adminv2_Partition_Call) RunAndReturn(run func() adminv2connect.Partiti return _c } +// Project provides a mock function for the type Adminv2 +func (_mock *Adminv2) Project() adminv2connect.ProjectServiceClient { + ret := _mock.Called() + + if len(ret) == 0 { + panic("no return value specified for Project") + } + + var r0 adminv2connect.ProjectServiceClient + if returnFunc, ok := ret.Get(0).(func() adminv2connect.ProjectServiceClient); ok { + r0 = returnFunc() + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(adminv2connect.ProjectServiceClient) + } + } + return r0 +} + +// Adminv2_Project_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'Project' +type Adminv2_Project_Call struct { + *mock.Call +} + +// Project is a helper method to define mock.On call +func (_e *Adminv2_Expecter) Project() *Adminv2_Project_Call { + return &Adminv2_Project_Call{Call: _e.mock.On("Project")} +} + +func (_c *Adminv2_Project_Call) Run(run func()) *Adminv2_Project_Call { + _c.Call.Run(func(args mock.Arguments) { + run() + }) + return _c +} + +func (_c *Adminv2_Project_Call) Return(projectServiceClient adminv2connect.ProjectServiceClient) *Adminv2_Project_Call { + _c.Call.Return(projectServiceClient) + return _c +} + +func (_c *Adminv2_Project_Call) RunAndReturn(run func() adminv2connect.ProjectServiceClient) *Adminv2_Project_Call { + _c.Call.Return(run) + return _c +} + // Size provides a mock function for the type Adminv2 func (_mock *Adminv2) Size() adminv2connect.SizeServiceClient { ret := _mock.Called() diff --git a/go/tests/validation/filesystem_test.go b/go/tests/validation/filesystem_test.go index 934d7bc4..3cdd0a97 100644 --- a/go/tests/validation/filesystem_test.go +++ b/go/tests/validation/filesystem_test.go @@ -25,9 +25,9 @@ func TestValidateFilesystem(t *testing.T) { Device: "/", }, wantErr: true, - wantErrorMessage: `validation error: - - device: value length must be at least 2 characters [string.min_len] - - format: value is required [required]`, + wantErrorMessage: `validation errors: + - device: value length must be at least 2 characters + - format: value is required`, }, { name: "Invalid Filesystem, device to short, format invalid", @@ -35,9 +35,8 @@ func TestValidateFilesystem(t *testing.T) { Device: "/dev/sda3", Format: apiv2.Format(99), }, - wantErr: true, - wantErrorMessage: `validation error: - - format: value must be one of the defined enum values [enum.defined_only]`, + wantErr: true, + wantErrorMessage: `validation error: format: value must be one of the defined enum values`, }, { name: "Valid FilesystemLayout minimal config", @@ -62,9 +61,8 @@ func TestValidateFilesystem(t *testing.T) { Name: proto.String("c"), Description: proto.String("c1-large"), }, - wantErr: true, - wantErrorMessage: `validation error: - - name: must be within 2 and 128 characters [string.is_name]`}, + wantErr: true, + wantErrorMessage: `validation error: name: must be within 2 and 128 characters`}, } validateProtos(t, tests) diff --git a/go/tests/validation/firewall-rule_test.go b/go/tests/validation/firewall-rule_test.go index c37d2063..62c5d1f1 100644 --- a/go/tests/validation/firewall-rule_test.go +++ b/go/tests/validation/firewall-rule_test.go @@ -17,10 +17,10 @@ func TestValidateFirewallRules(t *testing.T) { Comment: "a rule", }, wantErr: true, - wantErrorMessage: `validation error: - - protocol: value must be one of the defined enum values [enum.defined_only] - - ports[0]: value must be less than or equal to 65532 [uint32.lte] - - to: given prefixes must be valid [repeated.prefixes]`, + wantErrorMessage: `validation errors: + - protocol: value must be one of the defined enum values + - ports[0]: value must be less than or equal to 65532 + - to: given prefixes must be valid`, }, { name: "Invalid Rule with invalid comment", @@ -31,7 +31,7 @@ func TestValidateFirewallRules(t *testing.T) { Comment: "a # invalid 3 rule", }, wantErr: true, - wantErrorMessage: "validation error:\n - comment: value does not match regex pattern `^[a-z_ -]*$` [string.pattern]", + wantErrorMessage: "validation error: comment: value does not match regex pattern `^[a-z_ -]*$`", }, } diff --git a/go/tests/validation/image_test.go b/go/tests/validation/image_test.go index 46aba6b4..056ba6d5 100644 --- a/go/tests/validation/image_test.go +++ b/go/tests/validation/image_test.go @@ -27,9 +27,8 @@ func TestValidateImage(t *testing.T) { Url: "not-a-uri", Features: []apiv2.ImageFeature{apiv2.ImageFeature_IMAGE_FEATURE_MACHINE}, }, - wantErr: true, - wantErrorMessage: `validation error: - - url: given uri must be valid [string.uri]`, + wantErr: true, + wantErrorMessage: `validation error: url: given uri must be valid`, }, { name: "Invalid Image, no features", @@ -38,9 +37,8 @@ func TestValidateImage(t *testing.T) { Url: "http://download.org/debian:12.0", Features: []apiv2.ImageFeature{3}, }, - wantErr: true, - wantErrorMessage: `validation error: - - features[0]: value must be one of the defined enum values [enum.defined_only]`, + wantErr: true, + wantErrorMessage: `validation error: features[0]: value must be one of the defined enum values`, }, { name: "Valid ImageUpdate minimal config", @@ -62,9 +60,8 @@ func TestValidateImage(t *testing.T) { Features: []apiv2.ImageFeature{apiv2.ImageFeature_IMAGE_FEATURE_MACHINE, apiv2.ImageFeature_IMAGE_FEATURE_MACHINE}, Classification: apiv2.ImageClassification_IMAGE_CLASSIFICATION_PREVIEW, }, - wantErr: true, - wantErrorMessage: `validation error: - - features: repeated value must contain unique items [repeated.unique]`, + wantErr: true, + wantErrorMessage: `validation error: features: repeated value must contain unique items`, }, { name: "InValid ImageUpdate invalid Features", @@ -75,9 +72,8 @@ func TestValidateImage(t *testing.T) { Features: []apiv2.ImageFeature{apiv2.ImageFeature_IMAGE_FEATURE_MACHINE, 3}, Classification: apiv2.ImageClassification_IMAGE_CLASSIFICATION_PREVIEW, }, - wantErr: true, - wantErrorMessage: `validation error: - - features[1]: value must be one of the defined enum values [enum.defined_only]`, + wantErr: true, + wantErrorMessage: `validation error: features[1]: value must be one of the defined enum values`, }, } diff --git a/go/tests/validation/ip_test.go b/go/tests/validation/ip_test.go index fd7fa5d3..c405e88c 100644 --- a/go/tests/validation/ip_test.go +++ b/go/tests/validation/ip_test.go @@ -15,12 +15,12 @@ func TestValidateIP(t *testing.T) { Uuid: "abc", }, wantErr: true, - wantErrorMessage: `validation error: - - uuid: value must be a valid UUID [string.uuid] - - ip: value is empty, which is not a valid IP address [string.ip_empty] - - name: must be within 2 and 128 characters [string.is_name] - - network: value length must be at least 2 characters [string.min_len] - - project: value is empty, which is not a valid UUID [string.uuid_empty]`, + wantErrorMessage: `validation errors: + - uuid: value must be a valid UUID + - ip: value is empty, which is not a valid IP address + - name: must be within 2 and 128 characters + - network: value length must be at least 2 characters + - project: value is empty, which is not a valid UUID`, }, { name: "Invalid IP, but valid uuid", @@ -29,11 +29,11 @@ func TestValidateIP(t *testing.T) { Description: "A IP", }, wantErr: true, - wantErrorMessage: `validation error: - - ip: value is empty, which is not a valid IP address [string.ip_empty] - - name: must be within 2 and 128 characters [string.is_name] - - network: value length must be at least 2 characters [string.min_len] - - project: value is empty, which is not a valid UUID [string.uuid_empty]`, + wantErrorMessage: `validation errors: + - ip: value is empty, which is not a valid IP address + - name: must be within 2 and 128 characters + - network: value length must be at least 2 characters + - project: value is empty, which is not a valid UUID`, }, { name: "Invalid IP, but valid uuid and ipv4", @@ -43,10 +43,10 @@ func TestValidateIP(t *testing.T) { Description: "A IP", }, wantErr: true, - wantErrorMessage: `validation error: - - name: must be within 2 and 128 characters [string.is_name] - - network: value length must be at least 2 characters [string.min_len] - - project: value is empty, which is not a valid UUID [string.uuid_empty]`, + wantErrorMessage: `validation errors: + - name: must be within 2 and 128 characters + - network: value length must be at least 2 characters + - project: value is empty, which is not a valid UUID`, }, { name: "Invalid IP, but valid uuid and ipv6", @@ -56,10 +56,10 @@ func TestValidateIP(t *testing.T) { Description: "A IP", }, wantErr: true, - wantErrorMessage: `validation error: - - name: must be within 2 and 128 characters [string.is_name] - - network: value length must be at least 2 characters [string.min_len] - - project: value is empty, which is not a valid UUID [string.uuid_empty]`, + wantErrorMessage: `validation errors: + - name: must be within 2 and 128 characters + - network: value length must be at least 2 characters + - project: value is empty, which is not a valid UUID`, }, { name: "Invalid IP, but valid uuid, name and ipv6", @@ -70,9 +70,9 @@ func TestValidateIP(t *testing.T) { Description: "A IP", }, wantErr: true, - wantErrorMessage: `validation error: - - network: value length must be at least 2 characters [string.min_len] - - project: value is empty, which is not a valid UUID [string.uuid_empty]`, + wantErrorMessage: `validation errors: + - network: value length must be at least 2 characters + - project: value is empty, which is not a valid UUID`, }, { name: "Invalid IP, but valid uuid, name, network and ipv6", @@ -83,9 +83,8 @@ func TestValidateIP(t *testing.T) { Network: "Internet", Description: "A IP", }, - wantErr: true, - wantErrorMessage: `validation error: - - project: value is empty, which is not a valid UUID [string.uuid_empty]`, + wantErr: true, + wantErrorMessage: `validation error: project: value is empty, which is not a valid UUID`, }, { name: "Invalid IP with invalid type", @@ -98,9 +97,8 @@ func TestValidateIP(t *testing.T) { Type: apiv2.IPType(99), Description: "A IP", }, - wantErr: true, - wantErrorMessage: `validation error: - - type: value must be one of the defined enum values [enum.defined_only]`, + wantErr: true, + wantErrorMessage: `validation error: type: value must be one of the defined enum values`, }, { name: "Valid IP", @@ -120,9 +118,9 @@ func TestValidateIP(t *testing.T) { name: "invalid IPServiceGetRequest", msg: &apiv2.IPServiceGetRequest{}, wantErr: true, - wantErrorMessage: `validation error: - - ip: value is empty, which is not a valid IP address [string.ip_empty] - - project: value is empty, which is not a valid UUID [string.uuid_empty]`, + wantErrorMessage: `validation errors: + - ip: value is empty, which is not a valid IP address + - project: value is empty, which is not a valid UUID`, }, { name: "Valid IPServiceGetRequest", @@ -137,9 +135,9 @@ func TestValidateIP(t *testing.T) { name: "invalid IPServiceCreateRequest", msg: &apiv2.IPServiceCreateRequest{}, wantErr: true, - wantErrorMessage: `validation error: - - network: value length must be at least 2 characters [string.min_len] - - project: value is empty, which is not a valid UUID [string.uuid_empty]`, + wantErrorMessage: `validation errors: + - network: value length must be at least 2 characters + - project: value is empty, which is not a valid UUID`, }, { name: "Valid IPServiceCreateRequest", @@ -157,9 +155,8 @@ func TestValidateIP(t *testing.T) { Project: "57cd8678-9ff0-4f8c-a34a-43d8f16caadf", Name: proto.String("a"), }, - wantErr: true, - wantErrorMessage: `validation error: - - name: must be within 2 and 128 characters [string.is_name]`, + wantErr: true, + wantErrorMessage: `validation error: name: must be within 2 and 128 characters`, }, } diff --git a/go/tests/validation/machine_test.go b/go/tests/validation/machine_test.go index 962637d1..b589a902 100644 --- a/go/tests/validation/machine_test.go +++ b/go/tests/validation/machine_test.go @@ -13,18 +13,16 @@ func TestValidateMachine(t *testing.T) { msg: &apiv2.MachineNicQuery{ Macs: []string{"abc"}, }, - wantErr: true, - wantErrorMessage: `validation error: - - macs[0]: this string must be a valid macaddress [string.macaddress]`, + wantErr: true, + wantErrorMessage: `validation error: macs[0]: this string must be a valid macaddress`, }, { name: "MachineNicQuery with invalid and valid MACs mixed", msg: &apiv2.MachineNicQuery{ Macs: []string{"abc", "00:80:41:ae:fd:7e"}, }, - wantErr: true, - wantErrorMessage: `validation error: - - macs[0]: this string must be a valid macaddress [string.macaddress]`, + wantErr: true, + wantErrorMessage: `validation error: macs[0]: this string must be a valid macaddress`, }, { name: "MachineNicQuery with valid MACs mixed", @@ -45,9 +43,8 @@ func TestValidateMachine(t *testing.T) { msg: &apiv2.MachineNetworkQuery{ Ips: []string{"1.2.3.4.5"}, }, - wantErr: true, - wantErrorMessage: `validation error: - - ips: given ips must be valid [repeated.ips]`, + wantErr: true, + wantErrorMessage: `validation error: ips: given ips must be valid`, }, } validateProtos(t, tests) diff --git a/go/tests/validation/network_test.go b/go/tests/validation/network_test.go index bbd3ff55..6203930f 100644 --- a/go/tests/validation/network_test.go +++ b/go/tests/validation/network_test.go @@ -28,9 +28,9 @@ func TestValidateNetwork(t *testing.T) { DestinationPrefixes: []string{"0.0.0.0.0/0"}, }, wantErr: true, - wantErrorMessage: `validation error: - - prefixes: given prefixes must be valid [repeated.prefixes] - - destination_prefixes: given prefixes must be valid [repeated.prefixes]`, + wantErrorMessage: `validation errors: + - prefixes: given prefixes must be valid + - destination_prefixes: given prefixes must be valid`, }, { name: "Valid Network minimal config", @@ -47,9 +47,9 @@ func TestValidateNetwork(t *testing.T) { Prefixes: []string{"1.2.3.4.5/99"}, DestinationPrefixes: []string{"0.0.0.0.0/0"}}, wantErr: true, - wantErrorMessage: `validation error: - - prefixes: given prefixes must be valid [repeated.prefixes] - - destination_prefixes: given prefixes must be valid [repeated.prefixes]`, + wantErrorMessage: `validation errors: + - prefixes: given prefixes must be valid + - destination_prefixes: given prefixes must be valid`, }, } validateProtos(t, tests) diff --git a/go/tests/validation/switch_test.go b/go/tests/validation/switch_test.go index b1a785ab..9bc216c3 100644 --- a/go/tests/validation/switch_test.go +++ b/go/tests/validation/switch_test.go @@ -17,9 +17,8 @@ func TestValidateSwitch(t *testing.T) { Mac: "abc", Vrf: proto.String("10"), }, - wantErr: true, - wantErrorMessage: `validation error: - - mac: this string must be a valid macaddress [string.macaddress]`, + wantErr: true, + wantErrorMessage: `validation error: mac: this string must be a valid macaddress`, }, { name: "SwitchNic with valid lowercase MAC", @@ -61,9 +60,8 @@ func TestValidateSwitch(t *testing.T) { ManagementUser: proto.String("admin"), ConsoleCommand: proto.String("ssh"), }, - wantErr: true, - wantErrorMessage: `validation error: - - id: value must be a valid hostname [string.hostname]`, + wantErr: true, + wantErrorMessage: `validation error: id: value must be a valid hostname`, }, } validateProtos(t, tests) diff --git a/go/tests/validation/token_test.go b/go/tests/validation/token_test.go index f4dd5032..7823b9ad 100644 --- a/go/tests/validation/token_test.go +++ b/go/tests/validation/token_test.go @@ -32,9 +32,9 @@ func TestValidateToken(t *testing.T) { }, }, wantErr: true, - wantErrorMessage: `validation error: - - project_roles["p42"]: value must be a valid UUID [string.uuid] - - project_roles["p42"]: value must be one of the defined enum values [enum.defined_only]`, + wantErrorMessage: `validation errors: + - project_roles["p42"]: value must be a valid UUID + - project_roles["p42"]: value must be one of the defined enum values`, }, { name: "InValid Token Create Request", @@ -44,9 +44,8 @@ func TestValidateToken(t *testing.T) { "00000000-0000-0000-0000-000000000000": 5, }, }, - wantErr: true, - wantErrorMessage: `validation error: - - project_roles["00000000-0000-0000-0000-000000000000"]: value must be one of the defined enum values [enum.defined_only]`, + wantErr: true, + wantErrorMessage: `validation error: project_roles["00000000-0000-0000-0000-000000000000"]: value must be one of the defined enum values`, }, { name: "InValid Token, user token with permissions", @@ -62,9 +61,8 @@ func TestValidateToken(t *testing.T) { }, TokenType: apiv2.TokenType_TOKEN_TYPE_USER, }, - wantErr: true, - wantErrorMessage: `validation error: - - token type user must not have permissions [token.permissions.usertoken]`, + wantErr: true, + wantErrorMessage: `validation error: token type user must not have permissions`, }, { name: "Valid Token, api token with permissions", diff --git a/proto/Makefile b/proto/Makefile index 17f3f28e..09bcda9f 100644 --- a/proto/Makefile +++ b/proto/Makefile @@ -1,5 +1,5 @@ MAKEFLAGS += --no-print-directory -BUF_VERSION := 1.60.0 +BUF_VERSION := 1.61.0 _buf: docker run --rm \