Skip to content

Commit b62ce57

Browse files
Simon Johanssonandreasf
authored andcommitted
JSON: allow port to be provided as int or string
Signed-off-by: Andreas Fleig <[email protected]>
1 parent 26d607a commit b62ce57

File tree

7 files changed

+71
-9
lines changed

7 files changed

+71
-9
lines changed

cfmysql/cf_api_client.go

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
"encoding/json"
99
pluginResources "github.com/andreasf/cf-mysql-plugin/cfmysql/resources"
1010
. "code.cloudfoundry.org/cli/plugin/models"
11+
"strconv"
1112
)
1213

1314
//go:generate counterfeiter . ApiClient
@@ -60,7 +61,7 @@ func (self *SdkApiClient) GetMysqlServices(cliConnection plugin.CliConnection) (
6061

6162
bindingResult := <- bindingChan
6263
if bindingResult.Err != nil {
63-
return nil, err
64+
return nil, bindingResult.Err
6465
}
6566

6667
return getAvailableServices(bindingResult.Bindings, instances), nil
@@ -97,6 +98,25 @@ func deserializeBindings(bindingResponse []byte) (*pluginResources.PaginatedServ
9798
return nil, fmt.Errorf("Unable to deserialize service bindings: %s", err)
9899
}
99100

101+
// port might be int or string, we don't know upfront.
102+
// use index because range would create copies
103+
for i := range paginatedResources.Resources {
104+
credentials := &paginatedResources.Resources[i].Entity.Credentials
105+
106+
var portInt int
107+
var portString string
108+
109+
err = json.Unmarshal(credentials.RawPort, &portString)
110+
if err != nil {
111+
err = json.Unmarshal(credentials.RawPort, &portInt)
112+
if err != nil {
113+
return nil, err
114+
}
115+
portString = strconv.Itoa(portInt)
116+
}
117+
credentials.Port = portString
118+
}
119+
100120
return paginatedResources, nil
101121
}
102122

cfmysql/cf_api_client_test.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,9 @@ var _ = Describe("CfSdkClient", func() {
5252
paginatedResources, err := apiClient.GetServiceBindings(cliConnection)
5353

5454
Expect(err).To(BeNil())
55-
Expect(paginatedResources.Resources).To(HaveLen(3))
55+
Expect(paginatedResources.Resources).To(HaveLen(4))
56+
Expect(paginatedResources.Resources[0].Entity.Credentials.Port).To(Equal("3306"))
57+
Expect(paginatedResources.Resources[3].Entity.Credentials.Port).To(Equal("54321"))
5658

5759
Expect(cliConnection.AccessTokenCallCount()).To(Equal(1))
5860
Expect(cliConnection.ApiEndpointCallCount()).To(Equal(1))

cfmysql/plugin.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ func (self *MysqlPlugin) GetMetadata() plugin.PluginMetadata {
2424
Version: plugin.VersionType{
2525
Major: 1,
2626
Minor: 3,
27-
Build: 1,
27+
Build: 2,
2828
},
2929
MinCliVersion: plugin.VersionType{
3030
Major: 6,

cfmysql/plugin_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ var _ = Describe("Plugin", func() {
2121
Expect(mysqlPlugin.GetMetadata().Version).To(Equal(plugin.VersionType{
2222
Major: 1,
2323
Minor: 3,
24-
Build: 1,
24+
Build: 2,
2525
}))
2626
})
2727
})

cfmysql/resources/resources.go

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
package resources
22

3-
import "code.cloudfoundry.org/cli/cf/api/resources"
3+
import (
4+
"code.cloudfoundry.org/cli/cf/api/resources"
5+
"encoding/json"
6+
)
47

58
type PaginatedServiceBindingResources struct {
69
TotalResults int `json:"total_results"`
@@ -22,7 +25,8 @@ type MysqlCredentials struct {
2225
Uri string `json:"uri"`
2326
DbName string `json:"name"`
2427
Hostname string `json:"hostname"`
25-
Port string `json:"port"`
28+
Port string
29+
RawPort json.RawMessage `json:"port"`
2630
Username string `json:"username"`
2731
Password string `json:"password"`
2832
}

cfmysql/resources/resources_test.go

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,17 +35,26 @@ var _ = Describe("Resources", func() {
3535
err := json.Unmarshal(test_resources.LoadResource("../test_resources/service_bindings.json"), paginatedResources)
3636

3737
Expect(err).To(BeNil())
38-
Expect(paginatedResources.Resources).To(HaveLen(3))
38+
Expect(paginatedResources.Resources).To(HaveLen(4))
3939

4040
Expect(paginatedResources.Resources[0].Entity.ServiceInstanceGUID).To(Equal("service-instance-guid-a"))
4141
Expect(paginatedResources.Resources[0].Entity.Credentials.Uri).To(Equal("mysql://username-a:[email protected]:3306/dbname-a?reconnect=true"))
4242
Expect(paginatedResources.Resources[0].Entity.Credentials.DbName).To(Equal("dbname-a"))
4343
Expect(paginatedResources.Resources[0].Entity.Credentials.Hostname).To(Equal("database-a.host"))
44-
Expect(paginatedResources.Resources[0].Entity.Credentials.Port).To(Equal("3306"))
4544
Expect(paginatedResources.Resources[0].Entity.Credentials.Username).To(Equal("username-a"))
4645
Expect(paginatedResources.Resources[0].Entity.Credentials.Password).To(Equal("password-a"))
4746

4847
Expect(paginatedResources.Resources[1].Entity.ServiceInstanceGUID).To(Equal("service-instance-guid-b"))
48+
49+
var portString string
50+
err = json.Unmarshal(paginatedResources.Resources[0].Entity.Credentials.RawPort, &portString)
51+
Expect(err).To(BeNil())
52+
Expect(portString).To(Equal("3306"))
53+
54+
var portInt int
55+
err = json.Unmarshal(paginatedResources.Resources[3].Entity.Credentials.RawPort, &portInt)
56+
Expect(err).To(BeNil())
57+
Expect(portInt).To(Equal(54321))
4958
})
5059
})
5160
})

cfmysql/test_resources/service_bindings.json

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,34 @@
8383
"app_url": "/v2/apps/app-guid-b",
8484
"service_instance_url": "/v2/service_instances/service-instance-guid-d"
8585
}
86+
},
87+
{
88+
"metadata": {
89+
"guid": "guid-service-binding-e",
90+
"url": "/v2/service_bindings/guid-service-binding-e",
91+
"created_at": "2016-11-15T09:22:15Z",
92+
"updated_at": null
93+
},
94+
"entity": {
95+
"app_guid": "app-guid-e",
96+
"service_instance_guid": "service-instance-guid-e",
97+
"credentials": {
98+
"jdbcUrl": "jdbc:mysql://database-e.host/dbname-e?user=username-e&password=password-e",
99+
"uri": "mysql://username-e:[email protected]:3306/dbname-e?reconnect=true",
100+
"name": "dbname-e",
101+
"hostname": "database-e.host",
102+
"port": 54321,
103+
"username": "username-e",
104+
"password": "password-e"
105+
},
106+
"binding_options": {},
107+
"gateway_data": null,
108+
"gateway_name": "",
109+
"syslog_drain_url": null,
110+
"volume_mounts": [],
111+
"app_url": "/v2/apps/app-guid-e",
112+
"service_instance_url": "/v2/service_instances/service-instance-guid-b"
113+
}
86114
}
87-
88115
]
89116
}

0 commit comments

Comments
 (0)