Skip to content

Commit 235d89e

Browse files
authored
Merge pull request #6384 from njuCZ/springcloudappdeployment
new resource `azurerm_spring_cloud_app`
2 parents 884259c + d205114 commit 235d89e

10 files changed

+579
-1
lines changed

azurerm/internal/services/appplatform/client/client.go

+5
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,18 @@ import (
77

88
type Client struct {
99
ServicesClient *appplatform.ServicesClient
10+
AppsClient *appplatform.AppsClient
1011
}
1112

1213
func NewClient(o *common.ClientOptions) *Client {
14+
appsClient := appplatform.NewAppsClientWithBaseURI(o.ResourceManagerEndpoint, o.SubscriptionId)
15+
o.ConfigureClient(&appsClient.Client, o.ResourceManagerAuthorizer)
16+
1317
servicesClient := appplatform.NewServicesClientWithBaseURI(o.ResourceManagerEndpoint, o.SubscriptionId)
1418
o.ConfigureClient(&servicesClient.Client, o.ResourceManagerAuthorizer)
1519

1620
return &Client{
21+
AppsClient: &appsClient,
1722
ServicesClient: &servicesClient,
1823
}
1924
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package parse
2+
3+
import (
4+
"fmt"
5+
6+
"github.com/terraform-providers/terraform-provider-azurerm/azurerm/helpers/azure"
7+
)
8+
9+
type SpringCloudAppId struct {
10+
ResourceGroup string
11+
ServiceName string
12+
Name string
13+
}
14+
15+
func SpringCloudAppID(input string) (*SpringCloudAppId, error) {
16+
id, err := azure.ParseAzureResourceID(input)
17+
if err != nil {
18+
return nil, fmt.Errorf("parsing Spring Cloud App ID %q: %+v", input, err)
19+
}
20+
21+
app := SpringCloudAppId{
22+
ResourceGroup: id.ResourceGroup,
23+
}
24+
25+
if app.ServiceName, err = id.PopSegment("Spring"); err != nil {
26+
return nil, err
27+
}
28+
29+
if app.Name, err = id.PopSegment("apps"); err != nil {
30+
return nil, err
31+
}
32+
33+
if err := id.ValidateNoEmptySegments(input); err != nil {
34+
return nil, err
35+
}
36+
37+
return &app, nil
38+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
package parse
2+
3+
import (
4+
"testing"
5+
)
6+
7+
func TestSpringCloudAppID(t *testing.T) {
8+
testData := []struct {
9+
Name string
10+
Input string
11+
Expected *SpringCloudAppId
12+
}{
13+
{
14+
Name: "Empty",
15+
Input: "",
16+
Expected: nil,
17+
},
18+
{
19+
Name: "No Resource Groups Segment",
20+
Input: "/subscriptions/00000000-0000-0000-0000-000000000000",
21+
Expected: nil,
22+
},
23+
{
24+
Name: "No Resource Groups Value",
25+
Input: "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/",
26+
Expected: nil,
27+
},
28+
{
29+
Name: "Resource Group ID",
30+
Input: "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/foo/",
31+
Expected: nil,
32+
},
33+
{
34+
Name: "No Spring Value",
35+
Input: "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/resGroup1/providers/Microsoft.AppPlatform/Spring/",
36+
Expected: nil,
37+
},
38+
{
39+
Name: "Missing Apps Segment",
40+
Input: "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/resGroup1/providers/Microsoft.AppPlatform/Spring/spring1/",
41+
Expected: nil,
42+
},
43+
{
44+
Name: "Missing Apps Value",
45+
Input: "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/resGroup1/providers/Microsoft.AppPlatform/Spring/spring1/apps/",
46+
Expected: nil,
47+
},
48+
{
49+
Name: "Spring Cloud App ID",
50+
Input: "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/resGroup1/providers/Microsoft.AppPlatform/Spring/spring1/apps/app1",
51+
Expected: &SpringCloudAppId{
52+
ResourceGroup: "resGroup1",
53+
ServiceName: "spring1",
54+
Name: "app1",
55+
},
56+
},
57+
{
58+
Name: "Wrong Casing",
59+
Input: "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/resGroup1/providers/Microsoft.AppPlatform/Spring/spring1/Apps/app1",
60+
Expected: nil,
61+
},
62+
{
63+
Name: "invalid app name Casing",
64+
Input: "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/resGroup1/providers/Microsoft.AppPlatform/Spring/spring1/Apps/App1",
65+
Expected: nil,
66+
},
67+
}
68+
69+
for _, v := range testData {
70+
t.Logf("[DEBUG] Testing %q", v.Name)
71+
72+
actual, err := SpringCloudAppID(v.Input)
73+
if err != nil {
74+
if v.Expected == nil {
75+
continue
76+
}
77+
78+
t.Fatalf("Expected a value but got an error: %s", err)
79+
}
80+
81+
if actual.ResourceGroup != v.Expected.ResourceGroup {
82+
t.Fatalf("Expected %q but got %q for Resource Group", v.Expected.ResourceGroup, actual.ResourceGroup)
83+
}
84+
85+
if actual.ServiceName != v.Expected.ServiceName {
86+
t.Fatalf("Expected %q but got %q for ServiceName", v.Expected.ServiceName, actual.ServiceName)
87+
}
88+
89+
if actual.Name != v.Expected.Name {
90+
t.Fatalf("Expected %q but got %q for Name", v.Expected.Name, actual.Name)
91+
}
92+
}
93+
}

azurerm/internal/services/appplatform/registration.go

+1
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ func (r Registration) SupportedDataSources() map[string]*schema.Resource {
2828
// SupportedResources returns the supported Resources supported by this Service
2929
func (r Registration) SupportedResources() map[string]*schema.Resource {
3030
return map[string]*schema.Resource{
31+
"azurerm_spring_cloud_app": resourceArmSpringCloudApp(),
3132
"azurerm_spring_cloud_service": resourceArmSpringCloudService(),
3233
}
3334
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,138 @@
1+
package appplatform
2+
3+
import (
4+
"fmt"
5+
"log"
6+
"time"
7+
8+
"github.com/Azure/azure-sdk-for-go/services/preview/appplatform/mgmt/2019-05-01-preview/appplatform"
9+
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
10+
"github.com/terraform-providers/terraform-provider-azurerm/azurerm/helpers/azure"
11+
"github.com/terraform-providers/terraform-provider-azurerm/azurerm/helpers/tf"
12+
"github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/clients"
13+
"github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/services/appplatform/parse"
14+
"github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/services/appplatform/validate"
15+
azSchema "github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/tf/schema"
16+
"github.com/terraform-providers/terraform-provider-azurerm/azurerm/internal/timeouts"
17+
"github.com/terraform-providers/terraform-provider-azurerm/azurerm/utils"
18+
)
19+
20+
func resourceArmSpringCloudApp() *schema.Resource {
21+
return &schema.Resource{
22+
Create: resourceArmSpringCloudAppCreate,
23+
Read: resourceArmSpringCloudAppRead,
24+
Delete: resourceArmSpringCloudAppDelete,
25+
26+
Importer: azSchema.ValidateResourceIDPriorToImport(func(id string) error {
27+
_, err := parse.SpringCloudAppID(id)
28+
return err
29+
}),
30+
31+
Timeouts: &schema.ResourceTimeout{
32+
Create: schema.DefaultTimeout(30 * time.Minute),
33+
Read: schema.DefaultTimeout(5 * time.Minute),
34+
Delete: schema.DefaultTimeout(30 * time.Minute),
35+
},
36+
37+
Schema: map[string]*schema.Schema{
38+
"name": {
39+
Type: schema.TypeString,
40+
Required: true,
41+
ForceNew: true,
42+
ValidateFunc: validate.SpringCloudAppName,
43+
},
44+
45+
"resource_group_name": azure.SchemaResourceGroupName(),
46+
47+
"service_name": {
48+
Type: schema.TypeString,
49+
Required: true,
50+
ForceNew: true,
51+
ValidateFunc: validate.SpringCloudServiceName,
52+
},
53+
},
54+
}
55+
}
56+
57+
func resourceArmSpringCloudAppCreate(d *schema.ResourceData, meta interface{}) error {
58+
client := meta.(*clients.Client).AppPlatform.AppsClient
59+
ctx, cancel := timeouts.ForCreate(meta.(*clients.Client).StopContext, d)
60+
defer cancel()
61+
62+
name := d.Get("name").(string)
63+
resourceGroup := d.Get("resource_group_name").(string)
64+
serviceName := d.Get("service_name").(string)
65+
66+
existing, err := client.Get(ctx, resourceGroup, serviceName, name, "")
67+
if err != nil {
68+
if !utils.ResponseWasNotFound(existing.Response) {
69+
return fmt.Errorf("checking for presence of existing Spring Cloud App %q (Spring Cloud Service %q / Resource Group %q): %+v", name, serviceName, resourceGroup, err)
70+
}
71+
}
72+
if existing.ID != nil && *existing.ID != "" {
73+
return tf.ImportAsExistsError("azurerm_spring_cloud_app", *existing.ID)
74+
}
75+
76+
future, err := client.CreateOrUpdate(ctx, resourceGroup, serviceName, name, appplatform.AppResource{})
77+
if err != nil {
78+
return fmt.Errorf("creating Spring Cloud App %q (Spring Cloud Service %q / Resource Group %q): %+v", name, serviceName, resourceGroup, err)
79+
}
80+
if err = future.WaitForCompletionRef(ctx, client.Client); err != nil {
81+
return fmt.Errorf("waiting for creation of Spring Cloud App %q (Spring Cloud Service %q / Resource Group %q): %+v", name, serviceName, resourceGroup, err)
82+
}
83+
84+
resp, err := client.Get(ctx, resourceGroup, serviceName, name, "")
85+
if err != nil {
86+
return fmt.Errorf("retrieving Spring Cloud App %q (Spring Cloud Service %q / Resource Group %q): %+v", name, serviceName, resourceGroup, err)
87+
}
88+
if resp.ID == nil || *resp.ID == "" {
89+
return fmt.Errorf("read Spring Cloud App %q (Spring Cloud Service %q / Resource Group %q) ID", name, serviceName, resourceGroup)
90+
}
91+
d.SetId(*resp.ID)
92+
93+
return resourceArmSpringCloudAppRead(d, meta)
94+
}
95+
96+
func resourceArmSpringCloudAppRead(d *schema.ResourceData, meta interface{}) error {
97+
client := meta.(*clients.Client).AppPlatform.AppsClient
98+
ctx, cancel := timeouts.ForRead(meta.(*clients.Client).StopContext, d)
99+
defer cancel()
100+
101+
id, err := parse.SpringCloudAppID(d.Id())
102+
if err != nil {
103+
return err
104+
}
105+
106+
resp, err := client.Get(ctx, id.ResourceGroup, id.ServiceName, id.Name, "")
107+
if err != nil {
108+
if utils.ResponseWasNotFound(resp.Response) {
109+
log.Printf("[INFO] Spring Cloud App %q does not exist - removing from state", d.Id())
110+
d.SetId("")
111+
return nil
112+
}
113+
return fmt.Errorf("reading Spring Cloud App %q (Spring Cloud Service %q / Resource Group %q): %+v", id.Name, id.ServiceName, id.ResourceGroup, err)
114+
}
115+
116+
d.Set("name", resp.Name)
117+
d.Set("resource_group_name", id.ResourceGroup)
118+
d.Set("service_name", id.ServiceName)
119+
120+
return nil
121+
}
122+
123+
func resourceArmSpringCloudAppDelete(d *schema.ResourceData, meta interface{}) error {
124+
client := meta.(*clients.Client).AppPlatform.AppsClient
125+
ctx, cancel := timeouts.ForDelete(meta.(*clients.Client).StopContext, d)
126+
defer cancel()
127+
128+
id, err := parse.SpringCloudAppID(d.Id())
129+
if err != nil {
130+
return err
131+
}
132+
133+
if _, err := client.Delete(ctx, id.ResourceGroup, id.ServiceName, id.Name); err != nil {
134+
return fmt.Errorf("deleting Spring Cloud App %q (Spring Cloud Service %q / Resource Group %q): %+v", id.Name, id.ServiceName, id.ResourceGroup, err)
135+
}
136+
137+
return nil
138+
}

0 commit comments

Comments
 (0)