|
| 1 | +package cli |
| 2 | + |
| 3 | +import ( |
| 4 | + "errors" |
| 5 | + "fmt" |
| 6 | + "os" |
| 7 | + "strings" |
| 8 | + |
| 9 | + docker "github.com/fsouza/go-dockerclient" |
| 10 | + "github.com/fsouza/go-dockerclient/testing" |
| 11 | + "github.com/mcuadros/ofelia/core" |
| 12 | + check "gopkg.in/check.v1" |
| 13 | +) |
| 14 | + |
| 15 | +var _ = check.Suite(&TestDockerSuit{}) |
| 16 | + |
| 17 | +const imageFixture = "ofelia/test-image" |
| 18 | + |
| 19 | +type TestDockerSuit struct { |
| 20 | + server *testing.DockerServer |
| 21 | + client *docker.Client |
| 22 | +} |
| 23 | + |
| 24 | +func (s *TestDockerSuit) SetUpTest(c *check.C) { |
| 25 | + var err error |
| 26 | + s.server, err = testing.NewServer("127.0.0.1:0", nil, nil) |
| 27 | + c.Assert(err, check.IsNil) |
| 28 | + |
| 29 | + s.client, err = docker.NewClient(s.server.URL()) |
| 30 | + c.Assert(err, check.IsNil) |
| 31 | + |
| 32 | + err = core.BuildTestImage(s.client, imageFixture) |
| 33 | + c.Assert(err, check.IsNil) |
| 34 | + |
| 35 | + os.Setenv("DOCKER_HOST", s.server.URL()) |
| 36 | +} |
| 37 | + |
| 38 | +func (s *TestDockerSuit) TearDownTest(c *check.C) { |
| 39 | + os.Unsetenv("DOCKER_HOST") |
| 40 | +} |
| 41 | + |
| 42 | +func (s *TestDockerSuit) TestLabelsFilterJobsCount(c *check.C) { |
| 43 | + filterLabel := []string{"test_filter_label", "yesssss"} |
| 44 | + containersToStartWithLabels := []map[string]string{ |
| 45 | + { |
| 46 | + requiredLabel: "true", |
| 47 | + filterLabel[0]: filterLabel[1], |
| 48 | + labelPrefix + "." + jobExec + ".job2.schedule": "schedule2", |
| 49 | + labelPrefix + "." + jobExec + ".job2.command": "command2", |
| 50 | + }, |
| 51 | + { |
| 52 | + requiredLabel: "true", |
| 53 | + labelPrefix + "." + jobExec + ".job3.schedule": "schedule3", |
| 54 | + labelPrefix + "." + jobExec + ".job3.command": "command3", |
| 55 | + }, |
| 56 | + } |
| 57 | + |
| 58 | + _, err := s.startTestContainersWithLabels(containersToStartWithLabels) |
| 59 | + c.Assert(err, check.IsNil) |
| 60 | + |
| 61 | + scheduler, err := BuildFromDockerLabels("label=" + strings.Join(filterLabel, "=")) |
| 62 | + c.Assert(err, check.IsNil) |
| 63 | + c.Assert(scheduler, check.NotNil) |
| 64 | + |
| 65 | + c.Skip("This test will not work until https://github.com/fsouza/go-dockerclient/pull/1031 is merged") |
| 66 | + c.Assert(scheduler.Jobs, check.HasLen, 1) |
| 67 | +} |
| 68 | + |
| 69 | +func (s *TestDockerSuit) TestFilterErrorsLabel(c *check.C) { |
| 70 | + containersToStartWithLabels := []map[string]string{ |
| 71 | + { |
| 72 | + labelPrefix + "." + jobExec + ".job2.schedule": "schedule2", |
| 73 | + labelPrefix + "." + jobExec + ".job2.command": "command2", |
| 74 | + }, |
| 75 | + } |
| 76 | + |
| 77 | + _, err := s.startTestContainersWithLabels(containersToStartWithLabels) |
| 78 | + c.Assert(err, check.IsNil) |
| 79 | + |
| 80 | + { |
| 81 | + scheduler, err := BuildFromDockerLabels() |
| 82 | + c.Assert(errors.Is(err, errNoContainersMatchingFilters), check.Equals, true) |
| 83 | + c.Assert(strings.Contains(err.Error(), requiredLabelFilter), check.Equals, true) |
| 84 | + c.Assert(scheduler, check.IsNil) |
| 85 | + } |
| 86 | + |
| 87 | + customLabelFilter := []string{"label", "test=123"} |
| 88 | + { |
| 89 | + scheduler, err := BuildFromDockerLabels(strings.Join(customLabelFilter, "=")) |
| 90 | + c.Assert(errors.Is(err, errNoContainersMatchingFilters), check.Equals, true) |
| 91 | + c.Assert(err, check.ErrorMatches, fmt.Sprintf(`.*%s:.*%s.*`, "label", requiredLabel)) |
| 92 | + c.Assert(err, check.ErrorMatches, fmt.Sprintf(`.*%s:.*%s.*`, customLabelFilter[0], customLabelFilter[1])) |
| 93 | + c.Assert(scheduler, check.IsNil) |
| 94 | + } |
| 95 | + |
| 96 | + { |
| 97 | + customNameFilter := []string{"name", "test-name"} |
| 98 | + scheduler, err := BuildFromDockerLabels(strings.Join(customLabelFilter, "="), strings.Join(customNameFilter, "=")) |
| 99 | + c.Assert(errors.Is(err, errNoContainersMatchingFilters), check.Equals, true) |
| 100 | + c.Assert(err, check.ErrorMatches, fmt.Sprintf(`.*%s:.*%s.*`, "label", requiredLabel)) |
| 101 | + c.Assert(err, check.ErrorMatches, fmt.Sprintf(`.*%s:.*%s.*`, customLabelFilter[0], customLabelFilter[1])) |
| 102 | + c.Assert(err, check.ErrorMatches, fmt.Sprintf(`.*%s:.*%s.*`, customNameFilter[0], customNameFilter[1])) |
| 103 | + c.Assert(scheduler, check.IsNil) |
| 104 | + } |
| 105 | + |
| 106 | + { |
| 107 | + customBadFilter := "label-test" |
| 108 | + scheduler, err := BuildFromDockerLabels(customBadFilter) |
| 109 | + c.Assert(errors.Is(err, errInvalidDockerFilter), check.Equals, true) |
| 110 | + c.Assert(scheduler, check.IsNil) |
| 111 | + } |
| 112 | +} |
| 113 | + |
| 114 | +func (s *TestDockerSuit) startTestContainersWithLabels(containerLabels []map[string]string) ([]*docker.Container, error) { |
| 115 | + containers := []*docker.Container{} |
| 116 | + |
| 117 | + for i := range containerLabels { |
| 118 | + cont, err := s.client.CreateContainer(docker.CreateContainerOptions{ |
| 119 | + Name: fmt.Sprintf("ofelia-test%d", i), |
| 120 | + Config: &docker.Config{ |
| 121 | + Cmd: []string{"sleep", "500"}, |
| 122 | + Labels: containerLabels[i], |
| 123 | + Image: imageFixture, |
| 124 | + }, |
| 125 | + }) |
| 126 | + if err != nil { |
| 127 | + return containers, err |
| 128 | + } |
| 129 | + |
| 130 | + containers = append(containers, cont) |
| 131 | + if err := s.client.StartContainer(cont.ID, nil); err != nil { |
| 132 | + return containers, err |
| 133 | + } |
| 134 | + } |
| 135 | + |
| 136 | + return containers, nil |
| 137 | +} |
0 commit comments