Skip to content

Commit 947cf1e

Browse files
version_deferral: add new policies for crdb patch deferral
Previously, there was only the FIXED_DEFERRAL policy allowing 60 days deferral. This PR adds new policy to defer the upgrades by 30,60 or 90 days. DEFERRAL_30_DAYS to defer upgrades by 30 days. DEFERRAL_60_DAYS to defer upgrades by 60 days. DEFERRAL_90_DAYS to defer upgrades by 90 days. NOT_DEFERRED to apply upgrades immediately.
1 parent 70ee8b9 commit 947cf1e

File tree

3 files changed

+279
-54
lines changed

3 files changed

+279
-54
lines changed

docs/resources/version_deferral.md

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,11 @@ resource "cockroach_version_deferral" "example" {
3434

3535
### Required
3636

37-
- `deferral_policy` (String) The policy for managing automated minor version upgrades. Set to FIXED_DEFERRAL to defer upgrades by 60 days or NOT_DEFERRED to apply upgrades immediately.
37+
- `deferral_policy` (String) The policy for managing automated minor version upgrades.
38+
Set to DEFERRAL_30_DAYS to defer upgrades by 30 days.
39+
Set to DEFERRAL_60_DAYS to defer upgrades by 60 days.
40+
Set to DEFERRAL_90_DAYS to defer upgrades by 90 days.
41+
Set to NOT_DEFERRED to apply upgrades immediately.
3842
- `id` (String) Cluster ID.
3943

4044
## Import

internal/provider/version_deferral.go

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,12 @@ var versionDeferralAttributes = map[string]schema.Attribute{
3333
MarkdownDescription: "Cluster ID.",
3434
},
3535
"deferral_policy": schema.StringAttribute{
36-
Required: true,
37-
MarkdownDescription: "The policy for managing automated minor version upgrades. Set to FIXED_DEFERRAL to defer upgrades by 60 days or NOT_DEFERRED to apply upgrades immediately.",
36+
Required: true,
37+
MarkdownDescription: "The policy for managing automated minor version upgrades.\n" +
38+
"Set to DEFERRAL_30_DAYS to defer upgrades by 30 days.\n" +
39+
"Set to DEFERRAL_60_DAYS to defer upgrades by 60 days.\n" +
40+
"Set to DEFERRAL_90_DAYS to defer upgrades by 90 days.\n" +
41+
"Set to NOT_DEFERRED to apply upgrades immediately.",
3842
},
3943
}
4044

internal/provider/version_deferral_test.go

Lines changed: 268 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ import (
3131
func TestAccVersionDeferralResource(t *testing.T) {
3232
t.Parallel()
3333
clusterName := fmt.Sprintf("%s-version-deferral-%s", tfTestPrefix, GenerateRandomString(4))
34-
testVersionDeferralResource(t, clusterName, false)
34+
testVersionDeferralResourceTransition(t, clusterName, false, "FIXED_DEFERRAL", "NOT_DEFERRED")
3535
}
3636

3737
// TestIntegrationVersionDeferralResource attempts to create, check, and
@@ -49,28 +49,8 @@ func TestIntegrationVersionDeferralResource(t *testing.T) {
4949
return s
5050
})()
5151

