From cf998978a8b94db03be98f72f795582e4b920ba9 Mon Sep 17 00:00:00 2001 From: Josh Curl Date: Thu, 15 Sep 2016 16:12:15 -0700 Subject: [PATCH] Refactor how consoles and engines are loaded --- cmd/control/engine.go | 5 +-- cmd/switchconsole/switch_console.go | 5 +-- compose/reload.go | 48 ++++++++++++++++++++++++----- 3 files changed, 42 insertions(+), 16 deletions(-) diff --git a/cmd/control/engine.go b/cmd/control/engine.go index 3fa22d25..7e100afc 100644 --- a/cmd/control/engine.go +++ b/cmd/control/engine.go @@ -10,7 +10,6 @@ import ( log "github.com/Sirupsen/logrus" "github.com/codegangsta/cli" - composeConfig "github.com/docker/libcompose/config" "github.com/docker/libcompose/project/options" "github.com/rancher/os/compose" "github.com/rancher/os/config" @@ -68,9 +67,7 @@ func engineSwitch(c *cli.Context) error { log.Fatal(err) } - project.ServiceConfigs.Add("docker", &composeConfig.ServiceConfig{}) - - if err = compose.LoadService(project, cfg, true, newEngine); err != nil { + if err = compose.LoadSpecialService(project, cfg, "docker", newEngine); err != nil { log.Fatal(err) } diff --git a/cmd/switchconsole/switch_console.go b/cmd/switchconsole/switch_console.go index 21905d17..71a45f0c 100644 --- a/cmd/switchconsole/switch_console.go +++ b/cmd/switchconsole/switch_console.go @@ -4,7 +4,6 @@ import ( "os" log "github.com/Sirupsen/logrus" - composeConfig "github.com/docker/libcompose/config" "github.com/docker/libcompose/project/options" "github.com/rancher/os/compose" "github.com/rancher/os/config" @@ -25,9 +24,7 @@ func Main() { } if newConsole != "default" { - project.ServiceConfigs.Add("console", &composeConfig.ServiceConfig{}) - - if err = compose.LoadService(project, cfg, true, newConsole); err != nil { + if err = compose.LoadSpecialService(project, cfg, "console", newConsole); err != nil { log.Fatal(err) } } diff --git a/compose/reload.go b/compose/reload.go index 8163d4f4..492b3012 100644 --- a/compose/reload.go +++ b/compose/reload.go @@ -37,6 +37,37 @@ func LoadService(p *project.Project, cfg *config.CloudConfig, useNetwork bool, s return nil } +func LoadSpecialService(p *project.Project, cfg *config.CloudConfig, serviceName, serviceValue string) error { + // Save config in case load fails + previousConfig, ok := p.ServiceConfigs.Get(serviceName) + + p.ServiceConfigs.Add(serviceName, &composeConfig.ServiceConfig{}) + + if err := LoadService(p, cfg, true, serviceValue); err != nil { + // Rollback to previous config + if ok { + p.ServiceConfigs.Add(serviceName, previousConfig) + } + return err + } + + return nil +} + +func loadConsoleService(cfg *config.CloudConfig, p *project.Project) error { + if cfg.Rancher.Console == "" || cfg.Rancher.Console == "default" { + return nil + } + return LoadSpecialService(p, cfg, "console", cfg.Rancher.Console) +} + +func loadEngineService(cfg *config.CloudConfig, p *project.Project) error { + if cfg.Rancher.Docker.Engine == "" || cfg.Rancher.Docker.Engine == cfg.Rancher.Defaults.Docker.Engine { + return nil + } + return LoadSpecialService(p, cfg, "docker", cfg.Rancher.Docker.Engine) +} + func projectReload(p *project.Project, useNetwork *bool, loadConsole bool, environmentLookup *docker.ConfigEnvironment, authLookup *docker.ConfigAuthLookup) func() error { enabled := map[interface{}]interface{}{} return func() error { @@ -62,17 +93,18 @@ func projectReload(p *project.Project, useNetwork *bool, loadConsole bool, envir enabled[service] = service } - if loadConsole && cfg.Rancher.Console != "" && cfg.Rancher.Console != "default" { - if err := LoadService(p, cfg, *useNetwork, cfg.Rancher.Console); err != nil && err != network.ErrNoNetwork { - log.Error(err) + if !*useNetwork { + return nil + } + + if loadConsole { + if err := loadConsoleService(cfg, p); err != nil { + log.Errorf("Failed to load console: %v", err) } } - if cfg.Rancher.Docker.Engine != "" && cfg.Rancher.Docker.Engine != cfg.Rancher.Defaults.Docker.Engine { - p.ServiceConfigs.Add("docker", &composeConfig.ServiceConfig{}) - if err := LoadService(p, cfg, *useNetwork, cfg.Rancher.Docker.Engine); err != nil && err != network.ErrNoNetwork { - log.Error(err) - } + if err := loadEngineService(cfg, p); err != nil { + log.Errorf("Failed to load engine: %v", err) } return nil