summaryrefslogtreecommitdiff
path: root/plugins/juju/juju.plugin.zsh
blob: 0c60e35ceb7f9f6d833a228a753e84359ac73000 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
# ---------------------------------------------------------- #
# Aliases and functions for juju (https://juju.is)           #
# ---------------------------------------------------------- #

# Load TAB completions
# You need juju's bash completion script installed. By default bash-completion's
# location will be used (i.e. pkg-config --variable=completionsdir bash-completion).
completion_file="$(pkg-config --variable=completionsdir bash-completion 2>/dev/null)/juju" || \
  completion_file="/usr/share/bash-completion/completions/juju"
[[ -f "$completion_file" ]] && source "$completion_file"
unset completion_file

# ---------------------------------------------------------- #
# Aliases (in alphabetic order)                              #
#                                                            #
# Generally,                                                 #
#   - `!` means --force --no-wait -y                         #
#   - `ds` suffix means --destroy-storage                    #
#   - `jsh` prefix means juju show-*                         #
# ---------------------------------------------------------- #
alias j="juju"
alias jam="juju add-model --config logging-config=\"<root>=WARNING; unit=DEBUG\"\
 --config update-status-hook-interval=\"60m\""
alias jb='juju bootstrap'
alias jbng='juju bootstrap --no-gui'
alias jbl='juju bootstrap localhost'
alias jblng='juju bootstrap --no-gui localhost'
alias jbm='juju bootstrap microk8s'
alias jbmng='juju bootstrap --no-gui microk8s'
alias jc='juju config'
alias jcld='juju clouds'
alias jclda='juju clouds --all'
alias jctl='juju controllers'
alias jctlr='juju controllers --refresh'
alias jdc='juju destroy-controller --destroy-all-models'
alias 'jdc!'='juju destroy-controller --destroy-all-models --force --no-wait -y'
alias jdcds='juju destroy-controller --destroy-all-models --destroy-storage'
alias 'jdcds!'='juju destroy-controller --destroy-all-models --destroy-storage --force --no-wait -y'
alias jdm='juju destroy-model'
alias 'jdm!'='juju destroy-model --force --no-wait -y'
alias jdmds='juju destroy-model --destroy-storage'
alias 'jdmds!'='juju destroy-model --destroy-storage --force --no-wait -y'
alias jde='juju deploy --channel=edge'
alias jd='juju deploy'
alias jdl='juju debug-log --ms'
alias jdlr='juju debug-log --ms --replay'
alias jcon='juju consume'
alias jeb='juju export-bundle'
alias jex='juju expose'
alias jh='juju help'
alias jkc='juju kill-controller -y -t 0'
alias jm='juju models'
alias jmc='juju model-config'
alias jof='juju offer'
alias jra='juju run-action'
alias jraw='juju run-action --wait'
alias jrel='juju relate'
alias jrm='juju remove-application'
alias 'jrm!'='juju remove-application --force --no-wait'
alias jrmds='juju remove-application --destroy-storage'
alias 'jrmds!'='juju remove-application --destroy-storage --force --no-wait'
alias jrmrel='juju remove-relation'
alias 'jrmrel!'='juju remove-relation --force'
alias jrmsas='juju remove-saas'
alias jrp='juju refresh --path'
alias jrs='juju remove-storage'
alias 'jrs!'='juju remove-storage --force'
alias jsa='juju scale-application'
alias jsha='juju show-application'
alias jshc='juju show-controller'
alias jshm='juju show-model'
alias jshsl='juju show-status-log'
alias jshu='juju show-unit'
alias jssh='juju ssh'
alias jsshc='juju ssh --container'
alias jstj='juju status --format=json'
alias jst='juju status --relations --color'
alias jsts='juju status --relations --storage --color'
alias jsw='juju switch'

# ---------------------------------------------------------- #
# Functions (in alphabetic order)                            #
# ---------------------------------------------------------- #

# Get app or unit address
jaddr() {
  # $1 = app name
  # $2 = unit number (optional)
  if (( ! ${+commands[jq]} )); then
    echo "jq is required but could not be found." >&2
    return 1
  fi

  if [[ $# -eq 1 ]]; then
    # Get app address
    juju status "$1" --format=json \
      | jq -r ".applications.\"$1\".address"
  elif [[ $# -eq 2 ]]; then
    # Get unit address
    juju status "$1/$2" --format=json \
      | jq -r ".applications.\"$1\".units.\"$1/$2\".address"
  else
    echo "Invalid number of arguments."
    echo "Usage:   jaddr <app-name> [<unit-number>]"
    echo "Example: jaddr karma"
    echo "Example: jaddr karma 0"
    return 1
  fi
}

# Destroy all controllers
jclean() {
  if (( ! ${+commands[jq]} )); then
    echo "jq is required but could not be found." >&2
    return 1
  fi

  local controllers=$(juju controllers --format=json | jq -r '.controllers | keys[]' 2>/dev/null)
  if [[ -z "$controllers" ]]; then
    echo "No controllers registered"
    return 0
  fi

  echo "This will forcefully destroy all storages, models and controllers."
  echo "Controllers to be destroyed:"
  echo "$controllers"

  if ! read -q '?Are you sure (y/n)? '; then
    echo
    echo "Aborted."
    return 0
  fi

  echo
  for controller in ${=controllers}; do
    timeout 2m juju destroy-controller --destroy-all-models --destroy-storage --force --no-wait -y $controller
    timeout 2m juju kill-controller -y -t 0 $controller 2>/dev/null
    timeout 10s juju unregister $controller 2>/dev/null
  done
}

# Display app and unit relation data
jreld() {
  # $1 = relation name
  # $2 = app name
  # $3 = unit number
  if [[ $# -ne 3 ]]; then
    echo "Invalid number of arguments."
    echo "Usage:   jreld <relation-name> <app-name> <unit-number>"
    echo "Example: jreld karma-dashboard alertmanager 0"
    return 1
  fi

  local relid="$(juju run "relation-ids $1" --unit $2/$3)"
  if [[ -z "$relid" ]]; then
    return 1
  fi

  echo "App data:"
  juju run "relation-get -r $relid --app - $2" --unit $2/$3
  echo
  echo "Unit data:"
  juju run "relation-get -r $relid - $2" --unit $2/$3
}

# Return Juju current controller
jcontroller() {
  local controller="$(awk '/current-controller/ {print $2}' ~/.local/share/juju/controllers.yaml)"
  if [[ -z "$controller" ]]; then
    return 1
  fi

  echo $controller
  return 0
}

# Return Juju current model
jmodel() {
  local yqbin="$(whereis yq | awk '{print $2}')"

  if [[ -z "$yqbin" ]]; then
    echo "--"
    return 1
  fi

  local model="$(yq e ".controllers.$(jcontroller).current-model" < ~/.local/share/juju/models.yaml | cut -d/ -f2)"
  
  if [[ -z "$model" ]]; then
    echo "--"
    return 1
  fi

  echo $model
  return 0
}

# Watch juju status, with optional interval (default: 5 sec)
wjst() {
  local interval="${1:-5}"
  shift $(( $# > 0 ))
  watch -n "$interval" --color juju status --relations --color "$@"
}