52-
clusterInfo := &client.Cluster{
53-
Id: clusterID,
54-
Name: clusterName,
55-
CockroachVersion: "v22.2.0",
56-
Plan: "ADVANCED",
57-
CloudProvider: "GCP",
58-
State: "CREATED",
59-
Config: client.ClusterConfig{
60-
Dedicated: &client.DedicatedHardwareConfig{
61-
MachineType: "m5.xlarge",
62-
NumVirtualCpus: 4,
63-
StorageGib: 35,
64-
MemoryGib: 8,
65-
},
66-
},
67-
Regions: []client.Region{
68-
{
69-
Name: "us-east1",
70-
NodeCount: 3,
71-
},
72-
},
73-
}
52+
clusterInfo := getClusterInfo(clusterID, clusterName)
53+
7454
createdVersionDeferralInfo := &client.ClusterVersionDeferral{
7555
DeferralPolicy: client.CLUSTERVERSIONDEFERRALPOLICYTYPE_FIXED_DEFERRAL,
7656
}
@@ -110,10 +90,242 @@ func TestIntegrationVersionDeferralResource(t *testing.T) {
11090
s.EXPECT().DeleteCluster(gomock.Any(), clusterID)
11191
s.EXPECT().SetClusterVersionDeferral(gomock.Any(), clusterID, deletedVersionDeferralInfo)
11292

113-
testVersionDeferralResource(t, clusterName, true)
93+
testVersionDeferralResourceTransition(t, clusterName, true, "FIXED_DEFERRAL", "NOT_DEFERRED")
94+
}
95+
96+
// TestIntegrationVersionDeferral30Days tests the DEFERRAL_FIXED_DAYS policy for backward compatibility
97+
func TestIntegrationVersionDeferralFixedTo30Days(t *testing.T) {
98+
clusterName := fmt.Sprintf("%s-deferral-30-%s", tfTestPrefix, GenerateRandomString(4))
99+
clusterID := uuid.Nil.String()
100+
if os.Getenv(CockroachAPIKey) == "" {
101+
os.Setenv(CockroachAPIKey, "fake")
102+
}
103+
104+
ctrl := gomock.NewController(t)
105+
s := mock_client.NewMockService(ctrl)
106+
defer HookGlobal(&NewService, func(c *client.Client) client.Service {
107+
return s
108+
})()
109+
110+
clusterInfo := getClusterInfo(clusterID, clusterName)
111+
112+
createdVersionDeferralInfo := &client.ClusterVersionDeferral{
113+
DeferralPolicy: client.CLUSTERVERSIONDEFERRALPOLICYTYPE_FIXED_DEFERRAL,
114+
}
115+
updatedVersionDeferralInfo := &client.ClusterVersionDeferral{
116+
DeferralPolicy: client.CLUSTERVERSIONDEFERRALPOLICYTYPE_DEFERRAL_30_DAYS,
117+
}
118+
deletedVersionDeferralInfo := &client.ClusterVersionDeferral{
119+
DeferralPolicy: client.CLUSTERVERSIONDEFERRALPOLICYTYPE_NOT_DEFERRED,
120+
}
121+
122+
// Create
123+
s.EXPECT().CreateCluster(gomock.Any(), gomock.Any()).
124+
Return(clusterInfo, nil, nil)
125+
s.EXPECT().GetCluster(gomock.Any(), clusterID).
126+
Return(clusterInfo, &http.Response{Status: http.StatusText(http.StatusOK)}, nil).
127+
Times(3)
128+
s.EXPECT().GetBackupConfiguration(gomock.Any(), clusterID).
129+
Return(initialBackupConfig, httpOk, nil).AnyTimes()
130+
s.EXPECT().SetClusterVersionDeferral(gomock.Any(), clusterID, createdVersionDeferralInfo).
131+
Return(createdVersionDeferralInfo, nil, nil)
132+
s.EXPECT().GetClusterVersionDeferral(gomock.Any(), clusterID).
133+
Return(createdVersionDeferralInfo, nil, nil)
134+
135+
// Update to 30 days
136+
s.EXPECT().GetCluster(gomock.Any(), clusterID).
137+
Return(clusterInfo, nil, nil).
138+
Times(3)
139+
s.EXPECT().GetClusterVersionDeferral(gomock.Any(), clusterID).
140+
Return(createdVersionDeferralInfo, nil, nil)
141+
s.EXPECT().SetClusterVersionDeferral(gomock.Any(), clusterID, updatedVersionDeferralInfo).
142+
Return(updatedVersionDeferralInfo, nil, nil)
143+
s.EXPECT().GetClusterVersionDeferral(gomock.Any(), clusterID).
144+
Return(updatedVersionDeferralInfo, nil, nil).
145+
Times(2)
146+
147+
// Delete
148+
s.EXPECT().DeleteCluster(gomock.Any(), clusterID)
149+
s.EXPECT().SetClusterVersionDeferral(gomock.Any(), clusterID, deletedVersionDeferralInfo)
150+
151+
testVersionDeferralResourceTransition(t, clusterName, true, "FIXED_DEFERRAL", "DEFERRAL_30_DAYS")
152+
}
153+
154+
// TestIntegrationVersionDeferral30Days tests the DEFERRAL_30_DAYS policy
155+
func TestIntegrationVersionDeferral30Days(t *testing.T) {
156+
clusterName := fmt.Sprintf("%s-deferral-30-%s", tfTestPrefix, GenerateRandomString(4))
157+
clusterID := uuid.Nil.String()
158+
if os.Getenv(CockroachAPIKey) == "" {
159+
os.Setenv(CockroachAPIKey, "fake")
160+
}
161+
162+
ctrl := gomock.NewController(t)
163+
s := mock_client.NewMockService(ctrl)
164+
defer HookGlobal(&NewService, func(c *client.Client) client.Service {
165+
return s
166+
})()
167+
168+
clusterInfo := getClusterInfo(clusterID, clusterName)
169+
170+
createdVersionDeferralInfo := &client.ClusterVersionDeferral{
171+
DeferralPolicy: client.CLUSTERVERSIONDEFERRALPOLICYTYPE_DEFERRAL_30_DAYS,
172+
}
173+
updatedVersionDeferralInfo := &client.ClusterVersionDeferral{
174+
DeferralPolicy: client.CLUSTERVERSIONDEFERRALPOLICYTYPE_DEFERRAL_60_DAYS,
175+
}
176+
deletedVersionDeferralInfo := &client.ClusterVersionDeferral{
177+
DeferralPolicy: client.CLUSTERVERSIONDEFERRALPOLICYTYPE_NOT_DEFERRED,
178+
}
179+
180+
// Create
181+
s.EXPECT().CreateCluster(gomock.Any(), gomock.Any()).
182+
Return(clusterInfo, nil, nil)
183+
s.EXPECT().GetCluster(gomock.Any(), clusterID).
184+
Return(clusterInfo, &http.Response{Status: http.StatusText(http.StatusOK)}, nil).
185+
Times(3)
186+
s.EXPECT().GetBackupConfiguration(gomock.Any(), clusterID).
187+
Return(initialBackupConfig, httpOk, nil).AnyTimes()
188+
s.EXPECT().SetClusterVersionDeferral(gomock.Any(), clusterID, createdVersionDeferralInfo).
189+
Return(createdVersionDeferralInfo, nil, nil)
190+
s.EXPECT().GetClusterVersionDeferral(gomock.Any(), clusterID).
191+
Return(createdVersionDeferralInfo, nil, nil)
192+
193+
// Update to 60 days
194+
s.EXPECT().GetCluster(gomock.Any(), clusterID).
195+
Return(clusterInfo, nil, nil).
196+
Times(3)
197+
s.EXPECT().GetClusterVersionDeferral(gomock.Any(), clusterID).
198+
Return(createdVersionDeferralInfo, nil, nil)
199+
s.EXPECT().SetClusterVersionDeferral(gomock.Any(), clusterID, updatedVersionDeferralInfo).
200+
Return(updatedVersionDeferralInfo, nil, nil)
201+
s.EXPECT().GetClusterVersionDeferral(gomock.Any(), clusterID).
202+
Return(updatedVersionDeferralInfo, nil, nil).
203+
Times(2)
204+
205+
// Delete
206+
s.EXPECT().DeleteCluster(gomock.Any(), clusterID)
207+
s.EXPECT().SetClusterVersionDeferral(gomock.Any(), clusterID, deletedVersionDeferralInfo)
208+
209+
testVersionDeferralResourceTransition(t, clusterName, true, "DEFERRAL_30_DAYS", "DEFERRAL_60_DAYS")
114210
}
115211

