mirror of
https://github.com/containrrr/watchtower.git
synced 2025-12-17 07:30:13 +01:00
Introduce test cases for proposed dependency sorting
This commit is contained in:
parent
348f121a61
commit
d65e6cd96c
4 changed files with 175 additions and 9 deletions
|
|
@ -57,7 +57,8 @@ var _ = Describe("the actions package", func() {
|
||||||
"test-container",
|
"test-container",
|
||||||
"test-container",
|
"test-container",
|
||||||
"watchtower",
|
"watchtower",
|
||||||
time.Now()),
|
time.Now(),
|
||||||
|
make([]string,0)),
|
||||||
}
|
}
|
||||||
err := actions.CheckForMultipleWatchtowerInstances(client, false)
|
err := actions.CheckForMultipleWatchtowerInstances(client, false)
|
||||||
Expect(err).NotTo(HaveOccurred())
|
Expect(err).NotTo(HaveOccurred())
|
||||||
|
|
@ -75,12 +76,14 @@ var _ = Describe("the actions package", func() {
|
||||||
"test-container-01",
|
"test-container-01",
|
||||||
"test-container-01",
|
"test-container-01",
|
||||||
"watchtower",
|
"watchtower",
|
||||||
time.Now().AddDate(0, 0, -1)),
|
time.Now().AddDate(0, 0, -1),
|
||||||
|
make([]string,0),),
|
||||||
CreateMockContainer(
|
CreateMockContainer(
|
||||||
"test-container-02",
|
"test-container-02",
|
||||||
"test-container-02",
|
"test-container-02",
|
||||||
"watchtower",
|
"watchtower",
|
||||||
time.Now()),
|
time.Now(),
|
||||||
|
make([]string,0)),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
dockerClient,
|
dockerClient,
|
||||||
|
|
@ -106,12 +109,14 @@ var _ = Describe("the actions package", func() {
|
||||||
"test-container-01",
|
"test-container-01",
|
||||||
"test-container-01",
|
"test-container-01",
|
||||||
"watchtower",
|
"watchtower",
|
||||||
time.Now().AddDate(0, 0, -1)),
|
time.Now().AddDate(0, 0, -1),
|
||||||
|
make([]string,0),),
|
||||||
CreateMockContainer(
|
CreateMockContainer(
|
||||||
"test-container-02",
|
"test-container-02",
|
||||||
"test-container-02",
|
"test-container-02",
|
||||||
"watchtower",
|
"watchtower",
|
||||||
time.Now()),
|
time.Now(),
|
||||||
|
make([]string,0),),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
dockerClient,
|
dockerClient,
|
||||||
|
|
|
||||||
|
|
@ -22,6 +22,8 @@ type TestData struct {
|
||||||
TriedToRemoveImageCount int
|
TriedToRemoveImageCount int
|
||||||
NameOfContainerToKeep string
|
NameOfContainerToKeep string
|
||||||
Containers []container.Container
|
Containers []container.Container
|
||||||
|
StopOrder []string
|
||||||
|
RestartOrder []string
|
||||||
}
|
}
|
||||||
|
|
||||||
// TriedToRemoveImage is a test helper function to check whether RemoveImageByID has been called
|
// TriedToRemoveImage is a test helper function to check whether RemoveImageByID has been called
|
||||||
|
|
@ -49,11 +51,13 @@ func (client MockClient) StopContainer(c container.Container, d time.Duration) e
|
||||||
if c.Name() == client.TestData.NameOfContainerToKeep {
|
if c.Name() == client.TestData.NameOfContainerToKeep {
|
||||||
return errors.New("tried to stop the instance we want to keep")
|
return errors.New("tried to stop the instance we want to keep")
|
||||||
}
|
}
|
||||||
|
client.TestData.StopOrder = append(client.TestData.StopOrder, c.Name())
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// StartContainer is a mock method
|
// StartContainer is a mock method
|
||||||
func (client MockClient) StartContainer(c container.Container) (string, error) {
|
func (client MockClient) StartContainer(c container.Container) (string, error) {
|
||||||
|
client.TestData.RestartOrder = append(client.TestData.RestartOrder, c.Name())
|
||||||
return "", nil
|
return "", nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -8,7 +8,7 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
// CreateMockContainer creates a container substitute valid for testing
|
// CreateMockContainer creates a container substitute valid for testing
|
||||||
func CreateMockContainer(id string, name string, image string, created time.Time) container.Container {
|
func CreateMockContainer(id string, name string, image string, created time.Time, depends []string) container.Container {
|
||||||
content := types.ContainerJSON{
|
content := types.ContainerJSON{
|
||||||
ContainerJSONBase: &types.ContainerJSONBase{
|
ContainerJSONBase: &types.ContainerJSONBase{
|
||||||
ID: id,
|
ID: id,
|
||||||
|
|
@ -20,6 +20,15 @@ func CreateMockContainer(id string, name string, image string, created time.Time
|
||||||
Labels: make(map[string]string),
|
Labels: make(map[string]string),
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
dependency_string := ""
|
||||||
|
for ind, i := range depends {
|
||||||
|
if ind == 0 {
|
||||||
|
dependency_string += i;
|
||||||
|
}else{
|
||||||
|
dependency_string += "," + i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
content.Config.Labels["com.centurylinklabs.watchtower.depends-on"] = dependency_string
|
||||||
return *container.NewContainer(
|
return *container.NewContainer(
|
||||||
&content,
|
&content,
|
||||||
&types.ImageInspect{
|
&types.ImageInspect{
|
||||||
|
|
|
||||||
|
|
@ -36,17 +36,20 @@ var _ = Describe("the update action", func() {
|
||||||
"test-container-01",
|
"test-container-01",
|
||||||
"test-container-01",
|
"test-container-01",
|
||||||
"fake-image:latest",
|
"fake-image:latest",
|
||||||
time.Now().AddDate(0, 0, -1)),
|
time.Now().AddDate(0, 0, -1),
|
||||||
|
make([]string, 0)),
|
||||||
CreateMockContainer(
|
CreateMockContainer(
|
||||||
"test-container-02",
|
"test-container-02",
|
||||||
"test-container-02",
|
"test-container-02",
|
||||||
"fake-image:latest",
|
"fake-image:latest",
|
||||||
time.Now()),
|
time.Now(),
|
||||||
|
make([]string, 0)),
|
||||||
CreateMockContainer(
|
CreateMockContainer(
|
||||||
"test-container-02",
|
"test-container-02",
|
||||||
"test-container-02",
|
"test-container-02",
|
||||||
"fake-image:latest",
|
"fake-image:latest",
|
||||||
time.Now()),
|
time.Now(),
|
||||||
|
make([]string, 0)),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
dockerClient,
|
dockerClient,
|
||||||
|
|
@ -63,6 +66,7 @@ var _ = Describe("the update action", func() {
|
||||||
Expect(client.TestData.TriedToRemoveImageCount).To(Equal(1))
|
Expect(client.TestData.TriedToRemoveImageCount).To(Equal(1))
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
When("there are multiple containers using different images", func() {
|
When("there are multiple containers using different images", func() {
|
||||||
It("should try to remove each of them", func() {
|
It("should try to remove each of them", func() {
|
||||||
client.TestData.Containers = append(
|
client.TestData.Containers = append(
|
||||||
|
|
@ -72,12 +76,156 @@ var _ = Describe("the update action", func() {
|
||||||
"unique-test-container",
|
"unique-test-container",
|
||||||
"unique-fake-image:latest",
|
"unique-fake-image:latest",
|
||||||
time.Now(),
|
time.Now(),
|
||||||
|
make([]string, 0),
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
err := actions.Update(client, types.UpdateParams{Cleanup: true})
|
err := actions.Update(client, types.UpdateParams{Cleanup: true})
|
||||||
Expect(err).NotTo(HaveOccurred())
|
Expect(err).NotTo(HaveOccurred())
|
||||||
Expect(client.TestData.TriedToRemoveImageCount).To(Equal(2))
|
Expect(client.TestData.TriedToRemoveImageCount).To(Equal(2))
|
||||||
})
|
})
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
When("there are containers with and without links", func() {
|
||||||
|
links := [7][]string{
|
||||||
|
{},
|
||||||
|
{"k-container-01"},
|
||||||
|
{"k-container-02"},
|
||||||
|
{},
|
||||||
|
{"t-container-01"},
|
||||||
|
{"t-container-02"},
|
||||||
|
{},
|
||||||
|
}
|
||||||
|
BeforeEach(func() {
|
||||||
|
pullImages := false
|
||||||
|
removeVolumes := false
|
||||||
|
client = CreateMockClient(
|
||||||
|
&TestData{
|
||||||
|
NameOfContainerToKeep: "",
|
||||||
|
Containers: []container.Container{
|
||||||
|
CreateMockContainer(
|
||||||
|
"k-container-03",
|
||||||
|
"k-container-03",
|
||||||
|
"fake-image:latest",
|
||||||
|
time.Now().Add(time.Second * 4),
|
||||||
|
links[2],),
|
||||||
|
CreateMockContainer(
|
||||||
|
"k-container-02",
|
||||||
|
"k-container-02",
|
||||||
|
"fake-image:latest",
|
||||||
|
time.Now().Add(time.Second * 2),
|
||||||
|
links[1],),
|
||||||
|
CreateMockContainer(
|
||||||
|
"k-container-01",
|
||||||
|
"k-container-01",
|
||||||
|
"fake-image:latest",
|
||||||
|
time.Now(),
|
||||||
|
links[0],),
|
||||||
|
|
||||||
|
CreateMockContainer(
|
||||||
|
"t-container-03",
|
||||||
|
"t-container-03",
|
||||||
|
"fake-image-2:latest",
|
||||||
|
time.Now().Add(time.Second * 4),
|
||||||
|
links[5],),
|
||||||
|
CreateMockContainer(
|
||||||
|
"t-container-02",
|
||||||
|
"t-container-02",
|
||||||
|
"fake-image-2:latest",
|
||||||
|
time.Now().Add(time.Second * 2),
|
||||||
|
links[4],),
|
||||||
|
CreateMockContainer(
|
||||||
|
"t-container-01",
|
||||||
|
"t-container-01",
|
||||||
|
"fake-image-2:latest",
|
||||||
|
time.Now(),
|
||||||
|
links[3],),
|
||||||
|
|
||||||
|
CreateMockContainer(
|
||||||
|
"x-container-01",
|
||||||
|
"x-container-01",
|
||||||
|
"fake-image-1:latest",
|
||||||
|
time.Now(),
|
||||||
|
links[6],),
|
||||||
|
CreateMockContainer(
|
||||||
|
"x-container-02",
|
||||||
|
"x-container-02",
|
||||||
|
"fake-image-1:latest",
|
||||||
|
time.Now().Add(time.Second * 2),
|
||||||
|
links[6],),
|
||||||
|
CreateMockContainer(
|
||||||
|
"x-container-03",
|
||||||
|
"x-container-03",
|
||||||
|
"fake-image-1:latest",
|
||||||
|
time.Now().Add(time.Second * 4),
|
||||||
|
links[6],),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
dockerClient,
|
||||||
|
pullImages,
|
||||||
|
removeVolumes,
|
||||||
|
)
|
||||||
|
})
|
||||||
|
|
||||||
|
When("there are multiple containers with links", func() {
|
||||||
|
It("should create appropriate dependency sorted lists", func() {
|
||||||
|
dependencySortedGraphs, err := actions.PrepareContainerList(client, types.UpdateParams{Cleanup: true})
|
||||||
|
Expect(err).NotTo(HaveOccurred())
|
||||||
|
|
||||||
|
var output [][]string
|
||||||
|
|
||||||
|
for _, i := range dependencySortedGraphs {
|
||||||
|
var inner []string
|
||||||
|
for _, j := range i {
|
||||||
|
inner = append(inner, j.Name())
|
||||||
|
}
|
||||||
|
output = append(output,inner)
|
||||||
|
}
|
||||||
|
|
||||||
|
ExpectedOutput := [][]string{
|
||||||
|
{"k-container-01", "k-container-02", "k-container-03",},
|
||||||
|
{"t-container-01", "t-container-02", "t-container-03",},
|
||||||
|
{"x-container-01",},
|
||||||
|
{"x-container-02",},
|
||||||
|
{"x-container-03",},
|
||||||
|
}
|
||||||
|
|
||||||
|
Expect(output).To(Equal(ExpectedOutput))
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
When("there are multiple containers using the same image", func() {
|
||||||
|
It("should stop and restart containers in a correct order", func() {
|
||||||
|
err := actions.Update(client, types.UpdateParams{Cleanup: true})
|
||||||
|
Expect(err).NotTo(HaveOccurred())
|
||||||
|
|
||||||
|
ExpectedStopOutput := []string{
|
||||||
|
"k-container-03",
|
||||||
|
"k-container-02",
|
||||||
|
"k-container-01",
|
||||||
|
"t-container-03",
|
||||||
|
"t-container-02",
|
||||||
|
"t-container-01",
|
||||||
|
"x-container-01",
|
||||||
|
"x-container-02",
|
||||||
|
"x-container-03",
|
||||||
|
}
|
||||||
|
|
||||||
|
ExpectedRestartOutput := []string{
|
||||||
|
"k-container-01",
|
||||||
|
"k-container-02",
|
||||||
|
"k-container-03",
|
||||||
|
"t-container-01",
|
||||||
|
"t-container-02",
|
||||||
|
"t-container-03",
|
||||||
|
"x-container-01",
|
||||||
|
"x-container-02",
|
||||||
|
"x-container-03",
|
||||||
|
}
|
||||||
|
|
||||||
|
Expect(client.TestData.StopOrder).To(Equal(ExpectedStopOutput))
|
||||||
|
Expect(client.TestData.RestartOrder).To(Equal(ExpectedRestartOutput))
|
||||||
|
})
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue