-
Notifications
You must be signed in to change notification settings - Fork 2
/
resource_blueprint_iba_probe.go
171 lines (150 loc) · 5.29 KB
/
resource_blueprint_iba_probe.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
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
package tfapstra
import (
"context"
"fmt"
"github.com/Juniper/apstra-go-sdk/apstra"
"github.com/Juniper/terraform-provider-apstra/apstra/iba"
"github.com/Juniper/terraform-provider-apstra/apstra/utils"
"github.com/hashicorp/terraform-plugin-framework/resource"
"github.com/hashicorp/terraform-plugin-framework/resource/schema"
)
var _ resource.ResourceWithConfigure = &resourceBlueprintIbaProbe{}
var _ resourceWithSetBpClientFunc = &resourceBlueprintIbaProbe{}
type resourceBlueprintIbaProbe struct {
getBpClientFunc func(context.Context, string) (*apstra.TwoStageL3ClosClient, error)
}
func (o *resourceBlueprintIbaProbe) Metadata(_ context.Context, req resource.MetadataRequest, resp *resource.MetadataResponse) {
resp.TypeName = req.ProviderTypeName + "_blueprint_iba_probe"
}
func (o *resourceBlueprintIbaProbe) Configure(ctx context.Context, req resource.ConfigureRequest, resp *resource.ConfigureResponse) {
configureResource(ctx, o, req, resp)
}
func (o *resourceBlueprintIbaProbe) Schema(_ context.Context, _ resource.SchemaRequest, resp *resource.SchemaResponse) {
resp.Schema = schema.Schema{
MarkdownDescription: docCategoryRefDesignAny + "This resource creates an IBA Probe within a Blueprint.",
Attributes: iba.Probe{}.ResourceAttributes(),
}
}
func (o *resourceBlueprintIbaProbe) Create(ctx context.Context, req resource.CreateRequest, resp *resource.CreateResponse) {
// Retrieve values from plan
var plan iba.Probe
resp.Diagnostics.Append(req.Plan.Get(ctx, &plan)...)
if resp.Diagnostics.HasError() {
return
}
// get a client for the datacenter reference design
bpClient, err := o.getBpClientFunc(ctx, plan.BlueprintId.ValueString())
if err != nil {
if utils.IsApstra404(err) {
resp.Diagnostics.AddError(fmt.Sprintf("blueprint %s not found", plan.BlueprintId), err.Error())
return
}
resp.Diagnostics.AddError("failed to create blueprint client", err.Error())
return
}
var id apstra.ObjectId
// Convert the plan into an API Request
if plan.PredefinedProbeId.IsUnknown() || plan.PredefinedProbeId.IsNull() {
// Create Probe from Json
id, err = bpClient.CreateIbaProbeFromJson(ctx, []byte(plan.ProbeJson.ValueString()))
if err != nil {
resp.Diagnostics.AddError("failed to create Iba Probe", err.Error())
return
}
} else {
probeReq := &apstra.IbaPredefinedProbeRequest{
Name: plan.PredefinedProbeId.ValueString(),
Data: []byte(plan.ProbeConfig.ValueString()),
}
if resp.Diagnostics.HasError() {
return
}
// Instantiate the probe
id, err = bpClient.InstantiateIbaPredefinedProbe(ctx, probeReq)
if err != nil {
resp.Diagnostics.AddError("failed to create Iba Probe", err.Error())
return
}
}
// Fetch the probe details
api, err := bpClient.GetIbaProbe(ctx, id)
if err != nil {
resp.Diagnostics.AddError("Failed to Read IBA Probe", err.Error())
return
}
// Populate plan object with new probe details
plan.LoadApiData(ctx, api, &resp.Diagnostics)
if resp.Diagnostics.HasError() {
return
}
// Set state
resp.Diagnostics.Append(resp.State.Set(ctx, &plan)...)
}
func (o *resourceBlueprintIbaProbe) Read(ctx context.Context, req resource.ReadRequest, resp *resource.ReadResponse) {
var state iba.Probe
resp.Diagnostics.Append(req.State.Get(ctx, &state)...)
if resp.Diagnostics.HasError() {
return
}
// get a client for the datacenter reference design
bpClient, err := o.getBpClientFunc(ctx, state.BlueprintId.ValueString())
if err != nil {
if utils.IsApstra404(err) {
resp.State.RemoveResource(ctx)
return
}
resp.Diagnostics.AddError("failed to create blueprint client", err.Error())
return
}
// read probe details from API
api, err := bpClient.GetIbaProbe(ctx, apstra.ObjectId(state.Id.ValueString()))
if err != nil {
if utils.IsApstra404(err) {
resp.State.RemoveResource(ctx)
return
}
resp.Diagnostics.AddError("Failed to Read IBA Probe", err.Error())
return
}
// load probe details into state object
state.LoadApiData(ctx, api, &resp.Diagnostics)
if resp.Diagnostics.HasError() {
return
}
// set state
resp.Diagnostics.Append(resp.State.Set(ctx, &state)...)
}
// Update resource
func (o *resourceBlueprintIbaProbe) Update(_ context.Context, _ resource.UpdateRequest, resp *resource.UpdateResponse) {
// Get plan values
resp.Diagnostics.AddError("not implemented", "Probe update not implemented via terraform. Please file a bug.")
}
// Delete resource
func (o *resourceBlueprintIbaProbe) Delete(ctx context.Context, req resource.DeleteRequest, resp *resource.DeleteResponse) {
var state iba.Probe
resp.Diagnostics.Append(req.State.Get(ctx, &state)...)
if resp.Diagnostics.HasError() {
return
}
// get a client for the datacenter reference design
bpClient, err := o.getBpClientFunc(ctx, state.BlueprintId.ValueString())
if err != nil {
if utils.IsApstra404(err) {
return // 404 is okay
}
resp.Diagnostics.AddError("failed to create blueprint client", err.Error())
return
}
// Delete IBA Probe by calling API
err = bpClient.DeleteIbaProbe(ctx, apstra.ObjectId(state.Id.ValueString()))
if err != nil {
if utils.IsApstra404(err) {
return // 404 is okay
}
resp.Diagnostics.AddError("error deleting IBA Probe", err.Error())
return
}
}
func (o *resourceBlueprintIbaProbe) setBpClientFunc(f func(context.Context, string) (*apstra.TwoStageL3ClosClient, error)) {
o.getBpClientFunc = f
}