func (c *Cluster) listContainerForNode(nodeID string) ([]string, error) { var ids []string filters := filters.NewArgs() filters.Add("label", fmt.Sprintf("com.docker.swarm.node.id=%s", nodeID)) containers, err := c.config.Backend.Containers(&apitypes.ContainerListOptions{ Filter: filters, }) if err != nil { return []string{}, err } for _, c := range containers { ids = append(ids, c.ID) } return ids, nil }
func TestImageListApiBefore125(t *testing.T) { expectedFilter := "image:tag" client := &Client{ client: newMockClient(func(req *http.Request) (*http.Response, error) { query := req.URL.Query() actualFilter := query.Get("filter") if actualFilter != expectedFilter { return nil, fmt.Errorf("filter not set in URL query properly. Expected '%s', got %s", expectedFilter, actualFilter) } actualFilters := query.Get("filters") if actualFilters != "" { return nil, fmt.Errorf("filters should have not been present, were with value: %s", actualFilters) } content, err := json.Marshal([]types.ImageSummary{ { ID: "image_id2", }, { ID: "image_id2", }, }) if err != nil { return nil, err } return &http.Response{ StatusCode: http.StatusOK, Body: ioutil.NopCloser(bytes.NewReader(content)), }, nil }), version: "1.24", } filters := filters.NewArgs() filters.Add("reference", "image:tag") options := types.ImageListOptions{ Filters: filters, } images, err := client.ImageList(context.Background(), options) if err != nil { t.Fatal(err) } if len(images) != 2 { t.Fatalf("expected 2 images, got %v", images) } }
func TestTaskList(t *testing.T) { expectedURL := "/tasks" filters := filters.NewArgs() filters.Add("label", "label1") filters.Add("label", "label2") listCases := []struct { options types.TaskListOptions expectedQueryParams map[string]string }{ { options: types.TaskListOptions{}, expectedQueryParams: map[string]string{ "filters": "", }, }, { options: types.TaskListOptions{ Filter: filters, }, expectedQueryParams: map[string]string{ "filters": `{"label":{"label1":true,"label2":true}}`, }, }, } for _, listCase := range listCases { client := &Client{ transport: newMockClient(nil, func(req *http.Request) (*http.Response, error) { if !strings.HasPrefix(req.URL.Path, expectedURL) { return nil, fmt.Errorf("Expected URL '%s', got '%s'", expectedURL, req.URL) } query := req.URL.Query() for key, expected := range listCase.expectedQueryParams { actual := query.Get(key) if actual != expected { return nil, fmt.Errorf("%s not set in URL query properly. Expected '%s', got %s", key, expected, actual) } } content, err := json.Marshal([]swarm.Task{ { ID: "task_id1", }, { ID: "task_id2", }, }) if err != nil { return nil, err } return &http.Response{ StatusCode: http.StatusOK, Body: ioutil.NopCloser(bytes.NewReader(content)), }, nil }), } tasks, err := client.TaskList(context.Background(), listCase.options) if err != nil { t.Fatal(err) } if len(tasks) != 2 { t.Fatalf("expected 2 tasks, got %v", tasks) } } }
func TestImageList(t *testing.T) { expectedURL := "/images/json" noDanglingfilters := filters.NewArgs() noDanglingfilters.Add("dangling", "false") filters := filters.NewArgs() filters.Add("label", "label1") filters.Add("label", "label2") filters.Add("dangling", "true") listCases := []struct { options types.ImageListOptions expectedQueryParams map[string]string }{ { options: types.ImageListOptions{}, expectedQueryParams: map[string]string{ "all": "", "filter": "", "filters": "", }, }, { options: types.ImageListOptions{ All: true, MatchName: "image_name", }, expectedQueryParams: map[string]string{ "all": "1", "filter": "image_name", "filters": "", }, }, { options: types.ImageListOptions{ Filters: filters, }, expectedQueryParams: map[string]string{ "all": "", "filter": "", "filters": `{"dangling":{"true":true},"label":{"label1":true,"label2":true}}`, }, }, { options: types.ImageListOptions{ Filters: noDanglingfilters, }, expectedQueryParams: map[string]string{ "all": "", "filter": "", "filters": `{"dangling":{"false":true}}`, }, }, } for _, listCase := range listCases { client := &Client{ client: newMockClient(func(req *http.Request) (*http.Response, error) { if !strings.HasPrefix(req.URL.Path, expectedURL) { return nil, fmt.Errorf("Expected URL '%s', got '%s'", expectedURL, req.URL) } query := req.URL.Query() for key, expected := range listCase.expectedQueryParams { actual := query.Get(key) if actual != expected { return nil, fmt.Errorf("%s not set in URL query properly. Expected '%s', got %s", key, expected, actual) } } content, err := json.Marshal([]types.Image{ { ID: "image_id2", }, { ID: "image_id2", }, }) if err != nil { return nil, err } return &http.Response{ StatusCode: http.StatusOK, Body: ioutil.NopCloser(bytes.NewReader(content)), }, nil }), } images, err := client.ImageList(context.Background(), listCase.options) if err != nil { t.Fatal(err) } if len(images) != 2 { t.Fatalf("expected 2 images, got %v", images) } } }
func TestEvents(t *testing.T) { expectedURL := "/events" filters := filters.NewArgs() filters.Add("label", "label1") filters.Add("label", "label2") expectedFiltersJSON := `{"label":{"label1":true,"label2":true}}` eventsCases := []struct { options types.EventsOptions expectedQueryParams map[string]string }{ { options: types.EventsOptions{ Since: "invalid but valid", }, expectedQueryParams: map[string]string{ "since": "invalid but valid", }, }, { options: types.EventsOptions{ Until: "invalid but valid", }, expectedQueryParams: map[string]string{ "until": "invalid but valid", }, }, { options: types.EventsOptions{ Filters: filters, }, expectedQueryParams: map[string]string{ "filters": expectedFiltersJSON, }, }, } for _, eventsCase := range eventsCases { client := &Client{ transport: newMockClient(nil, func(req *http.Request) (*http.Response, error) { if !strings.HasPrefix(req.URL.Path, expectedURL) { return nil, fmt.Errorf("Expected URL '%s', got '%s'", expectedURL, req.URL) } query := req.URL.Query() for key, expected := range eventsCase.expectedQueryParams { actual := query.Get(key) if actual != expected { return nil, fmt.Errorf("%s not set in URL query properly. Expected '%s', got %s", key, expected, actual) } } return &http.Response{ StatusCode: http.StatusOK, Body: ioutil.NopCloser(bytes.NewReader([]byte("response"))), }, nil }), } body, err := client.Events(context.Background(), eventsCase.options) if err != nil { t.Fatal(err) } defer body.Close() content, err := ioutil.ReadAll(body) if err != nil { t.Fatal(err) } if string(content) != "response" { t.Fatalf("expected response to contain 'response', got %s", string(content)) } } }
func TestContainerList(t *testing.T) { expectedURL := "/containers/json" expectedFilters := `{"before":{"container":true},"label":{"label1":true,"label2":true}}` client := &Client{ client: newMockClient(func(req *http.Request) (*http.Response, error) { if !strings.HasPrefix(req.URL.Path, expectedURL) { return nil, fmt.Errorf("Expected URL '%s', got '%s'", expectedURL, req.URL) } query := req.URL.Query() all := query.Get("all") if all != "1" { return nil, fmt.Errorf("all not set in URL query properly. Expected '1', got %s", all) } limit := query.Get("limit") if limit != "0" { return nil, fmt.Errorf("limit should have not be present in query. Expected '0', got %s", limit) } since := query.Get("since") if since != "container" { return nil, fmt.Errorf("since not set in URL query properly. Expected 'container', got %s", since) } before := query.Get("before") if before != "" { return nil, fmt.Errorf("before should have not be present in query, go %s", before) } size := query.Get("size") if size != "1" { return nil, fmt.Errorf("size not set in URL query properly. Expected '1', got %s", size) } filters := query.Get("filters") if filters != expectedFilters { return nil, fmt.Errorf("expected filters incoherent '%v' with actual filters %v", expectedFilters, filters) } b, err := json.Marshal([]types.Container{ { ID: "container_id1", }, { ID: "container_id2", }, }) if err != nil { return nil, err } return &http.Response{ StatusCode: http.StatusOK, Body: ioutil.NopCloser(bytes.NewReader(b)), }, nil }), } filters := filters.NewArgs() filters.Add("label", "label1") filters.Add("label", "label2") filters.Add("before", "container") containers, err := client.ContainerList(context.Background(), types.ContainerListOptions{ Size: true, All: true, Since: "container", Filters: filters, }) if err != nil { t.Fatal(err) } if len(containers) != 2 { t.Fatalf("expected 2 containers, got %v", containers) } }
func TestEvents(t *testing.T) { expectedURL := "/events" filters := filters.NewArgs() filters.Add("type", events.ContainerEventType) expectedFiltersJSON := fmt.Sprintf(`{"type":{"%s":true}}`, events.ContainerEventType) eventsCases := []struct { options types.EventsOptions events []events.Message expectedEvents map[string]bool expectedQueryParams map[string]string }{ { options: types.EventsOptions{ Filters: filters, }, expectedQueryParams: map[string]string{ "filters": expectedFiltersJSON, }, events: []events.Message{}, expectedEvents: make(map[string]bool), }, { options: types.EventsOptions{ Filters: filters, }, expectedQueryParams: map[string]string{ "filters": expectedFiltersJSON, }, events: []events.Message{ { Type: "container", ID: "1", Action: "create", }, { Type: "container", ID: "2", Action: "die", }, { Type: "container", ID: "3", Action: "create", }, }, expectedEvents: map[string]bool{ "1": true, "2": true, "3": true, }, }, } for _, eventsCase := range eventsCases { client := &Client{ client: newMockClient(func(req *http.Request) (*http.Response, error) { if !strings.HasPrefix(req.URL.Path, expectedURL) { return nil, fmt.Errorf("Expected URL '%s', got '%s'", expectedURL, req.URL) } query := req.URL.Query() for key, expected := range eventsCase.expectedQueryParams { actual := query.Get(key) if actual != expected { return nil, fmt.Errorf("%s not set in URL query properly. Expected '%s', got %s", key, expected, actual) } } buffer := new(bytes.Buffer) for _, e := range eventsCase.events { b, _ := json.Marshal(e) buffer.Write(b) } return &http.Response{ StatusCode: http.StatusOK, Body: ioutil.NopCloser(buffer), }, nil }), } messages, errs := client.Events(context.Background(), eventsCase.options) loop: for { select { case err := <-errs: if err != nil && err != io.EOF { t.Fatal(err) } break loop case e := <-messages: _, ok := eventsCase.expectedEvents[e.ID] if !ok { t.Fatalf("event received not expected with action %s & id %s", e.Action, e.ID) } } } } }