@@ -2,7 +2,14 @@ package cloudfoundry
2
2
3
3
import (
4
4
"context"
5
+ "fmt"
6
+ "log"
7
+ "strings"
8
+
9
+ "github.com/cloudfoundry/go-cfclient/v3/client"
10
+ "github.com/cloudfoundry/go-cfclient/v3/resource"
5
11
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
12
+ "github.com/hashicorp/terraform-plugin-sdk/v2/terraform"
6
13
"github.com/terraform-providers/terraform-provider-cloudfoundry/cloudfoundry/managers"
7
14
8
15
"encoding/json"
@@ -38,18 +45,16 @@ func resourceRouteServiceBinding() *schema.Resource {
38
45
ForceNew : true ,
39
46
},
40
47
},
48
+ SchemaVersion : 1 ,
49
+ MigrateState : resourceRouteServiceBindingMigrateState ,
41
50
}
42
51
}
43
52
44
- func resourceRouteServiceBindingImport (ctx context.Context , d * schema.ResourceData , meta interface {}) (res []* schema.ResourceData , err error ) {
45
- id := d .Id ()
46
- if _ , _ , err = parseID (id ); err != nil {
47
- return
48
- }
53
+ func resourceRouteServiceBindingImport (ctx context.Context , d * schema.ResourceData , meta any ) (res []* schema.ResourceData , err error ) {
49
54
return ImportReadContext (resourceRouteServiceBindingRead )(ctx , d , meta )
50
55
}
51
56
52
- func resourceRouteServiceBindingCreate (ctx context.Context , d * schema.ResourceData , meta interface {} ) diag.Diagnostics {
57
+ func resourceRouteServiceBindingCreate (ctx context.Context , d * schema.ResourceData , meta any ) diag.Diagnostics {
53
58
session := meta .(* managers.Session )
54
59
55
60
var data map [string ]interface {}
@@ -63,48 +68,116 @@ func resourceRouteServiceBindingCreate(ctx context.Context, d *schema.ResourceDa
63
68
return diag .FromErr (err )
64
69
}
65
70
}
66
- _ , err := session .ClientV2 .CreateServiceBindingRoute (serviceID , routeID , data )
71
+
72
+ jobGUID , _ , err := session .ClientGo .ServiceRouteBindings .Create (context .Background (), & resource.ServiceRouteBindingCreate {
73
+ Relationships : resource.ServiceRouteBindingRelationships {
74
+ // ServiceInstance ToOneRelationship `json:"service_instance"`
75
+ // // The route that the service instance is bound to
76
+ // Route ToOneRelationship `json:"route"`
77
+ ServiceInstance : resource.ToOneRelationship {
78
+ Data : & resource.Relationship {
79
+ GUID : serviceID ,
80
+ },
81
+ },
82
+ Route : resource.ToOneRelationship {
83
+ Data : & resource.Relationship {
84
+ GUID : routeID ,
85
+ },
86
+ },
87
+ },
88
+ })
89
+
90
+ if err != nil {
91
+ return diag .FromErr (err )
92
+ }
93
+
94
+ if jobGUID != "" {
95
+ err = session .ClientGo .Jobs .PollComplete (context .Background (), jobGUID , nil )
96
+ }
67
97
if err != nil {
68
98
return diag .FromErr (err )
69
99
}
70
100
71
- d .SetId (computeID (serviceID , routeID ))
101
+ options := client .NewServiceRouteBindingListOptions ()
102
+ options .ServiceInstanceGUIDs = client.Filter {Values : []string {serviceID }}
103
+ options .RouteGUIDs = client.Filter {Values : []string {routeID }}
104
+
105
+ routeBinding , err := session .ClientGo .ServiceRouteBindings .Single (context .Background (), options )
106
+
107
+ if err != nil {
108
+ return diag .FromErr (err )
109
+ }
110
+
111
+ d .SetId (routeBinding .GUID )
72
112
return nil
73
113
}
74
114
75
- func resourceRouteServiceBindingRead (ctx context.Context , d * schema.ResourceData , meta interface {} ) diag.Diagnostics {
115
+ func resourceRouteServiceBindingRead (ctx context.Context , d * schema.ResourceData , meta any ) diag.Diagnostics {
76
116
session := meta .(* managers.Session )
77
117
78
- serviceID , routeID , err := parseID (d .Id ())
118
+ routeServiceBinding , err := session .ClientGo .ServiceRouteBindings .Get (context .Background (), d .Id ())
119
+
79
120
if err != nil {
80
- return diag .FromErr (err )
121
+ if strings .Contains (err .Error (), "CF-ResourceNotFound" ) {
122
+ d .SetId ("" )
123
+ return nil
124
+ }
125
+ return diag .Errorf ("Error when reading routeServiceBinding with id '%s': %s" , d .Id (), err )
81
126
}
82
- routes , _ , err := session .ClientV2 .GetServiceBindingRoutes (serviceID )
127
+
128
+ d .Set ("service_instance" , routeServiceBinding .Relationships .ServiceInstance .Data .GUID )
129
+ d .Set ("route" , routeServiceBinding .Relationships .Route .Data .GUID )
130
+
131
+ return nil
132
+ }
133
+
134
+ func resourceRouteServiceBindingDelete (ctx context.Context , d * schema.ResourceData , meta any ) diag.Diagnostics {
135
+ session := meta .(* managers.Session )
136
+
137
+ jobGUID , err := session .ClientGo .ServiceRouteBindings .Delete (context .Background (), d .Id ())
138
+
83
139
if err != nil {
84
140
return diag .FromErr (err )
85
141
}
86
- found := false
87
- for _ , route := range routes {
88
- if route .GUID == routeID {
89
- found = true
90
- break
91
- }
92
- }
93
- if ! found {
94
- d .SetId ("" )
95
- return diag .Errorf ("Route '%s' not found in service instance '%s'" , routeID , serviceID )
142
+ if jobGUID != "" {
143
+ err = session .ClientGo .Jobs .PollComplete (context .Background (), jobGUID , nil )
96
144
}
145
+ return diag .FromErr (err )
146
+ }
97
147
98
- d .Set ("service_instance" , serviceID )
99
- d .Set ("route" , routeID )
100
- return nil
148
+ func resourceRouteServiceBindingMigrateState (v int , inst * terraform.InstanceState , meta any ) (* terraform.InstanceState , error ) {
149
+ switch v {
150
+ case 0 :
151
+ log .Println ("[INFO] Found Route Service Binding State v0; migrating to v1: change ID from routeID:serviceID to routeServiceBindingID." )
152
+ return migrateRouteServiceBindingStateV0toV1ChangeID (inst , meta )
153
+ default :
154
+ return inst , fmt .Errorf ("Unexpected schema version: %d" , v )
155
+ }
101
156
}
102
157
103
- func resourceRouteServiceBindingDelete ( ctx context. Context , d * schema. ResourceData , meta interface {}) diag. Diagnostics {
158
+ func migrateRouteServiceBindingStateV0toV1ChangeID ( inst * terraform. InstanceState , meta any ) ( * terraform. InstanceState , error ) {
104
159
session := meta .(* managers.Session )
105
160
106
- serviceID := d .Get ("service_instance" ).(string )
107
- routeID := d .Get ("route" ).(string )
108
- _ , err := session .ClientV2 .DeleteServiceBindingRoute (serviceID , routeID )
109
- return diag .FromErr (err )
161
+ if inst .Empty () {
162
+ log .Println ("[DEBUG] Empty RouteServiceBinding; nothing to migrate." )
163
+ return inst , nil
164
+ }
165
+
166
+ log .Printf ("[DEBUG] Attributes before migration: %#v" , inst .Attributes )
167
+ options := client .NewServiceRouteBindingListOptions ()
168
+ options .ServiceInstanceGUIDs = client.Filter {Values : []string {inst .Attributes ["service_instance" ]}}
169
+ options .RouteGUIDs = client.Filter {Values : []string {inst .Attributes ["route" ]}}
170
+
171
+ routeBinding , err := session .ClientGo .ServiceRouteBindings .Single (context .Background (), options )
172
+
173
+ if err != nil {
174
+ log .Println ("[DEBUG] Failed to migrate RouteServiceBinding id: did not find the route service binding." )
175
+ return inst , err
176
+ }
177
+
178
+ inst .Attributes ["id" ] = routeBinding .GUID
179
+
180
+ log .Printf ("[DEBUG] Attributes after migration: %#v" , inst .Attributes )
181
+
182
+ return inst , nil
110
183
}
0 commit comments