From c0d2d41f2373bc0f39b5391a88d91d3b8fee40c4 Mon Sep 17 00:00:00 2001 From: Evan Lezar Date: Tue, 28 Sep 2021 16:45:22 +0200 Subject: [PATCH] Remove unused internal/oci package Signed-off-by: Evan Lezar --- internal/oci/runtime.go | 23 ------- internal/oci/runtime_exec.go | 79 ----------------------- internal/oci/runtime_exec_test.go | 100 ----------------------------- internal/oci/runtime_mock.go | 49 -------------- internal/oci/spec.go | 102 ------------------------------ internal/oci/spec_mock.go | 70 -------------------- 6 files changed, 423 deletions(-) delete mode 100644 internal/oci/runtime.go delete mode 100644 internal/oci/runtime_exec.go delete mode 100644 internal/oci/runtime_exec_test.go delete mode 100644 internal/oci/runtime_mock.go delete mode 100644 internal/oci/spec.go delete mode 100644 internal/oci/spec_mock.go diff --git a/internal/oci/runtime.go b/internal/oci/runtime.go deleted file mode 100644 index 89df5aa1..00000000 --- a/internal/oci/runtime.go +++ /dev/null @@ -1,23 +0,0 @@ -/* -# Copyright (c) 2021, NVIDIA CORPORATION. All rights reserved. -# -# 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 oci - -// Runtime is an interface for a runtime shim. The Exec method accepts a list -// of command line arguments, and returns an error / nil. -type Runtime interface { - Exec([]string) error -} diff --git a/internal/oci/runtime_exec.go b/internal/oci/runtime_exec.go deleted file mode 100644 index 98415747..00000000 --- a/internal/oci/runtime_exec.go +++ /dev/null @@ -1,79 +0,0 @@ -/* -# Copyright (c) 2021, NVIDIA CORPORATION. All rights reserved. -# -# 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 oci - -import ( - "fmt" - "os" - "syscall" - - log "github.com/sirupsen/logrus" -) - -// SyscallExecRuntime wraps the path that a binary and defines the semanitcs for how to exec into it. -// This can be used to wrap an OCI-compliant low-level runtime binary, allowing it to be used through the -// Runtime internface. -type SyscallExecRuntime struct { - logger *log.Logger - path string - // exec is used for testing. This defaults to syscall.Exec - exec func(argv0 string, argv []string, envv []string) error -} - -var _ Runtime = (*SyscallExecRuntime)(nil) - -// NewSyscallExecRuntime creates a SyscallExecRuntime for the specified path with the standard logger -func NewSyscallExecRuntime(path string) (Runtime, error) { - return NewSyscallExecRuntimeWithLogger(log.StandardLogger(), path) -} - -// NewSyscallExecRuntimeWithLogger creates a SyscallExecRuntime for the specified logger and path -func NewSyscallExecRuntimeWithLogger(logger *log.Logger, path string) (Runtime, error) { - info, err := os.Stat(path) - if err != nil { - return nil, fmt.Errorf("invalid path '%v': %v", path, err) - } - if info.IsDir() || info.Mode()&0111 == 0 { - return nil, fmt.Errorf("specified path '%v' is not an executable file", path) - } - - shim := SyscallExecRuntime{ - logger: logger, - path: path, - exec: syscall.Exec, - } - - return &shim, nil -} - -// Exec exces into the binary at the path from the SyscallExecRuntime struct, passing it the supplied arguments -// after ensuring that the first argument is the path of the target binary. -func (s SyscallExecRuntime) Exec(args []string) error { - runtimeArgs := []string{s.path} - if len(args) > 1 { - runtimeArgs = append(runtimeArgs, args[1:]...) - } - - err := s.exec(s.path, runtimeArgs, os.Environ()) - if err != nil { - return fmt.Errorf("could not exec '%v': %v", s.path, err) - } - - // syscall.Exec is not expected to return. This is an error state regardless of whether - // err is nil or not. - return fmt.Errorf("unexpected return from exec '%v'", s.path) -} diff --git a/internal/oci/runtime_exec_test.go b/internal/oci/runtime_exec_test.go deleted file mode 100644 index 83ac64a2..00000000 --- a/internal/oci/runtime_exec_test.go +++ /dev/null @@ -1,100 +0,0 @@ -/* -# Copyright (c) 2021, NVIDIA CORPORATION. All rights reserved. -# -# 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 oci - -import ( - "fmt" - "strings" - "testing" - - testlog "github.com/sirupsen/logrus/hooks/test" - "github.com/stretchr/testify/require" -) - -func TestSyscallExecConstructor(t *testing.T) { - r, err := NewSyscallExecRuntime("////an/invalid/path") - require.Error(t, err) - require.Nil(t, r) - - r, err = NewSyscallExecRuntime("/tmp") - require.Error(t, err) - require.Nil(t, r) - - r, err = NewSyscallExecRuntime("/dev/null") - require.Error(t, err) - require.Nil(t, r) - - r, err = NewSyscallExecRuntime("/bin/sh") - require.NoError(t, err) - - f, ok := r.(*SyscallExecRuntime) - require.True(t, ok) - - require.Equal(t, "/bin/sh", f.path) -} - -func TestSyscallExecForwardsArgs(t *testing.T) { - logger, _ := testlog.NewNullLogger() - f := SyscallExecRuntime{ - logger: logger, - path: "runtime", - } - - testCases := []struct { - returnError error - args []string - errorPrefix string - }{ - { - returnError: nil, - errorPrefix: "unexpected return from exec", - }, - { - returnError: fmt.Errorf("error from exec"), - errorPrefix: "could not exec", - }, - { - returnError: nil, - args: []string{"otherargv0"}, - errorPrefix: "unexpected return from exec", - }, - { - returnError: nil, - args: []string{"otherargv0", "arg1", "arg2", "arg3"}, - errorPrefix: "unexpected return from exec", - }, - } - - for i, tc := range testCases { - execMock := WithMockExec(f, tc.returnError) - - err := execMock.Exec(tc.args) - - require.Errorf(t, err, "%d: %v", i, tc) - require.Truef(t, strings.HasPrefix(err.Error(), tc.errorPrefix), "%d: %v", i, tc) - if tc.returnError != nil { - require.Truef(t, strings.HasSuffix(err.Error(), tc.returnError.Error()), "%d: %v", i, tc) - } - - require.Equalf(t, f.path, execMock.argv0, "%d: %v", i, tc) - require.Equalf(t, f.path, execMock.argv[0], "%d: %v", i, tc) - - require.LessOrEqualf(t, len(tc.args), len(execMock.argv), "%d: %v", i, tc) - if len(tc.args) > 1 { - require.Equalf(t, tc.args[1:], execMock.argv[1:], "%d: %v", i, tc) - } - } -} diff --git a/internal/oci/runtime_mock.go b/internal/oci/runtime_mock.go deleted file mode 100644 index e09cfb79..00000000 --- a/internal/oci/runtime_mock.go +++ /dev/null @@ -1,49 +0,0 @@ -/* -# Copyright (c) 2021, NVIDIA CORPORATION. All rights reserved. -# -# 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 oci - -// MockExecRuntime wraps a SyscallExecRuntime, intercepting the exec call for testing -type MockExecRuntime struct { - SyscallExecRuntime - execMock -} - -// WithMockExec wraps a specified SyscallExecRuntime with a mocked exec function for testing -func WithMockExec(e SyscallExecRuntime, execResult error) *MockExecRuntime { - m := MockExecRuntime{ - SyscallExecRuntime: e, - execMock: execMock{result: execResult}, - } - // overrdie the exec function to the mocked exec function. - m.SyscallExecRuntime.exec = m.execMock.exec - return &m -} - -type execMock struct { - argv0 string - argv []string - envv []string - result error -} - -func (m *execMock) exec(argv0 string, argv []string, envv []string) error { - m.argv0 = argv0 - m.argv = argv - m.envv = envv - - return m.result -} diff --git a/internal/oci/spec.go b/internal/oci/spec.go deleted file mode 100644 index 0c3aaf4d..00000000 --- a/internal/oci/spec.go +++ /dev/null @@ -1,102 +0,0 @@ -/* -# Copyright (c) 2021, NVIDIA CORPORATION. All rights reserved. -# -# 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 oci - -import ( - "encoding/json" - "fmt" - "os" - - oci "github.com/opencontainers/runtime-spec/specs-go" -) - -// SpecModifier is a function that accepts a pointer to an OCI Srec and returns an -// error. The intention is that the function would modify the spec in-place. -type SpecModifier func(*oci.Spec) error - -// Spec defines the operations to be performed on an OCI specification -type Spec interface { - Load() error - Flush() error - Modify(SpecModifier) error -} - -type fileSpec struct { - *oci.Spec - path string -} - -var _ Spec = (*fileSpec)(nil) - -// NewSpecFromFile creates an object that encapsulates a file-backed OCI spec. -// This can be used to read from the file, modify the spec, and write to the -// same file. -func NewSpecFromFile(filepath string) Spec { - oci := fileSpec{ - path: filepath, - } - - return &oci -} - -// Load reads the contents of an OCI spec from file to be referenced internally. -// The file is opened "read-only" -func (s *fileSpec) Load() error { - specFile, err := os.Open(s.path) - if err != nil { - return fmt.Errorf("error opening OCI specification file: %v", err) - } - defer specFile.Close() - - decoder := json.NewDecoder(specFile) - - var spec oci.Spec - err = decoder.Decode(&spec) - if err != nil { - return fmt.Errorf("error reading OCI specification from file: %v", err) - } - - s.Spec = &spec - return nil -} - -// Modify applies the specified SpecModifier to the stored OCI specification. -func (s *fileSpec) Modify(f SpecModifier) error { - if s.Spec == nil { - return fmt.Errorf("no spec loaded for modification") - } - return f(s.Spec) -} - -// Flush writes the stored OCI specification to the filepath specifed by the path member. -// The file is truncated upon opening, overwriting any existing contents. -func (s fileSpec) Flush() error { - specFile, err := os.Create(s.path) - if err != nil { - return fmt.Errorf("error opening OCI specification file: %v", err) - } - defer specFile.Close() - - encoder := json.NewEncoder(specFile) - - err = encoder.Encode(s.Spec) - if err != nil { - return fmt.Errorf("error writing OCI specification to file: %v", err) - } - - return nil -} diff --git a/internal/oci/spec_mock.go b/internal/oci/spec_mock.go deleted file mode 100644 index 1247adaf..00000000 --- a/internal/oci/spec_mock.go +++ /dev/null @@ -1,70 +0,0 @@ -/* -# Copyright (c) 2021, NVIDIA CORPORATION. All rights reserved. -# -# 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 oci - -import ( - oci "github.com/opencontainers/runtime-spec/specs-go" -) - -// MockSpec provides a simple mock for an OCI spec to be used in testing. -// It also implements the SpecModifier interface. -type MockSpec struct { - *oci.Spec - MockLoad mockFunc - MockFlush mockFunc - MockModify mockFunc -} - -var _ Spec = (*MockSpec)(nil) - -// NewMockSpec constructs a MockSpec to be used in testing as a Spec -func NewMockSpec(spec *oci.Spec, flushResult error, modifyResult error) *MockSpec { - s := MockSpec{ - Spec: spec, - MockFlush: mockFunc{result: flushResult}, - MockModify: mockFunc{result: modifyResult}, - } - - return &s -} - -// Load invokes the mocked Load function to return the predefined error / result -func (s *MockSpec) Load() error { - return s.MockLoad.call() -} - -// Flush invokes the mocked Load function to return the predefined error / result -func (s *MockSpec) Flush() error { - return s.MockFlush.call() -} - -// Modify applies the specified SpecModifier to the spec and invokes the -// mocked modify function to return the predefined error / result. -func (s *MockSpec) Modify(f SpecModifier) error { - f(s.Spec) - return s.MockModify.call() -} - -type mockFunc struct { - Callcount int - result error -} - -func (m *mockFunc) call() error { - m.Callcount++ - return m.result -}