From 7e534153f325e8a889f31f5f86dd09408efe1ec4 Mon Sep 17 00:00:00 2001 From: Guillaume Tardif Date: Thu, 24 Sep 2020 09:39:46 +0200 Subject: [PATCH 1/2] Avoid nil panic when no progress writer in context, add noop writer. (Especially for gRPC invocations) Signed-off-by: Guillaume Tardif --- progress/noop.go | 34 ++++++++++++++++++++++++++++++++++ progress/writer.go | 5 ++++- progress/writer_test.go | 31 +++++++++++++++++++++++++++++++ 3 files changed, 69 insertions(+), 1 deletion(-) create mode 100644 progress/noop.go create mode 100644 progress/writer_test.go diff --git a/progress/noop.go b/progress/noop.go new file mode 100644 index 000000000..e638b8725 --- /dev/null +++ b/progress/noop.go @@ -0,0 +1,34 @@ +/* + Copyright 2020 Docker Compose CLI authors + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +package progress + +import ( + "context" +) + +type noopWriter struct { +} + +func (p *noopWriter) Start(ctx context.Context) error { + return nil +} + +func (p *noopWriter) Event(e Event) { +} + +func (p *noopWriter) Stop() { +} diff --git a/progress/writer.go b/progress/writer.go index e46f90172..23a5d2072 100644 --- a/progress/writer.go +++ b/progress/writer.go @@ -73,7 +73,10 @@ func WithContextWriter(ctx context.Context, writer Writer) context.Context { // ContextWriter returns the writer from the context func ContextWriter(ctx context.Context) Writer { - s, _ := ctx.Value(writerKey{}).(Writer) + s, ok := ctx.Value(writerKey{}).(Writer) + if !ok { + return &noopWriter{} + } return s } diff --git a/progress/writer_test.go b/progress/writer_test.go new file mode 100644 index 000000000..2933811b0 --- /dev/null +++ b/progress/writer_test.go @@ -0,0 +1,31 @@ +/* + Copyright 2020 Docker Compose CLI authors + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +package progress + +import ( + "context" + "testing" + + "gotest.tools/v3/assert" +) + +func TestNoopWriter(t *testing.T) { + todo := context.TODO() + writer := ContextWriter(todo) + + assert.Equal(t, writer, &noopWriter{}) +} From 7eda96bea49cb81597f4dde0dfde5b2eee6757bd Mon Sep 17 00:00:00 2001 From: Guillaume Tardif Date: Thu, 24 Sep 2020 09:52:17 +0200 Subject: [PATCH 2/2] =?UTF-8?q?Fix=20nil=20pointer=20when=20creating=20vol?= =?UTF-8?q?ume=20with=20=E2=80=9C=E2=80=9D=20storage=20account?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Guillaume Tardif --- aci/volumes.go | 7 +++---- tests/aci-e2e/e2e-aci_test.go | 9 +++++++++ 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/aci/volumes.go b/aci/volumes.go index a07af69f7..8eb804deb 100644 --- a/aci/volumes.go +++ b/aci/volumes.go @@ -92,10 +92,9 @@ func (cs *aciVolumeService) Create(ctx context.Context, options interface{}) (vo account, err := accountClient.GetProperties(ctx, cs.aciContext.ResourceGroup, opts.Account, "") if err == nil { w.Event(event(opts.Account, progress.Done, "Use existing")) + } else if !account.HasHTTPStatus(http.StatusNotFound) { + return volumes.Volume{}, err } else { - if account.StatusCode != http.StatusNotFound { - return volumes.Volume{}, err - } result, err := accountClient.CheckNameAvailability(ctx, storage.AccountCheckNameAvailabilityParameters{ Name: to.StringPtr(opts.Account), Type: to.StringPtr("Microsoft.Storage/storageAccounts"), @@ -137,7 +136,7 @@ func (cs *aciVolumeService) Create(ctx context.Context, options interface{}) (vo w.Event(errorEvent(opts.Fileshare)) return volumes.Volume{}, errors.Wrapf(errdefs.ErrAlreadyExists, "Azure fileshare %q already exists", opts.Fileshare) } - if fileShare.StatusCode != http.StatusNotFound { + if !fileShare.HasHTTPStatus(http.StatusNotFound) { w.Event(errorEvent(opts.Fileshare)) return volumes.Volume{}, err } diff --git a/tests/aci-e2e/e2e-aci_test.go b/tests/aci-e2e/e2e-aci_test.go index 3456ffc6e..3f6c2ff0b 100644 --- a/tests/aci-e2e/e2e-aci_test.go +++ b/tests/aci-e2e/e2e-aci_test.go @@ -150,6 +150,15 @@ func TestContainerRunVolume(t *testing.T) { accountName = "e2e" + strconv.Itoa(int(time.Now().UnixNano())) ) + t.Run("check empty volume name validity", func(t *testing.T) { + invalidName := "" + res := c.RunDockerOrExitError("volume", "create", "--storage-account", invalidName, "--fileshare", fileshareName) + res.Assert(t, icmd.Expected{ + ExitCode: 1, + Err: `parameter=accountName constraint=MinLength value="" details: value length must be greater than or equal to 3`, + }) + }) + t.Run("check volume name validity", func(t *testing.T) { invalidName := "some-storage-123" res := c.RunDockerOrExitError("volume", "create", "--storage-account", invalidName, "--fileshare", fileshareName)