Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
43 changes: 9 additions & 34 deletions integration/service/create_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,8 @@ func TestCreateWithLBSandbox(t *testing.T) {
Driver: "overlay",
}

netResp, err := client.NetworkCreate(context.Background(), overlayName, networkCreate)
ctx := context.Background()
netResp, err := client.NetworkCreate(ctx, overlayName, networkCreate)
require.NoError(t, err)
overlayID := netResp.ID

Expand All @@ -37,29 +38,26 @@ func TestCreateWithLBSandbox(t *testing.T) {

serviceSpec.TaskTemplate.Networks = append(serviceSpec.TaskTemplate.Networks, swarm.NetworkAttachmentConfig{Target: overlayName})

serviceResp, err := client.ServiceCreate(context.Background(), serviceSpec, types.ServiceCreateOptions{
serviceResp, err := client.ServiceCreate(ctx, serviceSpec, types.ServiceCreateOptions{
QueryRegistry: false,
})
require.NoError(t, err)

serviceID := serviceResp.ID
poll.WaitOn(t, serviceRunningTasksCount(client, serviceID, instances))
poll.WaitOn(t, serviceTaskCount(client, serviceID, instances), pollSettings)

_, _, err = client.ServiceInspectWithRaw(context.Background(), serviceID, types.ServiceInspectOptions{})
require.NoError(t, err)

network, err := client.NetworkInspect(context.Background(), overlayID, types.NetworkInspectOptions{})
network, err := client.NetworkInspect(ctx, overlayID, types.NetworkInspectOptions{})
require.NoError(t, err)
assert.Contains(t, network.Containers, overlayName+"-sbox")

err = client.ServiceRemove(context.Background(), serviceID)
err = client.ServiceRemove(ctx, serviceID)
require.NoError(t, err)

poll.WaitOn(t, serviceIsRemoved(client, serviceID))
err = client.NetworkRemove(context.Background(), overlayID)
poll.WaitOn(t, serviceIsRemoved(client, serviceID), pollSettings)
err = client.NetworkRemove(ctx, overlayID)
require.NoError(t, err)

poll.WaitOn(t, networkIsRemoved(client, overlayID), poll.WithTimeout(1*time.Minute), poll.WithDelay(10*time.Second))
poll.WaitOn(t, networkIsRemoved(client, overlayID), pollSettings, poll.WithTimeout(time.Minute))
}

func swarmServiceSpec(name string, replicas uint64) swarm.ServiceSpec {
Expand All @@ -81,29 +79,6 @@ func swarmServiceSpec(name string, replicas uint64) swarm.ServiceSpec {
}
}

func serviceRunningTasksCount(client client.ServiceAPIClient, serviceID string, instances uint64) func(log poll.LogT) poll.Result {
return func(log poll.LogT) poll.Result {
filter := filters.NewArgs()
filter.Add("service", serviceID)
tasks, err := client.TaskList(context.Background(), types.TaskListOptions{
Filters: filter,
})
switch {
case err != nil:
return poll.Error(err)
case len(tasks) == int(instances):
for _, task := range tasks {
if task.Status.State != swarm.TaskStateRunning {
return poll.Continue("waiting for tasks to enter run state")
}
}
return poll.Success()
default:
return poll.Continue("task count at %d waiting for %d", len(tasks), instances)
}
}
}

func serviceIsRemoved(client client.ServiceAPIClient, serviceID string) func(log poll.LogT) poll.Result {
return func(log poll.LogT) poll.Result {
filter := filters.NewArgs()
Expand Down
27 changes: 18 additions & 9 deletions integration/service/inspect_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -37,12 +37,11 @@ func TestInspect(t *testing.T) {
require.NoError(t, err)

id := resp.ID
poll.WaitOn(t, serviceContainerCount(client, id, instances))
poll.WaitOn(t, serviceTaskCount(client, id, instances), pollSettings)

service, _, err := client.ServiceInspectWithRaw(ctx, id, types.ServiceInspectOptions{})
require.NoError(t, err)
assert.Equal(t, serviceSpec, service.Spec)
assert.Equal(t, uint64(11), service.Meta.Version.Index)
assert.Equal(t, id, service.ID)
assert.WithinDuration(t, before, service.CreatedAt, 30*time.Second)
assert.WithinDuration(t, before, service.UpdatedAt, 30*time.Second)
Expand All @@ -64,7 +63,7 @@ func fullSwarmServiceSpec(name string, replicas uint64) swarm.ServiceSpec {
Image: "busybox:latest",
Labels: map[string]string{"container-label": "container-value"},
Command: []string{"/bin/top"},
Args: []string{"-u", "root"},
Args: []string{"-n", "1000"},
Hostname: "hostname",
Env: []string{"envvar=envvalue"},
Dir: "/work",
Expand Down Expand Up @@ -129,20 +128,30 @@ func newSwarm(t *testing.T) *daemon.Swarm {
return d
}

func serviceContainerCount(client client.ServiceAPIClient, id string, count uint64) func(log poll.LogT) poll.Result {
func serviceTaskCount(client client.ServiceAPIClient, id string, count uint64) func(log poll.LogT) poll.Result {
return func(log poll.LogT) poll.Result {
filter := filters.NewArgs()
filter.Add("service", id)
tasks, err := client.TaskList(context.Background(), types.TaskListOptions{
Filters: filter,
Filters: filters.NewArgs(filters.Arg("service", id)),
})
running := filterRunningTasks(tasks)
switch {
case err != nil:
return poll.Error(err)
case len(tasks) == int(count):
case len(running) == int(count):
return poll.Success()
default:
return poll.Continue("task count at %d waiting for %d", len(tasks), count)
return poll.Continue(
"task count at %d (%d running) waiting for %d", len(tasks), len(running), count)
}
}
}

func filterRunningTasks(tasks []swarm.Task) []swarm.Task {
result := []swarm.Task{}
for _, task := range tasks {
if task.Status.State == swarm.TaskStateRunning {
result = append(result, task)
}
}
return result
}
8 changes: 8 additions & 0 deletions integration/service/main_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,10 @@ import (
"fmt"
"os"
"testing"
"time"

"github.com/docker/docker/internal/test/environment"
"github.com/gotestyourself/gotestyourself/poll"
)

var testEnv *environment.Execution
Expand All @@ -28,3 +30,9 @@ func setupTest(t *testing.T) func() {
environment.ProtectAll(t, testEnv)
return func() { testEnv.Clean(t) }
}

// Default poll settings
func pollSettings(config *poll.Settings) {
config.Delay = 100 * time.Millisecond
config.Timeout = 20 * time.Second
}