Skip to content
This repository was archived by the owner on Jul 29, 2026. It is now read-only.

Commit 1a10203

Browse files
authored
Merge pull request #429 from cloudfoundry-community/bugfix/route
Handle remove random_port field #428
2 parents 9e274f9 + 38704a3 commit 1a10203

16 files changed

Lines changed: 180 additions & 82 deletions

cloudfoundry/migrate_bits.go

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,6 @@ package cloudfoundry
33
import (
44
"crypto/tls"
55
"fmt"
6-
"github.com/ArthurHlt/zipper"
7-
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
8-
"github.com/hashicorp/terraform-plugin-sdk/v2/terraform"
9-
"github.com/terraform-providers/terraform-provider-cloudfoundry/cloudfoundry/managers"
106
"io"
117
"io/ioutil"
128
"log"
@@ -15,6 +11,11 @@ import (
1511
"os"
1612
"path/filepath"
1713
"strings"
14+
15+
"github.com/ArthurHlt/zipper"
16+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
17+
"github.com/hashicorp/terraform-plugin-sdk/v2/terraform"
18+
"github.com/terraform-providers/terraform-provider-cloudfoundry/cloudfoundry/managers"
1819
)
1920

2021
var folderBits = "bits"
@@ -150,7 +151,7 @@ func migrateBitsStateV2toV3(is *terraform.InstanceState, meta interface{}) (*ter
150151
return is, err
151152
}
152153
git := make(map[string]interface{})
153-
gitElems := getListOfStructs(result.Value)
154+
gitElems := GetListOfStructs(result.Value)
154155
if len(gitElems) > 0 {
155156
git = gitElems[0]
156157
}
@@ -160,7 +161,7 @@ func migrateBitsStateV2toV3(is *terraform.InstanceState, meta interface{}) (*ter
160161
return is, err
161162
}
162163
github := make(map[string]interface{})
163-
githubElems := getListOfStructs(result.Value)
164+
githubElems := GetListOfStructs(result.Value)
164165
if len(githubElems) > 0 {
165166
github = githubElems[0]
166167
}
@@ -169,7 +170,7 @@ func migrateBitsStateV2toV3(is *terraform.InstanceState, meta interface{}) (*ter
169170
if err != nil {
170171
return is, err
171172
}
172-
addContents := getListOfStructs(result.Value)
173+
addContents := GetListOfStructs(result.Value)
173174
if len(addContents) > 0 {
174175
log.Printf("[WARN] Non-empty add_content attribute found. Skipping, but you might wanna migrate it's contentns manually: %#v", addContents)
175176
}

cloudfoundry/provider.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import (
55
"strings"
66

77
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
8-
98
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
109
"github.com/terraform-providers/terraform-provider-cloudfoundry/cloudfoundry/managers"
1110
)
@@ -132,7 +131,7 @@ func Provider() *schema.Provider {
132131
"cloudfoundry_service_key": resourceServiceKey(),
133132
"cloudfoundry_user_provided_service": resourceUserProvidedService(),
134133
"cloudfoundry_buildpack": resourceBuildpack(),
135-
"cloudfoundry_route": resourceRoute(),
134+
"cloudfoundry_route": ResourceRoute(),
136135
"cloudfoundry_route_service_binding": resourceRouteServiceBinding(),
137136
"cloudfoundry_app": resourceApp(),
138137
"cloudfoundry_isolation_segment": resourceSegment(),

cloudfoundry/resource_cf_app.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -703,8 +703,8 @@ func resourceAppDelete(ctx context.Context, d *schema.ResourceData, meta interfa
703703
}
704704

705705
err = PollAsyncJob(PollingConfig{
706-
session: session,
707-
jobURL: jobURL,
706+
Session: session,
707+
JobURL: jobURL,
708708
})
709709
return diag.FromErr(err)
710710
}

cloudfoundry/resource_cf_app_migrate.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,7 @@ func migrateAppStateV3toV4(is *terraform.InstanceState, meta interface{}) (*terr
152152
bindings := make([]map[string]interface{}, 0)
153153
result, err = reader.ReadField([]string{"service_binding"})
154154
if err == nil && result.Exists {
155-
oldBindings := getListOfStructs(result.Value)
155+
oldBindings := GetListOfStructs(result.Value)
156156
for _, b := range oldBindings {
157157
bindings = append(bindings, map[string]interface{}{
158158
"service_instance": b["service_instance"],
@@ -220,7 +220,7 @@ func migrateAppStateV2toV3(is *terraform.InstanceState, meta interface{}) (*terr
220220
return is, err
221221
}
222222
if result.Exists {
223-
oldRoute := getListOfStructs(result.Value)
223+
oldRoute := GetListOfStructs(result.Value)
224224
if len(oldRoute) > 0 && oldRoute[0]["default_route_mapping_id"].(string) != "" {
225225
routes = append(routes, map[string]interface{}{
226226
"route": oldRoute[0]["default_route_mapping_id"].(string),
@@ -231,7 +231,7 @@ func migrateAppStateV2toV3(is *terraform.InstanceState, meta interface{}) (*terr
231231

232232
result, err = reader.ReadField([]string{"routes"})
233233
if err == nil && result.Exists {
234-
oldRoutes := getListOfStructs(result.Value)
234+
oldRoutes := GetListOfStructs(result.Value)
235235
for _, r := range oldRoutes {
236236
if port, ok := r["port"]; ok && port.(int) > 0 {
237237
routes = append(routes, map[string]interface{}{
@@ -252,7 +252,7 @@ func migrateAppStateV2toV3(is *terraform.InstanceState, meta interface{}) (*terr
252252
bindings := make([]map[string]interface{}, 0)
253253
result, err = reader.ReadField([]string{"service_binding"})
254254
if err == nil && result.Exists {
255-
oldBindings := getListOfStructs(result.Value)
255+
oldBindings := GetListOfStructs(result.Value)
256256
for _, b := range oldBindings {
257257
bindings = append(bindings, map[string]interface{}{
258258
"service_instance": b["service_instance"],

cloudfoundry/resource_cf_app_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1202,7 +1202,7 @@ func validateRouteMappings(attributes map[string]string, routeMappings []map[str
12021202
if err != nil {
12031203
return err
12041204
}
1205-
routesTf := getListOfStructs(result.Value)
1205+
routesTf := GetListOfStructs(result.Value)
12061206
for _, routeTf := range routesTf {
12071207
match := func(object interface{}) bool {
12081208
routeMapping := object.(map[string]interface{})

cloudfoundry/resource_cf_domain_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,7 @@ func checkShareDomainExists(resource string) resource.TestCheckFunc {
162162
return NotFound
163163
}
164164
if id != domains[0].GUID {
165-
return fmt.Errorf("expecting domain guid to be '%s' but got '%session'", id, domains[0].GUID)
165+
return fmt.Errorf("expecting domain guid to be '%s' but got '%s'", id, domains[0].GUID)
166166
}
167167
return nil
168168
}
@@ -192,7 +192,7 @@ func checkPrivateDomainExists(resource string) resource.TestCheckFunc {
192192
return NotFound
193193
}
194194
if id != domains[0].GUID {
195-
return fmt.Errorf("expecting domain guid to be '%s' but got '%session'", id, domains[0].GUID)
195+
return fmt.Errorf("expecting domain guid to be '%s' but got '%s'", id, domains[0].GUID)
196196
}
197197
return nil
198198
}

cloudfoundry/resource_cf_network_policy.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package cloudfoundry
33
import (
44
"context"
55
"fmt"
6+
67
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
78

89
"code.cloudfoundry.org/cfnetworking-cli-api/cfnetworking/cfnetv1"
@@ -77,7 +78,7 @@ func resourceNetworkPolicyCreate(ctx context.Context, d *schema.ResourceData, me
7778
return diag.FromErr(err)
7879
}
7980
d.SetId(guid)
80-
policiesTf := getListOfStructs(d.Get("policy"))
81+
policiesTf := GetListOfStructs(d.Get("policy"))
8182
err = session.NetClient.CreatePolicies(resourceNetworkPoliciesToPolicies(policiesTf))
8283
if err != nil {
8384
return diag.FromErr(err)
@@ -88,7 +89,7 @@ func resourceNetworkPolicyCreate(ctx context.Context, d *schema.ResourceData, me
8889
func resourceNetworkPolicyRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
8990
session := meta.(*managers.Session)
9091

91-
policiesTf := getListOfStructs(d.Get("policy"))
92+
policiesTf := GetListOfStructs(d.Get("policy"))
9293

9394
idsMap := make(map[string]bool)
9495
for _, p := range policiesTf {
@@ -151,7 +152,7 @@ func resourceNetworkPolicyUpdate(ctx context.Context, d *schema.ResourceData, me
151152

152153
func resourceNetworkPolicyDelete(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
153154
session := meta.(*managers.Session)
154-
policiesTf := getListOfStructs(d.Get("policy"))
155+
policiesTf := GetListOfStructs(d.Get("policy"))
155156
err := session.NetClient.RemovePolicies(resourceNetworkPoliciesToPolicies(policiesTf))
156157
if err != nil {
157158
return diag.FromErr(err)

cloudfoundry/resource_cf_network_policy_test.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
package cloudfoundry
22

33
import (
4-
"code.cloudfoundry.org/cfnetworking-cli-api/cfnetworking/cfnetv1"
54
"fmt"
5+
"testing"
6+
7+
"code.cloudfoundry.org/cfnetworking-cli-api/cfnetworking/cfnetv1"
68
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
79
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
810
"github.com/hashicorp/terraform-plugin-sdk/v2/terraform"
911
"github.com/terraform-providers/terraform-provider-cloudfoundry/cloudfoundry/managers"
10-
"testing"
1112
)
1213

1314
const netPolicyResource = `
@@ -196,7 +197,7 @@ func testAccCheckNetworkPoliciesExists(ref string, validate func() error) resour
196197
if err != nil {
197198
return err
198199
}
199-
policiesTf := getListOfStructs(result.Value)
200+
policiesTf := GetListOfStructs(result.Value)
200201
idsMap := make(map[string]bool)
201202
for _, p := range policiesTf {
202203
idsMap[p["source_app"].(string)] = true

cloudfoundry/resource_cf_route.go

Lines changed: 32 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,8 @@ import (
55
"fmt"
66
"net/http"
77

8-
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
9-
108
"github.com/cenkalti/backoff/v4"
9+
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
1110

1211
"code.cloudfoundry.org/cli/api/cloudcontroller/ccerror"
1312
"code.cloudfoundry.org/cli/api/cloudcontroller/ccv3"
@@ -17,50 +16,57 @@ import (
1716
"github.com/terraform-providers/terraform-provider-cloudfoundry/cloudfoundry/managers"
1817
)
1918

20-
func resourceRoute() *schema.Resource {
19+
func ResourceRoute() *schema.Resource {
2120

2221
return &schema.Resource{
23-
22+
SchemaVersion: 1,
2423
CreateContext: resourceRouteCreate,
2524
ReadContext: resourceRouteRead,
2625
UpdateContext: resourceRouteUpdate,
2726
DeleteContext: resourceRouteDelete,
27+
StateUpgraders: []schema.StateUpgrader{
28+
{
29+
Type: ResourceRouteV0().CoreConfigSchema().ImpliedType(),
30+
Upgrade: patchRouteV0,
31+
Version: 0,
32+
},
33+
},
2834

2935
Importer: &schema.ResourceImporter{
3036
StateContext: ImportReadContext(resourceRouteRead),
3137
},
3238

3339
Schema: map[string]*schema.Schema{
3440

35-
"domain": &schema.Schema{
41+
"domain": {
3642
Type: schema.TypeString,
3743
Required: true,
3844
ForceNew: true,
3945
},
40-
"space": &schema.Schema{
46+
"space": {
4147
Type: schema.TypeString,
4248
Required: true,
4349
ForceNew: true,
4450
},
45-
"hostname": &schema.Schema{
51+
"hostname": {
4652
Type: schema.TypeString,
4753
Optional: true,
4854
},
49-
"port": &schema.Schema{
55+
"port": {
5056
Type: schema.TypeInt,
5157
Optional: true,
5258
Computed: true,
5359
},
54-
"path": &schema.Schema{
60+
"path": {
5561
Type: schema.TypeString,
5662
Optional: true,
5763
ForceNew: true,
5864
},
59-
"endpoint": &schema.Schema{
65+
"endpoint": {
6066
Type: schema.TypeString,
6167
Computed: true,
6268
},
63-
"target": &schema.Schema{
69+
"target": {
6470
Type: schema.TypeSet,
6571
Set: func(v interface{}) int {
6672
elem := v.(map[string]interface{})
@@ -73,11 +79,11 @@ func resourceRoute() *schema.Resource {
7379
Optional: true,
7480
Elem: &schema.Resource{
7581
Schema: map[string]*schema.Schema{
76-
"app": &schema.Schema{
82+
"app": {
7783
Type: schema.TypeString,
7884
Required: true,
7985
},
80-
"port": &schema.Schema{
86+
"port": {
8187
Type: schema.TypeInt,
8288
ConfigMode: schema.SchemaConfigModeAttr,
8389
Optional: true,
@@ -91,15 +97,15 @@ func resourceRoute() *schema.Resource {
9197
}
9298

9399
func setRouteStateV3(session *managers.Session, route resources.Route, d *schema.ResourceData) (err error) {
94-
d.Set("domain", route.DomainGUID)
95-
d.Set("space", route.SpaceGUID)
96-
d.Set("hostname", route.Host)
100+
_ = d.Set("domain", route.DomainGUID)
101+
_ = d.Set("space", route.SpaceGUID)
102+
_ = d.Set("hostname", route.Host)
97103

98104
if route.Port != 0 {
99-
d.Set("port", route.Port)
105+
_ = d.Set("port", route.Port)
100106
}
101107

102-
d.Set("path", route.Path)
108+
_ = d.Set("path", route.Path)
103109

104110
// In v3 shared domains and private domains are managed by the same endpoint, differenciating on whether
105111
// a relationship with an org is set
@@ -213,10 +219,10 @@ func resourceRouteCreate(ctx context.Context, d *schema.ResourceData, meta inter
213219
// Separate call to add destinations
214220
if v, ok := d.GetOk("target"); ok {
215221
var t interface{}
216-
if t, err = addRouteDestinationV3(route.GUID, getListOfStructs(v.(*schema.Set).List()), session); err != nil {
222+
if t, err = addRouteDestinationV3(route.GUID, GetListOfStructs(v.(*schema.Set).List()), session); err != nil {
217223
return diag.FromErr(err)
218224
}
219-
d.Set("target", t)
225+
_ = d.Set("target", t)
220226
}
221227

222228
d.SetId(route.GUID)
@@ -299,7 +305,7 @@ func resourceRouteUpdate(ctx context.Context, d *schema.ResourceData, meta inter
299305
var route = resources.Route{}
300306

301307
if targets, ok := d.GetOk("target"); ok {
302-
err := removeRouteDestinationV3(d.Id(), getListOfStructs(targets.(*schema.Set).List()), session)
308+
err := removeRouteDestinationV3(d.Id(), GetListOfStructs(targets.(*schema.Set).List()), session)
303309
if err != nil {
304310
return diag.FromErr(err)
305311
}
@@ -353,10 +359,10 @@ func resourceRouteUpdate(ctx context.Context, d *schema.ResourceData, meta inter
353359
// Separate call to add destinations
354360
if v, ok := d.GetOk("target"); ok {
355361
var t interface{}
356-
if t, err = addRouteDestinationV3(route.GUID, getListOfStructs(v.(*schema.Set).List()), session); err != nil {
362+
if t, err = addRouteDestinationV3(route.GUID, GetListOfStructs(v.(*schema.Set).List()), session); err != nil {
357363
return diag.FromErr(err)
358364
}
359-
d.Set("target", t)
365+
_ = d.Set("target", t)
360366
}
361367

362368
d.SetId(route.GUID)
@@ -369,7 +375,7 @@ func resourceRouteDelete(ctx context.Context, d *schema.ResourceData, meta inter
369375
session := meta.(*managers.Session)
370376

371377
if targets, ok := d.GetOk("target"); ok {
372-
err := removeRouteDestinationV3(d.Id(), getListOfStructs(targets.(*schema.Set).List()), session)
378+
err := removeRouteDestinationV3(d.Id(), GetListOfStructs(targets.(*schema.Set).List()), session)
373379
if err != nil {
374380
return diag.FromErr(err)
375381
}
@@ -381,8 +387,8 @@ func resourceRouteDelete(ctx context.Context, d *schema.ResourceData, meta inter
381387
}
382388

383389
err = PollAsyncJob(PollingConfig{
384-
session: session,
385-
jobURL: jobURL,
390+
Session: session,
391+
JobURL: jobURL,
386392
})
387393
return diag.FromErr(err)
388394
}

cloudfoundry/resource_cf_route_test.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
package cloudfoundry
22

33
import (
4+
"fmt"
5+
"testing"
6+
47
"code.cloudfoundry.org/cli/api/cloudcontroller/ccv2"
58
"code.cloudfoundry.org/cli/api/cloudcontroller/ccv2/constant"
6-
"fmt"
79
"github.com/terraform-providers/terraform-provider-cloudfoundry/cloudfoundry/managers"
8-
"testing"
910

1011
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
1112
"github.com/hashicorp/terraform-plugin-sdk/v2/terraform"

0 commit comments

Comments
 (0)