Skip to content

Commit 66c9e55

Browse files
committed
Add --maintenance-window-start to create command.
Adds a new flag to the cluster `create` command for setting the desired hour of day which a maintenance window can possibly start. Valid values for this flag are `0 - 23`. Also, this flag is NOT allowed on with `--fork` or `--replica`.
1 parent 6a04aea commit 66c9e55

File tree

6 files changed

+56
-2
lines changed

6 files changed

+56
-2
lines changed

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
55
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
66

77
## [Unreleased]
8+
### Added
9+
- `cb create` now accepts `--maintenance-window-start`.
810

911
## [3.6.5] - 2024-04-30
1012
- Missing values from cluster upgrade operation state enum

spec/cb/cluster_create_spec.cr

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,28 @@ Spectator.describe CB::ClusterCreate do
9292
end
9393
end
9494

95+
describe "#maintenance_window_start=" do
96+
sample [nil, 0, 23] do |start|
97+
it "allows valid values" do
98+
expect(&.maintenance_window_start = start).to_not raise_error
99+
end
100+
end
101+
102+
it "does not allow `--maintenance-window-start` with `--fork`" do
103+
action.fork = cluster.id
104+
action.maintenance_window_start = 0
105+
106+
expect(&.pre_validate).to raise_error(Program::Error, "Cannot use '--maintenance-window-start' with '--fork' or '--replica'")
107+
end
108+
109+
it "does not allow `--maintenance-window-start` with `--replica`" do
110+
action.fork = cluster.id
111+
action.maintenance_window_start = 0
112+
113+
expect(&.pre_validate).to raise_error(Program::Error, "Cannot use '--maintenance-window-start' with '--fork' or '--replica'")
114+
end
115+
end
116+
95117
describe "#team=" do
96118
sample invalid_ids do |team|
97119
it "does not allow invalid values" do
@@ -165,6 +187,14 @@ Spectator.describe CB::ClusterCreate do
165187
expect(&.call).to raise_error(CB::Program::Error, "Must also specify '--region' for a 'gcp' based network.")
166188
end
167189

190+
it "raises error when maintenance_window_start is invalid" do
191+
action.plan = "hobby-2"
192+
action.platform = "aws"
193+
action.region = "east"
194+
action.maintenance_window_start = 24
195+
expect(&.call).to raise_error(CB::Program::Error, "Invalid value for '--maintenance-window-start', valid values: 0 - 23")
196+
end
197+
168198
it "raises error when region or provider given with non-gcp network" do
169199
network = Factory.network
170200

src/cb/cluster_create.cr

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,24 @@ class CB::ClusterCreate < CB::APIAction
1313
eid_setter replica, "replica id"
1414
eid_setter fork, "fork id"
1515
property at : Time?
16+
i32_setter maintenance_window_start
1617

17-
def pre_validate
18+
private def validate_fork_and_replica
1819
raise Error.new "Cannot use both '--fork' and '--replica' at the same time." if fork && replica
20+
end
21+
22+
private def validate_maintenance_window_with_fork_or_replica
23+
raise Error.new "Cannot use '--maintenance-window-start' with '--fork' or '--replica'" if maintenance_window_start && (fork || replica)
24+
end
25+
26+
private def validate_maintenance_window_range
27+
raise Error.new "Invalid value for '--maintenance-window-start', valid values: 0 - 23" if (start = maintenance_window_start) && !start.in?(0..23)
28+
end
29+
30+
def pre_validate
31+
validate_fork_and_replica
32+
validate_maintenance_window_with_fork_or_replica
33+
validate_maintenance_window_range
1934

2035
if id = fork || replica
2136
source = client.get_cluster id
@@ -69,9 +84,10 @@ class CB::ClusterCreate < CB::APIAction
6984
else
7085
@client.create_cluster CB::Client::ClusterCreateParams.new(**params.merge(
7186
is_ha: @ha,
87+
maintenance_window_start: @maintenance_window_start,
88+
postgres_version_id: @postgres_version,
7289
storage: @storage,
7390
team_id: @team.to_s,
74-
postgres_version_id: @postgres_version,
7591
))
7692
end
7793

src/cb/completion.cr

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -223,6 +223,7 @@ class CB::Completion
223223
suggest << "--fork\tcluster to fork" unless has_full_flag?(:fork) || has_full_flag?(:replica)
224224
suggest << "--ha\thigh availability" unless has_full_flag?(:ha) || has_full_flag?(:replica)
225225
suggest << "--help\tshow help" if args.size == 2
226+
suggest << "--maintenance-window-start\tstart hour for maintenance window" unless has_full_flag? :maintenance_window_start
226227
suggest << "--name\tcluster name" unless has_full_flag? :name
227228
suggest << "--network\tnetwork id" unless has_full_flag? :network
228229
suggest << "--platform\tcloud provider" unless has_full_flag? :platform
@@ -240,6 +241,7 @@ class CB::Completion
240241
return suggest_none if last_arg? "-n", "--name"
241242
return suggest_none if last_arg? "--network"
242243
return suggest_none if last_arg? "-v", "--version"
244+
return suggest_none if last_arg? "--maintenance-window-start"
243245

244246
create_fork_suggest.tap { |s| return s if s } if args.includes? "--fork"
245247
create_replica_suggest.tap { |s| return s if s } if args.includes? "--replica"
@@ -1383,6 +1385,7 @@ class CB::Completion
13831385
full << :use_cluster_maintenance_window if has_full_flag? "use-cluster-maintenance-window"
13841386
full << :no_header if has_full_flag? "--no-header"
13851387
full << :peering if has_full_flag? "--peering"
1388+
full << :maintenance_window_start if has_full_flag? "--maintenance-window-start"
13861389
full
13871390
end
13881391

src/cli.cr

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,7 @@ op = OptionParser.new do |parser|
152152
parser.on("-v VERSION", "--version VERSION", "Postgres major version") { |arg| create.postgres_version = arg }
153153
parser.on("-s GiB", "--storage GiB", "Storage size (default: 100GiB, or same as source)") { |arg| create.storage = arg }
154154
parser.on("-t ID", "--team ID", "Team") { |arg| create.team = arg }
155+
parser.on("--maintenance-window-start START", "Maintenance window start hour (Valid values: 0 - 23)") { |arg| create.maintenance_window_start = arg }
155156
parser.on("--network network", "Network") { |arg| create.network = arg }
156157

157158
parser.on("--replica ID", "Choose source cluster for read-replica") { |arg| create.replica = arg }

src/client/cluster.cr

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,7 @@ module CB
8989
struct ClusterCreateParams < CommonCreateParams
9090
property environment : String?
9191
property is_ha : Bool?
92+
property maintenance_window_start : Int32?
9293
property postgres_version_id : Int32?
9394
property storage : Int32?
9495
property team_id : String
@@ -97,6 +98,7 @@ module CB
9798
@name, @plan_id, @provider_id, @region_id, @team_id,
9899
@environment = nil,
99100
@is_ha = nil,
101+
@maintenance_window_start = nil,
100102
@postgres_version_id = nil,
101103
@storage = nil,
102104
@network_id = nil

0 commit comments

Comments
 (0)