116-
func testVersionDeferralResource(t *testing.T, clusterName string, useMock bool) {
212+
// TestIntegrationVersionDeferral60Days tests the DEFERRAL_60_DAYS policy
213+
func TestIntegrationVersionDeferral60Days(t *testing.T) {
214+
clusterName := fmt.Sprintf("%s-deferral-60-%s", tfTestPrefix, GenerateRandomString(4))
215+
clusterID := uuid.Nil.String()
216+
if os.Getenv(CockroachAPIKey) == "" {
217+
os.Setenv(CockroachAPIKey, "fake")
218+
}
219+
220+
ctrl := gomock.NewController(t)
221+
s := mock_client.NewMockService(ctrl)
222+
defer HookGlobal(&NewService, func(c *client.Client) client.Service {
223+
return s
224+
})()
225+
226+
clusterInfo := getClusterInfo(clusterID, clusterName)
227+
228+
createdVersionDeferralInfo := &client.ClusterVersionDeferral{
229+
DeferralPolicy: client.CLUSTERVERSIONDEFERRALPOLICYTYPE_DEFERRAL_60_DAYS,
230+
}
231+
updatedVersionDeferralInfo := &client.ClusterVersionDeferral{
232+
DeferralPolicy: client.CLUSTERVERSIONDEFERRALPOLICYTYPE_DEFERRAL_90_DAYS,
233+
}
234+
deletedVersionDeferralInfo := &client.ClusterVersionDeferral{
235+
DeferralPolicy: client.CLUSTERVERSIONDEFERRALPOLICYTYPE_NOT_DEFERRED,
236+
}
237+
238+
// Create
239+
s.EXPECT().CreateCluster(gomock.Any(), gomock.Any()).
240+
Return(clusterInfo, nil, nil)
241+
s.EXPECT().GetCluster(gomock.Any(), clusterID).
242+
Return(clusterInfo, &http.Response{Status: http.StatusText(http.StatusOK)}, nil).
243+
Times(3)
244+
s.EXPECT().GetBackupConfiguration(gomock.Any(), clusterID).
245+
Return(initialBackupConfig, httpOk, nil).AnyTimes()
246+
s.EXPECT().SetClusterVersionDeferral(gomock.Any(), clusterID, createdVersionDeferralInfo).
247+
Return(createdVersionDeferralInfo, nil, nil)
248+
s.EXPECT().GetClusterVersionDeferral(gomock.Any(), clusterID).
249+
Return(createdVersionDeferralInfo, nil, nil)
250+
251+
// Update to 90 days
252+
s.EXPECT().GetCluster(gomock.Any(), clusterID).
253+
Return(clusterInfo, nil, nil).
254+
Times(3)
255+
s.EXPECT().GetClusterVersionDeferral(gomock.Any(), clusterID).
256+
Return(createdVersionDeferralInfo, nil, nil)
257+
s.EXPECT().SetClusterVersionDeferral(gomock.Any(), clusterID, updatedVersionDeferralInfo).
258+
Return(updatedVersionDeferralInfo, nil, nil)
259+
s.EXPECT().GetClusterVersionDeferral(gomock.Any(), clusterID).
260+
Return(updatedVersionDeferralInfo, nil, nil).
261+
Times(2)
262+
263+
// Delete
264+
s.EXPECT().DeleteCluster(gomock.Any(), clusterID)
265+
s.EXPECT().SetClusterVersionDeferral(gomock.Any(), clusterID, deletedVersionDeferralInfo)
266+
267+
testVersionDeferralResourceTransition(t, clusterName, true, "DEFERRAL_60_DAYS", "DEFERRAL_90_DAYS")
268+
}
269+
270+
// TestIntegrationVersionDeferral90Days tests the DEFERRAL_90_DAYS policy
271+
func TestIntegrationVersionDeferral90Days(t *testing.T) {
272+
clusterName := fmt.Sprintf("%s-deferral-90-%s", tfTestPrefix, GenerateRandomString(4))
273+
clusterID := uuid.Nil.String()
274+
if os.Getenv(CockroachAPIKey) == "" {
275+
os.Setenv(CockroachAPIKey, "fake")
276+
}
277+
278+
ctrl := gomock.NewController(t)
279+
s := mock_client.NewMockService(ctrl)
280+
defer HookGlobal(&NewService, func(c *client.Client) client.Service {
281+
return s
282+
})()
283+
284+
clusterInfo := getClusterInfo(clusterID, clusterName)
285+
286+
createdVersionDeferralInfo := &client.ClusterVersionDeferral{
287+
DeferralPolicy: client.CLUSTERVERSIONDEFERRALPOLICYTYPE_DEFERRAL_90_DAYS,
288+
}
289+
updatedVersionDeferralInfo := &client.ClusterVersionDeferral{
290+
DeferralPolicy: client.CLUSTERVERSIONDEFERRALPOLICYTYPE_NOT_DEFERRED,
291+
}
292+
deletedVersionDeferralInfo := &client.ClusterVersionDeferral{
293+
DeferralPolicy: client.CLUSTERVERSIONDEFERRALPOLICYTYPE_NOT_DEFERRED,
294+
}
295+
296+
// Create
297+
s.EXPECT().CreateCluster(gomock.Any(), gomock.Any()).
298+
Return(clusterInfo, nil, nil)
299+
s.EXPECT().GetCluster(gomock.Any(), clusterID).
300+
Return(clusterInfo, &http.Response{Status: http.StatusText(http.StatusOK)}, nil).
301+
Times(3)
302+
s.EXPECT().GetBackupConfiguration(gomock.Any(), clusterID).
303+
Return(initialBackupConfig, httpOk, nil).AnyTimes()
304+
s.EXPECT().SetClusterVersionDeferral(gomock.Any(), clusterID, createdVersionDeferralInfo).
305+
Return(createdVersionDeferralInfo, nil, nil)
306+
s.EXPECT().GetClusterVersionDeferral(gomock.Any(), clusterID).
307+
Return(createdVersionDeferralInfo, nil, nil)
308+
309+
// Update to NOT_DEFERRED
310+
s.EXPECT().GetCluster(gomock.Any(), clusterID).
311+
Return(clusterInfo, nil, nil).
312+
Times(3)
313+
s.EXPECT().GetClusterVersionDeferral(gomock.Any(), clusterID).
314+
Return(createdVersionDeferralInfo, nil, nil)
315+
s.EXPECT().SetClusterVersionDeferral(gomock.Any(), clusterID, updatedVersionDeferralInfo).
316+
Return(updatedVersionDeferralInfo, nil, nil)
317+
s.EXPECT().GetClusterVersionDeferral(gomock.Any(), clusterID).
318+
Return(updatedVersionDeferralInfo, nil, nil).
319+
Times(2)
320+
321+
// Delete
322+
s.EXPECT().DeleteCluster(gomock.Any(), clusterID)
323+
s.EXPECT().SetClusterVersionDeferral(gomock.Any(), clusterID, deletedVersionDeferralInfo)
324+
325+
testVersionDeferralResourceTransition(t, clusterName, true, "DEFERRAL_90_DAYS", "NOT_DEFERRED")
326+
}
327+
328+
func testVersionDeferralResourceTransition(t *testing.T, clusterName string, useMock bool, from string, to string) {
117329
var (
118330
clusterResourceName = "cockroach_cluster.test"
119331
versionDeferralResourceName = "cockroach_version_deferral.test"
@@ -125,17 +337,17 @@ func testVersionDeferralResource(t *testing.T, clusterName string, useMock bool)
125337
ProtoV6ProviderFactories: testAccProtoV6ProviderFactories,
126338
Steps: []resource.TestStep{
127339
{
128-
Config: getTestVersionDeferralResourceCreateConfig(clusterName),
340+
Config: getTestVersionDeferralConfig(clusterName, from),
129341
Check: resource.ComposeTestCheckFunc(
130342
testCheckCockroachClusterExists(clusterResourceName),
131-
resource.TestCheckResourceAttr(versionDeferralResourceName, "deferral_policy", "FIXED_DEFERRAL"),
343+
resource.TestCheckResourceAttr(versionDeferralResourceName, "deferral_policy", from),
132344
),
133345
},
134346
{
135-
Config: getTestVersionDeferralResourceUpdateConfig(clusterName),
347+
Config: getTestVersionDeferralConfig(clusterName, to),
136348
Check: resource.ComposeTestCheckFunc(
137349
testCheckCockroachClusterExists(clusterResourceName),
138-
resource.TestCheckResourceAttr(versionDeferralResourceName, "deferral_policy", "NOT_DEFERRED"),
350+
resource.TestCheckResourceAttr(versionDeferralResourceName, "deferral_policy", to),
139351
),
140352
},
141353
{
@@ -147,28 +359,33 @@ func testVersionDeferralResource(t *testing.T, clusterName string, useMock bool)
147359
})
148360
}
149361

150-
func getTestVersionDeferralResourceCreateConfig(name string) string {
151-
return fmt.Sprintf(`
152-
resource "cockroach_cluster" "test" {
153-
name = "%s"
154-
cloud_provider = "GCP"
155-
dedicated = {
156-
storage_gib = 35
157-
num_virtual_cpus = 4
158-
}
159-
regions = [{
160-
name = "us-east1"
161-
node_count: 3
162-
}]
163-
}
164-
resource "cockroach_version_deferral" "test" {
165-
id = cockroach_cluster.test.id
166-
deferral_policy = "FIXED_DEFERRAL"
167-
}
168-
`, name)
362+
func getClusterInfo(clusterID string, clusterName string) *client.Cluster {
363+
clusterInfo := &client.Cluster{
364+
Id: clusterID,
365+
Name: clusterName,
366+
CockroachVersion: "v22.2.0",
367+
Plan: "ADVANCED",
368+
CloudProvider: "GCP",
369+
State: "CREATED",
370+
Config: client.ClusterConfig{
371+
Dedicated: &client.DedicatedHardwareConfig{
372+
MachineType: "m5.xlarge",
373+
NumVirtualCpus: 4,
374+
StorageGib: 35,
375+
MemoryGib: 8,
376+
},
377+
},
378+
Regions: []client.Region{
379+
{
380+
Name: "us-east1",
381+
NodeCount: 3,
382+
},
383+
},
384+
}
385+
return clusterInfo
169386
}
170387

171-
func getTestVersionDeferralResourceUpdateConfig(name string) string {
388+
func getTestVersionDeferralConfig(name string, policy string) string {
172389
return fmt.Sprintf(`
173390
resource "cockroach_cluster" "test" {
174391
name = "%s"
@@ -184,7 +401,7 @@ resource "cockroach_cluster" "test" {
184401
}
185402
resource "cockroach_version_deferral" "test" {
186403
id = cockroach_cluster.test.id
187-
deferral_policy = "NOT_DEFERRED"
404+
deferral_policy = "%s"
188405
}
189-
`, name)
406+
`, name, policy)
190407
}

0 commit comments

Comments
 (0)