From 84aa0bfde626cd7a5d067c80dbe4ac343bc097bf Mon Sep 17 00:00:00 2001 From: "Justin Terry (VM)" Date: Wed, 26 Sep 2018 13:49:53 -0700 Subject: [PATCH] Forward containerd debug to shim invocation Signed-off-by: Justin Terry (VM) --- runtime/v2/binary.go | 10 +++++++-- runtime/v2/runhcs/service.go | 7 ++++++- runtime/v2/shim/shim.go | 9 +++++++++ runtime/v2/shim/shim_test.go | 39 ++++++++++++++++++++++++++++++++++++ 4 files changed, 62 insertions(+), 3 deletions(-) create mode 100644 runtime/v2/shim/shim_test.go diff --git a/runtime/v2/binary.go b/runtime/v2/binary.go index 0743c4ed90df..a27289369c4e 100644 --- a/runtime/v2/binary.go +++ b/runtime/v2/binary.go @@ -31,6 +31,7 @@ import ( "github.com/containerd/containerd/runtime/v2/task" "github.com/containerd/ttrpc" "github.com/pkg/errors" + "github.com/sirupsen/logrus" ) func shimBinary(ctx context.Context, bundle *Bundle, runtime, containerdAddress string, events *exchange.Exchange, rt *runtime.TaskList) *binary { @@ -52,13 +53,18 @@ type binary struct { } func (b *binary) Start(ctx context.Context) (_ *shim, err error) { + args := []string{"-id", b.bundle.ID} + if logrus.GetLevel() == logrus.DebugLevel { + args = append(args, "-debug") + } + args = append(args, "start") + cmd, err := client.Command( ctx, b.runtime, b.containerdAddress, b.bundle.Path, - "-id", b.bundle.ID, - "start", + args..., ) if err != nil { return nil, err diff --git a/runtime/v2/runhcs/service.go b/runtime/v2/runhcs/service.go index 9334a1168c29..895bcead9dfa 100644 --- a/runtime/v2/runhcs/service.go +++ b/runtime/v2/runhcs/service.go @@ -160,8 +160,13 @@ func (s *service) StartShim(ctx context.Context, id, containerdBinary, container "-address", containerdAddress, "-publish-binary", containerdBinary, "-socket", socketAddress, - "-debug", } + + opts, ok := ctx.Value(shim.OptsKey{}).(shim.Opts) + if ok && opts.Debug { + args = append(args, "-debug") + } + cmd := exec.Command(self, args...) cmd.Dir = cwd cmd.Env = append(os.Environ(), "GOMAXPROCS=2") diff --git a/runtime/v2/shim/shim.go b/runtime/v2/shim/shim.go index da2a2e887958..f2ebf7e1efc8 100644 --- a/runtime/v2/shim/shim.go +++ b/runtime/v2/shim/shim.go @@ -53,6 +53,14 @@ type Shim interface { StartShim(ctx context.Context, id, containerdBinary, containerdAddress string) (string, error) } +// OptsKey is the context key for the Opts value. +type OptsKey struct{} + +// Opts are context options associated with the shim invocation. +type Opts struct { + Debug bool +} + var ( debugFlag bool idFlag string @@ -133,6 +141,7 @@ func run(id string, initFunc Init) error { return fmt.Errorf("shim namespace cannot be empty") } ctx := namespaces.WithNamespace(context.Background(), namespaceFlag) + ctx = context.WithValue(ctx, OptsKey{}, Opts{Debug: debugFlag}) ctx = log.WithLogger(ctx, log.G(ctx).WithField("runtime", id)) service, err := initFunc(ctx, idFlag, publisher) diff --git a/runtime/v2/shim/shim_test.go b/runtime/v2/shim/shim_test.go new file mode 100644 index 000000000000..282059c76035 --- /dev/null +++ b/runtime/v2/shim/shim_test.go @@ -0,0 +1,39 @@ +/* + Copyright The containerd 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 shim + +import ( + "context" + "testing" +) + +func TestShimOptWithValue(t *testing.T) { + ctx := context.TODO() + ctx = context.WithValue(ctx, OptsKey{}, Opts{Debug: true}) + + o := ctx.Value(OptsKey{}) + if o == nil { + t.Fatal("opts nil") + } + op, ok := o.(Opts) + if !ok { + t.Fatal("opts not of type Opts") + } + if !op.Debug { + t.Fatal("opts.Debug should be true") + } +}