/
template.go
229 lines (196 loc) · 7.6 KB
/
template.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
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
package testutils
import (
"context"
"github.com/Juniper/apstra-go-sdk/apstra"
"github.com/hashicorp/terraform-plugin-testing/helper/acctest"
"github.com/stretchr/testify/require"
"testing"
)
func TemplateA(t testing.TB, ctx context.Context) *apstra.TemplateRackBased {
t.Helper()
client := GetTestClient(t, ctx)
tagA := TagA(t, ctx)
tagB := TagA(t, ctx)
rackType, err := client.GetRackType(ctx, "one_leaf")
require.NoError(t, err)
templateRequest := &apstra.CreateRackBasedTemplateRequest{
DisplayName: acctest.RandString(10),
Spine: &apstra.TemplateElementSpineRequest{
Count: 4,
LogicalDevice: "AOS-16x40-1",
Tags: []apstra.ObjectId{tagA.Id, tagB.Id},
},
RackInfos: map[apstra.ObjectId]apstra.TemplateRackBasedRackInfo{
rackType.Id: {Count: 2},
},
FabricAddressingPolicy: &apstra.TemplateFabricAddressingPolicy410Only{
SpineSuperspineLinks: apstra.AddressingSchemeIp4,
SpineLeafLinks: apstra.AddressingSchemeIp4,
},
AntiAffinityPolicy: &apstra.AntiAffinityPolicy{
Algorithm: apstra.AlgorithmHeuristic,
MaxLinksPerPort: 1,
MaxLinksPerSlot: 1,
MaxPerSystemLinksPerPort: 1,
MaxPerSystemLinksPerSlot: 1,
Mode: apstra.AntiAffinityModeDisabled,
},
AsnAllocationPolicy: &apstra.AsnAllocationPolicy{SpineAsnScheme: apstra.AsnAllocationSchemeDistinct},
VirtualNetworkPolicy: &apstra.VirtualNetworkPolicy{OverlayControlProtocol: apstra.OverlayControlProtocolEvpn},
}
id, err := client.CreateRackBasedTemplate(ctx, templateRequest)
require.NoError(t, err)
t.Cleanup(func() { require.NoError(t, client.DeleteTemplate(ctx, id)) })
template, err := client.GetRackBasedTemplate(ctx, id)
require.NoError(t, err)
return template
}
func TemplateB(t testing.TB, ctx context.Context) *apstra.TemplateRackBased {
t.Helper()
client := GetTestClient(t, ctx)
templateRequest := &apstra.CreateRackBasedTemplateRequest{
DisplayName: acctest.RandString(10),
Spine: &apstra.TemplateElementSpineRequest{
Count: 1,
LogicalDevice: "AOS-8x10-1",
},
RackInfos: map[apstra.ObjectId]apstra.TemplateRackBasedRackInfo{
"access_switch": {Count: 3}, // single-single
"L2_ESI_Access_dual": {Count: 2}, // ESI-ESI
},
FabricAddressingPolicy: &apstra.TemplateFabricAddressingPolicy410Only{
SpineSuperspineLinks: apstra.AddressingSchemeIp4,
SpineLeafLinks: apstra.AddressingSchemeIp4,
},
AntiAffinityPolicy: &apstra.AntiAffinityPolicy{
Algorithm: apstra.AlgorithmHeuristic,
MaxLinksPerPort: 1,
MaxLinksPerSlot: 1,
MaxPerSystemLinksPerPort: 1,
MaxPerSystemLinksPerSlot: 1,
Mode: apstra.AntiAffinityModeDisabled,
},
AsnAllocationPolicy: &apstra.AsnAllocationPolicy{SpineAsnScheme: apstra.AsnAllocationSchemeDistinct},
VirtualNetworkPolicy: &apstra.VirtualNetworkPolicy{OverlayControlProtocol: apstra.OverlayControlProtocolEvpn},
}
id, err := client.CreateRackBasedTemplate(ctx, templateRequest)
require.NoError(t, err)
t.Cleanup(func() { require.NoError(t, client.DeleteTemplate(ctx, id)) })
template, err := client.GetRackBasedTemplate(ctx, id)
require.NoError(t, err)
return template
}
func TemplateC(t testing.TB, ctx context.Context) *apstra.TemplateRackBased {
t.Helper()
client := GetTestClient(t, ctx)
templateRequest := &apstra.CreateRackBasedTemplateRequest{
DisplayName: acctest.RandString(10),
Spine: &apstra.TemplateElementSpineRequest{
Count: 1,
LogicalDevice: "AOS-8x10-1",
},
RackInfos: map[apstra.ObjectId]apstra.TemplateRackBasedRackInfo{
"L2_ESI_Access_dual": {Count: 1}, // ESI-ESI
},
FabricAddressingPolicy: &apstra.TemplateFabricAddressingPolicy410Only{
SpineSuperspineLinks: apstra.AddressingSchemeIp4,
SpineLeafLinks: apstra.AddressingSchemeIp4,
},
AntiAffinityPolicy: &apstra.AntiAffinityPolicy{
Algorithm: apstra.AlgorithmHeuristic,
MaxLinksPerPort: 1,
MaxLinksPerSlot: 1,
MaxPerSystemLinksPerPort: 1,
MaxPerSystemLinksPerSlot: 1,
Mode: apstra.AntiAffinityModeDisabled,
},
AsnAllocationPolicy: &apstra.AsnAllocationPolicy{SpineAsnScheme: apstra.AsnAllocationSchemeDistinct},
VirtualNetworkPolicy: &apstra.VirtualNetworkPolicy{OverlayControlProtocol: apstra.OverlayControlProtocolEvpn},
}
id, err := client.CreateRackBasedTemplate(ctx, templateRequest)
require.NoError(t, err)
t.Cleanup(func() { require.NoError(t, client.DeleteTemplate(ctx, id)) })
template, err := client.GetRackBasedTemplate(ctx, id)
require.NoError(t, err)
return template
}
func TemplateD(t testing.TB, ctx context.Context) *apstra.TemplateRackBased {
t.Helper()
rackTypeA := RackTypeA(t, ctx)
rackTypeB := RackTypeB(t, ctx)
rackTypeC := RackTypeC(t, ctx)
rackTypeD := RackTypeD(t, ctx)
raid := rackTypeA.Id
rbid := rackTypeB.Id
rcid := rackTypeC.Id
rdid := rackTypeD.Id
templateRequest := &apstra.CreateRackBasedTemplateRequest{
DisplayName: acctest.RandString(10),
Spine: &apstra.TemplateElementSpineRequest{
Count: 1,
LogicalDevice: "AOS-8x10-1",
},
RackInfos: map[apstra.ObjectId]apstra.TemplateRackBasedRackInfo{
raid: {Count: 1},
rbid: {Count: 1},
rcid: {Count: 1},
rdid: {Count: 1},
},
FabricAddressingPolicy: &apstra.TemplateFabricAddressingPolicy410Only{
SpineSuperspineLinks: apstra.AddressingSchemeIp4,
SpineLeafLinks: apstra.AddressingSchemeIp4,
},
AntiAffinityPolicy: &apstra.AntiAffinityPolicy{
Algorithm: apstra.AlgorithmHeuristic,
MaxLinksPerPort: 1,
MaxLinksPerSlot: 1,
MaxPerSystemLinksPerPort: 1,
MaxPerSystemLinksPerSlot: 1,
Mode: apstra.AntiAffinityModeDisabled,
},
AsnAllocationPolicy: &apstra.AsnAllocationPolicy{SpineAsnScheme: apstra.AsnAllocationSchemeDistinct},
VirtualNetworkPolicy: &apstra.VirtualNetworkPolicy{OverlayControlProtocol: apstra.OverlayControlProtocolEvpn},
}
client := GetTestClient(t, ctx)
id, err := client.CreateRackBasedTemplate(ctx, templateRequest)
require.NoError(t, err)
t.Cleanup(func() { require.NoError(t, client.DeleteTemplate(ctx, id)) })
template, err := client.GetRackBasedTemplate(ctx, id)
require.NoError(t, err)
return template
}
func TemplateE(t testing.TB, ctx context.Context) *apstra.TemplateRackBased {
t.Helper()
client := GetTestClient(t, ctx)
rackTypeF := RackTypeF(t, ctx)
templateRequest := &apstra.CreateRackBasedTemplateRequest{
DisplayName: acctest.RandString(10),
Spine: &apstra.TemplateElementSpineRequest{
Count: 1,
LogicalDevice: "AOS-32x40-1",
},
RackInfos: map[apstra.ObjectId]apstra.TemplateRackBasedRackInfo{
rackTypeF.Id: {Count: 1},
},
FabricAddressingPolicy: &apstra.TemplateFabricAddressingPolicy410Only{
SpineSuperspineLinks: apstra.AddressingSchemeIp4,
SpineLeafLinks: apstra.AddressingSchemeIp4,
},
AntiAffinityPolicy: &apstra.AntiAffinityPolicy{
Algorithm: apstra.AlgorithmHeuristic,
MaxLinksPerPort: 1,
MaxLinksPerSlot: 1,
MaxPerSystemLinksPerPort: 1,
MaxPerSystemLinksPerSlot: 1,
Mode: apstra.AntiAffinityModeDisabled,
},
AsnAllocationPolicy: &apstra.AsnAllocationPolicy{SpineAsnScheme: apstra.AsnAllocationSchemeDistinct},
VirtualNetworkPolicy: &apstra.VirtualNetworkPolicy{OverlayControlProtocol: apstra.OverlayControlProtocolEvpn},
}
id, err := client.CreateRackBasedTemplate(ctx, templateRequest)
require.NoError(t, err)
t.Cleanup(func() { require.NoError(t, client.DeleteTemplate(ctx, id)) })
template, err := client.GetRackBasedTemplate(ctx, id)
require.NoError(t, err)
return template
}