Skip to content

Commit ddf9018

Browse files
sleungcysleungcy-sap
andauthored
data_source_cf_app upgrade (#545)
Co-authored-by: sleungcy-sap <[email protected]>
1 parent f2012bf commit ddf9018

File tree

2 files changed

+221
-23
lines changed

2 files changed

+221
-23
lines changed

cloudfoundry/data_source_cf_app.go

Lines changed: 93 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@ package cloudfoundry
33
import (
44
"context"
55

6-
"code.cloudfoundry.org/cli/api/cloudcontroller/ccv2"
6+
"code.cloudfoundry.org/cli/api/cloudcontroller/ccv3"
7+
"code.cloudfoundry.org/cli/api/cloudcontroller/ccv3/constant"
8+
"code.cloudfoundry.org/cli/resources"
79
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
810
uuid "github.com/satori/go.uuid"
911
"github.com/terraform-providers/terraform-provider-cloudfoundry/cloudfoundry/managers"
@@ -51,6 +53,12 @@ func dataSourceApp() *schema.Resource {
5153
Type: schema.TypeString,
5254
Computed: true,
5355
},
56+
"buildpacks": &schema.Schema{
57+
Type: schema.TypeList,
58+
Optional: true,
59+
Elem: &schema.Schema{Type: schema.TypeString},
60+
ConflictsWith: []string{"buildpack"},
61+
},
5462
"command": &schema.Schema{
5563
Type: schema.TypeString,
5664
Computed: true,
@@ -96,45 +104,107 @@ func dataSourceAppRead(ctx context.Context, d *schema.ResourceData, meta interfa
96104
var (
97105
nameOrId string
98106
space string
99-
app ccv2.Application
107+
app resources.Application
100108
err error
101109
)
102110

103111
nameOrId = d.Get("name_or_id").(string)
104112
space = d.Get("space").(string)
105113

106114
isUUID := uuid.FromStringOrNil(nameOrId)
115+
116+
var query []ccv3.Query
117+
107118
if uuid.Equal(isUUID, uuid.Nil) {
108-
apps, _, err := session.ClientV2.GetApplications(ccv2.FilterByName(nameOrId), ccv2.FilterBySpace(space))
109-
if err != nil {
110-
return diag.FromErr(err)
111-
}
112-
if len(apps) == 0 {
113-
return diag.FromErr(NotFound)
119+
query = []ccv3.Query{
120+
{
121+
Key: ccv3.NameFilter,
122+
Values: []string{nameOrId},
123+
},
124+
{
125+
Key: ccv3.SpaceGUIDFilter,
126+
Values: []string{space},
127+
},
114128
}
115-
app = apps[0]
116129
} else {
117-
app, _, err = session.ClientV2.GetApplication(nameOrId)
118-
if err != nil {
119-
return diag.FromErr(err)
130+
query = []ccv3.Query{
131+
{
132+
Key: ccv3.GUIDFilter,
133+
Values: []string{nameOrId},
134+
},
135+
{
136+
Key: ccv3.SpaceGUIDFilter,
137+
Values: []string{space},
138+
},
120139
}
121140
}
122141

142+
apps, _, err := session.ClientV3.GetApplications(query...)
143+
144+
if err != nil {
145+
return diag.FromErr(err)
146+
}
147+
148+
if len(apps) == 0 {
149+
return diag.FromErr(NotFound)
150+
}
151+
app = apps[0]
152+
123153
d.SetId(app.GUID)
124154
d.Set("name", app.Name)
125155
d.Set("space", app.SpaceGUID)
126-
d.Set("instances", app.Instances.Value)
127-
d.Set("memory", app.Memory.Value)
128-
d.Set("disk_quota", app.DiskQuota.Value)
129-
d.Set("stack", app.StackGUID)
130-
d.Set("buildpack", app.Buildpack.Value)
131-
d.Set("command", app.Command.Value)
132-
d.Set("enable_ssh", app.EnableSSH.Value)
133-
d.Set("environment", app.EnvironmentVariables)
156+
157+
proc, _, err := session.ClientV3.GetApplicationProcessByType(d.Id(), constant.ProcessTypeWeb)
158+
159+
if err != nil {
160+
return diag.FromErr(err)
161+
}
162+
163+
if proc.Instances.IsSet {
164+
d.Set("instances", proc.Instances.Value)
165+
}
166+
167+
if proc.MemoryInMB.IsSet {
168+
d.Set("memory", proc.MemoryInMB.Value)
169+
}
170+
if proc.DiskInMB.IsSet {
171+
d.Set("disk_quota", proc.DiskInMB.Value)
172+
}
173+
174+
d.Set("stack", app.StackName)
175+
if bpkg := app.LifecycleBuildpacks; len(bpkg) > 0 {
176+
d.Set("buildpacks", bpkg)
177+
d.Set("buildpack", bpkg[0])
178+
}
179+
180+
if proc.Command.IsSet {
181+
d.Set("command", proc.Command.Value)
182+
}
183+
184+
enableSSH, _, err := session.ClientV3.GetAppFeature(d.Id(), "ssh")
185+
if err != nil {
186+
return diag.FromErr(err)
187+
}
188+
d.Set("enable_ssh", enableSSH.Enabled)
189+
190+
env, err := session.BitsManager.GetAppEnvironmentVariables(d.Id())
191+
if err != nil {
192+
return diag.FromErr(err)
193+
}
194+
195+
d.Set("environment", env)
196+
134197
d.Set("state", app.State)
135-
d.Set("health_check_http_endpoint", app.HealthCheckHTTPEndpoint)
136-
d.Set("health_check_type", app.HealthCheckType)
137-
d.Set("health_check_timeout", app.HealthCheckTimeout)
198+
199+
if proc.HealthCheckEndpoint != "" {
200+
d.Set("health_check_http_endpoint", proc.HealthCheckEndpoint)
201+
}
202+
if proc.HealthCheckTimeout != 0 {
203+
d.Set("health_check_timeout", proc.HealthCheckTimeout)
204+
}
205+
if proc.HealthCheckType != "" {
206+
d.Set("health_check_type", proc.HealthCheckType)
207+
}
138208

139209
err = metadataRead(appMetadata, d, meta, true)
140210
if err != nil {
Lines changed: 128 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,128 @@
1+
package cloudfoundry
2+
3+
import (
4+
"fmt"
5+
"testing"
6+
7+
"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 appDataSource = `
13+
14+
data "cloudfoundry_org" "org" {
15+
name = "%s"
16+
}
17+
data "cloudfoundry_space" "space" {
18+
name = "%s"
19+
org = "${data.cloudfoundry_org.org.id}"
20+
}
21+
22+
resource "cloudfoundry_app" "dummy-app" {
23+
name = "%s"
24+
space = "${data.cloudfoundry_space.space.id}"
25+
26+
instances = 1
27+
health_check_type = "port"
28+
health_check_timeout = 180
29+
30+
stack = "cflinuxfs4"
31+
32+
buildpacks = [
33+
"staticfile_buildpack",
34+
"binary_buildpack"
35+
36+
]
37+
38+
enable_ssh = true
39+
40+
environment = {
41+
"UPDATED" = "true"
42+
"APPNAME" = "cloudfoundry_app_test"
43+
}
44+
45+
path = "%s"
46+
}
47+
48+
data "cloudfoundry_app" "dummy-app-by-id" {
49+
name_or_id = cloudfoundry_app.dummy-app.id
50+
space = "${data.cloudfoundry_space.space.id}"
51+
depends_on = [ cloudfoundry_app.dummy-app ]
52+
}
53+
54+
data "cloudfoundry_app" "dummy-app-by-name" {
55+
name_or_id = cloudfoundry_app.dummy-app.name
56+
space = "${data.cloudfoundry_space.space.id}"
57+
depends_on = [ cloudfoundry_app.dummy-app ]
58+
}
59+
60+
output "dummy"{
61+
value = [data.cloudfoundry_app.dummy-app-by-id.id, data.cloudfoundry_app.dummy-app-by-name.id]
62+
}
63+
`
64+
65+
func TestAccDataSourceApp_normal(t *testing.T) {
66+
_, orgName := defaultTestOrg(t)
67+
_, spaceName := defaultTestSpace(t)
68+
69+
refs := []string{"data.cloudfoundry_app.dummy-app-by-id", "data.cloudfoundry_app.dummy-app-by-name"}
70+
71+
appName := "BindAppName-%s"
72+
appName = fmt.Sprintf(appName, uuid.New())
73+
74+
resource.ParallelTest(t,
75+
resource.TestCase{
76+
PreCheck: func() { testAccPreCheck(t) },
77+
ProviderFactories: testAccProvidersFactories,
78+
Steps: []resource.TestStep{
79+
80+
resource.TestStep{
81+
Config: fmt.Sprintf(appDataSource, orgName, spaceName, appName, "https://raw.githubusercontent.com/cloudfoundry-community/terraform-provider-cloudfoundry/main/tests/cf-acceptance-tests/assets/dummy-app.zip"),
82+
Check: resource.ComposeTestCheckFunc(
83+
func(s *terraform.State) error {
84+
for _, ref := range refs {
85+
_, ok := s.RootModule().Resources[ref]
86+
if !ok {
87+
return fmt.Errorf("app '%s' not found in terraform state", ref)
88+
}
89+
}
90+
return nil
91+
},
92+
resource.TestCheckResourceAttr(refs[0], "name", appName),
93+
resource.TestCheckResourceAttr(refs[0], "instances", "1"),
94+
resource.TestCheckResourceAttr(refs[0], "memory", "1024"),
95+
resource.TestCheckResourceAttr(refs[0], "disk_quota", "1024"),
96+
resource.TestCheckResourceAttr(refs[0], "stack", "cflinuxfs4"),
97+
resource.TestCheckResourceAttr(refs[0], "buildpack", "staticfile_buildpack"),
98+
resource.TestCheckResourceAttr(refs[0], "command", "./app"),
99+
resource.TestCheckResourceAttr(refs[0], "enable_ssh", "true"),
100+
resource.TestCheckResourceAttr(refs[0], "state", "STARTED"),
101+
resource.TestCheckResourceAttr(refs[0], "health_check_type", "port"),
102+
resource.TestCheckResourceAttr(refs[0], "health_check_timeout", "180"),
103+
resource.TestCheckResourceAttr(refs[0], "buildpacks.0", "staticfile_buildpack"),
104+
resource.TestCheckResourceAttr(refs[0], "buildpacks.1", "binary_buildpack"),
105+
resource.TestCheckResourceAttr(refs[0], "environment.%", "2"),
106+
resource.TestCheckResourceAttr(refs[0], "environment.UPDATED", "true"),
107+
resource.TestCheckResourceAttr(refs[0], "environment.APPNAME", "cloudfoundry_app_test"),
108+
resource.TestCheckResourceAttr(refs[1], "name", appName),
109+
resource.TestCheckResourceAttr(refs[1], "instances", "1"),
110+
resource.TestCheckResourceAttr(refs[1], "memory", "1024"),
111+
resource.TestCheckResourceAttr(refs[1], "disk_quota", "1024"),
112+
resource.TestCheckResourceAttr(refs[1], "stack", "cflinuxfs4"),
113+
resource.TestCheckResourceAttr(refs[1], "buildpack", "staticfile_buildpack"),
114+
resource.TestCheckResourceAttr(refs[1], "command", "./app"),
115+
resource.TestCheckResourceAttr(refs[1], "enable_ssh", "true"),
116+
resource.TestCheckResourceAttr(refs[1], "state", "STARTED"),
117+
resource.TestCheckResourceAttr(refs[1], "health_check_type", "port"),
118+
resource.TestCheckResourceAttr(refs[1], "health_check_timeout", "180"),
119+
resource.TestCheckResourceAttr(refs[1], "buildpacks.0", "staticfile_buildpack"),
120+
resource.TestCheckResourceAttr(refs[1], "buildpacks.1", "binary_buildpack"),
121+
resource.TestCheckResourceAttr(refs[1], "environment.%", "2"),
122+
resource.TestCheckResourceAttr(refs[1], "environment.UPDATED", "true"),
123+
resource.TestCheckResourceAttr(refs[1], "environment.APPNAME", "cloudfoundry_app_test"),
124+
),
125+
},
126+
},
127+
})
128+
}

0 commit comments

Comments
 (0)