Skip to content

Commit 26444db

Browse files
committed
route service binding resource: migrate to ccv3
1 parent a0e1c43 commit 26444db

File tree

1 file changed

+103
-30
lines changed

1 file changed

+103
-30
lines changed

cloudfoundry/resource_cf_route_service_binding.go

Lines changed: 103 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,14 @@ package cloudfoundry
22

33
import (
44
"context"
5+
"fmt"
6+
"log"
7+
"strings"
8+
9+
"github.com/cloudfoundry/go-cfclient/v3/client"
10+
"github.com/cloudfoundry/go-cfclient/v3/resource"
511
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
12+
"github.com/hashicorp/terraform-plugin-sdk/v2/terraform"
613
"github.com/terraform-providers/terraform-provider-cloudfoundry/cloudfoundry/managers"
714

815
"encoding/json"
@@ -38,18 +45,16 @@ func resourceRouteServiceBinding() *schema.Resource {
3845
ForceNew: true,
3946
},
4047
},
48+
SchemaVersion: 1,
49+
MigrateState: resourceRouteServiceBindingMigrateState,
4150
}
4251
}
4352

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) {
4954
return ImportReadContext(resourceRouteServiceBindingRead)(ctx, d, meta)
5055
}
5156

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 {
5358
session := meta.(*managers.Session)
5459

5560
var data map[string]interface{}
@@ -63,48 +68,116 @@ func resourceRouteServiceBindingCreate(ctx context.Context, d *schema.ResourceDa
6368
return diag.FromErr(err)
6469
}
6570
}
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+
}
6797
if err != nil {
6898
return diag.FromErr(err)
6999
}
70100

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)
72112
return nil
73113
}
74114

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 {
76116
session := meta.(*managers.Session)
77117

78-
serviceID, routeID, err := parseID(d.Id())
118+
routeServiceBinding, err := session.ClientGo.ServiceRouteBindings.Get(context.Background(), d.Id())
119+
79120
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)
81126
}
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+
83139
if err != nil {
84140
return diag.FromErr(err)
85141
}
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)
96144
}
145+
return diag.FromErr(err)
146+
}
97147

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+
}
101156
}
102157

103-
func resourceRouteServiceBindingDelete(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
158+
func migrateRouteServiceBindingStateV0toV1ChangeID(inst *terraform.InstanceState, meta any) (*terraform.InstanceState, error) {
104159
session := meta.(*managers.Session)
105160

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
110183
}

0 commit comments

Comments
 (0)