Selaa lähdekoodia

Merge pull request #40302 from thaJeztah/use_all_tags_option

client.ImagePush(): default to ":latest" instead of "all tags"
Sebastiaan van Stijn 5 vuotta sitten
vanhempi
commit
a0bbe3697b
2 muutettua tiedostoa jossa 57 lisäystä ja 38 poistoa
  1. 6 7
      client/image_push.go
  2. 51 31
      client/image_push_test.go

+ 6 - 7
client/image_push.go

@@ -25,15 +25,14 @@ func (cli *Client) ImagePush(ctx context.Context, image string, options types.Im
 		return nil, errors.New("cannot push a digest reference")
 		return nil, errors.New("cannot push a digest reference")
 	}
 	}
 
 
-	tag := ""
 	name := reference.FamiliarName(ref)
 	name := reference.FamiliarName(ref)
-
-	if nameTaggedRef, isNamedTagged := ref.(reference.NamedTagged); isNamedTagged {
-		tag = nameTaggedRef.Tag()
-	}
-
 	query := url.Values{}
 	query := url.Values{}
-	query.Set("tag", tag)
+	if !options.All {
+		ref = reference.TagNameOnly(ref)
+		if tagged, ok := ref.(reference.Tagged); ok {
+			query.Set("tag", tagged.Tag())
+		}
+	}
 
 
 	resp, err := cli.tryImagePush(ctx, name, query, options.RegistryAuth)
 	resp, err := cli.tryImagePush(ctx, name, query, options.RegistryAuth)
 	if errdefs.IsUnauthorized(err) && options.PrivilegeFunc != nil {
 	if errdefs.IsUnauthorized(err) && options.PrivilegeFunc != nil {

+ 51 - 31
client/image_push_test.go

@@ -131,50 +131,70 @@ func TestImagePushWithPrivilegedFuncNoError(t *testing.T) {
 func TestImagePushWithoutErrors(t *testing.T) {
 func TestImagePushWithoutErrors(t *testing.T) {
 	expectedOutput := "hello world"
 	expectedOutput := "hello world"
 	expectedURLFormat := "/images/%s/push"
 	expectedURLFormat := "/images/%s/push"
-	pullCases := []struct {
+	testCases := []struct {
+		all           bool
 		reference     string
 		reference     string
 		expectedImage string
 		expectedImage string
 		expectedTag   string
 		expectedTag   string
 	}{
 	}{
 		{
 		{
+			all:           false,
 			reference:     "myimage",
 			reference:     "myimage",
 			expectedImage: "myimage",
 			expectedImage: "myimage",
-			expectedTag:   "",
+			expectedTag:   "latest",
 		},
 		},
 		{
 		{
+			all:           false,
 			reference:     "myimage:tag",
 			reference:     "myimage:tag",
 			expectedImage: "myimage",
 			expectedImage: "myimage",
 			expectedTag:   "tag",
 			expectedTag:   "tag",
 		},
 		},
+		{
+			all:           true,
+			reference:     "myimage",
+			expectedImage: "myimage",
+			expectedTag:   "",
+		},
+		{
+			all:           true,
+			reference:     "myimage:anything",
+			expectedImage: "myimage",
+			expectedTag:   "",
+		},
 	}
 	}
-	for _, pullCase := range pullCases {
-		client := &Client{
-			client: newMockClient(func(req *http.Request) (*http.Response, error) {
-				expectedURL := fmt.Sprintf(expectedURLFormat, pullCase.expectedImage)
-				if !strings.HasPrefix(req.URL.Path, expectedURL) {
-					return nil, fmt.Errorf("Expected URL '%s', got '%s'", expectedURL, req.URL)
-				}
-				query := req.URL.Query()
-				tag := query.Get("tag")
-				if tag != pullCase.expectedTag {
-					return nil, fmt.Errorf("tag not set in URL query properly. Expected '%s', got %s", pullCase.expectedTag, tag)
-				}
-				return &http.Response{
-					StatusCode: http.StatusOK,
-					Body:       ioutil.NopCloser(bytes.NewReader([]byte(expectedOutput))),
-				}, nil
-			}),
-		}
-		resp, err := client.ImagePush(context.Background(), pullCase.reference, types.ImagePushOptions{})
-		if err != nil {
-			t.Fatal(err)
-		}
-		body, err := ioutil.ReadAll(resp)
-		if err != nil {
-			t.Fatal(err)
-		}
-		if string(body) != expectedOutput {
-			t.Fatalf("expected '%s', got %s", expectedOutput, string(body))
-		}
+	for _, tc := range testCases {
+		tc := tc
+		t.Run(fmt.Sprintf("%s,all-tags=%t", tc.reference, tc.all), func(t *testing.T) {
+			client := &Client{
+				client: newMockClient(func(req *http.Request) (*http.Response, error) {
+					expectedURL := fmt.Sprintf(expectedURLFormat, tc.expectedImage)
+					if !strings.HasPrefix(req.URL.Path, expectedURL) {
+						return nil, fmt.Errorf("Expected URL '%s', got '%s'", expectedURL, req.URL)
+					}
+					query := req.URL.Query()
+					tag := query.Get("tag")
+					if tag != tc.expectedTag {
+						return nil, fmt.Errorf("tag not set in URL query properly. Expected '%s', got %s", tc.expectedTag, tag)
+					}
+					return &http.Response{
+						StatusCode: http.StatusOK,
+						Body:       ioutil.NopCloser(bytes.NewReader([]byte(expectedOutput))),
+					}, nil
+				}),
+			}
+			resp, err := client.ImagePush(context.Background(), tc.reference, types.ImagePushOptions{
+				All: tc.all,
+			})
+			if err != nil {
+				t.Fatal(err)
+			}
+			body, err := ioutil.ReadAll(resp)
+			if err != nil {
+				t.Fatal(err)
+			}
+			if string(body) != expectedOutput {
+				t.Fatalf("expected '%s', got %s", expectedOutput, string(body))
+			}
+		})
 	}
 	}
 }
 }