juju.plugin.zsh
6231 bytes
1# ---------------------------------------------------------- #
2# Aliases and functions for juju (https://juju.is) #
3# #
4# Generally, #
5# - `!` means --force --no-wait -y #
6# - `ds` suffix means --destroy-storage #
7# - `jsh` prefix means juju show-* #
8# ---------------------------------------------------------- #
9alias j="juju"
10alias jam="juju add-model --config logging-config=\"<root>=WARNING; unit=DEBUG\"\
11 --config update-status-hook-interval=\"60m\""
12alias jb='juju bootstrap'
13alias jbng='juju bootstrap --no-gui'
14alias jbl='juju bootstrap localhost'
15alias jblng='juju bootstrap --no-gui localhost'
16alias jbm='juju bootstrap microk8s'
17alias jbmng='juju bootstrap --no-gui microk8s'
18alias jc='juju config'
19alias jcld='juju clouds'
20alias jclda='juju clouds --all'
21alias jctl='juju controllers'
22alias jctlr='juju controllers --refresh'
23alias jdc='juju destroy-controller --destroy-all-models'
24alias 'jdc!'='juju destroy-controller --destroy-all-models --force --no-wait -y'
25alias jdcds='juju destroy-controller --destroy-all-models --destroy-storage'
26alias 'jdcds!'='juju destroy-controller --destroy-all-models --destroy-storage --force --no-wait -y'
27alias jdm='juju destroy-model'
28alias 'jdm!'='juju destroy-model --force --no-wait -y'
29alias jdmds='juju destroy-model --destroy-storage'
30alias 'jdmds!'='juju destroy-model --destroy-storage --force --no-wait -y'
31alias jde='juju deploy --channel=edge'
32alias jd='juju deploy'
33alias jdl='juju debug-log --ms'
34alias jdlr='juju debug-log --ms --replay'
35alias jcon='juju consume'
36alias jeb='juju export-bundle'
37alias jex='juju expose'
38alias jh='juju help'
39alias jkc='juju kill-controller -y -t 0'
40alias jm='juju models'
41alias jmc='juju model-config'
42alias jof='juju offer'
43alias jra='juju run-action'
44alias jraw='juju run-action --wait'
45alias jrel='juju relate'
46alias jrm='juju remove-application'
47alias 'jrm!'='juju remove-application --force --no-wait'
48alias jrmds='juju remove-application --destroy-storage'
49alias 'jrmds!'='juju remove-application --destroy-storage --force --no-wait'
50alias jrmrel='juju remove-relation'
51alias 'jrmrel!'='juju remove-relation --force'
52alias jrmsas='juju remove-saas'
53alias jrp='juju refresh --path'
54alias jrs='juju remove-storage'
55alias 'jrs!'='juju remove-storage --force'
56alias jsa='juju scale-application'
57alias jsha='juju show-application'
58alias jshc='juju show-controller'
59alias jshm='juju show-model'
60alias jshsl='juju show-status-log'
61alias jshu='juju show-unit'
62alias jssh='juju ssh'
63alias jsshc='juju ssh --container'
64alias jstj='juju status --format=json'
65alias jst='juju status --relations --color'
66alias jsts='juju status --relations --storage --color'
67alias jsw='juju switch'
68
69# ---------------------------------------------------------- #
70# Functions (in alphabetic order) #
71# ---------------------------------------------------------- #
72
73# Get app or unit address
74jaddr() {
75 # $1 = app name
76 # $2 = unit number (optional)
77 if (( ! ${+commands[jq]} )); then
78 echo "jq is required but could not be found." >&2
79 return 1
80 fi
81
82 if [[ $# -eq 1 ]]; then
83 # Get app address
84 juju status "$1" --format=json \
85 | jq -r ".applications.\"$1\".address"
86 elif [[ $# -eq 2 ]]; then
87 # Get unit address
88 juju status "$1/$2" --format=json \
89 | jq -r ".applications.\"$1\".units.\"$1/$2\" | .address // .\"public-address\""
90 else
91 echo "Invalid number of arguments."
92 echo "Usage: jaddr <app-name> [<unit-number>]"
93 echo "Example: jaddr karma"
94 echo "Example: jaddr karma 0"
95 return 1
96 fi
97}
98
99# Destroy all controllers
100jclean() {
101 if (( ! ${+commands[jq]} )); then
102 echo "jq is required but could not be found." >&2
103 return 1
104 fi
105
106 local controllers=$(juju controllers --format=json | jq -r '.controllers | keys[]' 2>/dev/null)
107 if [[ -z "$controllers" ]]; then
108 echo "No controllers registered"
109 return 0
110 fi
111
112 echo "This will forcefully destroy all storages, models and controllers."
113 echo "Controllers to be destroyed:"
114 echo "$controllers"
115
116 if ! read -q '?Are you sure (y/n)? '; then
117 echo
118 echo "Aborted."
119 return 0
120 fi
121
122 echo
123 local controller
124 for controller in ${=controllers}; do
125 timeout 2m juju destroy-controller --destroy-all-models --destroy-storage --force --no-wait -y $controller
126 timeout 2m juju kill-controller -y -t 0 $controller 2>/dev/null
127 timeout 10s juju unregister $controller 2>/dev/null
128 done
129}
130
131# Display app and unit relation data
132jreld() {
133 # $1 = relation name
134 # $2 = app name
135 # $3 = unit number
136 if [[ $# -ne 3 ]]; then
137 echo "Invalid number of arguments."
138 echo "Usage: jreld <relation-name> <app-name> <unit-number>"
139 echo "Example: jreld karma-dashboard alertmanager 0"
140 return 1
141 fi
142
143 local relid="$(juju run "relation-ids $1" --unit $2/$3)"
144 if [[ -z "$relid" ]]; then
145 return 1
146 fi
147
148 echo "App data:"
149 juju run "relation-get -r $relid --app - $2" --unit $2/$3
150 echo
151 echo "Unit data:"
152 juju run "relation-get -r $relid - $2" --unit $2/$3
153}
154
155# Return Juju current controller
156jcontroller() {
157 local file="${JUJU_DATA:-$HOME/.local/share/juju}/controllers.yaml"
158 [[ -f "$file" ]] || return 1
159
160 local controller="$(awk '/current-controller/ {print $2}' "$file")"
161 [[ -z "$controller" ]] && return 1
162
163 echo $controller
164 return 0
165}
166
167# Return Juju current model
168jmodel() {
169 local file="${JUJU_DATA:-$HOME/.local/share/juju}/models.yaml"
170 [[ -f "$file" ]] || return 1
171
172 local yqbin="$(whereis yq | awk '{print $2}')"
173
174 if [[ -z "$yqbin" ]]; then
175 echo "--"
176 return 1
177 fi
178
179 local controller="$(jcontroller)"
180 local model="$(yq e ".controllers.[\"${controller}\"].current-model" < "${file}" | cut -d/ -f2)"
181
182 if [[ -z "$model" || $model == "null" ]]; then
183 echo "--"
184 return 1
185 fi
186
187 echo $model
188 return 0
189}
190
191# Watch juju status, with optional interval (default: 1 sec)
192wjst() {
193 command -v juju >/dev/null 2>&1 || return 1
194 local interval="${1:-1}"
195 shift $(( $# > 0 ))
196 watch -n "$interval" --color juju status --relations --color "$@"
197}