From b4a0671e5f28d2c8db553271eb895d6310146485 Mon Sep 17 00:00:00 2001 From: Brian Neville <29639579+brianneville@users.noreply.github.com> Date: Wed, 21 Jan 2026 20:22:42 +0000 Subject: [PATCH 1/2] update to gnoi v0.8.0 --- go.mod | 22 ++++++++++----------- go.sum | 60 +++++++++++++++++++++++++++++----------------------------- 2 files changed, 41 insertions(+), 41 deletions(-) diff --git a/go.mod b/go.mod index d7f7103..708094c 100644 --- a/go.mod +++ b/go.mod @@ -11,11 +11,11 @@ require ( github.com/google/go-cmp v0.7.0 github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 github.com/moby/moby v28.5.2+incompatible - github.com/openconfig/gnoi v0.7.0 + github.com/openconfig/gnoi v0.8.0 github.com/opencontainers/image-spec v1.1.1 github.com/spf13/cobra v1.10.1 golang.org/x/sys v0.38.0 - google.golang.org/grpc v1.76.0 + google.golang.org/grpc v1.77.0 google.golang.org/protobuf v1.36.10 k8s.io/klog/v2 v2.130.1 ) @@ -49,16 +49,16 @@ require ( github.com/pkg/errors v0.9.1 // indirect github.com/sirupsen/logrus v1.9.3 // indirect github.com/spf13/pflag v1.0.9 // indirect - go.opentelemetry.io/auto/sdk v1.1.0 // indirect + go.opentelemetry.io/auto/sdk v1.2.1 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.59.0 // indirect - go.opentelemetry.io/otel v1.37.0 // indirect + go.opentelemetry.io/otel v1.38.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.34.0 // indirect - go.opentelemetry.io/otel/metric v1.37.0 // indirect - go.opentelemetry.io/otel/trace v1.37.0 // indirect - golang.org/x/net v0.42.0 // indirect - golang.org/x/sync v0.16.0 // indirect - golang.org/x/term v0.33.0 // indirect - golang.org/x/text v0.27.0 // indirect + go.opentelemetry.io/otel/metric v1.38.0 // indirect + go.opentelemetry.io/otel/trace v1.38.0 // indirect + golang.org/x/net v0.46.1-0.20251013234738-63d1a5100f82 // indirect + golang.org/x/sync v0.17.0 // indirect + golang.org/x/term v0.36.0 // indirect + golang.org/x/text v0.30.0 // indirect golang.org/x/time v0.9.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20250908214217-97024824d090 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20251111163417-95abcf5c77ba // indirect ) diff --git a/go.sum b/go.sum index 4faee7f..01907e9 100644 --- a/go.sum +++ b/go.sum @@ -75,8 +75,8 @@ github.com/moby/term v0.5.2 h1:6qk3FJAFDs6i/q3W/pQ97SX192qKfZgGjCQqfCJkgzQ= github.com/moby/term v0.5.2/go.mod h1:d3djjFCrjnB+fl8NJux+EJzu0msscUP+f8it8hPkFLc= github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= -github.com/openconfig/gnoi v0.7.0 h1:4tpZkmyOQGzpbERtYoEEhzaUa0YhvdjRInZtAL6PwAk= -github.com/openconfig/gnoi v0.7.0/go.mod h1:UWK+WdtOvS7Ri3QAQRuMiB3GVrVFoE6WjlCSiSEra7I= +github.com/openconfig/gnoi v0.8.0 h1:fwZm4zlwoY5i7KALTpVhpAv53Y3YskleoTpg1IUCa+c= +github.com/openconfig/gnoi v0.8.0/go.mod h1:/kbYAWyBjQ08oahe7VGG8lAJc+yIfXdD7CF/T8RUjl0= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= github.com/opencontainers/image-spec v1.1.1 h1:y0fUlFfIZhPF1W537XOLg0/fcx6zcHCJwooC2xJA040= @@ -96,32 +96,32 @@ github.com/spf13/pflag v1.0.9/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= -github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= -go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= -go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64= +go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.59.0 h1:CV7UdSGJt/Ao6Gp4CXckLxVRRsRgDHoI8XjbL3PDl8s= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.59.0/go.mod h1:FRmFuRJfag1IZ2dPkHnEoSFVgTVPUd2qf5Vi69hLb8I= -go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ= -go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I= +go.opentelemetry.io/otel v1.38.0 h1:RkfdswUDRimDg0m2Az18RKOsnI8UDzppJAtj01/Ymk8= +go.opentelemetry.io/otel v1.38.0/go.mod h1:zcmtmQ1+YmQM9wrNsTGV/q/uyusom3P8RxwExxkZhjM= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.34.0 h1:OeNbIYk/2C15ckl7glBlOBp5+WlYsOElzTNmiPW/x60= go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.34.0/go.mod h1:7Bept48yIeqxP2OZ9/AqIpYS94h2or0aB4FypJTc8ZM= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.34.0 h1:BEj3SPM81McUZHYjRS5pEgNgnmzGJ5tRpU5krWnV8Bs= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.34.0/go.mod h1:9cKLGBDzI/F3NoHLQGm4ZrYdIHsvGt6ej6hUowxY0J4= -go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE= -go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E= -go.opentelemetry.io/otel/sdk v1.37.0 h1:ItB0QUqnjesGRvNcmAcU0LyvkVyGJ2xftD29bWdDvKI= -go.opentelemetry.io/otel/sdk v1.37.0/go.mod h1:VredYzxUvuo2q3WRcDnKDjbdvmO0sCzOvVAiY+yUkAg= -go.opentelemetry.io/otel/sdk/metric v1.37.0 h1:90lI228XrB9jCMuSdA0673aubgRobVZFhbjxHHspCPc= -go.opentelemetry.io/otel/sdk/metric v1.37.0/go.mod h1:cNen4ZWfiD37l5NhS+Keb5RXVWZWpRE+9WyVCpbo5ps= -go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4= -go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0= +go.opentelemetry.io/otel/metric v1.38.0 h1:Kl6lzIYGAh5M159u9NgiRkmoMKjvbsKtYRwgfrA6WpA= +go.opentelemetry.io/otel/metric v1.38.0/go.mod h1:kB5n/QoRM8YwmUahxvI3bO34eVtQf2i4utNVLr9gEmI= +go.opentelemetry.io/otel/sdk v1.38.0 h1:l48sr5YbNf2hpCUj/FoGhW9yDkl+Ma+LrVl8qaM5b+E= +go.opentelemetry.io/otel/sdk v1.38.0/go.mod h1:ghmNdGlVemJI3+ZB5iDEuk4bWA3GkTpW+DOoZMYBVVg= +go.opentelemetry.io/otel/sdk/metric v1.38.0 h1:aSH66iL0aZqo//xXzQLYozmWrXxyFkBJ6qT5wthqPoM= +go.opentelemetry.io/otel/sdk/metric v1.38.0/go.mod h1:dg9PBnW9XdQ1Hd6ZnRz689CbtrUp0wMMs9iPcgT9EZA= +go.opentelemetry.io/otel/trace v1.38.0 h1:Fxk5bKrDZJUH+AMyyIXGcFAPah0oRcT+LuNtJrmcNLE= +go.opentelemetry.io/otel/trace v1.38.0/go.mod h1:j1P9ivuFsTceSWe1oY+EeW3sc+Pp42sO++GHkg4wwhs= go.opentelemetry.io/proto/otlp v1.5.0 h1:xJvq7gMzB31/d406fB8U5CBdyQGw4P399D1aQWU/3i4= go.opentelemetry.io/proto/otlp v1.5.0/go.mod h1:keN8WnHxOy8PG0rQZjJJ5A2ebUoafqWp0eVQ4yIXvJ4= -golang.org/x/net v0.42.0 h1:jzkYrhi3YQWD6MLBJcsklgQsoAcw89EcZbJw8Z614hs= -golang.org/x/net v0.42.0/go.mod h1:FF1RA5d3u7nAYA4z2TkclSCKh68eSXtiFwcWQpPXdt8= -golang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw= -golang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= +golang.org/x/net v0.46.1-0.20251013234738-63d1a5100f82 h1:6/3JGEh1C88g7m+qzzTbl3A0FtsLguXieqofVLU/JAo= +golang.org/x/net v0.46.1-0.20251013234738-63d1a5100f82/go.mod h1:Q9BGdFy1y4nkUwiLvT5qtyhAnEHgnQ/zd8PfU6nc210= +golang.org/x/sync v0.17.0 h1:l60nONMj9l5drqw6jlhIELNv9I0A4OFgRsG9k2oT9Ug= +golang.org/x/sync v0.17.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -129,20 +129,20 @@ golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.38.0 h1:3yZWxaJjBmCWXqhN1qh02AkOnCQ1poK6oF+a7xWL6Gc= golang.org/x/sys v0.38.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= -golang.org/x/term v0.33.0 h1:NuFncQrRcaRvVmgRkvM3j/F00gWIAlcmlB8ACEKmGIg= -golang.org/x/term v0.33.0/go.mod h1:s18+ql9tYWp1IfpV9DmCtQDDSRBUjKaw9M1eAv5UeF0= -golang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4= -golang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU= +golang.org/x/term v0.36.0 h1:zMPR+aF8gfksFprF/Nc/rd1wRS1EI6nDBGyWAvDzx2Q= +golang.org/x/term v0.36.0/go.mod h1:Qu394IJq6V6dCBRgwqshf3mPF85AqzYEzofzRdZkWss= +golang.org/x/text v0.30.0 h1:yznKA/E9zq54KzlzBEAWn1NXSQ8DIp/NYMy88xJjl4k= +golang.org/x/text v0.30.0/go.mod h1:yDdHFIX9t+tORqspjENWgzaCVXgk0yYnYuSZ8UzzBVM= golang.org/x/time v0.9.0 h1:EsRrnYcQiGH+5FfbgvV4AP7qEZstoyrHB0DzarOQ4ZY= golang.org/x/time v0.9.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= -google.golang.org/genproto/googleapis/api v0.0.0-20250804133106-a7a43d27e69b h1:ULiyYQ0FdsJhwwZUwbaXpZF5yUE3h+RA+gxvBu37ucc= -google.golang.org/genproto/googleapis/api v0.0.0-20250804133106-a7a43d27e69b/go.mod h1:oDOGiMSXHL4sDTJvFvIB9nRQCGdLP1o/iVaqQK8zB+M= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250908214217-97024824d090 h1:/OQuEa4YWtDt7uQWHd3q3sUMb+QOLQUg1xa8CEsRv5w= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250908214217-97024824d090/go.mod h1:GmFNa4BdJZ2a8G+wCe9Bg3wwThLrJun751XstdJt5Og= -google.golang.org/grpc v1.76.0 h1:UnVkv1+uMLYXoIz6o7chp59WfQUYA2ex/BXQ9rHZu7A= -google.golang.org/grpc v1.76.0/go.mod h1:Ju12QI8M6iQJtbcsV+awF5a4hfJMLi4X0JLo94ULZ6c= +google.golang.org/genproto/googleapis/api v0.0.0-20251022142026-3a174f9686a8 h1:mepRgnBZa07I4TRuomDE4sTIYieg/osKmzIf4USdWS4= +google.golang.org/genproto/googleapis/api v0.0.0-20251022142026-3a174f9686a8/go.mod h1:fDMmzKV90WSg1NbozdqrE64fkuTv6mlq2zxo9ad+3yo= +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= +google.golang.org/grpc v1.77.0 h1:wVVY6/8cGA6vvffn+wWK5ToddbgdU3d8MNENr4evgXM= +google.golang.org/grpc v1.77.0/go.mod h1:z0BY1iVj0q8E1uSQCjL9cppRj+gnZjzDnzV0dHhrNig= 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= From 1197d9a631bb8451f5608f2ffa10ce577372f25a Mon Sep 17 00:00:00 2001 From: Brian Neville <29639579+brianneville@users.noreply.github.com> Date: Wed, 21 Jan 2026 20:22:49 +0000 Subject: [PATCH 2/2] update tests for gnoi v0.8.0 https://github.com/openconfig/gnoi/pull/317 in gnoi v0.8.0 changed the way that some errors are reported, so that they use error statuses instead of custom error message/enum types. This commit updates the handling for RemoveImage, StartContainer/UpdateContainer RPCs so that they no longer use the outdated types. --- client/remove_image.go | 19 +++---------------- client/remove_image_test.go | 27 ++++++++++----------------- client/start_container.go | 3 ++- client/start_container_test.go | 13 ++++--------- client/update_container.go | 12 ++---------- client/update_container_test.go | 13 ++++--------- server/remove_image.go | 31 ++++++------------------------- server/remove_image_test.go | 19 +++++-------------- 8 files changed, 36 insertions(+), 101 deletions(-) diff --git a/client/remove_image.go b/client/remove_image.go index 6631e3f..daedcae 100644 --- a/client/remove_image.go +++ b/client/remove_image.go @@ -16,8 +16,6 @@ package client import ( "context" - "errors" - cpb "github.com/openconfig/gnoi/containerz" ) @@ -25,23 +23,12 @@ import ( // returns an error indicating whether the image was not found or is associated to running // container. func (c *Client) RemoveImage(ctx context.Context, image string, tag string, force bool) error { - resp, err := c.cli.RemoveImage(ctx, &cpb.RemoveImageRequest{ + if _, err := c.cli.RemoveImage(ctx, &cpb.RemoveImageRequest{ Name: image, Tag: tag, Force: force, - }) - if err != nil { + }); err != nil { return err } - - switch resp.GetCode() { - case cpb.RemoveImageResponse_SUCCESS: - return nil - case cpb.RemoveImageResponse_NOT_FOUND: - return ErrNotFound - case cpb.RemoveImageResponse_RUNNING: - return ErrRunning - default: - return errors.New("unknown error occurred") - } + return nil } diff --git a/client/remove_image_test.go b/client/remove_image_test.go index 5d5ba0b..b984858 100644 --- a/client/remove_image_test.go +++ b/client/remove_image_test.go @@ -30,11 +30,12 @@ type fakeImageRemovingContainerzServer struct { receivedMsg *cpb.RemoveImageRequest sendMsg *cpb.RemoveImageResponse + sendErr error } func (f *fakeImageRemovingContainerzServer) RemoveImage(_ context.Context, req *cpb.RemoveImageRequest) (*cpb.RemoveImageResponse, error) { f.receivedMsg = req - return f.sendMsg, nil + return f.sendMsg, f.sendErr } func TestImageRemove(t *testing.T) { @@ -49,10 +50,8 @@ func TestImageRemove(t *testing.T) { wantErr error }{ { - name: "success", - inMsg: &cpb.RemoveImageResponse{ - Code: cpb.RemoveImageResponse_SUCCESS, - }, + name: "success", + inMsg: &cpb.RemoveImageResponse{}, inImage: "some-image", inTag: "some-tag", wantMsg: &cpb.RemoveImageRequest{ @@ -62,10 +61,8 @@ func TestImageRemove(t *testing.T) { }, }, { - name: "success-with-force", - inMsg: &cpb.RemoveImageResponse{ - Code: cpb.RemoveImageResponse_SUCCESS, - }, + name: "success-with-force", + inMsg: &cpb.RemoveImageResponse{}, inImage: "some-image", inTag: "some-tag", inForce: true, @@ -76,10 +73,7 @@ func TestImageRemove(t *testing.T) { }, }, { - name: "not-found", - inMsg: &cpb.RemoveImageResponse{ - Code: cpb.RemoveImageResponse_NOT_FOUND, - }, + name: "not-found", inImage: "some-image", inTag: "some-tag", wantMsg: &cpb.RemoveImageRequest{ @@ -90,10 +84,7 @@ func TestImageRemove(t *testing.T) { wantErr: ErrNotFound, }, { - name: "running", - inMsg: &cpb.RemoveImageResponse{ - Code: cpb.RemoveImageResponse_RUNNING, - }, + name: "running", inImage: "some-image", inTag: "some-tag", wantMsg: &cpb.RemoveImageRequest{ @@ -110,6 +101,8 @@ func TestImageRemove(t *testing.T) { t.Run(tc.name, func(t *testing.T) { fcm := &fakeImageRemovingContainerzServer{ sendMsg: tc.inMsg, + // passthrough error from test. + sendErr: tc.wantErr, } addr, stop := newServer(t, fcm) defer stop() diff --git a/client/start_container.go b/client/start_container.go index 2e9a3fa..46f409b 100644 --- a/client/start_container.go +++ b/client/start_container.go @@ -43,7 +43,8 @@ func (c *Client) StartContainer(ctx context.Context, image string, tag string, c case *cpb.StartContainerResponse_StartOk: return resp.GetStartOk().GetInstanceName(), nil case *cpb.StartContainerResponse_StartError: - return "", status.Errorf(codes.Internal, "failed to start container: %s", resp.GetStartError().GetDetails()) + return "", status.Errorf(codes.Unknown, + "got StartError returned - please update containerz server") default: return "", status.Error(codes.Unknown, "unknown container state") } diff --git a/client/start_container_test.go b/client/start_container_test.go index 66be8ce..e47817b 100644 --- a/client/start_container_test.go +++ b/client/start_container_test.go @@ -30,11 +30,12 @@ type fakeStartingContainerzServer struct { receivedMsg *cpb.StartContainerRequest sendMsg *cpb.StartContainerResponse + sendErr error } func (f *fakeStartingContainerzServer) StartContainer(ctx context.Context, req *cpb.StartContainerRequest) (*cpb.StartContainerResponse, error) { f.receivedMsg = req - return f.sendMsg, nil + return f.sendMsg, f.sendErr } func TestStart(t *testing.T) { @@ -89,20 +90,13 @@ func TestStart(t *testing.T) { inTag: "some-tag", inInstance: "some-instance", inCmd: "some-cmd", - inMsg: &cpb.StartContainerResponse{ - Response: &cpb.StartContainerResponse_StartError{ - StartError: &cpb.StartError{ - Details: "oh no!", - }, - }, - }, wantMsg: &cpb.StartContainerRequest{ ImageName: "some-image", Tag: "some-tag", Cmd: "some-cmd", InstanceName: "some-instance", }, - wantErr: status.Error(codes.Internal, "failed to start container: oh no!"), + wantErr: status.Error(codes.Unknown, "arbitrary error, passthrough from test"), }, { name: "simple-with-ports", @@ -442,6 +436,7 @@ func TestStart(t *testing.T) { t.Run(tc.name, func(t *testing.T) { fcm := &fakeStartingContainerzServer{ sendMsg: tc.inMsg, + sendErr: tc.wantErr, } addr, stop := newServer(t, fcm) defer stop() diff --git a/client/update_container.go b/client/update_container.go index 037e9d2..bd3c2d9 100644 --- a/client/update_container.go +++ b/client/update_container.go @@ -51,16 +51,8 @@ func (c *Client) UpdateContainer(ctx context.Context, image string, tag string, case *cpb.UpdateContainerResponse_UpdateOk: return resp.GetUpdateOk().GetInstanceName(), nil case *cpb.UpdateContainerResponse_UpdateError: - switch resp.GetUpdateError().GetErrorCode() { - case cpb.UpdateError_NOT_FOUND: - return "", ErrNotFound - case cpb.UpdateError_NOT_RUNNING: - return "", status.Errorf(codes.FailedPrecondition, "failed to update container as container is not running: %s", resp.GetUpdateError().GetDetails()) - case cpb.UpdateError_PORT_USED: - return "", status.Errorf(codes.AlreadyExists, "failed to update container as port already exists: %s", resp.GetUpdateError().GetDetails()) - default: - return "", status.Errorf(codes.Internal, "failed to update container: %s", resp.GetUpdateError().GetDetails()) - } + return "", status.Errorf(codes.Unknown, + "got UpdateError returned - please update containerz server") default: return "", status.Error(codes.Unknown, "unknown container state") } diff --git a/client/update_container_test.go b/client/update_container_test.go index d30aa1a..e6ab9d0 100644 --- a/client/update_container_test.go +++ b/client/update_container_test.go @@ -30,11 +30,12 @@ type fakeUpdatingContainerzServer struct { receivedMsg *cpb.UpdateContainerRequest sendMsg *cpb.UpdateContainerResponse + sendErr error } func (f *fakeUpdatingContainerzServer) UpdateContainer(ctx context.Context, req *cpb.UpdateContainerRequest) (*cpb.UpdateContainerResponse, error) { f.receivedMsg = req - return f.sendMsg, nil + return f.sendMsg, f.sendErr } func wrapInUpdateRequest(req *cpb.StartContainerRequest, async bool) *cpb.UpdateContainerRequest { @@ -121,13 +122,6 @@ func TestUpdateContainer(t *testing.T) { inTag: "some-tag", inInstance: "some-instance", inCmd: "some-cmd", - inMsg: &cpb.UpdateContainerResponse{ - Response: &cpb.UpdateContainerResponse_UpdateError{ - UpdateError: &cpb.UpdateError{ - Details: "oh no!", - }, - }, - }, wantMsg: wrapInUpdateRequest( &cpb.StartContainerRequest{ ImageName: "some-image", @@ -137,7 +131,7 @@ func TestUpdateContainer(t *testing.T) { }, false, ), - wantErr: status.Error(codes.Internal, "failed to update container: oh no!"), + wantErr: status.Error(codes.Unknown, "arbitrary error, passthrough from test"), }, { name: "simple-with-ports", @@ -289,6 +283,7 @@ func TestUpdateContainer(t *testing.T) { t.Run(tc.name, func(t *testing.T) { fcm := &fakeUpdatingContainerzServer{ sendMsg: tc.inMsg, + sendErr: tc.wantErr, } addr, stop := newServer(t, fcm) defer stop() diff --git a/server/remove_image.go b/server/remove_image.go index cfc2e35..305535a 100644 --- a/server/remove_image.go +++ b/server/remove_image.go @@ -16,12 +16,11 @@ package server import ( "context" - "fmt" - "google.golang.org/grpc/codes" - "google.golang.org/grpc/status" "github.com/openconfig/containerz/containers" cpb "github.com/openconfig/gnoi/containerz" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" ) // RemoveImage deletes containers that match the spec defined in the request. If @@ -34,30 +33,12 @@ func (s *Server) RemoveImage(ctx context.Context, request *cpb.RemoveImageReques } if err := s.mgr.ImageRemove(ctx, request.GetName(), request.GetTag(), opts...); err != nil { - stErr, ok := status.FromError(err) - if !ok { - return &cpb.RemoveImageResponse{ - Code: cpb.RemoveImageResponse_RUNNING, - Detail: fmt.Sprintf("unknown containerz state: %v", err), - }, nil - } - - switch stErr.Code() { - case codes.NotFound: - return &cpb.RemoveImageResponse{ - Code: cpb.RemoveImageResponse_NOT_FOUND, - Detail: stErr.Message(), - }, nil - case codes.Unavailable: - return &cpb.RemoveImageResponse{ - Code: cpb.RemoveImageResponse_RUNNING, - Detail: stErr.Message(), - }, nil + if _, ok := status.FromError(err); !ok { + return nil, status.Errorf(codes.Internal, + "unknown containerz state: %v", err) } return nil, err } - return &cpb.RemoveImageResponse{ - Code: cpb.RemoveImageResponse_SUCCESS, - }, nil + return &cpb.RemoveImageResponse{}, nil } diff --git a/server/remove_image_test.go b/server/remove_image_test.go index 8e09418..ea82144 100644 --- a/server/remove_image_test.go +++ b/server/remove_image_test.go @@ -16,6 +16,7 @@ package server import ( "context" + "errors" "testing" "github.com/google/go-cmp/cmp" @@ -35,29 +36,19 @@ func TestImageRemove(t *testing.T) { wantResp *cpb.RemoveImageResponse }{ { - name: "success", - inReq: &cpb.RemoveImageRequest{}, - wantResp: &cpb.RemoveImageResponse{ - Code: cpb.RemoveImageResponse_SUCCESS, - }, + name: "success", + inReq: &cpb.RemoveImageRequest{}, + wantResp: &cpb.RemoveImageResponse{}, }, { name: "not-found", inReq: &cpb.RemoveImageRequest{}, inErr: status.Error(codes.NotFound, "image not found"), - wantResp: &cpb.RemoveImageResponse{ - Code: cpb.RemoveImageResponse_NOT_FOUND, - Detail: "image not found", - }, }, { name: "running-container", inReq: &cpb.RemoveImageRequest{}, inErr: status.Error(codes.Unavailable, "container running"), - wantResp: &cpb.RemoveImageResponse{ - Code: cpb.RemoveImageResponse_RUNNING, - Detail: "container running", - }, }, } @@ -71,7 +62,7 @@ func TestImageRemove(t *testing.T) { defer s.Halt(ctx) resp, err := cli.RemoveImage(ctx, tc.inReq) - if err != nil { + if !errors.Is(err, tc.inErr) { t.Errorf("Remove(%+v) returned error: %v", tc.inReq, err) }