diff --git a/registry.go b/registry.go index 9df32be..73719f1 100644 --- a/registry.go +++ b/registry.go @@ -18,7 +18,7 @@ type RegistryService interface { Create(context.Context, *RegistryCreateRequest) (*Registry, *Response, error) Get(context.Context) (*Registry, *Response, error) Delete(context.Context) (*Response, error) - DockerCredentials(context.Context) (*DockerCredentials, *Response, error) + DockerCredentials(context.Context, *RegistryDockerCredentialsRequest) (*DockerCredentials, *Response, error) } var _ RegistryService = &RegistryServiceOp{} @@ -33,6 +33,12 @@ type RegistryCreateRequest struct { Name string `json:"name,omitempty"` } +// RegistryDockerCredentialsRequest represents a request to retrieve docker +// credentials for a registry. +type RegistryDockerCredentialsRequest struct { + ReadWrite bool `json:"read_write"` +} + // Registry represents a registry. type Registry struct { Name string `json:"name,omitempty"` @@ -91,9 +97,9 @@ type DockerCredentials struct { DockerConfigJSON []byte } -// DockerCredentials retrieves a Docker config file with the registry's credentials. -func (svc *RegistryServiceOp) DockerCredentials(ctx context.Context) (*DockerCredentials, *Response, error) { - path := fmt.Sprintf("%s/%s", registryPath, "docker-credentials") +// DockerCredentials retrieves a Docker config file containing the registry's credentials. +func (svc *RegistryServiceOp) DockerCredentials(ctx context.Context, request *RegistryDockerCredentialsRequest) (*DockerCredentials, *Response, error) { + path := fmt.Sprintf("%s/%s?read_write=%t", registryPath, "docker-credentials", request.ReadWrite) req, err := svc.client.NewRequest(ctx, http.MethodGet, path, nil) if err != nil { diff --git a/registry_test.go b/registry_test.go index a39f83b..73d42fa 100644 --- a/registry_test.go +++ b/registry_test.go @@ -82,17 +82,38 @@ func TestRegistry_Delete(t *testing.T) { } func TestRegistry_DockerCredentials(t *testing.T) { - setup() - defer teardown() + returnedConfig := "this could be a docker config" + tests := []struct { + name string + params *RegistryDockerCredentialsRequest + expectedReadWrite string + }{ + { + name: "read-only (default)", + params: &RegistryDockerCredentialsRequest{}, + expectedReadWrite: "false", + }, + { + name: "read/write", + params: &RegistryDockerCredentialsRequest{ReadWrite: true}, + expectedReadWrite: "true", + }, + } - want := []byte("this is a valid docker config json") + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + setup() + defer teardown() - mux.HandleFunc("/v2/registry/docker-credentials", func(w http.ResponseWriter, r *http.Request) { - testMethod(t, r, http.MethodGet) - w.Write(want) - }) - got, _, err := client.Registry.DockerCredentials(ctx) + mux.HandleFunc("/v2/registry/docker-credentials", func(w http.ResponseWriter, r *http.Request) { + require.Equal(t, test.expectedReadWrite, r.URL.Query().Get("read_write")) + testMethod(t, r, http.MethodGet) + fmt.Fprint(w, returnedConfig) + }) - require.NoError(t, err) - require.Equal(t, want, got.DockerConfigJSON) + got, _, err := client.Registry.DockerCredentials(ctx, test.params) + require.NoError(t, err) + require.Equal(t, []byte(returnedConfig), got.DockerConfigJSON) + }) + } }