Parent directory

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}