From d189be857907aba279cba160019afd652a653261 Mon Sep 17 00:00:00 2001 From: Peng Tao Date: Thu, 19 Apr 2018 18:53:28 +0800 Subject: [PATCH] api: add FetchSandbox It finds out and existing sandbox and returns it. Signed-off-by: Peng Tao --- virtcontainers/api.go | 18 +++++++++++++++++ virtcontainers/api_test.go | 22 ++++++++++++++++++++ virtcontainers/implementation.go | 6 ++++++ virtcontainers/interfaces.go | 1 + virtcontainers/pkg/vcmock/mock.go | 9 +++++++++ virtcontainers/pkg/vcmock/mock_test.go | 28 ++++++++++++++++++++++++++ virtcontainers/pkg/vcmock/types.go | 1 + 7 files changed, 85 insertions(+) diff --git a/virtcontainers/api.go b/virtcontainers/api.go index 3dd8731e7..208abb840 100644 --- a/virtcontainers/api.go +++ b/virtcontainers/api.go @@ -92,6 +92,24 @@ func DeleteSandbox(sandboxID string) (VCSandbox, error) { return p, nil } +// FetchSandbox is the virtcontainers sandbox fetching entry point. +// FetchSandbox will find out and connect to an existing sandbox and +// return the sandbox structure. +func FetchSandbox(sandboxID string) (VCSandbox, error) { + if sandboxID == "" { + return nil, errNeedSandboxID + } + + lockFile, err := rwLockSandbox(sandboxID) + if err != nil { + return nil, err + } + defer unlockSandbox(lockFile) + + // Fetch the sandbox from storage and create it. + return fetchSandbox(sandboxID) +} + // StartSandbox is the virtcontainers sandbox starting entry point. // StartSandbox will talk to the given hypervisor to start an existing // sandbox and all its containers. diff --git a/virtcontainers/api_test.go b/virtcontainers/api_test.go index 6c3af7784..df76d4c2e 100644 --- a/virtcontainers/api_test.go +++ b/virtcontainers/api_test.go @@ -2251,3 +2251,25 @@ func BenchmarkStartStop10ContainerQemuHypervisorHyperstartAgentNetworkNoop(b *te createStartStopDeleteContainers(b, sandboxConfig, contConfigs) } } + +func TestFetchSandbox(t *testing.T) { + cleanUp() + + config := newTestSandboxConfigNoop() + + s, err := CreateSandbox(config) + if s == nil || err != nil { + t.Fatal(err) + } + + fetched, err := FetchSandbox(s.ID()) + assert.Nil(t, err, "%v", err) + assert.True(t, fetched == s, "fetched sandboxed do not match") +} + +func TestFetchNonExistingSandbox(t *testing.T) { + cleanUp() + + _, err := FetchSandbox("some-non-existing-sandbox-name") + assert.NotNil(t, err, "fetch non-existing sandbox should fail") +} diff --git a/virtcontainers/implementation.go b/virtcontainers/implementation.go index 7d7c981d9..229feca7d 100644 --- a/virtcontainers/implementation.go +++ b/virtcontainers/implementation.go @@ -54,6 +54,12 @@ func (impl *VCImpl) ListSandbox() ([]SandboxStatus, error) { return ListSandbox() } +// FetchSandbox will find out and connect to an existing sandbox and +// return the sandbox structure. +func (impl *VCImpl) FetchSandbox(sandboxID string) (VCSandbox, error) { + return FetchSandbox(sandboxID) +} + // StatusSandbox implements the VC function of the same name. func (impl *VCImpl) StatusSandbox(sandboxID string) (SandboxStatus, error) { return StatusSandbox(sandboxID) diff --git a/virtcontainers/interfaces.go b/virtcontainers/interfaces.go index 8618b8b33..3c4dd618b 100644 --- a/virtcontainers/interfaces.go +++ b/virtcontainers/interfaces.go @@ -17,6 +17,7 @@ type VC interface { CreateSandbox(sandboxConfig SandboxConfig) (VCSandbox, error) DeleteSandbox(sandboxID string) (VCSandbox, error) + FetchSandbox(sandboxID string) (VCSandbox, error) ListSandbox() ([]SandboxStatus, error) PauseSandbox(sandboxID string) (VCSandbox, error) ResumeSandbox(sandboxID string) (VCSandbox, error) diff --git a/virtcontainers/pkg/vcmock/mock.go b/virtcontainers/pkg/vcmock/mock.go index 938ec44a6..a494014ef 100644 --- a/virtcontainers/pkg/vcmock/mock.go +++ b/virtcontainers/pkg/vcmock/mock.go @@ -52,6 +52,15 @@ func (m *VCMock) DeleteSandbox(sandboxID string) (vc.VCSandbox, error) { return nil, fmt.Errorf("%s: %s (%+v): sandboxID: %v", mockErrorPrefix, getSelf(), m, sandboxID) } +// FetchSandbox implements the VC function of the same name. +func (m *VCMock) FetchSandbox(sandboxID string) (vc.VCSandbox, error) { + if m.FetchSandboxFunc != nil { + return m.FetchSandboxFunc(sandboxID) + } + + return nil, fmt.Errorf("%s: %s (%+v): sandboxID: %v", mockErrorPrefix, getSelf(), m, sandboxID) +} + // StartSandbox implements the VC function of the same name. func (m *VCMock) StartSandbox(sandboxID string) (vc.VCSandbox, error) { if m.StartSandboxFunc != nil { diff --git a/virtcontainers/pkg/vcmock/mock_test.go b/virtcontainers/pkg/vcmock/mock_test.go index 226dc9d8e..e966b328e 100644 --- a/virtcontainers/pkg/vcmock/mock_test.go +++ b/virtcontainers/pkg/vcmock/mock_test.go @@ -568,3 +568,31 @@ func TestVCMockProcessListContainer(t *testing.T) { assert.Error(err) assert.True(IsMockError(err)) } + +func TestVCMockFetchSandbox(t *testing.T) { + assert := assert.New(t) + + m := &VCMock{} + config := &vc.SandboxConfig{} + assert.Nil(m.FetchSandboxFunc) + + _, err := m.FetchSandbox(config.ID) + assert.Error(err) + assert.True(IsMockError(err)) + + m.FetchSandboxFunc = func(id string) (vc.VCSandbox, error) { + return &Sandbox{}, nil + } + + sandbox, err := m.FetchSandbox(config.ID) + assert.NoError(err) + assert.Equal(sandbox, &Sandbox{}) + + // reset + m.FetchSandboxFunc = nil + + _, err = m.FetchSandbox(config.ID) + assert.Error(err) + assert.True(IsMockError(err)) + +} diff --git a/virtcontainers/pkg/vcmock/types.go b/virtcontainers/pkg/vcmock/types.go index f94cce5c7..cf67b1425 100644 --- a/virtcontainers/pkg/vcmock/types.go +++ b/virtcontainers/pkg/vcmock/types.go @@ -39,6 +39,7 @@ type VCMock struct { CreateSandboxFunc func(sandboxConfig vc.SandboxConfig) (vc.VCSandbox, error) DeleteSandboxFunc func(sandboxID string) (vc.VCSandbox, error) ListSandboxFunc func() ([]vc.SandboxStatus, error) + FetchSandboxFunc func(sandboxID string) (vc.VCSandbox, error) PauseSandboxFunc func(sandboxID string) (vc.VCSandbox, error) ResumeSandboxFunc func(sandboxID string) (vc.VCSandbox, error) RunSandboxFunc func(sandboxConfig vc.SandboxConfig) (vc.VCSandbox, error)