diff --git a/cmd/helm/repository.go b/cmd/helm/repository.go index 549a39f463454b723e8d1f2c53318598899ee950..f17c2fae2a9158dd42d5c05661d08fd21f6d56f3 100644 --- a/cmd/helm/repository.go +++ b/cmd/helm/repository.go @@ -43,6 +43,14 @@ const repoDesc = `Helm repositories store Helm charts. For more details, use 'helm repo CMD -h'. ` +const addRepoDesc = `The add repository command is used to add a name a repository url to your + chart repository list. The repository url must begin with a valid protocoal. At the moment, + we only support google cloud storage for chart repositories. + + A valid command might look like: + $ helm repo add charts gs://kubernetes-charts +` + func repoCommands() cli.Command { return cli.Command{ Name: "repository", @@ -51,10 +59,11 @@ func repoCommands() cli.Command { Description: repoDesc, Subcommands: []cli.Command{ { - Name: "add", - Usage: "Add a chart repository to the remote manager.", - ArgsUsage: "[NAME] [REPOSITORY_URL]", - Action: func(c *cli.Context) { run(c, addRepo) }, + Name: "add", + Usage: "Add a chart repository to the remote manager.", + Description: addRepoDesc, + ArgsUsage: "[NAME] [REPOSITORY_URL]", + Action: func(c *cli.Context) { run(c, addRepo) }, }, { Name: "list", @@ -66,7 +75,7 @@ func repoCommands() cli.Command { Name: "remove", Aliases: []string{"rm"}, Usage: "Remove a chart repository from the remote manager.", - ArgsUsage: "REPOSITORY_URL", + ArgsUsage: "REPOSITORY_NAME", Action: func(c *cli.Context) { run(c, removeRepo) }, }, }, diff --git a/pkg/repo/inmem_repo_service.go b/pkg/repo/inmem_repo_service.go index 7e048e373c0de54d96989c2b34c2843f6e4627f5..3865f8947558215637cac136d1d8d49e26441e88 100644 --- a/pkg/repo/inmem_repo_service.go +++ b/pkg/repo/inmem_repo_service.go @@ -17,6 +17,7 @@ limitations under the License. package repo import ( + "errors" "fmt" "strings" "sync" @@ -62,6 +63,11 @@ func (rs *inmemRepoService) CreateRepo(repository IRepo) error { URL := repository.GetURL() name := repository.GetName() + valid := GCSRepoURLMatcher.MatchString(URL) + if !valid { + return errors.New(URL + " is an invalid Repo URL") + } + for u, r := range rs.repositories { if u == URL { return fmt.Errorf("Repository with URL %s already exists", URL) diff --git a/pkg/repo/inmem_repo_service_test.go b/pkg/repo/inmem_repo_service_test.go index 4c214188b18e0a9c5a024fcdbfd0e2e98000812b..119c8535fbb2ef275e5a184f2653c37f2b825103 100644 --- a/pkg/repo/inmem_repo_service_test.go +++ b/pkg/repo/inmem_repo_service_test.go @@ -85,6 +85,19 @@ func TestCreateRepoWithDuplicateURL(t *testing.T) { } } +func TestCreateRepoWithInvalidURL(t *testing.T) { + rs := NewInmemRepoService() + invalidURL := "fake://sfds" + r, err := newRepo(invalidURL, "", TestName, GCSRepoFormat, GCSRepoType) + if err != nil { + t.Fatalf("cannot create test repo: %v", err) + } + + if err = rs.CreateRepo(r); err == nil { + t.Fatalf("created repo with invalid URL: %s", invalidURL) + } +} + func TestGetRepoWithInvalidURL(t *testing.T) { invalidURL := "https://not.a.valid/url" rs := NewInmemRepoService() @@ -96,7 +109,7 @@ func TestGetRepoWithInvalidURL(t *testing.T) { func TestGetRepoURLByName(t *testing.T) { rs := NewInmemRepoService() - testURL := "gcs://helm-test-charts" + testURL := "gs://helm-test-charts" r, err := newRepo(testURL, "", TestName, GCSRepoFormat, GCSRepoType) err = rs.CreateRepo(r) if err != nil {