diff --git a/service/service.go b/service/service.go index a6e7203..34389f3 100644 --- a/service/service.go +++ b/service/service.go @@ -129,7 +129,7 @@ func enrichBinding(binding config.ServiceBinding) config.ServiceBinding { } // set host and port too if still missing - h, p, _ := net.SplitHostPort(u.Host) + h, p, _ := net.SplitHostPort(canonicalHost(u)) if len(binding.Host) == 0 { binding.Host = h } @@ -186,3 +186,18 @@ func GetService(serviceType, serviceName string) config.Service { } return config.Service{} } + +// canonicalHost returns url.Host but always with a ":port" suffix +// adapted from net/http/transport canonicalAddr +func canonicalHost(url *url.URL) string { + portMap := map[string]string{ + "http": "80", + "https": "443", + } + addr := url.Hostname() + port := url.Port() + if port == "" { + port = portMap[url.Scheme] + } + return net.JoinHostPort(addr, port) +} diff --git a/service/service_test.go b/service/service_test.go new file mode 100644 index 0000000..f59557c --- /dev/null +++ b/service/service_test.go @@ -0,0 +1,48 @@ +package service + +import ( + "os" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/swisscom/backman/config" +) + +func Test_Service_EnrichBinding(t *testing.T) { + config.SetConfigFile("_fixtures/config_without_bindings.json") + + os.Unsetenv("SERVICE_BINDING_ROOT") + + c := config.Get() + mergeVCAPServices() + + elasticsearchServiceConfig := c.Services["my-elasticsearch"] + + // without enrichBinding is port undefined + assert.Equal(t, 0, elasticsearchServiceConfig.Binding.Port) + + // if port is defined in uri, it is determined from there + elasticsearchServiceConfig.Binding = enrichBinding(elasticsearchServiceConfig.Binding) + assert.Equal(t, 443, elasticsearchServiceConfig.Binding.Port) + + // if no port is defined in uri, it is determined by schema/protocol + elasticsearchServiceConfig.Binding.Host = "https://0c061730-1b19-424b-8efd-349fd40957a0.yolo.elasticsearch.lyra-836.appcloud.swisscom.com" + elasticsearchServiceConfig.Binding.URI = elasticsearchServiceConfig.Binding.Host + elasticsearchServiceConfig.Binding.Port = 0 + elasticsearchServiceConfig.Binding = enrichBinding(elasticsearchServiceConfig.Binding) + assert.Equal(t, 443, elasticsearchServiceConfig.Binding.Port) + + // if no port is defined in uri, it is determined by schema/protocol + elasticsearchServiceConfig.Binding.Host = "http://0c061730-1b19-424b-8efd-349fd40957a0.yolo.elasticsearch.lyra-836.appcloud.swisscom.com" + elasticsearchServiceConfig.Binding.URI = elasticsearchServiceConfig.Binding.Host + elasticsearchServiceConfig.Binding.Port = 0 + elasticsearchServiceConfig.Binding = enrichBinding(elasticsearchServiceConfig.Binding) + assert.Equal(t, 80, elasticsearchServiceConfig.Binding.Port) + + // if no port is defined in uri, it is determined by schema/protocol, but only known ones + elasticsearchServiceConfig.Binding.Host = "nonehttp://0c061730-1b19-424b-8efd-349fd40957a0.yolo.elasticsearch.lyra-836.appcloud.swisscom.com" + elasticsearchServiceConfig.Binding.URI = elasticsearchServiceConfig.Binding.Host + elasticsearchServiceConfig.Binding.Port = 0 + elasticsearchServiceConfig.Binding = enrichBinding(elasticsearchServiceConfig.Binding) + assert.Equal(t, 0, elasticsearchServiceConfig.Binding.Port) +} diff --git a/service/vcap_services_test.go b/service/vcap_services_test.go new file mode 100644 index 0000000..025a862 --- /dev/null +++ b/service/vcap_services_test.go @@ -0,0 +1,26 @@ +package service + +import ( + "os" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/swisscom/backman/config" +) + +func Test_Service_MergeVCAPServices(t *testing.T) { + config.SetConfigFile("_fixtures/config_without_bindings.json") + + os.Unsetenv("SERVICE_BINDING_ROOT") + + c := config.Get() + mergeVCAPServices() + + assert.Equal(t, "postgres", c.Services["my_postgres_db"].Binding.Type) + assert.Equal(t, "127.0.0.1", c.Services["my_postgres_db"].Binding.Host) + assert.Equal(t, 5432, c.Services["my_postgres_db"].Binding.Port) + assert.Equal(t, "dev-user", c.Services["my_postgres_db"].Binding.Username) + assert.Equal(t, "dev-secret", c.Services["my_postgres_db"].Binding.Password) + assert.Equal(t, "postgres://dev-user:dev-secret@127.0.0.1:5432/my_postgres_db?sslmode=disable", c.Services["my_postgres_db"].Binding.URI) + assert.Equal(t, "https://0c061730-1b19-424b-8efd-349fd40957a0.yolo.elasticsearch.lyra-836.appcloud.swisscom.com:443", c.Services["my-elasticsearch"].Binding.URI) +}