Add ability to overrider depending containers with special label (#489)

* Add ability to overrider depending containers with special label

* Add documentation of how to override container dependencies with special label
This commit is contained in:
Valentine Zavadsky 2020-04-24 14:41:04 +03:00 committed by GitHub
parent 7b0d311799
commit b32cb5d35d
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 64 additions and 1 deletions

View file

@ -95,6 +95,13 @@ func (c Container) Enabled() (bool, bool) {
func (c Container) Links() []string {
var links []string
dependsOnLabelValue := c.getLabelValueOrEmpty(dependsOnLabel)
if dependsOnLabelValue != "" {
links := strings.Split(dependsOnLabelValue, ",")
return links
}
if (c.containerInfo != nil) && (c.containerInfo.HostConfig != nil) {
for _, link := range c.containerInfo.HostConfig.Links {
name := strings.Split(link, ":")[0]

View file

@ -181,6 +181,42 @@ var _ = Describe("the container", func() {
Expect(imageName).To(Equal(name + ":latest"))
})
})
When("fetching container links", func() {
When("the depends on label is present", func() {
It("should fetch depending containers from it", func() {
c = mockContainerWithLabels(map[string]string{
"com.centurylinklabs.watchtower.depends-on": "postgres",
})
links := c.Links()
Expect(links).To(SatisfyAll(ContainElement("postgres"), HaveLen(1)))
})
It("should fetch depending containers if there are many", func() {
c = mockContainerWithLabels(map[string]string{
"com.centurylinklabs.watchtower.depends-on": "postgres,redis",
})
links := c.Links()
Expect(links).To(SatisfyAll(ContainElement("postgres"), ContainElement("redis"), HaveLen(2)))
})
It("should fetch depending containers if label is blank", func() {
c = mockContainerWithLabels(map[string]string{
"com.centurylinklabs.watchtower.depends-on": "",
})
links := c.Links()
Expect(links).To(HaveLen(0))
})
})
When("the depends on label is not present", func() {
It("should fetch depending containers from host config links", func() {
c = mockContainerWithLinks([]string{
"redis:test-containrrr",
"postgres:test-containrrr",
})
links := c.Links()
Expect(links).To(SatisfyAll(ContainElement("redis"), ContainElement("postgres"), HaveLen(2)))
})
})
})
})
})
@ -190,6 +226,23 @@ func mockContainerWithImageName(name string) *Container {
return container
}
func mockContainerWithLinks(links []string) *Container {
content := types.ContainerJSON{
ContainerJSONBase: &types.ContainerJSONBase{
ID: "container_id",
Image: "image",
Name: "test-containrrr",
HostConfig: &container.HostConfig{
Links: links,
},
},
Config: &container.Config{
Labels: map[string]string{},
},
}
return NewContainer(&content, nil)
}
func mockContainerWithLabels(labels map[string]string) *Container {
content := types.ContainerJSON{
ContainerJSONBase: &types.ContainerJSONBase{

View file

@ -4,6 +4,7 @@ const (
watchtowerLabel = "com.centurylinklabs.watchtower"
signalLabel = "com.centurylinklabs.watchtower.stop-signal"
enableLabel = "com.centurylinklabs.watchtower.enable"
dependsOnLabel = "com.centurylinklabs.watchtower.depends-on"
zodiacLabel = "com.centurylinklabs.zodiac.original-image"
preCheckLabel = "com.centurylinklabs.watchtower.lifecycle.pre-check"
postCheckLabel = "com.centurylinklabs.watchtower.lifecycle.post-check"