Skip to content

Commit 6527ae9

Browse files
authored
Add support for -n/-A to select namespace(s) (#586)
* Add support for -n/-A to select namespace(s) You can now use `-n NAMESPACE` in most commands or `-A` in some to list objects across namespaces. Note: these flags need to be specified immediately after `kubectl rabbitmq`. One day we'll probably rewrite the whole plugin in Go and it will be easier to handle more flexible flag parsing.
1 parent 6d87af8 commit 6527ae9

File tree

2 files changed

+99
-41
lines changed

2 files changed

+99
-41
lines changed

bin/kubectl-rabbitmq

Lines changed: 62 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -10,60 +10,63 @@
1010

1111
set -euo pipefail
1212

13+
NAMESPACE=""
14+
1315
instance=""
1416
username=""
1517
password=""
1618
service=""
1719

1820
usage() {
19-
usage=$(cat <<-END
21+
usage=$(
22+
cat <<-END
2023
USAGE:
2124
Install (latest released) RabbitMQ Cluster Operator
2225
kubectl rabbitmq install-cluster-operator
2326
2427
Create a RabbitMQ custom resource - INSTANCE name required, all other flags optional
25-
kubectl rabbitmq create INSTANCE --replicas 1 --service ClusterIP --image rabbitmq:3.8.10-management --image-pull-secret mysecret
28+
kubectl rabbitmq [-n NAMESPACE] create INSTANCE --replicas 1 --service ClusterIP --image rabbitmq:3.8.10-management --image-pull-secret mysecret
2629
--tls-secret secret-name --storage-class mystorageclass
2730
2831
Get a RabbitMQ custom resource and dependant objects
29-
kubectl rabbitmq get INSTANCE
32+
kubectl rabbitmq [-n NAMESPACE | -A] get INSTANCE
3033
3134
List all RabbitMQ clusters
32-
kubectl rabbitmq list
35+
kubectl rabbitmq [-n NAMESPACE | -A] list
3336
3437
Delete a RabbitMQ cluster (or multiple clusters)
35-
kubectl rabbitmq delete INSTANCE ...
38+
kubectl rabbitmq [-n NAMESPACE] delete INSTANCE ...
3639
3740
Print default-user secrets for an instance
38-
kubectl rabbitmq secrets INSTANCE
41+
kubectl rabbitmq [-n NAMESPACE] secrets INSTANCE
3942
4043
Open Management UI for an instance
41-
kubectl rabbitmq manage INSTANCE
44+
kubectl rabbitmq [-n NAMESPACE] manage INSTANCE
4245
4346
Set log level to 'debug' on all nodes
44-
kubectl rabbitmq debug INSTANCE
47+
kubectl rabbitmq [-n NAMESPACE] debug INSTANCE
4548
4649
Tail logs from all nodes
47-
kubectl rabbitmq tail INSTANCE
50+
kubectl rabbitmq [-n NAMESPACE] tail INSTANCE
4851
'tail' subcommand requires the 'tail' plugin. You can install it with 'kubectl krew install tail'
4952
5053
Run 'rabbitmq-diagnostics observer' on a specific INSTANCE NODE
51-
kubectl rabbitmq observe INSTANCE 0
54+
kubectl rabbitmq [-n NAMESPACE] observe INSTANCE 0
5255
5356
Enable all feature flags on an INSTANCE
54-
kubectl rabbitmq enable-all-feature-flags INSTANCE
57+
kubectl rabbitmq [-n NAMESPACE] enable-all-feature-flags INSTANCE
5558
5659
Pause reconciliation for an instance
57-
kubectl rabbitmq pause-reconciliation INSTANCE
60+
kubectl rabbitmq [-n NAMESPACE] pause-reconciliation INSTANCE
5861
5962
Resume reconciliation for an instance
60-
kubectl rabbitmq resume-reconciliation INSTANCE
63+
kubectl rabbitmq [-n NAMESPACE] resume-reconciliation INSTANCE
6164
6265
List all instances that has the pause reconciliation label
63-
kubectl rabbitmq list-pause-reconciliation-instances
66+
kubectl rabbitmq [-n NAMESPACE | -A] list-pause-reconciliation-instances
6467
6568
Run perf-test against an instance - you can pass as many perf test parameters as you want
66-
kubectl rabbitmq perf-test INSTANCE --rate 100
69+
kubectl rabbitmq [-n NAMESPACE] perf-test INSTANCE --rate 100
6770
If you want to monitor perf-test, create the following ServiceMonitor:
6871
apiVersion: monitoring.coreos.com/v1
6972
kind: ServiceMonitor
@@ -83,8 +86,8 @@ USAGE:
8386
Print kubectl-rabbitmq plugin version
8487
kubectl rabbitmq version
8588
END
86-
)
87-
echo "$usage"
89+
)
90+
echo "$usage"
8891
}
8992

9093
version() {
@@ -113,8 +116,8 @@ version() {
113116

114117
get_instance_details() {
115118
instance=${1}
116-
username=$(kubectl get secret "${instance}-default-user" -o jsonpath="{.data.username}" | base64 --decode)
117-
password=$(kubectl get secret "${instance}-default-user" -o jsonpath="{.data.password}" | base64 --decode)
119+
username=$(kubectl get ${NAMESPACE} secret "${instance}-default-user" -o jsonpath="{.data.username}" | base64 --decode)
120+
password=$(kubectl get ${NAMESPACE} secret "${instance}-default-user" -o jsonpath="{.data.password}" | base64 --decode)
118121
service="$instance"
119122
}
120123

@@ -123,7 +126,7 @@ perf_test() {
123126
shift 1
124127
perftestopts=$*
125128

126-
kubectl run perf-test \
129+
kubectl ${NAMESPACE} run perf-test \
127130
--expose=true \
128131
--port=8080 \
129132
--labels="app=perf-test,run=perf-test" \
@@ -139,11 +142,11 @@ manage() {
139142
sleep 2
140143
open "http://localhost:15672/"
141144
) &
142-
kubectl port-forward "service/${service}" 15672
145+
kubectl ${NAMESPACE} port-forward "service/${service}" 15672
143146
}
144147

145148
list_rabbitmq_clusters() {
146-
kubectl get rabbitmqclusters
149+
kubectl get ${NAMESPACE} rabbitmqclusters
147150
}
148151

149152
create() {
@@ -211,48 +214,48 @@ create() {
211214
;;
212215
esac
213216
done
214-
kubectl apply -f "$rabbitmq_manifest_file"
217+
kubectl ${NAMESPACE} apply -f "$rabbitmq_manifest_file"
215218
}
216219

217220
delete() {
218221
for cluster in "$@"; do
219-
kubectl delete rabbitmqcluster "${cluster}"
222+
kubectl ${NAMESPACE} delete rabbitmqcluster "${cluster}"
220223
done
221224
}
222225

223226
observe() {
224-
kubectl exec -it "${1}-server-${2}" -- rabbitmq-diagnostics observer
227+
kubectl ${NAMESPACE} exec -it "${1}-server-${2}" -- rabbitmq-diagnostics observer
225228
}
226229

227230
get() {
228-
kubectl get pods,cm,sts,svc,secrets,rs -l "app.kubernetes.io/name=$1"
231+
kubectl get ${NAMESPACE} pods,cm,sts,svc,secrets,rs -l "app.kubernetes.io/name=$1"
229232
}
230233

231234
debug() {
232-
for node in $(kubectl get pods -l "app.kubernetes.io/name=${1}" -ocustom-columns=name:.metadata.name --no-headers); do
235+
for node in $(kubectl ${NAMESPACE} get pods -l "app.kubernetes.io/name=${1}" -ocustom-columns=name:.metadata.name --no-headers); do
233236
echo -n "${node}: "
234-
kubectl exec "${node}" -- rabbitmqctl set_log_level debug
237+
kubectl ${NAMESPACE} exec "${node}" -- rabbitmqctl set_log_level debug
235238
done
236239
}
237240

238241
tail() {
239-
kubectl tail --svc "${1}"
242+
kubectl ${NAMESPACE} tail --svc "${1}"
240243
}
241244

242245
enable_all_feature_flags() {
243-
kubectl exec "${1}-server-0" -- bash -c "rabbitmqctl list_feature_flags | grep disabled | cut -f 1 | xargs -r -L1 rabbitmqctl enable_feature_flag"
246+
kubectl ${NAMESPACE} exec "${1}-server-0" -- bash -c "rabbitmqctl list_feature_flags | grep disabled | cut -f 1 | xargs -r -L1 rabbitmqctl enable_feature_flag"
244247
}
245248

246249
pause-reconciliation() {
247-
kubectl label rabbitmqclusters "${1}" rabbitmq.com/pauseReconciliation=true
250+
kubectl ${NAMESPACE} label rabbitmqclusters "${1}" rabbitmq.com/pauseReconciliation=true
248251
}
249252

250253
resume-reconciliation() {
251-
kubectl label rabbitmqclusters "${1}" rabbitmq.com/pauseReconciliation-
254+
kubectl ${NAMESPACE} label rabbitmqclusters "${1}" rabbitmq.com/pauseReconciliation-
252255
}
253256

254257
list-pause-reconciliation-instances() {
255-
kubectl get rabbitmqclusters -l rabbitmq.com/pauseReconciliation=true --show-labels
258+
kubectl get ${NAMESPACE} rabbitmqclusters -l rabbitmq.com/pauseReconciliation=true --show-labels
256259
}
257260

258261
secrets() {
@@ -262,10 +265,35 @@ secrets() {
262265
}
263266

264267
install_cluster_operator() {
265-
kubectl apply -f https://github.com/rabbitmq/cluster-operator/releases/latest/download/cluster-operator.yml
268+
kubectl ${NAMESPACE} apply -f https://github.com/rabbitmq/cluster-operator/releases/latest/download/cluster-operator.yml
266269
}
267270

268271
main() {
272+
if [[ "$1" == "--help" ]]; then
273+
usage
274+
exit 0
275+
fi
276+
277+
while getopts ':n:Ah' opt; do
278+
case "${opt}" in
279+
h)
280+
usage
281+
exit 0
282+
;;
283+
A)
284+
NAMESPACE="--all-namespaces"
285+
shift 1
286+
;;
287+
n)
288+
NAMESPACE="-n ${OPTARG}"
289+
shift 2
290+
;;
291+
*)
292+
usage
293+
;;
294+
esac
295+
done
296+
269297
case "$1" in
270298
"perf-test")
271299
shift 1
@@ -382,12 +410,6 @@ main() {
382410
"help")
383411
usage
384412
;;
385-
"--help")
386-
usage
387-
;;
388-
"-h")
389-
usage
390-
;;
391413
"version")
392414
version
393415
;;

