(command.CommandList
  children: [
    (command.Simple
      blame_tok: <set>
      more_env: []
      words: [{<set>} {<-o>} {<errexit>}]
      redirects: []
      do_fork: T
    )
    (command.Simple
      blame_tok: <set>
      more_env: []
      words: [{<set>} {<-o>} {<nounset>}]
      redirects: []
      do_fork: T
    )
    (command.Simple
      blame_tok: <set>
      more_env: []
      words: [{<set>} {<-o>} {<pipefail>}]
      redirects: []
      do_fork: T
    )
    (command.ShAssignment
      left: <Id.Lit_VarLike 'KUBE_ROOT='>
      pairs: [
        (AssignPair
          left: <Id.Lit_VarLike 'KUBE_ROOT='>
          lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'KUBE_ROOT='> name:KUBE_ROOT)
          op: assign_op.Equal
          rhs: 
            {
              (CommandSub
                left_token: <Id.Left_DollarParen '$('>
                child: 
                  (command.Simple
                    blame_tok: <dirname>
                    more_env: []
                    words: [
                      {<dirname>}
                      {
                        (DQ 
                          (BracedVarSub
                            left: <Id.Left_DollarBrace '${'>
                            token: <Id.VSub_Name BASH_SOURCE>
                            var_name: BASH_SOURCE
                            bracket_op: (bracket_op.ArrayIndex expr:{<Id.Lit_Digits 0>})
                            right: <Id.Right_DollarBrace '}'>
                          )
                        )
                      }
                    ]
                    redirects: []
                    do_fork: T
                  )
                right: <Id.Eof_RParen _>
              ) <'/../..'>
            }
        )
      ]
      redirects: []
    )
    (command.Simple
      blame_tok: <source>
      more_env: []
      words: [
        {<source>}
        {(DQ (${ Id.VSub_Name KUBE_ROOT) <'/cluster/photon-controller/config-common.sh'>)}
      ]
      redirects: []
      do_fork: T
    )
    (command.Simple
      blame_tok: <source>
      more_env: []
      words: [
        {<source>}
        {
          (DQ (${ Id.VSub_Name KUBE_ROOT) <'/cluster/photon-controller/'> 
            (BracedVarSub
              left: <Id.Left_DollarBrace '${'>
              token: <Id.VSub_Name KUBE_CONFIG_FILE>
              var_name: KUBE_CONFIG_FILE
              suffix_op: (suffix_op.Unary op:<Id.VTest_Hyphen _> arg_word:{(DQ <config-default.sh>)})
              right: <Id.Right_DollarBrace '}'>
            )
          )
        }
      ]
      redirects: []
      do_fork: T
    )
    (command.Simple
      blame_tok: <source>
      more_env: []
      words: [{<source>} {(DQ (${ Id.VSub_Name KUBE_ROOT) <'/cluster/common.sh'>)}]
      redirects: []
      do_fork: T
    )
    (command.Simple
      blame_tok: <readonly>
      more_env: []
      words: [{<readonly>} {<Id.Lit_VarLike 'PHOTON='> (DQ <'photon -n'>)}]
      redirects: []
      do_fork: T
    )
    (command.Simple
      blame_tok: <readonly>
      more_env: []
      words: [
        {<readonly>}
        {<Id.Lit_VarLike 'MASTER_NAME='> (DQ (${ Id.VSub_Name INSTANCE_PREFIX) <-master>)}
      ]
      redirects: []
      do_fork: T
    )
    (command.Simple
      blame_tok: <readonly>
      more_env: []
      words: [
        {<readonly>}
        {<Id.Lit_VarLike 'NODE_NAMES='> 
          (ShArrayLiteral
            left: <Id.Op_LParen _>
            words: [
              {
                (CommandSub
                  left_token: <Id.Left_DollarParen '$('>
                  child: 
                    (command.Simple
                      blame_tok: <eval>
                      more_env: []
                      words: [
                        {<eval>}
                        {<echo>}
                        {(DQ (${ Id.VSub_Name INSTANCE_PREFIX)) <-node-> <Id.Lit_LBrace '{'> <1..> 
                          (DQ (${ Id.VSub_Name NUM_NODES)) <Id.Lit_RBrace '}'>
                        }
                      ]
                      redirects: []
                      do_fork: T
                    )
                  right: <Id.Eof_RParen _>
                )
              }
            ]
            right: <Id.Right_ShArrayLiteral _>
          )
        }
      ]
      redirects: []
      do_fork: T
    )
    (command.ShFunction
      keyword: <Id.KW_Function function>
      name_tok: <detect-master>
      name: detect-master
      body: 
        (BraceGroup
          left: <Id.Lit_LBrace '{'>
          children: [
            (command.Simple
              blame_tok: <local>
              more_env: []
              words: [
                {<local>}
                {<Id.Lit_VarLike 'silent='> 
                  (BracedVarSub
                    left: <Id.Left_DollarBrace '${'>
                    token: <Id.VSub_Number 1>
                    var_name: 1
                    suffix_op: (suffix_op.Unary op:<Id.VTest_ColonHyphen _> arg_word:{(DQ )})
                    right: <Id.Right_DollarBrace '}'>
                  )
                }
              ]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <local>
              more_env: []
              words: [
                {<local>}
                {<Id.Lit_VarLike 'tenant_args='> 
                  (DQ <'--tenant '> (${ Id.VSub_Name PHOTON_TENANT) <' --project '> 
                    (${ Id.VSub_Name PHOTON_PROJECT)
                  )
                }
              ]
              redirects: []
              do_fork: T
            )
            (command.ShAssignment
              left: <Id.Lit_VarLike 'KUBE_MASTER='>
              pairs: [
                (AssignPair
                  left: <Id.Lit_VarLike 'KUBE_MASTER='>
                  lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'KUBE_MASTER='> name:KUBE_MASTER)
                  op: assign_op.Equal
                  rhs: {(${ Id.VSub_Name MASTER_NAME)}
                )
              ]
              redirects: []
            )
            (command.ShAssignment
              left: <Id.Lit_VarLike 'KUBE_MASTER_ID='>
              pairs: [
                (AssignPair
                  left: <Id.Lit_VarLike 'KUBE_MASTER_ID='>
                  lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'KUBE_MASTER_ID='> name:KUBE_MASTER_ID)
                  op: assign_op.Equal
                  rhs: 
                    {
                      (BracedVarSub
                        left: <Id.Left_DollarBrace '${'>
                        token: <Id.VSub_Name KUBE_MASTER_ID>
                        var_name: KUBE_MASTER_ID
                        suffix_op: (suffix_op.Unary op:<Id.VTest_ColonHyphen _> arg_word:{(DQ )})
                        right: <Id.Right_DollarBrace '}'>
                      )
                    }
                )
              ]
              redirects: []
            )
            (command.ShAssignment
              left: <Id.Lit_VarLike 'KUBE_MASTER_IP='>
              pairs: [
                (AssignPair
                  left: <Id.Lit_VarLike 'KUBE_MASTER_IP='>
                  lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'KUBE_MASTER_IP='> name:KUBE_MASTER_IP)
                  op: assign_op.Equal
                  rhs: 
                    {
                      (BracedVarSub
                        left: <Id.Left_DollarBrace '${'>
                        token: <Id.VSub_Name KUBE_MASTER_IP>
                        var_name: KUBE_MASTER_IP
                        suffix_op: (suffix_op.Unary op:<Id.VTest_ColonHyphen _> arg_word:{(DQ )})
                        right: <Id.Right_DollarBrace '}'>
                      )
                    }
                )
              ]
              redirects: []
            )
            (command.Simple
              blame_tok: <set>
              more_env: []
              words: [{<set>} {<Id.Lit_Other '+'> <o>} {<pipefail>}]
              redirects: []
              do_fork: T
            )
            (command.If
              if_kw: <Id.KW_If if>
              arms: [
                (IfArm
                  keyword: <Id.KW_If if>
                  cond: 
                    (condition.Shell
                      commands: [
                        (command.Sentence
                          child: 
                            (command.DBracket
                              left: <Id.KW_DLeftBracket '[['>
                              expr: 
                                (bool_expr.Unary
                                  op_id: Id.BoolUnary_z
                                  child: {(${ Id.VSub_Name KUBE_MASTER_ID)}
                                )
                              right: <Id.Lit_DRightBracket ']]'>
                              redirects: []
                            )
                          terminator: <Id.Op_Semi _>
                        )
                      ]
                    )
                  then_kw: <Id.KW_Then then>
                  action: [
                    (command.ShAssignment
                      left: <Id.Lit_VarLike 'KUBE_MASTER_ID='>
                      pairs: [
                        (AssignPair
                          left: <Id.Lit_VarLike 'KUBE_MASTER_ID='>
                          lhs: 
                            (sh_lhs_expr.Name
                              left: <Id.Lit_VarLike 'KUBE_MASTER_ID='>
                              name: KUBE_MASTER_ID
                            )
                          op: assign_op.Equal
                          rhs: 
                            {
                              (CommandSub
                                left_token: <Id.Left_DollarParen '$('>
                                child: 
                                  (command.Pipeline
                                    children: [
                                      (command.Simple
                                        blame_tok: <Id.Left_DollarBrace '${'>
                                        more_env: []
                                        words: [
                                          {(${ Id.VSub_Name PHOTON)}
                                          {<vm>}
                                          {<list>}
                                          {(${ Id.VSub_Name tenant_args)}
                                        ]
                                        redirects: []
                                        do_fork: T
                                      )
                                      (command.Simple
                                        blame_tok: <grep>
                                        more_env: []
                                        words: [
                                          {<grep>}
                                          {
                                            (SingleQuoted
                                              left: <Id.Left_DollarSingleQuote '$\''>
                                              tokens: [<Id.Char_OneChar '\\t'>]
                                              right: <Id.Right_SingleQuote '\''>
                                            ) (DQ <kubernetes-master>) 
                                            (SingleQuoted
                                              left: <Id.Left_DollarSingleQuote '$\''>
                                              tokens: [<Id.Char_OneChar '\\t'>]
                                              right: <Id.Right_SingleQuote '\''>
                                            )
                                          }
                                        ]
                                        redirects: []
                                        do_fork: T
                                      )
                                      (command.Simple
                                        blame_tok: <awk>
                                        more_env: []
                                        words: [{<awk>} {(SQ <'{print $1}'>)}]
                                        redirects: []
                                        do_fork: T
                                      )
                                    ]
                                    ops: [<Id.Op_Pipe _> <Id.Op_Pipe _>]
                                  )
                                right: <Id.Eof_RParen _>
                              )
                            }
                        )
                      ]
                      redirects: []
                    )
                  ]
                  spids: [295 308]
                )
              ]
              else_action: []
              fi_kw: <Id.KW_Fi fi>
              redirects: []
            )
            (command.If
              if_kw: <Id.KW_If if>
              arms: [
                (IfArm
                  keyword: <Id.KW_If if>
                  cond: 
                    (condition.Shell
                      commands: [
                        (command.Sentence
                          child: 
                            (command.DBracket
                              left: <Id.KW_DLeftBracket '[['>
                              expr: 
                                (bool_expr.Unary
                                  op_id: Id.BoolUnary_z
                                  child: {(${ Id.VSub_Name KUBE_MASTER_ID)}
                                )
                              right: <Id.Lit_DRightBracket ']]'>
                              redirects: []
                            )
                          terminator: <Id.Op_Semi _>
                        )
                      ]
                    )
                  then_kw: <Id.KW_Then then>
                  action: [
                    (command.Simple
                      blame_tok: <kube>
                      more_env: []
                      words: [
                        {<kube> <Id.Lit_Colon ':'> <Id.Lit_Colon ':'> <log> <Id.Lit_Colon ':'> 
                          <Id.Lit_Colon ':'> <error>
                        }
                        {
                          (DQ 
                            <
'Could not find Kubernetes master node ID. Make sure you\'ve launched a cluster with kube-up.sh'
                            >
                          )
                        }
                      ]
                      redirects: []
                      do_fork: T
                    )
                    (command.ControlFlow
                      keyword: <Id.ControlFlow_Exit exit>
                      arg_word: {<1>}
                    )
                  ]
                  spids: [352 365]
                )
              ]
              else_action: []
              fi_kw: <Id.KW_Fi fi>
              redirects: []
            )
            (command.If
              if_kw: <Id.KW_If if>
              arms: [
                (IfArm
                  keyword: <Id.KW_If if>
                  cond: 
                    (condition.Shell
                      commands: [
                        (command.Sentence
                          child: 
                            (command.DBracket
                              left: <Id.KW_DLeftBracket '[['>
                              expr: 
                                (bool_expr.Unary
                                  op_id: Id.BoolUnary_z
                                  child: 
                                    {
                                      (DQ 
                                        (BracedVarSub
                                          left: <Id.Left_DollarBrace '${'>
                                          token: <Id.VSub_Name KUBE_MASTER_IP>
                                          var_name: KUBE_MASTER_IP
                                          suffix_op: (suffix_op.Unary op:<Id.VTest_Hyphen _> arg_word:(rhs_word__Empty))
                                          right: <Id.Right_DollarBrace '}'>
                                        )
                                      )
                                    }
                                )
                              right: <Id.Lit_DRightBracket ']]'>
                              redirects: []
                            )
                          terminator: <Id.Op_Semi _>
                        )
                      ]
                    )
                  then_kw: <Id.KW_Then then>
                  action: [
                    (command.ShAssignment
                      left: <Id.Lit_VarLike 'KUBE_MASTER_IP='>
                      pairs: [
                        (AssignPair
                          left: <Id.Lit_VarLike 'KUBE_MASTER_IP='>
                          lhs: 
                            (sh_lhs_expr.Name
                              left: <Id.Lit_VarLike 'KUBE_MASTER_IP='>
                              name: KUBE_MASTER_IP
                            )
                          op: assign_op.Equal
                          rhs: 
                            {
                              (CommandSub
                                left_token: <Id.Left_DollarParen '$('>
                                child: 
                                  (command.Pipeline
                                    children: [
                                      (command.Simple
                                        blame_tok: <Id.Left_DollarBrace '${'>
                                        more_env: []
                                        words: [
                                          {(${ Id.VSub_Name PHOTON)}
                                          {<vm>}
                                          {<networks>}
                                          {(DQ (${ Id.VSub_Name KUBE_MASTER_ID))}
                                        ]
                                        redirects: []
                                        do_fork: T
                                      )
                                      (command.Simple
                                        blame_tok: <grep>
                                        more_env: []
                                        words: [
                                          {<grep>}
                                          {<-i>}
                                          {
                                            (SingleQuoted
                                              left: <Id.Left_DollarSingleQuote '$\''>
                                              tokens: [<Id.Char_OneChar '\\t'>]
                                              right: <Id.Right_SingleQuote '\''>
                                            ) (DQ <'00:0C:29'>)
                                          }
                                        ]
                                        redirects: []
                                        do_fork: T
                                      )
                                      (command.Simple
                                        blame_tok: <grep>
                                        more_env: []
                                        words: [
                                          {<grep>}
                                          {<-E>}
                                          {(SQ <'[0-9]+\\.[0-9]+\\.[0-9]+\\.[0-9]+'>)}
                                        ]
                                        redirects: []
                                        do_fork: T
                                      )
                                      (command.Simple
                                        blame_tok: <head>
                                        more_env: []
                                        words: [{<head>} {<-1>}]
                                        redirects: []
                                        do_fork: T
                                      )
                                      (command.Simple
                                        blame_tok: <awk>
                                        more_env: []
                                        words: [{<awk>} {<-F> (SQ <'\\t'>)} {(SQ <'{print $3}'>)}]
                                        redirects: []
                                        do_fork: T
                                      )
                                    ]
                                    ops: [<Id.Op_Pipe _> <Id.Op_Pipe _> <Id.Op_Pipe _> <Id.Op_Pipe _>]
                                  )
                                right: <Id.Eof_RParen _>
                              )
                            }
                        )
                      ]
                      redirects: []
                    )
                  ]
                  spids: [390 406]
                )
              ]
              else_action: []
              fi_kw: <Id.KW_Fi fi>
              redirects: []
            )
            (command.If
              if_kw: <Id.KW_If if>
              arms: [
                (IfArm
                  keyword: <Id.KW_If if>
                  cond: 
                    (condition.Shell
                      commands: [
                        (command.Sentence
                          child: 
                            (command.DBracket
                              left: <Id.KW_DLeftBracket '[['>
                              expr: 
                                (bool_expr.Unary
                                  op_id: Id.BoolUnary_z
                                  child: 
                                    {
                                      (DQ 
                                        (BracedVarSub
                                          left: <Id.Left_DollarBrace '${'>
                                          token: <Id.VSub_Name KUBE_MASTER_IP>
                                          var_name: KUBE_MASTER_IP
                                          suffix_op: (suffix_op.Unary op:<Id.VTest_Hyphen _> arg_word:(rhs_word__Empty))
                                          right: <Id.Right_DollarBrace '}'>
                                        )
                                      )
                                    }
                                )
                              right: <Id.Lit_DRightBracket ']]'>
                              redirects: []
                            )
                          terminator: <Id.Op_Semi _>
                        )
                      ]
                    )
                  then_kw: <Id.KW_Then then>
                  action: [
                    (command.Simple
                      blame_tok: <kube>
                      more_env: []
                      words: [
                        {<kube> <Id.Lit_Colon ':'> <Id.Lit_Colon ':'> <log> <Id.Lit_Colon ':'> 
                          <Id.Lit_Colon ':'> <error>
                        }
                        {
                          (DQ 
                            <
'Could not find Kubernetes master node IP. Make sure you\'ve launched a cluster with \'kube-up.sh\''
                            >
                          )
                        }
                      ]
                      redirects: [(Redir op:<Id.Redir_GreatAnd '>&'> loc:(redir_loc.Fd fd:1) arg:{<2>})]
                      do_fork: T
                    )
                    (command.ControlFlow
                      keyword: <Id.ControlFlow_Exit exit>
                      arg_word: {<1>}
                    )
                  ]
                  spids: [480 496]
                )
              ]
              else_action: []
              fi_kw: <Id.KW_Fi fi>
              redirects: []
            )
            (command.If
              if_kw: <Id.KW_If if>
              arms: [
                (IfArm
                  keyword: <Id.KW_If if>
                  cond: 
                    (condition.Shell
                      commands: [
                        (command.Sentence
                          child: 
                            (command.DBracket
                              left: <Id.KW_DLeftBracket '[['>
                              expr: 
                                (bool_expr.Unary
                                  op_id: Id.BoolUnary_z
                                  child: {(${ Id.VSub_Name silent)}
                                )
                              right: <Id.Lit_DRightBracket ']]'>
                              redirects: []
                            )
                          terminator: <Id.Op_Semi _>
                        )
                      ]
                    )
                  then_kw: <Id.KW_Then then>
                  action: [
                    (command.Simple
                      blame_tok: <kube>
                      more_env: []
                      words: [
                        {<kube> <Id.Lit_Colon ':'> <Id.Lit_Colon ':'> <log> <Id.Lit_Colon ':'> 
                          <Id.Lit_Colon ':'> <status>
                        }
                        {
                          (DQ <'Master: '> ($ Id.VSub_DollarName KUBE_MASTER) <' ('> 
                            ($ Id.VSub_DollarName KUBE_MASTER_IP) <')'>
                          )
                        }
                      ]
                      redirects: []
                      do_fork: T
                    )
                  ]
                  spids: [523 536]
                )
              ]
              else_action: []
              fi_kw: <Id.KW_Fi fi>
              redirects: []
            )
            (command.Simple
              blame_tok: <set>
              more_env: []
              words: [{<set>} {<-o>} {<pipefail>}]
              redirects: []
              do_fork: T
            )
          ]
          redirects: []
          right: <Id.Lit_RBrace '}'>
        )
    )
    (command.ShFunction
      keyword: <Id.KW_Function function>
      name_tok: <detect-nodes>
      name: detect-nodes
      body: 
        (BraceGroup
          left: <Id.Lit_LBrace '{'>
          children: [
            (command.Simple
              blame_tok: <local>
              more_env: []
              words: [
                {<local>}
                {<Id.Lit_VarLike 'silent='> 
                  (BracedVarSub
                    left: <Id.Left_DollarBrace '${'>
                    token: <Id.VSub_Number 1>
                    var_name: 1
                    suffix_op: (suffix_op.Unary op:<Id.VTest_ColonHyphen _> arg_word:{(DQ )})
                    right: <Id.Right_DollarBrace '}'>
                  )
                }
              ]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <local>
              more_env: []
              words: [{<local>} {<Id.Lit_VarLike 'failure='> <0>}]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <local>
              more_env: []
              words: [
                {<local>}
                {<Id.Lit_VarLike 'tenant_args='> 
                  (DQ <'--tenant '> (${ Id.VSub_Name PHOTON_TENANT) <' --project '> 
                    (${ Id.VSub_Name PHOTON_PROJECT)
                  )
                }
              ]
              redirects: []
              do_fork: T
            )
            (command.ShAssignment
              left: <Id.Lit_VarLike 'KUBE_NODE_IP_ADDRESSES='>
              pairs: [
                (AssignPair
                  left: <Id.Lit_VarLike 'KUBE_NODE_IP_ADDRESSES='>
                  lhs: 
                    (sh_lhs_expr.Name
                      left: <Id.Lit_VarLike 'KUBE_NODE_IP_ADDRESSES='>
                      name: KUBE_NODE_IP_ADDRESSES
                    )
                  op: assign_op.Equal
                  rhs: 
                    {
                      (ShArrayLiteral
                        left: <Id.Op_LParen _>
                        words: []
                        right: <Id.Right_ShArrayLiteral _>
                      )
                    }
                )
              ]
              redirects: []
            )
            (command.ShAssignment
              left: <Id.Lit_VarLike 'KUBE_NODE_IDS='>
              pairs: [
                (AssignPair
                  left: <Id.Lit_VarLike 'KUBE_NODE_IDS='>
                  lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'KUBE_NODE_IDS='> name:KUBE_NODE_IDS)
                  op: assign_op.Equal
                  rhs: 
                    {
                      (ShArrayLiteral
                        left: <Id.Op_LParen _>
                        words: []
                        right: <Id.Right_ShArrayLiteral _>
                      )
                    }
                )
              ]
              redirects: []
            )
            (command.Simple
              blame_tok: <set>
              more_env: []
              words: [{<set>} {<Id.Lit_Other '+'> <o>} {<pipefail>}]
              redirects: []
              do_fork: T
            )
            (command.ForExpr
              keyword: <Id.KW_For for>
              init: 
                (arith_expr.BinaryAssign
                  op_id: Id.Arith_Equal
                  left: ($ Id.Lit_ArithVarLike i)
                  right: {<Id.Lit_Digits 0>}
                )
              cond: 
                (arith_expr.Binary
                  op_id: Id.Arith_Less
                  left: ($ Id.Lit_ArithVarLike i)
                  right: 
                    {
                      (BracedVarSub
                        left: <Id.Left_DollarBrace '${'>
                        token: <Id.VSub_Name NODE_NAMES>
                        var_name: NODE_NAMES
                        prefix_op: <Id.VSub_Pound '#'>
                        bracket_op: (bracket_op.WholeArray op_id:Id.Lit_At)
                        right: <Id.Right_DollarBrace '}'>
                      )
                    }
                )
              update: (arith_expr.UnaryAssign op_id:Id.Node_PostDPlus child:($ Id.Lit_ArithVarLike i))
              body: 
                (command.DoGroup
                  left: <Id.KW_Do do>
                  children: [
                    (command.Simple
                      blame_tok: <local>
                      more_env: []
                      words: [{<local>} {<node_id>}]
                      redirects: []
                      do_fork: T
                    )
                    (command.ShAssignment
                      left: <Id.Lit_VarLike 'node_id='>
                      pairs: [
                        (AssignPair
                          left: <Id.Lit_VarLike 'node_id='>
                          lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'node_id='> name:node_id)
                          op: assign_op.Equal
                          rhs: 
                            {
                              (CommandSub
                                left_token: <Id.Left_DollarParen '$('>
                                child: 
                                  (command.Pipeline
                                    children: [
                                      (command.Simple
                                        blame_tok: <Id.Left_DollarBrace '${'>
                                        more_env: []
                                        words: [
                                          {(${ Id.VSub_Name PHOTON)}
                                          {<vm>}
                                          {<list>}
                                          {(${ Id.VSub_Name tenant_args)}
                                        ]
                                        redirects: []
                                        do_fork: T
                                      )
                                      (command.Simple
                                        blame_tok: <grep>
                                        more_env: []
                                        words: [
                                          {<grep>}
                                          {
                                            (SingleQuoted
                                              left: <Id.Left_DollarSingleQuote '$\''>
                                              tokens: [<Id.Char_OneChar '\\t'>]
                                              right: <Id.Right_SingleQuote '\''>
                                            ) 
                                            (DQ 
                                              (BracedVarSub
                                                left: <Id.Left_DollarBrace '${'>
                                                token: <Id.VSub_Name NODE_NAMES>
                                                var_name: NODE_NAMES
                                                bracket_op: 
                                                  (bracket_op.ArrayIndex
                                                    expr: {(${ Id.VSub_Name i)}
                                                  )
                                                right: <Id.Right_DollarBrace '}'>
                                              )
                                            ) 
                                            (SingleQuoted
                                              left: <Id.Left_DollarSingleQuote '$\''>
                                              tokens: [<Id.Char_OneChar '\\t'>]
                                              right: <Id.Right_SingleQuote '\''>
                                            )
                                          }
                                        ]
                                        redirects: []
                                        do_fork: T
                                      )
                                      (command.Simple
                                        blame_tok: <awk>
                                        more_env: []
                                        words: [{<awk>} {(SQ <'{print $1}'>)}]
                                        redirects: []
                                        do_fork: T
                                      )
                                    ]
                                    ops: [<Id.Op_Pipe _> <Id.Op_Pipe _>]
                                  )
                                right: <Id.Eof_RParen _>
                              )
                            }
                        )
                      ]
                      redirects: []
                    )
                    (command.If
                      if_kw: <Id.KW_If if>
                      arms: [
                        (IfArm
                          keyword: <Id.KW_If if>
                          cond: 
                            (condition.Shell
                              commands: [
                                (command.Sentence
                                  child: 
                                    (command.DBracket
                                      left: <Id.KW_DLeftBracket '[['>
                                      expr: 
                                        (bool_expr.Unary
                                          op_id: Id.BoolUnary_z
                                          child: {(${ Id.VSub_Name node_id)}
                                        )
                                      right: <Id.Lit_DRightBracket ']]'>
                                      redirects: []
                                    )
                                  terminator: <Id.Op_Semi _>
                                )
                              ]
                            )
                          then_kw: <Id.KW_Then then>
                          action: [
                            (command.Simple
                              blame_tok: <kube>
                              more_env: []
                              words: [
                                {<kube> <Id.Lit_Colon ':'> <Id.Lit_Colon ':'> <log> <Id.Lit_Colon ':'> 
                                  <Id.Lit_Colon ':'> <error>
                                }
                                {
                                  (DQ <'Could not find '> 
                                    (BracedVarSub
                                      left: <Id.Left_DollarBrace '${'>
                                      token: <Id.VSub_Name NODE_NAMES>
                                      var_name: NODE_NAMES
                                      bracket_op: (bracket_op.ArrayIndex expr:{(${ Id.VSub_Name i)})
                                      right: <Id.Right_DollarBrace '}'>
                                    )
                                  )
                                }
                              ]
                              redirects: []
                              do_fork: T
                            )
                            (command.ShAssignment
                              left: <Id.Lit_VarLike 'failure='>
                              pairs: [
                                (AssignPair
                                  left: <Id.Lit_VarLike 'failure='>
                                  lhs: 
                                    (sh_lhs_expr.Name
                                      left: <Id.Lit_VarLike 'failure='>
                                      name: failure
                                    )
                                  op: assign_op.Equal
                                  rhs: {<1>}
                                )
                              ]
                              redirects: []
                            )
                          ]
                          spids: [741 754]
                        )
                      ]
                      else_action: []
                      fi_kw: <Id.KW_Fi fi>
                      redirects: []
                    )
                    (command.ShAssignment
                      left: <Id.Lit_VarLike 'KUBE_NODE_IDS+='>
                      pairs: [
                        (AssignPair
                          left: <Id.Lit_VarLike 'KUBE_NODE_IDS+='>
                          lhs: 
                            (sh_lhs_expr.Name
                              left: <Id.Lit_VarLike 'KUBE_NODE_IDS+='>
                              name: KUBE_NODE_IDS
                            )
                          op: assign_op.PlusEqual
                          rhs: 
                            {
                              (ShArrayLiteral
                                left: <Id.Op_LParen _>
                                words: [{(DQ (${ Id.VSub_Name node_id))}]
                                right: <Id.Right_ShArrayLiteral _>
                              )
                            }
                        )
                      ]
                      redirects: []
                    )
                    (command.ShAssignment
                      left: <Id.Lit_VarLike 'node_ip='>
                      pairs: [
                        (AssignPair
                          left: <Id.Lit_VarLike 'node_ip='>
                          lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'node_ip='> name:node_ip)
                          op: assign_op.Equal
                          rhs: 
                            {
                              (CommandSub
                                left_token: <Id.Left_DollarParen '$('>
                                child: 
                                  (command.Pipeline
                                    children: [
                                      (command.Simple
                                        blame_tok: <Id.Left_DollarBrace '${'>
                                        more_env: []
                                        words: [
                                          {(${ Id.VSub_Name PHOTON)}
                                          {<vm>}
                                          {<networks>}
                                          {(DQ (${ Id.VSub_Name node_id))}
                                        ]
                                        redirects: []
                                        do_fork: T
                                      )
                                      (command.Simple
                                        blame_tok: <grep>
                                        more_env: []
                                        words: [
                                          {<grep>}
                                          {<-i>}
                                          {
                                            (SingleQuoted
                                              left: <Id.Left_DollarSingleQuote '$\''>
                                              tokens: [<Id.Char_OneChar '\\t'>]
                                              right: <Id.Right_SingleQuote '\''>
                                            ) (DQ <'00:0C:29'>)
                                          }
                                        ]
                                        redirects: []
                                        do_fork: T
                                      )
                                      (command.Simple
                                        blame_tok: <grep>
                                        more_env: []
                                        words: [
                                          {<grep>}
                                          {<-E>}
                                          {(SQ <'[0-9]+\\.[0-9]+\\.[0-9]+\\.[0-9]+'>)}
                                        ]
                                        redirects: []
                                        do_fork: T
                                      )
                                      (command.Simple
                                        blame_tok: <head>
                                        more_env: []
                                        words: [{<head>} {<-1>}]
                                        redirects: []
                                        do_fork: T
                                      )
                                      (command.Simple
                                        blame_tok: <awk>
                                        more_env: []
                                        words: [{<awk>} {<-F> (SQ <'\\t'>)} {(SQ <'{print $3}'>)}]
                                        redirects: []
                                        do_fork: T
                                      )
                                    ]
                                    ops: [<Id.Op_Pipe _> <Id.Op_Pipe _> <Id.Op_Pipe _> <Id.Op_Pipe _>]
                                  )
                                right: <Id.Eof_RParen _>
                              )
                            }
                        )
                      ]
                      redirects: []
                    )
                    (command.ShAssignment
                      left: <Id.Lit_VarLike 'KUBE_NODE_IP_ADDRESSES+='>
                      pairs: [
                        (AssignPair
                          left: <Id.Lit_VarLike 'KUBE_NODE_IP_ADDRESSES+='>
                          lhs: 
                            (sh_lhs_expr.Name
                              left: <Id.Lit_VarLike 'KUBE_NODE_IP_ADDRESSES+='>
                              name: KUBE_NODE_IP_ADDRESSES
                            )
                          op: assign_op.PlusEqual
                          rhs: 
                            {
                              (ShArrayLiteral
                                left: <Id.Op_LParen _>
                                words: [{(DQ (${ Id.VSub_Name node_ip))}]
                                right: <Id.Right_ShArrayLiteral _>
                              )
                            }
                        )
                      ]
                      redirects: []
                    )
                    (command.If
                      if_kw: <Id.KW_If if>
                      arms: [
                        (IfArm
                          keyword: <Id.KW_If if>
                          cond: 
                            (condition.Shell
                              commands: [
                                (command.Sentence
                                  child: 
                                    (command.DBracket
                                      left: <Id.KW_DLeftBracket '[['>
                                      expr: 
                                        (bool_expr.Unary
                                          op_id: Id.BoolUnary_z
                                          child: {(${ Id.VSub_Name silent)}
                                        )
                                      right: <Id.Lit_DRightBracket ']]'>
                                      redirects: []
                                    )
                                  terminator: <Id.Op_Semi _>
                                )
                              ]
                            )
                          then_kw: <Id.KW_Then then>
                          action: [
                            (command.Simple
                              blame_tok: <kube>
                              more_env: []
                              words: [
                                {<kube> <Id.Lit_Colon ':'> <Id.Lit_Colon ':'> <log> <Id.Lit_Colon ':'> 
                                  <Id.Lit_Colon ':'> <status>
                                }
                                {
                                  (DQ <'Node: '> 
                                    (BracedVarSub
                                      left: <Id.Left_DollarBrace '${'>
                                      token: <Id.VSub_Name NODE_NAMES>
                                      var_name: NODE_NAMES
                                      bracket_op: (bracket_op.ArrayIndex expr:{(${ Id.VSub_Name i)})
                                      right: <Id.Right_DollarBrace '}'>
                                    ) <' ('> 
                                    (BracedVarSub
                                      left: <Id.Left_DollarBrace '${'>
                                      token: <Id.VSub_Name KUBE_NODE_IP_ADDRESSES>
                                      var_name: KUBE_NODE_IP_ADDRESSES
                                      bracket_op: (bracket_op.ArrayIndex expr:{(${ Id.VSub_Name i)})
                                      right: <Id.Right_DollarBrace '}'>
                                    ) <')'>
                                  )
                                }
                              ]
                              redirects: []
                              do_fork: T
                            )
                          ]
                          spids: [875 888]
                        )
                      ]
                      else_action: []
                      fi_kw: <Id.KW_Fi fi>
                      redirects: []
                    )
                  ]
                  right: <Id.KW_Done done>
                )
              redirects: []
            )
            (command.If
              if_kw: <Id.KW_If if>
              arms: [
                (IfArm
                  keyword: <Id.KW_If if>
                  cond: 
                    (condition.Shell
                      commands: [
                        (command.Sentence
                          child: 
                            (command.DBracket
                              left: <Id.KW_DLeftBracket '[['>
                              expr: 
                                (bool_expr.Binary
                                  op_id: Id.BoolBinary_ne
                                  left: {(${ Id.VSub_Name failure)}
                                  right: {<0>}
                                )
                              right: <Id.Lit_DRightBracket ']]'>
                              redirects: []
                            )
                          terminator: <Id.Op_Semi _>
                        )
                      ]
                    )
                  then_kw: <Id.KW_Then then>
                  action: [(command.ControlFlow keyword:<Id.ControlFlow_Exit exit> arg_word:{<1>})]
                  spids: [929 944]
                )
              ]
              else_action: []
              fi_kw: <Id.KW_Fi fi>
              redirects: []
            )
            (command.Simple
              blame_tok: <set>
              more_env: []
              words: [{<set>} {<-o>} {<pipefail>}]
              redirects: []
              do_fork: T
            )
          ]
          redirects: []
          right: <Id.Lit_RBrace '}'>
        )
    )
    (command.ShFunction
      keyword: <Id.KW_Function function>
      name_tok: <detect-node-names>
      name: detect-node-names
      body: 
        (BraceGroup
          left: <Id.Lit_LBrace '{'>
          children: [
            (command.Simple
              blame_tok: <echo>
              more_env: []
              words: [{<echo>} {(DQ <'TODO: detect-node-names'>)}]
              redirects: [(Redir op:<Id.Redir_GreatAnd '1>&'> loc:(redir_loc.Fd fd:1) arg:{<2>})]
              do_fork: T
            )
          ]
          redirects: []
          right: <Id.Lit_RBrace '}'>
        )
    )
    (command.ShFunction
      keyword: <Id.KW_Function function>
      name_tok: <verify-prereqs>
      name: verify-prereqs
      body: 
        (BraceGroup
          left: <Id.Lit_LBrace '{'>
          children: [
            (command.Simple
              blame_tok: <verify-cmd-in-path>
              more_env: []
              words: [{<verify-cmd-in-path>} {<photon>}]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <verify-cmd-in-path>
              more_env: []
              words: [{<verify-cmd-in-path>} {<ssh>}]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <verify-cmd-in-path>
              more_env: []
              words: [{<verify-cmd-in-path>} {<scp>}]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <verify-cmd-in-path>
              more_env: []
              words: [{<verify-cmd-in-path>} {<ssh-add>}]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <verify-cmd-in-path>
              more_env: []
              words: [{<verify-cmd-in-path>} {<openssl>}]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <verify-cmd-in-path>
              more_env: []
              words: [{<verify-cmd-in-path>} {<mkisofs>}]
              redirects: []
              do_fork: T
            )
          ]
          redirects: []
          right: <Id.Lit_RBrace '}'>
        )
    )
    (command.ShFunction
      keyword: <Id.KW_Function function>
      name_tok: <kube-up>
      name: kube-up
      body: 
        (BraceGroup
          left: <Id.Lit_LBrace '{'>
          children: [
            (command.Simple
              blame_tok: <verify-prereqs>
              more_env: []
              words: [{<verify-prereqs>}]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <verify-ssh-prereqs>
              more_env: []
              words: [{<verify-ssh-prereqs>}]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <verify-photon-config>
              more_env: []
              words: [{<verify-photon-config>}]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <kube>
              more_env: []
              words: [
                {<kube> <Id.Lit_Colon ':'> <Id.Lit_Colon ':'> <util> <Id.Lit_Colon ':'> 
                  <Id.Lit_Colon ':'> <ensure-temp-dir>
                }
              ]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <find-release-tars>
              more_env: []
              words: [{<find-release-tars>}]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <find-image-id>
              more_env: []
              words: [{<find-image-id>}]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <load-or-gen-kube-basicauth>
              more_env: []
              words: [{<load-or-gen-kube-basicauth>}]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <gen-cloud-init-iso>
              more_env: []
              words: [{<gen-cloud-init-iso>}]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <gen-master-start>
              more_env: []
              words: [{<gen-master-start>}]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <create-master-vm>
              more_env: []
              words: [{<create-master-vm>}]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <install-salt-on-master>
              more_env: []
              words: [{<install-salt-on-master>}]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <gen-node-start>
              more_env: []
              words: [{<gen-node-start>}]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <install-salt-on-nodes>
              more_env: []
              words: [{<install-salt-on-nodes>}]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <detect-nodes>
              more_env: []
              words: [{<detect-nodes>} {<-s>}]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <install-kubernetes-on-master>
              more_env: []
              words: [{<install-kubernetes-on-master>}]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <install-kubernetes-on-nodes>
              more_env: []
              words: [{<install-kubernetes-on-nodes>}]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <wait-master-api>
              more_env: []
              words: [{<wait-master-api>}]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <wait-node-apis>
              more_env: []
              words: [{<wait-node-apis>}]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <setup-pod-routes>
              more_env: []
              words: [{<setup-pod-routes>}]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <copy-kube-certs>
              more_env: []
              words: [{<copy-kube-certs>}]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <kube>
              more_env: []
              words: [
                {<kube> <Id.Lit_Colon ':'> <Id.Lit_Colon ':'> <log> <Id.Lit_Colon ':'> <Id.Lit_Colon ':'> 
                  <status>
                }
                {(DQ <'Creating kubeconfig...'>)}
              ]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <create-kubeconfig>
              more_env: []
              words: [{<create-kubeconfig>}]
              redirects: []
              do_fork: T
            )
          ]
          redirects: []
          right: <Id.Lit_RBrace '}'>
        )
    )
    (command.ShFunction
      keyword: <Id.KW_Function function>
      name_tok: <kube-down>
      name: kube-down
      body: 
        (BraceGroup
          left: <Id.Lit_LBrace '{'>
          children: [
            (command.Simple
              blame_tok: <detect-master>
              more_env: []
              words: [{<detect-master>}]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <detect-nodes>
              more_env: []
              words: [{<detect-nodes>}]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <pc-delete-vm>
              more_env: []
              words: [
                {<pc-delete-vm>}
                {(DQ (${ Id.VSub_Name KUBE_MASTER))}
                {(DQ (${ Id.VSub_Name KUBE_MASTER_ID))}
              ]
              redirects: []
              do_fork: T
            )
            (command.ForExpr
              keyword: <Id.KW_For for>
              init: 
                (arith_expr.BinaryAssign
                  op_id: Id.Arith_Equal
                  left: ($ Id.Lit_ArithVarLike node)
                  right: {<Id.Lit_Digits 0>}
                )
              cond: 
                (arith_expr.Binary
                  op_id: Id.Arith_Less
                  left: ($ Id.Lit_ArithVarLike node)
                  right: 
                    {
                      (BracedVarSub
                        left: <Id.Left_DollarBrace '${'>
                        token: <Id.VSub_Name KUBE_NODE_IDS>
                        var_name: KUBE_NODE_IDS
                        prefix_op: <Id.VSub_Pound '#'>
                        bracket_op: (bracket_op.WholeArray op_id:Id.Lit_At)
                        right: <Id.Right_DollarBrace '}'>
                      )
                    }
                )
              update: 
                (arith_expr.UnaryAssign
                  op_id: Id.Node_PostDPlus
                  child: ($ Id.Lit_ArithVarLike node)
                )
              body: 
                (command.DoGroup
                  left: <Id.KW_Do do>
                  children: [
                    (command.Simple
                      blame_tok: <pc-delete-vm>
                      more_env: []
                      words: [
                        {<pc-delete-vm>}
                        {
                          (DQ 
                            (BracedVarSub
                              left: <Id.Left_DollarBrace '${'>
                              token: <Id.VSub_Name NODE_NAMES>
                              var_name: NODE_NAMES
                              bracket_op: (bracket_op.ArrayIndex expr:{(${ Id.VSub_Name node)})
                              right: <Id.Right_DollarBrace '}'>
                            )
                          )
                        }
                        {
                          (DQ 
                            (BracedVarSub
                              left: <Id.Left_DollarBrace '${'>
                              token: <Id.VSub_Name KUBE_NODE_IDS>
                              var_name: KUBE_NODE_IDS
                              bracket_op: (bracket_op.ArrayIndex expr:{(${ Id.VSub_Name node)})
                              right: <Id.Right_DollarBrace '}'>
                            )
                          )
                        }
                      ]
                      redirects: []
                      do_fork: T
                    )
                  ]
                  right: <Id.KW_Done done>
                )
              redirects: []
            )
          ]
          redirects: []
          right: <Id.Lit_RBrace '}'>
        )
    )
    (command.ShFunction
      keyword: <Id.KW_Function function>
      name_tok: <kube-push>
      name: kube-push
      body: 
        (BraceGroup
          left: <Id.Lit_LBrace '{'>
          children: [
            (command.Simple
              blame_tok: <echo>
              more_env: []
              words: [{<echo>} {(DQ <'TODO: kube-push'>)}]
              redirects: [(Redir op:<Id.Redir_GreatAnd '1>&'> loc:(redir_loc.Fd fd:1) arg:{<2>})]
              do_fork: T
            )
          ]
          redirects: []
          right: <Id.Lit_RBrace '}'>
        )
    )
    (command.ShFunction
      keyword: <Id.KW_Function function>
      name_tok: <prepare-push>
      name: prepare-push
      body: 
        (BraceGroup
          left: <Id.Lit_LBrace '{'>
          children: [
            (command.Simple
              blame_tok: <echo>
              more_env: []
              words: [{<echo>} {(DQ <'TODO: prepare-push'>)}]
              redirects: [(Redir op:<Id.Redir_GreatAnd '1>&'> loc:(redir_loc.Fd fd:1) arg:{<2>})]
              do_fork: T
            )
          ]
          redirects: []
          right: <Id.Lit_RBrace '}'>
        )
    )
    (command.ShFunction
      keyword: <Id.KW_Function function>
      name_tok: <push-master>
      name: push-master
      body: 
        (BraceGroup
          left: <Id.Lit_LBrace '{'>
          children: [
            (command.Simple
              blame_tok: <echo>
              more_env: []
              words: [{<echo>} {(DQ <'TODO: push-master'>)}]
              redirects: [(Redir op:<Id.Redir_GreatAnd '1>&'> loc:(redir_loc.Fd fd:1) arg:{<2>})]
              do_fork: T
            )
          ]
          redirects: []
          right: <Id.Lit_RBrace '}'>
        )
    )
    (command.ShFunction
      keyword: <Id.KW_Function function>
      name_tok: <push-node>
      name: push-node
      body: 
        (BraceGroup
          left: <Id.Lit_LBrace '{'>
          children: [
            (command.Simple
              blame_tok: <echo>
              more_env: []
              words: [{<echo>} {(DQ <'TODO: push-node'>)}]
              redirects: [(Redir op:<Id.Redir_GreatAnd '1>&'> loc:(redir_loc.Fd fd:1) arg:{<2>})]
              do_fork: T
            )
          ]
          redirects: []
          right: <Id.Lit_RBrace '}'>
        )
    )
    (command.ShFunction
      keyword: <Id.KW_Function function>
      name_tok: <test-build-release>
      name: test-build-release
      body: 
        (BraceGroup
          left: <Id.Lit_LBrace '{'>
          children: [
            (command.Simple
              blame_tok: <echo>
              more_env: []
              words: [{<echo>} {(DQ <'TODO: test-build-release'>)}]
              redirects: [(Redir op:<Id.Redir_GreatAnd '1>&'> loc:(redir_loc.Fd fd:1) arg:{<2>})]
              do_fork: T
            )
          ]
          redirects: []
          right: <Id.Lit_RBrace '}'>
        )
    )
    (command.ShFunction
      keyword: <Id.KW_Function function>
      name_tok: <test-setup>
      name: test-setup
      body: 
        (BraceGroup
          left: <Id.Lit_LBrace '{'>
          children: [
            (command.Simple
              blame_tok: <echo>
              more_env: []
              words: [{<echo>} {(DQ <'TODO: test-setup'>)}]
              redirects: [(Redir op:<Id.Redir_GreatAnd '1>&'> loc:(redir_loc.Fd fd:1) arg:{<2>})]
              do_fork: T
            )
          ]
          redirects: []
          right: <Id.Lit_RBrace '}'>
        )
    )
    (command.ShFunction
      keyword: <Id.KW_Function function>
      name_tok: <test-teardown>
      name: test-teardown
      body: 
        (BraceGroup
          left: <Id.Lit_LBrace '{'>
          children: [
            (command.Simple
              blame_tok: <echo>
              more_env: []
              words: [{<echo>} {(DQ <'TODO: test-teardown'>)}]
              redirects: [(Redir op:<Id.Redir_GreatAnd '1>&'> loc:(redir_loc.Fd fd:1) arg:{<2>})]
              do_fork: T
            )
          ]
          redirects: []
          right: <Id.Lit_RBrace '}'>
        )
    )
    (command.ShFunction
      keyword: <Id.KW_Function function>
      name_tok: <pc-create-vm>
      name: pc-create-vm
      body: 
        (BraceGroup
          left: <Id.Lit_LBrace '{'>
          children: [
            (command.Simple
              blame_tok: <local>
              more_env: []
              words: [{<local>} {<Id.Lit_VarLike 'vm_name='> (DQ (${ Id.VSub_Number 1))}]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <local>
              more_env: []
              words: [{<local>} {<Id.Lit_VarLike 'vm_flavor='> (DQ (${ Id.VSub_Number 2))}]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <local>
              more_env: []
              words: [{<local>} {<Id.Lit_VarLike 'rc='> <0>}]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <local>
              more_env: []
              words: [{<local>} {<Id.Lit_VarLike 'i='> <0>}]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <local>
              more_env: []
              words: [
                {<local>}
                {<Id.Lit_VarLike 'tenant_args='> 
                  (DQ <'--tenant '> (${ Id.VSub_Name PHOTON_TENANT) <' --project '> 
                    (${ Id.VSub_Name PHOTON_PROJECT)
                  )
                }
              ]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <local>
              more_env: []
              words: [
                {<local>}
                {<Id.Lit_VarLike 'vm_args='> 
                  (DQ <'--name '> (${ Id.VSub_Name vm_name) <' --image '> 
                    (${ Id.VSub_Name PHOTON_IMAGE_ID) <' --flavor '> (${ Id.VSub_Name vm_flavor)
                  )
                }
              ]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <local>
              more_env: []
              words: [
                {<local>}
                {<Id.Lit_VarLike 'disk_args='> 
                  (DQ <'disk-1 '> (${ Id.VSub_Name PHOTON_DISK_FLAVOR) <' boot=true'>)
                }
              ]
              redirects: []
              do_fork: T
            )
            (command.ShAssignment
              left: <Id.Lit_VarLike 'rc='>
              pairs: [
                (AssignPair
                  left: <Id.Lit_VarLike 'rc='>
                  lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'rc='> name:rc)
                  op: assign_op.Equal
                  rhs: {<0>}
                )
              ]
              redirects: []
            )
            (command.AndOr
              children: [
                (command.ShAssignment
                  left: <Id.Lit_VarLike '_VM_ID='>
                  pairs: [
                    (AssignPair
                      left: <Id.Lit_VarLike '_VM_ID='>
                      lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_VM_ID='> name:_VM_ID)
                      op: assign_op.Equal
                      rhs: 
                        {
                          (CommandSub
                            left_token: <Id.Left_DollarParen '$('>
                            child: 
                              (command.Simple
                                blame_tok: <Id.Left_DollarBrace '${'>
                                more_env: []
                                words: [
                                  {(${ Id.VSub_Name PHOTON)}
                                  {<vm>}
                                  {<create>}
                                  {(${ Id.VSub_Name tenant_args)}
                                  {(${ Id.VSub_Name vm_args)}
                                  {<--disks>}
                                  {(DQ (${ Id.VSub_Name disk_args))}
                                ]
                                redirects: [
                                  (Redir
                                    op: <Id.Redir_GreatAnd '2>&'>
                                    loc: (redir_loc.Fd fd:2)
                                    arg: {<1>}
                                  )
                                ]
                                do_fork: T
                              )
                            right: <Id.Eof_RParen _>
                          )
                        }
                    )
                  ]
                  redirects: []
                )
                (command.ShAssignment
                  left: <Id.Lit_VarLike 'rc='>
                  pairs: [
                    (AssignPair
                      left: <Id.Lit_VarLike 'rc='>
                      lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'rc='> name:rc)
                      op: assign_op.Equal
                      rhs: {($ Id.VSub_QMark '?')}
                    )
                  ]
                  redirects: []
                )
              ]
              ops: [<Id.Op_DPipe _>]
            )
            (command.If
              if_kw: <Id.KW_If if>
              arms: [
                (IfArm
                  keyword: <Id.KW_If if>
                  cond: 
                    (condition.Shell
                      commands: [
                        (command.Sentence
                          child: 
                            (command.DBracket
                              left: <Id.KW_DLeftBracket '[['>
                              expr: 
                                (bool_expr.Binary
                                  op_id: Id.BoolBinary_ne
                                  left: {(${ Id.VSub_Name rc)}
                                  right: {<0>}
                                )
                              right: <Id.Lit_DRightBracket ']]'>
                              redirects: []
                            )
                          terminator: <Id.Op_Semi _>
                        )
                      ]
                    )
                  then_kw: <Id.KW_Then then>
                  action: [
                    (command.Simple
                      blame_tok: <kube>
                      more_env: []
                      words: [
                        {<kube> <Id.Lit_Colon ':'> <Id.Lit_Colon ':'> <log> <Id.Lit_Colon ':'> 
                          <Id.Lit_Colon ':'> <error>
                        }
                        {(DQ <'Failed to create VM. Error output:'>)}
                      ]
                      redirects: []
                      do_fork: T
                    )
                    (command.Simple
                      blame_tok: <echo>
                      more_env: []
                      words: [{<echo>} {(DQ (${ Id.VSub_Name _VM_ID))}]
                      redirects: []
                      do_fork: T
                    )
                    (command.ControlFlow
                      keyword: <Id.ControlFlow_Exit exit>
                      arg_word: {<1>}
                    )
                  ]
                  spids: [1588 1603]
                )
              ]
              else_action: []
              fi_kw: <Id.KW_Fi fi>
              redirects: []
            )
            (command.Simple
              blame_tok: <kube>
              more_env: []
              words: [
                {<kube> <Id.Lit_Colon ':'> <Id.Lit_Colon ':'> <log> <Id.Lit_Colon ':'> <Id.Lit_Colon ':'> 
                  <status>
                }
                {(DQ <'Created VM '> (${ Id.VSub_Name vm_name) <': '> (${ Id.VSub_Name _VM_ID))}
              ]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <run-cmd>
              more_env: []
              words: [
                {<run-cmd>}
                {
                  (DQ (${ Id.VSub_Name PHOTON) <' vm attach-iso -p '> (${ Id.VSub_Name KUBE_TEMP) 
                    <'/cloud-init.iso '> (${ Id.VSub_Name _VM_ID)
                  )
                }
              ]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <run-cmd>
              more_env: []
              words: [
                {<run-cmd>}
                {(DQ (${ Id.VSub_Name PHOTON) <' vm start '> (${ Id.VSub_Name _VM_ID))}
              ]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <kube>
              more_env: []
              words: [
                {<kube> <Id.Lit_Colon ':'> <Id.Lit_Colon ':'> <log> <Id.Lit_Colon ':'> <Id.Lit_Colon ':'> 
                  <status>
                }
                {(DQ <'Started VM '> (${ Id.VSub_Name vm_name) <', waiting for network address...'>)}
              ]
              redirects: []
              do_fork: T
            )
            (command.ShAssignment
              left: <Id.Lit_VarLike 'have_network='>
              pairs: [
                (AssignPair
                  left: <Id.Lit_VarLike 'have_network='>
                  lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'have_network='> name:have_network)
                  op: assign_op.Equal
                  rhs: {<0>}
                )
              ]
              redirects: []
            )
            (command.ForEach
              keyword: <Id.KW_For for>
              iter_names: [i]
              iterable: 
                (for_iter.Words
                  words: [
                    (word.BracedTree
                      parts: [
                        (word_part.BracedRange
                          blame_tok: <1..120>
                          kind: Id.Range_Int
                          start: 1
                          end: 120
                          step: 1
                        )
                      ]
                    )
                  ]
                )
              semi_tok: <Id.Op_Semi _>
              body: 
                (command.DoGroup
                  left: <Id.KW_Do do>
                  children: [
                    (command.ShAssignment
                      left: <Id.Lit_VarLike 'rc='>
                      pairs: [
                        (AssignPair
                          left: <Id.Lit_VarLike 'rc='>
                          lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'rc='> name:rc)
                          op: assign_op.Equal
                          rhs: {<0>}
                        )
                      ]
                      redirects: []
                    )
                    (command.AndOr
                      children: [
                        (command.ShAssignment
                          left: <Id.Lit_VarLike 'networks='>
                          pairs: [
                            (AssignPair
                              left: <Id.Lit_VarLike 'networks='>
                              lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'networks='> name:networks)
                              op: assign_op.Equal
                              rhs: 
                                {
                                  (CommandSub
                                    left_token: <Id.Left_DollarParen '$('>
                                    child: 
                                      (command.Simple
                                        blame_tok: <Id.Left_DollarBrace '${'>
                                        more_env: []
                                        words: [
                                          {(${ Id.VSub_Name PHOTON)}
                                          {<vm>}
                                          {<networks>}
                                          {(DQ (${ Id.VSub_Name _VM_ID))}
                                        ]
                                        redirects: []
                                        do_fork: T
                                      )
                                    right: <Id.Eof_RParen _>
                                  )
                                }
                            )
                          ]
                          redirects: []
                        )
                        (command.ShAssignment
                          left: <Id.Lit_VarLike 'rc='>
                          pairs: [
                            (AssignPair
                              left: <Id.Lit_VarLike 'rc='>
                              lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'rc='> name:rc)
                              op: assign_op.Equal
                              rhs: {($ Id.VSub_QMark '?')}
                            )
                          ]
                          redirects: []
                        )
                      ]
                      ops: [<Id.Op_DPipe _>]
                    )
                    (command.If
                      if_kw: <Id.KW_If if>
                      arms: [
                        (IfArm
                          keyword: <Id.KW_If if>
                          cond: 
                            (condition.Shell
                              commands: [
                                (command.Sentence
                                  child: 
                                    (command.DBracket
                                      left: <Id.KW_DLeftBracket '[['>
                                      expr: 
                                        (bool_expr.Binary
                                          op_id: Id.BoolBinary_ne
                                          left: {(${ Id.VSub_Name rc)}
                                          right: {<0>}
                                        )
                                      right: <Id.Lit_DRightBracket ']]'>
                                      redirects: []
                                    )
                                  terminator: <Id.Op_Semi _>
                                )
                              ]
                            )
                          then_kw: <Id.KW_Then then>
                          action: [
                            (command.Simple
                              blame_tok: <kube>
                              more_env: []
                              words: [
                                {<kube> <Id.Lit_Colon ':'> <Id.Lit_Colon ':'> <log> <Id.Lit_Colon ':'> 
                                  <Id.Lit_Colon ':'> <error>
                                }
                                {
                                  (DQ <'\''> (${ Id.VSub_Name PHOTON) <' vm networks '> 
                                    (${ Id.VSub_Name _VM_ID) <'\' failed. Error output: '>
                                  )
                                }
                              ]
                              redirects: []
                              do_fork: T
                            )
                            (command.Simple
                              blame_tok: <echo>
                              more_env: []
                              words: [{<echo>} {(DQ (${ Id.VSub_Name networks))}]
                              redirects: []
                              do_fork: T
                            )
                          ]
                          spids: [1790 1805]
                        )
                      ]
                      else_action: []
                      fi_kw: <Id.KW_Fi fi>
                      redirects: []
                    )
                    (command.AndOr
                      children: [
                        (command.ShAssignment
                          left: <Id.Lit_VarLike 'networks='>
                          pairs: [
                            (AssignPair
                              left: <Id.Lit_VarLike 'networks='>
                              lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'networks='> name:networks)
                              op: assign_op.Equal
                              rhs: 
                                {
                                  (CommandSub
                                    left_token: <Id.Left_DollarParen '$('>
                                    child: 
                                      (command.Pipeline
                                        children: [
                                          (command.Simple
                                            blame_tok: <echo>
                                            more_env: []
                                            words: [{<echo>} {(DQ (${ Id.VSub_Name networks))}]
                                            redirects: []
                                            do_fork: T
                                          )
                                          (command.Simple
                                            blame_tok: <grep>
                                            more_env: []
                                            words: [{<grep>} {<True>}]
                                            redirects: []
                                            do_fork: T
                                          )
                                        ]
                                        ops: [<Id.Op_Pipe _>]
                                      )
                                    right: <Id.Eof_RParen _>
                                  )
                                }
                            )
                          ]
                          redirects: []
                        )
                        (command.ShAssignment
                          left: <Id.Lit_VarLike 'rc='>
                          pairs: [
                            (AssignPair
                              left: <Id.Lit_VarLike 'rc='>
                              lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'rc='> name:rc)
                              op: assign_op.Equal
                              rhs: {($ Id.VSub_QMark '?')}
                            )
                          ]
                          redirects: []
                        )
                      ]
                      ops: [<Id.Op_DPipe _>]
                    )
                    (command.If
                      if_kw: <Id.KW_If if>
                      arms: [
                        (IfArm
                          keyword: <Id.KW_If if>
                          cond: 
                            (condition.Shell
                              commands: [
                                (command.Sentence
                                  child: 
                                    (command.DBracket
                                      left: <Id.KW_DLeftBracket '[['>
                                      expr: 
                                        (bool_expr.Binary
                                          op_id: Id.BoolBinary_eq
                                          left: {(${ Id.VSub_Name rc)}
                                          right: {<0>}
                                        )
                                      right: <Id.Lit_DRightBracket ']]'>
                                      redirects: []
                                    )
                                  terminator: <Id.Op_Semi _>
                                )
                              ]
                            )
                          then_kw: <Id.KW_Then then>
                          action: [
                            (command.ShAssignment
                              left: <Id.Lit_VarLike 'have_network='>
                              pairs: [
                                (AssignPair
                                  left: <Id.Lit_VarLike 'have_network='>
                                  lhs: 
                                    (sh_lhs_expr.Name
                                      left: <Id.Lit_VarLike 'have_network='>
                                      name: have_network
                                    )
                                  op: assign_op.Equal
                                  rhs: {<1>}
                                )
                              ]
                              redirects: []
                            )
                            (command.Sentence
                              child: (command.ControlFlow keyword:<Id.ControlFlow_Break break>)
                              terminator: <Id.Op_Semi _>
                            )
                          ]
                          spids: [1864 1879]
                        )
                      ]
                      else_action: []
                      fi_kw: <Id.KW_Fi fi>
                      redirects: []
                    )
                    (command.Simple
                      blame_tok: <sleep>
                      more_env: []
                      words: [{<sleep>} {<1>}]
                      redirects: []
                      do_fork: T
                    )
                  ]
                  right: <Id.KW_Done done>
                )
              redirects: []
            )
            (command.If
              if_kw: <Id.KW_If if>
              arms: [
                (IfArm
                  keyword: <Id.KW_If if>
                  cond: 
                    (condition.Shell
                      commands: [
                        (command.Sentence
                          child: 
                            (command.DBracket
                              left: <Id.KW_DLeftBracket '[['>
                              expr: 
                                (bool_expr.Binary
                                  op_id: Id.BoolBinary_eq
                                  left: {(${ Id.VSub_Name have_network)}
                                  right: {<0>}
                                )
                              right: <Id.Lit_DRightBracket ']]'>
                              redirects: []
                            )
                          terminator: <Id.Op_Semi _>
                        )
                      ]
                    )
                  then_kw: <Id.KW_Then then>
                  action: [
                    (command.Simple
                      blame_tok: <kube>
                      more_env: []
                      words: [
                        {<kube> <Id.Lit_Colon ':'> <Id.Lit_Colon ':'> <log> <Id.Lit_Colon ':'> 
                          <Id.Lit_Colon ':'> <error>
                        }
                        {
                          (DQ <'VM '> (${ Id.VSub_Name vm_name) 
                            <' failed to start up: no IP was found'>
                          )
                        }
                      ]
                      redirects: []
                      do_fork: T
                    )
                    (command.ControlFlow
                      keyword: <Id.ControlFlow_Exit exit>
                      arg_word: {<1>}
                    )
                  ]
                  spids: [1906 1921]
                )
              ]
              else_action: []
              fi_kw: <Id.KW_Fi fi>
              redirects: []
            )
            (command.ShAssignment
              left: <Id.Lit_VarLike '_VM_IP='>
              pairs: [
                (AssignPair
                  left: <Id.Lit_VarLike '_VM_IP='>
                  lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_VM_IP='> name:_VM_IP)
                  op: assign_op.Equal
                  rhs: 
                    {
                      (CommandSub
                        left_token: <Id.Left_DollarParen '$('>
                        child: 
                          (command.Pipeline
                            children: [
                              (command.Simple
                                blame_tok: <Id.Left_DollarBrace '${'>
                                more_env: []
                                words: [
                                  {(${ Id.VSub_Name PHOTON)}
                                  {<vm>}
                                  {<networks>}
                                  {(DQ (${ Id.VSub_Name _VM_ID))}
                                ]
                                redirects: []
                                do_fork: T
                              )
                              (command.Simple
                                blame_tok: <head>
                                more_env: []
                                words: [{<head>} {<-1>}]
                                redirects: []
                                do_fork: T
                              )
                              (command.Simple
                                blame_tok: <awk>
                                more_env: []
                                words: [{<awk>} {<-F> (SQ <'\\t'>)} {(SQ <'{print $3}'>)}]
                                redirects: []
                                do_fork: T
                              )
                            ]
                            ops: [<Id.Op_Pipe _> <Id.Op_Pipe _>]
                          )
                        right: <Id.Eof_RParen _>
                      )
                    }
                )
              ]
              redirects: []
            )
            (command.Simple
              blame_tok: <kube>
              more_env: []
              words: [
                {<kube> <Id.Lit_Colon ':'> <Id.Lit_Colon ':'> <log> <Id.Lit_Colon ':'> <Id.Lit_Colon ':'> 
                  <status>
                }
                {(DQ <'VM '> (${ Id.VSub_Name vm_name) <' has IP: '> (${ Id.VSub_Name _VM_IP))}
              ]
              redirects: []
              do_fork: T
            )
          ]
          redirects: []
          right: <Id.Lit_RBrace '}'>
        )
    )
    (command.ShFunction
      keyword: <Id.KW_Function function>
      name_tok: <pc-delete-vm>
      name: pc-delete-vm
      body: 
        (BraceGroup
          left: <Id.Lit_LBrace '{'>
          children: [
            (command.Simple
              blame_tok: <local>
              more_env: []
              words: [{<local>} {<Id.Lit_VarLike 'vm_name='> (DQ (${ Id.VSub_Number 1))}]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <local>
              more_env: []
              words: [{<local>} {<Id.Lit_VarLike 'vm_id='> (DQ (${ Id.VSub_Number 2))}]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <local>
              more_env: []
              words: [{<local>} {<Id.Lit_VarLike 'rc='> <0>}]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <kube>
              more_env: []
              words: [
                {<kube> <Id.Lit_Colon ':'> <Id.Lit_Colon ':'> <log> <Id.Lit_Colon ':'> <Id.Lit_Colon ':'> 
                  <status>
                }
                {(DQ <'Deleting VM '> (${ Id.VSub_Name vm_name))}
              ]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <set>
              more_env: []
              words: [{<set>} {<Id.Lit_Other '+'> <o>} {<pipefail>}]
              redirects: []
              do_fork: T
            )
            (command.AndOr
              children: [
                (command.Pipeline
                  children: [
                    (command.Simple
                      blame_tok: <Id.Left_DollarBrace '${'>
                      more_env: []
                      words: [{(${ Id.VSub_Name PHOTON)} {<vm>} {<show>} {(DQ (${ Id.VSub_Name vm_id))}]
                      redirects: []
                      do_fork: T
                    )
                    (command.Simple
                      blame_tok: <head>
                      more_env: []
                      words: [{<head>} {<-1>}]
                      redirects: []
                      do_fork: T
                    )
                    (command.Simple
                      blame_tok: <grep>
                      more_env: []
                      words: [{<grep>} {<STARTED>}]
                      redirects: [
                        (Redir
                          op: <Id.Redir_Great '>'>
                          loc: (redir_loc.Fd fd:1)
                          arg: {<'/dev/null'>}
                        )
                        (Redir
                          op: <Id.Redir_GreatAnd '2>&'>
                          loc: (redir_loc.Fd fd:2)
                          arg: {<1>}
                        )
                      ]
                      do_fork: T
                    )
                  ]
                  ops: [<Id.Op_Pipe _> <Id.Op_Pipe _>]
                )
                (command.ShAssignment
                  left: <Id.Lit_VarLike 'rc='>
                  pairs: [
                    (AssignPair
                      left: <Id.Lit_VarLike 'rc='>
                      lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'rc='> name:rc)
                      op: assign_op.Equal
                      rhs: {($ Id.VSub_QMark '?')}
                    )
                  ]
                  redirects: []
                )
              ]
              ops: [<Id.Op_DPipe _>]
            )
            (command.Simple
              blame_tok: <set>
              more_env: []
              words: [{<set>} {<Id.Lit_Other '+'> <o>} {<pipefail>}]
              redirects: []
              do_fork: T
            )
            (command.If
              if_kw: <Id.KW_If if>
              arms: [
                (IfArm
                  keyword: <Id.KW_If if>
                  cond: 
                    (condition.Shell
                      commands: [
                        (command.Sentence
                          child: 
                            (command.DBracket
                              left: <Id.KW_DLeftBracket '[['>
                              expr: 
                                (bool_expr.Binary
                                  op_id: Id.BoolBinary_eq
                                  left: {(${ Id.VSub_Name rc)}
                                  right: {<0>}
                                )
                              right: <Id.Lit_DRightBracket ']]'>
                              redirects: []
                            )
                          terminator: <Id.Op_Semi _>
                        )
                      ]
                    )
                  then_kw: <Id.KW_Then then>
                  action: [
                    (command.AndOr
                      children: [
                        (command.Simple
                          blame_tok: <Id.Left_DollarBrace '${'>
                          more_env: []
                          words: [
                            {(${ Id.VSub_Name PHOTON)}
                            {<vm>}
                            {<stop>}
                            {(DQ (${ Id.VSub_Name vm_id))}
                          ]
                          redirects: [
                            (Redir
                              op: <Id.Redir_Great '>'>
                              loc: (redir_loc.Fd fd:1)
                              arg: {<'/dev/null'>}
                            )
                            (Redir
                              op: <Id.Redir_GreatAnd '2>&'>
                              loc: (redir_loc.Fd fd:2)
                              arg: {<1>}
                            )
                          ]
                          do_fork: T
                        )
                        (command.ShAssignment
                          left: <Id.Lit_VarLike 'rc='>
                          pairs: [
                            (AssignPair
                              left: <Id.Lit_VarLike 'rc='>
                              lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'rc='> name:rc)
                              op: assign_op.Equal
                              rhs: {($ Id.VSub_QMark '?')}
                            )
                          ]
                          redirects: []
                        )
                      ]
                      ops: [<Id.Op_DPipe _>]
                    )
                    (command.If
                      if_kw: <Id.KW_If if>
                      arms: [
                        (IfArm
                          keyword: <Id.KW_If if>
                          cond: 
                            (condition.Shell
                              commands: [
                                (command.Sentence
                                  child: 
                                    (command.DBracket
                                      left: <Id.KW_DLeftBracket '[['>
                                      expr: 
                                        (bool_expr.Binary
                                          op_id: Id.BoolBinary_ne
                                          left: {(${ Id.VSub_Name rc)}
                                          right: {<0>}
                                        )
                                      right: <Id.Lit_DRightBracket ']]'>
                                      redirects: []
                                    )
                                  terminator: <Id.Op_Semi _>
                                )
                              ]
                            )
                          then_kw: <Id.KW_Then then>
                          action: [
                            (command.Simple
                              blame_tok: <kube>
                              more_env: []
                              words: [
                                {<kube> <Id.Lit_Colon ':'> <Id.Lit_Colon ':'> <log> <Id.Lit_Colon ':'> 
                                  <Id.Lit_Colon ':'> <error>
                                }
                                {
                                  (DQ <'Error: could not stop '> (${ Id.VSub_Name vm_name) <' ('> 
                                    ($ Id.VSub_DollarName vm_id) <')'>
                                  )
                                }
                              ]
                              redirects: []
                              do_fork: T
                            )
                            (command.Simple
                              blame_tok: <kube>
                              more_env: []
                              words: [
                                {<kube> <Id.Lit_Colon ':'> <Id.Lit_Colon ':'> <log> <Id.Lit_Colon ':'> 
                                  <Id.Lit_Colon ':'> <error>
                                }
                                {(DQ <'Please investigate and stop manually'>)}
                              ]
                              redirects: []
                              do_fork: T
                            )
                            (command.ControlFlow
                              keyword: <Id.ControlFlow_Return return>
                            )
                          ]
                          spids: [2183 2198]
                        )
                      ]
                      else_action: []
                      fi_kw: <Id.KW_Fi fi>
                      redirects: []
                    )
                  ]
                  spids: [2138 2153]
                )
              ]
              else_action: []
              fi_kw: <Id.KW_Fi fi>
              redirects: []
            )
            (command.ShAssignment
              left: <Id.Lit_VarLike 'rc='>
              pairs: [
                (AssignPair
                  left: <Id.Lit_VarLike 'rc='>
                  lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'rc='> name:rc)
                  op: assign_op.Equal
                  rhs: {<0>}
                )
              ]
              redirects: []
            )
            (command.AndOr
              children: [
                (command.Simple
                  blame_tok: <Id.Left_DollarBrace '${'>
                  more_env: []
                  words: [{(${ Id.VSub_Name PHOTON)} {<vm>} {<delete>} {(DQ (${ Id.VSub_Name vm_id))}]
                  redirects: [
                    (Redir
                      op: <Id.Redir_Great '>'>
                      loc: (redir_loc.Fd fd:1)
                      arg: {<'/dev/null'>}
                    )
                    (Redir
                      op: <Id.Redir_GreatAnd '2>&'>
                      loc: (redir_loc.Fd fd:2)
                      arg: {<1>}
                    )
                  ]
                  do_fork: T
                )
                (command.ShAssignment
                  left: <Id.Lit_VarLike 'rc='>
                  pairs: [
                    (AssignPair
                      left: <Id.Lit_VarLike 'rc='>
                      lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'rc='> name:rc)
                      op: assign_op.Equal
                      rhs: {($ Id.VSub_QMark '?')}
                    )
                  ]
                  redirects: []
                )
              ]
              ops: [<Id.Op_DPipe _>]
            )
            (command.If
              if_kw: <Id.KW_If if>
              arms: [
                (IfArm
                  keyword: <Id.KW_If if>
                  cond: 
                    (condition.Shell
                      commands: [
                        (command.Sentence
                          child: 
                            (command.DBracket
                              left: <Id.KW_DLeftBracket '[['>
                              expr: 
                                (bool_expr.Binary
                                  op_id: Id.BoolBinary_ne
                                  left: {(${ Id.VSub_Name rc)}
                                  right: {<0>}
                                )
                              right: <Id.Lit_DRightBracket ']]'>
                              redirects: []
                            )
                          terminator: <Id.Op_Semi _>
                        )
                      ]
                    )
                  then_kw: <Id.KW_Then then>
                  action: [
                    (command.Simple
                      blame_tok: <kube>
                      more_env: []
                      words: [
                        {<kube> <Id.Lit_Colon ':'> <Id.Lit_Colon ':'> <log> <Id.Lit_Colon ':'> 
                          <Id.Lit_Colon ':'> <error>
                        }
                        {
                          (DQ <'Error: could not delete '> (${ Id.VSub_Name vm_name) <' ('> 
                            ($ Id.VSub_DollarName vm_id) <')'>
                          )
                        }
                      ]
                      redirects: []
                      do_fork: T
                    )
                    (command.Simple
                      blame_tok: <kube>
                      more_env: []
                      words: [
                        {<kube> <Id.Lit_Colon ':'> <Id.Lit_Colon ':'> <log> <Id.Lit_Colon ':'> 
                          <Id.Lit_Colon ':'> <error>
                        }
                        {(DQ <'Please investigate and delete manually'>)}
                      ]
                      redirects: []
                      do_fork: T
                    )
                  ]
                  spids: [2274 2289]
                )
              ]
              else_action: []
              fi_kw: <Id.KW_Fi fi>
              redirects: []
            )
          ]
          redirects: []
          right: <Id.Lit_RBrace '}'>
        )
    )
    (command.ShFunction
      keyword: <Id.KW_Function function>
      name_tok: <find-image-id>
      name: find-image-id
      body: 
        (BraceGroup
          left: <Id.Lit_LBrace '{'>
          children: [
            (command.Simple
              blame_tok: <local>
              more_env: []
              words: [{<local>} {<Id.Lit_VarLike 'rc='> <0>}]
              redirects: []
              do_fork: T
            )
            (command.ShAssignment
              left: <Id.Lit_VarLike 'PHOTON_IMAGE_ID='>
              pairs: [
                (AssignPair
                  left: <Id.Lit_VarLike 'PHOTON_IMAGE_ID='>
                  lhs: 
                    (sh_lhs_expr.Name
                      left: <Id.Lit_VarLike 'PHOTON_IMAGE_ID='>
                      name: PHOTON_IMAGE_ID
                    )
                  op: assign_op.Equal
                  rhs: 
                    {
                      (CommandSub
                        left_token: <Id.Left_DollarParen '$('>
                        child: 
                          (command.Pipeline
                            children: [
                              (command.Simple
                                blame_tok: <Id.Left_DollarBrace '${'>
                                more_env: []
                                words: [{(${ Id.VSub_Name PHOTON)} {<image>} {<list>}]
                                redirects: []
                                do_fork: T
                              )
                              (command.Simple
                                blame_tok: <grep>
                                more_env: []
                                words: [
                                  {<grep>}
                                  {
                                    (SingleQuoted
                                      left: <Id.Left_DollarSingleQuote '$\''>
                                      tokens: [<Id.Char_OneChar '\\t'>]
                                      right: <Id.Right_SingleQuote '\''>
                                    ) (DQ (${ Id.VSub_Name PHOTON_IMAGE)) 
                                    (SingleQuoted
                                      left: <Id.Left_DollarSingleQuote '$\''>
                                      tokens: [<Id.Char_OneChar '\\t'>]
                                      right: <Id.Right_SingleQuote '\''>
                                    )
                                  }
                                ]
                                redirects: []
                                do_fork: T
                              )
                              (command.Simple
                                blame_tok: <head>
                                more_env: []
                                words: [{<head>} {<-1>}]
                                redirects: []
                                do_fork: T
                              )
                              (command.Simple
                                blame_tok: <grep>
                                more_env: []
                                words: [{<grep>} {<READY>}]
                                redirects: []
                                do_fork: T
                              )
                              (command.Simple
                                blame_tok: <awk>
                                more_env: []
                                words: [{<awk>} {<-F> (SQ <'\\t'>)} {(SQ <'{print $1}'>)}]
                                redirects: []
                                do_fork: T
                              )
                            ]
                            ops: [<Id.Op_Pipe _> <Id.Op_Pipe _> <Id.Op_Pipe _> <Id.Op_Pipe _>]
                          )
                        right: <Id.Eof_RParen _>
                      )
                    }
                )
              ]
              redirects: []
            )
            (command.If
              if_kw: <Id.KW_If if>
              arms: [
                (IfArm
                  keyword: <Id.KW_If if>
                  cond: 
                    (condition.Shell
                      commands: [
                        (command.Sentence
                          child: 
                            (command.DBracket
                              left: <Id.KW_DLeftBracket '[['>
                              expr: 
                                (bool_expr.Binary
                                  op_id: Id.BoolBinary_ne
                                  left: {(${ Id.VSub_Name rc)}
                                  right: {<0>}
                                )
                              right: <Id.Lit_DRightBracket ']]'>
                              redirects: []
                            )
                          terminator: <Id.Op_Semi _>
                        )
                      ]
                    )
                  then_kw: <Id.KW_Then then>
                  action: [
                    (command.Simple
                      blame_tok: <kube>
                      more_env: []
                      words: [
                        {<kube> <Id.Lit_Colon ':'> <Id.Lit_Colon ':'> <log> <Id.Lit_Colon ':'> 
                          <Id.Lit_Colon ':'> <error>
                        }
                        {
                          (DQ <'Cannot find image '> 
                            (word_part.EscapedLiteral
                              token: <Id.Lit_EscapedChar '\\"'>
                              ch: '"'
                            ) (${ Id.VSub_Name PHOTON_IMAGE) (word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\"'> ch:'"')
                          )
                        }
                      ]
                      redirects: []
                      do_fork: T
                    )
                    (command.ShAssignment
                      left: <Id.Lit_VarLike 'fail='>
                      pairs: [
                        (AssignPair
                          left: <Id.Lit_VarLike 'fail='>
                          lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'fail='> name:fail)
                          op: assign_op.Equal
                          rhs: {<1>}
                        )
                      ]
                      redirects: []
                    )
                  ]
                  spids: [2410 2425]
                )
              ]
              else_action: []
              fi_kw: <Id.KW_Fi fi>
              redirects: []
            )
          ]
          redirects: []
          right: <Id.Lit_RBrace '}'>
        )
    )
    (command.ShFunction
      keyword: <Id.KW_Function function>
      name_tok: <gen-cloud-init-iso>
      name: gen-cloud-init-iso
      body: 
        (BraceGroup
          left: <Id.Lit_LBrace '{'>
          children: [
            (command.Simple
              blame_tok: <local>
              more_env: []
              words: [{<local>} {<password_hash>}]
              redirects: []
              do_fork: T
            )
            (command.ShAssignment
              left: <Id.Lit_VarLike 'password_hash='>
              pairs: [
                (AssignPair
                  left: <Id.Lit_VarLike 'password_hash='>
                  lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'password_hash='> name:password_hash)
                  op: assign_op.Equal
                  rhs: 
                    {
                      (CommandSub
                        left_token: <Id.Left_DollarParen '$('>
                        child: 
                          (command.Simple
                            blame_tok: <openssl>
                            more_env: []
                            words: [{<openssl>} {<passwd>} {<-1>} {(DQ (${ Id.VSub_Name KUBE_PASSWORD))}]
                            redirects: []
                            do_fork: T
                          )
                        right: <Id.Eof_RParen _>
                      )
                    }
                )
              ]
              redirects: []
            )
            (command.Simple
              blame_tok: <local>
              more_env: []
              words: [{<local>} {<ssh_key>}]
              redirects: []
              do_fork: T
            )
            (command.ShAssignment
              left: <Id.Lit_VarLike 'ssh_key='>
              pairs: [
                (AssignPair
                  left: <Id.Lit_VarLike 'ssh_key='>
                  lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'ssh_key='> name:ssh_key)
                  op: assign_op.Equal
                  rhs: 
                    {
                      (CommandSub
                        left_token: <Id.Left_DollarParen '$('>
                        child: 
                          (command.Pipeline
                            children: [
                              (command.Simple
                                blame_tok: <ssh-add>
                                more_env: []
                                words: [{<ssh-add>} {<-L>}]
                                redirects: []
                                do_fork: T
                              )
                              (command.Simple
                                blame_tok: <head>
                                more_env: []
                                words: [{<head>} {<-1>}]
                                redirects: []
                                do_fork: T
                              )
                            ]
                            ops: [<Id.Op_Pipe _>]
                          )
                        right: <Id.Eof_RParen _>
                      )
                    }
                )
              ]
              redirects: []
            )
            (command.Subshell
              left: <Id.Op_LParen _>
              child: 
                (command.CommandList
                  children: [
                    (command.Simple
                      blame_tok: <echo>
                      more_env: []
                      words: [{<echo>} {(DQ <'#cloud-config'>)}]
                      redirects: []
                      do_fork: T
                    )
                    (command.Simple
                      blame_tok: <echo>
                      more_env: []
                      words: [{<echo>} {(DQ )}]
                      redirects: []
                      do_fork: T
                    )
                    (command.Simple
                      blame_tok: <echo>
                      more_env: []
                      words: [{<echo>} {(DQ <'groups:'>)}]
                      redirects: []
                      do_fork: T
                    )
                    (command.Simple
                      blame_tok: <echo>
                      more_env: []
                      words: [{<echo>} {(DQ <'  - '> (${ Id.VSub_Name VM_USER))}]
                      redirects: []
                      do_fork: T
                    )
                    (command.Simple
                      blame_tok: <echo>
                      more_env: []
                      words: [{<echo>} {(DQ )}]
                      redirects: []
                      do_fork: T
                    )
                    (command.Simple
                      blame_tok: <echo>
                      more_env: []
                      words: [{<echo>} {(DQ <'users:'>)}]
                      redirects: []
                      do_fork: T
                    )
                    (command.Simple
                      blame_tok: <echo>
                      more_env: []
                      words: [{<echo>} {(DQ <'  - name: '> (${ Id.VSub_Name VM_USER))}]
                      redirects: []
                      do_fork: T
                    )
                    (command.Simple
                      blame_tok: <echo>
                      more_env: []
                      words: [{<echo>} {(DQ <'    gecos: Kubernetes'>)}]
                      redirects: []
                      do_fork: T
                    )
                    (command.Simple
                      blame_tok: <echo>
                      more_env: []
                      words: [{<echo>} {(DQ <'    primary-group: '> (${ Id.VSub_Name VM_USER))}]
                      redirects: []
                      do_fork: T
                    )
                    (command.Simple
                      blame_tok: <echo>
                      more_env: []
                      words: [{<echo>} {(DQ <'    lock-passwd: false'>)}]
                      redirects: []
                      do_fork: T
                    )
                    (command.Simple
                      blame_tok: <echo>
                      more_env: []
                      words: [{<echo>} {(DQ <'    passwd: '> (${ Id.VSub_Name password_hash))}]
                      redirects: []
                      do_fork: T
                    )
                    (command.Simple
                      blame_tok: <echo>
                      more_env: []
                      words: [{<echo>} {(DQ <'    ssh-authorized-keys: '>)}]
                      redirects: []
                      do_fork: T
                    )
                    (command.Simple
                      blame_tok: <echo>
                      more_env: []
                      words: [{<echo>} {(DQ <'      - '> (${ Id.VSub_Name ssh_key))}]
                      redirects: []
                      do_fork: T
                    )
                    (command.Simple
                      blame_tok: <echo>
                      more_env: []
                      words: [{<echo>} {(DQ <'    sudo: ALL=(ALL) NOPASSWD:ALL'>)}]
                      redirects: []
                      do_fork: T
                    )
                    (command.Simple
                      blame_tok: <echo>
                      more_env: []
                      words: [{<echo>} {(DQ <'    shell: /bin/bash'>)}]
                      redirects: []
                      do_fork: T
                    )
                    (command.Simple
                      blame_tok: <echo>
                      more_env: []
                      words: [{<echo>} {(DQ )}]
                      redirects: []
                      do_fork: T
                    )
                    (command.Simple
                      blame_tok: <echo>
                      more_env: []
                      words: [{<echo>} {(DQ <'hostname:'>)}]
                      redirects: []
                      do_fork: T
                    )
                    (command.Simple
                      blame_tok: <echo>
                      more_env: []
                      words: [{<echo>} {(DQ <'  - hostname: kube'>)}]
                      redirects: []
                      do_fork: T
                    )
                  ]
                )
              right: <Id.Right_Subshell _>
              redirects: [
                (Redir
                  op: <Id.Redir_Great '>'>
                  loc: (redir_loc.Fd fd:1)
                  arg: {(DQ (${ Id.VSub_Name KUBE_TEMP) <'/user-data.txt'>)}
                )
              ]
            )
            (command.Simple
              blame_tok: <run-cmd>
              more_env: []
              words: [
                {<run-cmd>}
                {
                  (DQ <'mkisofs -rock -o '> (${ Id.VSub_Name KUBE_TEMP) <'/cloud-init.iso '> 
                    (${ Id.VSub_Name KUBE_TEMP) <'/user-data.txt'>
                  )
                }
              ]
              redirects: []
              do_fork: T
            )
          ]
          redirects: []
          right: <Id.Lit_RBrace '}'>
        )
    )
    (command.ShFunction
      keyword: <Id.KW_Function function>
      name_tok: <gen-master-start>
      name: gen-master-start
      body: 
        (BraceGroup
          left: <Id.Lit_LBrace '{'>
          children: [
            (command.Simple
              blame_tok: <python>
              more_env: []
              words: [
                {<python>}
                {(DQ (${ Id.VSub_Name KUBE_ROOT) <'/third_party/htpasswd/htpasswd.py'>)}
                {<-b>}
                {<-c>}
                {(DQ (${ Id.VSub_Name KUBE_TEMP) <'/htpasswd'>)}
                {(DQ (${ Id.VSub_Name KUBE_USER))}
                {(DQ (${ Id.VSub_Name KUBE_PASSWORD))}
              ]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <local>
              more_env: []
              words: [{<local>} {<htpasswd>}]
              redirects: []
              do_fork: T
            )
            (command.ShAssignment
              left: <Id.Lit_VarLike 'htpasswd='>
              pairs: [
                (AssignPair
                  left: <Id.Lit_VarLike 'htpasswd='>
                  lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'htpasswd='> name:htpasswd)
                  op: assign_op.Equal
                  rhs: 
                    {
                      (CommandSub
                        left_token: <Id.Left_DollarParen '$('>
                        child: 
                          (command.Simple
                            blame_tok: <cat>
                            more_env: []
                            words: [{<cat>} {(DQ (${ Id.VSub_Name KUBE_TEMP) <'/htpasswd'>)}]
                            redirects: []
                            do_fork: T
                          )
                        right: <Id.Eof_RParen _>
                      )
                    }
                )
              ]
              redirects: []
            )
            (command.Simple
              blame_tok: <local>
              more_env: []
              words: [{<local>} {<octets>}]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <local>
              more_env: []
              words: [{<local>} {<service_ip>}]
              redirects: []
              do_fork: T
            )
            (command.ShAssignment
              left: <Id.Lit_VarLike 'octets='>
              pairs: [
                (AssignPair
                  left: <Id.Lit_VarLike 'octets='>
                  lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'octets='> name:octets)
                  op: assign_op.Equal
                  rhs: 
                    {
                      (ShArrayLiteral
                        left: <Id.Op_LParen _>
                        words: [
                          {
                            (CommandSub
                              left_token: <Id.Left_DollarParen '$('>
                              child: 
                                (command.Pipeline
                                  children: [
                                    (command.Simple
                                      blame_tok: <echo>
                                      more_env: []
                                      words: [{<echo>} {(DQ (${ Id.VSub_Name SERVICE_CLUSTER_IP_RANGE))}]
                                      redirects: []
                                      do_fork: T
                                    )
                                    (command.Simple
                                      blame_tok: <sed>
                                      more_env: []
                                      words: [{<sed>} {<-e>} {(SQ <'s|/.*||'>)} {<-e>} {(SQ <'s/\\./ /g'>)}]
                                      redirects: []
                                      do_fork: T
                                    )
                                  ]
                                  ops: [<Id.Op_Pipe _>]
                                )
                              right: <Id.Eof_RParen _>
                            )
                          }
                        ]
                        right: <Id.Right_ShArrayLiteral _>
                      )
                    }
                )
              ]
              redirects: []
            )
            (command.DParen
              left: <Id.Op_DLeftParen _>
              child: 
                (arith_expr.BinaryAssign
                  op_id: Id.Arith_PlusEqual
                  left: 
                    (arith_expr.Binary
                      op_id: Id.Arith_LBracket
                      left: ($ Id.Lit_ArithVarLike octets)
                      right: {<Id.Lit_Digits 3>}
                    )
                  right: {<Id.Lit_Digits 1>}
                )
              right: <Id.Op_DRightParen _>
              redirects: []
            )
            (command.ShAssignment
              left: <Id.Lit_VarLike 'service_ip='>
              pairs: [
                (AssignPair
                  left: <Id.Lit_VarLike 'service_ip='>
                  lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'service_ip='> name:service_ip)
                  op: assign_op.Equal
                  rhs: 
                    {
                      (CommandSub
                        left_token: <Id.Left_DollarParen '$('>
                        child: 
                          (command.Pipeline
                            children: [
                              (command.Simple
                                blame_tok: <echo>
                                more_env: []
                                words: [
                                  {<echo>}
                                  {
                                    (DQ 
                                      (BracedVarSub
                                        left: <Id.Left_DollarBrace '${'>
                                        token: <Id.VSub_Name octets>
                                        var_name: octets
                                        bracket_op: (bracket_op.WholeArray op_id:Id.Arith_Star)
                                        right: <Id.Right_DollarBrace '}'>
                                      )
                                    )
                                  }
                                ]
                                redirects: []
                                do_fork: T
                              )
                              (command.Simple
                                blame_tok: <sed>
                                more_env: []
                                words: [{<sed>} {(SQ <'s/ /./g'>)}]
                                redirects: []
                                do_fork: T
                              )
                            ]
                            ops: [<Id.Op_Pipe _>]
                          )
                        right: <Id.Eof_RParen _>
                      )
                    }
                )
              ]
              redirects: []
            )
            (command.ShAssignment
              left: <Id.Lit_VarLike 'MASTER_EXTRA_SANS='>
              pairs: [
                (AssignPair
                  left: <Id.Lit_VarLike 'MASTER_EXTRA_SANS='>
                  lhs: 
                    (sh_lhs_expr.Name
                      left: <Id.Lit_VarLike 'MASTER_EXTRA_SANS='>
                      name: MASTER_EXTRA_SANS
                    )
                  op: assign_op.Equal
                  rhs: 
                    {
                      (DQ <'IP:'> (${ Id.VSub_Name service_ip) <',DNS:'> (${ Id.VSub_Name MASTER_NAME) 
                        <','> (${ Id.VSub_Name MASTER_EXTRA_SANS)
                      )
                    }
                )
              ]
              redirects: []
            )
            (command.Subshell
              left: <Id.Op_LParen _>
              child: 
                (command.CommandList
                  children: [
                    (command.Simple
                      blame_tok: <echo>
                      more_env: []
                      words: [{<echo>} {(DQ <'#! /bin/bash'>)}]
                      redirects: []
                      do_fork: T
                    )
                    (command.Simple
                      blame_tok: <echo>
                      more_env: []
                      words: [{<echo>} {(DQ <'readonly MY_NAME='> (${ Id.VSub_Name MASTER_NAME))}]
                      redirects: []
                      do_fork: T
                    )
                    (command.Simple
                      blame_tok: <grep>
                      more_env: []
                      words: [
                        {<grep>}
                        {<-v>}
                        {(DQ <'^#'>)}
                        {
                          (DQ (${ Id.VSub_Name KUBE_ROOT) 
                            <'/cluster/photon-controller/templates/hostname.sh'>
                          )
                        }
                      ]
                      redirects: []
                      do_fork: T
                    )
                    (command.Simple
                      blame_tok: <echo>
                      more_env: []
                      words: [{<echo>} {(DQ <'cd /home/kube/cache/kubernetes-install'>)}]
                      redirects: []
                      do_fork: T
                    )
                    (command.Simple
                      blame_tok: <echo>
                      more_env: []
                      words: [
                        {<echo>}
                        {
                          (DQ <'readonly KUBE_MASTER_IP=\'{'> ($ Id.VSub_DollarName KUBE_MASTER_IP) 
                            <'}\''>
                          )
                        }
                      ]
                      redirects: []
                      do_fork: T
                    )
                    (command.Simple
                      blame_tok: <echo>
                      more_env: []
                      words: [
                        {<echo>}
                        {(DQ <'readonly MASTER_NAME=\''> (${ Id.VSub_Name MASTER_NAME) <'\''>)}
                      ]
                      redirects: []
                      do_fork: T
                    )
                    (command.Simple
                      blame_tok: <echo>
                      more_env: []
                      words: [
                        {<echo>}
                        {
                          (DQ <'readonly MASTER_IP_RANGE=\''> (${ Id.VSub_Name MASTER_IP_RANGE) <'\''>)
                        }
                      ]
                      redirects: []
                      do_fork: T
                    )
                    (command.Simple
                      blame_tok: <echo>
                      more_env: []
                      words: [
                        {<echo>}
                        {
                          (DQ <'readonly INSTANCE_PREFIX=\''> (${ Id.VSub_Name INSTANCE_PREFIX) <'\''>)
                        }
                      ]
                      redirects: []
                      do_fork: T
                    )
                    (command.Simple
                      blame_tok: <echo>
                      more_env: []
                      words: [
                        {<echo>}
                        {
                          (DQ <'readonly NODE_INSTANCE_PREFIX=\''> (${ Id.VSub_Name INSTANCE_PREFIX) 
                            <'-node\''>
                          )
                        }
                      ]
                      redirects: []
                      do_fork: T
                    )
                    (command.Simple
                      blame_tok: <echo>
                      more_env: []
                      words: [
                        {<echo>}
                        {(DQ <'readonly NODE_IP_RANGES=\''> (${ Id.VSub_Name NODE_IP_RANGES) <'\''>)}
                      ]
                      redirects: []
                      do_fork: T
                    )
                    (command.Simple
                      blame_tok: <echo>
                      more_env: []
                      words: [
                        {<echo>}
                        {
                          (DQ <'readonly SERVICE_CLUSTER_IP_RANGE=\''> 
                            (${ Id.VSub_Name SERVICE_CLUSTER_IP_RANGE) <'\''>
                          )
                        }
                      ]
                      redirects: []
                      do_fork: T
                    )
                    (command.Simple
                      blame_tok: <echo>
                      more_env: []
                      words: [
                        {<echo>}
                        {
                          (DQ <'readonly ENABLE_NODE_LOGGING=\''> 
                            (BracedVarSub
                              left: <Id.Left_DollarBrace '${'>
                              token: <Id.VSub_Name ENABLE_NODE_LOGGING>
                              var_name: ENABLE_NODE_LOGGING
                              suffix_op: 
                                (suffix_op.Unary
                                  op: <Id.VTest_ColonHyphen _>
                                  arg_word: {<false>}
                                )
                              right: <Id.Right_DollarBrace '}'>
                            ) <'\''>
                          )
                        }
                      ]
                      redirects: []
                      do_fork: T
                    )
                    (command.Simple
                      blame_tok: <echo>
                      more_env: []
                      words: [
                        {<echo>}
                        {
                          (DQ <'readonly LOGGING_DESTINATION=\''> 
                            (BracedVarSub
                              left: <Id.Left_DollarBrace '${'>
                              token: <Id.VSub_Name LOGGING_DESTINATION>
                              var_name: LOGGING_DESTINATION
                              suffix_op: (suffix_op.Unary op:<Id.VTest_ColonHyphen _> arg_word:(rhs_word__Empty))
                              right: <Id.Right_DollarBrace '}'>
                            ) <'\''>
                          )
                        }
                      ]
                      redirects: []
                      do_fork: T
                    )
                    (command.Simple
                      blame_tok: <echo>
                      more_env: []
                      words: [
                        {<echo>}
                        {
                          (DQ <'readonly ENABLE_CLUSTER_DNS=\''> 
                            (BracedVarSub
                              left: <Id.Left_DollarBrace '${'>
                              token: <Id.VSub_Name ENABLE_CLUSTER_DNS>
                              var_name: ENABLE_CLUSTER_DNS
                              suffix_op: 
                                (suffix_op.Unary
                                  op: <Id.VTest_ColonHyphen _>
                                  arg_word: {<false>}
                                )
                              right: <Id.Right_DollarBrace '}'>
                            ) <'\''>
                          )
                        }
                      ]
                      redirects: []
                      do_fork: T
                    )
                    (command.Simple
                      blame_tok: <echo>
                      more_env: []
                      words: [
                        {<echo>}
                        {
                          (DQ <'readonly ENABLE_CLUSTER_UI=\''> 
                            (BracedVarSub
                              left: <Id.Left_DollarBrace '${'>
                              token: <Id.VSub_Name ENABLE_CLUSTER_UI>
                              var_name: ENABLE_CLUSTER_UI
                              suffix_op: 
                                (suffix_op.Unary
                                  op: <Id.VTest_ColonHyphen _>
                                  arg_word: {<false>}
                                )
                              right: <Id.Right_DollarBrace '}'>
                            ) <'\''>
                          )
                        }
                      ]
                      redirects: []
                      do_fork: T
                    )
                    (command.Simple
                      blame_tok: <echo>
                      more_env: []
                      words: [
                        {<echo>}
                        {
                          (DQ <'readonly DNS_SERVER_IP=\''> 
                            (BracedVarSub
                              left: <Id.Left_DollarBrace '${'>
                              token: <Id.VSub_Name DNS_SERVER_IP>
                              var_name: DNS_SERVER_IP
                              suffix_op: (suffix_op.Unary op:<Id.VTest_ColonHyphen _> arg_word:(rhs_word__Empty))
                              right: <Id.Right_DollarBrace '}'>
                            ) <'\''>
                          )
                        }
                      ]
                      redirects: []
                      do_fork: T
                    )
                    (command.Simple
                      blame_tok: <echo>
                      more_env: []
                      words: [
                        {<echo>}
                        {
                          (DQ <'readonly DNS_DOMAIN=\''> 
                            (BracedVarSub
                              left: <Id.Left_DollarBrace '${'>
                              token: <Id.VSub_Name DNS_DOMAIN>
                              var_name: DNS_DOMAIN
                              suffix_op: (suffix_op.Unary op:<Id.VTest_ColonHyphen _> arg_word:(rhs_word__Empty))
                              right: <Id.Right_DollarBrace '}'>
                            ) <'\''>
                          )
                        }
                      ]
                      redirects: []
                      do_fork: T
                    )
                    (command.Simple
                      blame_tok: <echo>
                      more_env: []
                      words: [
                        {<echo>}
                        {
                          (DQ <'readonly KUBE_USER=\''> 
                            (BracedVarSub
                              left: <Id.Left_DollarBrace '${'>
                              token: <Id.VSub_Name KUBE_USER>
                              var_name: KUBE_USER
                              suffix_op: (suffix_op.Unary op:<Id.VTest_ColonHyphen _> arg_word:(rhs_word__Empty))
                              right: <Id.Right_DollarBrace '}'>
                            ) <'\''>
                          )
                        }
                      ]
                      redirects: []
                      do_fork: T
                    )
                    (command.Simple
                      blame_tok: <echo>
                      more_env: []
                      words: [
                        {<echo>}
                        {
                          (DQ <'readonly KUBE_PASSWORD=\''> 
                            (BracedVarSub
                              left: <Id.Left_DollarBrace '${'>
                              token: <Id.VSub_Name KUBE_PASSWORD>
                              var_name: KUBE_PASSWORD
                              suffix_op: (suffix_op.Unary op:<Id.VTest_ColonHyphen _> arg_word:(rhs_word__Empty))
                              right: <Id.Right_DollarBrace '}'>
                            ) <'\''>
                          )
                        }
                      ]
                      redirects: []
                      do_fork: T
                    )
                    (command.Simple
                      blame_tok: <echo>
                      more_env: []
                      words: [
                        {<echo>}
                        {
                          (DQ <'readonly SERVER_BINARY_TAR=\''> 
                            (BracedVarSub
                              left: <Id.Left_DollarBrace '${'>
                              token: <Id.VSub_Name SERVER_BINARY_TAR>
                              var_name: SERVER_BINARY_TAR
                              suffix_op: 
                                (suffix_op.Unary
                                  op: <Id.VOp1_DPound '##'>
                                  arg_word: {<Id.Lit_Other '*'> <Id.Lit_Slash '/'>}
                                )
                              right: <Id.Right_DollarBrace '}'>
                            ) <'\''>
                          )
                        }
                      ]
                      redirects: []
                      do_fork: T
                    )
                    (command.Simple
                      blame_tok: <echo>
                      more_env: []
                      words: [
                        {<echo>}
                        {
                          (DQ <'readonly SALT_TAR=\''> 
                            (BracedVarSub
                              left: <Id.Left_DollarBrace '${'>
                              token: <Id.VSub_Name SALT_TAR>
                              var_name: SALT_TAR
                              suffix_op: 
                                (suffix_op.Unary
                                  op: <Id.VOp1_DPound '##'>
                                  arg_word: {<Id.Lit_Other '*'> <Id.Lit_Slash '/'>}
                                )
                              right: <Id.Right_DollarBrace '}'>
                            ) <'\''>
                          )
                        }
                      ]
                      redirects: []
                      do_fork: T
                    )
                    (command.Simple
                      blame_tok: <echo>
                      more_env: []
                      words: [
                        {<echo>}
                        {(DQ <'readonly MASTER_HTPASSWD=\''> (${ Id.VSub_Name htpasswd) <'\''>)}
                      ]
                      redirects: []
                      do_fork: T
                    )
                    (command.Simple
                      blame_tok: <echo>
                      more_env: []
                      words: [
                        {<echo>}
                        {
                          (DQ <'readonly E2E_STORAGE_TEST_ENVIRONMENT=\''> 
                            (BracedVarSub
                              left: <Id.Left_DollarBrace '${'>
                              token: <Id.VSub_Name E2E_STORAGE_TEST_ENVIRONMENT>
                              var_name: E2E_STORAGE_TEST_ENVIRONMENT
                              suffix_op: (suffix_op.Unary op:<Id.VTest_ColonHyphen _> arg_word:(rhs_word__Empty))
                              right: <Id.Right_DollarBrace '}'>
                            ) <'\''>
                          )
                        }
                      ]
                      redirects: []
                      do_fork: T
                    )
                    (command.Simple
                      blame_tok: <echo>
                      more_env: []
                      words: [
                        {<echo>}
                        {
                          (DQ <'readonly MASTER_EXTRA_SANS=\''> 
                            (BracedVarSub
                              left: <Id.Left_DollarBrace '${'>
                              token: <Id.VSub_Name MASTER_EXTRA_SANS>
                              var_name: MASTER_EXTRA_SANS
                              suffix_op: (suffix_op.Unary op:<Id.VTest_ColonHyphen _> arg_word:(rhs_word__Empty))
                              right: <Id.Right_DollarBrace '}'>
                            ) <'\''>
                          )
                        }
                      ]
                      redirects: []
                      do_fork: T
                    )
                    (command.Simple
                      blame_tok: <grep>
                      more_env: []
                      words: [
                        {<grep>}
                        {<-v>}
                        {(DQ <'^#'>)}
                        {
                          (DQ (${ Id.VSub_Name KUBE_ROOT) 
                            <'/cluster/photon-controller/templates/create-dynamic-salt-files.sh'>
                          )
                        }
                      ]
                      redirects: []
                      do_fork: T
                    )
                    (command.Simple
                      blame_tok: <grep>
                      more_env: []
                      words: [
                        {<grep>}
                        {<-v>}
                        {(DQ <'^#'>)}
                        {
                          (DQ (${ Id.VSub_Name KUBE_ROOT) 
                            <'/cluster/photon-controller/templates/install-release.sh'>
                          )
                        }
                      ]
                      redirects: []
                      do_fork: T
                    )
                    (command.Simple
                      blame_tok: <grep>
                      more_env: []
                      words: [
                        {<grep>}
                        {<-v>}
                        {(DQ <'^#'>)}
                        {
                          (DQ (${ Id.VSub_Name KUBE_ROOT) 
                            <'/cluster/photon-controller/templates/salt-master.sh'>
                          )
                        }
                      ]
                      redirects: []
                      do_fork: T
                    )
                  ]
                )
              right: <Id.Right_Subshell _>
              redirects: [
                (Redir
                  op: <Id.Redir_Great '>'>
                  loc: (redir_loc.Fd fd:1)
                  arg: {(DQ (${ Id.VSub_Name KUBE_TEMP) <'/master-start.sh'>)}
                )
              ]
            )
          ]
          redirects: []
          right: <Id.Lit_RBrace '}'>
        )
    )
    (command.ShFunction
      keyword: <Id.KW_Function function>
      name_tok: <gen-node-start>
      name: gen-node-start
      body: 
        (BraceGroup
          left: <Id.Lit_LBrace '{'>
          children: [
            (command.Simple
              blame_tok: <local>
              more_env: []
              words: [{<local>} {<i>}]
              redirects: []
              do_fork: T
            )
            (command.ForExpr
              keyword: <Id.KW_For for>
              init: 
                (arith_expr.BinaryAssign
                  op_id: Id.Arith_Equal
                  left: ($ Id.Lit_ArithVarLike i)
                  right: {<Id.Lit_Digits 0>}
                )
              cond: 
                (arith_expr.Binary
                  op_id: Id.Arith_Less
                  left: ($ Id.Lit_ArithVarLike i)
                  right: 
                    {
                      (BracedVarSub
                        left: <Id.Left_DollarBrace '${'>
                        token: <Id.VSub_Name NODE_NAMES>
                        var_name: NODE_NAMES
                        prefix_op: <Id.VSub_Pound '#'>
                        bracket_op: (bracket_op.WholeArray op_id:Id.Lit_At)
                        right: <Id.Right_DollarBrace '}'>
                      )
                    }
                )
              update: (arith_expr.UnaryAssign op_id:Id.Node_PostDPlus child:($ Id.Lit_ArithVarLike i))
              body: 
                (command.DoGroup
                  left: <Id.KW_Do do>
                  children: [
                    (command.Subshell
                      left: <Id.Op_LParen _>
                      child: 
                        (command.CommandList
                          children: [
                            (command.Simple
                              blame_tok: <echo>
                              more_env: []
                              words: [{<echo>} {(DQ <'#! /bin/bash'>)}]
                              redirects: []
                              do_fork: T
                            )
                            (command.Simple
                              blame_tok: <echo>
                              more_env: []
                              words: [
                                {<echo>}
                                {
                                  (DQ <'readonly MY_NAME='> 
                                    (BracedVarSub
                                      left: <Id.Left_DollarBrace '${'>
                                      token: <Id.VSub_Name NODE_NAMES>
                                      var_name: NODE_NAMES
                                      bracket_op: (bracket_op.ArrayIndex expr:{(${ Id.VSub_Name i)})
                                      right: <Id.Right_DollarBrace '}'>
                                    )
                                  )
                                }
                              ]
                              redirects: []
                              do_fork: T
                            )
                            (command.Simple
                              blame_tok: <grep>
                              more_env: []
                              words: [
                                {<grep>}
                                {<-v>}
                                {(DQ <'^#'>)}
                                {
                                  (DQ (${ Id.VSub_Name KUBE_ROOT) 
                                    <'/cluster/photon-controller/templates/hostname.sh'>
                                  )
                                }
                              ]
                              redirects: []
                              do_fork: T
                            )
                            (command.Simple
                              blame_tok: <echo>
                              more_env: []
                              words: [{<echo>} {(DQ <'KUBE_MASTER='> (${ Id.VSub_Name KUBE_MASTER))}]
                              redirects: []
                              do_fork: T
                            )
                            (command.Simple
                              blame_tok: <echo>
                              more_env: []
                              words: [
                                {<echo>}
                                {(DQ <'KUBE_MASTER_IP='> (${ Id.VSub_Name KUBE_MASTER_IP))}
                              ]
                              redirects: []
                              do_fork: T
                            )
                            (command.Simple
                              blame_tok: <echo>
                              more_env: []
                              words: [
                                {<echo>}
                                {(DQ <'NODE_IP_RANGE='> ($ Id.VSub_DollarName NODE_IP_RANGES))}
                              ]
                              redirects: []
                              do_fork: T
                            )
                            (command.Simple
                              blame_tok: <grep>
                              more_env: []
                              words: [
                                {<grep>}
                                {<-v>}
                                {(DQ <'^#'>)}
                                {
                                  (DQ (${ Id.VSub_Name KUBE_ROOT) 
                                    <'/cluster/photon-controller/templates/salt-minion.sh'>
                                  )
                                }
                              ]
                              redirects: []
                              do_fork: T
                            )
                          ]
                        )
                      right: <Id.Right_Subshell _>
                      redirects: [
                        (Redir
                          op: <Id.Redir_Great '>'>
                          loc: (redir_loc.Fd fd:1)
                          arg: 
                            {
                              (DQ (${ Id.VSub_Name KUBE_TEMP) <'/node-start-'> (${ Id.VSub_Name i) <.sh>)
                            }
                        )
                      ]
                    )
                  ]
                  right: <Id.KW_Done done>
                )
              redirects: []
            )
          ]
          redirects: []
          right: <Id.Lit_RBrace '}'>
        )
    )
    (command.ShFunction
      keyword: <Id.KW_Function function>
      name_tok: <gen-master-salt>
      name: gen-master-salt
      body: 
        (BraceGroup
          left: <Id.Lit_LBrace '{'>
          children: [
            (command.Simple
              blame_tok: <gen-salt>
              more_env: []
              words: [{<gen-salt>} {(DQ <kubernetes-master>)}]
              redirects: []
              do_fork: T
            )
          ]
          redirects: []
          right: <Id.Lit_RBrace '}'>
        )
    )
    (command.ShFunction
      keyword: <Id.KW_Function function>
      name_tok: <gen-node-salt>
      name: gen-node-salt
      body: 
        (BraceGroup
          left: <Id.Lit_LBrace '{'>
          children: [
            (command.Simple
              blame_tok: <local>
              more_env: []
              words: [{<local>} {<i>}]
              redirects: []
              do_fork: T
            )
            (command.ForExpr
              keyword: <Id.KW_For for>
              init: 
                (arith_expr.BinaryAssign
                  op_id: Id.Arith_Equal
                  left: ($ Id.Lit_ArithVarLike i)
                  right: {<Id.Lit_Digits 0>}
                )
              cond: 
                (arith_expr.Binary
                  op_id: Id.Arith_Less
                  left: ($ Id.Lit_ArithVarLike i)
                  right: 
                    {
                      (BracedVarSub
                        left: <Id.Left_DollarBrace '${'>
                        token: <Id.VSub_Name NODE_NAMES>
                        var_name: NODE_NAMES
                        prefix_op: <Id.VSub_Pound '#'>
                        bracket_op: (bracket_op.WholeArray op_id:Id.Lit_At)
                        right: <Id.Right_DollarBrace '}'>
                      )
                    }
                )
              update: (arith_expr.UnaryAssign op_id:Id.Node_PostDPlus child:($ Id.Lit_ArithVarLike i))
              body: 
                (command.DoGroup
                  left: <Id.KW_Do do>
                  children: [
                    (command.Simple
                      blame_tok: <gen-salt>
                      more_env: []
                      words: [
                        {<gen-salt>}
                        {
                          (DQ 
                            (BracedVarSub
                              left: <Id.Left_DollarBrace '${'>
                              token: <Id.VSub_Name NODE_NAMES>
                              var_name: NODE_NAMES
                              bracket_op: (bracket_op.ArrayIndex expr:{(${ Id.VSub_Name i)})
                              right: <Id.Right_DollarBrace '}'>
                            )
                          )
                        }
                      ]
                      redirects: []
                      do_fork: T
                    )
                  ]
                  right: <Id.KW_Done done>
                )
              redirects: []
            )
          ]
          redirects: []
          right: <Id.Lit_RBrace '}'>
        )
    )
    (command.ShFunction
      keyword: <Id.KW_Function function>
      name_tok: <gen-salt>
      name: gen-salt
      body: 
        (BraceGroup
          left: <Id.Lit_LBrace '{'>
          children: [
            (command.ShAssignment
              left: <Id.Lit_VarLike 'node_name='>
              pairs: [
                (AssignPair
                  left: <Id.Lit_VarLike 'node_name='>
                  lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'node_name='> name:node_name)
                  op: assign_op.Equal
                  rhs: {(${ Id.VSub_Number 1)}
                )
              ]
              redirects: []
            )
            (command.Subshell
              left: <Id.Op_LParen _>
              child: 
                (command.CommandList
                  children: [
                    (command.Simple
                      blame_tok: <echo>
                      more_env: []
                      words: [{<echo>} {(SQ <'#!/bin/bash'>)}]
                      redirects: []
                      do_fork: T
                    )
                    (command.Simple
                      blame_tok: <echo>
                      more_env: []
                      words: [{<echo>} {(SQ )}]
                      redirects: []
                      do_fork: T
                    )
                    (command.Simple
                      blame_tok: <echo>
                      more_env: []
                      words: [{<echo>} {(DQ <'node='> (${ Id.VSub_Name node_name))}]
                      redirects: []
                      do_fork: T
                    )
                    (command.Simple
                      blame_tok: <echo>
                      more_env: []
                      words: [{<echo>} {(SQ <'out=/tmp/${node}-salt.out'>)}]
                      redirects: []
                      do_fork: T
                    )
                    (command.Simple
                      blame_tok: <echo>
                      more_env: []
                      words: [{<echo>} {(SQ <'log=/tmp/${node}-salt.log'>)}]
                      redirects: []
                      do_fork: T
                    )
                    (command.Simple
                      blame_tok: <echo>
                      more_env: []
                      words: [{<echo>} {(SQ )}]
                      redirects: []
                      do_fork: T
                    )
                    (command.Simple
                      blame_tok: <echo>
                      more_env: []
                      words: [{<echo>} {(SQ <'echo $(date) >> $log'>)}]
                      redirects: []
                      do_fork: T
                    )
                    (command.Simple
                      blame_tok: <echo>
                      more_env: []
                      words: [{<echo>} {(SQ <'salt ${node} state.highstate -t 30 --no-color > ${out}'>)}]
                      redirects: []
                      do_fork: T
                    )
                    (command.Simple
                      blame_tok: <echo>
                      more_env: []
                      words: [{<echo>} {(SQ <'grep -E "Failed:[[:space:]]+0" ${out}'>)}]
                      redirects: []
                      do_fork: T
                    )
                    (command.Simple
                      blame_tok: <echo>
                      more_env: []
                      words: [{<echo>} {(SQ <'success=$?'>)}]
                      redirects: []
                      do_fork: T
                    )
                    (command.Simple
                      blame_tok: <echo>
                      more_env: []
                      words: [{<echo>} {(SQ <'cat ${out} >> ${log}'>)}]
                      redirects: []
                      do_fork: T
                    )
                    (command.Simple
                      blame_tok: <echo>
                      more_env: []
                      words: [{<echo>} {(SQ )}]
                      redirects: []
                      do_fork: T
                    )
                    (command.Simple
                      blame_tok: <echo>
                      more_env: []
                      words: [{<echo>} {(SQ <'if [[ ${success} -ne 0 ]]; then'>)}]
                      redirects: []
                      do_fork: T
                    )
                    (command.Simple
                      blame_tok: <echo>
                      more_env: []
                      words: [{<echo>} {(SQ <'  # Did we try to install docker-engine?'>)}]
                      redirects: []
                      do_fork: T
                    )
                    (command.Simple
                      blame_tok: <echo>
                      more_env: []
                      words: [{<echo>} {(SQ <'  attempted=$(grep docker-engine ${out} | wc -l)'>)}]
                      redirects: []
                      do_fork: T
                    )
                    (command.Simple
                      blame_tok: <echo>
                      more_env: []
                      words: [{<echo>} {(SQ <'  # Is docker-engine installed?'>)}]
                      redirects: []
                      do_fork: T
                    )
                    (command.Simple
                      blame_tok: <echo>
                      more_env: []
                      words: [
                        {<echo>}
                        {
                          (SQ 
                            <
'  installed=$(salt --output=txt ${node} pkg.version docker-engine | wc -l)'
                            >
                          )
                        }
                      ]
                      redirects: []
                      do_fork: T
                    )
                    (command.Simple
                      blame_tok: <echo>
                      more_env: []
                      words: [
                        {<echo>}
                        {(SQ <'  if [[ ${attempted} -ne 0 && ${installed} -eq 0 ]]; then'>)}
                      ]
                      redirects: []
                      do_fork: T
                    )
                    (command.Simple
                      blame_tok: <echo>
                      more_env: []
                      words: [{<echo>} {(SQ <'    echo "Unwedging docker-engine install" >> ${log}'>)}]
                      redirects: []
                      do_fork: T
                    )
                    (command.Simple
                      blame_tok: <echo>
                      more_env: []
                      words: [
                        {<echo>}
                        {
                          (SQ 
                            <
'    salt ${node} cmd.run "rm -f /var/lib/docker/network/files/local-kv.db"'
                            >
                          )
                        }
                      ]
                      redirects: []
                      do_fork: T
                    )
                    (command.Simple
                      blame_tok: <echo>
                      more_env: []
                      words: [{<echo>} {(SQ <'  fi'>)}]
                      redirects: []
                      do_fork: T
                    )
                    (command.Simple
                      blame_tok: <echo>
                      more_env: []
                      words: [{<echo>} {(SQ <fi>)}]
                      redirects: []
                      do_fork: T
                    )
                    (command.Simple
                      blame_tok: <echo>
                      more_env: []
                      words: [{<echo>} {(SQ <'exit ${success}'>)}]
                      redirects: []
                      do_fork: T
                    )
                  ]
                )
              right: <Id.Right_Subshell _>
              redirects: [
                (Redir
                  op: <Id.Redir_Great '>'>
                  loc: (redir_loc.Fd fd:1)
                  arg: {(DQ (${ Id.VSub_Name KUBE_TEMP) <'/'> (${ Id.VSub_Name node_name) <-salt.sh>)}
                )
              ]
            )
          ]
          redirects: []
          right: <Id.Lit_RBrace '}'>
        )
    )
    (command.ShFunction
      keyword: <Id.KW_Function function>
      name_tok: <gen-add-route>
      name: gen-add-route
      body: 
        (BraceGroup
          left: <Id.Lit_LBrace '{'>
          children: [
            (command.ShAssignment
              left: <Id.Lit_VarLike 'route='>
              pairs: [
                (AssignPair
                  left: <Id.Lit_VarLike 'route='>
                  lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'route='> name:route)
                  op: assign_op.Equal
                  rhs: {(${ Id.VSub_Number 1)}
                )
              ]
              redirects: []
            )
            (command.ShAssignment
              left: <Id.Lit_VarLike 'gateway='>
              pairs: [
                (AssignPair
                  left: <Id.Lit_VarLike 'gateway='>
                  lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'gateway='> name:gateway)
                  op: assign_op.Equal
                  rhs: {(${ Id.VSub_Number 2)}
                )
              ]
              redirects: []
            )
            (command.Subshell
              left: <Id.Op_LParen _>
              child: 
                (command.CommandList
                  children: [
                    (command.Simple
                      blame_tok: <echo>
                      more_env: []
                      words: [{<echo>} {(SQ <'#!/bin/bash'>)}]
                      redirects: []
                      do_fork: T
                    )
                    (command.Simple
                      blame_tok: <echo>
                      more_env: []
                      words: [{<echo>} {(SQ )}]
                      redirects: []
                      do_fork: T
                    )
                    (command.Simple
                      blame_tok: <echo>
                      more_env: []
                      words: [{<echo>} {(SQ <'# Immediately add route'>)}]
                      redirects: []
                      do_fork: T
                    )
                    (command.Simple
                      blame_tok: <echo>
                      more_env: []
                      words: [
                        {<echo>}
                        {
                          (DQ <'sudo route add -net '> (${ Id.VSub_Name route) <' gw '> 
                            (${ Id.VSub_Name gateway)
                          )
                        }
                      ]
                      redirects: []
                      do_fork: T
                    )
                    (command.Simple
                      blame_tok: <echo>
                      more_env: []
                      words: [{<echo>} {(SQ )}]
                      redirects: []
                      do_fork: T
                    )
                    (command.Simple
                      blame_tok: <echo>
                      more_env: []
                      words: [{<echo>} {(SQ <'# Persist route so it lasts over restarts'>)}]
                      redirects: []
                      do_fork: T
                    )
                    (command.Simple
                      blame_tok: <echo>
                      more_env: []
                      words: [
                        {<echo>}
                        {(SQ <'sed -in "s|^iface eth0.*|&\\n    post-up route add -net'>)}
                        {(DQ (${ Id.VSub_Name route) <' gw '> (${ Id.VSub_Name gateway) <'|'>) 
                          (SQ <'" /etc/network/interfaces'>)
                        }
                      ]
                      redirects: []
                      do_fork: T
                    )
                  ]
                )
              right: <Id.Right_Subshell _>
              redirects: [
                (Redir
                  op: <Id.Redir_Great '>'>
                  loc: (redir_loc.Fd fd:1)
                  arg: {(DQ (${ Id.VSub_Name KUBE_TEMP) <'/add-route.sh'>)}
                )
              ]
            )
          ]
          redirects: []
          right: <Id.Lit_RBrace '}'>
        )
    )
    (command.ShFunction
      keyword: <Id.KW_Function function>
      name_tok: <create-master-vm>
      name: create-master-vm
      body: 
        (BraceGroup
          left: <Id.Lit_LBrace '{'>
          children: [
            (command.Simple
              blame_tok: <kube>
              more_env: []
              words: [
                {<kube> <Id.Lit_Colon ':'> <Id.Lit_Colon ':'> <log> <Id.Lit_Colon ':'> <Id.Lit_Colon ':'> 
                  <status>
                }
                {(DQ <'Starting master VM...'>)}
              ]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <pc-create-vm>
              more_env: []
              words: [
                {<pc-create-vm>}
                {(DQ (${ Id.VSub_Name MASTER_NAME))}
                {(DQ (${ Id.VSub_Name PHOTON_MASTER_FLAVOR))}
              ]
              redirects: []
              do_fork: T
            )
            (command.ShAssignment
              left: <Id.Lit_VarLike 'KUBE_MASTER='>
              pairs: [
                (AssignPair
                  left: <Id.Lit_VarLike 'KUBE_MASTER='>
                  lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'KUBE_MASTER='> name:KUBE_MASTER)
                  op: assign_op.Equal
                  rhs: {(${ Id.VSub_Name MASTER_NAME)}
                )
              ]
              redirects: []
            )
            (command.ShAssignment
              left: <Id.Lit_VarLike 'KUBE_MASTER_ID='>
              pairs: [
                (AssignPair
                  left: <Id.Lit_VarLike 'KUBE_MASTER_ID='>
                  lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'KUBE_MASTER_ID='> name:KUBE_MASTER_ID)
                  op: assign_op.Equal
                  rhs: {(${ Id.VSub_Name _VM_ID)}
                )
              ]
              redirects: []
            )
            (command.ShAssignment
              left: <Id.Lit_VarLike 'KUBE_MASTER_IP='>
              pairs: [
                (AssignPair
                  left: <Id.Lit_VarLike 'KUBE_MASTER_IP='>
                  lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'KUBE_MASTER_IP='> name:KUBE_MASTER_IP)
                  op: assign_op.Equal
                  rhs: {(${ Id.VSub_Name _VM_IP)}
                )
              ]
              redirects: []
            )
          ]
          redirects: []
          right: <Id.Lit_RBrace '}'>
        )
    )
    (command.ShFunction
      keyword: <Id.KW_Function function>
      name_tok: <install-salt-on-master>
      name: install-salt-on-master
      body: 
        (BraceGroup
          left: <Id.Lit_LBrace '{'>
          children: [
            (command.Simple
              blame_tok: <kube>
              more_env: []
              words: [
                {<kube> <Id.Lit_Colon ':'> <Id.Lit_Colon ':'> <log> <Id.Lit_Colon ':'> <Id.Lit_Colon ':'> 
                  <status>
                }
                {(DQ <'Installing salt on master...'>)}
              ]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <upload-server-tars>
              more_env: []
              words: [
                {<upload-server-tars>}
                {(DQ (${ Id.VSub_Name MASTER_NAME))}
                {(DQ (${ Id.VSub_Name KUBE_MASTER_IP))}
              ]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <run-script-remotely>
              more_env: []
              words: [
                {<run-script-remotely>}
                {(DQ (${ Id.VSub_Name KUBE_MASTER_IP))}
                {(DQ (${ Id.VSub_Name KUBE_TEMP) <'/master-start.sh'>)}
              ]
              redirects: []
              do_fork: T
            )
          ]
          redirects: []
          right: <Id.Lit_RBrace '}'>
        )
    )
    (command.ShFunction
      keyword: <Id.KW_Function function>
      name_tok: <install-salt-on-nodes>
      name: install-salt-on-nodes
      body: 
        (BraceGroup
          left: <Id.Lit_LBrace '{'>
          children: [
            (command.Simple
              blame_tok: <kube>
              more_env: []
              words: [
                {<kube> <Id.Lit_Colon ':'> <Id.Lit_Colon ':'> <log> <Id.Lit_Colon ':'> <Id.Lit_Colon ':'> 
                  <status>
                }
                {(DQ <'Creating nodes and installing salt on them...'>)}
              ]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <local>
              more_env: []
              words: [{<local>} {<node>}]
              redirects: []
              do_fork: T
            )
            (command.ForExpr
              keyword: <Id.KW_For for>
              init: 
                (arith_expr.BinaryAssign
                  op_id: Id.Arith_Equal
                  left: ($ Id.Lit_ArithVarLike node)
                  right: {<Id.Lit_Digits 0>}
                )
              cond: 
                (arith_expr.Binary
                  op_id: Id.Arith_Less
                  left: ($ Id.Lit_ArithVarLike node)
                  right: 
                    {
                      (BracedVarSub
                        left: <Id.Left_DollarBrace '${'>
                        token: <Id.VSub_Name NODE_NAMES>
                        var_name: NODE_NAMES
                        prefix_op: <Id.VSub_Pound '#'>
                        bracket_op: (bracket_op.WholeArray op_id:Id.Lit_At)
                        right: <Id.Right_DollarBrace '}'>
                      )
                    }
                )
              update: 
                (arith_expr.UnaryAssign
                  op_id: Id.Node_PostDPlus
                  child: ($ Id.Lit_ArithVarLike node)
                )
              body: 
                (command.DoGroup
                  left: <Id.KW_Do do>
                  children: [
                    (command.Sentence
                      child: 
                        (command.Subshell
                          left: <Id.Op_LParen _>
                          child: 
                            (command.CommandList
                              children: [
                                (command.Simple
                                  blame_tok: <pc-create-vm>
                                  more_env: []
                                  words: [
                                    {<pc-create-vm>}
                                    {
                                      (DQ 
                                        (BracedVarSub
                                          left: <Id.Left_DollarBrace '${'>
                                          token: <Id.VSub_Name NODE_NAMES>
                                          var_name: NODE_NAMES
                                          bracket_op: 
                                            (bracket_op.ArrayIndex
                                              expr: {(${ Id.VSub_Name node)}
                                            )
                                          right: <Id.Right_DollarBrace '}'>
                                        )
                                      )
                                    }
                                    {(DQ (${ Id.VSub_Name PHOTON_NODE_FLAVOR))}
                                  ]
                                  redirects: []
                                  do_fork: T
                                )
                                (command.Simple
                                  blame_tok: <run-script-remotely>
                                  more_env: []
                                  words: [
                                    {<run-script-remotely>}
                                    {(DQ (${ Id.VSub_Name _VM_IP))}
                                    {
                                      (DQ (${ Id.VSub_Name KUBE_TEMP) <'/node-start-'> 
                                        (${ Id.VSub_Name node) <.sh>
                                      )
                                    }
                                  ]
                                  redirects: []
                                  do_fork: T
                                )
                              ]
                            )
                          right: <Id.Right_Subshell _>
                          redirects: []
                        )
                      terminator: <Id.Op_Amp _>
                    )
                  ]
                  right: <Id.KW_Done done>
                )
              redirects: []
            )
            (command.Simple
              blame_tok: <local>
              more_env: []
              words: [{<local>} {<Id.Lit_VarLike 'fail='> <0>}]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <local>
              more_env: []
              words: [{<local>} {<job>}]
              redirects: []
              do_fork: T
            )
            (command.ForEach
              keyword: <Id.KW_For for>
              iter_names: [job]
              iterable: 
                (for_iter.Words
                  words: [
                    {
                      (CommandSub
                        left_token: <Id.Left_DollarParen '$('>
                        child: 
                          (command.Simple
                            blame_tok: <jobs>
                            more_env: []
                            words: [{<jobs>} {<-p>}]
                            redirects: []
                            do_fork: T
                          )
                        right: <Id.Eof_RParen _>
                      )
                    }
                  ]
                )
              semi_tok: <Id.Op_Semi _>
              body: 
                (command.DoGroup
                  left: <Id.KW_Do do>
                  children: [
                    (command.AndOr
                      children: [
                        (command.Simple
                          blame_tok: <wait>
                          more_env: []
                          words: [{<wait>} {(DQ (${ Id.VSub_Name job))}]
                          redirects: []
                          do_fork: T
                        )
                        (command.ShAssignment
                          left: <Id.Lit_VarLike 'fail='>
                          pairs: [
                            (AssignPair
                              left: <Id.Lit_VarLike 'fail='>
                              lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'fail='> name:fail)
                              op: assign_op.Equal
                              rhs: 
                                {
                                  (word_part.ArithSub
                                    left: <Id.Left_DollarDParen '$(('>
                                    anode: 
                                      (arith_expr.Binary
                                        op_id: Id.Arith_Plus
                                        left: ($ Id.Lit_ArithVarLike fail)
                                        right: {<Id.Lit_Digits 1>}
                                      )
                                    right: <Id.Right_DollarDParen _>
                                  )
                                }
                            )
                          ]
                          redirects: []
                        )
                      ]
                      ops: [<Id.Op_DPipe _>]
                    )
                  ]
                  right: <Id.KW_Done done>
                )
              redirects: []
            )
            (command.If
              if_kw: <Id.KW_If if>
              arms: [
                (IfArm
                  keyword: <Id.KW_If if>
                  cond: 
                    (condition.Shell
                      commands: [
                        (command.Sentence
                          child: 
                            (command.DParen
                              left: <Id.Op_DLeftParen _>
                              child: 
                                (arith_expr.Binary
                                  op_id: Id.Arith_NEqual
                                  left: ($ Id.Lit_ArithVarLike fail)
                                  right: {<Id.Lit_Digits 0>}
                                )
                              right: <Id.Op_DRightParen _>
                              redirects: []
                            )
                          terminator: <Id.Op_Semi _>
                        )
                      ]
                    )
                  then_kw: <Id.KW_Then then>
                  action: [
                    (command.Simple
                      blame_tok: <kube>
                      more_env: []
                      words: [
                        {<kube> <Id.Lit_Colon ':'> <Id.Lit_Colon ':'> <log> <Id.Lit_Colon ':'> 
                          <Id.Lit_Colon ':'> <error>
                        }
                        {
                          (DQ <'Failed to start '> (${ Id.VSub_Name fail) <'/'> 
                            (${ Id.VSub_Name NUM_NODES) <' nodes'>
                          )
                        }
                      ]
                      redirects: []
                      do_fork: T
                    )
                    (command.ControlFlow
                      keyword: <Id.ControlFlow_Exit exit>
                      arg_word: {<1>}
                    )
                  ]
                  spids: [4207 4221]
                )
              ]
              else_action: []
              fi_kw: <Id.KW_Fi fi>
              redirects: []
            )
          ]
          redirects: []
          right: <Id.Lit_RBrace '}'>
        )
    )
    (command.ShFunction
      keyword: <Id.KW_Function function>
      name_tok: <install-kubernetes-on-master>
      name: install-kubernetes-on-master
      body: 
        (BraceGroup
          left: <Id.Lit_LBrace '{'>
          children: [
            (command.Simple
              blame_tok: <try-until-success-ssh>
              more_env: []
              words: [
                {<try-until-success-ssh>}
                {(DQ (${ Id.VSub_Name KUBE_MASTER_IP))}
                {(DQ <'Waiting for salt-master to start on '> (${ Id.VSub_Name KUBE_MASTER))}
                {(DQ <'pgrep salt-master'>)}
              ]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <gen-master-salt>
              more_env: []
              words: [{<gen-master-salt>}]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <copy-file-to-vm>
              more_env: []
              words: [
                {<copy-file-to-vm>}
                {(DQ (${ Id.VSub_Name _VM_IP))}
                {(DQ (${ Id.VSub_Name KUBE_TEMP) <'/kubernetes-master-salt.sh'>)}
                {(DQ <'/tmp/kubernetes-master-salt.sh'>)}
              ]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <try-until-success-ssh>
              more_env: []
              words: [
                {<try-until-success-ssh>}
                {(DQ (${ Id.VSub_Name KUBE_MASTER_IP))}
                {(DQ <'Installing Kubernetes on '> (${ Id.VSub_Name KUBE_MASTER) <' via salt'>)}
                {(DQ <'sudo /bin/bash /tmp/kubernetes-master-salt.sh'>)}
              ]
              redirects: []
              do_fork: T
            )
          ]
          redirects: []
          right: <Id.Lit_RBrace '}'>
        )
    )
    (command.ShFunction
      keyword: <Id.KW_Function function>
      name_tok: <install-kubernetes-on-nodes>
      name: install-kubernetes-on-nodes
      body: 
        (BraceGroup
          left: <Id.Lit_LBrace '{'>
          children: [
            (command.Simple
              blame_tok: <gen-node-salt>
              more_env: []
              words: [{<gen-node-salt>}]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <local>
              more_env: []
              words: [{<local>} {<node>}]
              redirects: []
              do_fork: T
            )
            (command.ForExpr
              keyword: <Id.KW_For for>
              init: 
                (arith_expr.BinaryAssign
                  op_id: Id.Arith_Equal
                  left: ($ Id.Lit_ArithVarLike node)
                  right: {<Id.Lit_Digits 0>}
                )
              cond: 
                (arith_expr.Binary
                  op_id: Id.Arith_Less
                  left: ($ Id.Lit_ArithVarLike node)
                  right: 
                    {
                      (BracedVarSub
                        left: <Id.Left_DollarBrace '${'>
                        token: <Id.VSub_Name NODE_NAMES>
                        var_name: NODE_NAMES
                        prefix_op: <Id.VSub_Pound '#'>
                        bracket_op: (bracket_op.WholeArray op_id:Id.Lit_At)
                        right: <Id.Right_DollarBrace '}'>
                      )
                    }
                )
              update: 
                (arith_expr.UnaryAssign
                  op_id: Id.Node_PostDPlus
                  child: ($ Id.Lit_ArithVarLike node)
                )
              body: 
                (command.DoGroup
                  left: <Id.KW_Do do>
                  children: [
                    (command.Sentence
                      child: 
                        (command.Subshell
                          left: <Id.Op_LParen _>
                          child: 
                            (command.CommandList
                              children: [
                                (command.Simple
                                  blame_tok: <copy-file-to-vm>
                                  more_env: []
                                  words: [
                                    {<copy-file-to-vm>}
                                    {(DQ (${ Id.VSub_Name _VM_IP))}
                                    {
                                      (DQ (${ Id.VSub_Name KUBE_TEMP) <'/'> 
                                        (BracedVarSub
                                          left: <Id.Left_DollarBrace '${'>
                                          token: <Id.VSub_Name NODE_NAMES>
                                          var_name: NODE_NAMES
                                          bracket_op: 
                                            (bracket_op.ArrayIndex
                                              expr: {(${ Id.VSub_Name node)}
                                            )
                                          right: <Id.Right_DollarBrace '}'>
                                        ) <-salt.sh>
                                      )
                                    }
                                    {
                                      (DQ <'/tmp/'> 
                                        (BracedVarSub
                                          left: <Id.Left_DollarBrace '${'>
                                          token: <Id.VSub_Name NODE_NAMES>
                                          var_name: NODE_NAMES
                                          bracket_op: 
                                            (bracket_op.ArrayIndex
                                              expr: {(${ Id.VSub_Name node)}
                                            )
                                          right: <Id.Right_DollarBrace '}'>
                                        ) <-salt.sh>
                                      )
                                    }
                                  ]
                                  redirects: []
                                  do_fork: T
                                )
                                (command.Simple
                                  blame_tok: <try-until-success-ssh>
                                  more_env: []
                                  words: [
                                    {<try-until-success-ssh>}
                                    {
                                      (DQ 
                                        (BracedVarSub
                                          left: <Id.Left_DollarBrace '${'>
                                          token: <Id.VSub_Name KUBE_NODE_IP_ADDRESSES>
                                          var_name: KUBE_NODE_IP_ADDRESSES
                                          bracket_op: 
                                            (bracket_op.ArrayIndex
                                              expr: {(${ Id.VSub_Name node)}
                                            )
                                          right: <Id.Right_DollarBrace '}'>
                                        )
                                      )
                                    }
                                    {
                                      (DQ <'Waiting for salt-master to start on '> 
                                        (BracedVarSub
                                          left: <Id.Left_DollarBrace '${'>
                                          token: <Id.VSub_Name NODE_NAMES>
                                          var_name: NODE_NAMES
                                          bracket_op: 
                                            (bracket_op.ArrayIndex
                                              expr: {(${ Id.VSub_Name node)}
                                            )
                                          right: <Id.Right_DollarBrace '}'>
                                        )
                                      )
                                    }
                                    {(DQ <'pgrep salt-minion'>)}
                                  ]
                                  redirects: []
                                  do_fork: T
                                )
                                (command.Simple
                                  blame_tok: <try-until-success-ssh>
                                  more_env: []
                                  words: [
                                    {<try-until-success-ssh>}
                                    {(DQ (${ Id.VSub_Name KUBE_MASTER_IP))}
                                    {
                                      (DQ <'Installing Kubernetes on '> 
                                        (BracedVarSub
                                          left: <Id.Left_DollarBrace '${'>
                                          token: <Id.VSub_Name NODE_NAMES>
                                          var_name: NODE_NAMES
                                          bracket_op: 
                                            (bracket_op.ArrayIndex
                                              expr: {(${ Id.VSub_Name node)}
                                            )
                                          right: <Id.Right_DollarBrace '}'>
                                        ) <' via salt'>
                                      )
                                    }
                                    {
                                      (DQ <'sudo /bin/bash /tmp/'> 
                                        (BracedVarSub
                                          left: <Id.Left_DollarBrace '${'>
                                          token: <Id.VSub_Name NODE_NAMES>
                                          var_name: NODE_NAMES
                                          bracket_op: 
                                            (bracket_op.ArrayIndex
                                              expr: {(${ Id.VSub_Name node)}
                                            )
                                          right: <Id.Right_DollarBrace '}'>
                                        ) <-salt.sh>
                                      )
                                    }
                                  ]
                                  redirects: []
                                  do_fork: T
                                )
                              ]
                            )
                          right: <Id.Right_Subshell _>
                          redirects: []
                        )
                      terminator: <Id.Op_Amp _>
                    )
                  ]
                  right: <Id.KW_Done done>
                )
              redirects: []
            )
            (command.Simple
              blame_tok: <local>
              more_env: []
              words: [{<local>} {<Id.Lit_VarLike 'fail='> <0>}]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <local>
              more_env: []
              words: [{<local>} {<job>}]
              redirects: []
              do_fork: T
            )
            (command.ForEach
              keyword: <Id.KW_For for>
              iter_names: [job]
              iterable: 
                (for_iter.Words
                  words: [
                    {
                      (CommandSub
                        left_token: <Id.Left_DollarParen '$('>
                        child: 
                          (command.Simple
                            blame_tok: <jobs>
                            more_env: []
                            words: [{<jobs>} {<-p>}]
                            redirects: []
                            do_fork: T
                          )
                        right: <Id.Eof_RParen _>
                      )
                    }
                  ]
                )
              semi_tok: <Id.Op_Semi _>
              body: 
                (command.DoGroup
                  left: <Id.KW_Do do>
                  children: [
                    (command.AndOr
                      children: [
                        (command.Simple
                          blame_tok: <wait>
                          more_env: []
                          words: [{<wait>} {(DQ (${ Id.VSub_Name job))}]
                          redirects: []
                          do_fork: T
                        )
                        (command.ShAssignment
                          left: <Id.Lit_VarLike 'fail='>
                          pairs: [
                            (AssignPair
                              left: <Id.Lit_VarLike 'fail='>
                              lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'fail='> name:fail)
                              op: assign_op.Equal
                              rhs: 
                                {
                                  (word_part.ArithSub
                                    left: <Id.Left_DollarDParen '$(('>
                                    anode: 
                                      (arith_expr.Binary
                                        op_id: Id.Arith_Plus
                                        left: ($ Id.Lit_ArithVarLike fail)
                                        right: {<Id.Lit_Digits 1>}
                                      )
                                    right: <Id.Right_DollarDParen _>
                                  )
                                }
                            )
                          ]
                          redirects: []
                        )
                      ]
                      ops: [<Id.Op_DPipe _>]
                    )
                  ]
                  right: <Id.KW_Done done>
                )
              redirects: []
            )
            (command.If
              if_kw: <Id.KW_If if>
              arms: [
                (IfArm
                  keyword: <Id.KW_If if>
                  cond: 
                    (condition.Shell
                      commands: [
                        (command.Sentence
                          child: 
                            (command.DParen
                              left: <Id.Op_DLeftParen _>
                              child: 
                                (arith_expr.Binary
                                  op_id: Id.Arith_NEqual
                                  left: ($ Id.Lit_ArithVarLike fail)
                                  right: {<Id.Lit_Digits 0>}
                                )
                              right: <Id.Op_DRightParen _>
                              redirects: []
                            )
                          terminator: <Id.Op_Semi _>
                        )
                      ]
                    )
                  then_kw: <Id.KW_Then then>
                  action: [
                    (command.Simple
                      blame_tok: <kube>
                      more_env: []
                      words: [
                        {<kube> <Id.Lit_Colon ':'> <Id.Lit_Colon ':'> <log> <Id.Lit_Colon ':'> 
                          <Id.Lit_Colon ':'> <error>
                        }
                        {
                          (DQ <'Failed to start install Kubernetes on '> (${ Id.VSub_Name fail) 
                            <' out of '> (${ Id.VSub_Name NUM_NODES) <' nodess'>
                          )
                        }
                      ]
                      redirects: []
                      do_fork: T
                    )
                    (command.ControlFlow
                      keyword: <Id.ControlFlow_Exit exit>
                      arg_word: {<1>}
                    )
                  ]
                  spids: [4605 4619]
                )
              ]
              else_action: []
              fi_kw: <Id.KW_Fi fi>
              redirects: []
            )
          ]
          redirects: []
          right: <Id.Lit_RBrace '}'>
        )
    )
    (command.ShFunction
      keyword: <Id.KW_Function function>
      name_tok: <upload-server-tars>
      name: upload-server-tars
      body: 
        (BraceGroup
          left: <Id.Lit_LBrace '{'>
          children: [
            (command.ShAssignment
              left: <Id.Lit_VarLike 'vm_name='>
              pairs: [
                (AssignPair
                  left: <Id.Lit_VarLike 'vm_name='>
                  lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'vm_name='> name:vm_name)
                  op: assign_op.Equal
                  rhs: {(${ Id.VSub_Number 1)}
                )
              ]
              redirects: []
            )
            (command.ShAssignment
              left: <Id.Lit_VarLike 'vm_ip='>
              pairs: [
                (AssignPair
                  left: <Id.Lit_VarLike 'vm_ip='>
                  lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'vm_ip='> name:vm_ip)
                  op: assign_op.Equal
                  rhs: {(${ Id.VSub_Number 2)}
                )
              ]
              redirects: []
            )
            (command.Simple
              blame_tok: <run-ssh-cmd>
              more_env: []
              words: [
                {<run-ssh-cmd>}
                {(DQ (${ Id.VSub_Name vm_ip))}
                {(DQ <'mkdir -p /home/kube/cache/kubernetes-install'>)}
              ]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <local>
              more_env: []
              words: [{<local>} {<tar>}]
              redirects: []
              do_fork: T
            )
            (command.ForEach
              keyword: <Id.KW_For for>
              iter_names: [tar]
              iterable: 
                (for_iter.Words
                  words: [{(DQ (${ Id.VSub_Name SERVER_BINARY_TAR))} {(DQ (${ Id.VSub_Name SALT_TAR))}]
                )
              semi_tok: <Id.Op_Semi _>
              body: 
                (command.DoGroup
                  left: <Id.KW_Do do>
                  children: [
                    (command.Simple
                      blame_tok: <local>
                      more_env: []
                      words: [{<local>} {<base_tar>}]
                      redirects: []
                      do_fork: T
                    )
                    (command.ShAssignment
                      left: <Id.Lit_VarLike 'base_tar='>
                      pairs: [
                        (AssignPair
                          left: <Id.Lit_VarLike 'base_tar='>
                          lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'base_tar='> name:base_tar)
                          op: assign_op.Equal
                          rhs: 
                            {
                              (CommandSub
                                left_token: <Id.Left_DollarParen '$('>
                                child: 
                                  (command.Simple
                                    blame_tok: <basename>
                                    more_env: []
                                    words: [{<basename>} {(DQ (${ Id.VSub_Name tar))}]
                                    redirects: []
                                    do_fork: T
                                  )
                                right: <Id.Eof_RParen _>
                              )
                            }
                        )
                      ]
                      redirects: []
                    )
                    (command.Simple
                      blame_tok: <kube>
                      more_env: []
                      words: [
                        {<kube> <Id.Lit_Colon ':'> <Id.Lit_Colon ':'> <log> <Id.Lit_Colon ':'> 
                          <Id.Lit_Colon ':'> <status>
                        }
                        {
                          (DQ <'Uploading '> (${ Id.VSub_Name base_tar) <' to '> 
                            (${ Id.VSub_Name vm_name) <...>
                          )
                        }
                      ]
                      redirects: []
                      do_fork: T
                    )
                    (command.Simple
                      blame_tok: <copy-file-to-vm>
                      more_env: []
                      words: [
                        {<copy-file-to-vm>}
                        {(DQ (${ Id.VSub_Name vm_ip))}
                        {(DQ (${ Id.VSub_Name tar))}
                        {
                          (DQ <'/home/kube/cache/kubernetes-install/'> 
                            (BracedVarSub
                              left: <Id.Left_DollarBrace '${'>
                              token: <Id.VSub_Name tar>
                              var_name: tar
                              suffix_op: 
                                (suffix_op.Unary
                                  op: <Id.VOp1_DPound '##'>
                                  arg_word: {<Id.Lit_Other '*'> <Id.Lit_Slash '/'>}
                                )
                              right: <Id.Right_DollarBrace '}'>
                            )
                          )
                        }
                      ]
                      redirects: []
                      do_fork: T
                    )
                  ]
                  right: <Id.KW_Done done>
                )
              redirects: []
            )
          ]
          redirects: []
          right: <Id.Lit_RBrace '}'>
        )
    )
    (command.ShFunction
      keyword: <Id.KW_Function function>
      name_tok: <wait-master-api>
      name: wait-master-api
      body: 
        (BraceGroup
          left: <Id.Lit_LBrace '{'>
          children: [
            (command.Simple
              blame_tok: <local>
              more_env: []
              words: [
                {<local>}
                {<Id.Lit_VarLike 'curl_creds='> 
                  (DQ <'--insecure --user '> (${ Id.VSub_Name KUBE_USER) <':'> 
                    (${ Id.VSub_Name KUBE_PASSWORD)
                  )
                }
              ]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <local>
              more_env: []
              words: [
                {<local>}
                {<Id.Lit_VarLike 'curl_output='> (DQ <'--fail --output /dev/null --silent'>)}
              ]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <local>
              more_env: []
              words: [{<local>} {<Id.Lit_VarLike 'curl_net='> (DQ <'--max-time 1'>)}]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <try-until-success>
              more_env: []
              words: [
                {<try-until-success>}
                {(DQ <'Waiting for Kubernetes API on '> (${ Id.VSub_Name KUBE_MASTER))}
                {
                  (DQ <'curl '> (${ Id.VSub_Name curl_creds) <' '> (${ Id.VSub_Name curl_output) <' '> 
                    (${ Id.VSub_Name curl_net) <' https://'> (${ Id.VSub_Name KUBE_MASTER_IP) <'/healthz'>
                  )
                }
              ]
              redirects: []
              do_fork: T
            )
          ]
          redirects: []
          right: <Id.Lit_RBrace '}'>
        )
    )
    (command.ShFunction
      keyword: <Id.KW_Function function>
      name_tok: <wait-node-apis>
      name: wait-node-apis
      body: 
        (BraceGroup
          left: <Id.Lit_LBrace '{'>
          children: [
            (command.Simple
              blame_tok: <local>
              more_env: []
              words: [
                {<local>}
                {<Id.Lit_VarLike 'curl_output='> (DQ <'--fail --output /dev/null --silent'>)}
              ]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <local>
              more_env: []
              words: [{<local>} {<Id.Lit_VarLike 'curl_net='> (DQ <'--max-time 1'>)}]
              redirects: []
              do_fork: T
            )
            (command.ForExpr
              keyword: <Id.KW_For for>
              init: 
                (arith_expr.BinaryAssign
                  op_id: Id.Arith_Equal
                  left: ($ Id.Lit_ArithVarLike i)
                  right: {<Id.Lit_Digits 0>}
                )
              cond: 
                (arith_expr.Binary
                  op_id: Id.Arith_Less
                  left: ($ Id.Lit_ArithVarLike i)
                  right: 
                    {
                      (BracedVarSub
                        left: <Id.Left_DollarBrace '${'>
                        token: <Id.VSub_Name NODE_NAMES>
                        var_name: NODE_NAMES
                        prefix_op: <Id.VSub_Pound '#'>
                        bracket_op: (bracket_op.WholeArray op_id:Id.Lit_At)
                        right: <Id.Right_DollarBrace '}'>
                      )
                    }
                )
              update: (arith_expr.UnaryAssign op_id:Id.Node_PostDPlus child:($ Id.Lit_ArithVarLike i))
              body: 
                (command.DoGroup
                  left: <Id.KW_Do do>
                  children: [
                    (command.Simple
                      blame_tok: <try-until-success>
                      more_env: []
                      words: [
                        {<try-until-success>}
                        {
                          (DQ <'Waiting for Kubernetes API on '> 
                            (BracedVarSub
                              left: <Id.Left_DollarBrace '${'>
                              token: <Id.VSub_Name NODE_NAMES>
                              var_name: NODE_NAMES
                              bracket_op: (bracket_op.ArrayIndex expr:{(${ Id.VSub_Name i)})
                              right: <Id.Right_DollarBrace '}'>
                            ) <...>
                          )
                        }
                        {
                          (DQ <'curl '> (${ Id.VSub_Name curl_output) <' '> (${ Id.VSub_Name curl_net) 
                            <' http://'> 
                            (BracedVarSub
                              left: <Id.Left_DollarBrace '${'>
                              token: <Id.VSub_Name KUBE_NODE_IP_ADDRESSES>
                              var_name: KUBE_NODE_IP_ADDRESSES
                              bracket_op: (bracket_op.ArrayIndex expr:{(${ Id.VSub_Name i)})
                              right: <Id.Right_DollarBrace '}'>
                            ) <':10250/healthz'>
                          )
                        }
                      ]
                      redirects: []
                      do_fork: T
                    )
                  ]
                  right: <Id.KW_Done done>
                )
              redirects: []
            )
          ]
          redirects: []
          right: <Id.Lit_RBrace '}'>
        )
    )
    (command.ShFunction
      keyword: <Id.KW_Function function>
      name_tok: <setup-pod-routes>
      name: setup-pod-routes
      body: 
        (BraceGroup
          left: <Id.Lit_LBrace '{'>
          children: [
            (command.Simple
              blame_tok: <local>
              more_env: []
              words: [{<local>} {<node>}]
              redirects: []
              do_fork: T
            )
            (command.ShAssignment
              left: <Id.Lit_VarLike 'KUBE_NODE_BRIDGE_NETWORK='>
              pairs: [
                (AssignPair
                  left: <Id.Lit_VarLike 'KUBE_NODE_BRIDGE_NETWORK='>
                  lhs: 
                    (sh_lhs_expr.Name
                      left: <Id.Lit_VarLike 'KUBE_NODE_BRIDGE_NETWORK='>
                      name: KUBE_NODE_BRIDGE_NETWORK
                    )
                  op: assign_op.Equal
                  rhs: 
                    {
                      (ShArrayLiteral
                        left: <Id.Op_LParen _>
                        words: []
                        right: <Id.Right_ShArrayLiteral _>
                      )
                    }
                )
              ]
              redirects: []
            )
            (command.ForExpr
              keyword: <Id.KW_For for>
              init: 
                (arith_expr.BinaryAssign
                  op_id: Id.Arith_Equal
                  left: ($ Id.Lit_ArithVarLike node)
                  right: {<Id.Lit_Digits 0>}
                )
              cond: 
                (arith_expr.Binary
                  op_id: Id.Arith_Less
                  left: ($ Id.Lit_ArithVarLike node)
                  right: 
                    {
                      (BracedVarSub
                        left: <Id.Left_DollarBrace '${'>
                        token: <Id.VSub_Name NODE_NAMES>
                        var_name: NODE_NAMES
                        prefix_op: <Id.VSub_Pound '#'>
                        bracket_op: (bracket_op.WholeArray op_id:Id.Lit_At)
                        right: <Id.Right_DollarBrace '}'>
                      )
                    }
                )
              update: 
                (arith_expr.UnaryAssign
                  op_id: Id.Node_PostDPlus
                  child: ($ Id.Lit_ArithVarLike node)
                )
              body: 
                (command.DoGroup
                  left: <Id.KW_Do do>
                  children: [
                    (command.Simple
                      blame_tok: <try-until-success-ssh>
                      more_env: []
                      words: [
                        {<try-until-success-ssh>}
                        {
                          (DQ 
                            (BracedVarSub
                              left: <Id.Left_DollarBrace '${'>
                              token: <Id.VSub_Name KUBE_NODE_IP_ADDRESSES>
                              var_name: KUBE_NODE_IP_ADDRESSES
                              bracket_op: (bracket_op.ArrayIndex expr:{(${ Id.VSub_Name node)})
                              right: <Id.Right_DollarBrace '}'>
                            )
                          )
                        }
                        {
                          (DQ <'Waiting for cbr0 bridge on '> 
                            (BracedVarSub
                              left: <Id.Left_DollarBrace '${'>
                              token: <Id.VSub_Name NODE_NAMES>
                              var_name: NODE_NAMES
                              bracket_op: (bracket_op.ArrayIndex expr:{(${ Id.VSub_Name node)})
                              right: <Id.Right_DollarBrace '}'>
                            ) <' to have an address'>
                          )
                        }
                        {(SQ <'sudo ifconfig cbr0  | grep -oP "inet addr:\\K\\S+"'>)}
                      ]
                      redirects: []
                      do_fork: T
                    )
                    (command.Simple
                      blame_tok: <try-until-success-ssh>
                      more_env: []
                      words: [
                        {<try-until-success-ssh>}
                        {
                          (DQ 
                            (BracedVarSub
                              left: <Id.Left_DollarBrace '${'>
                              token: <Id.VSub_Name KUBE_NODE_IP_ADDRESSES>
                              var_name: KUBE_NODE_IP_ADDRESSES
                              bracket_op: (bracket_op.ArrayIndex expr:{(${ Id.VSub_Name node)})
                              right: <Id.Right_DollarBrace '}'>
                            )
                          )
                        }
                        {
                          (DQ <'Waiting for cbr0 bridge on '> 
                            (BracedVarSub
                              left: <Id.Left_DollarBrace '${'>
                              token: <Id.VSub_Name NODE_NAMES>
                              var_name: NODE_NAMES
                              bracket_op: (bracket_op.ArrayIndex expr:{(${ Id.VSub_Name node)})
                              right: <Id.Right_DollarBrace '}'>
                            ) <' to have correct address'>
                          )
                        }
                        {
                          (SQ 
                            <
'sudo ifconfig cbr0  | grep -oP "inet addr:\\K\\S+" | grep -v  "^172."'
                            >
                          )
                        }
                      ]
                      redirects: []
                      do_fork: T
                    )
                    (command.Simple
                      blame_tok: <run-ssh-cmd>
                      more_env: []
                      words: [
                        {<run-ssh-cmd>}
                        {
                          (DQ 
                            (BracedVarSub
                              left: <Id.Left_DollarBrace '${'>
                              token: <Id.VSub_Name KUBE_NODE_IP_ADDRESSES>
                              var_name: KUBE_NODE_IP_ADDRESSES
                              bracket_op: (bracket_op.ArrayIndex expr:{(${ Id.VSub_Name node)})
                              right: <Id.Right_DollarBrace '}'>
                            )
                          )
                        }
                        {(SQ <'sudo ip route show | grep -E "dev cbr0" | cut -d " " -f1'>)}
                      ]
                      redirects: []
                      do_fork: T
                    )
                    (command.ShAssignment
                      left: <Id.Lit_VarLike 'KUBE_NODE_BRIDGE_NETWORK+='>
                      pairs: [
                        (AssignPair
                          left: <Id.Lit_VarLike 'KUBE_NODE_BRIDGE_NETWORK+='>
                          lhs: 
                            (sh_lhs_expr.Name
                              left: <Id.Lit_VarLike 'KUBE_NODE_BRIDGE_NETWORK+='>
                              name: KUBE_NODE_BRIDGE_NETWORK
                            )
                          op: assign_op.PlusEqual
                          rhs: 
                            {
                              (ShArrayLiteral
                                left: <Id.Op_LParen _>
                                words: [{(${ Id.VSub_Name _OUTPUT)}]
                                right: <Id.Right_ShArrayLiteral _>
                              )
                            }
                        )
                      ]
                      redirects: []
                    )
                    (command.Simple
                      blame_tok: <kube>
                      more_env: []
                      words: [
                        {<kube> <Id.Lit_Colon ':'> <Id.Lit_Colon ':'> <log> <Id.Lit_Colon ':'> 
                          <Id.Lit_Colon ':'> <status>
                        }
                        {
                          (DQ <'cbr0 on '> 
                            (BracedVarSub
                              left: <Id.Left_DollarBrace '${'>
                              token: <Id.VSub_Name NODE_NAMES>
                              var_name: NODE_NAMES
                              bracket_op: (bracket_op.ArrayIndex expr:{(${ Id.VSub_Name node)})
                              right: <Id.Right_DollarBrace '}'>
                            ) <' is '> (${ Id.VSub_Name _OUTPUT)
                          )
                        }
                      ]
                      redirects: []
                      do_fork: T
                    )
                  ]
                  right: <Id.KW_Done done>
                )
              redirects: []
            )
            (command.Simple
              blame_tok: <local>
              more_env: []
              words: [{<local>} {<i>}]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <local>
              more_env: []
              words: [{<local>} {<j>}]
              redirects: []
              do_fork: T
            )
            (command.ForExpr
              keyword: <Id.KW_For for>
              init: 
                (arith_expr.BinaryAssign
                  op_id: Id.Arith_Equal
                  left: ($ Id.Lit_ArithVarLike i)
                  right: {<Id.Lit_Digits 0>}
                )
              cond: 
                (arith_expr.Binary
                  op_id: Id.Arith_Less
                  left: ($ Id.Lit_ArithVarLike i)
                  right: 
                    {
                      (BracedVarSub
                        left: <Id.Left_DollarBrace '${'>
                        token: <Id.VSub_Name NODE_NAMES>
                        var_name: NODE_NAMES
                        prefix_op: <Id.VSub_Pound '#'>
                        bracket_op: (bracket_op.WholeArray op_id:Id.Lit_At)
                        right: <Id.Right_DollarBrace '}'>
                      )
                    }
                )
              update: (arith_expr.UnaryAssign op_id:Id.Node_PostDPlus child:($ Id.Lit_ArithVarLike i))
              body: 
                (command.DoGroup
                  left: <Id.KW_Do do>
                  children: [
                    (command.Simple
                      blame_tok: <kube>
                      more_env: []
                      words: [
                        {<kube> <Id.Lit_Colon ':'> <Id.Lit_Colon ':'> <log> <Id.Lit_Colon ':'> 
                          <Id.Lit_Colon ':'> <status>
                        }
                        {
                          (DQ <'Configuring pod routes on '> 
                            (BracedVarSub
                              left: <Id.Left_DollarBrace '${'>
                              token: <Id.VSub_Name NODE_NAMES>
                              var_name: NODE_NAMES
                              bracket_op: (bracket_op.ArrayIndex expr:{(${ Id.VSub_Name i)})
                              right: <Id.Right_DollarBrace '}'>
                            ) <...>
                          )
                        }
                      ]
                      redirects: []
                      do_fork: T
                    )
                    (command.Simple
                      blame_tok: <gen-add-route>
                      more_env: []
                      words: [
                        {<gen-add-route>}
                        {
                          (DQ 
                            (BracedVarSub
                              left: <Id.Left_DollarBrace '${'>
                              token: <Id.VSub_Name KUBE_NODE_BRIDGE_NETWORK>
                              var_name: KUBE_NODE_BRIDGE_NETWORK
                              bracket_op: (bracket_op.ArrayIndex expr:{(${ Id.VSub_Name i)})
                              right: <Id.Right_DollarBrace '}'>
                            )
                          )
                        }
                        {
                          (DQ 
                            (BracedVarSub
                              left: <Id.Left_DollarBrace '${'>
                              token: <Id.VSub_Name KUBE_NODE_IP_ADDRESSES>
                              var_name: KUBE_NODE_IP_ADDRESSES
                              bracket_op: (bracket_op.ArrayIndex expr:{(${ Id.VSub_Name i)})
                              right: <Id.Right_DollarBrace '}'>
                            )
                          )
                        }
                      ]
                      redirects: []
                      do_fork: T
                    )
                    (command.Simple
                      blame_tok: <run-script-remotely>
                      more_env: []
                      words: [
                        {<run-script-remotely>}
                        {(DQ (${ Id.VSub_Name KUBE_MASTER_IP))}
                        {(DQ (${ Id.VSub_Name KUBE_TEMP) <'/add-route.sh'>)}
                      ]
                      redirects: []
                      do_fork: T
                    )
                    (command.ForExpr
                      keyword: <Id.KW_For for>
                      init: 
                        (arith_expr.BinaryAssign
                          op_id: Id.Arith_Equal
                          left: ($ Id.Lit_ArithVarLike j)
                          right: {<Id.Lit_Digits 0>}
                        )
                      cond: 
                        (arith_expr.Binary
                          op_id: Id.Arith_Less
                          left: ($ Id.Lit_ArithVarLike j)
                          right: 
                            {
                              (BracedVarSub
                                left: <Id.Left_DollarBrace '${'>
                                token: <Id.VSub_Name NODE_NAMES>
                                var_name: NODE_NAMES
                                prefix_op: <Id.VSub_Pound '#'>
                                bracket_op: (bracket_op.WholeArray op_id:Id.Lit_At)
                                right: <Id.Right_DollarBrace '}'>
                              )
                            }
                        )
                      update: 
                        (arith_expr.UnaryAssign
                          op_id: Id.Node_PostDPlus
                          child: ($ Id.Lit_ArithVarLike j)
                        )
                      body: 
                        (command.DoGroup
                          left: <Id.KW_Do do>
                          children: [
                            (command.If
                              if_kw: <Id.KW_If if>
                              arms: [
                                (IfArm
                                  keyword: <Id.KW_If if>
                                  cond: 
                                    (condition.Shell
                                      commands: [
                                        (command.Sentence
                                          child: 
                                            (command.DBracket
                                              left: <Id.KW_DLeftBracket '[['>
                                              expr: 
                                                (bool_expr.Binary
                                                  op_id: Id.BoolBinary_GlobNEqual
                                                  left: {(DQ (${ Id.VSub_Name i))}
                                                  right: {(DQ (${ Id.VSub_Name j))}
                                                )
                                              right: <Id.Lit_DRightBracket ']]'>
                                              redirects: []
                                            )
                                          terminator: <Id.Op_Semi _>
                                        )
                                      ]
                                    )
                                  then_kw: <Id.KW_Then then>
                                  action: [
                                    (command.Simple
                                      blame_tok: <gen-add-route>
                                      more_env: []
                                      words: [
                                        {<gen-add-route>}
                                        {
                                          (DQ 
                                            (BracedVarSub
                                              left: <Id.Left_DollarBrace '${'>
                                              token: <Id.VSub_Name KUBE_NODE_BRIDGE_NETWORK>
                                              var_name: KUBE_NODE_BRIDGE_NETWORK
                                              bracket_op: 
                                                (bracket_op.ArrayIndex
                                                  expr: {(${ Id.VSub_Name j)}
                                                )
                                              right: <Id.Right_DollarBrace '}'>
                                            )
                                          )
                                        }
                                        {
                                          (DQ 
                                            (BracedVarSub
                                              left: <Id.Left_DollarBrace '${'>
                                              token: <Id.VSub_Name KUBE_NODE_IP_ADDRESSES>
                                              var_name: KUBE_NODE_IP_ADDRESSES
                                              bracket_op: 
                                                (bracket_op.ArrayIndex
                                                  expr: {(${ Id.VSub_Name j)}
                                                )
                                              right: <Id.Right_DollarBrace '}'>
                                            )
                                          )
                                        }
                                      ]
                                      redirects: []
                                      do_fork: T
                                    )
                                    (command.Simple
                                      blame_tok: <run-script-remotely>
                                      more_env: []
                                      words: [
                                        {<run-script-remotely>}
                                        {
                                          (DQ 
                                            (BracedVarSub
                                              left: <Id.Left_DollarBrace '${'>
                                              token: <Id.VSub_Name KUBE_NODE_IP_ADDRESSES>
                                              var_name: KUBE_NODE_IP_ADDRESSES
                                              bracket_op: 
                                                (bracket_op.ArrayIndex
                                                  expr: {(${ Id.VSub_Name i)}
                                                )
                                              right: <Id.Right_DollarBrace '}'>
                                            )
                                          )
                                        }
                                        {(DQ (${ Id.VSub_Name KUBE_TEMP) <'/add-route.sh'>)}
                                      ]
                                      redirects: []
                                      do_fork: T
                                    )
                                  ]
                                  spids: [5321 5342]
                                )
                              ]
                              else_action: []
                              fi_kw: <Id.KW_Fi fi>
                              redirects: []
                            )
                          ]
                          right: <Id.KW_Done done>
                        )
                      redirects: []
                    )
                  ]
                  right: <Id.KW_Done done>
                )
              redirects: []
            )
          ]
          redirects: []
          right: <Id.Lit_RBrace '}'>
        )
    )
    (command.ShFunction
      keyword: <Id.KW_Function function>
      name_tok: <copy-kube-certs>
      name: copy-kube-certs
      body: 
        (BraceGroup
          left: <Id.Lit_LBrace '{'>
          children: [
            (command.Simple
              blame_tok: <local>
              more_env: []
              words: [{<local>} {<Id.Lit_VarLike 'cert='> (DQ <kubecfg.crt>)}]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <local>
              more_env: []
              words: [{<local>} {<Id.Lit_VarLike 'key='> (DQ <kubecfg.key>)}]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <local>
              more_env: []
              words: [{<local>} {<Id.Lit_VarLike 'ca='> (DQ <ca.crt>)}]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <local>
              more_env: []
              words: [{<local>} {<Id.Lit_VarLike 'cert_dir='> (DQ <'/srv/kubernetes'>)}]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <kube>
              more_env: []
              words: [
                {<kube> <Id.Lit_Colon ':'> <Id.Lit_Colon ':'> <log> <Id.Lit_Colon ':'> <Id.Lit_Colon ':'> 
                  <status>
                }
                {(DQ <'Copying credentials from '> (${ Id.VSub_Name KUBE_MASTER))}
              ]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <export>
              more_env: []
              words: [
                {<export>}
                {<Id.Lit_VarLike 'KUBE_CERT='> 
                  (DQ (${ Id.VSub_Name KUBE_TEMP) <'/'> (${ Id.VSub_Name cert))
                }
              ]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <export>
              more_env: []
              words: [
                {<export>}
                {<Id.Lit_VarLike 'KUBE_KEY='> 
                  (DQ (${ Id.VSub_Name KUBE_TEMP) <'/'> (${ Id.VSub_Name key))
                }
              ]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <export>
              more_env: []
              words: [
                {<export>}
                {<Id.Lit_VarLike 'CA_CERT='> 
                  (DQ (${ Id.VSub_Name KUBE_TEMP) <'/'> (${ Id.VSub_Name ca))
                }
              ]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <export>
              more_env: []
              words: [
                {<export>}
                {<Id.Lit_VarLike 'CONTEXT='> (DQ <photon-> (${ Id.VSub_Name INSTANCE_PREFIX))}
              ]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <run-ssh-cmd>
              more_env: []
              words: [
                {<run-ssh-cmd>}
                {(DQ (${ Id.VSub_Name KUBE_MASTER_IP))}
                {(DQ <'sudo chmod 644 '> (${ Id.VSub_Name cert_dir) <'/'> (${ Id.VSub_Name cert))}
              ]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <run-ssh-cmd>
              more_env: []
              words: [
                {<run-ssh-cmd>}
                {(DQ (${ Id.VSub_Name KUBE_MASTER_IP))}
                {(DQ <'sudo chmod 644 '> (${ Id.VSub_Name cert_dir) <'/'> (${ Id.VSub_Name key))}
              ]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <run-ssh-cmd>
              more_env: []
              words: [
                {<run-ssh-cmd>}
                {(DQ (${ Id.VSub_Name KUBE_MASTER_IP))}
                {(DQ <'sudo chmod 644 '> (${ Id.VSub_Name cert_dir) <'/'> (${ Id.VSub_Name ca))}
              ]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <copy-file-from-vm>
              more_env: []
              words: [
                {<copy-file-from-vm>}
                {(DQ (${ Id.VSub_Name KUBE_MASTER_IP))}
                {(DQ (${ Id.VSub_Name cert_dir) <'/'> (${ Id.VSub_Name cert))}
                {(DQ (${ Id.VSub_Name KUBE_CERT))}
              ]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <copy-file-from-vm>
              more_env: []
              words: [
                {<copy-file-from-vm>}
                {(DQ (${ Id.VSub_Name KUBE_MASTER_IP))}
                {(DQ (${ Id.VSub_Name cert_dir) <'/'> (${ Id.VSub_Name key))}
                {(DQ (${ Id.VSub_Name KUBE_KEY))}
              ]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <copy-file-from-vm>
              more_env: []
              words: [
                {<copy-file-from-vm>}
                {(DQ (${ Id.VSub_Name KUBE_MASTER_IP))}
                {(DQ (${ Id.VSub_Name cert_dir) <'/'> (${ Id.VSub_Name ca))}
                {(DQ (${ Id.VSub_Name CA_CERT))}
              ]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <run-ssh-cmd>
              more_env: []
              words: [
                {<run-ssh-cmd>}
                {(DQ (${ Id.VSub_Name KUBE_MASTER_IP))}
                {(DQ <'sudo chmod 600 '> (${ Id.VSub_Name cert_dir) <'/'> (${ Id.VSub_Name cert))}
              ]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <run-ssh-cmd>
              more_env: []
              words: [
                {<run-ssh-cmd>}
                {(DQ (${ Id.VSub_Name KUBE_MASTER_IP))}
                {(DQ <'sudo chmod 600 '> (${ Id.VSub_Name cert_dir) <'/'> (${ Id.VSub_Name key))}
              ]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <run-ssh-cmd>
              more_env: []
              words: [
                {<run-ssh-cmd>}
                {(DQ (${ Id.VSub_Name KUBE_MASTER_IP))}
                {(DQ <'sudo chmod 600 '> (${ Id.VSub_Name cert_dir) <'/'> (${ Id.VSub_Name ca))}
              ]
              redirects: []
              do_fork: T
            )
          ]
          redirects: []
          right: <Id.Lit_RBrace '}'>
        )
    )
    (command.ShFunction
      keyword: <Id.KW_Function function>
      name_tok: <run-script-remotely>
      name: run-script-remotely
      body: 
        (BraceGroup
          left: <Id.Lit_LBrace '{'>
          children: [
            (command.Simple
              blame_tok: <local>
              more_env: []
              words: [{<local>} {<Id.Lit_VarLike 'vm_ip='> (${ Id.VSub_Number 1)}]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <local>
              more_env: []
              words: [{<local>} {<Id.Lit_VarLike 'local_file='> (DQ (${ Id.VSub_Number 2))}]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <local>
              more_env: []
              words: [{<local>} {<base_file>}]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <local>
              more_env: []
              words: [{<local>} {<remote_file>}]
              redirects: []
              do_fork: T
            )
            (command.ShAssignment
              left: <Id.Lit_VarLike 'base_file='>
              pairs: [
                (AssignPair
                  left: <Id.Lit_VarLike 'base_file='>
                  lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'base_file='> name:base_file)
                  op: assign_op.Equal
                  rhs: 
                    {
                      (CommandSub
                        left_token: <Id.Left_DollarParen '$('>
                        child: 
                          (command.Simple
                            blame_tok: <basename>
                            more_env: []
                            words: [{<basename>} {(DQ (${ Id.VSub_Name local_file))}]
                            redirects: []
                            do_fork: T
                          )
                        right: <Id.Eof_RParen _>
                      )
                    }
                )
              ]
              redirects: []
            )
            (command.ShAssignment
              left: <Id.Lit_VarLike 'remote_file='>
              pairs: [
                (AssignPair
                  left: <Id.Lit_VarLike 'remote_file='>
                  lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'remote_file='> name:remote_file)
                  op: assign_op.Equal
                  rhs: {(DQ <'/tmp/'> (${ Id.VSub_Name base_file))}
                )
              ]
              redirects: []
            )
            (command.Simple
              blame_tok: <copy-file-to-vm>
              more_env: []
              words: [
                {<copy-file-to-vm>}
                {(DQ (${ Id.VSub_Name vm_ip))}
                {(DQ (${ Id.VSub_Name local_file))}
                {(DQ (${ Id.VSub_Name remote_file))}
              ]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <run-ssh-cmd>
              more_env: []
              words: [
                {<run-ssh-cmd>}
                {(DQ (${ Id.VSub_Name vm_ip))}
                {(DQ <'chmod 700 '> (${ Id.VSub_Name remote_file))}
              ]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <run-ssh-cmd>
              more_env: []
              words: [
                {<run-ssh-cmd>}
                {(DQ (${ Id.VSub_Name vm_ip))}
                {
                  (DQ <'nohup sudo '> (${ Id.VSub_Name remote_file) <' < /dev/null 1> '> 
                    (${ Id.VSub_Name remote_file) <'.out 2>&1 &'>
                  )
                }
              ]
              redirects: []
              do_fork: T
            )
          ]
          redirects: []
          right: <Id.Lit_RBrace '}'>
        )
    )
    (command.ShFunction
      keyword: <Id.KW_Function function>
      name_tok: <run-ssh-cmd>
      name: run-ssh-cmd
      body: 
        (BraceGroup
          left: <Id.Lit_LBrace '{'>
          children: [
            (command.Simple
              blame_tok: <local>
              more_env: []
              words: [{<local>} {<Id.Lit_VarLike 'ignore_failure='> (DQ )}]
              redirects: []
              do_fork: T
            )
            (command.If
              if_kw: <Id.KW_If if>
              arms: [
                (IfArm
                  keyword: <Id.KW_If if>
                  cond: 
                    (condition.Shell
                      commands: [
                        (command.Sentence
                          child: 
                            (command.DBracket
                              left: <Id.KW_DLeftBracket '[['>
                              expr: 
                                (bool_expr.Binary
                                  op_id: Id.BoolBinary_GlobEqual
                                  left: {(DQ (${ Id.VSub_Number 1))}
                                  right: {(DQ <-i>)}
                                )
                              right: <Id.Lit_DRightBracket ']]'>
                              redirects: []
                            )
                          terminator: <Id.Op_Semi _>
                        )
                      ]
                    )
                  then_kw: <Id.KW_Then then>
                  action: [
                    (command.ShAssignment
                      left: <Id.Lit_VarLike 'ignore_failure='>
                      pairs: [
                        (AssignPair
                          left: <Id.Lit_VarLike 'ignore_failure='>
                          lhs: 
                            (sh_lhs_expr.Name
                              left: <Id.Lit_VarLike 'ignore_failure='>
                              name: ignore_failure
                            )
                          op: assign_op.Equal
                          rhs: {(DQ <-i>)}
                        )
                      ]
                      redirects: []
                    )
                    (command.Simple
                      blame_tok: <shift>
                      more_env: []
                      words: [{<shift>}]
                      redirects: []
                      do_fork: T
                    )
                  ]
                  spids: [5927 5946]
                )
              ]
              else_action: []
              fi_kw: <Id.KW_Fi fi>
              redirects: []
            )
            (command.Simple
              blame_tok: <local>
              more_env: []
              words: [{<local>} {<Id.Lit_VarLike 'vm_ip='> (${ Id.VSub_Number 1)}]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <shift>
              more_env: []
              words: [{<shift>}]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <local>
              more_env: []
              words: [{<local>} {<Id.Lit_VarLike 'cmd='> (${ Id.VSub_Number 1)}]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <run-cmd>
              more_env: []
              words: [
                {<run-cmd>}
                {(${ Id.VSub_Name ignore_failure)}
                {
                  (DQ <'ssh '> (${ Id.VSub_Name SSH_OPTS) <' '> ($ Id.VSub_DollarName VM_USER) <'@'> 
                    (${ Id.VSub_Name vm_ip) <' '> ($ Id.VSub_Number 1)
                  )
                }
              ]
              redirects: []
              do_fork: T
            )
          ]
          redirects: []
          right: <Id.Lit_RBrace '}'>
        )
    )
    (command.ShFunction
      keyword: <Id.KW_Function function>
      name_tok: <copy-file-to-vm>
      name: copy-file-to-vm
      body: 
        (BraceGroup
          left: <Id.Lit_LBrace '{'>
          children: [
            (command.Simple
              blame_tok: <local>
              more_env: []
              words: [{<local>} {<Id.Lit_VarLike 'vm_ip='> (${ Id.VSub_Number 1)}]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <local>
              more_env: []
              words: [{<local>} {<Id.Lit_VarLike 'local_file='> (${ Id.VSub_Number 2)}]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <local>
              more_env: []
              words: [{<local>} {<Id.Lit_VarLike 'remote_file='> (${ Id.VSub_Number 3)}]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <run-cmd>
              more_env: []
              words: [
                {<run-cmd>}
                {
                  (DQ <'scp '> (${ Id.VSub_Name SSH_OPTS) <' '> (${ Id.VSub_Name local_file) <' '> 
                    (${ Id.VSub_Name VM_USER) <'@'> (${ Id.VSub_Name vm_ip) <':'> (${ Id.VSub_Name remote_file)
                  )
                }
              ]
              redirects: []
              do_fork: T
            )
          ]
          redirects: []
          right: <Id.Lit_RBrace '}'>
        )
    )
    (command.ShFunction
      keyword: <Id.KW_Function function>
      name_tok: <copy-file-from-vm>
      name: copy-file-from-vm
      body: 
        (BraceGroup
          left: <Id.Lit_LBrace '{'>
          children: [
            (command.Simple
              blame_tok: <local>
              more_env: []
              words: [{<local>} {<Id.Lit_VarLike 'vm_ip='> (${ Id.VSub_Number 1)}]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <local>
              more_env: []
              words: [{<local>} {<Id.Lit_VarLike 'remote_file='> (${ Id.VSub_Number 2)}]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <local>
              more_env: []
              words: [{<local>} {<Id.Lit_VarLike 'local_file='> (${ Id.VSub_Number 3)}]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <run-cmd>
              more_env: []
              words: [
                {<run-cmd>}
                {
                  (DQ <'scp '> (${ Id.VSub_Name SSH_OPTS) <' '> (${ Id.VSub_Name VM_USER) <'@'> 
                    (${ Id.VSub_Name vm_ip) <':'> (${ Id.VSub_Name remote_file) <' '> (${ Id.VSub_Name local_file)
                  )
                }
              ]
              redirects: []
              do_fork: T
            )
          ]
          redirects: []
          right: <Id.Lit_RBrace '}'>
        )
    )
    (command.ShFunction
      keyword: <Id.KW_Function function>
      name_tok: <run-cmd>
      name: run-cmd
      body: 
        (BraceGroup
          left: <Id.Lit_LBrace '{'>
          children: [
            (command.Simple
              blame_tok: <local>
              more_env: []
              words: [{<local>} {<Id.Lit_VarLike 'rc='> <0>}]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <local>
              more_env: []
              words: [{<local>} {<Id.Lit_VarLike 'ignore_failure='> (DQ )}]
              redirects: []
              do_fork: T
            )
            (command.If
              if_kw: <Id.KW_If if>
              arms: [
                (IfArm
                  keyword: <Id.KW_If if>
                  cond: 
                    (condition.Shell
                      commands: [
                        (command.Sentence
                          child: 
                            (command.DBracket
                              left: <Id.KW_DLeftBracket '[['>
                              expr: 
                                (bool_expr.Binary
                                  op_id: Id.BoolBinary_GlobEqual
                                  left: {(DQ (${ Id.VSub_Number 1))}
                                  right: {(DQ <-i>)}
                                )
                              right: <Id.Lit_DRightBracket ']]'>
                              redirects: []
                            )
                          terminator: <Id.Op_Semi _>
                        )
                      ]
                    )
                  then_kw: <Id.KW_Then then>
                  action: [
                    (command.ShAssignment
                      left: <Id.Lit_VarLike 'ignore_failure='>
                      pairs: [
                        (AssignPair
                          left: <Id.Lit_VarLike 'ignore_failure='>
                          lhs: 
                            (sh_lhs_expr.Name
                              left: <Id.Lit_VarLike 'ignore_failure='>
                              name: ignore_failure
                            )
                          op: assign_op.Equal
                          rhs: {(${ Id.VSub_Number 1)}
                        )
                      ]
                      redirects: []
                    )
                    (command.Simple
                      blame_tok: <shift>
                      more_env: []
                      words: [{<shift>}]
                      redirects: []
                      do_fork: T
                    )
                  ]
                  spids: [6189 6208]
                )
              ]
              else_action: []
              fi_kw: <Id.KW_Fi fi>
              redirects: []
            )
            (command.Simple
              blame_tok: <local>
              more_env: []
              words: [{<local>} {<Id.Lit_VarLike 'cmd='> ($ Id.VSub_Number 1)}]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <local>
              more_env: []
              words: [{<local>} {<output>}]
              redirects: []
              do_fork: T
            )
            (command.AndOr
              children: [
                (command.ShAssignment
                  left: <Id.Lit_VarLike 'output='>
                  pairs: [
                    (AssignPair
                      left: <Id.Lit_VarLike 'output='>
                      lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'output='> name:output)
                      op: assign_op.Equal
                      rhs: 
                        {
                          (CommandSub
                            left_token: <Id.Left_DollarParen '$('>
                            child: 
                              (command.Simple
                                blame_tok: <Id.Left_DollarBrace '${'>
                                more_env: []
                                words: [{(${ Id.VSub_Name cmd)}]
                                redirects: [
                                  (Redir
                                    op: <Id.Redir_GreatAnd '2>&'>
                                    loc: (redir_loc.Fd fd:2)
                                    arg: {<1>}
                                  )
                                ]
                                do_fork: T
                              )
                            right: <Id.Eof_RParen _>
                          )
                        }
                    )
                  ]
                  redirects: []
                )
                (command.ShAssignment
                  left: <Id.Lit_VarLike 'rc='>
                  pairs: [
                    (AssignPair
                      left: <Id.Lit_VarLike 'rc='>
                      lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'rc='> name:rc)
                      op: assign_op.Equal
                      rhs: {($ Id.VSub_QMark '?')}
                    )
                  ]
                  redirects: []
                )
              ]
              ops: [<Id.Op_DPipe _>]
            )
            (command.If
              if_kw: <Id.KW_If if>
              arms: [
                (IfArm
                  keyword: <Id.KW_If if>
                  cond: 
                    (condition.Shell
                      commands: [
                        (command.Sentence
                          child: 
                            (command.DBracket
                              left: <Id.KW_DLeftBracket '[['>
                              expr: 
                                (bool_expr.Binary
                                  op_id: Id.BoolBinary_ne
                                  left: {(${ Id.VSub_Name rc)}
                                  right: {<0>}
                                )
                              right: <Id.Lit_DRightBracket ']]'>
                              redirects: []
                            )
                          terminator: <Id.Op_Semi _>
                        )
                      ]
                    )
                  then_kw: <Id.KW_Then then>
                  action: [
                    (command.If
                      if_kw: <Id.KW_If if>
                      arms: [
                        (IfArm
                          keyword: <Id.KW_If if>
                          cond: 
                            (condition.Shell
                              commands: [
                                (command.Sentence
                                  child: 
                                    (command.DBracket
                                      left: <Id.KW_DLeftBracket '[['>
                                      expr: 
                                        (bool_expr.Unary
                                          op_id: Id.BoolUnary_z
                                          child: {(DQ (${ Id.VSub_Name ignore_failure))}
                                        )
                                      right: <Id.Lit_DRightBracket ']]'>
                                      redirects: []
                                    )
                                  terminator: <Id.Op_Semi _>
                                )
                              ]
                            )
                          then_kw: <Id.KW_Then then>
                          action: [
                            (command.Simple
                              blame_tok: <kube>
                              more_env: []
                              words: [
                                {<kube> <Id.Lit_Colon ':'> <Id.Lit_Colon ':'> <log> <Id.Lit_Colon ':'> 
                                  <Id.Lit_Colon ':'> <error>
                                }
                                {(DQ <'Failed to run command: '> (${ Id.VSub_Name cmd) <' Output:'>)}
                              ]
                              redirects: []
                              do_fork: T
                            )
                            (command.Simple
                              blame_tok: <echo>
                              more_env: []
                              words: [{<echo>} {(DQ (${ Id.VSub_Name output))}]
                              redirects: []
                              do_fork: T
                            )
                            (command.ControlFlow
                              keyword: <Id.ControlFlow_Exit exit>
                              arg_word: {<1>}
                            )
                          ]
                          spids: [6269 6284]
                        )
                      ]
                      else_action: []
                      fi_kw: <Id.KW_Fi fi>
                      redirects: []
                    )
                  ]
                  spids: [6251 6266]
                )
              ]
              else_action: []
              fi_kw: <Id.KW_Fi fi>
              redirects: []
            )
            (command.ShAssignment
              left: <Id.Lit_VarLike '_OUTPUT='>
              pairs: [
                (AssignPair
                  left: <Id.Lit_VarLike '_OUTPUT='>
                  lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_OUTPUT='> name:_OUTPUT)
                  op: assign_op.Equal
                  rhs: {(${ Id.VSub_Name output)}
                )
              ]
              redirects: []
            )
            (command.ControlFlow
              keyword: <Id.ControlFlow_Return return>
              arg_word: {(${ Id.VSub_Name rc)}
            )
          ]
          redirects: []
          right: <Id.Lit_RBrace '}'>
        )
    )
    (command.ShFunction
      keyword: <Id.KW_Function function>
      name_tok: <verify-ssh-prereqs>
      name: verify-ssh-prereqs
      body: 
        (BraceGroup
          left: <Id.Lit_LBrace '{'>
          children: [
            (command.Simple
              blame_tok: <kube>
              more_env: []
              words: [
                {<kube> <Id.Lit_Colon ':'> <Id.Lit_Colon ':'> <log> <Id.Lit_Colon ':'> <Id.Lit_Colon ':'> 
                  <status>
                }
                {(DQ <'Validating SSH configuration...'>)}
              ]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <local>
              more_env: []
              words: [{<local>} {<rc>}]
              redirects: []
              do_fork: T
            )
            (command.ShAssignment
              left: <Id.Lit_VarLike 'rc='>
              pairs: [
                (AssignPair
                  left: <Id.Lit_VarLike 'rc='>
                  lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'rc='> name:rc)
                  op: assign_op.Equal
                  rhs: {<0>}
                )
              ]
              redirects: []
            )
            (command.AndOr
              children: [
                (command.Simple
                  blame_tok: <ssh-add>
                  more_env: []
                  words: [{<ssh-add>} {<-L>}]
                  redirects: [
                    (Redir
                      op: <Id.Redir_Great '1>'>
                      loc: (redir_loc.Fd fd:1)
                      arg: {<'/dev/null'>}
                    )
                    (Redir
                      op: <Id.Redir_Great '2>'>
                      loc: (redir_loc.Fd fd:2)
                      arg: {<'/dev/null'>}
                    )
                  ]
                  do_fork: T
                )
                (command.ShAssignment
                  left: <Id.Lit_VarLike 'rc='>
                  pairs: [
                    (AssignPair
                      left: <Id.Lit_VarLike 'rc='>
                      lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'rc='> name:rc)
                      op: assign_op.Equal
                      rhs: {($ Id.VSub_QMark '?')}
                    )
                  ]
                  redirects: []
                )
              ]
              ops: [<Id.Op_DPipe _>]
            )
            (command.If
              if_kw: <Id.KW_If if>
              arms: [
                (IfArm
                  keyword: <Id.KW_If if>
                  cond: 
                    (condition.Shell
                      commands: [
                        (command.Sentence
                          child: 
                            (command.DBracket
                              left: <Id.KW_DLeftBracket '[['>
                              expr: 
                                (bool_expr.Binary
                                  op_id: Id.BoolBinary_eq
                                  left: {(DQ (${ Id.VSub_Name rc))}
                                  right: {<2>}
                                )
                              right: <Id.Lit_DRightBracket ']]'>
                              redirects: []
                            )
                          terminator: <Id.Op_Semi _>
                        )
                      ]
                    )
                  then_kw: <Id.KW_Then then>
                  action: [
                    (command.Simple
                      blame_tok: <eval>
                      more_env: []
                      words: [
                        {<eval>}
                        {
                          (DQ 
                            (CommandSub
                              left_token: <Id.Left_DollarParen '$('>
                              child: 
                                (command.Simple
                                  blame_tok: <ssh-agent>
                                  more_env: []
                                  words: [{<ssh-agent>}]
                                  redirects: []
                                  do_fork: T
                                )
                              right: <Id.Eof_RParen _>
                            )
                          )
                        }
                      ]
                      redirects: [
                        (Redir
                          op: <Id.Redir_Great '>'>
                          loc: (redir_loc.Fd fd:1)
                          arg: {<'/dev/null'>}
                        )
                      ]
                      do_fork: T
                    )
                    (command.Simple
                      blame_tok: <trap-add>
                      more_env: []
                      words: [{<trap-add>} {(DQ <'kill '> (${ Id.VSub_Name SSH_AGENT_PID))} {<EXIT>}]
                      redirects: []
                      do_fork: T
                    )
                  ]
                  spids: [6403 6420]
                )
              ]
              else_action: []
              fi_kw: <Id.KW_Fi fi>
              redirects: []
            )
            (command.ShAssignment
              left: <Id.Lit_VarLike 'rc='>
              pairs: [
                (AssignPair
                  left: <Id.Lit_VarLike 'rc='>
                  lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'rc='> name:rc)
                  op: assign_op.Equal
                  rhs: {<0>}
                )
              ]
              redirects: []
            )
            (command.AndOr
              children: [
                (command.Simple
                  blame_tok: <ssh-add>
                  more_env: []
                  words: [{<ssh-add>} {<-L>}]
                  redirects: [
                    (Redir
                      op: <Id.Redir_Great '1>'>
                      loc: (redir_loc.Fd fd:1)
                      arg: {<'/dev/null'>}
                    )
                    (Redir
                      op: <Id.Redir_Great '2>'>
                      loc: (redir_loc.Fd fd:2)
                      arg: {<'/dev/null'>}
                    )
                  ]
                  do_fork: T
                )
                (command.ShAssignment
                  left: <Id.Lit_VarLike 'rc='>
                  pairs: [
                    (AssignPair
                      left: <Id.Lit_VarLike 'rc='>
                      lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'rc='> name:rc)
                      op: assign_op.Equal
                      rhs: {($ Id.VSub_QMark '?')}
                    )
                  ]
                  redirects: []
                )
              ]
              ops: [<Id.Op_DPipe _>]
            )
            (command.If
              if_kw: <Id.KW_If if>
              arms: [
                (IfArm
                  keyword: <Id.KW_If if>
                  cond: 
                    (condition.Shell
                      commands: [
                        (command.Sentence
                          child: 
                            (command.DBracket
                              left: <Id.KW_DLeftBracket '[['>
                              expr: 
                                (bool_expr.Binary
                                  op_id: Id.BoolBinary_eq
                                  left: {(DQ (${ Id.VSub_Name rc))}
                                  right: {<1>}
                                )
                              right: <Id.Lit_DRightBracket ']]'>
                              redirects: []
                            )
                          terminator: <Id.Op_Semi _>
                        )
                      ]
                    )
                  then_kw: <Id.KW_Then then>
                  action: [
                    (command.AndOr
                      children: [
                        (command.Simple
                          blame_tok: <ssh-add>
                          more_env: []
                          words: [{<ssh-add>}]
                          redirects: []
                          do_fork: T
                        )
                        (command.Simple
                          blame_tok: <true>
                          more_env: []
                          words: [{<true>}]
                          redirects: []
                          do_fork: T
                        )
                      ]
                      ops: [<Id.Op_DPipe _>]
                    )
                  ]
                  spids: [6482 6499]
                )
              ]
              else_action: []
              fi_kw: <Id.KW_Fi fi>
              redirects: []
            )
            (command.If
              if_kw: <Id.KW_If if>
              arms: [
                (IfArm
                  keyword: <Id.KW_If if>
                  cond: 
                    (condition.Shell
                      commands: [
                        (command.Sentence
                          child: 
                            (command.Pipeline
                              negated: <Id.KW_Bang '!'>
                              children: [
                                (command.Simple
                                  blame_tok: <ssh-add>
                                  more_env: []
                                  words: [{<ssh-add>} {<-L>}]
                                  redirects: [
                                    (Redir
                                      op: <Id.Redir_Great '1>'>
                                      loc: (redir_loc.Fd fd:1)
                                      arg: {<'/dev/null'>}
                                    )
                                    (Redir
                                      op: <Id.Redir_Great '2>'>
                                      loc: (redir_loc.Fd fd:2)
                                      arg: {<'/dev/null'>}
                                    )
                                  ]
                                  do_fork: T
                                )
                              ]
                              ops: []
                            )
                          terminator: <Id.Op_Semi _>
                        )
                      ]
                    )
                  then_kw: <Id.KW_Then then>
                  action: [
                    (command.Simple
                      blame_tok: <kube>
                      more_env: []
                      words: [
                        {<kube> <Id.Lit_Colon ':'> <Id.Lit_Colon ':'> <log> <Id.Lit_Colon ':'> 
                          <Id.Lit_Colon ':'> <error>
                        }
                        {(DQ <'Could not find or add an SSH identity.'>)}
                      ]
                      redirects: []
                      do_fork: T
                    )
                    (command.Simple
                      blame_tok: <kube>
                      more_env: []
                      words: [
                        {<kube> <Id.Lit_Colon ':'> <Id.Lit_Colon ':'> <log> <Id.Lit_Colon ':'> 
                          <Id.Lit_Colon ':'> <error>
                        }
                        {(DQ <'Please start ssh-agent, add your identity, and retry.'>)}
                      ]
                      redirects: []
                      do_fork: T
                    )
                    (command.ControlFlow
                      keyword: <Id.ControlFlow_Exit exit>
                      arg_word: {<1>}
                    )
                  ]
                  spids: [6521 6538]
                )
              ]
              else_action: []
              fi_kw: <Id.KW_Fi fi>
              redirects: []
            )
          ]
          redirects: []
          right: <Id.Lit_RBrace '}'>
        )
    )
    (command.ShFunction
      keyword: <Id.KW_Function function>
      name_tok: <verify-photon-config>
      name: verify-photon-config
      body: 
        (BraceGroup
          left: <Id.Lit_LBrace '{'>
          children: [
            (command.Simple
              blame_tok: <kube>
              more_env: []
              words: [
                {<kube> <Id.Lit_Colon ':'> <Id.Lit_Colon ':'> <log> <Id.Lit_Colon ':'> <Id.Lit_Colon ':'> 
                  <status>
                }
                {(DQ <'Validating Photon configuration...'>)}
              ]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <set>
              more_env: []
              words: [{<set>} {<Id.Lit_Other '+'> <o>} {<pipefail>}]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <verify-photon-flavors>
              more_env: []
              words: [{<verify-photon-flavors>}]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <verify-photon-image>
              more_env: []
              words: [{<verify-photon-image>}]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <verify-photon-tenant>
              more_env: []
              words: [{<verify-photon-tenant>}]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <set>
              more_env: []
              words: [{<set>} {<-o>} {<pipefail>}]
              redirects: []
              do_fork: T
            )
          ]
          redirects: []
          right: <Id.Lit_RBrace '}'>
        )
    )
    (command.ShFunction
      keyword: <Id.KW_Function function>
      name_tok: <verify-photon-flavors>
      name: verify-photon-flavors
      body: 
        (BraceGroup
          left: <Id.Lit_LBrace '{'>
          children: [
            (command.Simple
              blame_tok: <local>
              more_env: []
              words: [{<local>} {<Id.Lit_VarLike 'rc='> <0>}]
              redirects: []
              do_fork: T
            )
            (command.AndOr
              children: [
                (command.Pipeline
                  children: [
                    (command.Simple
                      blame_tok: <Id.Left_DollarBrace '${'>
                      more_env: []
                      words: [{(${ Id.VSub_Name PHOTON)} {<flavor>} {<list>}]
                      redirects: []
                      do_fork: T
                    )
                    (command.Simple
                      blame_tok: <awk>
                      more_env: []
                      words: [{<awk>} {<-F> (SQ <'\\t'>)} {(SQ <'{print $2}'>)}]
                      redirects: []
                      do_fork: T
                    )
                    (command.Simple
                      blame_tok: <grep>
                      more_env: []
                      words: [
                        {<grep>}
                        {<-q>}
                        {(DQ <'^'> (${ Id.VSub_Name PHOTON_MASTER_FLAVOR) <Id.Lit_Dollar '$'>)}
                      ]
                      redirects: [
                        (Redir
                          op: <Id.Redir_Great '>'>
                          loc: (redir_loc.Fd fd:1)
                          arg: {<'/dev/null'>}
                        )
                        (Redir
                          op: <Id.Redir_GreatAnd '2>&'>
                          loc: (redir_loc.Fd fd:2)
                          arg: {<1>}
                        )
                      ]
                      do_fork: T
                    )
                  ]
                  ops: [<Id.Op_Pipe _> <Id.Op_Pipe _>]
                )
                (command.ShAssignment
                  left: <Id.Lit_VarLike 'rc='>
                  pairs: [
                    (AssignPair
                      left: <Id.Lit_VarLike 'rc='>
                      lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'rc='> name:rc)
                      op: assign_op.Equal
                      rhs: {($ Id.VSub_QMark '?')}
                    )
                  ]
                  redirects: []
                )
              ]
              ops: [<Id.Op_DPipe _>]
            )
            (command.If
              if_kw: <Id.KW_If if>
              arms: [
                (IfArm
                  keyword: <Id.KW_If if>
                  cond: 
                    (condition.Shell
                      commands: [
                        (command.Sentence
                          child: 
                            (command.DBracket
                              left: <Id.KW_DLeftBracket '[['>
                              expr: 
                                (bool_expr.Binary
                                  op_id: Id.BoolBinary_ne
                                  left: {(${ Id.VSub_Name rc)}
                                  right: {<0>}
                                )
                              right: <Id.Lit_DRightBracket ']]'>
                              redirects: []
                            )
                          terminator: <Id.Op_Semi _>
                        )
                      ]
                    )
                  then_kw: <Id.KW_Then then>
                  action: [
                    (command.Simple
                      blame_tok: <kube>
                      more_env: []
                      words: [
                        {<kube> <Id.Lit_Colon ':'> <Id.Lit_Colon ':'> <log> <Id.Lit_Colon ':'> 
                          <Id.Lit_Colon ':'> <error>
                        }
                        {
                          (DQ <'ERROR: Cannot find VM flavor named '> 
                            (${ Id.VSub_Name PHOTON_MASTER_FLAVOR)
                          )
                        }
                      ]
                      redirects: []
                      do_fork: T
                    )
                    (command.ControlFlow
                      keyword: <Id.ControlFlow_Exit exit>
                      arg_word: {<1>}
                    )
                  ]
                  spids: [6720 6735]
                )
              ]
              else_action: []
              fi_kw: <Id.KW_Fi fi>
              redirects: []
            )
            (command.If
              if_kw: <Id.KW_If if>
              arms: [
                (IfArm
                  keyword: <Id.KW_If if>
                  cond: 
                    (condition.Shell
                      commands: [
                        (command.Sentence
                          child: 
                            (command.DBracket
                              left: <Id.KW_DLeftBracket '[['>
                              expr: 
                                (bool_expr.Binary
                                  op_id: Id.BoolBinary_GlobNEqual
                                  left: {(DQ (${ Id.VSub_Name PHOTON_MASTER_FLAVOR))}
                                  right: {(DQ (${ Id.VSub_Name PHOTON_NODE_FLAVOR))}
                                )
                              right: <Id.Lit_DRightBracket ']]'>
                              redirects: []
                            )
                          terminator: <Id.Op_Semi _>
                        )
                      ]
                    )
                  then_kw: <Id.KW_Then then>
                  action: [
                    (command.ShAssignment
                      left: <Id.Lit_VarLike 'rc='>
                      pairs: [
                        (AssignPair
                          left: <Id.Lit_VarLike 'rc='>
                          lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'rc='> name:rc)
                          op: assign_op.Equal
                          rhs: {<0>}
                        )
                      ]
                      redirects: []
                    )
                    (command.AndOr
                      children: [
                        (command.Pipeline
                          children: [
                            (command.Simple
                              blame_tok: <Id.Left_DollarBrace '${'>
                              more_env: []
                              words: [{(${ Id.VSub_Name PHOTON)} {<flavor>} {<list>}]
                              redirects: []
                              do_fork: T
                            )
                            (command.Simple
                              blame_tok: <awk>
                              more_env: []
                              words: [{<awk>} {<-F> (SQ <'\\t'>)} {(SQ <'{print $2}'>)}]
                              redirects: []
                              do_fork: T
                            )
                            (command.Simple
                              blame_tok: <grep>
                              more_env: []
                              words: [
                                {<grep>}
                                {<-q>}
                                {(DQ <'^'> (${ Id.VSub_Name PHOTON_NODE_FLAVOR) <Id.Lit_Dollar '$'>)}
                              ]
                              redirects: [
                                (Redir
                                  op: <Id.Redir_Great '>'>
                                  loc: (redir_loc.Fd fd:1)
                                  arg: {<'/dev/null'>}
                                )
                                (Redir
                                  op: <Id.Redir_GreatAnd '2>&'>
                                  loc: (redir_loc.Fd fd:2)
                                  arg: {<1>}
                                )
                              ]
                              do_fork: T
                            )
                          ]
                          ops: [<Id.Op_Pipe _> <Id.Op_Pipe _>]
                        )
                        (command.ShAssignment
                          left: <Id.Lit_VarLike 'rc='>
                          pairs: [
                            (AssignPair
                              left: <Id.Lit_VarLike 'rc='>
                              lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'rc='> name:rc)
                              op: assign_op.Equal
                              rhs: {($ Id.VSub_QMark '?')}
                            )
                          ]
                          redirects: []
                        )
                      ]
                      ops: [<Id.Op_DPipe _>]
                    )
                    (command.If
                      if_kw: <Id.KW_If if>
                      arms: [
                        (IfArm
                          keyword: <Id.KW_If if>
                          cond: 
                            (condition.Shell
                              commands: [
                                (command.Sentence
                                  child: 
                                    (command.DBracket
                                      left: <Id.KW_DLeftBracket '[['>
                                      expr: 
                                        (bool_expr.Binary
                                          op_id: Id.BoolBinary_ne
                                          left: {(${ Id.VSub_Name rc)}
                                          right: {<0>}
                                        )
                                      right: <Id.Lit_DRightBracket ']]'>
                                      redirects: []
                                    )
                                  terminator: <Id.Op_Semi _>
                                )
                              ]
                            )
                          then_kw: <Id.KW_Then then>
                          action: [
                            (command.Simple
                              blame_tok: <kube>
                              more_env: []
                              words: [
                                {<kube> <Id.Lit_Colon ':'> <Id.Lit_Colon ':'> <log> <Id.Lit_Colon ':'> 
                                  <Id.Lit_Colon ':'> <error>
                                }
                                {
                                  (DQ <'ERROR: Cannot find VM flavor named '> 
                                    (${ Id.VSub_Name PHOTON_NODE_FLAVOR)
                                  )
                                }
                              ]
                              redirects: []
                              do_fork: T
                            )
                            (command.ControlFlow
                              keyword: <Id.ControlFlow_Exit exit>
                              arg_word: {<1>}
                            )
                          ]
                          spids: [6839 6854]
                        )
                      ]
                      else_action: []
                      fi_kw: <Id.KW_Fi fi>
                      redirects: []
                    )
                  ]
                  spids: [6763 6784]
                )
              ]
              else_action: []
              fi_kw: <Id.KW_Fi fi>
              redirects: []
            )
            (command.AndOr
              children: [
                (command.Pipeline
                  children: [
                    (command.Simple
                      blame_tok: <Id.Left_DollarBrace '${'>
                      more_env: []
                      words: [{(${ Id.VSub_Name PHOTON)} {<flavor>} {<list>}]
                      redirects: []
                      do_fork: T
                    )
                    (command.Simple
                      blame_tok: <awk>
                      more_env: []
                      words: [{<awk>} {<-F> (SQ <'\\t'>)} {(SQ <'{print $2}'>)}]
                      redirects: []
                      do_fork: T
                    )
                    (command.Simple
                      blame_tok: <grep>
                      more_env: []
                      words: [
                        {<grep>}
                        {<-q>}
                        {(DQ <'^'> (${ Id.VSub_Name PHOTON_DISK_FLAVOR) <Id.Lit_Dollar '$'>)}
                      ]
                      redirects: [
                        (Redir
                          op: <Id.Redir_Great '>'>
                          loc: (redir_loc.Fd fd:1)
                          arg: {<'/dev/null'>}
                        )
                        (Redir
                          op: <Id.Redir_GreatAnd '2>&'>
                          loc: (redir_loc.Fd fd:2)
                          arg: {<1>}
                        )
                      ]
                      do_fork: T
                    )
                  ]
                  ops: [<Id.Op_Pipe _> <Id.Op_Pipe _>]
                )
                (command.ShAssignment
                  left: <Id.Lit_VarLike 'rc='>
                  pairs: [
                    (AssignPair
                      left: <Id.Lit_VarLike 'rc='>
                      lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'rc='> name:rc)
                      op: assign_op.Equal
                      rhs: {($ Id.VSub_QMark '?')}
                    )
                  ]
                  redirects: []
                )
              ]
              ops: [<Id.Op_DPipe _>]
            )
            (command.If
              if_kw: <Id.KW_If if>
              arms: [
                (IfArm
                  keyword: <Id.KW_If if>
                  cond: 
                    (condition.Shell
                      commands: [
                        (command.Sentence
                          child: 
                            (command.DBracket
                              left: <Id.KW_DLeftBracket '[['>
                              expr: 
                                (bool_expr.Binary
                                  op_id: Id.BoolBinary_ne
                                  left: {(${ Id.VSub_Name rc)}
                                  right: {<0>}
                                )
                              right: <Id.Lit_DRightBracket ']]'>
                              redirects: []
                            )
                          terminator: <Id.Op_Semi _>
                        )
                      ]
                    )
                  then_kw: <Id.KW_Then then>
                  action: [
                    (command.Simple
                      blame_tok: <kube>
                      more_env: []
                      words: [
                        {<kube> <Id.Lit_Colon ':'> <Id.Lit_Colon ':'> <log> <Id.Lit_Colon ':'> 
                          <Id.Lit_Colon ':'> <error>
                        }
                        {
                          (DQ <'ERROR: Cannot find disk flavor named '> 
                            (${ Id.VSub_Name PHOTON_DISK_FLAVOR)
                          )
                        }
                      ]
                      redirects: []
                      do_fork: T
                    )
                    (command.ControlFlow
                      keyword: <Id.ControlFlow_Exit exit>
                      arg_word: {<1>}
                    )
                  ]
                  spids: [6933 6948]
                )
              ]
              else_action: []
              fi_kw: <Id.KW_Fi fi>
              redirects: []
            )
          ]
          redirects: []
          right: <Id.Lit_RBrace '}'>
        )
    )
    (command.ShFunction
      keyword: <Id.KW_Function function>
      name_tok: <verify-photon-image>
      name: verify-photon-image
      body: 
        (BraceGroup
          left: <Id.Lit_LBrace '{'>
          children: [
            (command.Simple
              blame_tok: <local>
              more_env: []
              words: [{<local>} {<rc>}]
              redirects: []
              do_fork: T
            )
            (command.ShAssignment
              left: <Id.Lit_VarLike 'rc='>
              pairs: [
                (AssignPair
                  left: <Id.Lit_VarLike 'rc='>
                  lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'rc='> name:rc)
                  op: assign_op.Equal
                  rhs: {<0>}
                )
              ]
              redirects: []
            )
            (command.AndOr
              children: [
                (command.Pipeline
                  children: [
                    (command.Simple
                      blame_tok: <Id.Left_DollarBrace '${'>
                      more_env: []
                      words: [{(${ Id.VSub_Name PHOTON)} {<image>} {<list>}]
                      redirects: []
                      do_fork: T
                    )
                    (command.Simple
                      blame_tok: <grep>
                      more_env: []
                      words: [
                        {<grep>}
                        {<-q>}
                        {
                          (SingleQuoted
                            left: <Id.Left_DollarSingleQuote '$\''>
                            tokens: [<Id.Char_OneChar '\\t'>]
                            right: <Id.Right_SingleQuote '\''>
                          ) (DQ (${ Id.VSub_Name PHOTON_IMAGE)) 
                          (SingleQuoted
                            left: <Id.Left_DollarSingleQuote '$\''>
                            tokens: [<Id.Char_OneChar '\\t'>]
                            right: <Id.Right_SingleQuote '\''>
                          )
                        }
                      ]
                      redirects: [
                        (Redir
                          op: <Id.Redir_Great '>'>
                          loc: (redir_loc.Fd fd:1)
                          arg: {<'/dev/null'>}
                        )
                        (Redir
                          op: <Id.Redir_GreatAnd '2>&'>
                          loc: (redir_loc.Fd fd:2)
                          arg: {<1>}
                        )
                      ]
                      do_fork: T
                    )
                  ]
                  ops: [<Id.Op_Pipe _>]
                )
                (command.ShAssignment
                  left: <Id.Lit_VarLike 'rc='>
                  pairs: [
                    (AssignPair
                      left: <Id.Lit_VarLike 'rc='>
                      lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'rc='> name:rc)
                      op: assign_op.Equal
                      rhs: {($ Id.VSub_QMark '?')}
                    )
                  ]
                  redirects: []
                )
              ]
              ops: [<Id.Op_DPipe _>]
            )
            (command.If
              if_kw: <Id.KW_If if>
              arms: [
                (IfArm
                  keyword: <Id.KW_If if>
                  cond: 
                    (condition.Shell
                      commands: [
                        (command.Sentence
                          child: 
                            (command.DBracket
                              left: <Id.KW_DLeftBracket '[['>
                              expr: 
                                (bool_expr.Binary
                                  op_id: Id.BoolBinary_ne
                                  left: {(${ Id.VSub_Name rc)}
                                  right: {<0>}
                                )
                              right: <Id.Lit_DRightBracket ']]'>
                              redirects: []
                            )
                          terminator: <Id.Op_Semi _>
                        )
                      ]
                    )
                  then_kw: <Id.KW_Then then>
                  action: [
                    (command.Simple
                      blame_tok: <kube>
                      more_env: []
                      words: [
                        {<kube> <Id.Lit_Colon ':'> <Id.Lit_Colon ':'> <log> <Id.Lit_Colon ':'> 
                          <Id.Lit_Colon ':'> <error>
                        }
                        {
                          (DQ <'ERROR: Cannot find image '> 
                            (word_part.EscapedLiteral
                              token: <Id.Lit_EscapedChar '\\"'>
                              ch: '"'
                            ) (${ Id.VSub_Name PHOTON_IMAGE) (word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\"'> ch:'"')
                          )
                        }
                      ]
                      redirects: []
                      do_fork: T
                    )
                    (command.ControlFlow
                      keyword: <Id.ControlFlow_Exit exit>
                      arg_word: {<1>}
                    )
                  ]
                  spids: [7045 7060]
                )
              ]
              else_action: []
              fi_kw: <Id.KW_Fi fi>
              redirects: []
            )
            (command.ShAssignment
              left: <Id.Lit_VarLike 'rc='>
              pairs: [
                (AssignPair
                  left: <Id.Lit_VarLike 'rc='>
                  lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'rc='> name:rc)
                  op: assign_op.Equal
                  rhs: {<0>}
                )
              ]
              redirects: []
            )
            (command.AndOr
              children: [
                (command.Pipeline
                  children: [
                    (command.Simple
                      blame_tok: <Id.Left_DollarBrace '${'>
                      more_env: []
                      words: [{(${ Id.VSub_Name PHOTON)} {<image>} {<list>}]
                      redirects: []
                      do_fork: T
                    )
                    (command.Simple
                      blame_tok: <grep>
                      more_env: []
                      words: [
                        {<grep>}
                        {
                          (SingleQuoted
                            left: <Id.Left_DollarSingleQuote '$\''>
                            tokens: [<Id.Char_OneChar '\\t'>]
                            right: <Id.Right_SingleQuote '\''>
                          ) (DQ (${ Id.VSub_Name PHOTON_IMAGE)) 
                          (SingleQuoted
                            left: <Id.Left_DollarSingleQuote '$\''>
                            tokens: [<Id.Char_OneChar '\\t'>]
                            right: <Id.Right_SingleQuote '\''>
                          )
                        }
                      ]
                      redirects: []
                      do_fork: T
                    )
                    (command.Simple
                      blame_tok: <grep>
                      more_env: []
                      words: [{<grep>} {<ERROR>}]
                      redirects: [
                        (Redir
                          op: <Id.Redir_Great '>'>
                          loc: (redir_loc.Fd fd:1)
                          arg: {<'/dev/null'>}
                        )
                        (Redir
                          op: <Id.Redir_GreatAnd '2>&'>
                          loc: (redir_loc.Fd fd:2)
                          arg: {<1>}
                        )
                      ]
                      do_fork: T
                    )
                  ]
                  ops: [<Id.Op_Pipe _> <Id.Op_Pipe _>]
                )
                (command.ShAssignment
                  left: <Id.Lit_VarLike 'rc='>
                  pairs: [
                    (AssignPair
                      left: <Id.Lit_VarLike 'rc='>
                      lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'rc='> name:rc)
                      op: assign_op.Equal
                      rhs: {($ Id.VSub_QMark '?')}
                    )
                  ]
                  redirects: []
                )
              ]
              ops: [<Id.Op_DPipe _>]
            )
            (command.If
              if_kw: <Id.KW_If if>
              arms: [
                (IfArm
                  keyword: <Id.KW_If if>
                  cond: 
                    (condition.Shell
                      commands: [
                        (command.Sentence
                          child: 
                            (command.DBracket
                              left: <Id.KW_DLeftBracket '[['>
                              expr: 
                                (bool_expr.Binary
                                  op_id: Id.BoolBinary_eq
                                  left: {(${ Id.VSub_Name rc)}
                                  right: {<0>}
                                )
                              right: <Id.Lit_DRightBracket ']]'>
                              redirects: []
                            )
                          terminator: <Id.Op_Semi _>
                        )
                      ]
                    )
                  then_kw: <Id.KW_Then then>
                  action: [
                    (command.Simple
                      blame_tok: <echo>
                      more_env: []
                      words: [
                        {<echo>}
                        {
                          (DQ <'Warning: You have at least one '> (${ Id.VSub_Name PHOTON_IMAGE) 
                            <' image in the ERROR state. You may want to investigate.'>
                          )
                        }
                      ]
                      redirects: []
                      do_fork: T
                    )
                    (command.Simple
                      blame_tok: <echo>
                      more_env: []
                      words: [{<echo>} {(DQ <'Images in the ERROR state will be ignored.'>)}]
                      redirects: []
                      do_fork: T
                    )
                  ]
                  spids: [7137 7152]
                )
              ]
              else_action: []
              fi_kw: <Id.KW_Fi fi>
              redirects: []
            )
            (command.ShAssignment
              left: <Id.Lit_VarLike 'rc='>
              pairs: [
                (AssignPair
                  left: <Id.Lit_VarLike 'rc='>
                  lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'rc='> name:rc)
                  op: assign_op.Equal
                  rhs: {<0>}
                )
              ]
              redirects: []
            )
            (command.ShAssignment
              left: <Id.Lit_VarLike 'num_images='>
              pairs: [
                (AssignPair
                  left: <Id.Lit_VarLike 'num_images='>
                  lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'num_images='> name:num_images)
                  op: assign_op.Equal
                  rhs: 
                    {
                      (CommandSub
                        left_token: <Id.Left_DollarParen '$('>
                        child: 
                          (command.Pipeline
                            children: [
                              (command.Simple
                                blame_tok: <Id.Left_DollarBrace '${'>
                                more_env: []
                                words: [{(${ Id.VSub_Name PHOTON)} {<image>} {<list>}]
                                redirects: []
                                do_fork: T
                              )
                              (command.Simple
                                blame_tok: <grep>
                                more_env: []
                                words: [
                                  {<grep>}
                                  {
                                    (SingleQuoted
                                      left: <Id.Left_DollarSingleQuote '$\''>
                                      tokens: [<Id.Char_OneChar '\\t'>]
                                      right: <Id.Right_SingleQuote '\''>
                                    ) (DQ (${ Id.VSub_Name PHOTON_IMAGE)) 
                                    (SingleQuoted
                                      left: <Id.Left_DollarSingleQuote '$\''>
                                      tokens: [<Id.Char_OneChar '\\t'>]
                                      right: <Id.Right_SingleQuote '\''>
                                    )
                                  }
                                ]
                                redirects: []
                                do_fork: T
                              )
                              (command.Simple
                                blame_tok: <grep>
                                more_env: []
                                words: [{<grep>} {<-c>} {<READY>}]
                                redirects: []
                                do_fork: T
                              )
                            ]
                            ops: [<Id.Op_Pipe _> <Id.Op_Pipe _>]
                          )
                        right: <Id.Eof_RParen _>
                      )
                    }
                )
              ]
              redirects: []
            )
            (command.If
              if_kw: <Id.KW_If if>
              arms: [
                (IfArm
                  keyword: <Id.KW_If if>
                  cond: 
                    (condition.Shell
                      commands: [
                        (command.Sentence
                          child: 
                            (command.DBracket
                              left: <Id.KW_DLeftBracket '[['>
                              expr: 
                                (bool_expr.Binary
                                  op_id: Id.BoolBinary_gt
                                  left: {(DQ (${ Id.VSub_Name num_images))}
                                  right: {<1>}
                                )
                              right: <Id.Lit_DRightBracket ']]'>
                              redirects: []
                            )
                          terminator: <Id.Op_Semi _>
                        )
                      ]
                    )
                  then_kw: <Id.KW_Then then>
                  action: [
                    (command.Simple
                      blame_tok: <echo>
                      more_env: []
                      words: [
                        {<echo>}
                        {
                          (DQ <'ERROR: You have more than one READY '> (${ Id.VSub_Name PHOTON_IMAGE) 
                            <' image. Ensure there is only one'>
                          )
                        }
                      ]
                      redirects: []
                      do_fork: T
                    )
                    (command.ControlFlow
                      keyword: <Id.ControlFlow_Exit exit>
                      arg_word: {<1>}
                    )
                  ]
                  spids: [7217 7234]
                )
              ]
              else_action: []
              fi_kw: <Id.KW_Fi fi>
              redirects: []
            )
          ]
          redirects: []
          right: <Id.Lit_RBrace '}'>
        )
    )
    (command.ShFunction
      keyword: <Id.KW_Function function>
      name_tok: <verify-photon-tenant>
      name: verify-photon-tenant
      body: 
        (BraceGroup
          left: <Id.Lit_LBrace '{'>
          children: [
            (command.Simple
              blame_tok: <local>
              more_env: []
              words: [{<local>} {<rc>}]
              redirects: []
              do_fork: T
            )
            (command.ShAssignment
              left: <Id.Lit_VarLike 'rc='>
              pairs: [
                (AssignPair
                  left: <Id.Lit_VarLike 'rc='>
                  lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'rc='> name:rc)
                  op: assign_op.Equal
                  rhs: {<0>}
                )
              ]
              redirects: []
            )
            (command.AndOr
              children: [
                (command.Pipeline
                  children: [
                    (command.Simple
                      blame_tok: <Id.Left_DollarBrace '${'>
                      more_env: []
                      words: [{(${ Id.VSub_Name PHOTON)} {<tenant>} {<list>}]
                      redirects: []
                      do_fork: T
                    )
                    (command.Simple
                      blame_tok: <grep>
                      more_env: []
                      words: [
                        {<grep>}
                        {<-q>}
                        {
                          (SingleQuoted
                            left: <Id.Left_DollarSingleQuote '$\''>
                            tokens: [<Id.Char_OneChar '\\t'>]
                            right: <Id.Right_SingleQuote '\''>
                          ) (DQ (${ Id.VSub_Name PHOTON_TENANT))
                        }
                      ]
                      redirects: [
                        (Redir
                          op: <Id.Redir_Great '>'>
                          loc: (redir_loc.Fd fd:1)
                          arg: {<'/dev/null'>}
                        )
                        (Redir
                          op: <Id.Redir_GreatAnd '2>&'>
                          loc: (redir_loc.Fd fd:2)
                          arg: {<1>}
                        )
                      ]
                      do_fork: T
                    )
                  ]
                  ops: [<Id.Op_Pipe _>]
                )
                (command.ShAssignment
                  left: <Id.Lit_VarLike 'rc='>
                  pairs: [
                    (AssignPair
                      left: <Id.Lit_VarLike 'rc='>
                      lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'rc='> name:rc)
                      op: assign_op.Equal
                      rhs: {($ Id.VSub_QMark '?')}
                    )
                  ]
                  redirects: []
                )
              ]
              ops: [<Id.Op_DPipe _>]
            )
            (command.If
              if_kw: <Id.KW_If if>
              arms: [
                (IfArm
                  keyword: <Id.KW_If if>
                  cond: 
                    (condition.Shell
                      commands: [
                        (command.Sentence
                          child: 
                            (command.DBracket
                              left: <Id.KW_DLeftBracket '[['>
                              expr: 
                                (bool_expr.Binary
                                  op_id: Id.BoolBinary_ne
                                  left: {(${ Id.VSub_Name rc)}
                                  right: {<0>}
                                )
                              right: <Id.Lit_DRightBracket ']]'>
                              redirects: []
                            )
                          terminator: <Id.Op_Semi _>
                        )
                      ]
                    )
                  then_kw: <Id.KW_Then then>
                  action: [
                    (command.Simple
                      blame_tok: <echo>
                      more_env: []
                      words: [
                        {<echo>}
                        {
                          (DQ <'ERROR: Cannot find tenant '> 
                            (word_part.EscapedLiteral
                              token: <Id.Lit_EscapedChar '\\"'>
                              ch: '"'
                            ) (${ Id.VSub_Name PHOTON_TENANT) (word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\"'> ch:'"')
                          )
                        }
                      ]
                      redirects: []
                      do_fork: T
                    )
                    (command.ControlFlow
                      keyword: <Id.ControlFlow_Exit exit>
                      arg_word: {<1>}
                    )
                  ]
                  spids: [7311 7326]
                )
              ]
              else_action: []
              fi_kw: <Id.KW_Fi fi>
              redirects: []
            )
            (command.AndOr
              children: [
                (command.Pipeline
                  children: [
                    (command.Simple
                      blame_tok: <Id.Left_DollarBrace '${'>
                      more_env: []
                      words: [
                        {(${ Id.VSub_Name PHOTON)}
                        {<project>}
                        {<list>}
                        {<--tenant>}
                        {(DQ (${ Id.VSub_Name PHOTON_TENANT))}
                      ]
                      redirects: []
                      do_fork: T
                    )
                    (command.Simple
                      blame_tok: <grep>
                      more_env: []
                      words: [
                        {<grep>}
                        {<-q>}
                        {
                          (SingleQuoted
                            left: <Id.Left_DollarSingleQuote '$\''>
                            tokens: [<Id.Char_OneChar '\\t'>]
                            right: <Id.Right_SingleQuote '\''>
                          ) (DQ (${ Id.VSub_Name PHOTON_PROJECT)) 
                          (SingleQuoted
                            left: <Id.Left_DollarSingleQuote '$\''>
                            tokens: [<Id.Char_OneChar '\\t'>]
                            right: <Id.Right_SingleQuote '\''>
                          )
                        }
                      ]
                      redirects: [
                        (Redir
                          op: <Id.Redir_Great '>'>
                          loc: (redir_loc.Fd fd:1)
                          arg: {<'/dev/null'>}
                        )
                        (Redir
                          op: <Id.Redir_GreatAnd '2>&'>
                          loc: (redir_loc.Fd fd:2)
                          arg: {<1>}
                        )
                      ]
                      do_fork: T
                    )
                  ]
                  ops: [<Id.Op_Pipe _>]
                )
                (command.ShAssignment
                  left: <Id.Lit_VarLike 'rc='>
                  pairs: [
                    (AssignPair
                      left: <Id.Lit_VarLike 'rc='>
                      lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'rc='> name:rc)
                      op: assign_op.Equal
                      rhs: {($ Id.VSub_QMark '?')}
                    )
                  ]
                  redirects: []
                )
              ]
              ops: [<Id.Op_DPipe _>]
            )
            (command.If
              if_kw: <Id.KW_If if>
              arms: [
                (IfArm
                  keyword: <Id.KW_If if>
                  cond: 
                    (condition.Shell
                      commands: [
                        (command.Sentence
                          child: 
                            (command.DBracket
                              left: <Id.KW_DLeftBracket '[['>
                              expr: 
                                (bool_expr.Binary
                                  op_id: Id.BoolBinary_ne
                                  left: {(${ Id.VSub_Name rc)}
                                  right: {<0>}
                                )
                              right: <Id.Lit_DRightBracket ']]'>
                              redirects: []
                            )
                          terminator: <Id.Op_Semi _>
                        )
                      ]
                    )
                  then_kw: <Id.KW_Then then>
                  action: [
                    (command.Simple
                      blame_tok: <echo>
                      more_env: []
                      words: [
                        {<echo>}
                        {
                          (DQ <'ERROR: Cannot find project '> 
                            (word_part.EscapedLiteral
                              token: <Id.Lit_EscapedChar '\\"'>
                              ch: '"'
                            ) (${ Id.VSub_Name PHOTON_PROJECT) (word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\"'> ch:'"')
                          )
                        }
                      ]
                      redirects: []
                      do_fork: T
                    )
                    (command.ControlFlow
                      keyword: <Id.ControlFlow_Exit exit>
                      arg_word: {<1>}
                    )
                  ]
                  spids: [7397 7412]
                )
              ]
              else_action: []
              fi_kw: <Id.KW_Fi fi>
              redirects: []
            )
          ]
          redirects: []
          right: <Id.Lit_RBrace '}'>
        )
    )
    (command.ShFunction
      keyword: <Id.KW_Function function>
      name_tok: <verify-cmd-in-path>
      name: verify-cmd-in-path
      body: 
        (BraceGroup
          left: <Id.Lit_LBrace '{'>
          children: [
            (command.ShAssignment
              left: <Id.Lit_VarLike 'cmd='>
              pairs: [
                (AssignPair
                  left: <Id.Lit_VarLike 'cmd='>
                  lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'cmd='> name:cmd)
                  op: assign_op.Equal
                  rhs: {(${ Id.VSub_Number 1)}
                )
              ]
              redirects: []
            )
            (command.AndOr
              children: [
                (command.Simple
                  blame_tok: <which>
                  more_env: []
                  words: [{<which>} {(DQ (${ Id.VSub_Name cmd))}]
                  redirects: [
                    (Redir
                      op: <Id.Redir_Great '>'>
                      loc: (redir_loc.Fd fd:1)
                      arg: {<'/dev/null'>}
                    )
                  ]
                  do_fork: T
                )
                (BraceGroup
                  left: <Id.Lit_LBrace '{'>
                  children: [
                    (command.Simple
                      blame_tok: <kube>
                      more_env: []
                      words: [
                        {<kube> <Id.Lit_Colon ':'> <Id.Lit_Colon ':'> <log> <Id.Lit_Colon ':'> 
                          <Id.Lit_Colon ':'> <error>
                        }
                        {
                          (DQ <'Can\'t find '> (${ Id.VSub_Name cmd) 
                            <' in PATH, please install and retry.'>
                          )
                        }
                      ]
                      redirects: []
                      do_fork: T
                    )
                    (command.ControlFlow
                      keyword: <Id.ControlFlow_Exit exit>
                      arg_word: {<1>}
                    )
                  ]
                  redirects: []
                  right: <Id.Lit_RBrace '}'>
                )
              ]
              ops: [<Id.Op_DPipe _>]
            )
          ]
          redirects: []
          right: <Id.Lit_RBrace '}'>
        )
    )
    (command.ShFunction
      keyword: <Id.KW_Function function>
      name_tok: <try-until-success-ssh>
      name: try-until-success-ssh
      body: 
        (BraceGroup
          left: <Id.Lit_LBrace '{'>
          children: [
            (command.Simple
              blame_tok: <local>
              more_env: []
              words: [{<local>} {<Id.Lit_VarLike 'vm_ip='> (${ Id.VSub_Number 1)}]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <local>
              more_env: []
              words: [{<local>} {<Id.Lit_VarLike 'cmd_description='> (${ Id.VSub_Number 2)}]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <local>
              more_env: []
              words: [{<local>} {<Id.Lit_VarLike 'cmd='> (${ Id.VSub_Number 3)}]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <local>
              more_env: []
              words: [{<local>} {<Id.Lit_VarLike 'timeout='> <600>}]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <local>
              more_env: []
              words: [{<local>} {<Id.Lit_VarLike 'sleep_time='> <5>}]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <local>
              more_env: []
              words: [{<local>} {<max_attempts>}]
              redirects: []
              do_fork: T
            )
            (command.DParen
              left: <Id.Op_DLeftParen _>
              child: 
                (arith_expr.BinaryAssign
                  op_id: Id.Arith_Equal
                  left: ($ Id.Lit_ArithVarLike max_attempts)
                  right: 
                    (arith_expr.Binary
                      op_id: Id.Arith_Slash
                      left: ($ Id.Lit_ArithVarLike timeout)
                      right: ($ Id.Lit_ArithVarLike sleep_time)
                    )
                )
              right: <Id.Op_DRightParen _>
              redirects: []
            )
            (command.Simple
              blame_tok: <kube>
              more_env: []
              words: [
                {<kube> <Id.Lit_Colon ':'> <Id.Lit_Colon ':'> <log> <Id.Lit_Colon ':'> <Id.Lit_Colon ':'> 
                  <status>
                }
                {(DQ (${ Id.VSub_Name cmd_description) <' for up to 10 minutes...'>)}
              ]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <local>
              more_env: []
              words: [{<local>} {<Id.Lit_VarLike 'attempt='> <0>}]
              redirects: []
              do_fork: T
            )
            (command.WhileUntil
              keyword: <Id.KW_While while>
              cond: 
                (condition.Shell
                  commands: [
                    (command.Sentence
                      child: 
                        (command.Simple
                          blame_tok: <true>
                          more_env: []
                          words: [{<true>}]
                          redirects: []
                          do_fork: T
                        )
                      terminator: <Id.Op_Semi _>
                    )
                  ]
                )
              body: 
                (command.DoGroup
                  left: <Id.KW_Do do>
                  children: [
                    (command.Simple
                      blame_tok: <local>
                      more_env: []
                      words: [{<local>} {<Id.Lit_VarLike 'rc='> <0>}]
                      redirects: []
                      do_fork: T
                    )
                    (command.AndOr
                      children: [
                        (command.Simple
                          blame_tok: <run-ssh-cmd>
                          more_env: []
                          words: [
                            {<run-ssh-cmd>}
                            {<-i>}
                            {(DQ (${ Id.VSub_Name vm_ip))}
                            {(DQ (${ Id.VSub_Name cmd))}
                          ]
                          redirects: []
                          do_fork: T
                        )
                        (command.ShAssignment
                          left: <Id.Lit_VarLike 'rc='>
                          pairs: [
                            (AssignPair
                              left: <Id.Lit_VarLike 'rc='>
                              lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'rc='> name:rc)
                              op: assign_op.Equal
                              rhs: {<1>}
                            )
                          ]
                          redirects: []
                        )
                      ]
                      ops: [<Id.Op_DPipe _>]
                    )
                    (command.If
                      if_kw: <Id.KW_If if>
                      arms: [
                        (IfArm
                          keyword: <Id.KW_If if>
                          cond: 
                            (condition.Shell
                              commands: [
                                (command.Sentence
                                  child: 
                                    (command.DBracket
                                      left: <Id.KW_DLeftBracket '[['>
                                      expr: 
                                        (bool_expr.Binary
                                          op_id: Id.BoolBinary_GlobNEqual
                                          left: {(${ Id.VSub_Name rc)}
                                          right: {<0>}
                                        )
                                      right: <Id.Lit_DRightBracket ']]'>
                                      redirects: []
                                    )
                                  terminator: <Id.Op_Semi _>
                                )
                              ]
                            )
                          then_kw: <Id.KW_Then then>
                          action: [
                            (command.If
                              if_kw: <Id.KW_If if>
                              arms: [
                                (IfArm
                                  keyword: <Id.KW_If if>
                                  cond: 
                                    (condition.Shell
                                      commands: [
                                        (command.Sentence
                                          child: 
                                            (command.DParen
                                              left: <Id.Op_DLeftParen _>
                                              child: 
                                                (arith_expr.Binary
                                                  op_id: Id.Arith_DEqual
                                                  left: ($ Id.Lit_ArithVarLike attempt)
                                                  right: ($ Id.Lit_ArithVarLike max_attempts)
                                                )
                                              right: <Id.Op_DRightParen _>
                                              redirects: []
                                            )
                                          terminator: <Id.Op_Semi _>
                                        )
                                      ]
                                    )
                                  then_kw: <Id.KW_Then then>
                                  action: [
                                    (command.Simple
                                      blame_tok: <kube>
                                      more_env: []
                                      words: [
                                        {<kube> <Id.Lit_Colon ':'> <Id.Lit_Colon ':'> <log> 
                                          <Id.Lit_Colon ':'> <Id.Lit_Colon ':'> <error>
                                        }
                                        {
                                          (DQ 
                                            <
'Failed, cannot proceed: you may need to retry to log into the VM to debug'
                                            >
                                          )
                                        }
                                      ]
                                      redirects: []
                                      do_fork: T
                                    )
                                    (command.ControlFlow
                                      keyword: <Id.ControlFlow_Exit exit>
                                      arg_word: {<1>}
                                    )
                                  ]
                                  spids: [7653 7667]
                                )
                              ]
                              else_action: []
                              fi_kw: <Id.KW_Fi fi>
                              redirects: []
                            )
                          ]
                          spids: [7635 7650]
                        )
                      ]
                      else_kw: <Id.KW_Else else>
                      else_action: [(command.ControlFlow keyword:<Id.ControlFlow_Break break>)]
                      fi_kw: <Id.KW_Fi fi>
                      redirects: []
                    )
                    (command.ShAssignment
                      left: <Id.Lit_VarLike 'attempt='>
                      pairs: [
                        (AssignPair
                          left: <Id.Lit_VarLike 'attempt='>
                          lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'attempt='> name:attempt)
                          op: assign_op.Equal
                          rhs: 
                            {
                              (word_part.ArithSub
                                left: <Id.Left_DollarDParen '$(('>
                                anode: 
                                  (arith_expr.Binary
                                    op_id: Id.Arith_Plus
                                    left: ($ Id.Lit_ArithVarLike attempt)
                                    right: {<Id.Lit_Digits 1>}
                                  )
                                right: <Id.Right_DollarDParen _>
                              )
                            }
                        )
                      ]
                      redirects: []
                    )
                    (command.Simple
                      blame_tok: <sleep>
                      more_env: []
                      words: [{<sleep>} {(${ Id.VSub_Name sleep_time)}]
                      redirects: []
                      do_fork: T
                    )
                  ]
                  right: <Id.KW_Done done>
                )
              redirects: []
            )
          ]
          redirects: []
          right: <Id.Lit_RBrace '}'>
        )
    )
    (command.ShFunction
      keyword: <Id.KW_Function function>
      name_tok: <try-until-success>
      name: try-until-success
      body: 
        (BraceGroup
          left: <Id.Lit_LBrace '{'>
          children: [
            (command.Simple
              blame_tok: <local>
              more_env: []
              words: [{<local>} {<Id.Lit_VarLike 'cmd_description='> (${ Id.VSub_Number 1)}]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <local>
              more_env: []
              words: [{<local>} {<Id.Lit_VarLike 'cmd='> (${ Id.VSub_Number 2)}]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <local>
              more_env: []
              words: [{<local>} {<Id.Lit_VarLike 'timeout='> <600>}]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <local>
              more_env: []
              words: [{<local>} {<Id.Lit_VarLike 'sleep_time='> <5>}]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <local>
              more_env: []
              words: [{<local>} {<max_attempts>}]
              redirects: []
              do_fork: T
            )
            (command.DParen
              left: <Id.Op_DLeftParen _>
              child: 
                (arith_expr.BinaryAssign
                  op_id: Id.Arith_Equal
                  left: ($ Id.Lit_ArithVarLike max_attempts)
                  right: 
                    (arith_expr.Binary
                      op_id: Id.Arith_Slash
                      left: ($ Id.Lit_ArithVarLike timeout)
                      right: ($ Id.Lit_ArithVarLike sleep_time)
                    )
                )
              right: <Id.Op_DRightParen _>
              redirects: []
            )
            (command.Simple
              blame_tok: <kube>
              more_env: []
              words: [
                {<kube> <Id.Lit_Colon ':'> <Id.Lit_Colon ':'> <log> <Id.Lit_Colon ':'> <Id.Lit_Colon ':'> 
                  <status>
                }
                {(DQ (${ Id.VSub_Name cmd_description) <' for up to 10 minutes...'>)}
              ]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <local>
              more_env: []
              words: [{<local>} {<Id.Lit_VarLike 'attempt='> <0>}]
              redirects: []
              do_fork: T
            )
            (command.WhileUntil
              keyword: <Id.KW_While while>
              cond: 
                (condition.Shell
                  commands: [
                    (command.Sentence
                      child: 
                        (command.Simple
                          blame_tok: <true>
                          more_env: []
                          words: [{<true>}]
                          redirects: []
                          do_fork: T
                        )
                      terminator: <Id.Op_Semi _>
                    )
                  ]
                )
              body: 
                (command.DoGroup
                  left: <Id.KW_Do do>
                  children: [
                    (command.Simple
                      blame_tok: <local>
                      more_env: []
                      words: [{<local>} {<Id.Lit_VarLike 'rc='> <0>}]
                      redirects: []
                      do_fork: T
                    )
                    (command.AndOr
                      children: [
                        (command.Simple
                          blame_tok: <run-cmd>
                          more_env: []
                          words: [{<run-cmd>} {<-i>} {(DQ (${ Id.VSub_Name cmd))}]
                          redirects: []
                          do_fork: T
                        )
                        (command.ShAssignment
                          left: <Id.Lit_VarLike 'rc='>
                          pairs: [
                            (AssignPair
                              left: <Id.Lit_VarLike 'rc='>
                              lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'rc='> name:rc)
                              op: assign_op.Equal
                              rhs: {<1>}
                            )
                          ]
                          redirects: []
                        )
                      ]
                      ops: [<Id.Op_DPipe _>]
                    )
                    (command.If
                      if_kw: <Id.KW_If if>
                      arms: [
                        (IfArm
                          keyword: <Id.KW_If if>
                          cond: 
                            (condition.Shell
                              commands: [
                                (command.Sentence
                                  child: 
                                    (command.DBracket
                                      left: <Id.KW_DLeftBracket '[['>
                                      expr: 
                                        (bool_expr.Binary
                                          op_id: Id.BoolBinary_GlobNEqual
                                          left: {(${ Id.VSub_Name rc)}
                                          right: {<0>}
                                        )
                                      right: <Id.Lit_DRightBracket ']]'>
                                      redirects: []
                                    )
                                  terminator: <Id.Op_Semi _>
                                )
                              ]
                            )
                          then_kw: <Id.KW_Then then>
                          action: [
                            (command.If
                              if_kw: <Id.KW_If if>
                              arms: [
                                (IfArm
                                  keyword: <Id.KW_If if>
                                  cond: 
                                    (condition.Shell
                                      commands: [
                                        (command.Sentence
                                          child: 
                                            (command.DParen
                                              left: <Id.Op_DLeftParen _>
                                              child: 
                                                (arith_expr.Binary
                                                  op_id: Id.Arith_DEqual
                                                  left: ($ Id.Lit_ArithVarLike attempt)
                                                  right: ($ Id.Lit_ArithVarLike max_attempts)
                                                )
                                              right: <Id.Op_DRightParen _>
                                              redirects: []
                                            )
                                          terminator: <Id.Op_Semi _>
                                        )
                                      ]
                                    )
                                  then_kw: <Id.KW_Then then>
                                  action: [
                                    (command.Simple
                                      blame_tok: <kube>
                                      more_env: []
                                      words: [
                                        {<kube> <Id.Lit_Colon ':'> <Id.Lit_Colon ':'> <log> 
                                          <Id.Lit_Colon ':'> <Id.Lit_Colon ':'> <error>
                                        }
                                        {(DQ <'Failed, cannot proceed'>)}
                                      ]
                                      redirects: []
                                      do_fork: T
                                    )
                                    (command.ControlFlow
                                      keyword: <Id.ControlFlow_Exit exit>
                                      arg_word: {<1>}
                                    )
                                  ]
                                  spids: [7843 7857]
                                )
                              ]
                              else_action: []
                              fi_kw: <Id.KW_Fi fi>
                              redirects: []
                            )
                          ]
                          spids: [7825 7840]
                        )
                      ]
                      else_kw: <Id.KW_Else else>
                      else_action: [(command.ControlFlow keyword:<Id.ControlFlow_Break break>)]
                      fi_kw: <Id.KW_Fi fi>
                      redirects: []
                    )
                    (command.ShAssignment
                      left: <Id.Lit_VarLike 'attempt='>
                      pairs: [
                        (AssignPair
                          left: <Id.Lit_VarLike 'attempt='>
                          lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'attempt='> name:attempt)
                          op: assign_op.Equal
                          rhs: 
                            {
                              (word_part.ArithSub
                                left: <Id.Left_DollarDParen '$(('>
                                anode: 
                                  (arith_expr.Binary
                                    op_id: Id.Arith_Plus
                                    left: ($ Id.Lit_ArithVarLike attempt)
                                    right: {<Id.Lit_Digits 1>}
                                  )
                                right: <Id.Right_DollarDParen _>
                              )
                            }
                        )
                      ]
                      redirects: []
                    )
                    (command.Simple
                      blame_tok: <sleep>
                      more_env: []
                      words: [{<sleep>} {(${ Id.VSub_Name sleep_time)}]
                      redirects: []
                      do_fork: T
                    )
                  ]
                  right: <Id.KW_Done done>
                )
              redirects: []
            )
          ]
          redirects: []
          right: <Id.Lit_RBrace '}'>
        )
    )
    (command.ShFunction
      keyword: <Id.KW_Function function>
      name_tok: <trap-add>
      name: trap-add
      body: 
        (BraceGroup
          left: <Id.Lit_LBrace '{'>
          children: [
            (command.Simple
              blame_tok: <local>
              more_env: []
              words: [{<local>} {<Id.Lit_VarLike 'handler='> (DQ (${ Id.VSub_Number 1))}]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <local>
              more_env: []
              words: [
                {<local>}
                {<Id.Lit_VarLike 'signal='> 
                  (DQ 
                    (BracedVarSub
                      left: <Id.Left_DollarBrace '${'>
                      token: <Id.VSub_Number 2>
                      var_name: 2
                      suffix_op: (suffix_op.Unary op:<Id.VTest_Hyphen _> arg_word:{<EXIT>})
                      right: <Id.Right_DollarBrace '}'>
                    )
                  )
                }
              ]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <local>
              more_env: []
              words: [{<local>} {<cur>}]
              redirects: []
              do_fork: T
            )
            (command.ShAssignment
              left: <Id.Lit_VarLike 'cur='>
              pairs: [
                (AssignPair
                  left: <Id.Lit_VarLike 'cur='>
                  lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'cur='> name:cur)
                  op: assign_op.Equal
                  rhs: 
                    {
                      (DQ 
                        (CommandSub
                          left_token: <Id.Left_DollarParen '$('>
                          child: 
                            (command.Simple
                              blame_tok: <eval>
                              more_env: []
                              words: [
                                {<eval>}
                                {
                                  (DQ <'sh -c \'echo '> 
                                    (word_part.EscapedLiteral
                                      token: <Id.Lit_EscapedChar '\\$'>
                                      ch: '$'
                                    ) <'3\' -- '> 
                                    (CommandSub
                                      left_token: <Id.Left_DollarParen '$('>
                                      child: 
                                        (command.Simple
                                          blame_tok: <trap>
                                          more_env: []
                                          words: [{<trap>} {<-p>} {(${ Id.VSub_Name signal)}]
                                          redirects: []
                                          do_fork: T
                                        )
                                      right: <Id.Eof_RParen _>
                                    )
                                  )
                                }
                              ]
                              redirects: []
                              do_fork: T
                            )
                          right: <Id.Eof_RParen _>
                        )
                      )
                    }
                )
              ]
              redirects: []
            )
            (command.If
              if_kw: <Id.KW_If if>
              arms: [
                (IfArm
                  keyword: <Id.KW_If if>
                  cond: 
                    (condition.Shell
                      commands: [
                        (command.Sentence
                          child: 
                            (command.DBracket
                              left: <Id.KW_DLeftBracket '[['>
                              expr: 
                                (bool_expr.Unary
                                  op_id: Id.BoolUnary_n
                                  child: {(DQ (${ Id.VSub_Name cur))}
                                )
                              right: <Id.Lit_DRightBracket ']]'>
                              redirects: []
                            )
                          terminator: <Id.Op_Semi _>
                        )
                      ]
                    )
                  then_kw: <Id.KW_Then then>
                  action: [
                    (command.ShAssignment
                      left: <Id.Lit_VarLike 'handler='>
                      pairs: [
                        (AssignPair
                          left: <Id.Lit_VarLike 'handler='>
                          lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'handler='> name:handler)
                          op: assign_op.Equal
                          rhs: {(DQ (${ Id.VSub_Name cur) <'; '> (${ Id.VSub_Name handler))}
                        )
                      ]
                      redirects: []
                    )
                  ]
                  spids: [7978 7993]
                )
              ]
              else_action: []
              fi_kw: <Id.KW_Fi fi>
              redirects: []
            )
            (command.Simple
              blame_tok: <trap>
              more_env: []
              words: [{<trap>} {(DQ (${ Id.VSub_Name handler))} {(${ Id.VSub_Name signal)}]
              redirects: []
              do_fork: T
            )
          ]
          redirects: []
          right: <Id.Lit_RBrace '}'>
        )
    )
  ]
)