/
resource_aviatrix_controller_private_mode_config.go
146 lines (121 loc) · 4.91 KB
/
resource_aviatrix_controller_private_mode_config.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
package aviatrix
import (
"context"
"strings"
"github.com/AviatrixSystems/terraform-provider-aviatrix/v3/goaviatrix"
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
)
func resourceAviatrixControllerPrivateModeConfig() *schema.Resource {
return &schema.Resource{
CreateWithoutTimeout: resourceAviatrixControllerPrivateModeConfigCreate,
ReadWithoutTimeout: resourceAviatrixControllerPrivateModeConfigRead,
UpdateWithoutTimeout: resourceAviatrixControllerPrivateModeConfigUpdate,
DeleteWithoutTimeout: resourceAviatrixControllerPrivateModeConfigDelete,
Importer: &schema.ResourceImporter{
StateContext: schema.ImportStatePassthroughContext,
},
Schema: map[string]*schema.Schema{
"enable_private_mode": {
Type: schema.TypeBool,
Required: true,
Description: "Whether to enable Private Mode on the Controller.",
},
"copilot_instance_id": {
Type: schema.TypeString,
Optional: true,
Description: "Copilot instance ID to associate with the Controller for Private Mode.",
},
},
}
}
func resourceAviatrixControllerPrivateModeConfigCreate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
client := meta.(*goaviatrix.Client)
enablePrivateMode := d.Get("enable_private_mode").(bool)
if !enablePrivateMode {
if _, ok := d.GetOk("copilot_instance_id"); ok {
return diag.Errorf("failed to create Controller Private Mode config: %q must be empty when %q is false", "copilot_instance_id", "enable_private_mode")
}
}
flag := false
defer resourceAviatrixControllerPrivateModeConfigReadIfRequired(ctx, d, meta, &flag)
if enablePrivateMode {
err := client.EnablePrivateMode(ctx)
if err != nil {
return diag.Errorf("failed to enable Private Mode: %s", err)
}
} else {
err := client.DisablePrivateMode(ctx)
if err != nil {
return diag.Errorf("failed to disable Private Mode: %s", err)
}
}
d.SetId(strings.Replace(client.ControllerIP, ".", "-", -1))
if _, ok := d.GetOk("copilot_instance_id"); ok {
copilotInstanceId := d.Get("copilot_instance_id").(string)
err := client.UpdatePrivateModeCopilot(ctx, copilotInstanceId)
if err != nil {
return diag.Errorf("failed to set Copilot instance ID: %s", err)
}
}
return resourceAviatrixControllerPrivateModeConfigReadIfRequired(ctx, d, meta, &flag)
}
func resourceAviatrixControllerPrivateModeConfigReadIfRequired(ctx context.Context, d *schema.ResourceData, meta interface{}, flag *bool) diag.Diagnostics {
if !(*flag) {
*flag = true
return resourceAviatrixControllerPrivateModeConfigRead(ctx, d, meta)
}
return nil
}
func resourceAviatrixControllerPrivateModeConfigRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
client := meta.(*goaviatrix.Client)
if d.Id() != strings.Replace(client.ControllerIP, ".", "-", -1) {
return diag.Errorf("ID: %s does not match controller IP. Please provide correct ID for importing", d.Id())
}
controllerPrivateModeConfig, err := client.GetPrivateModeInfo(ctx)
if err != nil {
return diag.Errorf("failed to read Controller Private Mode Config: %s", err)
}
d.Set("enable_private_mode", controllerPrivateModeConfig.EnablePrivateMode)
d.Set("copilot_instance_id", controllerPrivateModeConfig.CopilotInstanceID)
d.SetId(strings.Replace(client.ControllerIP, ".", "-", -1))
return nil
}
func resourceAviatrixControllerPrivateModeConfigUpdate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
client := meta.(*goaviatrix.Client)
enablePrivateMode := d.Get("enable_private_mode").(bool)
if d.HasChanges("enable_private_mode", "copilot_instance_id") && !enablePrivateMode {
if _, ok := d.GetOk("copilot_instance_id"); ok {
return diag.Errorf("failed to update Controller Private Mode config: %q must be empty when %q is false", "copilot_instance_id", "enable_private_mode")
}
}
if d.HasChange("enable_private_mode") {
if enablePrivateMode {
err := client.EnablePrivateMode(ctx)
if err != nil {
return diag.Errorf("failed to enable Private Mode during update: %s", err)
}
} else {
err := client.DisablePrivateMode(ctx)
if err != nil {
return diag.Errorf("failed to disable Private Mode during update: %s", err)
}
}
}
if d.HasChange("copilot_instance_id") {
copilotInstanceId := d.Get("copilot_instance_id").(string)
err := client.UpdatePrivateModeCopilot(ctx, copilotInstanceId)
if err != nil {
return diag.Errorf("failed to set Copilot instance ID during update: %s", err)
}
}
return resourceAviatrixControllerPrivateModeConfigRead(ctx, d, meta)
}
func resourceAviatrixControllerPrivateModeConfigDelete(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
client := meta.(*goaviatrix.Client)
err := client.DisablePrivateMode(ctx)
if err != nil {
return diag.Errorf("failed to delete Controller Private Mode config: %s", err)
}
return nil
}