bin/kubectl-rabbitmq.bats

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ eventually() {
7575
[[ $(kubectl get pvc persistence-bats-configured-server-0 -o jsonpath='{.spec.storageClassName}') == "$storage_class" ]]
7676
}
7777

78-
@test "list lists all RabbitMQ clusters" {
78+
@test "list lists all RabbitMQ clusters in the current namespace" {
7979
run kubectl rabbitmq list
8080

8181
[ "$status" -eq 0 ]
@@ -84,6 +84,42 @@ eventually() {
8484
[[ "${lines[2]}" =~ ^bats-default ]]
8585
}
8686

87+
@test "list supports -n NAMESPACE flag" {
88+
CLUSTER_NAMESPACE="$(kubectl config view --minify --output 'jsonpath={..namespace}')"
89+
# if namespace is not set in kube config, take the default namespace
90+
CLUSTER_NAMESPACE="${CLUSTER_NAMESPACE:=default}"
91+
92+
kubectl create namespace kubectl-rabbitmq-tests
93+
kubectl config set-context --current --namespace=kubectl-rabbitmq-tests
94+
95+
run kubectl rabbitmq -n "${CLUSTER_NAMESPACE}" list
96+
97+
[ "$status" -eq 0 ]
98+
[[ "${lines[0]}" =~ ^NAME ]]
99+
[[ "${lines[1]}" =~ ^bats-configured ]]
100+
[[ "${lines[2]}" =~ ^bats-default ]]
101+
102+
kubectl config set-context --current --namespace="${CLUSTER_NAMESPACE}"
103+
kubectl delete namespace kubectl-rabbitmq-tests
104+
}
105+
106+
@test "list supports -A flag" {
107+
CLUSTER_NAMESPACE="$(kubectl config view --minify --output 'jsonpath={..namespace}')"
108+
109+
kubectl create namespace kubectl-rabbitmq-tests
110+
kubectl config set-context --current --namespace=kubectl-rabbitmq-tests
111+
112+
run kubectl rabbitmq -A list
113+
114+
[ "$status" -eq 0 ]
115+
[[ "$output" == *"NAMESPACE"* ]]
116+
[[ "$output" == *"bats-configured"* ]]
117+
[[ "$output" == *"bats-default"* ]]
118+
119+
kubectl config set-context --current --namespace="${CLUSTER_NAMESPACE}"
120+
kubectl delete namespace kubectl-rabbitmq-tests
121+
}
122+
87123
@test "get gets child resources" {
88124
run kubectl rabbitmq get bats-default
89125

0 commit comments

Comments
 (0)