From 5ae5de0153aa3040a6c116c920305b1197cabd99 Mon Sep 17 00:00:00 2001 From: Tom Elliott Date: Wed, 7 Mar 2018 19:15:30 -0500 Subject: [PATCH] Add legacy marshaling and support old-style command line backends. --- backend_registry.go | 3 +- config/config_test.go | 7 ++-- edward/client_test.go | 3 +- edward/tail.go | 2 +- generators/generators_test.go | 3 +- services/backends.go | 9 ++--- .../backends/commandline/buildandrun_test.go | 3 +- services/backends/commandline/legacy.go | 27 +++++++++++++++ services/backends/docker/buildandrun_test.go | 34 +++++++++++-------- services/legacy.go | 11 ++++++ services/serviceconfig.go | 7 +++- 11 files changed, 76 insertions(+), 33 deletions(-) create mode 100644 services/backends/commandline/legacy.go create mode 100644 services/legacy.go diff --git a/backend_registry.go b/backend_registry.go index 83ccb486..29de75db 100644 --- a/backend_registry.go +++ b/backend_registry.go @@ -8,6 +8,7 @@ import ( // RegisterBackends configures all supported service backends. func RegisterBackends() { - services.RegisterDefaultBackend(&commandline.Loader{}) + services.RegisterLegacyMarshaler(&commandline.LegacyUnmarshaler{}) + services.RegisterBackend(&commandline.Loader{}) services.RegisterBackend(&docker.Loader{}) } diff --git a/config/config_test.go b/config/config_test.go index 54432037..dbaf01bd 100644 --- a/config/config_test.go +++ b/config/config_test.go @@ -15,7 +15,8 @@ import ( func TestMain(m *testing.M) { // Register necessary backends - services.RegisterDefaultBackend(&commandline.Loader{}) + services.RegisterLegacyMarshaler(&commandline.LegacyUnmarshaler{}) + services.RegisterBackend(&commandline.Loader{}) os.Exit(m.Run()) } @@ -27,7 +28,6 @@ var service1 = services.ServiceConfig{ RequiresSudo: true, Backends: []*services.BackendConfig{ { - Name: "backend1", Type: "commandline", Config: &commandline.Backend{ Commands: commandline.ServiceConfigCommands{ @@ -51,7 +51,6 @@ var service1alias = services.ServiceConfig{ RequiresSudo: true, Backends: []*services.BackendConfig{ { - Name: "backend1", Type: "commandline", Config: &commandline.Backend{ Commands: commandline.ServiceConfigCommands{ @@ -91,7 +90,6 @@ var service2 = services.ServiceConfig{ Path: common.StringToStringPointer("service2/path"), Backends: []*services.BackendConfig{ { - Name: "backend1", Type: "commandline", Config: &commandline.Backend{ Commands: commandline.ServiceConfigCommands{ @@ -119,7 +117,6 @@ var service3 = services.ServiceConfig{ RequiresSudo: true, Backends: []*services.BackendConfig{ { - Name: "backend1", Type: "commandline", Config: &commandline.Backend{ Commands: commandline.ServiceConfigCommands{ diff --git a/edward/client_test.go b/edward/client_test.go index 971cfb31..5224106e 100644 --- a/edward/client_test.go +++ b/edward/client_test.go @@ -40,7 +40,8 @@ func TestMain(m *testing.M) { } // Register necessary backends - services.RegisterDefaultBackend(&commandline.Loader{}) + services.RegisterLegacyMarshaler(&commandline.LegacyUnmarshaler{}) + services.RegisterBackend(&commandline.Loader{}) os.Exit(m.Run()) } diff --git a/edward/tail.go b/edward/tail.go index 4c095c2e..098245bc 100644 --- a/edward/tail.go +++ b/edward/tail.go @@ -70,7 +70,7 @@ func followGroupLog(logDir string, group *services.ServiceGroupConfig, logChanne func followServiceLog(logDir string, service *services.ServiceConfig, logChannel chan runner.LogLine) ([]runner.LogLine, error) { // Skip services that don't include a launch step - if !service.BackendConfig.HasLaunchStep() { + if !service.Backend().HasLaunchStep() { return nil, nil } diff --git a/generators/generators_test.go b/generators/generators_test.go index 36ecb4ff..b874a720 100644 --- a/generators/generators_test.go +++ b/generators/generators_test.go @@ -13,7 +13,8 @@ import ( func TestMain(m *testing.M) { // Register necessary backends - services.RegisterDefaultBackend(&commandline.Loader{}) + services.RegisterLegacyMarshaler(&commandline.LegacyUnmarshaler{}) + services.RegisterBackend(&commandline.Loader{}) os.Exit(m.Run()) } diff --git a/services/backends.go b/services/backends.go index 42fa8143..f0a77f2a 100644 --- a/services/backends.go +++ b/services/backends.go @@ -43,14 +43,9 @@ func RegisterBackend(loader BackendLoader) { loaders[loader.Name()] = loader } -func RegisterDefaultBackend(loader BackendLoader) { - loaders[loader.Name()] = loader - defaultType = loader.Name() -} - func GetBuilder(s *ServiceConfig) (Builder, error) { for _, backend := range s.Backends { - if loader, ok := loaders[backend.Type]; !ok { + if loader, ok := loaders[backend.Type]; ok { return loader.Builder(s) } } @@ -59,7 +54,7 @@ func GetBuilder(s *ServiceConfig) (Builder, error) { func GetRunner(s *ServiceConfig) (Runner, error) { for _, backend := range s.Backends { - if loader, ok := loaders[backend.Type]; !ok { + if loader, ok := loaders[backend.Type]; ok { return loader.Runner(s) } } diff --git a/services/backends/commandline/buildandrun_test.go b/services/backends/commandline/buildandrun_test.go index 4742469b..7e20eea6 100644 --- a/services/backends/commandline/buildandrun_test.go +++ b/services/backends/commandline/buildandrun_test.go @@ -17,7 +17,8 @@ import ( func TestMain(m *testing.M) { // Register necessary backends - services.RegisterDefaultBackend(&commandline.Loader{}) + services.RegisterLegacyMarshaler(&commandline.LegacyUnmarshaler{}) + services.RegisterBackend(&commandline.Loader{}) os.Exit(m.Run()) } diff --git a/services/backends/commandline/legacy.go b/services/backends/commandline/legacy.go new file mode 100644 index 00000000..44a86d85 --- /dev/null +++ b/services/backends/commandline/legacy.go @@ -0,0 +1,27 @@ +package commandline + +import ( + "encoding/json" + + "github.com/pkg/errors" + "github.com/yext/edward/services" +) + +type LegacyUnmarshaler struct{} + +func (l *LegacyUnmarshaler) Unmarshal(data []byte, c *services.ServiceConfig) error { + var backend Backend + var empty Backend + err := json.Unmarshal(data, &backend) + if err != nil { + return errors.WithStack(err) + } + if backend != empty { + c.Backends = append(c.Backends, &services.BackendConfig{ + Type: "commandline", + Config: &backend, + }) + } + + return nil +} diff --git a/services/backends/docker/buildandrun_test.go b/services/backends/docker/buildandrun_test.go index b9e8ed43..95b14e42 100644 --- a/services/backends/docker/buildandrun_test.go +++ b/services/backends/docker/buildandrun_test.go @@ -1,4 +1,4 @@ -// +build docker +// +build acceptance package docker_test @@ -15,26 +15,30 @@ import ( func TestMain(m *testing.M) { // Register necessary backends - services.RegisterDefaultBackend(&docker.Loader{}) - + services.RegisterBackend(&docker.Loader{}) os.Exit(m.Run()) } func TestStart(t *testing.T) { service := &services.ServiceConfig{ Name: "testservice", - BackendConfig: &docker.Backend{ - Image: "kitematic/hello-world-nginx:latest", - ContainerConfig: docker.Config{ - ExposedPorts: map[docker.Port]struct{}{ - "8080/tcp": struct{}{}, - }, - }, - HostConfig: docker.HostConfig{ - PortBindings: map[docker.Port][]docker.PortBinding{ - "80/tcp": []docker.PortBinding{ - { - HostPort: "51432/tcp", + Backends: []*services.BackendConfig{ + { + Type: "docker", + Config: &docker.Backend{ + Image: "kitematic/hello-world-nginx:latest", + ContainerConfig: docker.Config{ + ExposedPorts: map[docker.Port]struct{}{ + "8080/tcp": struct{}{}, + }, + }, + HostConfig: docker.HostConfig{ + PortBindings: map[docker.Port][]docker.PortBinding{ + "80/tcp": []docker.PortBinding{ + { + HostPort: "51432/tcp", + }, + }, }, }, }, diff --git a/services/legacy.go b/services/legacy.go new file mode 100644 index 00000000..3af35772 --- /dev/null +++ b/services/legacy.go @@ -0,0 +1,11 @@ +package services + +type LegacyMarshaler interface { + Unmarshal([]byte, *ServiceConfig) error +} + +var legacyUnmarshalers []LegacyMarshaler + +func RegisterLegacyMarshaler(l LegacyMarshaler) { + legacyUnmarshalers = append(legacyUnmarshalers, l) +} diff --git a/services/serviceconfig.go b/services/serviceconfig.go index 0da59c98..f944b954 100644 --- a/services/serviceconfig.go +++ b/services/serviceconfig.go @@ -138,9 +138,14 @@ func (c *ServiceConfig) UnmarshalJSON(data []byte) error { }{ Alias: (*Alias)(c), } - if err := json.Unmarshal(data, &aux); err != nil { + if err := json.Unmarshal(data, aux); err != nil { return errors.Wrap(err, "could not parse service config") } + for _, m := range legacyUnmarshalers { + if err := m.Unmarshal(data, c); err != nil { + return errors.Wrap(err, "could not parse legacy configuration") + } + } return nil }