12
"github.com/containers/common/libnetwork/types"
13
"github.com/containers/common/pkg/config"
14
"github.com/containers/podman/v5/libpod/define"
15
"github.com/containers/podman/v5/libpod/lock"
16
"github.com/containers/storage"
17
"github.com/stretchr/testify/assert"
18
"github.com/stretchr/testify/require"
21
// Returns state, tmp directory containing all state files, lock manager, and
23
// Closing the state and removing the given tmp directory should be sufficient
25
type emptyStateFunc func() (State, string, lock.Manager, error)
28
tmpDirPrefix = "libpod_state_test_"
32
testedStates = map[string]emptyStateFunc{
33
"boltdb": getEmptyBoltState,
37
// Get an empty BoltDB state for use in tests
38
func getEmptyBoltState() (_ State, _ string, _ lock.Manager, retErr error) {
39
tmpDir, err := os.MkdirTemp("", tmpDirPrefix)
41
return nil, "", nil, err
49
if err := os.Setenv("CI_DESIRED_DATABASE", "boltdb"); err != nil {
50
return nil, "", nil, err
53
dbPath := filepath.Join(tmpDir, "db.sql")
55
lockManager, err := lock.NewInMemoryManager(16)
57
return nil, "", nil, err
60
runtime := new(Runtime)
61
runtime.config = new(config.Config)
62
runtime.storageConfig = storage.StoreOptions{}
63
runtime.lockManager = lockManager
65
state, err := NewBoltState(dbPath, runtime)
67
return nil, "", nil, err
70
return state, tmpDir, lockManager, nil
73
func runForAllStates(t *testing.T, testFunc func(*testing.T, State, lock.Manager)) {
74
for stateName, stateFunc := range testedStates {
75
state, path, manager, err := stateFunc()
77
t.Fatalf("Error initializing state %s: %v", stateName, err)
79
defer os.RemoveAll(path)
82
success := t.Run(stateName, func(t *testing.T) {
83
testFunc(t, state, manager)
91
func TestAddAndGetContainer(t *testing.T) {
92
runForAllStates(t, func(t *testing.T, state State, manager lock.Manager) {
93
testCtr, err := getTestCtr1(manager)
94
assert.NoError(t, err)
96
err = state.AddContainer(testCtr)
97
assert.NoError(t, err)
99
retrievedCtr, err := state.Container(testCtr.ID())
100
assert.NoError(t, err)
102
testContainersEqual(t, retrievedCtr, testCtr, true)
106
func TestAddAndGetContainerFromMultiple(t *testing.T) {
107
runForAllStates(t, func(t *testing.T, state State, manager lock.Manager) {
108
testCtr1, err := getTestCtr1(manager)
109
assert.NoError(t, err)
110
testCtr2, err := getTestCtr2(manager)
111
assert.NoError(t, err)
113
err = state.AddContainer(testCtr1)
114
assert.NoError(t, err)
116
err = state.AddContainer(testCtr2)
117
assert.NoError(t, err)
119
retrievedCtr, err := state.Container(testCtr1.ID())
120
assert.NoError(t, err)
122
testContainersEqual(t, retrievedCtr, testCtr1, true)
126
func TestGetContainerPodSameIDFails(t *testing.T) {
127
runForAllStates(t, func(t *testing.T, state State, manager lock.Manager) {
128
testPod, err := getTestPod1(manager)
129
assert.NoError(t, err)
131
err = state.AddPod(testPod)
132
assert.NoError(t, err)
134
_, err = state.Container(testPod.ID())
139
func TestAddInvalidContainerFails(t *testing.T) {
140
runForAllStates(t, func(t *testing.T, state State, manager lock.Manager) {
141
err := state.AddContainer(&Container{config: &ContainerConfig{ID: "1234"}})
146
func TestAddDuplicateCtrIDFails(t *testing.T) {
147
runForAllStates(t, func(t *testing.T, state State, manager lock.Manager) {
148
testCtr1, err := getTestCtr1(manager)
149
assert.NoError(t, err)
150
testCtr2, err := getTestContainer(testCtr1.ID(), "test2", manager)
151
assert.NoError(t, err)
153
err = state.AddContainer(testCtr1)
154
assert.NoError(t, err)
156
err = state.AddContainer(testCtr2)
159
ctrs, err := state.AllContainers(false)
160
assert.NoError(t, err)
161
assert.Equal(t, 1, len(ctrs))
165
func TestAddDuplicateCtrNameFails(t *testing.T) {
166
runForAllStates(t, func(t *testing.T, state State, manager lock.Manager) {
167
testCtr1, err := getTestCtr1(manager)
168
assert.NoError(t, err)
169
testCtr2, err := getTestContainer(strings.Repeat("2", 32), testCtr1.Name(), manager)
170
assert.NoError(t, err)
172
err = state.AddContainer(testCtr1)
173
assert.NoError(t, err)
175
err = state.AddContainer(testCtr2)
178
ctrs, err := state.AllContainers(false)
179
assert.NoError(t, err)
180
assert.Equal(t, 1, len(ctrs))
184
func TestAddCtrPodDupIDFails(t *testing.T) {
185
runForAllStates(t, func(t *testing.T, state State, manager lock.Manager) {
186
testPod, err := getTestPod1(manager)
187
assert.NoError(t, err)
188
testCtr, err := getTestContainer(testPod.ID(), "testCtr", manager)
189
assert.NoError(t, err)
191
err = state.AddPod(testPod)
192
assert.NoError(t, err)
194
err = state.AddContainer(testCtr)
197
ctrs, err := state.AllContainers(false)
198
assert.NoError(t, err)
199
assert.Equal(t, 0, len(ctrs))
203
func TestAddCtrPodDupNameFails(t *testing.T) {
204
runForAllStates(t, func(t *testing.T, state State, manager lock.Manager) {
205
testPod, err := getTestPod1(manager)
206
assert.NoError(t, err)
207
testCtr, err := getTestContainer(strings.Repeat("2", 32), testPod.Name(), manager)
208
assert.NoError(t, err)
210
err = state.AddPod(testPod)
211
assert.NoError(t, err)
213
err = state.AddContainer(testCtr)
216
ctrs, err := state.AllContainers(false)
217
assert.NoError(t, err)
218
assert.Equal(t, 0, len(ctrs))
222
func TestAddCtrInPodFails(t *testing.T) {
223
runForAllStates(t, func(t *testing.T, state State, manager lock.Manager) {
224
testPod, err := getTestPod1(manager)
225
assert.NoError(t, err)
227
testCtr, err := getTestCtr2(manager)
228
assert.NoError(t, err)
230
testCtr.config.Pod = testPod.ID()
232
err = state.AddPod(testPod)
233
assert.NoError(t, err)
235
err = state.AddContainer(testCtr)
238
ctrs, err := state.AllContainers(false)
239
assert.NoError(t, err)
240
assert.Equal(t, 0, len(ctrs))
244
func TestAddCtrDepInPodFails(t *testing.T) {
245
runForAllStates(t, func(t *testing.T, state State, manager lock.Manager) {
246
testPod, err := getTestPod1(manager)
247
assert.NoError(t, err)
249
testCtr1, err := getTestCtr2(manager)
250
assert.NoError(t, err)
252
testCtr1.config.Pod = testPod.ID()
254
testCtr2, err := getTestCtrN("3", manager)
255
assert.NoError(t, err)
257
testCtr2.config.UserNsCtr = testCtr1.ID()
259
err = state.AddPod(testPod)
260
assert.NoError(t, err)
262
err = state.AddContainerToPod(testPod, testCtr1)
263
assert.NoError(t, err)
265
err = state.AddContainer(testCtr2)
268
ctrs, err := state.AllContainers(false)
269
assert.NoError(t, err)
270
require.Len(t, ctrs, 1)
272
testContainersEqual(t, ctrs[0], testCtr1, true)
276
func TestGetNonexistentContainerFails(t *testing.T) {
277
runForAllStates(t, func(t *testing.T, state State, manager lock.Manager) {
278
_, err := state.Container("does not exist")
283
func TestGetContainerWithEmptyIDFails(t *testing.T) {
284
runForAllStates(t, func(t *testing.T, state State, manager lock.Manager) {
285
_, err := state.Container("")
290
func TestLookupContainerWithEmptyIDFails(t *testing.T) {
291
runForAllStates(t, func(t *testing.T, state State, manager lock.Manager) {
292
_, err := state.LookupContainer("")
295
_, err = state.LookupContainerID("")
300
func TestLookupNonexistentContainerFails(t *testing.T) {
301
runForAllStates(t, func(t *testing.T, state State, manager lock.Manager) {
302
_, err := state.LookupContainer("does not exist")
305
_, err = state.LookupContainerID("does not exist")
310
func TestLookupContainerByFullID(t *testing.T) {
311
runForAllStates(t, func(t *testing.T, state State, manager lock.Manager) {
312
testCtr, err := getTestCtr1(manager)
313
assert.NoError(t, err)
315
err = state.AddContainer(testCtr)
316
assert.NoError(t, err)
318
retrievedCtr, err := state.LookupContainer(testCtr.ID())
319
assert.NoError(t, err)
320
testContainersEqual(t, retrievedCtr, testCtr, true)
322
retrievedID, err := state.LookupContainerID(testCtr.ID())
323
assert.NoError(t, err)
324
assert.Equal(t, retrievedID, testCtr.ID())
328
func TestLookupContainerByUniquePartialID(t *testing.T) {
329
runForAllStates(t, func(t *testing.T, state State, manager lock.Manager) {
330
testCtr, err := getTestCtr1(manager)
331
assert.NoError(t, err)
333
err = state.AddContainer(testCtr)
334
assert.NoError(t, err)
336
retrievedCtr, err := state.LookupContainer(testCtr.ID()[0:8])
337
assert.NoError(t, err)
338
testContainersEqual(t, retrievedCtr, testCtr, true)
340
retrievedID, err := state.LookupContainerID(testCtr.ID()[0:8])
341
assert.NoError(t, err)
342
assert.Equal(t, retrievedID, testCtr.ID())
346
func TestLookupContainerByNonUniquePartialIDFails(t *testing.T) {
347
runForAllStates(t, func(t *testing.T, state State, manager lock.Manager) {
348
testCtr1, err := getTestContainer(strings.Repeat("0", 32), "test1", manager)
349
assert.NoError(t, err)
350
testCtr2, err := getTestContainer(strings.Repeat("0", 31)+"1", "test2", manager)
351
assert.NoError(t, err)
353
err = state.AddContainer(testCtr1)
354
assert.NoError(t, err)
356
err = state.AddContainer(testCtr2)
357
assert.NoError(t, err)
359
_, err = state.LookupContainer(testCtr1.ID()[0:8])
362
_, err = state.LookupContainerID(testCtr1.ID()[0:8])
367
func TestLookupContainerByName(t *testing.T) {
368
runForAllStates(t, func(t *testing.T, state State, manager lock.Manager) {
369
testCtr, err := getTestCtr1(manager)
370
assert.NoError(t, err)
372
err = state.AddContainer(testCtr)
373
assert.NoError(t, err)
375
retrievedCtr, err := state.LookupContainer(testCtr.Name())
376
assert.NoError(t, err)
377
testContainersEqual(t, retrievedCtr, testCtr, true)
379
retrievedID, err := state.LookupContainerID(testCtr.Name())
380
assert.NoError(t, err)
381
assert.Equal(t, retrievedID, testCtr.ID())
385
func TestLookupCtrByPodNameFails(t *testing.T) {
386
runForAllStates(t, func(t *testing.T, state State, manager lock.Manager) {
387
testPod, err := getTestPod1(manager)
388
assert.NoError(t, err)
390
err = state.AddPod(testPod)
391
assert.NoError(t, err)
393
_, err = state.LookupContainer(testPod.Name())
396
_, err = state.LookupContainerID(testPod.Name())
401
func TestLookupCtrByPodIDFails(t *testing.T) {
402
runForAllStates(t, func(t *testing.T, state State, manager lock.Manager) {
403
testPod, err := getTestPod1(manager)
404
assert.NoError(t, err)
406
err = state.AddPod(testPod)
407
assert.NoError(t, err)
409
_, err = state.LookupContainer(testPod.ID())
412
_, err = state.LookupContainerID(testPod.ID())
417
func TestHasContainerEmptyIDFails(t *testing.T) {
418
runForAllStates(t, func(t *testing.T, state State, manager lock.Manager) {
419
_, err := state.HasContainer("")
424
func TestHasContainerNoSuchContainerReturnsFalse(t *testing.T) {
425
runForAllStates(t, func(t *testing.T, state State, manager lock.Manager) {
426
exists, err := state.HasContainer("does not exist")
427
assert.NoError(t, err)
428
assert.False(t, exists)
432
func TestHasContainerFindsContainer(t *testing.T) {
433
runForAllStates(t, func(t *testing.T, state State, manager lock.Manager) {
434
testCtr, err := getTestCtr1(manager)
435
assert.NoError(t, err)
437
err = state.AddContainer(testCtr)
438
assert.NoError(t, err)
440
exists, err := state.HasContainer(testCtr.ID())
441
assert.NoError(t, err)
442
assert.True(t, exists)
446
func TestHasContainerPodIDIsFalse(t *testing.T) {
447
runForAllStates(t, func(t *testing.T, state State, manager lock.Manager) {
448
testPod, err := getTestPod1(manager)
449
assert.NoError(t, err)
451
err = state.AddPod(testPod)
452
assert.NoError(t, err)
454
exists, err := state.HasContainer(testPod.ID())
455
assert.NoError(t, err)
456
assert.False(t, exists)
460
func TestSaveAndUpdateContainer(t *testing.T) {
461
runForAllStates(t, func(t *testing.T, state State, manager lock.Manager) {
462
testCtr, err := getTestCtr1(manager)
463
assert.NoError(t, err)
465
err = state.AddContainer(testCtr)
466
assert.NoError(t, err)
468
retrievedCtr, err := state.Container(testCtr.ID())
469
require.NoError(t, err)
471
retrievedCtr.state.State = define.ContainerStateStopped
472
retrievedCtr.state.ExitCode = 127
473
retrievedCtr.state.FinishedTime = time.Now()
475
err = state.SaveContainer(retrievedCtr)
476
assert.NoError(t, err)
478
err = state.UpdateContainer(testCtr)
479
assert.NoError(t, err)
481
testContainersEqual(t, testCtr, retrievedCtr, false)
485
func TestUpdateContainerNotInDatabaseReturnsError(t *testing.T) {
486
runForAllStates(t, func(t *testing.T, state State, manager lock.Manager) {
487
testCtr, err := getTestCtr1(manager)
488
assert.NoError(t, err)
490
err = state.UpdateContainer(testCtr)
492
assert.False(t, testCtr.valid)
496
func TestUpdateInvalidContainerReturnsError(t *testing.T) {
497
runForAllStates(t, func(t *testing.T, state State, manager lock.Manager) {
498
err := state.UpdateContainer(&Container{config: &ContainerConfig{ID: "1234"}})
503
func TestSaveInvalidContainerReturnsError(t *testing.T) {
504
runForAllStates(t, func(t *testing.T, state State, manager lock.Manager) {
505
err := state.SaveContainer(&Container{config: &ContainerConfig{ID: "1234"}})
510
func TestSaveContainerNotInStateReturnsError(t *testing.T) {
511
runForAllStates(t, func(t *testing.T, state State, manager lock.Manager) {
512
testCtr, err := getTestCtr1(manager)
513
assert.NoError(t, err)
515
err = state.SaveContainer(testCtr)
517
assert.False(t, testCtr.valid)
521
func TestRemoveContainer(t *testing.T) {
522
runForAllStates(t, func(t *testing.T, state State, manager lock.Manager) {
523
testCtr, err := getTestCtr1(manager)
524
assert.NoError(t, err)
526
err = state.AddContainer(testCtr)
527
assert.NoError(t, err)
529
ctrs, err := state.AllContainers(false)
530
assert.NoError(t, err)
531
assert.Equal(t, 1, len(ctrs))
533
err = state.RemoveContainer(testCtr)
534
assert.NoError(t, err)
536
ctrs2, err := state.AllContainers(false)
537
assert.NoError(t, err)
538
assert.Equal(t, 0, len(ctrs2))
542
func TestRemoveNonexistentContainerFails(t *testing.T) {
543
runForAllStates(t, func(t *testing.T, state State, manager lock.Manager) {
544
testCtr, err := getTestCtr1(manager)
545
assert.NoError(t, err)
547
err = state.RemoveContainer(testCtr)
549
assert.False(t, testCtr.valid)
553
func TestGetAllContainersOnNewStateIsEmpty(t *testing.T) {
554
runForAllStates(t, func(t *testing.T, state State, manager lock.Manager) {
555
ctrs, err := state.AllContainers(false)
556
assert.NoError(t, err)
557
assert.Equal(t, 0, len(ctrs))
561
func TestGetAllContainersWithOneContainer(t *testing.T) {
562
runForAllStates(t, func(t *testing.T, state State, manager lock.Manager) {
563
testCtr, err := getTestCtr1(manager)
564
assert.NoError(t, err)
566
err = state.AddContainer(testCtr)
567
assert.NoError(t, err)
569
ctrs, err := state.AllContainers(false)
570
assert.NoError(t, err)
571
require.Len(t, ctrs, 1)
573
testContainersEqual(t, ctrs[0], testCtr, true)
577
func TestGetAllContainersTwoContainers(t *testing.T) {
578
runForAllStates(t, func(t *testing.T, state State, manager lock.Manager) {
579
testCtr1, err := getTestCtr1(manager)
580
assert.NoError(t, err)
581
testCtr2, err := getTestCtr2(manager)
582
assert.NoError(t, err)
584
err = state.AddContainer(testCtr1)
585
assert.NoError(t, err)
587
err = state.AddContainer(testCtr2)
588
assert.NoError(t, err)
590
ctrs, err := state.AllContainers(false)
591
assert.NoError(t, err)
592
assert.Equal(t, 2, len(ctrs))
596
func TestContainerInUseInvalidContainer(t *testing.T) {
597
runForAllStates(t, func(t *testing.T, state State, manager lock.Manager) {
598
_, err := state.ContainerInUse(&Container{})
603
func TestContainerInUseCtrNotInState(t *testing.T) {
604
runForAllStates(t, func(t *testing.T, state State, manager lock.Manager) {
605
testCtr, err := getTestCtr1(manager)
606
assert.NoError(t, err)
607
_, err = state.ContainerInUse(testCtr)
612
func TestContainerInUseOneContainer(t *testing.T) {
613
runForAllStates(t, func(t *testing.T, state State, manager lock.Manager) {
614
testCtr1, err := getTestCtr1(manager)
615
assert.NoError(t, err)
616
testCtr2, err := getTestCtr2(manager)
617
assert.NoError(t, err)
619
testCtr2.config.UserNsCtr = testCtr1.config.ID
621
err = state.AddContainer(testCtr1)
622
assert.NoError(t, err)
624
err = state.AddContainer(testCtr2)
625
assert.NoError(t, err)
627
ids, err := state.ContainerInUse(testCtr1)
628
assert.NoError(t, err)
629
assert.Equal(t, 1, len(ids))
630
assert.Equal(t, testCtr2.config.ID, ids[0])
634
func TestContainerInUseTwoContainers(t *testing.T) {
635
runForAllStates(t, func(t *testing.T, state State, manager lock.Manager) {
636
testCtr1, err := getTestCtr1(manager)
637
assert.NoError(t, err)
638
testCtr2, err := getTestCtr2(manager)
639
assert.NoError(t, err)
640
testCtr3, err := getTestCtrN("3", manager)
641
assert.NoError(t, err)
643
testCtr2.config.UserNsCtr = testCtr1.config.ID
644
testCtr3.config.IPCNsCtr = testCtr1.config.ID
646
err = state.AddContainer(testCtr1)
647
assert.NoError(t, err)
649
err = state.AddContainer(testCtr2)
650
assert.NoError(t, err)
652
err = state.AddContainer(testCtr3)
653
assert.NoError(t, err)
655
ids, err := state.ContainerInUse(testCtr1)
656
assert.NoError(t, err)
657
assert.Equal(t, 2, len(ids))
661
func TestContainerInUseOneContainerMultipleDependencies(t *testing.T) {
662
runForAllStates(t, func(t *testing.T, state State, manager lock.Manager) {
663
testCtr1, err := getTestCtr1(manager)
664
assert.NoError(t, err)
665
testCtr2, err := getTestCtr2(manager)
666
assert.NoError(t, err)
668
testCtr2.config.UserNsCtr = testCtr1.config.ID
669
testCtr2.config.IPCNsCtr = testCtr1.config.ID
671
err = state.AddContainer(testCtr1)
672
assert.NoError(t, err)
674
err = state.AddContainer(testCtr2)
675
assert.NoError(t, err)
677
ids, err := state.ContainerInUse(testCtr1)
678
assert.NoError(t, err)
679
assert.Equal(t, 1, len(ids))
680
assert.Equal(t, testCtr2.config.ID, ids[0])
684
func TestContainerInUseGenericDependency(t *testing.T) {
685
runForAllStates(t, func(t *testing.T, state State, manager lock.Manager) {
686
testCtr1, err := getTestCtr1(manager)
687
assert.NoError(t, err)
688
testCtr2, err := getTestCtr2(manager)
689
assert.NoError(t, err)
691
testCtr2.config.Dependencies = []string{testCtr1.config.ID}
693
err = state.AddContainer(testCtr1)
694
assert.NoError(t, err)
696
err = state.AddContainer(testCtr2)
697
assert.NoError(t, err)
699
ids, err := state.ContainerInUse(testCtr1)
700
assert.NoError(t, err)
701
assert.Equal(t, 1, len(ids))
702
assert.Equal(t, testCtr2.config.ID, ids[0])
706
func TestContainerInUseMultipleGenericDependencies(t *testing.T) {
707
runForAllStates(t, func(t *testing.T, state State, manager lock.Manager) {
708
testCtr1, err := getTestCtr1(manager)
709
assert.NoError(t, err)
710
testCtr2, err := getTestCtr2(manager)
711
assert.NoError(t, err)
712
testCtr3, err := getTestCtrN("3", manager)
713
assert.NoError(t, err)
715
testCtr3.config.Dependencies = []string{testCtr1.config.ID, testCtr2.config.ID}
717
err = state.AddContainer(testCtr1)
718
assert.NoError(t, err)
720
err = state.AddContainer(testCtr2)
721
assert.NoError(t, err)
723
err = state.AddContainer(testCtr3)
724
assert.NoError(t, err)
726
ids1, err := state.ContainerInUse(testCtr1)
727
assert.NoError(t, err)
728
assert.Equal(t, 1, len(ids1))
729
assert.Equal(t, testCtr3.config.ID, ids1[0])
731
ids2, err := state.ContainerInUse(testCtr2)
732
assert.NoError(t, err)
733
assert.Equal(t, 1, len(ids2))
734
assert.Equal(t, testCtr3.config.ID, ids2[0])
738
func TestContainerInUseGenericAndNamespaceDependencies(t *testing.T) {
739
runForAllStates(t, func(t *testing.T, state State, manager lock.Manager) {
740
testCtr1, err := getTestCtr1(manager)
741
assert.NoError(t, err)
742
testCtr2, err := getTestCtr2(manager)
743
assert.NoError(t, err)
745
testCtr2.config.Dependencies = []string{testCtr1.config.ID}
746
testCtr2.config.IPCNsCtr = testCtr1.config.ID
748
err = state.AddContainer(testCtr1)
749
assert.NoError(t, err)
751
err = state.AddContainer(testCtr2)
752
assert.NoError(t, err)
754
ids, err := state.ContainerInUse(testCtr1)
755
assert.NoError(t, err)
756
assert.Equal(t, 1, len(ids))
757
assert.Equal(t, testCtr2.config.ID, ids[0])
761
func TestCannotRemoveContainerWithDependency(t *testing.T) {
762
runForAllStates(t, func(t *testing.T, state State, manager lock.Manager) {
763
testCtr1, err := getTestCtr1(manager)
764
assert.NoError(t, err)
765
testCtr2, err := getTestCtr2(manager)
766
assert.NoError(t, err)
768
testCtr2.config.UserNsCtr = testCtr1.config.ID
770
err = state.AddContainer(testCtr1)
771
assert.NoError(t, err)
773
err = state.AddContainer(testCtr2)
774
assert.NoError(t, err)
776
err = state.RemoveContainer(testCtr1)
779
ctrs, err := state.AllContainers(false)
780
assert.NoError(t, err)
781
assert.Equal(t, 2, len(ctrs))
785
func TestCannotRemoveContainerWithGenericDependency(t *testing.T) {
786
runForAllStates(t, func(t *testing.T, state State, manager lock.Manager) {
787
testCtr1, err := getTestCtr1(manager)
788
assert.NoError(t, err)
789
testCtr2, err := getTestCtr2(manager)
790
assert.NoError(t, err)
792
testCtr2.config.Dependencies = []string{testCtr1.config.ID}
794
err = state.AddContainer(testCtr1)
795
assert.NoError(t, err)
797
err = state.AddContainer(testCtr2)
798
assert.NoError(t, err)
800
err = state.RemoveContainer(testCtr1)
803
ctrs, err := state.AllContainers(false)
804
assert.NoError(t, err)
805
assert.Equal(t, 2, len(ctrs))
809
func TestCanRemoveContainerAfterDependencyRemoved(t *testing.T) {
810
runForAllStates(t, func(t *testing.T, state State, manager lock.Manager) {
811
testCtr1, err := getTestCtr1(manager)
812
assert.NoError(t, err)
813
testCtr2, err := getTestCtr2(manager)
814
assert.NoError(t, err)
816
testCtr2.config.UserNsCtr = testCtr1.ID()
818
err = state.AddContainer(testCtr1)
819
assert.NoError(t, err)
821
err = state.AddContainer(testCtr2)
822
assert.NoError(t, err)
824
err = state.RemoveContainer(testCtr2)
825
assert.NoError(t, err)
827
err = state.RemoveContainer(testCtr1)
828
assert.NoError(t, err)
830
ctrs, err := state.AllContainers(false)
831
assert.NoError(t, err)
832
assert.Equal(t, 0, len(ctrs))
836
func TestCanRemoveContainerAfterDependencyRemovedDuplicate(t *testing.T) {
837
runForAllStates(t, func(t *testing.T, state State, manager lock.Manager) {
838
testCtr1, err := getTestCtr1(manager)
839
assert.NoError(t, err)
840
testCtr2, err := getTestCtr2(manager)
841
assert.NoError(t, err)
843
testCtr2.config.UserNsCtr = testCtr1.ID()
844
testCtr2.config.IPCNsCtr = testCtr1.ID()
846
err = state.AddContainer(testCtr1)
847
assert.NoError(t, err)
849
err = state.AddContainer(testCtr2)
850
assert.NoError(t, err)
852
err = state.RemoveContainer(testCtr2)
853
assert.NoError(t, err)
855
err = state.RemoveContainer(testCtr1)
856
assert.NoError(t, err)
858
ctrs, err := state.AllContainers(false)
859
assert.NoError(t, err)
860
assert.Equal(t, 0, len(ctrs))
864
func TestCannotUsePodAsDependency(t *testing.T) {
865
runForAllStates(t, func(t *testing.T, state State, manager lock.Manager) {
866
testCtr, err := getTestCtr1(manager)
867
assert.NoError(t, err)
869
testPod, err := getTestPod2(manager)
870
assert.NoError(t, err)
872
testCtr.config.UserNsCtr = testPod.ID()
874
err = state.AddPod(testPod)
875
assert.NoError(t, err)
877
err = state.AddContainer(testCtr)
880
ctrs, err := state.AllContainers(false)
881
assert.NoError(t, err)
882
assert.Equal(t, 0, len(ctrs))
886
func TestAddContainerEmptyNetworkNameErrors(t *testing.T) {
887
runForAllStates(t, func(t *testing.T, state State, manager lock.Manager) {
888
testCtr, err := getTestCtr1(manager)
889
assert.NoError(t, err)
891
testCtr.config.Networks = map[string]types.PerNetworkOptions{
895
err = state.AddContainer(testCtr)
900
func TestCannotUseBadIDAsDependency(t *testing.T) {
901
runForAllStates(t, func(t *testing.T, state State, manager lock.Manager) {
902
testCtr, err := getTestCtr1(manager)
903
assert.NoError(t, err)
905
testCtr.config.UserNsCtr = strings.Repeat("5", 32)
907
err = state.AddContainer(testCtr)
910
ctrs, err := state.AllContainers(false)
911
assert.NoError(t, err)
912
assert.Equal(t, 0, len(ctrs))
916
func TestCannotUseBadIDAsGenericDependency(t *testing.T) {
917
runForAllStates(t, func(t *testing.T, state State, manager lock.Manager) {
918
testCtr, err := getTestCtr1(manager)
919
assert.NoError(t, err)
921
testCtr.config.Dependencies = []string{strings.Repeat("5", 32)}
923
err = state.AddContainer(testCtr)
926
ctrs, err := state.AllContainers(false)
927
assert.NoError(t, err)
928
assert.Equal(t, 0, len(ctrs))
932
func TestRewriteContainerConfigDoesNotExist(t *testing.T) {
933
runForAllStates(t, func(t *testing.T, state State, manager lock.Manager) {
934
err := state.RewriteContainerConfig(&Container{}, &ContainerConfig{})
939
func TestRewriteContainerConfigNotInState(t *testing.T) {
940
runForAllStates(t, func(t *testing.T, state State, manager lock.Manager) {
941
testCtr, err := getTestCtr1(manager)
942
assert.NoError(t, err)
943
err = state.RewriteContainerConfig(testCtr, &ContainerConfig{})
948
func TestRewriteContainerConfigRewritesConfig(t *testing.T) {
949
runForAllStates(t, func(t *testing.T, state State, manager lock.Manager) {
950
testCtr, err := getTestCtr1(manager)
951
assert.NoError(t, err)
953
err = state.AddContainer(testCtr)
954
assert.NoError(t, err)
956
testCtr.config.LogPath = "/another/path/"
958
err = state.RewriteContainerConfig(testCtr, testCtr.config)
959
assert.NoError(t, err)
961
testCtrFromState, err := state.Container(testCtr.ID())
962
assert.NoError(t, err)
964
testContainersEqual(t, testCtrFromState, testCtr, true)
968
func TestRewritePodConfigDoesNotExist(t *testing.T) {
969
runForAllStates(t, func(t *testing.T, state State, manager lock.Manager) {
970
err := state.RewritePodConfig(&Pod{}, &PodConfig{})
975
func TestRewritePodConfigNotInState(t *testing.T) {
976
runForAllStates(t, func(t *testing.T, state State, manager lock.Manager) {
977
testPod, err := getTestPod1(manager)
978
assert.NoError(t, err)
979
err = state.RewritePodConfig(testPod, &PodConfig{})
984
func TestRewritePodConfigRewritesConfig(t *testing.T) {
985
runForAllStates(t, func(t *testing.T, state State, manager lock.Manager) {
986
testPod, err := getTestPod1(manager)
987
assert.NoError(t, err)
989
err = state.AddPod(testPod)
990
assert.NoError(t, err)
992
testPod.config.CgroupParent = "/another_cgroup_parent"
994
err = state.RewritePodConfig(testPod, testPod.config)
995
assert.NoError(t, err)
997
testPodFromState, err := state.Pod(testPod.ID())
998
assert.NoError(t, err)
1000
testPodsEqual(t, testPodFromState, testPod, true)
1004
func TestGetPodDoesNotExist(t *testing.T) {
1005
runForAllStates(t, func(t *testing.T, state State, manager lock.Manager) {
1006
_, err := state.Pod("doesnotexist")
1007
assert.Error(t, err)
1011
func TestGetPodEmptyID(t *testing.T) {
1012
runForAllStates(t, func(t *testing.T, state State, manager lock.Manager) {
1013
_, err := state.Pod("")
1014
assert.Error(t, err)
1018
func TestGetPodOnePod(t *testing.T) {
1019
runForAllStates(t, func(t *testing.T, state State, manager lock.Manager) {
1020
testPod, err := getTestPod1(manager)
1021
assert.NoError(t, err)
1023
err = state.AddPod(testPod)
1024
assert.NoError(t, err)
1026
statePod, err := state.Pod(testPod.ID())
1027
assert.NoError(t, err)
1029
testPodsEqual(t, statePod, testPod, true)
1033
func TestGetOnePodFromTwo(t *testing.T) {
1034
runForAllStates(t, func(t *testing.T, state State, manager lock.Manager) {
1035
testPod1, err := getTestPod1(manager)
1036
assert.NoError(t, err)
1038
testPod2, err := getTestPod2(manager)
1039
assert.NoError(t, err)
1041
err = state.AddPod(testPod1)
1042
assert.NoError(t, err)
1044
err = state.AddPod(testPod2)
1045
assert.NoError(t, err)
1047
statePod, err := state.Pod(testPod1.ID())
1048
assert.NoError(t, err)
1050
testPodsEqual(t, statePod, testPod1, true)
1054
func TestGetNotExistPodWithPods(t *testing.T) {
1055
runForAllStates(t, func(t *testing.T, state State, manager lock.Manager) {
1056
testPod1, err := getTestPod1(manager)
1057
assert.NoError(t, err)
1059
testPod2, err := getTestPod2(manager)
1060
assert.NoError(t, err)
1062
err = state.AddPod(testPod1)
1063
assert.NoError(t, err)
1065
err = state.AddPod(testPod2)
1066
assert.NoError(t, err)
1068
_, err = state.Pod("nonexistent")
1069
assert.Error(t, err)
1073
func TestGetPodByCtrID(t *testing.T) {
1074
runForAllStates(t, func(t *testing.T, state State, manager lock.Manager) {
1075
testCtr, err := getTestCtr1(manager)
1076
assert.NoError(t, err)
1078
err = state.AddContainer(testCtr)
1079
assert.NoError(t, err)
1081
_, err = state.Pod(testCtr.ID())
1082
assert.Error(t, err)
1086
func TestLookupPodEmptyID(t *testing.T) {
1087
runForAllStates(t, func(t *testing.T, state State, manager lock.Manager) {
1088
_, err := state.LookupPod("")
1089
assert.Error(t, err)
1093
func TestLookupNotExistPod(t *testing.T) {
1094
runForAllStates(t, func(t *testing.T, state State, manager lock.Manager) {
1095
_, err := state.LookupPod("doesnotexist")
1096
assert.Error(t, err)
1100
func TestLookupPodFullID(t *testing.T) {
1101
runForAllStates(t, func(t *testing.T, state State, manager lock.Manager) {
1102
testPod, err := getTestPod1(manager)
1103
assert.NoError(t, err)
1105
err = state.AddPod(testPod)
1106
assert.NoError(t, err)
1108
statePod, err := state.LookupPod(testPod.ID())
1109
assert.NoError(t, err)
1111
testPodsEqual(t, statePod, testPod, true)
1115
func TestLookupPodUniquePartialID(t *testing.T) {
1116
runForAllStates(t, func(t *testing.T, state State, manager lock.Manager) {
1117
testPod, err := getTestPod1(manager)
1118
assert.NoError(t, err)
1120
err = state.AddPod(testPod)
1121
assert.NoError(t, err)
1123
statePod, err := state.LookupPod(testPod.ID()[0:8])
1124
assert.NoError(t, err)
1126
testPodsEqual(t, statePod, testPod, true)
1130
func TestLookupPodNonUniquePartialID(t *testing.T) {
1131
runForAllStates(t, func(t *testing.T, state State, manager lock.Manager) {
1132
testPod1, err := getTestPod(strings.Repeat("1", 32), "test1", manager)
1133
assert.NoError(t, err)
1135
testPod2, err := getTestPod(strings.Repeat("1", 31)+"2", "test2", manager)
1136
assert.NoError(t, err)
1138
err = state.AddPod(testPod1)
1139
assert.NoError(t, err)
1141
err = state.AddPod(testPod2)
1142
assert.NoError(t, err)
1144
_, err = state.LookupPod(testPod1.ID()[0:8])
1145
assert.Error(t, err)
1149
func TestLookupPodByName(t *testing.T) {
1150
runForAllStates(t, func(t *testing.T, state State, manager lock.Manager) {
1151
testPod, err := getTestPod1(manager)
1152
assert.NoError(t, err)
1154
err = state.AddPod(testPod)
1155
assert.NoError(t, err)
1157
statePod, err := state.LookupPod(testPod.Name())
1158
assert.NoError(t, err)
1160
testPodsEqual(t, statePod, statePod, true)
1164
func TestLookupPodByCtrID(t *testing.T) {
1165
runForAllStates(t, func(t *testing.T, state State, manager lock.Manager) {
1166
testCtr, err := getTestCtr1(manager)
1167
assert.NoError(t, err)
1169
err = state.AddContainer(testCtr)
1170
assert.NoError(t, err)
1172
_, err = state.LookupPod(testCtr.ID())
1173
assert.Error(t, err)
1177
func TestLookupPodByCtrName(t *testing.T) {
1178
runForAllStates(t, func(t *testing.T, state State, manager lock.Manager) {
1179
testCtr, err := getTestCtr1(manager)
1180
assert.NoError(t, err)
1182
err = state.AddContainer(testCtr)
1183
assert.NoError(t, err)
1185
_, err = state.LookupPod(testCtr.Name())
1186
assert.Error(t, err)
1190
func TestHasPodEmptyIDErrors(t *testing.T) {
1191
runForAllStates(t, func(t *testing.T, state State, manager lock.Manager) {
1192
_, err := state.HasPod("")
1193
assert.Error(t, err)
1197
func TestHasPodNoSuchPod(t *testing.T) {
1198
runForAllStates(t, func(t *testing.T, state State, manager lock.Manager) {
1199
exist, err := state.HasPod("nonexistent")
1200
assert.NoError(t, err)
1201
assert.False(t, exist)
1205
func TestHasPodWrongIDFalse(t *testing.T) {
1206
runForAllStates(t, func(t *testing.T, state State, manager lock.Manager) {
1207
testPod, err := getTestPod1(manager)
1208
assert.NoError(t, err)
1210
err = state.AddPod(testPod)
1211
assert.NoError(t, err)
1213
exist, err := state.HasPod(strings.Repeat("a", 32))
1214
assert.NoError(t, err)
1215
assert.False(t, exist)
1219
func TestHasPodRightIDTrue(t *testing.T) {
1220
runForAllStates(t, func(t *testing.T, state State, manager lock.Manager) {
1221
testPod, err := getTestPod1(manager)
1222
assert.NoError(t, err)
1224
err = state.AddPod(testPod)
1225
assert.NoError(t, err)
1227
exist, err := state.HasPod(testPod.ID())
1228
assert.NoError(t, err)
1229
assert.True(t, exist)
1233
func TestHasPodCtrIDFalse(t *testing.T) {
1234
runForAllStates(t, func(t *testing.T, state State, manager lock.Manager) {
1235
testCtr, err := getTestCtr1(manager)
1236
assert.NoError(t, err)
1238
err = state.AddContainer(testCtr)
1239
assert.NoError(t, err)
1241
exist, err := state.HasPod(testCtr.ID())
1242
assert.NoError(t, err)
1243
assert.False(t, exist)
1247
func TestAddPodInvalidPodErrors(t *testing.T) {
1248
runForAllStates(t, func(t *testing.T, state State, manager lock.Manager) {
1249
err := state.AddPod(&Pod{config: &PodConfig{}})
1250
assert.Error(t, err)
1254
func TestAddPodValidPodSucceeds(t *testing.T) {
1255
runForAllStates(t, func(t *testing.T, state State, manager lock.Manager) {
1256
testPod, err := getTestPod1(manager)
1257
assert.NoError(t, err)
1259
err = state.AddPod(testPod)
1260
assert.NoError(t, err)
1262
allPods, err := state.AllPods()
1263
assert.NoError(t, err)
1264
assert.Equal(t, 1, len(allPods))
1266
testPodsEqual(t, allPods[0], testPod, true)
1270
func TestAddPodDuplicateIDFails(t *testing.T) {
1271
runForAllStates(t, func(t *testing.T, state State, manager lock.Manager) {
1272
testPod1, err := getTestPod1(manager)
1273
assert.NoError(t, err)
1275
testPod2, err := getTestPod(testPod1.ID(), "testpod2", manager)
1276
assert.NoError(t, err)
1278
err = state.AddPod(testPod1)
1279
assert.NoError(t, err)
1281
err = state.AddPod(testPod2)
1282
assert.Error(t, err)
1284
allPods, err := state.AllPods()
1285
assert.NoError(t, err)
1286
assert.Equal(t, 1, len(allPods))
1290
func TestAddPodDuplicateNameFails(t *testing.T) {
1291
runForAllStates(t, func(t *testing.T, state State, manager lock.Manager) {
1292
testPod1, err := getTestPod1(manager)
1293
assert.NoError(t, err)
1295
testPod2, err := getTestPod(strings.Repeat("2", 32), testPod1.Name(), manager)
1296
assert.NoError(t, err)
1298
err = state.AddPod(testPod1)
1299
assert.NoError(t, err)
1301
err = state.AddPod(testPod2)
1302
assert.Error(t, err)
1304
allPods, err := state.AllPods()
1305
assert.NoError(t, err)
1306
assert.Equal(t, 1, len(allPods))
1310
func TestAddPodNonDuplicateSucceeds(t *testing.T) {
1311
runForAllStates(t, func(t *testing.T, state State, manager lock.Manager) {
1312
testPod1, err := getTestPod1(manager)
1313
assert.NoError(t, err)
1315
testPod2, err := getTestPod2(manager)
1316
assert.NoError(t, err)
1318
err = state.AddPod(testPod1)
1319
assert.NoError(t, err)
1321
err = state.AddPod(testPod2)
1322
assert.NoError(t, err)
1324
allPods, err := state.AllPods()
1325
assert.NoError(t, err)
1326
assert.Equal(t, 2, len(allPods))
1330
func TestAddPodCtrIDConflictFails(t *testing.T) {
1331
runForAllStates(t, func(t *testing.T, state State, manager lock.Manager) {
1332
testCtr, err := getTestCtr1(manager)
1333
assert.NoError(t, err)
1335
testPod, err := getTestPod(testCtr.ID(), "testpod1", manager)
1336
assert.NoError(t, err)
1338
err = state.AddContainer(testCtr)
1339
assert.NoError(t, err)
1341
err = state.AddPod(testPod)
1342
assert.Error(t, err)
1344
allPods, err := state.AllPods()
1345
assert.NoError(t, err)
1346
assert.Equal(t, 0, len(allPods))
1350
func TestAddPodCtrNameConflictFails(t *testing.T) {
1351
runForAllStates(t, func(t *testing.T, state State, manager lock.Manager) {
1352
testCtr, err := getTestCtr1(manager)
1353
assert.NoError(t, err)
1355
testPod, err := getTestPod(strings.Repeat("3", 32), testCtr.Name(), manager)
1356
assert.NoError(t, err)
1358
err = state.AddContainer(testCtr)
1359
assert.NoError(t, err)
1361
err = state.AddPod(testPod)
1362
assert.Error(t, err)
1364
allPods, err := state.AllPods()
1365
assert.NoError(t, err)
1366
assert.Equal(t, 0, len(allPods))
1370
func TestRemovePodInvalidPodErrors(t *testing.T) {
1371
runForAllStates(t, func(t *testing.T, state State, manager lock.Manager) {
1372
err := state.RemovePod(&Pod{config: &PodConfig{}})
1373
assert.Error(t, err)
1377
func TestRemovePodNotInStateFails(t *testing.T) {
1378
runForAllStates(t, func(t *testing.T, state State, manager lock.Manager) {
1379
testPod, err := getTestPod1(manager)
1380
assert.NoError(t, err)
1382
err = state.RemovePod(testPod)
1383
assert.Error(t, err)
1384
assert.False(t, testPod.valid)
1388
func TestRemovePodSucceeds(t *testing.T) {
1389
runForAllStates(t, func(t *testing.T, state State, manager lock.Manager) {
1390
testPod, err := getTestPod1(manager)
1391
assert.NoError(t, err)
1393
err = state.AddPod(testPod)
1394
assert.NoError(t, err)
1396
err = state.RemovePod(testPod)
1397
assert.NoError(t, err)
1399
allPods, err := state.AllPods()
1400
assert.NoError(t, err)
1401
assert.Equal(t, 0, len(allPods))
1405
func TestRemovePodFromPods(t *testing.T) {
1406
runForAllStates(t, func(t *testing.T, state State, manager lock.Manager) {
1407
testPod1, err := getTestPod1(manager)
1408
assert.NoError(t, err)
1410
testPod2, err := getTestPod2(manager)
1411
assert.NoError(t, err)
1413
err = state.AddPod(testPod1)
1414
assert.NoError(t, err)
1416
err = state.AddPod(testPod2)
1417
assert.NoError(t, err)
1419
err = state.RemovePod(testPod1)
1420
assert.NoError(t, err)
1422
allPods, err := state.AllPods()
1423
assert.NoError(t, err)
1424
assert.Equal(t, 1, len(allPods))
1426
testPodsEqual(t, allPods[0], testPod2, true)
1430
func TestRemovePodNotEmptyFails(t *testing.T) {
1431
runForAllStates(t, func(t *testing.T, state State, manager lock.Manager) {
1432
testPod, err := getTestPod1(manager)
1433
assert.NoError(t, err)
1435
testCtr, err := getTestCtr2(manager)
1436
assert.NoError(t, err)
1437
testCtr.config.Pod = testPod.ID()
1439
err = state.AddPod(testPod)
1440
assert.NoError(t, err)
1442
err = state.AddContainerToPod(testPod, testCtr)
1443
assert.NoError(t, err)
1445
err = state.RemovePod(testPod)
1446
assert.Error(t, err)
1448
allPods, err := state.AllPods()
1449
assert.NoError(t, err)
1450
assert.Equal(t, 1, len(allPods))
1454
func TestRemovePodAfterEmptySucceeds(t *testing.T) {
1455
runForAllStates(t, func(t *testing.T, state State, manager lock.Manager) {
1456
testPod, err := getTestPod1(manager)
1457
assert.NoError(t, err)
1459
testCtr, err := getTestCtr2(manager)
1460
assert.NoError(t, err)
1461
testCtr.config.Pod = testPod.ID()
1463
err = state.AddPod(testPod)
1464
assert.NoError(t, err)
1466
err = state.AddContainerToPod(testPod, testCtr)
1467
assert.NoError(t, err)
1469
err = state.RemoveContainerFromPod(testPod, testCtr)
1470
assert.NoError(t, err)
1472
err = state.RemovePod(testPod)
1473
assert.NoError(t, err)
1475
allPods, err := state.AllPods()
1476
assert.NoError(t, err)
1477
assert.Equal(t, 0, len(allPods))
1481
func TestAllPodsEmptyOnEmptyState(t *testing.T) {
1482
runForAllStates(t, func(t *testing.T, state State, manager lock.Manager) {
1483
allPods, err := state.AllPods()
1484
assert.NoError(t, err)
1485
assert.Equal(t, 0, len(allPods))
1489
func TestAllPodsFindsPod(t *testing.T) {
1490
runForAllStates(t, func(t *testing.T, state State, manager lock.Manager) {
1491
testPod, err := getTestPod1(manager)
1492
assert.NoError(t, err)
1494
err = state.AddPod(testPod)
1495
assert.NoError(t, err)
1497
allPods, err := state.AllPods()
1498
assert.NoError(t, err)
1499
assert.Equal(t, 1, len(allPods))
1501
testPodsEqual(t, allPods[0], testPod, true)
1505
func TestAllPodsMultiplePods(t *testing.T) {
1506
runForAllStates(t, func(t *testing.T, state State, manager lock.Manager) {
1507
testPod1, err := getTestPod1(manager)
1508
assert.NoError(t, err)
1510
testPod2, err := getTestPod2(manager)
1511
assert.NoError(t, err)
1513
testPod3, err := getTestPodN("3", manager)
1514
assert.NoError(t, err)
1516
allPods1, err := state.AllPods()
1517
assert.NoError(t, err)
1518
assert.Equal(t, 0, len(allPods1))
1520
err = state.AddPod(testPod1)
1521
assert.NoError(t, err)
1523
allPods2, err := state.AllPods()
1524
assert.NoError(t, err)
1525
assert.Equal(t, 1, len(allPods2))
1527
err = state.AddPod(testPod2)
1528
assert.NoError(t, err)
1530
allPods3, err := state.AllPods()
1531
assert.NoError(t, err)
1532
assert.Equal(t, 2, len(allPods3))
1534
err = state.AddPod(testPod3)
1535
assert.NoError(t, err)
1537
allPods4, err := state.AllPods()
1538
assert.NoError(t, err)
1539
assert.Equal(t, 3, len(allPods4))
1543
func TestPodHasContainerNoSuchPod(t *testing.T) {
1544
runForAllStates(t, func(t *testing.T, state State, manager lock.Manager) {
1545
_, err := state.PodHasContainer(&Pod{config: &PodConfig{}}, strings.Repeat("0", 32))
1546
assert.Error(t, err)
1550
func TestPodHasContainerEmptyCtrID(t *testing.T) {
1551
runForAllStates(t, func(t *testing.T, state State, manager lock.Manager) {
1552
testPod, err := getTestPod1(manager)
1553
assert.NoError(t, err)
1555
err = state.AddPod(testPod)
1556
assert.NoError(t, err)
1558
_, err = state.PodHasContainer(testPod, "")
1559
assert.Error(t, err)
1563
func TestPodHasContainerNoSuchCtr(t *testing.T) {
1564
runForAllStates(t, func(t *testing.T, state State, manager lock.Manager) {
1565
testPod, err := getTestPod1(manager)
1566
assert.NoError(t, err)
1568
err = state.AddPod(testPod)
1569
assert.NoError(t, err)
1571
exist, err := state.PodHasContainer(testPod, strings.Repeat("2", 32))
1572
assert.NoError(t, err)
1573
assert.False(t, exist)
1577
func TestPodHasContainerCtrNotInPod(t *testing.T) {
1578
runForAllStates(t, func(t *testing.T, state State, manager lock.Manager) {
1579
testPod, err := getTestPod1(manager)
1580
assert.NoError(t, err)
1582
testCtr, err := getTestCtr2(manager)
1583
assert.NoError(t, err)
1585
err = state.AddPod(testPod)
1586
assert.NoError(t, err)
1588
err = state.AddContainer(testCtr)
1589
assert.NoError(t, err)
1591
exist, err := state.PodHasContainer(testPod, testCtr.ID())
1592
assert.NoError(t, err)
1593
assert.False(t, exist)
1597
func TestPodHasContainerSucceeds(t *testing.T) {
1598
runForAllStates(t, func(t *testing.T, state State, manager lock.Manager) {
1599
testPod, err := getTestPod1(manager)
1600
assert.NoError(t, err)
1602
testCtr, err := getTestCtr2(manager)
1603
assert.NoError(t, err)
1605
testCtr.config.Pod = testPod.ID()
1607
err = state.AddPod(testPod)
1608
assert.NoError(t, err)
1610
err = state.AddContainerToPod(testPod, testCtr)
1611
assert.NoError(t, err)
1613
exist, err := state.PodHasContainer(testPod, testCtr.ID())
1614
assert.NoError(t, err)
1615
assert.True(t, exist)
1619
func TestPodContainersByIDInvalidPod(t *testing.T) {
1620
runForAllStates(t, func(t *testing.T, state State, manager lock.Manager) {
1621
_, err := state.PodContainersByID(&Pod{config: &PodConfig{}})
1622
assert.Error(t, err)
1626
func TestPodContainerdByIDPodNotInState(t *testing.T) {
1627
runForAllStates(t, func(t *testing.T, state State, manager lock.Manager) {
1628
testPod, err := getTestPod1(manager)
1629
assert.NoError(t, err)
1631
_, err = state.PodContainersByID(testPod)
1632
assert.Error(t, err)
1633
assert.False(t, testPod.valid)
1637
func TestPodContainersByIDEmptyPod(t *testing.T) {
1638
runForAllStates(t, func(t *testing.T, state State, manager lock.Manager) {
1639
testPod, err := getTestPod1(manager)
1640
assert.NoError(t, err)
1642
err = state.AddPod(testPod)
1643
assert.NoError(t, err)
1645
ctrs, err := state.PodContainersByID(testPod)
1646
assert.NoError(t, err)
1647
assert.Equal(t, 0, len(ctrs))
1651
func TestPodContainersByIDOneContainer(t *testing.T) {
1652
runForAllStates(t, func(t *testing.T, state State, manager lock.Manager) {
1653
testPod, err := getTestPod1(manager)
1654
assert.NoError(t, err)
1656
testCtr, err := getTestCtr2(manager)
1657
assert.NoError(t, err)
1659
testCtr.config.Pod = testPod.ID()
1661
err = state.AddPod(testPod)
1662
assert.NoError(t, err)
1664
err = state.AddContainerToPod(testPod, testCtr)
1665
assert.NoError(t, err)
1667
ctrs, err := state.PodContainersByID(testPod)
1668
assert.NoError(t, err)
1669
assert.Equal(t, 1, len(ctrs))
1670
assert.Equal(t, testCtr.ID(), ctrs[0])
1674
func TestPodContainersByIDMultipleContainers(t *testing.T) {
1675
runForAllStates(t, func(t *testing.T, state State, manager lock.Manager) {
1676
testPod, err := getTestPod1(manager)
1677
assert.NoError(t, err)
1679
testCtr1, err := getTestCtr2(manager)
1680
assert.NoError(t, err)
1681
testCtr1.config.Pod = testPod.ID()
1683
testCtr2, err := getTestCtrN("3", manager)
1684
assert.NoError(t, err)
1685
testCtr2.config.Pod = testPod.ID()
1687
testCtr3, err := getTestCtrN("4", manager)
1688
assert.NoError(t, err)
1689
testCtr3.config.Pod = testPod.ID()
1691
err = state.AddPod(testPod)
1692
assert.NoError(t, err)
1694
ctrs0, err := state.PodContainersByID(testPod)
1695
assert.NoError(t, err)
1696
assert.Equal(t, 0, len(ctrs0))
1698
err = state.AddContainerToPod(testPod, testCtr1)
1699
assert.NoError(t, err)
1701
ctrs1, err := state.PodContainersByID(testPod)
1702
assert.NoError(t, err)
1703
assert.Equal(t, 1, len(ctrs1))
1705
err = state.AddContainerToPod(testPod, testCtr2)
1706
assert.NoError(t, err)
1708
ctrs2, err := state.PodContainersByID(testPod)
1709
assert.NoError(t, err)
1710
assert.Equal(t, 2, len(ctrs2))
1712
err = state.AddContainerToPod(testPod, testCtr3)
1713
assert.NoError(t, err)
1715
ctrs3, err := state.PodContainersByID(testPod)
1716
assert.NoError(t, err)
1717
assert.Equal(t, 3, len(ctrs3))
1721
func TestPodContainersInvalidPod(t *testing.T) {
1722
runForAllStates(t, func(t *testing.T, state State, manager lock.Manager) {
1723
_, err := state.PodContainers(&Pod{config: &PodConfig{}})
1724
assert.Error(t, err)
1728
func TestPodContainersPodNotInState(t *testing.T) {
1729
runForAllStates(t, func(t *testing.T, state State, manager lock.Manager) {
1730
testPod, err := getTestPod1(manager)
1731
assert.NoError(t, err)
1733
_, err = state.PodContainers(testPod)
1734
assert.Error(t, err)
1735
assert.False(t, testPod.valid)
1739
func TestPodContainersEmptyPod(t *testing.T) {
1740
runForAllStates(t, func(t *testing.T, state State, manager lock.Manager) {
1741
testPod, err := getTestPod1(manager)
1742
assert.NoError(t, err)
1744
err = state.AddPod(testPod)
1745
assert.NoError(t, err)
1747
ctrs, err := state.PodContainers(testPod)
1748
assert.NoError(t, err)
1749
assert.Equal(t, 0, len(ctrs))
1753
func TestPodContainersOneContainer(t *testing.T) {
1754
runForAllStates(t, func(t *testing.T, state State, manager lock.Manager) {
1755
testPod, err := getTestPod1(manager)
1756
assert.NoError(t, err)
1758
testCtr, err := getTestCtr2(manager)
1759
assert.NoError(t, err)
1761
testCtr.config.Pod = testPod.ID()
1763
err = state.AddPod(testPod)
1764
assert.NoError(t, err)
1766
err = state.AddContainerToPod(testPod, testCtr)
1767
assert.NoError(t, err)
1769
ctrs, err := state.PodContainers(testPod)
1770
assert.NoError(t, err)
1771
require.Len(t, ctrs, 1)
1773
testContainersEqual(t, ctrs[0], testCtr, true)
1777
func TestPodContainersMultipleContainers(t *testing.T) {
1778
runForAllStates(t, func(t *testing.T, state State, manager lock.Manager) {
1779
testPod, err := getTestPod1(manager)
1780
assert.NoError(t, err)
1782
testCtr1, err := getTestCtr2(manager)
1783
assert.NoError(t, err)
1784
testCtr1.config.Pod = testPod.ID()
1786
testCtr2, err := getTestCtrN("3", manager)
1787
assert.NoError(t, err)
1788
testCtr2.config.Pod = testPod.ID()
1790
testCtr3, err := getTestCtrN("4", manager)
1791
assert.NoError(t, err)
1792
testCtr3.config.Pod = testPod.ID()
1794
err = state.AddPod(testPod)
1795
assert.NoError(t, err)
1797
ctrs0, err := state.PodContainers(testPod)
1798
assert.NoError(t, err)
1799
assert.Equal(t, 0, len(ctrs0))
1801
err = state.AddContainerToPod(testPod, testCtr1)
1802
assert.NoError(t, err)
1804
ctrs1, err := state.PodContainers(testPod)
1805
assert.NoError(t, err)
1806
assert.Equal(t, 1, len(ctrs1))
1808
err = state.AddContainerToPod(testPod, testCtr2)
1809
assert.NoError(t, err)
1811
ctrs2, err := state.PodContainers(testPod)
1812
assert.NoError(t, err)
1813
assert.Equal(t, 2, len(ctrs2))
1815
err = state.AddContainerToPod(testPod, testCtr3)
1816
assert.NoError(t, err)
1818
ctrs3, err := state.PodContainers(testPod)
1819
assert.NoError(t, err)
1820
assert.Equal(t, 3, len(ctrs3))
1824
func TestRemovePodContainersInvalidPod(t *testing.T) {
1825
runForAllStates(t, func(t *testing.T, state State, manager lock.Manager) {
1826
err := state.RemovePodContainers(&Pod{config: &PodConfig{}})
1827
assert.Error(t, err)
1831
func TestRemovePodContainersPodNotInState(t *testing.T) {
1832
runForAllStates(t, func(t *testing.T, state State, manager lock.Manager) {
1833
testPod, err := getTestPod1(manager)
1834
assert.NoError(t, err)
1836
err = state.RemovePodContainers(testPod)
1837
assert.Error(t, err)
1838
assert.False(t, testPod.valid)
1842
func TestRemovePodContainersNoContainers(t *testing.T) {
1843
runForAllStates(t, func(t *testing.T, state State, manager lock.Manager) {
1844
testPod, err := getTestPod1(manager)
1845
assert.NoError(t, err)
1847
err = state.AddPod(testPod)
1848
assert.NoError(t, err)
1850
err = state.RemovePodContainers(testPod)
1851
assert.NoError(t, err)
1853
ctrs, err := state.PodContainersByID(testPod)
1854
assert.NoError(t, err)
1855
assert.Equal(t, 0, len(ctrs))
1859
func TestRemovePodContainersOneContainer(t *testing.T) {
1860
runForAllStates(t, func(t *testing.T, state State, manager lock.Manager) {
1861
testPod, err := getTestPod1(manager)
1862
assert.NoError(t, err)
1864
testCtr, err := getTestCtr2(manager)
1865
assert.NoError(t, err)
1866
testCtr.config.Pod = testPod.ID()
1868
err = state.AddPod(testPod)
1869
assert.NoError(t, err)
1871
err = state.AddContainerToPod(testPod, testCtr)
1872
assert.NoError(t, err)
1874
err = state.RemovePodContainers(testPod)
1875
assert.NoError(t, err)
1877
ctrs, err := state.PodContainersByID(testPod)
1878
assert.NoError(t, err)
1879
assert.Equal(t, 0, len(ctrs))
1883
func TestRemovePodContainersPreservesCtrOutsidePod(t *testing.T) {
1884
runForAllStates(t, func(t *testing.T, state State, manager lock.Manager) {
1885
testPod, err := getTestPod1(manager)
1886
assert.NoError(t, err)
1888
testCtr1, err := getTestCtr2(manager)
1889
assert.NoError(t, err)
1890
testCtr1.config.Pod = testPod.ID()
1892
testCtr2, err := getTestCtrN("3", manager)
1893
assert.NoError(t, err)
1895
err = state.AddPod(testPod)
1896
assert.NoError(t, err)
1898
err = state.AddContainerToPod(testPod, testCtr1)
1899
assert.NoError(t, err)
1901
err = state.AddContainer(testCtr2)
1902
assert.NoError(t, err)
1904
err = state.RemovePodContainers(testPod)
1905
assert.NoError(t, err)
1907
ctrs, err := state.PodContainersByID(testPod)
1908
assert.NoError(t, err)
1909
assert.Equal(t, 0, len(ctrs))
1911
allCtrs, err := state.AllContainers(false)
1912
assert.NoError(t, err)
1913
assert.Equal(t, 1, len(allCtrs))
1917
func TestRemovePodContainersTwoContainers(t *testing.T) {
1918
runForAllStates(t, func(t *testing.T, state State, manager lock.Manager) {
1919
testPod, err := getTestPod1(manager)
1920
assert.NoError(t, err)
1922
testCtr1, err := getTestCtr2(manager)
1923
assert.NoError(t, err)
1924
testCtr1.config.Pod = testPod.ID()
1926
testCtr2, err := getTestCtrN("3", manager)
1927
assert.NoError(t, err)
1928
testCtr2.config.Pod = testPod.ID()
1930
err = state.AddPod(testPod)
1931
assert.NoError(t, err)
1933
err = state.AddContainerToPod(testPod, testCtr1)
1934
assert.NoError(t, err)
1936
err = state.AddContainerToPod(testPod, testCtr2)
1937
assert.NoError(t, err)
1939
err = state.RemovePodContainers(testPod)
1940
assert.NoError(t, err)
1942
ctrs, err := state.PodContainersByID(testPod)
1943
assert.NoError(t, err)
1944
assert.Equal(t, 0, len(ctrs))
1948
func TestRemovePodContainerDependencyInPod(t *testing.T) {
1949
runForAllStates(t, func(t *testing.T, state State, manager lock.Manager) {
1950
testPod, err := getTestPod1(manager)
1951
assert.NoError(t, err)
1953
testCtr1, err := getTestCtr2(manager)
1954
assert.NoError(t, err)
1955
testCtr1.config.Pod = testPod.ID()
1957
testCtr2, err := getTestCtrN("3", manager)
1958
assert.NoError(t, err)
1959
testCtr2.config.Pod = testPod.ID()
1960
testCtr2.config.IPCNsCtr = testCtr1.ID()
1962
err = state.AddPod(testPod)
1963
assert.NoError(t, err)
1965
err = state.AddContainerToPod(testPod, testCtr1)
1966
assert.NoError(t, err)
1968
err = state.AddContainerToPod(testPod, testCtr2)
1969
assert.NoError(t, err)
1971
err = state.RemovePodContainers(testPod)
1972
assert.NoError(t, err)
1974
ctrs, err := state.PodContainersByID(testPod)
1975
assert.NoError(t, err)
1976
assert.Equal(t, 0, len(ctrs))
1980
func TestAddContainerToPodInvalidPod(t *testing.T) {
1981
runForAllStates(t, func(t *testing.T, state State, manager lock.Manager) {
1982
testCtr, err := getTestCtr1(manager)
1983
assert.NoError(t, err)
1985
err = state.AddContainerToPod(&Pod{config: &PodConfig{}}, testCtr)
1986
assert.Error(t, err)
1990
func TestAddContainerToPodInvalidCtr(t *testing.T) {
1991
runForAllStates(t, func(t *testing.T, state State, manager lock.Manager) {
1992
testPod, err := getTestPod1(manager)
1993
assert.NoError(t, err)
1995
err = state.AddPod(testPod)
1996
assert.NoError(t, err)
1998
err = state.AddContainerToPod(testPod, &Container{config: &ContainerConfig{ID: "1234"}})
1999
assert.Error(t, err)
2001
ctrs, err := state.PodContainersByID(testPod)
2002
assert.NoError(t, err)
2003
assert.Equal(t, 0, len(ctrs))
2007
func TestAddContainerToPodPodNotInState(t *testing.T) {
2008
runForAllStates(t, func(t *testing.T, state State, manager lock.Manager) {
2009
testPod, err := getTestPod1(manager)
2010
assert.NoError(t, err)
2012
testCtr, err := getTestCtr2(manager)
2013
assert.NoError(t, err)
2014
testCtr.config.Pod = testPod.ID()
2016
err = state.AddContainerToPod(testPod, testCtr)
2017
assert.Error(t, err)
2018
assert.False(t, testPod.valid)
2022
func TestAddContainerToPodSucceeds(t *testing.T) {
2023
runForAllStates(t, func(t *testing.T, state State, manager lock.Manager) {
2024
testPod, err := getTestPod1(manager)
2025
assert.NoError(t, err)
2027
testCtr, err := getTestCtr2(manager)
2028
assert.NoError(t, err)
2029
testCtr.config.Pod = testPod.ID()
2031
err = state.AddPod(testPod)
2032
assert.NoError(t, err)
2034
err = state.AddContainerToPod(testPod, testCtr)
2035
assert.NoError(t, err)
2037
ctrs, err := state.PodContainers(testPod)
2038
assert.NoError(t, err)
2039
require.Len(t, ctrs, 1)
2041
allCtrs, err := state.AllContainers(false)
2042
assert.NoError(t, err)
2043
require.Len(t, allCtrs, 1)
2045
testContainersEqual(t, ctrs[0], testCtr, true)
2046
testContainersEqual(t, ctrs[0], allCtrs[0], false)
2050
func TestAddContainerToPodTwoContainers(t *testing.T) {
2051
runForAllStates(t, func(t *testing.T, state State, manager lock.Manager) {
2052
testPod, err := getTestPod1(manager)
2053
assert.NoError(t, err)
2055
testCtr1, err := getTestCtr2(manager)
2056
assert.NoError(t, err)
2057
testCtr1.config.Pod = testPod.ID()
2059
testCtr2, err := getTestCtrN("3", manager)
2060
assert.NoError(t, err)
2061
testCtr2.config.Pod = testPod.ID()
2063
err = state.AddPod(testPod)
2064
assert.NoError(t, err)
2066
err = state.AddContainerToPod(testPod, testCtr1)
2067
assert.NoError(t, err)
2069
err = state.AddContainerToPod(testPod, testCtr2)
2070
assert.NoError(t, err)
2072
ctrs, err := state.PodContainers(testPod)
2073
assert.NoError(t, err)
2074
assert.Equal(t, 2, len(ctrs))
2076
allCtrs, err := state.AllContainers(false)
2077
assert.NoError(t, err)
2078
assert.Equal(t, 2, len(allCtrs))
2082
func TestAddContainerToPodWithAddContainer(t *testing.T) {
2083
runForAllStates(t, func(t *testing.T, state State, manager lock.Manager) {
2084
testPod, err := getTestPod1(manager)
2085
assert.NoError(t, err)
2087
testCtr1, err := getTestCtr2(manager)
2088
assert.NoError(t, err)
2089
testCtr1.config.Pod = testPod.ID()
2091
testCtr2, err := getTestCtrN("3", manager)
2092
assert.NoError(t, err)
2094
err = state.AddPod(testPod)
2095
assert.NoError(t, err)
2097
err = state.AddContainerToPod(testPod, testCtr1)
2098
assert.NoError(t, err)
2100
err = state.AddContainer(testCtr2)
2101
assert.NoError(t, err)
2103
ctrs, err := state.PodContainers(testPod)
2104
assert.NoError(t, err)
2105
require.Len(t, ctrs, 1)
2107
allCtrs, err := state.AllContainers(false)
2108
assert.NoError(t, err)
2109
assert.Equal(t, 2, len(allCtrs))
2111
testContainersEqual(t, ctrs[0], testCtr1, true)
2115
func TestAddContainerToPodCtrIDConflict(t *testing.T) {
2116
runForAllStates(t, func(t *testing.T, state State, manager lock.Manager) {
2117
testPod, err := getTestPod1(manager)
2118
assert.NoError(t, err)
2120
testCtr1, err := getTestCtr2(manager)
2121
assert.NoError(t, err)
2123
testCtr2, err := getTestContainer(testCtr1.ID(), "testCtr3", manager)
2124
assert.NoError(t, err)
2125
testCtr2.config.Pod = testPod.ID()
2127
err = state.AddPod(testPod)
2128
assert.NoError(t, err)
2130
err = state.AddContainer(testCtr1)
2131
assert.NoError(t, err)
2133
err = state.AddContainerToPod(testPod, testCtr2)
2134
assert.Error(t, err)
2136
ctrs, err := state.PodContainers(testPod)
2137
assert.NoError(t, err)
2138
assert.Equal(t, 0, len(ctrs))
2140
allCtrs, err := state.AllContainers(false)
2141
assert.NoError(t, err)
2142
assert.Equal(t, 1, len(allCtrs))
2146
func TestAddContainerToPodCtrNameConflict(t *testing.T) {
2147
runForAllStates(t, func(t *testing.T, state State, manager lock.Manager) {
2148
testPod, err := getTestPod1(manager)
2149
assert.NoError(t, err)
2151
testCtr1, err := getTestCtr2(manager)
2152
assert.NoError(t, err)
2154
testCtr2, err := getTestContainer(strings.Repeat("4", 32), testCtr1.Name(), manager)
2155
assert.NoError(t, err)
2156
testCtr2.config.Pod = testPod.ID()
2158
err = state.AddPod(testPod)
2159
assert.NoError(t, err)
2161
err = state.AddContainer(testCtr1)
2162
assert.NoError(t, err)
2164
err = state.AddContainerToPod(testPod, testCtr2)
2165
assert.Error(t, err)
2167
ctrs, err := state.PodContainers(testPod)
2168
assert.NoError(t, err)
2169
assert.Equal(t, 0, len(ctrs))
2171
allCtrs, err := state.AllContainers(false)
2172
assert.NoError(t, err)
2173
assert.Equal(t, 1, len(allCtrs))
2177
func TestAddContainerToPodPodIDConflict(t *testing.T) {
2178
runForAllStates(t, func(t *testing.T, state State, manager lock.Manager) {
2179
testPod, err := getTestPod1(manager)
2180
assert.NoError(t, err)
2182
testCtr, err := getTestContainer(testPod.ID(), "testCtr", manager)
2183
assert.NoError(t, err)
2184
testCtr.config.Pod = testPod.ID()
2186
err = state.AddPod(testPod)
2187
assert.NoError(t, err)
2189
err = state.AddContainerToPod(testPod, testCtr)
2190
assert.Error(t, err)
2192
ctrs, err := state.PodContainers(testPod)
2193
assert.NoError(t, err)
2194
assert.Equal(t, 0, len(ctrs))
2196
allCtrs, err := state.AllContainers(false)
2197
assert.NoError(t, err)
2198
assert.Equal(t, 0, len(allCtrs))
2202
func TestAddContainerToPodPodNameConflict(t *testing.T) {
2203
runForAllStates(t, func(t *testing.T, state State, manager lock.Manager) {
2204
testPod, err := getTestPod1(manager)
2205
assert.NoError(t, err)
2207
testCtr, err := getTestContainer(strings.Repeat("2", 32), testPod.Name(), manager)
2208
assert.NoError(t, err)
2209
testCtr.config.Pod = testPod.ID()
2211
err = state.AddPod(testPod)
2212
assert.NoError(t, err)
2214
err = state.AddContainerToPod(testPod, testCtr)
2215
assert.Error(t, err)
2217
ctrs, err := state.PodContainers(testPod)
2218
assert.NoError(t, err)
2219
assert.Equal(t, 0, len(ctrs))
2221
allCtrs, err := state.AllContainers(false)
2222
assert.NoError(t, err)
2223
assert.Equal(t, 0, len(allCtrs))
2227
func TestAddContainerToPodAddsDependencies(t *testing.T) {
2228
runForAllStates(t, func(t *testing.T, state State, manager lock.Manager) {
2229
testPod, err := getTestPod1(manager)
2230
assert.NoError(t, err)
2232
testCtr1, err := getTestCtr2(manager)
2233
assert.NoError(t, err)
2234
testCtr1.config.Pod = testPod.ID()
2236
testCtr2, err := getTestCtrN("3", manager)
2237
assert.NoError(t, err)
2238
testCtr2.config.Pod = testPod.ID()
2239
testCtr2.config.IPCNsCtr = testCtr1.ID()
2241
err = state.AddPod(testPod)
2242
assert.NoError(t, err)
2244
err = state.AddContainerToPod(testPod, testCtr1)
2245
assert.NoError(t, err)
2247
err = state.AddContainerToPod(testPod, testCtr2)
2248
assert.NoError(t, err)
2250
deps, err := state.ContainerInUse(testCtr1)
2251
assert.NoError(t, err)
2252
assert.Equal(t, 1, len(deps))
2253
assert.Equal(t, testCtr2.ID(), deps[0])
2257
func TestAddContainerToPodPodDependencyFails(t *testing.T) {
2258
runForAllStates(t, func(t *testing.T, state State, manager lock.Manager) {
2259
testPod, err := getTestPod1(manager)
2260
assert.NoError(t, err)
2262
testCtr, err := getTestCtr2(manager)
2263
assert.NoError(t, err)
2264
testCtr.config.Pod = testPod.ID()
2265
testCtr.config.IPCNsCtr = testPod.ID()
2267
err = state.AddPod(testPod)
2268
assert.NoError(t, err)
2270
err = state.AddContainerToPod(testPod, testCtr)
2271
assert.Error(t, err)
2273
ctrs, err := state.PodContainers(testPod)
2274
assert.NoError(t, err)
2275
assert.Equal(t, 0, len(ctrs))
2279
func TestAddContainerToPodBadDependencyFails(t *testing.T) {
2280
runForAllStates(t, func(t *testing.T, state State, manager lock.Manager) {
2281
testPod, err := getTestPod1(manager)
2282
assert.NoError(t, err)
2284
testCtr, err := getTestCtr2(manager)
2285
assert.NoError(t, err)
2286
testCtr.config.Pod = testPod.ID()
2287
testCtr.config.IPCNsCtr = strings.Repeat("8", 32)
2289
err = state.AddPod(testPod)
2290
assert.NoError(t, err)
2292
err = state.AddContainerToPod(testPod, testCtr)
2293
assert.Error(t, err)
2295
ctrs, err := state.PodContainers(testPod)
2296
assert.NoError(t, err)
2297
assert.Equal(t, 0, len(ctrs))
2301
func TestAddContainerToPodDependencyOutsidePodFails(t *testing.T) {
2302
runForAllStates(t, func(t *testing.T, state State, manager lock.Manager) {
2303
testPod, err := getTestPod1(manager)
2304
assert.NoError(t, err)
2306
testCtr1, err := getTestCtr2(manager)
2307
assert.NoError(t, err)
2309
testCtr2, err := getTestCtrN("3", manager)
2310
assert.NoError(t, err)
2311
testCtr2.config.Pod = testPod.ID()
2312
testCtr2.config.IPCNsCtr = testCtr1.ID()
2314
err = state.AddPod(testPod)
2315
assert.NoError(t, err)
2317
err = state.AddContainer(testCtr1)
2318
assert.NoError(t, err)
2320
err = state.AddContainerToPod(testPod, testCtr2)
2321
assert.Error(t, err)
2323
ctrs, err := state.PodContainers(testPod)
2324
assert.NoError(t, err)
2325
assert.Equal(t, 0, len(ctrs))
2327
allCtrs, err := state.AllContainers(false)
2328
assert.NoError(t, err)
2329
assert.Equal(t, 1, len(allCtrs))
2331
deps, err := state.ContainerInUse(testCtr1)
2332
assert.NoError(t, err)
2333
assert.Equal(t, 0, len(deps))
2337
func TestRemoveContainerFromPodBadPodFails(t *testing.T) {
2338
runForAllStates(t, func(t *testing.T, state State, manager lock.Manager) {
2339
testCtr, err := getTestCtr1(manager)
2340
assert.NoError(t, err)
2342
err = state.RemoveContainerFromPod(&Pod{config: &PodConfig{}}, testCtr)
2343
assert.Error(t, err)
2347
func TestRemoveContainerFromPodPodNotInStateFails(t *testing.T) {
2348
runForAllStates(t, func(t *testing.T, state State, manager lock.Manager) {
2349
testPod, err := getTestPod1(manager)
2350
assert.NoError(t, err)
2352
testCtr, err := getTestCtr2(manager)
2353
assert.NoError(t, err)
2354
testCtr.config.Pod = testPod.ID()
2356
err = state.RemoveContainerFromPod(testPod, testCtr)
2357
assert.Error(t, err)
2359
assert.False(t, testPod.valid)
2363
func TestRemoveContainerFromPodCtrNotInStateFails(t *testing.T) {
2364
runForAllStates(t, func(t *testing.T, state State, manager lock.Manager) {
2365
testPod, err := getTestPod1(manager)
2366
assert.NoError(t, err)
2368
testCtr, err := getTestCtr2(manager)
2369
assert.NoError(t, err)
2370
testCtr.config.Pod = testPod.ID()
2372
err = state.AddPod(testPod)
2373
assert.NoError(t, err)
2375
err = state.RemoveContainerFromPod(testPod, testCtr)
2376
assert.Error(t, err)
2378
assert.False(t, testCtr.valid)
2382
func TestRemoveContainerFromPodCtrNotInPodFails(t *testing.T) {
2383
runForAllStates(t, func(t *testing.T, state State, manager lock.Manager) {
2384
testPod, err := getTestPod1(manager)
2385
assert.NoError(t, err)
2387
testCtr, err := getTestCtr2(manager)
2388
assert.NoError(t, err)
2390
err = state.AddPod(testPod)
2391
assert.NoError(t, err)
2393
err = state.AddContainer(testCtr)
2394
assert.NoError(t, err)
2396
err = state.RemoveContainerFromPod(testPod, testCtr)
2397
assert.Error(t, err)
2399
assert.True(t, testCtr.valid)
2401
ctrs, err := state.AllContainers(false)
2402
assert.NoError(t, err)
2403
assert.Equal(t, 1, len(ctrs))
2407
func TestRemoveContainerFromPodSucceeds(t *testing.T) {
2408
runForAllStates(t, func(t *testing.T, state State, manager lock.Manager) {
2409
testPod, err := getTestPod1(manager)
2410
assert.NoError(t, err)
2412
testCtr, err := getTestCtr2(manager)
2413
assert.NoError(t, err)
2414
testCtr.config.Pod = testPod.ID()
2416
err = state.AddPod(testPod)
2417
assert.NoError(t, err)
2419
err = state.AddContainerToPod(testPod, testCtr)
2420
assert.NoError(t, err)
2422
err = state.RemoveContainerFromPod(testPod, testCtr)
2423
assert.NoError(t, err)
2425
ctrs, err := state.PodContainers(testPod)
2426
assert.NoError(t, err)
2427
assert.Equal(t, 0, len(ctrs))
2429
allCtrs, err := state.AllContainers(false)
2430
assert.NoError(t, err)
2431
assert.Equal(t, 0, len(allCtrs))
2435
func TestRemoveContainerFromPodWithDependencyFails(t *testing.T) {
2436
runForAllStates(t, func(t *testing.T, state State, manager lock.Manager) {
2437
testPod, err := getTestPod1(manager)
2438
assert.NoError(t, err)
2440
testCtr1, err := getTestCtr2(manager)
2441
assert.NoError(t, err)
2442
testCtr1.config.Pod = testPod.ID()
2444
testCtr2, err := getTestCtrN("3", manager)
2445
assert.NoError(t, err)
2446
testCtr2.config.Pod = testPod.ID()
2447
testCtr2.config.IPCNsCtr = testCtr1.ID()
2449
err = state.AddPod(testPod)
2450
assert.NoError(t, err)
2452
err = state.AddContainerToPod(testPod, testCtr1)
2453
assert.NoError(t, err)
2455
err = state.AddContainerToPod(testPod, testCtr2)
2456
assert.NoError(t, err)
2458
err = state.RemoveContainerFromPod(testPod, testCtr1)
2459
assert.Error(t, err)
2461
ctrs, err := state.PodContainers(testPod)
2462
assert.NoError(t, err)
2463
assert.Equal(t, 2, len(ctrs))
2465
allCtrs, err := state.AllContainers(false)
2466
assert.NoError(t, err)
2467
assert.Equal(t, 2, len(allCtrs))
2471
func TestRemoveContainerFromPodWithDependencySucceedsAfterDepRemoved(t *testing.T) {
2472
runForAllStates(t, func(t *testing.T, state State, manager lock.Manager) {
2473
testPod, err := getTestPod1(manager)
2474
assert.NoError(t, err)
2476
testCtr1, err := getTestCtr2(manager)
2477
assert.NoError(t, err)
2478
testCtr1.config.Pod = testPod.ID()
2480
testCtr2, err := getTestCtrN("3", manager)
2481
assert.NoError(t, err)
2482
testCtr2.config.Pod = testPod.ID()
2483
testCtr2.config.IPCNsCtr = testCtr1.ID()
2485
err = state.AddPod(testPod)
2486
assert.NoError(t, err)
2488
err = state.AddContainerToPod(testPod, testCtr1)
2489
assert.NoError(t, err)
2491
err = state.AddContainerToPod(testPod, testCtr2)
2492
assert.NoError(t, err)
2494
err = state.RemoveContainerFromPod(testPod, testCtr2)
2495
assert.NoError(t, err)
2497
err = state.RemoveContainerFromPod(testPod, testCtr1)
2498
assert.NoError(t, err)
2500
ctrs, err := state.PodContainers(testPod)
2501
assert.NoError(t, err)
2502
assert.Equal(t, 0, len(ctrs))
2504
allCtrs, err := state.AllContainers(false)
2505
assert.NoError(t, err)
2506
assert.Equal(t, 0, len(allCtrs))
2510
func TestUpdatePodInvalidPod(t *testing.T) {
2511
runForAllStates(t, func(t *testing.T, state State, manager lock.Manager) {
2512
err := state.UpdatePod(&Pod{config: &PodConfig{}})
2513
assert.Error(t, err)
2517
func TestUpdatePodPodNotInStateFails(t *testing.T) {
2518
runForAllStates(t, func(t *testing.T, state State, manager lock.Manager) {
2519
testPod, err := getTestPod1(manager)
2520
assert.NoError(t, err)
2522
err = state.UpdatePod(testPod)
2523
assert.Error(t, err)
2527
func TestSavePodInvalidPod(t *testing.T) {
2528
runForAllStates(t, func(t *testing.T, state State, manager lock.Manager) {
2529
err := state.SavePod(&Pod{config: &PodConfig{}})
2530
assert.Error(t, err)
2534
func TestSavePodPodNotInStateFails(t *testing.T) {
2535
runForAllStates(t, func(t *testing.T, state State, manager lock.Manager) {
2536
testPod, err := getTestPod1(manager)
2537
assert.NoError(t, err)
2539
err = state.SavePod(testPod)
2540
assert.Error(t, err)
2544
func TestSaveAndUpdatePod(t *testing.T) {
2545
runForAllStates(t, func(t *testing.T, state State, manager lock.Manager) {
2546
testPod, err := getTestPod1(manager)
2547
assert.NoError(t, err)
2549
err = state.AddPod(testPod)
2550
assert.NoError(t, err)
2552
statePod, err := state.Pod(testPod.ID())
2553
assert.NoError(t, err)
2555
testPodsEqual(t, statePod, testPod, true)
2557
testPod.state.CgroupPath = "/new/path/for/test"
2559
err = state.SavePod(testPod)
2560
assert.NoError(t, err)
2562
err = state.UpdatePod(statePod)
2563
assert.NoError(t, err)
2565
testPodsEqual(t, statePod, testPod, false)
2569
func TestGetContainerConfigSucceeds(t *testing.T) {
2570
runForAllStates(t, func(t *testing.T, state State, manager lock.Manager) {
2571
testCtr, err := getTestCtr1(manager)
2572
assert.NoError(t, err)
2574
err = state.AddContainer(testCtr)
2575
assert.NoError(t, err)
2577
ctrCfg, err := state.GetContainerConfig(testCtr.ID())
2578
assert.NoError(t, err)
2579
assert.Equal(t, ctrCfg, testCtr.Config())
2583
func TestGetContainerConfigEmptyIDFails(t *testing.T) {
2584
runForAllStates(t, func(t *testing.T, state State, manager lock.Manager) {
2585
_, err := state.GetContainerConfig("")
2586
assert.Error(t, err)
2589
func TestGetContainerConfigNonExistentIDFails(t *testing.T) {
2590
runForAllStates(t, func(t *testing.T, state State, manager lock.Manager) {
2591
_, err := state.GetContainerConfig("does not exist")
2592
assert.Error(t, err)
2596
// Test that the state will convert the ports to the new format
2597
func TestConvertPortMapping(t *testing.T) {
2598
runForAllStates(t, func(t *testing.T, state State, manager lock.Manager) {
2599
testCtr, err := getTestCtr1(manager)
2600
assert.NoError(t, err)
2602
ports := testCtr.config.PortMappings
2604
oldPorts := []types.OCICNIPortMapping{
2609
HostIP: "192.168.3.3",
2615
HostIP: "192.168.4.4",
2619
testCtr.config.OldPortMappings = oldPorts
2620
testCtr.config.PortMappings = nil
2622
err = state.AddContainer(testCtr)
2623
assert.NoError(t, err)
2625
retrievedCtr, err := state.Container(testCtr.ID())
2626
assert.NoError(t, err)
2628
// set values to expected ones
2629
testCtr.config.PortMappings = ports
2631
testContainersEqual(t, retrievedCtr, testCtr, true)