diff --git a/cmd/helm/init.go b/cmd/helm/init.go index 282d2aaaca96d8dbe36759e1f60e2a63b26427e9..dbd84c9d07484bda8dba6835187a7bb07618d016 100644 --- a/cmd/helm/init.go +++ b/cmd/helm/init.go @@ -20,7 +20,7 @@ Kubernetes Cluster and sets up local configuration in $HELM_HOME (default: ~/.he const repositoriesPath = ".repositories" const cachePath = "cache" const localPath = "local" -const localCacheFilePath = localPath + "/cache.txt" +const localCacheFilePath = localPath + "/cache.yaml" var defaultRepo = map[string]string{"default-name": "default-url"} var tillerImg string diff --git a/cmd/helm/package.go b/cmd/helm/package.go index 7f7037de1672176ce338e3b72e67a2929bba2fba..5e49041aa9c7f9fb23b253a5448e0ed648ac73de 100644 --- a/cmd/helm/package.go +++ b/cmd/helm/package.go @@ -6,6 +6,7 @@ import ( "path/filepath" "github.com/deis/tiller/pkg/chart" + "github.com/deis/tiller/pkg/repo" "github.com/spf13/cobra" ) @@ -55,11 +56,7 @@ func runPackage(cmd *cobra.Command, args []string) error { // Save to $HELM_HOME/local directory. if save { - dir := LocalDirectory(os.ExpandEnv(helmHome)) - name, err := chart.Save(ch, dir) - if err == nil { - cmd.Printf("Saved %s to $HELM_HOME/local/\n", name) - } else { + if err := repo.AddChartToLocalRepo(ch, LocalDirectory(os.ExpandEnv(helmHome))); err != nil { return err } } diff --git a/pkg/repo/local.go b/pkg/repo/local.go new file mode 100644 index 0000000000000000000000000000000000000000..124c8e75d14ffdd448343f207d6dd65893d94df5 --- /dev/null +++ b/pkg/repo/local.go @@ -0,0 +1,128 @@ +package repo + +import ( + "fmt" + "io/ioutil" + "net/http" + "path/filepath" + "strings" + + "github.com/deis/tiller/pkg/chart" + "gopkg.in/yaml.v2" +) + +var localRepoPath string + +type CacheFile struct { + Entries map[string]*ChartRef +} + +type ChartRef struct { + Name string `yaml:name` + Url string `yaml:url` +} + +func StartLocalRepo(path string) { + fmt.Println("Now serving you on localhost:8879...") + localRepoPath = path + http.HandleFunc("/", homeHandler) + http.HandleFunc("/charts/", indexHandler) + http.ListenAndServe(":8879", nil) +} +func homeHandler(w http.ResponseWriter, r *http.Request) { + fmt.Fprintf(w, "Welcome to the Kubernetes Package manager!\nBrowse charts on localhost:8879/charts!") +} +func indexHandler(w http.ResponseWriter, r *http.Request) { + file := r.URL.Path[len("/charts/"):] + if len(strings.Split(file, ".")) > 1 { + serveFile(w, r, file) + } else if file == "" { + fmt.Fprintf(w, "list of charts should be here at some point") + } else if file == "cache" { + fmt.Fprintf(w, "cache file data should be here at some point") + } else { + fmt.Fprintf(w, "Ummm... Nothing to see here folks") + } +} + +func serveFile(w http.ResponseWriter, r *http.Request, file string) { + http.ServeFile(w, r, filepath.Join(localRepoPath, file)) +} + +func AddChartToLocalRepo(ch *chart.Chart, path string) error { + name, err := chart.Save(ch, path) + if err != nil { + return err + } + err = ReindexCacheFile(ch, path+"/cache.yaml") + if err != nil { + return nil + } + fmt.Printf("Saved %s to $HELM_HOME/local", name) + return nil +} + +func ReindexCacheFile(ch *chart.Chart, path string) error { + name := ch.Chartfile().Name + "-" + ch.Chartfile().Version + fmt.Println("\nname: " + name) + b, err := ioutil.ReadFile(path) + + if err != nil { + fmt.Println("read file err") + fmt.Printf("err, %s", err) + return err + } + + var y CacheFile + err = yaml.Unmarshal(b, &y) + if err != nil { + fmt.Println("error unmarshaling") + fmt.Println("err, %s", err) + return err + } + fmt.Println("%v\n", y) + found := false + for k, v := range y.Entries { + fmt.Printf("in here: %v", v) + fmt.Printf("in here: %v", k) + if k == name { + found = true + break + } + } + if !found { + url := "localhost:8879/charts/" + name + ".tgz" + + out, err := y.InsertChartEntry(name, url) + if err != nil { + return err + } + + ioutil.WriteFile(path, out, 0644) + } + return nil +} +func (c *CacheFile) UnmarshalYAML(unmarshal func(interface{}) error) error { + var refs map[string]*ChartRef + if err := unmarshal(&refs); err != nil { + if _, ok := err.(*yaml.TypeError); !ok { + return err + } + } + c.Entries = refs + return nil +} + +func (cache *CacheFile) InsertChartEntry(name string, url string) ([]byte, error) { + if cache.Entries == nil { + cache.Entries = make(map[string]*ChartRef) + } + entry := ChartRef{Name: name, Url: url} + cache.Entries[name] = &entry + out, err := yaml.Marshal(&cache.Entries) + if err != nil { + return nil, err + } + + return out, nil +} diff --git a/pkg/repo/localRepo.go b/pkg/repo/localRepo.go deleted file mode 100644 index 813ffb80e0f27927792fd3a5e016181ea4a37557..0000000000000000000000000000000000000000 --- a/pkg/repo/localRepo.go +++ /dev/null @@ -1,37 +0,0 @@ -package repo - -import ( - "fmt" - "net/http" - "path/filepath" - "strings" -) - -var localRepoPath string - -func StartLocalRepo(path string) { - fmt.Println("Now serving you on localhost:8879...") - localRepoPath = path - http.HandleFunc("/", homeHandler) - http.HandleFunc("/charts/", indexHandler) - http.ListenAndServe(":8879", nil) -} -func homeHandler(w http.ResponseWriter, r *http.Request) { - fmt.Fprintf(w, "Welcome to the Kubernetes Package manager!\nBrowse charts on localhost:8879/charts!") -} -func indexHandler(w http.ResponseWriter, r *http.Request) { - file := r.URL.Path[len("/charts/"):] - if len(strings.Split(file, ".")) > 1 { - serveFile(w, r, file) - } else if file == "" { - fmt.Fprintf(w, "list of charts should be here at some point") - } else if file == "cache" { - fmt.Fprintf(w, "cache file data should be here at some point") - } else { - fmt.Fprintf(w, "Ummm... Nothing to see here folks") - } -} - -func serveFile(w http.ResponseWriter, r *http.Request, file string) { - http.ServeFile(w, r, filepath.Join(localRepoPath, file)) -}