mirror of https://github.com/containers/podman.git
Add tests for state namespacing
Signed-off-by: Matthew Heon <matthew.heon@gmail.com>
This commit is contained in:
parent
92e6bd01a8
commit
572fd75d22
|
|
@ -8,6 +8,7 @@ import (
|
||||||
|
|
||||||
"github.com/boltdb/bolt"
|
"github.com/boltdb/bolt"
|
||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
|
"github.com/sirupsen/logrus"
|
||||||
)
|
)
|
||||||
|
|
||||||
// BoltState is a state implementation backed by a Bolt DB
|
// BoltState is a state implementation backed by a Bolt DB
|
||||||
|
|
@ -29,6 +30,8 @@ func NewBoltState(path, lockDir string, runtime *Runtime) (State, error) {
|
||||||
state.namespace = ""
|
state.namespace = ""
|
||||||
state.namespaceBytes = nil
|
state.namespaceBytes = nil
|
||||||
|
|
||||||
|
logrus.Debugf("Initializing boltdb state at %s", path)
|
||||||
|
|
||||||
// Make the directory that will hold container lockfiles
|
// Make the directory that will hold container lockfiles
|
||||||
if err := os.MkdirAll(lockDir, 0750); err != nil {
|
if err := os.MkdirAll(lockDir, 0750); err != nil {
|
||||||
// The directory is allowed to exist
|
// The directory is allowed to exist
|
||||||
|
|
@ -367,10 +370,10 @@ func (s *BoltState) HasContainer(id string) (bool, error) {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
ctrExists := ctrBucket.Bucket(ctrID)
|
ctrDB := ctrBucket.Bucket(ctrID)
|
||||||
if ctrExists != nil {
|
if ctrDB != nil {
|
||||||
if s.namespaceBytes != nil {
|
if s.namespaceBytes != nil {
|
||||||
nsBytes := ctrBucket.Get(namespaceKey)
|
nsBytes := ctrDB.Get(namespaceKey)
|
||||||
if bytes.Equal(nsBytes, s.namespaceBytes) {
|
if bytes.Equal(nsBytes, s.namespaceBytes) {
|
||||||
exists = true
|
exists = true
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -345,6 +345,59 @@ func TestGetContainerWithEmptyIDFails(t *testing.T) {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestGetContainerInDifferentNamespaceFails(t *testing.T) {
|
||||||
|
runForAllStates(t, func(t *testing.T, state State, lockPath string) {
|
||||||
|
testCtr, err := getTestCtr1(lockPath)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
|
testCtr.config.Namespace = "test2"
|
||||||
|
|
||||||
|
err = state.AddContainer(testCtr)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
|
state.SetNamespace("test1")
|
||||||
|
|
||||||
|
_, err = state.Container(testCtr.ID())
|
||||||
|
assert.Error(t, err)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestGetContainerInSameNamespaceSucceeds(t *testing.T) {
|
||||||
|
runForAllStates(t, func(t *testing.T, state State, lockPath string) {
|
||||||
|
testCtr, err := getTestCtr1(lockPath)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
|
testCtr.config.Namespace = "test1"
|
||||||
|
|
||||||
|
err = state.AddContainer(testCtr)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
|
state.SetNamespace("test1")
|
||||||
|
|
||||||
|
ctr, err := state.Container(testCtr.ID())
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
|
testContainersEqual(t, testCtr, ctr)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestGetContainerInNamespaceWhileNotInNamespaceSucceeds(t *testing.T) {
|
||||||
|
runForAllStates(t, func(t *testing.T, state State, lockPath string) {
|
||||||
|
testCtr, err := getTestCtr1(lockPath)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
|
testCtr.config.Namespace = "test1"
|
||||||
|
|
||||||
|
err = state.AddContainer(testCtr)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
|
ctr, err := state.Container(testCtr.ID())
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
|
testContainersEqual(t, testCtr, ctr)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
func TestLookupContainerWithEmptyIDFails(t *testing.T) {
|
func TestLookupContainerWithEmptyIDFails(t *testing.T) {
|
||||||
runForAllStates(t, func(t *testing.T, state State, lockPath string) {
|
runForAllStates(t, func(t *testing.T, state State, lockPath string) {
|
||||||
_, err := state.LookupContainer("")
|
_, err := state.LookupContainer("")
|
||||||
|
|
@ -448,6 +501,66 @@ func TestLookupCtrByPodIDFails(t *testing.T) {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestLookupCtrInSameNamespaceSucceeds(t *testing.T) {
|
||||||
|
runForAllStates(t, func(t *testing.T, state State, lockPath string) {
|
||||||
|
testCtr, err := getTestCtr1(lockPath)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
|
testCtr.config.Namespace = "test1"
|
||||||
|
|
||||||
|
err = state.AddContainer(testCtr)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
|
state.SetNamespace("test1")
|
||||||
|
|
||||||
|
ctr, err := state.LookupContainer(testCtr.ID())
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
|
testContainersEqual(t, testCtr, ctr)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestLookupCtrInDifferentNamespaceFails(t *testing.T) {
|
||||||
|
runForAllStates(t, func(t *testing.T, state State, lockPath string) {
|
||||||
|
testCtr, err := getTestCtr1(lockPath)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
|
testCtr.config.Namespace = "test1"
|
||||||
|
|
||||||
|
err = state.AddContainer(testCtr)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
|
state.SetNamespace("test2")
|
||||||
|
|
||||||
|
_, err = state.LookupContainer(testCtr.ID())
|
||||||
|
assert.Error(t, err)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestLookupContainerMatchInDifferentNamespaceSucceeds(t *testing.T) {
|
||||||
|
runForAllStates(t, func(t *testing.T, state State, lockPath string) {
|
||||||
|
testCtr1, err := getTestContainer(strings.Repeat("0", 32), "test1", lockPath)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
testCtr1.config.Namespace = "test2"
|
||||||
|
testCtr2, err := getTestContainer(strings.Repeat("0", 31)+"1", "test2", lockPath)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
testCtr2.config.Namespace = "test1"
|
||||||
|
|
||||||
|
err = state.AddContainer(testCtr1)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
|
err = state.AddContainer(testCtr2)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
|
state.SetNamespace("test1")
|
||||||
|
|
||||||
|
ctr, err := state.LookupContainer("000")
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
|
testContainersEqual(t, testCtr2, ctr)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
func TestHasContainerEmptyIDFails(t *testing.T) {
|
func TestHasContainerEmptyIDFails(t *testing.T) {
|
||||||
runForAllStates(t, func(t *testing.T, state State, lockPath string) {
|
runForAllStates(t, func(t *testing.T, state State, lockPath string) {
|
||||||
_, err := state.HasContainer("")
|
_, err := state.HasContainer("")
|
||||||
|
|
@ -491,6 +604,42 @@ func TestHasContainerPodIDIsFalse(t *testing.T) {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestHasContainerSameNamespaceIsTrue(t *testing.T) {
|
||||||
|
runForAllStates(t, func(t *testing.T, state State, lockPath string) {
|
||||||
|
testCtr, err := getTestCtr1(lockPath)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
|
testCtr.config.Namespace = "test1"
|
||||||
|
|
||||||
|
err = state.AddContainer(testCtr)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
|
state.SetNamespace("test1")
|
||||||
|
|
||||||
|
exists, err := state.HasContainer(testCtr.ID())
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assert.True(t, exists)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestHasContainerDifferentNamespaceIsFalse(t *testing.T) {
|
||||||
|
runForAllStates(t, func(t *testing.T, state State, lockPath string) {
|
||||||
|
testCtr, err := getTestCtr1(lockPath)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
|
testCtr.config.Namespace = "test1"
|
||||||
|
|
||||||
|
err = state.AddContainer(testCtr)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
|
state.SetNamespace("test2")
|
||||||
|
|
||||||
|
exists, err := state.HasContainer(testCtr.ID())
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assert.False(t, exists)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
func TestSaveAndUpdateContainer(t *testing.T) {
|
func TestSaveAndUpdateContainer(t *testing.T) {
|
||||||
runForAllStates(t, func(t *testing.T, state State, lockPath string) {
|
runForAllStates(t, func(t *testing.T, state State, lockPath string) {
|
||||||
testCtr, err := getTestCtr1(lockPath)
|
testCtr, err := getTestCtr1(lockPath)
|
||||||
|
|
@ -516,6 +665,35 @@ func TestSaveAndUpdateContainer(t *testing.T) {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestSaveAndUpdateContainerSameNamespaceSucceeds(t *testing.T) {
|
||||||
|
runForAllStates(t, func(t *testing.T, state State, lockPath string) {
|
||||||
|
testCtr, err := getTestCtr1(lockPath)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
|
testCtr.config.Namespace = "test1"
|
||||||
|
|
||||||
|
err = state.AddContainer(testCtr)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
|
state.SetNamespace("test1")
|
||||||
|
|
||||||
|
retrievedCtr, err := state.Container(testCtr.ID())
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
|
retrievedCtr.state.State = ContainerStateStopped
|
||||||
|
retrievedCtr.state.ExitCode = 127
|
||||||
|
retrievedCtr.state.FinishedTime = time.Now()
|
||||||
|
|
||||||
|
err = state.SaveContainer(retrievedCtr)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
|
err = state.UpdateContainer(testCtr)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
|
testContainersEqual(t, testCtr, retrievedCtr)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
func TestUpdateContainerNotInDatabaseReturnsError(t *testing.T) {
|
func TestUpdateContainerNotInDatabaseReturnsError(t *testing.T) {
|
||||||
runForAllStates(t, func(t *testing.T, state State, lockPath string) {
|
runForAllStates(t, func(t *testing.T, state State, lockPath string) {
|
||||||
testCtr, err := getTestCtr1(lockPath)
|
testCtr, err := getTestCtr1(lockPath)
|
||||||
|
|
@ -534,6 +712,23 @@ func TestUpdateInvalidContainerReturnsError(t *testing.T) {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestUpdateContainerNotInNamespaceReturnsError(t *testing.T) {
|
||||||
|
runForAllStates(t, func(t *testing.T, state State, lockPath string) {
|
||||||
|
testCtr, err := getTestCtr1(lockPath)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
|
testCtr.config.Namespace = "test1"
|
||||||
|
|
||||||
|
err = state.AddContainer(testCtr)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
|
state.SetNamespace("test2")
|
||||||
|
|
||||||
|
err = state.UpdateContainer(testCtr)
|
||||||
|
assert.Error(t, err)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
func TestSaveInvalidContainerReturnsError(t *testing.T) {
|
func TestSaveInvalidContainerReturnsError(t *testing.T) {
|
||||||
runForAllStates(t, func(t *testing.T, state State, lockPath string) {
|
runForAllStates(t, func(t *testing.T, state State, lockPath string) {
|
||||||
err := state.SaveContainer(&Container{config: &ContainerConfig{ID: "1234"}})
|
err := state.SaveContainer(&Container{config: &ContainerConfig{ID: "1234"}})
|
||||||
|
|
@ -552,6 +747,23 @@ func TestSaveContainerNotInStateReturnsError(t *testing.T) {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestSaveContainerNotInNamespaceReturnsError(t *testing.T) {
|
||||||
|
runForAllStates(t, func(t *testing.T, state State, lockPath string) {
|
||||||
|
testCtr, err := getTestCtr1(lockPath)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
|
testCtr.config.Namespace = "test1"
|
||||||
|
|
||||||
|
err = state.AddContainer(testCtr)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
|
state.SetNamespace("test2")
|
||||||
|
|
||||||
|
err = state.SaveContainer(testCtr)
|
||||||
|
assert.Error(t, err)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
func TestRemoveContainer(t *testing.T) {
|
func TestRemoveContainer(t *testing.T) {
|
||||||
runForAllStates(t, func(t *testing.T, state State, lockPath string) {
|
runForAllStates(t, func(t *testing.T, state State, lockPath string) {
|
||||||
testCtr, err := getTestCtr1(lockPath)
|
testCtr, err := getTestCtr1(lockPath)
|
||||||
|
|
@ -584,6 +796,33 @@ func TestRemoveNonexistantContainerFails(t *testing.T) {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestRemoveContainerNotInNamespaceFails(t *testing.T) {
|
||||||
|
runForAllStates(t, func(t *testing.T, state State, lockPath string) {
|
||||||
|
testCtr, err := getTestCtr1(lockPath)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
|
testCtr.config.Namespace = "test1"
|
||||||
|
|
||||||
|
err = state.AddContainer(testCtr)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
|
ctrs, err := state.AllContainers()
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assert.Equal(t, 1, len(ctrs))
|
||||||
|
|
||||||
|
state.SetNamespace("test2")
|
||||||
|
|
||||||
|
err = state.RemoveContainer(testCtr)
|
||||||
|
assert.Error(t, err)
|
||||||
|
|
||||||
|
state.SetNamespace("")
|
||||||
|
|
||||||
|
ctrs2, err := state.AllContainers()
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assert.Equal(t, 1, len(ctrs2))
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
func TestGetAllContainersOnNewStateIsEmpty(t *testing.T) {
|
func TestGetAllContainersOnNewStateIsEmpty(t *testing.T) {
|
||||||
runForAllStates(t, func(t *testing.T, state State, lockPath string) {
|
runForAllStates(t, func(t *testing.T, state State, lockPath string) {
|
||||||
ctrs, err := state.AllContainers()
|
ctrs, err := state.AllContainers()
|
||||||
|
|
@ -627,6 +866,50 @@ func TestGetAllContainersTwoContainers(t *testing.T) {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestGetAllContainersNoContainerInNamespace(t *testing.T) {
|
||||||
|
runForAllStates(t, func(t *testing.T, state State, lockPath string) {
|
||||||
|
testCtr, err := getTestCtr1(lockPath)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
|
testCtr.config.Namespace = "test1"
|
||||||
|
|
||||||
|
err = state.AddContainer(testCtr)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
|
state.SetNamespace("test2")
|
||||||
|
|
||||||
|
ctrs, err := state.AllContainers()
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assert.Equal(t, 0, len(ctrs))
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestGetContainerOneContainerInNamespace(t *testing.T) {
|
||||||
|
runForAllStates(t, func(t *testing.T, state State, lockPath string) {
|
||||||
|
testCtr1, err := getTestCtr1(lockPath)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
|
testCtr1.config.Namespace = "test1"
|
||||||
|
|
||||||
|
testCtr2, err := getTestCtr2(lockPath)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
|
err = state.AddContainer(testCtr1)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
|
err = state.AddContainer(testCtr2)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
|
state.SetNamespace("test1")
|
||||||
|
|
||||||
|
ctrs, err := state.AllContainers()
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assert.Equal(t, 1, len(ctrs))
|
||||||
|
|
||||||
|
testContainersEqual(t, testCtr1, ctrs[0])
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
func TestContainerInUseInvalidContainer(t *testing.T) {
|
func TestContainerInUseInvalidContainer(t *testing.T) {
|
||||||
runForAllStates(t, func(t *testing.T, state State, lockPath string) {
|
runForAllStates(t, func(t *testing.T, state State, lockPath string) {
|
||||||
_, err := state.ContainerInUse(&Container{})
|
_, err := state.ContainerInUse(&Container{})
|
||||||
|
|
@ -638,7 +921,24 @@ func TestContainerInUseCtrNotInState(t *testing.T) {
|
||||||
runForAllStates(t, func(t *testing.T, state State, lockPath string) {
|
runForAllStates(t, func(t *testing.T, state State, lockPath string) {
|
||||||
testCtr, err := getTestCtr1(lockPath)
|
testCtr, err := getTestCtr1(lockPath)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
_, err := state.ContainerInUse(testCtr)
|
_, err = state.ContainerInUse(testCtr)
|
||||||
|
assert.Error(t, err)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestContainerInUseCtrNotInNamespace(t *testing.T) {
|
||||||
|
runForAllStates(t, func(t *testing.T, state State, lockPath string) {
|
||||||
|
testCtr, err := getTestCtr1(lockPath)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
|
testCtr.config.Namespace = "test1"
|
||||||
|
|
||||||
|
err = state.AddContainer(testCtr)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
|
state.SetNamespace("test2")
|
||||||
|
|
||||||
|
_, err = state.ContainerInUse(testCtr)
|
||||||
assert.Error(t, err)
|
assert.Error(t, err)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
@ -1031,6 +1331,42 @@ func TestGetPodByCtrID(t *testing.T) {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestGetPodInNamespaceSucceeds(t *testing.T) {
|
||||||
|
runForAllStates(t, func(t *testing.T, state State, lockPath string) {
|
||||||
|
testPod, err := getTestPod1(lockPath)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
|
testPod.config.Namespace = "test1"
|
||||||
|
|
||||||
|
err = state.AddPod(testPod)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
|
state.SetNamespace("test1")
|
||||||
|
|
||||||
|
statePod, err := state.Pod(testPod.ID())
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
|
testPodsEqual(t, testPod, statePod)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestGetPodPodNotInNamespaceFails(t *testing.T) {
|
||||||
|
runForAllStates(t, func(t *testing.T, state State, lockPath string) {
|
||||||
|
testPod, err := getTestPod1(lockPath)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
|
testPod.config.Namespace = "test1"
|
||||||
|
|
||||||
|
err = state.AddPod(testPod)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
|
state.SetNamespace("test2")
|
||||||
|
|
||||||
|
_, err = state.Pod(testPod.ID())
|
||||||
|
assert.Error(t, err)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
func TestLookupPodEmptyID(t *testing.T) {
|
func TestLookupPodEmptyID(t *testing.T) {
|
||||||
runForAllStates(t, func(t *testing.T, state State, lockPath string) {
|
runForAllStates(t, func(t *testing.T, state State, lockPath string) {
|
||||||
_, err := state.LookupPod("")
|
_, err := state.LookupPod("")
|
||||||
|
|
@ -1135,6 +1471,69 @@ func TestLookupPodByCtrName(t *testing.T) {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestLookupPodInSameNamespaceSucceeds(t *testing.T) {
|
||||||
|
runForAllStates(t, func(t *testing.T, state State, lockPath string) {
|
||||||
|
testPod, err := getTestPod1(lockPath)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
|
testPod.config.Namespace = "test1"
|
||||||
|
|
||||||
|
err = state.AddPod(testPod)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
|
state.SetNamespace("test1")
|
||||||
|
|
||||||
|
statePod, err := state.LookupPod(testPod.ID())
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
|
testPodsEqual(t, testPod, statePod)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestLookupPodInDifferentNamespaceFails(t *testing.T) {
|
||||||
|
runForAllStates(t, func(t *testing.T, state State, lockPath string) {
|
||||||
|
testPod, err := getTestPod1(lockPath)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
|
testPod.config.Namespace = "test1"
|
||||||
|
|
||||||
|
err = state.AddPod(testPod)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
|
state.SetNamespace("test2")
|
||||||
|
|
||||||
|
_, err = state.LookupPod(testPod.ID())
|
||||||
|
assert.Error(t, err)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestLookupPodOneInDifferentNamespaceFindsRightPod(t *testing.T) {
|
||||||
|
runForAllStates(t, func(t *testing.T, state State, lockPath string) {
|
||||||
|
testPod1, err := getTestPod(strings.Repeat("1", 32), "test1", lockPath)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
|
testPod1.config.Namespace = "test1"
|
||||||
|
|
||||||
|
testPod2, err := getTestPod(strings.Repeat("1", 31)+"2", "test2", lockPath)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
|
testPod2.config.Namespace = "test2"
|
||||||
|
|
||||||
|
err = state.AddPod(testPod1)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
|
err = state.AddPod(testPod2)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
|
state.SetNamespace("test1")
|
||||||
|
|
||||||
|
pod, err := state.LookupPod(strings.Repeat("1", 5))
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
|
testPodsEqual(t, testPod1, pod)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
func TestHasPodEmptyIDErrors(t *testing.T) {
|
func TestHasPodEmptyIDErrors(t *testing.T) {
|
||||||
runForAllStates(t, func(t *testing.T, state State, lockPath string) {
|
runForAllStates(t, func(t *testing.T, state State, lockPath string) {
|
||||||
_, err := state.HasPod("")
|
_, err := state.HasPod("")
|
||||||
|
|
@ -1192,6 +1591,42 @@ func TestHasPodCtrIDFalse(t *testing.T) {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestHasPodSameNamespaceSucceeds(t *testing.T) {
|
||||||
|
runForAllStates(t, func(t *testing.T, state State, lockPath string) {
|
||||||
|
testPod, err := getTestPod1(lockPath)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
|
testPod.config.Namespace = "test1"
|
||||||
|
|
||||||
|
err = state.AddPod(testPod)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
|
state.SetNamespace("test1")
|
||||||
|
|
||||||
|
exist, err := state.HasPod(testPod.ID())
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assert.True(t, exist)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestHasPodDifferentNamespaceFails(t *testing.T) {
|
||||||
|
runForAllStates(t, func(t *testing.T, state State, lockPath string) {
|
||||||
|
testPod, err := getTestPod1(lockPath)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
|
testPod.config.Namespace = "test1"
|
||||||
|
|
||||||
|
err = state.AddPod(testPod)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
|
state.SetNamespace("test2")
|
||||||
|
|
||||||
|
exist, err := state.HasPod(testPod.ID())
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assert.False(t, exist)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
func TestAddPodInvalidPodErrors(t *testing.T) {
|
func TestAddPodInvalidPodErrors(t *testing.T) {
|
||||||
runForAllStates(t, func(t *testing.T, state State, lockPath string) {
|
runForAllStates(t, func(t *testing.T, state State, lockPath string) {
|
||||||
err := state.AddPod(&Pod{config: &PodConfig{}})
|
err := state.AddPod(&Pod{config: &PodConfig{}})
|
||||||
|
|
@ -1427,6 +1862,29 @@ func TestRemovePodAfterEmptySucceeds(t *testing.T) {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestRemovePodNotInNamespaceFails(t *testing.T) {
|
||||||
|
runForAllStates(t, func(t *testing.T, state State, lockPath string) {
|
||||||
|
testPod, err := getTestPod1(lockPath)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
|
testPod.config.Namespace = "test1"
|
||||||
|
|
||||||
|
err = state.AddPod(testPod)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
|
state.SetNamespace("test2")
|
||||||
|
|
||||||
|
err = state.RemovePod(testPod)
|
||||||
|
assert.Error(t, err)
|
||||||
|
|
||||||
|
state.SetNamespace("")
|
||||||
|
|
||||||
|
allPods, err := state.AllPods()
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assert.Equal(t, 1, len(allPods))
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
func TestAllPodsEmptyOnEmptyState(t *testing.T) {
|
func TestAllPodsEmptyOnEmptyState(t *testing.T) {
|
||||||
runForAllStates(t, func(t *testing.T, state State, lockPath string) {
|
runForAllStates(t, func(t *testing.T, state State, lockPath string) {
|
||||||
allPods, err := state.AllPods()
|
allPods, err := state.AllPods()
|
||||||
|
|
@ -1489,6 +1947,52 @@ func TestAllPodsMultiplePods(t *testing.T) {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestAllPodsPodInDifferentNamespaces(t *testing.T) {
|
||||||
|
runForAllStates(t, func(t *testing.T, state State, lockPath string) {
|
||||||
|
testPod, err := getTestPod1(lockPath)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
|
testPod.config.Namespace = "test1"
|
||||||
|
|
||||||
|
err = state.AddPod(testPod)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
|
state.SetNamespace("test2")
|
||||||
|
|
||||||
|
allPods, err := state.AllPods()
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assert.Equal(t, 0, len(allPods))
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestAllPodsOnePodInDifferentNamespace(t *testing.T) {
|
||||||
|
runForAllStates(t, func(t *testing.T, state State, lockPath string) {
|
||||||
|
testPod1, err := getTestPod1(lockPath)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
|
testPod1.config.Namespace = "test1"
|
||||||
|
|
||||||
|
testPod2, err := getTestPod2(lockPath)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
|
testPod2.config.Namespace = "test2"
|
||||||
|
|
||||||
|
err = state.AddPod(testPod1)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
|
err = state.AddPod(testPod2)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
|
state.SetNamespace("test1")
|
||||||
|
|
||||||
|
allPods, err := state.AllPods()
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assert.Equal(t, 1, len(allPods))
|
||||||
|
|
||||||
|
testPodsEqual(t, testPod1, allPods[0])
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
func TestPodHasContainerNoSuchPod(t *testing.T) {
|
func TestPodHasContainerNoSuchPod(t *testing.T) {
|
||||||
runForAllStates(t, func(t *testing.T, state State, lockPath string) {
|
runForAllStates(t, func(t *testing.T, state State, lockPath string) {
|
||||||
_, err := state.PodHasContainer(&Pod{config: &PodConfig{}}, strings.Repeat("0", 32))
|
_, err := state.PodHasContainer(&Pod{config: &PodConfig{}}, strings.Repeat("0", 32))
|
||||||
|
|
@ -1565,6 +2069,23 @@ func TestPodHasContainerSucceeds(t *testing.T) {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestPodHasContainerPodNotInNamespaceFails(t *testing.T) {
|
||||||
|
runForAllStates(t, func(t *testing.T, state State, lockPath string) {
|
||||||
|
testPod, err := getTestPod1(lockPath)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
|
testPod.config.Namespace = "test1"
|
||||||
|
|
||||||
|
err = state.AddPod(testPod)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
|
state.SetNamespace("test2")
|
||||||
|
|
||||||
|
_, err = state.PodHasContainer(testPod, strings.Repeat("2", 32))
|
||||||
|
assert.Error(t, err)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
func TestPodContainersByIDInvalidPod(t *testing.T) {
|
func TestPodContainersByIDInvalidPod(t *testing.T) {
|
||||||
runForAllStates(t, func(t *testing.T, state State, lockPath string) {
|
runForAllStates(t, func(t *testing.T, state State, lockPath string) {
|
||||||
_, err := state.PodContainersByID(&Pod{config: &PodConfig{}})
|
_, err := state.PodContainersByID(&Pod{config: &PodConfig{}})
|
||||||
|
|
@ -1667,6 +2188,23 @@ func TestPodContainersByIDMultipleContainers(t *testing.T) {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestPodContainerByIDPodNotInNamespace(t *testing.T) {
|
||||||
|
runForAllStates(t, func(t *testing.T, state State, lockPath string) {
|
||||||
|
testPod, err := getTestPod1(lockPath)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
|
testPod.config.Namespace = "test1"
|
||||||
|
|
||||||
|
err = state.AddPod(testPod)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
|
state.SetNamespace("test2")
|
||||||
|
|
||||||
|
_, err = state.PodContainersByID(testPod)
|
||||||
|
assert.Error(t, err)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
func TestPodContainersInvalidPod(t *testing.T) {
|
func TestPodContainersInvalidPod(t *testing.T) {
|
||||||
runForAllStates(t, func(t *testing.T, state State, lockPath string) {
|
runForAllStates(t, func(t *testing.T, state State, lockPath string) {
|
||||||
_, err := state.PodContainers(&Pod{config: &PodConfig{}})
|
_, err := state.PodContainers(&Pod{config: &PodConfig{}})
|
||||||
|
|
@ -1674,7 +2212,7 @@ func TestPodContainersInvalidPod(t *testing.T) {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestPodContainerdPodNotInState(t *testing.T) {
|
func TestPodContainersPodNotInState(t *testing.T) {
|
||||||
runForAllStates(t, func(t *testing.T, state State, lockPath string) {
|
runForAllStates(t, func(t *testing.T, state State, lockPath string) {
|
||||||
testPod, err := getTestPod1(lockPath)
|
testPod, err := getTestPod1(lockPath)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
|
|
@ -1770,6 +2308,23 @@ func TestPodContainersMultipleContainers(t *testing.T) {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestPodContainersPodNotInNamespace(t *testing.T) {
|
||||||
|
runForAllStates(t, func(t *testing.T, state State, lockPath string) {
|
||||||
|
testPod, err := getTestPod1(lockPath)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
|
testPod.config.Namespace = "test1"
|
||||||
|
|
||||||
|
err = state.AddPod(testPod)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
|
state.SetNamespace("test2")
|
||||||
|
|
||||||
|
_, err = state.PodContainers(testPod)
|
||||||
|
assert.Error(t, err)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
func TestRemovePodContainersInvalidPod(t *testing.T) {
|
func TestRemovePodContainersInvalidPod(t *testing.T) {
|
||||||
runForAllStates(t, func(t *testing.T, state State, lockPath string) {
|
runForAllStates(t, func(t *testing.T, state State, lockPath string) {
|
||||||
err := state.RemovePodContainers(&Pod{config: &PodConfig{}})
|
err := state.RemovePodContainers(&Pod{config: &PodConfig{}})
|
||||||
|
|
@ -1926,6 +2481,23 @@ func TestRemovePodContainerDependencyInPod(t *testing.T) {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestRemoveContainersNotInNamespace(t *testing.T) {
|
||||||
|
runForAllStates(t, func(t *testing.T, state State, lockPath string) {
|
||||||
|
testPod, err := getTestPod1(lockPath)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
|
testPod.config.Namespace = "test1"
|
||||||
|
|
||||||
|
err = state.AddPod(testPod)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
|
state.SetNamespace("test2")
|
||||||
|
|
||||||
|
err := state.RemovePodContainers(testPod)
|
||||||
|
assert.Error(t, err)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
func TestAddContainerToPodInvalidPod(t *testing.T) {
|
func TestAddContainerToPodInvalidPod(t *testing.T) {
|
||||||
runForAllStates(t, func(t *testing.T, state State, lockPath string) {
|
runForAllStates(t, func(t *testing.T, state State, lockPath string) {
|
||||||
testCtr, err := getTestCtr1(lockPath)
|
testCtr, err := getTestCtr1(lockPath)
|
||||||
|
|
@ -2620,6 +3192,76 @@ func TestRemoveContainerFromPodWithDependencySucceedsAfterDepRemoved(t *testing.
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestRemoveContainerFromPodSameNamespaceSucceeds(t *testing.T) {
|
||||||
|
runForAllStates(t, func(t *testing.T, state State, lockPath string) {
|
||||||
|
testPod, err := getTestPod1(lockPath)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
|
testPod.config.Namespace = "test1"
|
||||||
|
|
||||||
|
testCtr, err := getTestCtr2(lockPath)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
testCtr.config.Pod = testPod.ID()
|
||||||
|
|
||||||
|
testCtr.config.Namespace = "test1"
|
||||||
|
|
||||||
|
err = state.AddPod(testPod)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
|
err = state.AddContainerToPod(testPod, testCtr)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
|
state.SetNamespace("test1")
|
||||||
|
|
||||||
|
err = state.RemoveContainerFromPod(testPod, testCtr)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
|
ctrs, err := state.PodContainers(testPod)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assert.Equal(t, 0, len(ctrs))
|
||||||
|
|
||||||
|
allCtrs, err := state.AllContainers()
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assert.Equal(t, 0, len(allCtrs))
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestRemoveContainerFromPodDifferentNamespaceFails(t *testing.T) {
|
||||||
|
runForAllStates(t, func(t *testing.T, state State, lockPath string) {
|
||||||
|
testPod, err := getTestPod1(lockPath)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
|
testPod.config.Namespace = "test1"
|
||||||
|
|
||||||
|
testCtr, err := getTestCtr2(lockPath)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
testCtr.config.Pod = testPod.ID()
|
||||||
|
|
||||||
|
testCtr.config.Namespace = "test1"
|
||||||
|
|
||||||
|
err = state.AddPod(testPod)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
|
err = state.AddContainerToPod(testPod, testCtr)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
|
state.SetNamespace("test2")
|
||||||
|
|
||||||
|
err = state.RemoveContainerFromPod(testPod, testCtr)
|
||||||
|
assert.Error(t, err)
|
||||||
|
|
||||||
|
state.SetNamespace("")
|
||||||
|
|
||||||
|
ctrs, err := state.PodContainers(testPod)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assert.Equal(t, 1, len(ctrs))
|
||||||
|
|
||||||
|
allCtrs, err := state.AllContainers()
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assert.Equal(t, 1, len(allCtrs))
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
func TestUpdatePodInvalidPod(t *testing.T) {
|
func TestUpdatePodInvalidPod(t *testing.T) {
|
||||||
runForAllStates(t, func(t *testing.T, state State, lockPath string) {
|
runForAllStates(t, func(t *testing.T, state State, lockPath string) {
|
||||||
err := state.UpdatePod(&Pod{config: &PodConfig{}})
|
err := state.UpdatePod(&Pod{config: &PodConfig{}})
|
||||||
|
|
@ -2637,6 +3279,23 @@ func TestUpdatePodPodNotInStateFails(t *testing.T) {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestUpdatePodNotInNamespaceFails(t *testing.T) {
|
||||||
|
runForAllStates(t, func(t *testing.T, state State, lockPath string) {
|
||||||
|
testPod, err := getTestPod1(lockPath)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
|
testPod.config.Namespace = "test1"
|
||||||
|
|
||||||
|
err = state.AddPod(testPod)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
|
state.SetNamespace("test2")
|
||||||
|
|
||||||
|
_, err = state.UpdatePod(testPod)
|
||||||
|
assert.Error(t, err)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
func TestSavePodInvalidPod(t *testing.T) {
|
func TestSavePodInvalidPod(t *testing.T) {
|
||||||
runForAllStates(t, func(t *testing.T, state State, lockPath string) {
|
runForAllStates(t, func(t *testing.T, state State, lockPath string) {
|
||||||
err := state.SavePod(&Pod{config: &PodConfig{}})
|
err := state.SavePod(&Pod{config: &PodConfig{}})
|
||||||
|
|
@ -2654,6 +3313,23 @@ func TestSavePodPodNotInStateFails(t *testing.T) {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestSavePodNotInNamespaceFails(t *testing.T) {
|
||||||
|
runForAllStates(t, func(t *testing.T, state State, lockPath string) {
|
||||||
|
testPod, err := getTestPod1(lockPath)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
|
testPod.config.Namespace = "test1"
|
||||||
|
|
||||||
|
err = state.AddPod(testPod)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
|
state.SetNamespace("test2")
|
||||||
|
|
||||||
|
_, err = state.SavePod(testPod)
|
||||||
|
assert.Error(t, err)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
func TestSaveAndUpdatePod(t *testing.T) {
|
func TestSaveAndUpdatePod(t *testing.T) {
|
||||||
runForAllStates(t, func(t *testing.T, state State, lockPath string) {
|
runForAllStates(t, func(t *testing.T, state State, lockPath string) {
|
||||||
testPod, err := getTestPod1(lockPath)
|
testPod, err := getTestPod1(lockPath)
|
||||||
|
|
@ -2678,3 +3354,32 @@ func TestSaveAndUpdatePod(t *testing.T) {
|
||||||
testPodsEqual(t, testPod, statePod)
|
testPodsEqual(t, testPod, statePod)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestSaveAndUpdatePodSameNamespace(t *testing.T) {
|
||||||
|
runForAllStates(t, func(t *testing.T, state State, lockPath string) {
|
||||||
|
testPod, err := getTestPod1(lockPath)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
|
testPod.config.Namespace = "test1"
|
||||||
|
|
||||||
|
err = state.AddPod(testPod)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
|
state.SetNamespace("test1")
|
||||||
|
|
||||||
|
statePod, err := state.Pod(testPod.ID())
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
|
testPodsEqual(t, testPod, statePod)
|
||||||
|
|
||||||
|
testPod.state.CgroupPath = "/new/path/for/test"
|
||||||
|
|
||||||
|
err = state.SavePod(testPod)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
|
err = state.UpdatePod(statePod)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
|
||||||
|
testPodsEqual(t, testPod, statePod)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue