Skip to content

Commit 144e31a

Browse files
Merge pull request #1 from citrix/provision_sdx_on_vpx
Provision sdx on vpx
2 parents 46e3a54 + 43670eb commit 144e31a

File tree

21 files changed

+1034
-17
lines changed

21 files changed

+1034
-17
lines changed
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
package citrixadm
2+
3+
import (
4+
"context"
5+
"fmt"
6+
"log"
7+
8+
"terraform-provider-citrixadm/service"
9+
10+
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
11+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
12+
)
13+
14+
func dataSourceConfigJobTemplate() *schema.Resource {
15+
return &schema.Resource{
16+
Description: "Get a configuration job template by name",
17+
ReadContext: dataSourceConfigJobTemplateRead,
18+
Schema: map[string]*schema.Schema{
19+
"name": {
20+
Description: "Configuration Job Template Name",
21+
Type: schema.TypeString,
22+
Required: true,
23+
ForceNew: true,
24+
},
25+
},
26+
}
27+
}
28+
29+
func dataSourceConfigJobTemplateRead(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
30+
log.Printf("In dataSourceConfigJobTemplateRead")
31+
var diags diag.Diagnostics
32+
c := m.(*service.NitroClient)
33+
34+
endpoint := "configuration_template"
35+
36+
configJobTemplateName := d.Get("name").(string)
37+
38+
returnData, err := c.GetAllResource(endpoint)
39+
if err != nil {
40+
return diag.FromErr(err)
41+
}
42+
43+
// Find the correct resource with the given name and store config_job_template_id from the object
44+
for _, v := range returnData[endpoint].([]interface{}) {
45+
configJob := v.(map[string]interface{})
46+
if configJob["name"].(string) == configJobTemplateName {
47+
d.SetId(configJob["id"].(string))
48+
d.Set("name", configJob["name"].(string))
49+
break
50+
}
51+
}
52+
if d.Id() == "" {
53+
return diag.FromErr(fmt.Errorf("Configuration Job Template with name %s not found", configJobTemplateName))
54+
}
55+
return diags
56+
}

citrixadm/data_source_citrixadm_managed_device.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import (
1212

1313
func dataSourceManagedDevice() *schema.Resource {
1414
return &schema.Resource{
15-
Description: "Configuration for MPS Agent information data source.",
15+
Description: "Get a managed device ID by IP address",
1616
ReadContext: dataSourceManagedDeviceRead,
1717
Schema: map[string]*schema.Schema{
1818
"ip_address": {

citrixadm/data_source_citrixadm_mps_agent.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import (
1313

1414
func dataSourceMpsAgent() *schema.Resource {
1515
return &schema.Resource{
16-
Description: "Configuration for MPS Agent information data source.",
16+
Description: "Get a mps agent ID and Datacenter ID by MPS Agent IP address",
1717
ReadContext: dataSourceMpsAgentRead,
1818
Schema: map[string]*schema.Schema{
1919
"name": {

citrixadm/provider.go

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,17 +53,26 @@ func Provider() *schema.Provider {
5353
DefaultFunc: schema.EnvDefaultFunc("CITRIXADM_CUSTOMER_ID", ""),
5454
Description: "Citrix Adm customer/tenant id. Can be specified with `CITRIXADM_CUSTOMER_ID` environment variable.",
5555
},
56+
"fail_on_stall": {
57+
Type: schema.TypeBool,
58+
Optional: true,
59+
DefaultFunc: schema.EnvDefaultFunc("CITRIXADM_FAIL_ON_STALL", false),
60+
Description: "Boolean flag. Set to true for the module to fail when a status of job stalled is reported. Can be specified with `CITRIXADM_FAIL_ON_STALL` environment variable.",
61+
},
5662
},
5763
ResourcesMap: map[string]*schema.Resource{
5864
"citrixadm_managed_device": resourceManagedDevice(),
5965
"citrixadm_ns_device_profile": resourceNsDeviceProfile(),
6066
"citrixadm_managed_device_allocate_license": resourceManagedDeviceAllocateLicense(),
6167
"citrixadm_stylebook_configpack": resourceStylebookConfigpack(),
6268
"citrixadm_stylebook": resourceStylebook(),
69+
"citrixadm_provisioning_profile": resourceProvisioningProfile(),
70+
"citrixadm_provision_vpx": resourceProvisionVpx(),
6371
},
6472
DataSourcesMap: map[string]*schema.Resource{
65-
"citrixadm_mps_agent": dataSourceMpsAgent(),
66-
"citrixadm_managed_device": dataSourceManagedDevice(),
73+
"citrixadm_mps_agent": dataSourceMpsAgent(),
74+
"citrixadm_managed_device": dataSourceManagedDevice(),
75+
"citrixadm_config_job_template": dataSourceConfigJobTemplate(),
6776
},
6877
ConfigureContextFunc: providerConfigure,
6978
}
Lines changed: 146 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,146 @@
1+
package citrixadm
2+
3+
import (
4+
"context"
5+
"errors"
6+
"log"
7+
8+
"terraform-provider-citrixadm/service"
9+
10+
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
11+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
12+
)
13+
14+
func resourceProvisionVpx() *schema.Resource {
15+
return &schema.Resource{
16+
Description: "Configuration for Managed Device resource",
17+
CreateContext: resourceProvisionVpxCreate,
18+
ReadContext: resourceProvisionVpxRead,
19+
// UpdateContext: resourceProvisionVpxUpdate,
20+
// DeleteContext: resourceProvisionVpxDelete,
21+
DeleteContext: schema.NoopContext,
22+
Schema: map[string]*schema.Schema{
23+
"name": {
24+
Type: schema.TypeString,
25+
Description: "Name of the instance to be provisioned.",
26+
Required: true,
27+
ForceNew: true,
28+
},
29+
"provisioning_profile_id": {
30+
Type: schema.TypeString,
31+
Description: "Provisioning Profile Id used to provision instance.",
32+
Required: true,
33+
ForceNew: true,
34+
},
35+
},
36+
}
37+
}
38+
39+
func getProvisionVpxPayload(d *schema.ResourceData) interface{} {
40+
data := make(map[string]interface{})
41+
data["name"] = d.Get("name").(string)
42+
data["provisioning_profile_id"] = d.Get("provisioning_profile_id").(string)
43+
return data
44+
}
45+
46+
func resourceProvisionVpxCreate(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
47+
log.Printf("In resourceProvisionVpxCreate")
48+
49+
c := m.(*service.NitroClient)
50+
51+
endpoint := "instances"
52+
53+
returnData, err := c.AddResource(endpoint, getProvisionVpxPayload(d))
54+
55+
if err != nil {
56+
return diag.Errorf("unable to Provisoin VPX: %s", err.Error())
57+
}
58+
59+
// if bodyResource, ok := service.URLResourceToBodyResource[endpoint]; ok {
60+
// endpoint = bodyResource
61+
// }
62+
63+
jobID := returnData["instance"].(map[string]interface{})["job_id"].(string)
64+
65+
// Wait for the job to complete
66+
log.Printf("Waiting for the job to complete")
67+
err = c.WaitForProvisioningJobCompletion(jobID)
68+
if err != nil {
69+
return diag.FromErr(err)
70+
}
71+
72+
resourceID, err := getProvisionVpxID(c, d.Get("name").(string))
73+
74+
if err != nil {
75+
return diag.FromErr(errors.New("Failed to find resource ID"))
76+
}
77+
78+
d.SetId(resourceID)
79+
return resourceProvisionVpxRead(ctx, d, m)
80+
}
81+
82+
func getProvisionVpxID(c *service.NitroClient, name string) (string, error) {
83+
endpoint := "instances"
84+
returnData, err := c.GetAllResource(endpoint)
85+
if err != nil {
86+
return "", err
87+
}
88+
89+
for _, v := range returnData[endpoint].([]interface{}) {
90+
if v.(map[string]interface{})["name"].(string) == name {
91+
return v.(map[string]interface{})["id"].(string), nil
92+
}
93+
}
94+
return "", errors.New("Failed to find instance resource ID with Host name: " + name)
95+
}
96+
97+
func resourceProvisionVpxRead(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
98+
log.Printf("In resourceProvisionVpxRead")
99+
var diags diag.Diagnostics
100+
c := m.(*service.NitroClient)
101+
102+
resourceID := d.Id()
103+
endpoint := "instances"
104+
105+
returnData, err := c.GetResource(endpoint, resourceID)
106+
if err != nil {
107+
return diag.FromErr(err)
108+
}
109+
110+
getResponseData := returnData[endpoint].([]interface{})[0].(map[string]interface{})
111+
112+
d.Set("name", getResponseData["name"].(string))
113+
d.Set("provisioning_profile_id", getResponseData["provisioning_profile_id"].(string))
114+
115+
return diags
116+
}
117+
118+
// func resourceProvisionVpxDelete(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
119+
// log.Printf("In resourceProvisionVpxDelete")
120+
// var diags diag.Diagnostics
121+
122+
// c := m.(*service.NitroClient)
123+
124+
// endpoint := "instances"
125+
// resourceID := d.Id()
126+
127+
// returnData, err := c.DeleteResource(endpoint, resourceID)
128+
129+
// // if bodyResource, ok := service.URLResourceToBodyResource[endpoint]; ok {
130+
// // endpoint = bodyResource
131+
// // }
132+
133+
// jobID := returnData["instance"].(map[string]interface{})["job_id"].(string)
134+
135+
// // Wait for the delete job to complete
136+
// log.Printf("Waiting for the delete job to complete")
137+
// err = c.WaitForProvisioningJobCompletion(jobID)
138+
139+
// if err != nil {
140+
// return diag.FromErr(err)
141+
// }
142+
143+
// d.SetId("")
144+
145+
// return diags
146+
// }

0 commit comments

Comments
 (0)