Skip to content

Commit 8b00d99

Browse files
authored
Merge pull request #85 from swisscom/develop
improve URI parsing for bindings
2 parents 52d1759 + 95d05c2 commit 8b00d99

File tree

3 files changed

+90
-1
lines changed

3 files changed

+90
-1
lines changed

service/service.go

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,7 @@ func enrichBinding(binding config.ServiceBinding) config.ServiceBinding {
129129
}
130130

131131
// set host and port too if still missing
132-
h, p, _ := net.SplitHostPort(u.Host)
132+
h, p, _ := net.SplitHostPort(canonicalHost(u))
133133
if len(binding.Host) == 0 {
134134
binding.Host = h
135135
}
@@ -186,3 +186,18 @@ func GetService(serviceType, serviceName string) config.Service {
186186
}
187187
return config.Service{}
188188
}
189+
190+
// canonicalHost returns url.Host but always with a ":port" suffix
191+
// adapted from net/http/transport canonicalAddr
192+
func canonicalHost(url *url.URL) string {
193+
portMap := map[string]string{
194+
"http": "80",
195+
"https": "443",
196+
}
197+
addr := url.Hostname()
198+
port := url.Port()
199+
if port == "" {
200+
port = portMap[url.Scheme]
201+
}
202+
return net.JoinHostPort(addr, port)
203+
}

service/service_test.go

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package service
2+
3+
import (
4+
"os"
5+
"testing"
6+
7+
"github.com/stretchr/testify/assert"
8+
"github.com/swisscom/backman/config"
9+
)
10+
11+
func Test_Service_EnrichBinding(t *testing.T) {
12+
config.SetConfigFile("_fixtures/config_without_bindings.json")
13+
14+
os.Unsetenv("SERVICE_BINDING_ROOT")
15+
16+
c := config.Get()
17+
mergeVCAPServices()
18+
19+
elasticsearchServiceConfig := c.Services["my-elasticsearch"]
20+
21+
// without enrichBinding is port undefined
22+
assert.Equal(t, 0, elasticsearchServiceConfig.Binding.Port)
23+
24+
// if port is defined in uri, it is determined from there
25+
elasticsearchServiceConfig.Binding = enrichBinding(elasticsearchServiceConfig.Binding)
26+
assert.Equal(t, 443, elasticsearchServiceConfig.Binding.Port)
27+
28+
// if no port is defined in uri, it is determined by schema/protocol
29+
elasticsearchServiceConfig.Binding.Host = "https://0c061730-1b19-424b-8efd-349fd40957a0.yolo.elasticsearch.lyra-836.appcloud.swisscom.com"
30+
elasticsearchServiceConfig.Binding.URI = elasticsearchServiceConfig.Binding.Host
31+
elasticsearchServiceConfig.Binding.Port = 0
32+
elasticsearchServiceConfig.Binding = enrichBinding(elasticsearchServiceConfig.Binding)
33+
assert.Equal(t, 443, elasticsearchServiceConfig.Binding.Port)
34+
35+
// if no port is defined in uri, it is determined by schema/protocol
36+
elasticsearchServiceConfig.Binding.Host = "http://0c061730-1b19-424b-8efd-349fd40957a0.yolo.elasticsearch.lyra-836.appcloud.swisscom.com"
37+
elasticsearchServiceConfig.Binding.URI = elasticsearchServiceConfig.Binding.Host
38+
elasticsearchServiceConfig.Binding.Port = 0
39+
elasticsearchServiceConfig.Binding = enrichBinding(elasticsearchServiceConfig.Binding)
40+
assert.Equal(t, 80, elasticsearchServiceConfig.Binding.Port)
41+
42+
// if no port is defined in uri, it is determined by schema/protocol, but only known ones
43+
elasticsearchServiceConfig.Binding.Host = "nonehttp://0c061730-1b19-424b-8efd-349fd40957a0.yolo.elasticsearch.lyra-836.appcloud.swisscom.com"
44+
elasticsearchServiceConfig.Binding.URI = elasticsearchServiceConfig.Binding.Host
45+
elasticsearchServiceConfig.Binding.Port = 0
46+
elasticsearchServiceConfig.Binding = enrichBinding(elasticsearchServiceConfig.Binding)
47+
assert.Equal(t, 0, elasticsearchServiceConfig.Binding.Port)
48+
}

service/vcap_services_test.go

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package service
2+
3+
import (
4+
"os"
5+
"testing"
6+
7+
"github.com/stretchr/testify/assert"
8+
"github.com/swisscom/backman/config"
9+
)
10+
11+
func Test_Service_MergeVCAPServices(t *testing.T) {
12+
config.SetConfigFile("_fixtures/config_without_bindings.json")
13+
14+
os.Unsetenv("SERVICE_BINDING_ROOT")
15+
16+
c := config.Get()
17+
mergeVCAPServices()
18+
19+
assert.Equal(t, "postgres", c.Services["my_postgres_db"].Binding.Type)
20+
assert.Equal(t, "127.0.0.1", c.Services["my_postgres_db"].Binding.Host)
21+
assert.Equal(t, 5432, c.Services["my_postgres_db"].Binding.Port)
22+
assert.Equal(t, "dev-user", c.Services["my_postgres_db"].Binding.Username)
23+
assert.Equal(t, "dev-secret", c.Services["my_postgres_db"].Binding.Password)
24+
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)
25+
assert.Equal(t, "https://0c061730-1b19-424b-8efd-349fd40957a0.yolo.elasticsearch.lyra-836.appcloud.swisscom.com:443", c.Services["my-elasticsearch"].Binding.URI)
26+
}

0 commit comments

Comments
 (0)