Skip to content

Commit

Permalink
Merge pull request #85 from swisscom/develop
Browse files Browse the repository at this point in the history
improve URI parsing for bindings
  • Loading branch information
JamesClonk committed Jan 10, 2024
2 parents 52d1759 + 95d05c2 commit 8b00d99
Show file tree
Hide file tree
Showing 3 changed files with 90 additions and 1 deletion.
17 changes: 16 additions & 1 deletion service/service.go
Expand Up @@ -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
}
Expand Down Expand Up @@ -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)
}
48 changes: 48 additions & 0 deletions 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)
}
26 changes: 26 additions & 0 deletions 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)
}

0 comments on commit 8b00d99

Please sign in to comment.