Skip to content

Commit ea11e63

Browse files
sleungcysleungcy-sap
andauthored
adding cloudfoundry_service_instance_sharing (#555)
* adding cf_service_instance_sharing * adding docs --------- Co-authored-by: sleungcy-sap <[email protected]>
1 parent 096bb91 commit ea11e63

File tree

4 files changed

+220
-0
lines changed

4 files changed

+220
-0
lines changed

cloudfoundry/provider.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,7 @@ func Provider() *schema.Provider {
142142
"cloudfoundry_service_instance": resourceServiceInstance(),
143143
"cloudfoundry_service_key": resourceServiceKey(),
144144
"cloudfoundry_user_provided_service": resourceUserProvidedService(),
145+
"cloudfoundry_service_instance_sharing": resourceServiceInstanceSharing(),
145146
"cloudfoundry_buildpack": resourceBuildpack(),
146147
"cloudfoundry_route": ResourceRoute(),
147148
"cloudfoundry_route_service_binding": resourceRouteServiceBinding(),
Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
package cloudfoundry
2+
3+
import (
4+
"context"
5+
6+
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
7+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
8+
"github.com/terraform-providers/terraform-provider-cloudfoundry/cloudfoundry/managers"
9+
)
10+
11+
func resourceServiceInstanceSharing() *schema.Resource {
12+
return &schema.Resource{
13+
CreateContext: resourceServiceInstanceSharingCreate,
14+
ReadContext: resourceServiceInstanceSharingRead,
15+
DeleteContext: resourceServiceInstanceSharingDelete,
16+
17+
Schema: map[string]*schema.Schema{
18+
"service_instance_id": {
19+
Type: schema.TypeString,
20+
Required: true,
21+
ForceNew: true,
22+
Description: "The ID of the service instance to share",
23+
},
24+
"space_id": {
25+
Type: schema.TypeString,
26+
Required: true,
27+
ForceNew: true,
28+
Description: "The ID of the space to share the service instance with, the space can be in the same or different org",
29+
},
30+
},
31+
}
32+
}
33+
34+
func resourceServiceInstanceSharingRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
35+
session := meta.(*managers.Session)
36+
37+
serviceID, spaceID, err := parseID(d.Id())
38+
if err != nil {
39+
return diag.FromErr(err)
40+
}
41+
42+
spaceWithOrganizationList, _, err := session.ClientV3.GetServiceInstanceSharedSpaces(serviceID)
43+
44+
if err != nil {
45+
return diag.FromErr(err)
46+
}
47+
48+
found := false
49+
for _, spaceWithOrganization := range spaceWithOrganizationList {
50+
if spaceWithOrganization.SpaceGUID == spaceID {
51+
found = true
52+
break
53+
}
54+
}
55+
56+
if !found {
57+
d.SetId("")
58+
return nil
59+
}
60+
61+
d.Set("service_instance_id", serviceID)
62+
d.Set("space_id", spaceID)
63+
return nil
64+
}
65+
66+
func resourceServiceInstanceSharingCreate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
67+
session := meta.(*managers.Session)
68+
serviceID := d.Get("service_instance_id").(string)
69+
spaceID := d.Get("space_id").(string)
70+
71+
spacesGUIDList, _, err := session.ClientV3.ShareServiceInstanceToSpaces(serviceID, []string{spaceID})
72+
73+
if err != nil {
74+
return diag.FromErr(err)
75+
}
76+
77+
if len(spacesGUIDList.GUIDs) < 1 {
78+
return diag.Errorf("failed to share service instance %s to space %s", serviceID, spaceID)
79+
}
80+
81+
d.SetId(computeID(serviceID, spaceID))
82+
return nil
83+
}
84+
85+
func resourceServiceInstanceSharingDelete(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
86+
session := meta.(*managers.Session)
87+
serviceID := d.Get("service_instance_id").(string)
88+
spaceID := d.Get("space_id").(string)
89+
_, err := session.ClientV3.UnshareServiceInstanceFromSpace(serviceID, spaceID)
90+
91+
return diag.FromErr(err)
92+
}
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
package cloudfoundry
2+
3+
import (
4+
"fmt"
5+
"testing"
6+
7+
guuid "github.com/google/uuid"
8+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
9+
"github.com/hashicorp/terraform-plugin-sdk/v2/terraform"
10+
)
11+
12+
const serviceInstanceSharing = `
13+
data "cloudfoundry_service" "test-service" {
14+
name = "%s"
15+
}
16+
17+
data "cloudfoundry_user" "u"{
18+
name = "%s"
19+
org_id = "%s"
20+
}
21+
22+
resource "cloudfoundry_space" "test-space-1" {
23+
name = "space-1-%s"
24+
org = "%s"
25+
managers = [ data.cloudfoundry_user.u.id ]
26+
developers = [ data.cloudfoundry_user.u.id ]
27+
auditors = [ data.cloudfoundry_user.u.id ]
28+
}
29+
30+
resource "cloudfoundry_space" "test-space-2" {
31+
name = "space-2-%s"
32+
org = "%s"
33+
managers = [ data.cloudfoundry_user.u.id ]
34+
developers = [ data.cloudfoundry_user.u.id ]
35+
auditors = [ data.cloudfoundry_user.u.id ]
36+
}
37+
38+
resource "cloudfoundry_service_instance" "test-service-instance" {
39+
name = "test-service-instance-sharing-%s"
40+
space = resource.cloudfoundry_space.test-space-1.id
41+
service_plan = data.cloudfoundry_service.test-service.service_plans["%s"]
42+
}
43+
44+
resource "cloudfoundry_service_instance_sharing" "test-service-instance-sharing" {
45+
service_instance_id = resource.cloudfoundry_service_instance.test-service-instance.id
46+
space_id = resource.cloudfoundry_space.test-space-2.id
47+
}
48+
`
49+
50+
func TestAccResServiceInstanceSharing_normal(t *testing.T) {
51+
t.Parallel()
52+
orgId, _ := defaultTestOrg(t)
53+
54+
serviceName, _, servicePlan := getTestServiceBrokers(t)
55+
userName := testSession().Config.User
56+
57+
testId := guuid.New().String()
58+
59+
ref := "cloudfoundry_service_instance.test-service-instance"
60+
61+
resource.Test(t,
62+
resource.TestCase{
63+
PreCheck: func() { testAccPreCheck(t) },
64+
ProviderFactories: testAccProvidersFactories,
65+
CheckDestroy: resource.ComposeTestCheckFunc(
66+
testAccCheckServiceInstanceDestroyed([]string{"test-service-instance-sharing-%s"}, ref),
67+
testAccCheckSpaceDestroyed(fmt.Sprintf("space-1-%s", testId)),
68+
testAccCheckSpaceDestroyed(fmt.Sprintf("space-2-%s", testId)),
69+
),
70+
Steps: []resource.TestStep{
71+
{
72+
Config: fmt.Sprintf(serviceInstanceSharing, serviceName, userName, orgId, testId, orgId, testId, orgId, testId, servicePlan),
73+
Check: resource.ComposeTestCheckFunc(
74+
testAccCheckServiceInstanceExists(ref),
75+
func(s *terraform.State) error {
76+
for _, rs := range s.RootModule().Resources {
77+
if rs.Type == "cloudfoundry_service_instance_sharing" {
78+
return nil
79+
}
80+
}
81+
return fmt.Errorf("resource 'cloudfoundry_service_instance_sharing' not found in terraform state")
82+
},
83+
),
84+
},
85+
},
86+
})
87+
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
---
2+
layout: "cloudfoundry"
3+
page_title: "Cloud Foundry: cloudfoundry_service_instance_sharing"
4+
sidebar_current: "docs-cf-resource-service-instance-sharing"
5+
description: |- Sharing a service instance to another space.
6+
---
7+
8+
# cloudfoundry\_service\_instance\_sharing
9+
10+
Sharing a service instance to another space [Sharing Service Instances](https://docs.cloudfoundry.org/devguide/services/sharing-instances.html) within spaces.
11+
12+
## Example Usage
13+
14+
The following example shares a specific service instance to the given space.
15+
16+
```hcl
17+
data "cloudfoundry_service_instance" "my-redis" {
18+
name_or_id = "my-redis"
19+
space = cloudfoundry_space.dev-1.id
20+
}
21+
22+
resource "cloudfoundry_service_instance_sharing" "share-to-dev-2" {
23+
service_instance_id = data.cloudfoundry_service_instance.my-redis.id
24+
space_id = cloudfoundry_space.dev-2.id
25+
}
26+
```
27+
28+
## Argument Reference
29+
30+
The following arguments are supported:
31+
32+
* `service_instance_id` - (Required, String) The ID of the service instance to share.
33+
* `space_id` - (Required, String) The ID of the space to share the service instance with, the space can be in the same or different org.
34+
35+
## Import
36+
37+
Existing Instance Shared can be imported using the composite `id` formed
38+
with service instance's GUID and space's GUID, seperated by a forward slash '/'.
39+
40+
example: `bb4ea411-service-instance-guid/820b9339-space-guid`

0 commit comments

Comments
 (0)