From 66cffc0a91deadd6db95e16f3f22795d35658e2e Mon Sep 17 00:00:00 2001 From: Jason-ZW Date: Mon, 25 Feb 2019 17:48:31 +0800 Subject: [PATCH] Support service cache update --- cmd/control/console.go | 23 +++++++++++++++++----- cmd/control/engine.go | 23 +++++++++++++++++----- cmd/control/os.go | 23 +++++++++++++++++----- cmd/control/service/service.go | 17 ++++++++++++++--- pkg/util/network/cache.go | 5 +++++ pkg/util/network/network.go | 35 ++++++++++++++++++++++++++++++++++ 6 files changed, 108 insertions(+), 18 deletions(-) diff --git a/cmd/control/console.go b/cmd/control/console.go index 92d0b473..7e4a2afb 100644 --- a/cmd/control/console.go +++ b/cmd/control/console.go @@ -43,8 +43,14 @@ func consoleSubcommands() []cli.Command { Action: consoleEnable, }, { - Name: "list", - Usage: "list available consoles", + Name: "list", + Usage: "list available consoles", + Flags: []cli.Flag{ + cli.BoolFlag{ + Name: "update, u", + Usage: "update console cache", + }, + }, Action: consoleList, }, } @@ -127,7 +133,7 @@ func consoleEnable(c *cli.Context) error { func consoleList(c *cli.Context) error { cfg := config.LoadConfig() - consoles := availableConsoles(cfg) + consoles := availableConsoles(cfg, c.Bool("update")) CurrentConsole := CurrentConsole() for _, console := range consoles { @@ -144,13 +150,20 @@ func consoleList(c *cli.Context) error { } func validateConsole(console string, cfg *config.CloudConfig) { - consoles := availableConsoles(cfg) + consoles := availableConsoles(cfg, false) if !service.IsLocalOrURL(console) && !util.Contains(consoles, console) { log.Fatalf("%s is not a valid console", console) } } -func availableConsoles(cfg *config.CloudConfig) []string { +func availableConsoles(cfg *config.CloudConfig, update bool) []string { + if update { + err := network.UpdateCaches(cfg.Rancher.Repositories.ToArray(), "consoles") + if err != nil { + log.Debugf("Failed to update console caches: %v", err) + } + + } consoles, err := network.GetConsoles(cfg.Rancher.Repositories.ToArray()) if err != nil { log.Fatal(err) diff --git a/cmd/control/engine.go b/cmd/control/engine.go index b25367af..7b2f0ed5 100644 --- a/cmd/control/engine.go +++ b/cmd/control/engine.go @@ -108,8 +108,14 @@ func engineSubcommands() []cli.Command { Action: engineEnable, }, { - Name: "list", - Usage: "list available Docker engines (include the Dind engines)", + Name: "list", + Usage: "list available Docker engines (include the Dind engines)", + Flags: []cli.Flag{ + cli.BoolFlag{ + Name: "update, u", + Usage: "update engine cache", + }, + }, Action: engineList, }, } @@ -272,7 +278,7 @@ func engineEnable(c *cli.Context) error { func engineList(c *cli.Context) error { cfg := config.LoadConfig() - engines := availableEngines(cfg) + engines := availableEngines(cfg, c.Bool("update")) currentEngine := CurrentEngine() for _, engine := range engines { @@ -315,13 +321,20 @@ func engineList(c *cli.Context) error { } func validateEngine(engine string, cfg *config.CloudConfig) { - engines := availableEngines(cfg) + engines := availableEngines(cfg, false) if !service.IsLocalOrURL(engine) && !util.Contains(engines, engine) { log.Fatalf("%s is not a valid engine", engine) } } -func availableEngines(cfg *config.CloudConfig) []string { +func availableEngines(cfg *config.CloudConfig, update bool) []string { + if update { + err := network.UpdateCaches(cfg.Rancher.Repositories.ToArray(), "engines") + if err != nil { + log.Debugf("Failed to update engine caches: %v", err) + } + + } engines, err := network.GetEngines(cfg.Rancher.Repositories.ToArray()) if err != nil { log.Fatal(err) diff --git a/cmd/control/os.go b/cmd/control/os.go index 1fa4d6da..1b570611 100644 --- a/cmd/control/os.go +++ b/cmd/control/os.go @@ -71,8 +71,14 @@ func osSubcommands() []cli.Command { }, }, { - Name: "list", - Usage: "list the current available versions", + Name: "list", + Usage: "list the current available versions", + Flags: []cli.Flag{ + cli.BoolFlag{ + Name: "update, u", + Usage: "update engine cache", + }, + }, Action: osMetaDataGet, }, { @@ -83,7 +89,7 @@ func osSubcommands() []cli.Command { } } -func getImages() (*Images, error) { +func getImages(update bool) (*Images, error) { upgradeURL, err := getUpgradeURL() if err != nil { return nil, err @@ -110,6 +116,13 @@ func getImages() (*Images, error) { u.RawQuery = q.Encode() upgradeURL = u.String() + if update { + _, err := network.UpdateCache(upgradeURL) + if err != nil { + log.Errorf("Failed to update os caches: %v", err) + } + } + body, err = network.LoadFromNetwork(upgradeURL) if err != nil { return nil, err @@ -131,7 +144,7 @@ func getImages() (*Images, error) { } func osMetaDataGet(c *cli.Context) error { - images, err := getImages() + images, err := getImages(c.Bool("update")) if err != nil { log.Fatal(err) } @@ -172,7 +185,7 @@ func osMetaDataGet(c *cli.Context) error { } func getLatestImage() (string, error) { - images, err := getImages() + images, err := getImages(false) if err != nil { return "", err } diff --git a/cmd/control/service/service.go b/cmd/control/service/service.go index 6dcbe77e..c021b37f 100644 --- a/cmd/control/service/service.go +++ b/cmd/control/service/service.go @@ -78,6 +78,10 @@ func serviceSubCommands() []cli.Command { Name: "all, a", Usage: "list all services and state", }, + cli.BoolFlag{ + Name: "update, u", + Usage: "update service cache", + }, }, Action: list, }, @@ -180,7 +184,7 @@ func list(c *cli.Context) error { clone[service] = enabled } - services := availableService(cfg) + services := availableService(cfg, c.Bool("update")) if c.Bool("all") { for service := range cfg.Rancher.Services { @@ -222,7 +226,7 @@ func IsLocalOrURL(service string) bool { // ValidService checks to see if the service definition exists func ValidService(service string, cfg *config.CloudConfig) bool { - services := availableService(cfg) + services := availableService(cfg, false) if !IsLocalOrURL(service) && !util.Contains(services, service) { return false } @@ -235,7 +239,14 @@ func validateService(service string, cfg *config.CloudConfig) { } } -func availableService(cfg *config.CloudConfig) []string { +func availableService(cfg *config.CloudConfig, update bool) []string { + if update { + err := network.UpdateCaches(cfg.Rancher.Repositories.ToArray(), "services") + if err != nil { + log.Debugf("Failed to update service caches: %v", err) + } + + } services, err := network.GetServices(cfg.Rancher.Repositories.ToArray()) if err != nil { log.Fatalf("Failed to get services: %v", err) diff --git a/pkg/util/network/cache.go b/pkg/util/network/cache.go index 225d2084..51ba457b 100644 --- a/pkg/util/network/cache.go +++ b/pkg/util/network/cache.go @@ -43,3 +43,8 @@ func cacheAdd(location string, data []byte) { cacheFile := cacheDirectory + locationHash(location) os.Rename(tempFile.Name(), cacheFile) } + +func cacheRemove(location string) error { + cacheFile := cacheDirectory + locationHash(location) + return os.Remove(cacheFile) +} diff --git a/pkg/util/network/network.go b/pkg/util/network/network.go index f37e8e20..f24a2403 100644 --- a/pkg/util/network/network.go +++ b/pkg/util/network/network.go @@ -193,3 +193,38 @@ func LoadMultiEngineResource(name string) ([]byte, error) { return nil, err } + +func UpdateCaches(urls []string, key string) error { + for _, url := range urls { + indexURL := fmt.Sprintf("%s/index.yml", url) + content, err := UpdateCache(indexURL) + if err != nil { + return err + } + + services := make(map[string][]string) + err = yaml.Unmarshal(content, &services) + if err != nil { + return err + } + + list := services[key] + for _, name := range list { + serviceURL := serviceURL(url, name) + // no need to handle error + UpdateCache(serviceURL) + } + } + return nil +} + +func UpdateCache(location string) ([]byte, error) { + if err := cacheRemove(location); err != nil { + return []byte{}, err + } + content, err := LoadResource(location, true) + if err != nil { + return []byte{}, err + } + return content, nil +}