Commit fccd1ba5 authored by Jack Greenfield's avatar Jack Greenfield

Merge pull request #422 from jackgr/repo-service

Add locking and duplicate detection
parents 64f9fb66 7e96c27e
...@@ -19,9 +19,11 @@ package repo ...@@ -19,9 +19,11 @@ package repo
import ( import (
"fmt" "fmt"
"strings" "strings"
"sync"
) )
type inmemRepoService struct { type inmemRepoService struct {
sync.RWMutex
repositories map[string]Repo repositories map[string]Repo
} }
...@@ -41,6 +43,9 @@ func NewInmemRepoService() Service { ...@@ -41,6 +43,9 @@ func NewInmemRepoService() Service {
// List returns the list of all known chart repositories // List returns the list of all known chart repositories
func (rs *inmemRepoService) List() ([]Repo, error) { func (rs *inmemRepoService) List() ([]Repo, error) {
rs.RLock()
defer rs.RUnlock()
ret := []Repo{} ret := []Repo{}
for _, r := range rs.repositories { for _, r := range rs.repositories {
ret = append(ret, r) ret = append(ret, r)
...@@ -51,12 +56,24 @@ func (rs *inmemRepoService) List() ([]Repo, error) { ...@@ -51,12 +56,24 @@ func (rs *inmemRepoService) List() ([]Repo, error) {
// Create adds a known repository to the list // Create adds a known repository to the list
func (rs *inmemRepoService) Create(repository Repo) error { func (rs *inmemRepoService) Create(repository Repo) error {
rs.repositories[repository.GetName()] = repository rs.Lock()
defer rs.Unlock()
name := repository.GetName()
_, ok := rs.repositories[name]
if ok {
return fmt.Errorf("Repository named %s already exists", name)
}
rs.repositories[name] = repository
return nil return nil
} }
// Get returns the repository with the given name // Get returns the repository with the given name
func (rs *inmemRepoService) Get(name string) (Repo, error) { func (rs *inmemRepoService) Get(name string) (Repo, error) {
rs.RLock()
defer rs.RUnlock()
r, ok := rs.repositories[name] r, ok := rs.repositories[name]
if !ok { if !ok {
return nil, fmt.Errorf("Failed to find repository named %s", name) return nil, fmt.Errorf("Failed to find repository named %s", name)
...@@ -67,6 +84,9 @@ func (rs *inmemRepoService) Get(name string) (Repo, error) { ...@@ -67,6 +84,9 @@ func (rs *inmemRepoService) Get(name string) (Repo, error) {
// GetByURL returns the repository that backs the given URL // GetByURL returns the repository that backs the given URL
func (rs *inmemRepoService) GetByURL(URL string) (Repo, error) { func (rs *inmemRepoService) GetByURL(URL string) (Repo, error) {
rs.RLock()
defer rs.RUnlock()
var found Repo var found Repo
for _, r := range rs.repositories { for _, r := range rs.repositories {
rURL := r.GetURL() rURL := r.GetURL()
...@@ -86,6 +106,9 @@ func (rs *inmemRepoService) GetByURL(URL string) (Repo, error) { ...@@ -86,6 +106,9 @@ func (rs *inmemRepoService) GetByURL(URL string) (Repo, error) {
// Delete removes a known repository from the list // Delete removes a known repository from the list
func (rs *inmemRepoService) Delete(name string) error { func (rs *inmemRepoService) Delete(name string) error {
rs.Lock()
defer rs.Unlock()
_, ok := rs.repositories[name] _, ok := rs.repositories[name]
if !ok { if !ok {
return fmt.Errorf("Failed to find repository named %s", name) return fmt.Errorf("Failed to find repository named %s", name)
......
...@@ -64,6 +64,18 @@ func TestService(t *testing.T) { ...@@ -64,6 +64,18 @@ func TestService(t *testing.T) {
} }
} }
func TestCreateRepoWithDuplicateName(t *testing.T) {
rs := NewInmemRepoService()
r, err := newRepo(GCSPublicRepoName, GCSPublicRepoURL, "", GCSRepoFormat, GCSRepoType)
if err != nil {
t.Fatalf("cannot create test repo: %s", err)
}
if err := rs.Create(r); err == nil {
t.Fatalf("created repo with duplicate name: %s", GCSPublicRepoName)
}
}
func TestGetRepoWithInvalidName(t *testing.T) { func TestGetRepoWithInvalidName(t *testing.T) {
invalidName := "InvalidRepoName" invalidName := "InvalidRepoName"
rs := NewInmemRepoService() rs := NewInmemRepoService()
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment