(CommandList
  children: [
    (AndOr
      children: [
        (C {(Lit_Other '[')} {(KW_Bang '!')} {(-z)} 
          {
            (BracedVarSub
              token: <VSub_Name UTIL_SH_DEBUG>
              suffix_op: (StringUnary op_id:VTest_Plus arg_word:{(x)})
              spids: [54 58]
            )
          } {(Lit_Other ']')}
        )
        (C {(set)} {(-x)})
      ]
      op_id: Op_DAmp
    )
    (AndOr
      children: [
        (SimpleCommand
          words: [{(command)} {(-v)} {(kubectl)}]
          redirects: [
            (Redir op_id:Redir_Great fd:16777215 arg_word:{(/dev/null)} spids:[75])
            (Redir op_id:Redir_GreatAnd fd:2 arg_word:{(1)} spids:[78])
          ]
        )
        (BraceGroup
          children: [
            (Sentence
              child: 
                (SimpleCommand
                  words: [{(echo)} {(DQ ('kubectl not found in path. Aborting.'))}]
                  redirects: [(Redir op_id:Redir_GreatAnd fd:16777215 arg_word:{(2)} spids:[87])]
                )
              terminator: <Op_Semi ';'>
            )
            (Sentence child:(C {(exit)} {(1)}) terminator:<Op_Semi ';'>)
          ]
          spids: [83]
        )
      ]
      op_id: Op_DPipe
    )
    (Assignment
      keyword: Assign_None
      pairs: [
        (assign_pair
          lhs: (LhsName name:KUBE_ROOT)
          op: Equal
          rhs: 
            {
              (CommandSubPart
                command_list: 
                  (CommandList
                    children: [(C {(dirname)} {(DQ (${ VSub_Name BASH_SOURCE))})]
                  )
                left_token: <Left_CommandSub '$('>
                spids: [104 112]
              ) (/../..)
            }
          spids: [103]
        )
      ]
      spids: [103]
    )
    (Assignment
      keyword: Assign_Readonly
      pairs: [
        (assign_pair
          lhs: (LhsName name:ROOT)
          op: Equal
          rhs: 
            {
              (CommandSubPart
                command_list: 
                  (CommandList
                    children: [(C {(dirname)} {(DQ (${ VSub_Name BASH_SOURCE))})]
                  )
                left_token: <Left_CommandSub '$('>
                spids: [118 126]
              )
            }
          spids: [117]
        )
      ]
      spids: [115]
    )
    (C {(source)} 
      {
        (DQ ($ VSub_Name '$ROOT') (/) 
          (BracedVarSub
            token: <VSub_Name KUBE_CONFIG_FILE>
            suffix_op: (StringUnary op_id:VTest_ColonHyphen arg_word:{(DQ (config-default.sh))})
            spids: [133 139]
          )
        )
      }
    )
    (C {(source)} {(DQ ($ VSub_Name '$KUBE_ROOT') (/cluster/common.sh))})
    (C {(export)} {(Lit_VarLike 'LIBVIRT_DEFAULT_URI=') (qemu) (Lit_Other ':') (///system)})
    (C {(export)} 
      {(Lit_VarLike 'SERVICE_ACCOUNT_LOOKUP=') 
        (BracedVarSub
          token: <VSub_Name SERVICE_ACCOUNT_LOOKUP>
          suffix_op: (StringUnary op_id:VTest_ColonHyphen arg_word:{(true)})
          spids: [160 164]
        )
      }
    )
    (C {(export)} 
      {(Lit_VarLike 'ADMISSION_CONTROL=') 
        (BracedVarSub
          token: <VSub_Name ADMISSION_CONTROL>
          suffix_op: 
            (StringUnary
              op_id: VTest_ColonHyphen
              arg_word: 
                {
                  (
'Initializers,NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,ResourceQuota'
                  )
                }
            )
          spids: [169 173]
        )
      }
    )
    (Assignment
      keyword: Assign_Readonly
      pairs: [(assign_pair lhs:(LhsName name:POOL) op:Equal rhs:{(kubernetes)} spids:[177])]
      spids: [175]
    )
    (Assignment
      keyword: Assign_Readonly
      pairs: [
        (assign_pair
          lhs: (LhsName name:POOL_PATH)
          op: Equal
          rhs: {(/var/lib/libvirt/images/kubernetes)}
          spids: [182]
        )
      ]
      spids: [180]
    )
    (AndOr
      children: [
        (C {(Lit_Other '[')} {(KW_Bang '!')} {(-d)} {(DQ (${ VSub_Name POOL_PATH))} {(Lit_Other ']')})
        (Subshell
          child: 
            (CommandList
              children: [
                (Sentence
                  child: (C {(echo)} {(DQ ($ VSub_Name '$POOL_PATH'))} {(does)} {(not)} {(exist)})
                  terminator: <Op_Semi ';'>
                )
                (C {(exit)} {(1)})
              ]
            )
          spids: [202 221]
        )
      ]
      op_id: Op_DAmp
    )
    (FuncDef
      name: create-kubelet-kubeconfig
      body: 
        (BraceGroup
          children: [
            (Assignment
              keyword: Assign_Local
              pairs: [
                (assign_pair
                  lhs: (LhsName name:apiserver_address)
                  op: Equal
                  rhs: {(DQ (${ VSub_Number 1))}
                  spids: [241]
                )
              ]
              spids: [239]
            )
            (Assignment
              keyword: Assign_Local
              pairs: [
                (assign_pair
                  lhs: (LhsName name:destination)
                  op: Equal
                  rhs: {(DQ (${ VSub_Number 2))}
                  spids: [251]
                )
              ]
              spids: [249]
            )
            (If
              arms: [
                (if_arm
                  cond: [
                    (Sentence
                      child: 
                        (DBracket
                          expr: 
                            (BoolUnary
                              op_id: BoolUnary_z
                              child: {(DQ (${ VSub_Name apiserver_address))}
                            )
                        )
                      terminator: <Op_Semi ';'>
                    )
                  ]
                  action: [
                    (C {(echo)} 
                      {(DQ ('Must provide API server address to create Kubelet kubeconfig file!'))}
                    )
                    (C {(exit)} {(1)})
                  ]
                  spids: [16777215 274]
                )
              ]
              spids: [16777215 289]
            )
            (If
              arms: [
                (if_arm
                  cond: [
                    (Sentence
                      child: 
                        (DBracket
                          expr: (BoolUnary op_id:BoolUnary_z child:{(DQ (${ VSub_Name destination))})
                        )
                      terminator: <Op_Semi ';'>
                    )
                  ]
                  action: [
                    (C {(echo)} 
                      {(DQ ('Must provide destination path to create Kubelet kubeconfig file!'))}
                    )
                    (C {(exit)} {(1)})
                  ]
                  spids: [16777215 307]
                )
              ]
              spids: [16777215 322]
            )
            (C {(echo)} {(DQ ('Creating Kubelet kubeconfig file'))})
            (Assignment
              keyword: Assign_Local
              pairs: [
                (assign_pair
                  lhs: (LhsName name:dest_dir)
                  op: Equal
                  rhs: 
                    {
                      (DQ 
                        (CommandSubPart
                          command_list: 
                            (CommandList
                              children: [(C {(dirname)} {(DQ (${ VSub_Name destination))})]
                            )
                          left_token: <Left_CommandSub '$('>
                          spids: [336 344]
                        )
                      )
                    }
                  spids: [334]
                )
              ]
              spids: [332]
            )
            (Sentence
              child: (C {(mkdir)} {(-p)} {(DQ (${ VSub_Name dest_dir))})
              terminator: <Op_Amp '&'>
            )
            (AndOr
              children: [
                (SimpleCommand
                  redirects: [
                    (Redir
                      op_id: Redir_Great
                      fd: 16777215
                      arg_word: {(/dev/null)}
                      spids: [359]
                    )
                  ]
                )
                (C {(sudo)} {(mkdir)} {(-p)} {(DQ (${ VSub_Name dest_dir))})
              ]
              op_id: Op_DPipe
            )
            (Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (LhsName name:sudo)
                  op: Equal
                  rhs: 
                    {
                      (CommandSubPart
                        command_list: 
                          (CommandList
                            children: [
                              (AndOr
                                children: [
                                  (C {(test)} {(-w)} {(DQ (${ VSub_Name dest_dir))})
                                  (C {(echo)} {(DQ ('sudo -E'))})
                                ]
                                op_id: Op_DPipe
                              )
                            ]
                          )
                        left_token: <Left_CommandSub '$('>
                        spids: [378 396]
                      )
                    }
                  spids: [377]
                )
              ]
              spids: [377]
            )
            (Pipeline
              children: [
                (SimpleCommand
                  words: [{(cat)}]
                  redirects: [
                    (HereDoc
                      op_id: Redir_DLess
                      fd: 16777215
                      body: 
                        {
                          (DQ ('apiVersion: v1\n') ('kind: Config\n') ('clusters:\n') ('  - cluster:\n') 
                            ('      server: ') (${ VSub_Name apiserver_address) ('\n') ('    name: local\n') ('contexts:\n') ('  - context:\n') 
                            ('      cluster: local\n') ('    name: local\n') ('current-context: local\n')
                          )
                        }
                      do_expansion: True
                      here_end: EOF
                      was_filled: True
                      spids: [401]
                    )
                  ]
                )
                (SimpleCommand
                  words: [{(${ VSub_Name sudo)} {(tee)} {(DQ (${ VSub_Name destination))}]
                  redirects: [
                    (Redir
                      op_id: Redir_Great
                      fd: 16777215
                      arg_word: {(/dev/null)}
                      spids: [418]
                    )
                  ]
                )
              ]
              negated: False
            )
          ]
          spids: [236]
        )
      spids: [230 235]
    )
    (FuncDef
      name: join
      body: 
        (BraceGroup
          children: [
            (Assignment
              keyword: Assign_Local
              pairs: [
                (assign_pair
                  lhs: (LhsName name:IFS)
                  op: Equal
                  rhs: {(DQ ($ VSub_Number '$1'))}
                  spids: [465]
                )
              ]
              spids: [463]
            )
            (C {(shift)})
            (C {(echo)} {(DQ ($ VSub_Star '$*'))})
          ]
          spids: [460]
        )
      spids: [456 459]
    )
    (FuncDef
      name: detect-master
      body: 
        (BraceGroup
          children: [
            (Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (LhsName name:KUBE_MASTER_IP)
                  op: Equal
                  rhs: {($ VSub_Name '$MASTER_IP')}
                  spids: [493]
                )
              ]
              spids: [493]
            )
            (Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (LhsName name:KUBE_MASTER)
                  op: Equal
                  rhs: {($ VSub_Name '$MASTER_NAME')}
                  spids: [497]
                )
              ]
              spids: [497]
            )
            (C {(export)} 
              {(Lit_VarLike 'KUBERNETES_MASTER=') (http) (Lit_Other ':') (//) 
                ($ VSub_Name '$KUBE_MASTER_IP') (Lit_Other ':') (8080)
              }
            )
            (C {(echo)} {(DQ ('KUBE_MASTER_IP: ') ($ VSub_Name '$KUBE_MASTER_IP'))})
            (C {(echo)} {(DQ ('KUBE_MASTER: ') ($ VSub_Name '$KUBE_MASTER'))})
          ]
          spids: [490]
        )
      spids: [486 489]
    )
    (FuncDef
      name: detect-nodes
      body: 
        (BraceGroup
          children: [
            (Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (LhsName name:KUBE_NODE_IP_ADDRESSES)
                  op: Equal
                  rhs: 
                    {
                      (ArrayLiteralPart
                        words: [
                          {
                            (DQ 
                              (BracedVarSub
                                token: <VSub_Name NODE_IPS>
                                bracket_op: (WholeArray op_id:Lit_At)
                                spids: [543 548]
                              )
                            )
                          }
                        ]
                      )
                    }
                  spids: [540]
                )
              ]
              spids: [540]
            )
          ]
          spids: [537]
        )
      spids: [533 536]
    )
    (FuncDef
      name: generate_certs
      body: 
        (BraceGroup
          children: [
            (Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (LhsName name:node_names)
                  op: Equal
                  rhs: {(ArrayLiteralPart words:[{(DQ (${ VSub_At '@'))}])}
                  spids: [562]
                )
              ]
              spids: [562]
            )
            (Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (LhsName name:tempdir)
                  op: Equal
                  rhs: 
                    {
                      (CommandSubPart
                        command_list: (CommandList children:[(C {(mktemp)} {(-d)})])
                        left_token: <Left_CommandSub '$('>
                        spids: [577 581]
                      )
                    }
                  spids: [576]
                )
              ]
              spids: [576]
            )
            (Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (LhsName name:CA_KEY)
                  op: Equal
                  rhs: 
                    {
                      (BracedVarSub
                        token: <VSub_Name CA_KEY>
                        suffix_op: 
                          (StringUnary
                            op_id: VTest_ColonHyphen
                            arg_word: {(DQ ($ VSub_Name '$tempdir') (/ca-key.pem))}
                          )
                        spids: [585 592]
                      )
                    }
                  spids: [584]
                )
              ]
              spids: [584]
            )
            (Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (LhsName name:CA_CERT)
                  op: Equal
                  rhs: 
                    {
                      (BracedVarSub
                        token: <VSub_Name CA_CERT>
                        suffix_op: 
                          (StringUnary
                            op_id: VTest_ColonHyphen
                            arg_word: {(DQ ($ VSub_Name '$tempdir') (/ca.pem))}
                          )
                        spids: [596 603]
                      )
                    }
                  spids: [595]
                )
              ]
              spids: [595]
            )
            (SimpleCommand
              words: [{(openssl)} {(genrsa)} {(-out)} {(DQ (${ VSub_Name CA_KEY))} {(2048)}]
              redirects: [(Redir op_id:Redir_Great fd:2 arg_word:{(/dev/null)} spids:[620])]
            )
            (SimpleCommand
              words: [
                {(openssl)}
                {(req)}
                {(-x509)}
                {(-new)}
                {(-nodes)}
                {(-key)}
                {(DQ (${ VSub_Name CA_KEY))}
                {(-days)}
                {(10000)}
                {(-out)}
                {(DQ (${ VSub_Name CA_CERT))}
                {(-subj)}
                {(DQ ('/CN=kube-ca'))}
              ]
              redirects: [(Redir op_id:Redir_Great fd:2 arg_word:{(/dev/null)} spids:[660])]
            )
            (Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (LhsName name:KUBE_KEY)
                  op: Equal
                  rhs: 
                    {
                      (BracedVarSub
                        token: <VSub_Name KUBE_KEY>
                        suffix_op: 
                          (StringUnary
                            op_id: VTest_ColonHyphen
                            arg_word: {(DQ ($ VSub_Name '$tempdir') (/apiserver-key.pem))}
                          )
                        spids: [670 677]
                      )
                    }
                  spids: [669]
                )
              ]
              spids: [669]
            )
            (Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (LhsName name:API_SERVER_CERT_REQ)
                  op: Equal
                  rhs: 
                    {
                      (BracedVarSub
                        token: <VSub_Name API_SERVER_CERT_REQ>
                        suffix_op: 
                          (StringUnary
                            op_id: VTest_ColonHyphen
                            arg_word: {(DQ ($ VSub_Name '$tempdir') (/apiserver.csr))}
                          )
                        spids: [681 688]
                      )
                    }
                  spids: [680]
                )
              ]
              spids: [680]
            )
            (SimpleCommand
              words: [{(openssl)} {(genrsa)} {(-out)} {(DQ (${ VSub_Name KUBE_KEY))} {(2048)}]
              redirects: [(Redir op_id:Redir_Great fd:2 arg_word:{(/dev/null)} spids:[705])]
            )
            (SimpleCommand
              words: [
                {(openssl)}
                {(req)}
                {(-new)}
                {(-key)}
                {(DQ (${ VSub_Name KUBE_KEY))}
                {(-out)}
                {(DQ (${ VSub_Name API_SERVER_CERT_REQ))}
                {(-subj)}
                {(DQ ('/CN=kube-apiserver'))}
                {(-config)}
                {(cluster/libvirt-coreos/openssl.cnf)}
              ]
              redirects: [(Redir op_id:Redir_Great fd:2 arg_word:{(/dev/null)} spids:[749])]
              more_env: [
                (env_pair
                  name: KUBERNETES_SVC
                  val: 
                    {
                      (BracedVarSub
                        token: <VSub_Name SERVICE_CLUSTER_IP_RANGE>
                        suffix_op: (StringUnary op_id:VOp1_Percent arg_word:{('.*')})
                        spids: [710 714]
                      ) (.1)
                    }
                  spids: [709]
                )
              ]
            )
            (Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (LhsName name:KUBE_CERT)
                  op: Equal
                  rhs: 
                    {
                      (BracedVarSub
                        token: <VSub_Name KUBE_CERT>
                        suffix_op: 
                          (StringUnary
                            op_id: VTest_ColonHyphen
                            arg_word: {(DQ ($ VSub_Name '$tempdir') (/apiserver.pem))}
                          )
                        spids: [754 761]
                      )
                    }
                  spids: [753]
                )
              ]
              spids: [753]
            )
            (SimpleCommand
              words: [
                {(openssl)}
                {(x509)}
                {(-req)}
                {(-in)}
                {(DQ (${ VSub_Name API_SERVER_CERT_REQ))}
                {(-CA)}
                {(DQ (${ VSub_Name CA_CERT))}
                {(-CAkey)}
                {(DQ (${ VSub_Name CA_KEY))}
                {(-CAcreateserial)}
                {(-out)}
                {(DQ (${ VSub_Name KUBE_CERT))}
                {(-days)}
                {(365)}
                {(-extensions)}
                {(v3_req)}
                {(-extfile)}
                {(cluster/libvirt-coreos/openssl.cnf)}
              ]
              redirects: [(Redir op_id:Redir_Great fd:2 arg_word:{(/dev/null)} spids:[824])]
              more_env: [
                (env_pair
                  name: KUBERNETES_SVC
                  val: 
                    {
                      (BracedVarSub
                        token: <VSub_Name SERVICE_CLUSTER_IP_RANGE>
                        suffix_op: (StringUnary op_id:VOp1_Percent arg_word:{('.*')})
                        spids: [765 769]
                      ) (.1)
                    }
                  spids: [764]
                )
              ]
            )
            (C {(mkdir)} {(-p)} {(DQ ($ VSub_Name '$POOL_PATH') (/kubernetes/certs))})
            (C {(cp)} {(DQ (${ VSub_Name KUBE_CERT))} 
              {(DQ ($ VSub_Name '$POOL_PATH') (/kubernetes/certs))}
            )
            (C {(cp)} {(DQ (${ VSub_Name KUBE_KEY))} 
              {(DQ ($ VSub_Name '$POOL_PATH') (/kubernetes/certs))}
            )
            (C {(cp)} {(DQ (${ VSub_Name CA_CERT))} {(DQ ($ VSub_Name '$POOL_PATH') (/kubernetes/certs))})
            (ForExpr
              init: 
                (BinaryAssign
                  op_id: Arith_Equal
                  left: (LhsName name:i)
                  right: (ArithWord w:{(Lit_Digits 0)})
                )
              cond: 
                (ArithBinary
                  op_id: Arith_Less
                  left: (ArithVarRef name:i)
                  right: (ArithWord w:{($ VSub_Name '$NUM_NODES')})
                )
              update: (UnaryAssign op_id:Node_PostDPlus child:(LhsName name:i))
              body: 
                (DoGroup
                  children: [
                    (SimpleCommand
                      words: [
                        {(openssl)}
                        {(genrsa)}
                        {(-out)}
                        {($ VSub_Name '$tempdir') (/) 
                          (BracedVarSub
                            token: <VSub_Name node_names>
                            bracket_op: (ArrayIndex expr:(ArithWord w:{($ VSub_Name '$i')}))
                            spids: [928 933]
                          ) (-node-key.pem)
                        }
                        {(2048)}
                      ]
                      redirects: [(Redir op_id:Redir_Great fd:2 arg_word:{(/dev/null)} spids:[938])]
                    )
                    (C {(cp)} 
                      {
                        (DQ ($ VSub_Name '$tempdir') (/) 
                          (BracedVarSub
                            token: <VSub_Name node_names>
                            bracket_op: (ArrayIndex expr:(ArithWord w:{($ VSub_Name '$i')}))
                            spids: [947 952]
                          ) (-node-key.pem)
                        )
                      } {(DQ ($ VSub_Name '$POOL_PATH') (/kubernetes/certs))}
                    )
                    (SimpleCommand
                      words: [
                        {(openssl)}
                        {(req)}
                        {(-new)}
                        {(-key)}
                        {($ VSub_Name '$tempdir') (/) 
                          (BracedVarSub
                            token: <VSub_Name node_names>
                            bracket_op: (ArrayIndex expr:(ArithWord w:{($ VSub_Name '$i')}))
                            spids: [980 985]
                          ) (-node-key.pem)
                        }
                        {(-out)}
                        {($ VSub_Name '$tempdir') (/) 
                          (BracedVarSub
                            token: <VSub_Name node_names>
                            bracket_op: (ArrayIndex expr:(ArithWord w:{($ VSub_Name '$i')}))
                            spids: [992 997]
                          ) (-node.csr)
                        }
                        {(-subj)}
                        {
                          (DQ ('/CN=') 
                            (BracedVarSub
                              token: <VSub_Name node_names>
                              bracket_op: (ArrayIndex expr:(ArithWord w:{($ VSub_Name '$i')}))
                              spids: [1004 1009]
                            )
                          )
                        }
                        {(-config)}
                        {(cluster/libvirt-coreos/node-openssl.cnf)}
                      ]
                      redirects: [(Redir op_id:Redir_Great fd:2 arg_word:{(/dev/null)} spids:[1016])]
                      more_env: [
                        (env_pair
                          name: WORKER_IP
                          val: 
                            {
                              (BracedVarSub
                                token: <VSub_Name NODE_IPS>
                                bracket_op: (ArrayIndex expr:(ArithWord w:{($ VSub_Name '$i')}))
                                spids: [963 968]
                              )
                            }
                          spids: [962]
                        )
                      ]
                    )
                    (SimpleCommand
                      words: [
                        {(openssl)}
                        {(x509)}
                        {(-req)}
                        {(-in)}
                        {($ VSub_Name '$tempdir') (/) 
                          (BracedVarSub
                            token: <VSub_Name node_names>
                            bracket_op: (ArrayIndex expr:(ArithWord w:{($ VSub_Name '$i')}))
                            spids: [1038 1043]
                          ) (-node.csr)
                        }
                        {(-CA)}
                        {(DQ (${ VSub_Name CA_CERT))}
                        {(-CAkey)}
                        {(DQ (${ VSub_Name CA_KEY))}
                        {(-CAcreateserial)}
                        {(-out)}
                        {($ VSub_Name '$tempdir') (/) 
                          (BracedVarSub
                            token: <VSub_Name node_names>
                            bracket_op: (ArrayIndex expr:(ArithWord w:{($ VSub_Name '$i')}))
                            spids: [1068 1073]
                          ) (-node.pem)
                        }
                        {(-days)}
                        {(365)}
                        {(-extensions)}
                        {(v3_req)}
                        {(-extfile)}
                        {(cluster/libvirt-coreos/node-openssl.cnf)}
                      ]
                      redirects: [(Redir op_id:Redir_Great fd:2 arg_word:{(/dev/null)} spids:[1088])]
                      more_env: [
                        (env_pair
                          name: WORKER_IP
                          val: 
                            {
                              (BracedVarSub
                                token: <VSub_Name NODE_IPS>
                                bracket_op: (ArrayIndex expr:(ArithWord w:{($ VSub_Name '$i')}))
                                spids: [1021 1026]
                              )
                            }
                          spids: [1020]
                        )
                      ]
                    )
                    (C {(cp)} 
                      {
                        (DQ ($ VSub_Name '$tempdir') (/) 
                          (BracedVarSub
                            token: <VSub_Name node_names>
                            bracket_op: (ArrayIndex expr:(ArithWord w:{($ VSub_Name '$i')}))
                            spids: [1097 1102]
                          ) (-node.pem)
                        )
                      } {(DQ ($ VSub_Name '$POOL_PATH') (/kubernetes/certs))}
                    )
                  ]
                  spids: [917 1112]
                )
            )
            (C {(echo)} {(DQ ('TLS assets generated...'))})
          ]
          spids: [559]
        )
      spids: [555 558]
    )
    (FuncDef
      name: setup_registry_proxy
      body: 
        (BraceGroup
          children: [
            (If
              arms: [
                (if_arm
                  cond: [
                    (Sentence
                      child: 
                        (DBracket
                          expr: 
                            (BoolBinary
                              op_id: BoolBinary_GlobDEqual
                              left: {(DQ ($ VSub_Name '$ENABLE_CLUSTER_REGISTRY'))}
                              right: {(DQ (true))}
                            )
                        )
                      terminator: <Op_Semi ';'>
                    )
                  ]
                  action: [
                    (C {(cp)} 
                      {(DQ (./cluster/saltbase/salt/kube-registry-proxy/kube-registry-proxy.yaml))} {(DQ ($ VSub_Name '$POOL_PATH') (/kubernetes/manifests))}
                    )
                  ]
                  spids: [16777215 1151]
                )
              ]
              spids: [16777215 1166]
            )
          ]
          spids: [1131]
        )
      spids: [1127 1130]
    )
    (FuncDef
      name: verify-prereqs
      body: 
        (BraceGroup
          children: [
            (If
              arms: [
                (if_arm
                  cond: [
                    (Sentence
                      child: 
                        (Pipeline
                          children: [
                            (SimpleCommand
                              words: [{(which)} {(virsh)}]
                              redirects: [
                                (Redir
                                  op_id: Redir_Great
                                  fd: 16777215
                                  arg_word: {(/dev/null)}
                                  spids: [1189]
                                )
                              ]
                            )
                          ]
                          negated: True
                        )
                      terminator: <Op_Semi ';'>
                    )
                  ]
                  action: [
                    (SimpleCommand
                      words: [{(echo)} {(DQ ("Can't find virsh in PATH, please fix and retry."))}]
                      redirects: [
                        (Redir
                          op_id: Redir_GreatAnd
                          fd: 16777215
                          arg_word: {(2)}
                          spids: [1202]
                        )
                      ]
                    )
                    (C {(exit)} {(1)})
                  ]
                  spids: [16777215 1193]
                )
              ]
              spids: [16777215 1211]
            )
            (If
              arms: [
                (if_arm
                  cond: [
                    (Sentence
                      child: 
                        (Pipeline
                          children: [
                            (SimpleCommand
                              words: [{(virsh)} {(nodeinfo)}]
                              redirects: [
                                (Redir
                                  op_id: Redir_Great
                                  fd: 16777215
                                  arg_word: {(/dev/null)}
                                  spids: [1222]
                                )
                              ]
                            )
                          ]
                          negated: True
                        )
                      terminator: <Op_Semi ';'>
                    )
                  ]
                  action: [(C {(exit)} {(1)})]
                  spids: [16777215 1226]
                )
              ]
              spids: [16777215 1234]
            )
            (If
              arms: [
                (if_arm
                  cond: [
                    (Sentence
                      child: 
                        (DBracket
                          expr: 
                            (BoolBinary
                              op_id: BoolBinary_ne
                              left: 
                                {
                                  (DQ 
                                    (CommandSubPart
                                      command_list: 
                                        (CommandList
                                          children: [
                                            (SimpleCommand
                                              redirects: [
                                                (Redir
                                                  op_id: Redir_Less
                                                  fd: 16777215
                                                  arg_word: {(/sys/kernel/mm/ksm/run)}
                                                  spids: [1243]
                                                )
                                              ]
                                            )
                                          ]
                                        )
                                      left_token: <Left_CommandSub '$('>
                                      spids: [1242 1245]
                                    )
                                  )
                                }
                              right: {(DQ (1))}
                            )
                        )
                      terminator: <Op_Semi ';'>
                    )
                  ]
                  action: [
                    (SimpleCommand
                      words: [{(echo)} {(DQ ('KSM is not enabled'))}]
                      redirects: [
                        (Redir
                          op_id: Redir_GreatAnd
                          fd: 16777215
                          arg_word: {(2)}
                          spids: [1266]
                        )
                      ]
                    )
                    (SimpleCommand
                      words: [
                        {(echo)}
                        {(DQ ('Enabling it would reduce the memory footprint of large clusters'))}
                      ]
                      redirects: [
                        (Redir
                          op_id: Redir_GreatAnd
                          fd: 16777215
                          arg_word: {(2)}
                          spids: [1276]
                        )
                      ]
                    )
                    (If
                      arms: [
                        (if_arm
                          cond: [
                            (Sentence
                              child: (DBracket expr:(BoolUnary op_id:BoolUnary_t child:{(0)}))
                              terminator: <Op_Semi ';'>
                            )
                          ]
                          action: [
                            (C {(read)} {(-t)} {(5)} {(-n)} {(1)} {(-p)} 
                              {(DQ ('Do you want to enable KSM (requires root password) (y/n)? '))} {(answer)}
                            )
                            (C {(echo)} {(DQ )})
                            (If
                              arms: [
                                (if_arm
                                  cond: [
                                    (Sentence
                                      child: 
                                        (DBracket
                                          expr: 
                                            (BoolBinary
                                              op_id: BoolBinary_GlobDEqual
                                              left: {(DQ ($ VSub_Name '$answer'))}
                                              right: {(SQ <y>)}
                                            )
                                        )
                                      terminator: <Op_Semi ';'>
                                    )
                                  ]
                                  action: [(C {(su)} {(-c)} {(SQ <'echo 1 > /sys/kernel/mm/ksm/run'>)})]
                                  spids: [16777215 1336]
                                )
                              ]
                              spids: [16777215 1348]
                            )
                          ]
                          spids: [16777215 1291]
                        )
                      ]
                      else_action: [
                        (SimpleCommand
                          words: [{(echo)} {(DQ ('You can enable it with (as root):'))}]
                          redirects: [
                            (Redir
                              op_id: Redir_GreatAnd
                              fd: 16777215
                              arg_word: {(2)}
                              spids: [1360]
                            )
                          ]
                        )
                        (SimpleCommand
                          words: [{(echo)} {(DQ )}]
                          redirects: [
                            (Redir
                              op_id: Redir_GreatAnd
                              fd: 16777215
                              arg_word: {(2)}
                              spids: [1369]
                            )
                          ]
                        )
                        (SimpleCommand
                          words: [{(echo)} {(DQ ('  echo 1 > /sys/kernel/mm/ksm/run'))}]
                          redirects: [
                            (Redir
                              op_id: Redir_GreatAnd
                              fd: 16777215
                              arg_word: {(2)}
                              spids: [1379]
                            )
                          ]
                        )
                        (SimpleCommand
                          words: [{(echo)} {(DQ )}]
                          redirects: [
                            (Redir
                              op_id: Redir_GreatAnd
                              fd: 16777215
                              arg_word: {(2)}
                              spids: [1388]
                            )
                          ]
                        )
                      ]
                      spids: [1351 1392]
                    )
                  ]
                  spids: [16777215 1257]
                )
              ]
              spids: [16777215 1395]
            )
          ]
          spids: [1178]
        )
      spids: [1174 1177]
    )
    (FuncDef
      name: destroy-pool
      body: 
        (BraceGroup
          children: [
            (AndOr
              children: [
                (SimpleCommand
                  words: [{(virsh)} {(pool-info)} {($ VSub_Name '$POOL')}]
                  redirects: [
                    (Redir
                      op_id: Redir_Great
                      fd: 16777215
                      arg_word: {(/dev/null)}
                      spids: [1428]
                    )
                    (Redir op_id:Redir_GreatAnd fd:2 arg_word:{(1)} spids:[1431])
                  ]
                )
                (ControlFlow token:<ControlFlow_Return return>)
              ]
              op_id: Op_DPipe
            )
            (C {(rm)} {(-rf)} {(DQ ($ VSub_Name '$POOL_PATH')) (/kubernetes/) (Lit_Other '*')})
            (C {(rm)} {(-rf)} 
              {(DQ ($ VSub_Name '$POOL_PATH')) (/kubernetes_config) (Lit_Other '*') (/) (Lit_Other '*')}
            )
            (Assignment
              keyword: Assign_Local
              pairs: [(assign_pair lhs:(LhsName name:vol) op:Equal spids:[1466])]
              spids: [1464]
            )
            (Pipeline
              children: [
                (C {(virsh)} {(vol-list)} {($ VSub_Name '$POOL')})
                (C {(awk)} {(SQ <'NR>2 && !/^$/ && $1 ~ /^kubernetes/ {print $1}'>)})
                (While
                  cond: [(Sentence child:(C {(read)} {(vol)}) terminator:<Op_Semi ';'>)]
                  body: 
                    (DoGroup
                      children: [
                        (C {(virsh)} {(vol-delete)} {($ VSub_Name '$vol')} {(--pool)} 
                          {($ VSub_Name '$POOL')}
                        )
                      ]
                      spids: [1494 1508]
                    )
                )
              ]
              negated: False
            )
            (AndOr
              children: [
                (DBracket
                  expr: 
                    (BoolBinary
                      op_id: BoolBinary_GlobDEqual
                      left: {(DQ ($ VSub_Number '$1'))}
                      right: {(SQ <keep_base_image>)}
                    )
                )
                (ControlFlow token:<ControlFlow_Return return>)
              ]
              op_id: Op_DAmp
            )
            (C {(set)} {(Lit_Other '+') (e)})
            (C {(virsh)} {(vol-delete)} {(coreos_base.img)} {(--pool)} {($ VSub_Name '$POOL')})
            (C {(virsh)} {(pool-destroy)} {($ VSub_Name '$POOL')})
            (C {(rmdir)} {(DQ ($ VSub_Name '$POOL_PATH'))})
            (C {(set)} {(-e)})
          ]
          spids: [1419]
        )
      spids: [1415 1418]
    )
    (FuncDef
      name: initialize-pool
      body: 
        (BraceGroup
          children: [
            (C {(mkdir)} {(-p)} {(DQ ($ VSub_Name '$POOL_PATH'))})
            (If
              arms: [
                (if_arm
                  cond: [
                    (Sentence
                      child: 
                        (Pipeline
                          children: [
                            (SimpleCommand
                              words: [{(virsh)} {(pool-info)} {($ VSub_Name '$POOL')}]
                              redirects: [
                                (Redir
                                  op_id: Redir_Great
                                  fd: 16777215
                                  arg_word: {(/dev/null)}
                                  spids: [1605]
                                )
                                (Redir
                                  op_id: Redir_GreatAnd
                                  fd: 2
                                  arg_word: {(1)}
                                  spids: [1608]
                                )
                              ]
                            )
                          ]
                          negated: True
                        )
                      terminator: <Op_Semi ';'>
                    )
                  ]
                  action: [
                    (C {(virsh)} {(pool-create-as)} {($ VSub_Name '$POOL')} {(dir)} {(--target)} 
                      {(DQ ($ VSub_Name '$POOL_PATH'))}
                    )
                  ]
                  spids: [16777215 1612]
                )
              ]
              spids: [16777215 1630]
            )
            (C {(wget)} {(-N)} {(-P)} {(DQ ($ VSub_Name '$ROOT'))} 
              {(https) (Lit_Other ':') (//) 
                (BracedVarSub
                  token: <VSub_Name COREOS_CHANNEL>
                  suffix_op: (StringUnary op_id:VTest_ColonHyphen arg_word:{(alpha)})
                  spids: [1647 1651]
                ) (.release.core-os.net/amd64-usr/current/coreos_production_qemu_image.img.bz2)
              }
            )
            (If
              arms: [
                (if_arm
                  cond: [
                    (Sentence
                      child: 
                        (DBracket
                          expr: 
                            (BoolBinary
                              op_id: BoolBinary_nt
                              left: 
                                {(DQ ($ VSub_Name '$ROOT') (/coreos_production_qemu_image.img.bz2))}
                              right: {(DQ ($ VSub_Name '$POOL_PATH') (/coreos_base.img))}
                            )
                        )
                      terminator: <Op_Semi ';'>
                    )
                  ]
                  action: [
                    (C {(bunzip2)} {(-f)} {(-k)} 
                      {(DQ ($ VSub_Name '$ROOT') (/coreos_production_qemu_image.img.bz2))}
                    )
                    (AndOr
                      children: [
                        (SimpleCommand
                          words: [
                            {(virsh)}
                            {(vol-delete)}
                            {(coreos_base.img)}
                            {(--pool)}
                            {($ VSub_Name '$POOL')}
                          ]
                          redirects: [
                            (Redir
                              op_id: Redir_Great
                              fd: 2
                              arg_word: {(/dev/null)}
                              spids: [1699]
                            )
                          ]
                        )
                        (C {(true)})
                      ]
                      op_id: Op_DPipe
                    )
                  ]
                  spids: [16777215 1674]
                )
              ]
              spids: [16777215 1708]
            )
            (If
              arms: [
                (if_arm
                  cond: [
                    (Sentence
                      child: 
                        (Pipeline
                          children: [
                            (C {(virsh)} {(vol-list)} {($ VSub_Name '$POOL')})
                            (C {(grep)} {(-q)} {(coreos_base.img)})
                          ]
                          negated: True
                        )
                      terminator: <Op_Semi ';'>
                    )
                  ]
                  action: [
                    (C {(virsh)} {(vol-create-as)} {($ VSub_Name '$POOL')} {(coreos_base.img)} {(10G)} 
                      {(--format)} {(qcow2)}
                    )
                    (C {(virsh)} {(vol-upload)} {(coreos_base.img)} 
                      {(DQ ($ VSub_Name '$ROOT') (/coreos_production_qemu_image.img))} {(--pool)} {($ VSub_Name '$POOL')}
                    )
                  ]
                  spids: [16777215 1730]
                )
              ]
              spids: [16777215 1764]
            )
            (C {(mkdir)} {(-p)} {(DQ ($ VSub_Name '$POOL_PATH') (/kubernetes))})
            (C {(kube-push-internal)})
            (C {(mkdir)} {(-p)} {(DQ ($ VSub_Name '$POOL_PATH') (/kubernetes/manifests))})
            (If
              arms: [
                (if_arm
                  cond: [
                    (Sentence
                      child: 
                        (DBracket
                          expr: 
                            (BoolBinary
                              op_id: BoolBinary_GlobDEqual
                              left: {(DQ ($ VSub_Name '$ENABLE_NODE_LOGGING'))}
                              right: {(DQ (true))}
                            )
                        )
                      terminator: <Op_Semi ';'>
                    )
                  ]
                  action: [
                    (If
                      arms: [
                        (if_arm
                          cond: [
                            (Sentence
                              child: 
                                (DBracket
                                  expr: 
                                    (BoolBinary
                                      op_id: BoolBinary_GlobDEqual
                                      left: {(DQ ($ VSub_Name '$LOGGING_DESTINATION'))}
                                      right: {(DQ (elasticsearch))}
                                    )
                                )
                              terminator: <Op_Semi ';'>
                            )
                          ]
                          action: [
                            (C {(cp)} 
                              {
                                (DQ ($ VSub_Name '$KUBE_ROOT') 
                                  (/cluster/saltbase/salt/fluentd-es/fluentd-es.manifest)
                                )
                              } {(DQ ($ VSub_Name '$POOL_PATH') (/kubernetes/manifests))}
                            )
                          ]
                          spids: [16777215 1829]
                        )
                        (if_arm
                          cond: [
                            (Sentence
                              child: 
                                (DBracket
                                  expr: 
                                    (BoolBinary
                                      op_id: BoolBinary_GlobDEqual
                                      left: {(DQ ($ VSub_Name '$LOGGING_DESTINATION'))}
                                      right: {(DQ (gcp))}
                                    )
                                )
                              terminator: <Op_Semi ';'>
                            )
                          ]
                          action: [
                            (C {(cp)} 
                              {
                                (DQ ($ VSub_Name '$KUBE_ROOT') 
                                  (/cluster/saltbase/salt/fluentd-gcp/fluentd-gcp.manifest)
                                )
                              } {(DQ ($ VSub_Name '$POOL_PATH') (/kubernetes/manifests))}
                            )
                          ]
                          spids: [1845 1862]
                        )
                      ]
                      spids: [16777215 1878]
                    )
                  ]
                  spids: [16777215 1809]
                )
              ]
              spids: [16777215 1881]
            )
            (C {(mkdir)} {(-p)} {(DQ ($ VSub_Name '$POOL_PATH') (/kubernetes/addons))})
            (If
              arms: [
                (if_arm
                  cond: [
                    (Sentence
                      child: 
                        (DBracket
                          expr: 
                            (BoolBinary
                              op_id: BoolBinary_GlobDEqual
                              left: {(DQ ($ VSub_Name '$ENABLE_CLUSTER_DNS'))}
                              right: {(DQ (true))}
                            )
                        )
                      terminator: <Op_Semi ';'>
                    )
                  ]
                  action: [
                    (SimpleCommand
                      words: [{(render-template)} {(DQ ($ VSub_Name '$ROOT') (/namespace.yaml))}]
                      redirects: [
                        (Redir
                          op_id: Redir_Great
                          fd: 16777215
                          arg_word: 
                            {(DQ ($ VSub_Name '$POOL_PATH') (/kubernetes/addons/namespace.yaml))}
                          spids: [1922]
                        )
                      ]
                    )
                    (SimpleCommand
                      words: [{(render-template)} {(DQ ($ VSub_Name '$ROOT') (/kube-dns.yaml))}]
                      redirects: [
                        (Redir
                          op_id: Redir_Great
                          fd: 16777215
                          arg_word: 
                            {(DQ ($ VSub_Name '$POOL_PATH') (/kubernetes/addons/kube-dns.yaml))}
                          spids: [1937]
                        )
                      ]
                    )
                  ]
                  spids: [16777215 1912]
                )
              ]
              spids: [16777215 1945]
            )
            (C {(virsh)} {(pool-refresh)} {($ VSub_Name '$POOL')})
          ]
          spids: [1583]
        )
      spids: [1579 1582]
    )
    (FuncDef
      name: destroy-network
      body: 
        (BraceGroup
          children: [
            (C {(set)} {(Lit_Other '+') (e)})
            (C {(virsh)} {(net-destroy)} {(kubernetes_global)})
            (C {(virsh)} {(net-destroy)} {(kubernetes_pods)})
            (C {(set)} {(-e)})
          ]
          spids: [1962]
        )
      spids: [1958 1961]
    )
    (FuncDef
      name: initialize-network
      body: 
        (BraceGroup
          children: [
            (C {(virsh)} {(net-create)} {(DQ ($ VSub_Name '$ROOT') (/network_kubernetes_global.xml))})
            (C {(virsh)} {(net-create)} {(DQ ($ VSub_Name '$ROOT') (/network_kubernetes_pods.xml))})
          ]
          spids: [1996]
        )
      spids: [1992 1995]
    )
    (FuncDef
      name: render-template
      body: 
        (BraceGroup
          children: [
            (C {(eval)} 
              {
                (DQ ('echo ') (EscapedLiteralPart token:<Lit_EscapedChar '\\"'>) 
                  (CommandSubPart
                    command_list: (CommandList children:[(C {(cat)} {($ VSub_Number '$1')})])
                    left_token: <Left_CommandSub '$('>
                    spids: [2033 2037]
                  ) (EscapedLiteralPart token:<Lit_EscapedChar '\\"'>)
                )
              }
            )
          ]
          spids: [2025]
        )
      spids: [2021 2024]
    )
    (FuncDef
      name: wait-cluster-readiness
      body: 
        (BraceGroup
          children: [
            (C {(echo)} {(DQ ('Wait for cluster readiness'))})
            (Assignment
              keyword: Assign_Local
              pairs: [(assign_pair lhs:(LhsName name:timeout) op:Equal rhs:{(120)} spids:[2061])]
              spids: [2059]
            )
            (While
              cond: [
                (Sentence
                  child: 
                    (DBracket
                      expr: 
                        (BoolBinary
                          op_id: BoolBinary_ne
                          left: {($ VSub_Name '$timeout')}
                          right: {(0)}
                        )
                    )
                  terminator: <Op_Semi ';'>
                )
              ]
              body: 
                (DoGroup
                  children: [
                    (Assignment
                      keyword: Assign_None
                      pairs: [
                        (assign_pair
                          lhs: (LhsName name:nb_ready_nodes)
                          op: Equal
                          rhs: 
                            {
                              (CommandSubPart
                                command_list: 
                                  (CommandList
                                    children: [
                                      (AndOr
                                        children: [
                                          (Pipeline
                                            children: [
                                              (SimpleCommand
                                                words: [
                                                  {(kubectl)}
                                                  {(get)}
                                                  {(nodes)}
                                                  {(-o)}
                                                  {(go-template) (Lit_Other '=') 
                                                    (DQ 
                                                      (
'{{range.items}}{{range.status.conditions}}{{.type}}{{end}}:{{end}}'
                                                      )
                                                    )
                                                  }
                                                ]
                                                redirects: [
                                                  (Redir
                                                    op_id: Redir_Great
                                                    fd: 2
                                                    arg_word: {(/dev/null)}
                                                    spids: [2097]
                                                  )
                                                ]
                                              )
                                              (C {(tr)} {(SQ <':'>)} {(SQ <'\\n'>)})
                                              (C {(grep)} {(-c)} {(Ready)})
                                            ]
                                            negated: False
                                          )
                                          (C {(true)})
                                        ]
                                        op_id: Op_DPipe
                                      )
                                    ]
                                  )
                                left_token: <Left_CommandSub '$('>
                                spids: [2082 2123]
                              )
                            }
                          spids: [2081]
                        )
                      ]
                      spids: [2081]
                    )
                    (C {(echo)} 
                      {
                        (DQ ('Nb ready nodes: ') ($ VSub_Name '$nb_ready_nodes') (' / ') 
                          ($ VSub_Name '$NUM_NODES')
                        )
                      }
                    )
                    (If
                      arms: [
                        (if_arm
                          cond: [
                            (Sentence
                              child: 
                                (DBracket
                                  expr: 
                                    (BoolBinary
                                      op_id: BoolBinary_eq
                                      left: {(DQ ($ VSub_Name '$nb_ready_nodes'))}
                                      right: {(DQ ($ VSub_Name '$NUM_NODES'))}
                                    )
                                )
                              terminator: <Op_Semi ';'>
                            )
                          ]
                          action: [(ControlFlow token:<ControlFlow_Return return> arg_word:{(0)})]
                          spids: [16777215 2153]
                        )
                      ]
                      spids: [16777215 2161]
                    )
                    (Assignment
                      keyword: Assign_None
                      pairs: [
                        (assign_pair
                          lhs: (LhsName name:timeout)
                          op: Equal
                          rhs: 
                            {
                              (ArithSubPart
                                anode: 
                                  (ArithBinary
                                    op_id: Arith_Minus
                                    left: (ArithWord w:{($ VSub_Name '$timeout')})
                                    right: (ArithWord w:{(Lit_Digits 1)})
                                  )
                                spids: [2166 2171]
                              )
                            }
                          spids: [2165]
                        )
                      ]
                      spids: [2165]
                    )
                    (C {(sleep)} {(.5)})
                  ]
                  spids: [2078 2179]
                )
            )
            (ControlFlow token:<ControlFlow_Return return> arg_word:{(1)})
          ]
          spids: [2048]
        )
      spids: [2044 2047]
    )
    (FuncDef
      name: kube-up
      body: 
        (BraceGroup
          children: [
            (C {(detect-master)})
            (C {(detect-nodes)})
            (C {(initialize-pool)} {(keep_base_image)})
            (C {(generate_certs)} 
              {
                (DQ 
                  (BracedVarSub
                    token: <VSub_Name NODE_NAMES>
                    bracket_op: (WholeArray op_id:Lit_At)
                    spids: [2214 2219]
                  )
                )
              }
            )
            (C {(setup_registry_proxy)})
            (C {(initialize-network)})
            (Assignment
              keyword: Assign_Readonly
              pairs: [
                (assign_pair
                  lhs: (LhsName name:ssh_keys)
                  op: Equal
                  rhs: 
                    {
                      (DQ 
                        (CommandSubPart
                          command_list: 
                            (CommandList
                              children: [
                                (Pipeline
                                  children: [
                                    (C {(cat)} 
                                      {(TildeSubPart prefix:'') (/.ssh/) (Lit_Other '*') (.pub)}
                                    )
                                    (C {(sed)} {(SQ <'s/^/  - /'>)})
                                  ]
                                  negated: False
                                )
                              ]
                            )
                          left_token: <Left_CommandSub '$('>
                          spids: [2234 2249]
                        )
                      )
                    }
                  spids: [2232]
                )
              ]
              spids: [2230]
            )
            (Assignment
              keyword: Assign_Readonly
              pairs: [
                (assign_pair
                  lhs: (LhsName name:kubernetes_dir)
                  op: Equal
                  rhs: {(DQ ($ VSub_Name '$POOL_PATH') (/kubernetes))}
                  spids: [2255]
                )
              ]
              spids: [2253]
            )
            (Assignment
              keyword: Assign_Local
              pairs: [(assign_pair lhs:(LhsName name:i) op:Equal spids:[2265])]
              spids: [2263]
            )
            (ForExpr
              init: 
                (BinaryAssign
                  op_id: Arith_Equal
                  left: (LhsName name:i)
                  right: (ArithWord w:{(Lit_Digits 0)})
                )
              cond: 
                (ArithBinary
                  op_id: Arith_LessEqual
                  left: (ArithVarRef name:i)
                  right: (ArithWord w:{($ VSub_Name '$NUM_NODES')})
                )
              update: (UnaryAssign op_id:Node_PostDPlus child:(LhsName name:i))
              body: 
                (DoGroup
                  children: [
                    (If
                      arms: [
                        (if_arm
                          cond: [
                            (Sentence
                              child: 
                                (DBracket
                                  expr: 
                                    (BoolBinary
                                      op_id: BoolBinary_eq
                                      left: {($ VSub_Name '$i')}
                                      right: {($ VSub_Name '$NUM_NODES')}
                                    )
                                )
                              terminator: <Op_Semi ';'>
                            )
                          ]
                          action: [
                            (C 
                              {(etcd2_initial_cluster) (Lit_Other '[') ($ VSub_Name '$i') 
                                (Lit_Other ']') (Lit_Other '=') (DQ (${ VSub_Name MASTER_NAME) ('=http://') (${ VSub_Name MASTER_IP) (':2380'))
                              }
                            )
                          ]
                          spids: [16777215 2311]
                        )
                      ]
                      else_action: [
                        (C 
                          {(etcd2_initial_cluster) (Lit_Other '[') ($ VSub_Name '$i') (Lit_Other ']') 
                            (Lit_Other '=') 
                            (DQ 
                              (BracedVarSub
                                token: <VSub_Name NODE_NAMES>
                                bracket_op: (ArrayIndex expr:(ArithWord w:{($ VSub_Name '$i')}))
                                spids: [2340 2345]
                              ) ('=http://') 
                              (BracedVarSub
                                token: <VSub_Name NODE_IPS>
                                bracket_op: (ArrayIndex expr:(ArithWord w:{($ VSub_Name '$i')}))
                                spids: [2347 2352]
                              ) (':2380')
                            )
                          }
                        )
                      ]
                      spids: [2331 2357]
                    )
                  ]
                  spids: [2295 2360]
                )
            )
            (Assignment
              keyword: Assign_None
              pairs: [
                (assign_pair
                  lhs: (LhsName name:etcd2_initial_cluster)
                  op: Equal
                  rhs: 
                    {
                      (CommandSubPart
                        command_list: 
                          (CommandList
                            children: [
                              (C {(join)} {(Lit_Comma ',')} 
                                {
                                  (DQ 
                                    (BracedVarSub
                                      token: <VSub_Name etcd2_initial_cluster>
                                      bracket_op: (WholeArray op_id:Lit_At)
                                      spids: [2370 2375]
                                    )
                                  )
                                }
                              )
                            ]
                          )
                        left_token: <Left_CommandSub '$('>
                        spids: [2364 2377]
                      )
                    }
                  spids: [2363]
                )
              ]
              spids: [2363]
            )
            (Assignment
              keyword: Assign_Readonly
              pairs: [
                (assign_pair
                  lhs: (LhsName name:machines)
                  op: Equal
                  rhs: 
                    {
                      (CommandSubPart
                        command_list: 
                          (CommandList
                            children: [
                              (C {(join)} {(Lit_Comma ',')} 
                                {
                                  (DQ 
                                    (BracedVarSub
                                      token: <VSub_Name KUBE_NODE_IP_ADDRESSES>
                                      bracket_op: (WholeArray op_id:Lit_At)
                                      spids: [2389 2394]
                                    )
                                  )
                                }
                              )
                            ]
                          )
                        left_token: <Left_CommandSub '$('>
                        spids: [2383 2396]
                      )
                    }
                  spids: [2382]
                )
              ]
              spids: [2380]
            )
            (ForExpr
              init: 
                (BinaryAssign
                  op_id: Arith_Equal
                  left: (LhsName name:i)
                  right: (ArithWord w:{(Lit_Digits 0)})
                )
              cond: 
                (ArithBinary
                  op_id: Arith_LessEqual
                  left: (ArithVarRef name:i)
                  right: (ArithWord w:{($ VSub_Name '$NUM_NODES')})
                )
              update: (UnaryAssign op_id:Node_PostDPlus child:(LhsName name:i))
              body: 
                (DoGroup
                  children: [
                    (If
                      arms: [
                        (if_arm
                          cond: [
                            (Sentence
                              child: 
                                (DBracket
                                  expr: 
                                    (BoolBinary
                                      op_id: BoolBinary_eq
                                      left: {($ VSub_Name '$i')}
                                      right: {($ VSub_Name '$NUM_NODES')}
                                    )
                                )
                              terminator: <Op_Semi ';'>
                            )
                          ]
                          action: [
                            (Assignment
                              keyword: Assign_None
                              pairs: [
                                (assign_pair
                                  lhs: (LhsName name:type)
                                  op: Equal
                                  rhs: {(master)}
                                  spids: [2446]
                                )
                              ]
                              spids: [2446]
                            )
                            (Assignment
                              keyword: Assign_None
                              pairs: [
                                (assign_pair
                                  lhs: (LhsName name:name)
                                  op: Equal
                                  rhs: {($ VSub_Name '$MASTER_NAME')}
                                  spids: [2450]
                                )
                              ]
                              spids: [2450]
                            )
                            (Assignment
                              keyword: Assign_None
                              pairs: [
                                (assign_pair
                                  lhs: (LhsName name:public_ip)
                                  op: Equal
                                  rhs: {($ VSub_Name '$MASTER_IP')}
                                  spids: [2454]
                                )
                              ]
                              spids: [2454]
                            )
                          ]
                          spids: [16777215 2443]
                        )
                      ]
                      else_action: [
                        (Assignment
                          keyword: Assign_None
                          pairs: [
                            (assign_pair
                              lhs: (LhsName name:type)
                              op: Equal
                              rhs: 
                                {(node-) 
                                  (CommandSubPart
                                    command_list: 
                                      (CommandList
                                        children: [(C {(printf)} {(DQ ('%02d'))} {($ VSub_Name '$i')})]
                                      )
                                    left_token: <Left_CommandSub '$('>
                                    spids: [2463 2471]
                                  )
                                }
                              spids: [2461]
                            )
                          ]
                          spids: [2461]
                        )
                        (Assignment
                          keyword: Assign_None
                          pairs: [
                            (assign_pair
                              lhs: (LhsName name:name)
                              op: Equal
                              rhs: 
                                {
                                  (BracedVarSub
                                    token: <VSub_Name NODE_NAMES>
                                    bracket_op: (ArrayIndex expr:(ArithWord w:{($ VSub_Name '$i')}))
                                    spids: [2475 2480]
                                  )
                                }
                              spids: [2474]
                            )
                          ]
                          spids: [2474]
                        )
                        (Assignment
                          keyword: Assign_None
                          pairs: [
                            (assign_pair
                              lhs: (LhsName name:public_ip)
                              op: Equal
                              rhs: 
                                {
                                  (BracedVarSub
                                    token: <VSub_Name NODE_IPS>
                                    bracket_op: (ArrayIndex expr:(ArithWord w:{($ VSub_Name '$i')}))
                                    spids: [2484 2489]
                                  )
                                }
                              spids: [2483]
                            )
                          ]
                          spids: [2483]
                        )
                      ]
                      spids: [2458 2492]
                    )
                    (Assignment
                      keyword: Assign_None
                      pairs: [
                        (assign_pair
                          lhs: (LhsName name:image)
                          op: Equal
                          rhs: {($ VSub_Name '$name') (.img)}
                          spids: [2495]
                        )
                      ]
                      spids: [2495]
                    )
                    (Assignment
                      keyword: Assign_None
                      pairs: [
                        (assign_pair
                          lhs: (LhsName name:config)
                          op: Equal
                          rhs: {(kubernetes_config_) ($ VSub_Name '$type')}
                          spids: [2500]
                        )
                      ]
                      spids: [2500]
                    )
                    (C {(virsh)} {(vol-create-as)} {($ VSub_Name '$POOL')} {($ VSub_Name '$image')} 
                      {(10G)} {(--format)} {(qcow2)} {(--backing-vol)} {(coreos_base.img)} {(--backing-vol-format)} {(qcow2)}
                    )
                    (C {(mkdir)} {(-p)} 
                      {
                        (DQ ($ VSub_Name '$POOL_PATH') (/) ($ VSub_Name '$config') (/openstack/latest))
                      }
                    )
                    (SimpleCommand
                      words: [{(render-template)} {(DQ ($ VSub_Name '$ROOT') (/user_data.yml))}]
                      redirects: [
                        (Redir
                          op_id: Redir_Great
                          fd: 16777215
                          arg_word: 
                            {
                              (DQ ($ VSub_Name '$POOL_PATH') (/) ($ VSub_Name '$config') 
                                (/openstack/latest/user_data)
                              )
                            }
                          spids: [2549]
                        )
                      ]
                    )
                    (C {(virsh)} {(pool-refresh)} {($ VSub_Name '$POOL')})
                    (Assignment
                      keyword: Assign_None
                      pairs: [
                        (assign_pair
                          lhs: (LhsName name:domain_xml)
                          op: Equal
                          rhs: 
                            {
                              (CommandSubPart
                                command_list: (CommandList children:[(C {(mktemp)})])
                                left_token: <Left_CommandSub '$('>
                                spids: [2568 2570]
                              )
                            }
                          spids: [2567]
                        )
                      ]
                      spids: [2567]
                    )
                    (SimpleCommand
                      words: [{(render-template)} {($ VSub_Name '$ROOT') (/coreos.xml)}]
                      redirects: [
                        (Redir
                          op_id: Redir_Great
                          fd: 16777215
                          arg_word: {($ VSub_Name '$domain_xml')}
                          spids: [2578]
                        )
                      ]
                    )
                    (C {(virsh)} {(create)} {($ VSub_Name '$domain_xml')})
                    (C {(rm)} {($ VSub_Name '$domain_xml')})
                  ]
                  spids: [2427 2595]
                )
            )
            (C {(export)} {(Lit_VarLike 'KUBE_SERVER=') (DQ ('http://192.168.10.1:8080'))})
            (C {(export)} {(Lit_VarLike 'CONTEXT=') (DQ (libvirt-coreos))})
            (C {(create-kubeconfig)})
            (C {(create-kubelet-kubeconfig)} {(DQ ('http://') (${ VSub_Name MASTER_IP) (':8080'))} 
              {(DQ (${ VSub_Name POOL_PATH) (/kubernetes/kubeconfig/kubelet.kubeconfig))}
            )
            (C {(wait-cluster-readiness)})
            (C {(echo)} {(DQ ('Kubernetes cluster is running. The master is running at:'))})
            (C {(echo)})
            (C {(echo)} {(DQ ('  http://') (${ VSub_Name KUBE_MASTER_IP) (':8080'))})
            (C {(echo)})
            (C {(echo)} {(DQ ("You can control the Kubernetes cluster with: 'kubectl'"))})
            (C {(echo)} 
              {
                (DQ ("You can connect on the master with: 'ssh core@") (${ VSub_Name KUBE_MASTER_IP) 
                  ("'")
                )
              }
            )
            (C {(wait-registry-readiness)})
          ]
          spids: [2197]
        )
      spids: [2193 2196]
    )
    (FuncDef
      name: create_registry_rc
      body: 
        (BraceGroup
          children: [
            (C {(echo)} {(DQ (' Create registry replication controller'))})
            (C {(kubectl)} {(create)} {(-f)} {($ VSub_Name '$ROOT') (/registry-rc.yaml)})
            (Assignment
              keyword: Assign_Local
              pairs: [(assign_pair lhs:(LhsName name:timeout) op:Equal rhs:{(120)} spids:[2718])]
              spids: [2716]
            )
            (While
              cond: [
                (Sentence
                  child: 
                    (DBracket
                      expr: 
                        (BoolBinary
                          op_id: BoolBinary_ne
                          left: {($ VSub_Name '$timeout')}
                          right: {(0)}
                        )
                    )
                  terminator: <Op_Semi ';'>
                )
              ]
              body: 
                (DoGroup
                  children: [
                    (Assignment
                      keyword: Assign_None
                      pairs: [
                        (assign_pair
                          lhs: (LhsName name:phase)
                          op: Equal
                          rhs: 
                            {
                              (CommandSubPart
                                command_list: 
                                  (CommandList
                                    children: [
                                      (C {(kubectl)} {(get)} {(pods)} {(-n)} {(kube-system)} 
                                        {(-lk8s-app) (Lit_Other '=') (kube-registry)} {(--output) (Lit_Other '=') (SQ <'jsonpath={.items..status.phase}'>)}
                                      )
                                    ]
                                  )
                                left_token: <Left_CommandSub '$('>
                                spids: [2739 2759]
                              )
                            }
                          spids: [2738]
                        )
                      ]
                      spids: [2738]
                    )
                    (If
                      arms: [
                        (if_arm
                          cond: [
                            (Sentence
                              child: 
                                (C {(Lit_Other '[')} {(DQ ($ VSub_Name '$phase'))} {(Lit_Other '=')} 
                                  {(DQ (Running))} {(Lit_Other ']')}
                                )
                              terminator: <Op_Semi ';'>
                            )
                          ]
                          action: [(ControlFlow token:<ControlFlow_Return return> arg_word:{(0)})]
                          spids: [16777215 2779]
                        )
                      ]
                      spids: [16777215 2787]
                    )
                    (Assignment
                      keyword: Assign_None
                      pairs: [
                        (assign_pair
                          lhs: (LhsName name:timeout)
                          op: Equal
                          rhs: 
                            {
                              (ArithSubPart
                                anode: 
                                  (ArithBinary
                                    op_id: Arith_Minus
                                    left: (ArithWord w:{($ VSub_Name '$timeout')})
                                    right: (ArithWord w:{(Lit_Digits 1)})
                                  )
                                spids: [2791 2796]
                              )
                            }
                          spids: [2790]
                        )
                      ]
                      spids: [2790]
                    )
                    (C {(sleep)} {(.5)})
                  ]
                  spids: [2735 2804]
                )
            )
          ]
          spids: [2696]
        )
      spids: [2690 2695]
    )
    (FuncDef
      name: create_registry_svc
      body: 
        (BraceGroup
          children: [
            (C {(echo)} {(DQ (' Create registry service'))})
            (C {(kubectl)} {(create)} {(-f)} 
              {(DQ (${ VSub_Name KUBE_ROOT) (/cluster/addons/registry/registry-svc.yaml))}
            )
          ]
          spids: [2816]
        )
      spids: [2810 2815]
    )
    (FuncDef
      name: wait-registry-readiness
      body: 
        (BraceGroup
          children: [
            (If
              arms: [
                (if_arm
                  cond: [
                    (Sentence
                      child: 
                        (DBracket
                          expr: 
                            (BoolBinary
                              op_id: BoolBinary_GlobNEqual
                              left: {(DQ ($ VSub_Name '$ENABLE_CLUSTER_REGISTRY'))}
                              right: {(DQ (true))}
                            )
                        )
                      terminator: <Op_Semi ';'>
                    )
                  ]
                  action: [(ControlFlow token:<ControlFlow_Return return> arg_word:{(0)})]
                  spids: [16777215 2868]
                )
              ]
              spids: [16777215 2876]
            )
            (C {(echo)} {(DQ ('Wait for registry readiness...'))})
            (Assignment
              keyword: Assign_Local
              pairs: [(assign_pair lhs:(LhsName name:timeout) op:Equal rhs:{(120)} spids:[2888])]
              spids: [2886]
            )
            (While
              cond: [
                (Sentence
                  child: 
                    (DBracket
                      expr: 
                        (BoolBinary
                          op_id: BoolBinary_ne
                          left: {($ VSub_Name '$timeout')}
                          right: {(0)}
                        )
                    )
                  terminator: <Op_Semi ';'>
                )
              ]
              body: 
                (DoGroup
                  children: [
                    (Assignment
                      keyword: Assign_None
                      pairs: [
                        (assign_pair
                          lhs: (LhsName name:phase)
                          op: Equal
                          rhs: 
                            {
                              (CommandSubPart
                                command_list: 
                                  (CommandList
                                    children: [
                                      (C {(kubectl)} {(get)} {(namespaces)} 
                                        {(--output) (Lit_Other '=') (Lit_VarLike 'jsonpath=') 
                                          (SQ 
                                            <
'{.items[?(@.metadata.name=="kube-system")].status.phase}'
                                            >
                                          )
                                        }
                                      )
                                    ]
                                  )
                                left_token: <Left_CommandSub '$('>
                                spids: [2909 2922]
                              )
                            }
                          spids: [2908]
                        )
                      ]
                      spids: [2908]
                    )
                    (If
                      arms: [
                        (if_arm
                          cond: [
                            (Sentence
                              child: 
                                (C {(Lit_Other '[')} {(DQ ($ VSub_Name '$phase'))} {(Lit_Other '=')} 
                                  {(DQ (Active))} {(Lit_Other ']')}
                                )
                              terminator: <Op_Semi ';'>
                            )
                          ]
                          action: [
                            (C {(create_registry_rc)})
                            (C {(create_registry_svc)})
                            (ControlFlow
                              token: <ControlFlow_Return return>
                              arg_word: {(0)}
                            )
                          ]
                          spids: [16777215 2942]
                        )
                      ]
                      spids: [16777215 2956]
                    )
                    (C {(echo)} {(DQ ('waiting for namespace kube-system'))})
                    (Assignment
                      keyword: Assign_None
                      pairs: [
                        (assign_pair
                          lhs: (LhsName name:timeout)
                          op: Equal
                          rhs: 
                            {
                              (ArithSubPart
                                anode: 
                                  (ArithBinary
                                    op_id: Arith_Minus
                                    left: (ArithWord w:{($ VSub_Name '$timeout')})
                                    right: (ArithWord w:{(Lit_Digits 1)})
                                  )
                                spids: [2967 2972]
                              )
                            }
                          spids: [2966]
                        )
                      ]
                      spids: [2966]
                    )
                    (C {(sleep)} {(.5)})
                  ]
                  spids: [2905 2980]
                )
            )
          ]
          spids: [2848]
        )
      spids: [2842 2847]
    )
    (FuncDef
      name: kube-down
      body: 
        (BraceGroup
          children: [
            (Pipeline
              children: [
                (C {(virsh)} {(list)})
                (C {(awk)} {(SQ <'NR>2 && !/^$/ && $2 ~ /^kubernetes/ {print $2}'>)})
                (While
                  cond: [(Sentence child:(C {(read)} {(dom)}) terminator:<Op_Semi ';'>)]
                  body: 
                    (DoGroup
                      children: [(C {(virsh)} {(destroy)} {($ VSub_Name '$dom')})]
                      spids: [3018 3028]
                    )
                )
              ]
              negated: False
            )
            (C {(destroy-pool)} {(keep_base_image)})
            (C {(destroy-network)})
          ]
          spids: [2992]
        )
      spids: [2988 2991]
    )
    (FuncDef
      name: upload-server-tars
      body: 
        (BraceGroup
          children: [
            (C {(tar)} {(-x)} {(-C)} {(DQ ($ VSub_Name '$POOL_PATH') (/kubernetes))} {(-f)} 
              {(DQ ($ VSub_Name '$SERVER_BINARY_TAR'))} {(kubernetes)}
            )
            (C {(rm)} {(-rf)} {(DQ ($ VSub_Name '$POOL_PATH') (/kubernetes/bin))})
            (C {(mv)} {(DQ ($ VSub_Name '$POOL_PATH') (/kubernetes/kubernetes/server/bin))} 
              {(DQ ($ VSub_Name '$POOL_PATH') (/kubernetes/bin))}
            )
            (C {(chmod)} {(-R)} {(755)} {(DQ ($ VSub_Name '$POOL_PATH') (/kubernetes/bin))})
            (C {(rm)} {(-fr)} {(DQ ($ VSub_Name '$POOL_PATH') (/kubernetes/kubernetes))})
          ]
          spids: [3048]
        )
      spids: [3044 3047]
    )
    (FuncDef
      name: kube-push
      body: 
        (BraceGroup
          children: [
            (C {(kube-push-internal)})
            (C {(ssh-to-node)} {(DQ ($ VSub_Name '$MASTER_NAME'))} 
              {(DQ ('sudo systemctl restart kube-apiserver kube-controller-manager kube-scheduler'))}
            )
            (ForExpr
              init: 
                (BinaryAssign
                  op_id: Arith_Equal
                  left: (LhsName name:i)
                  right: (ArithWord w:{(Lit_Digits 0)})
                )
              cond: 
                (ArithBinary
                  op_id: Arith_Less
                  left: (ArithVarRef name:i)
                  right: (ArithVarRef name:NUM_NODES)
                )
              update: (UnaryAssign op_id:Node_PostDPlus child:(LhsName name:i))
              body: 
                (DoGroup
                  children: [
                    (C {(ssh-to-node)} 
                      {
                        (DQ 
                          (BracedVarSub
                            token: <VSub_Name NODE_NAMES>
                            bracket_op: (ArrayIndex expr:(ArithWord w:{($ VSub_Name '$i')}))
                            spids: [3169 3174]
                          )
                        )
                      } {(DQ ('sudo systemctl restart kubelet kube-proxy'))}
                    )
                  ]
                  spids: [3163 3182]
                )
            )
            (C {(wait-cluster-readiness)})
          ]
          spids: [3125]
        )
      spids: [3121 3124]
    )
    (FuncDef
      name: kube-push-internal
      body: 
        (BraceGroup
          children: [
            (Case
              to_match: 
                {
                  (DQ 
                    (BracedVarSub
                      token: <VSub_Name KUBE_PUSH>
                      suffix_op: (StringUnary op_id:VTest_ColonHyphen arg_word:{(release)})
                      spids: [3200 3204]
                    )
                  )
                }
              arms: [
                (case_arm
                  pat_list: [{(release)}]
                  action: [(C {(kube-push-release)})]
                  spids: [3210 3211 3215 16777215]
                )
                (case_arm
                  pat_list: [{(Assign_Local local)}]
                  action: [(C {(kube-push-local)})]
                  spids: [3218 3219 3223 16777215]
                )
                (case_arm
                  pat_list: [{(Lit_Other '*')}]
                  action: [
                    (SimpleCommand
                      words: [
                        {(echo)}
                        {
                          (DQ ('The only known push methods are ') 
                            (EscapedLiteralPart
                              token: <Lit_EscapedChar '\\"'>
                            ) (release) (EscapedLiteralPart token:<Lit_EscapedChar '\\"'>) (' to use the release tarball or ') 
                            (EscapedLiteralPart
                              token: <Lit_EscapedChar '\\"'>
                            ) (local) (EscapedLiteralPart token:<Lit_EscapedChar '\\"'>) 
                            (' to use the binaries built by make. KUBE_PUSH is set ') (EscapedLiteralPart token:<Lit_EscapedChar '\\"'>) ($ VSub_Name '$KUBE_PUSH') 
                            (EscapedLiteralPart
                              token: <Lit_EscapedChar '\\"'>
                            )
                          )
                        }
                      ]
                      redirects: [
                        (Redir
                          op_id: Redir_GreatAnd
                          fd: 16777215
                          arg_word: {(2)}
                          spids: [3247]
                        )
                      ]
                    )
                    (ControlFlow token:<ControlFlow_Return return> arg_word:{(1)})
                  ]
                  spids: [3226 3227 3254 16777215]
                )
              ]
              spids: [3197 3207 3257]
            )
          ]
          spids: [3194]
        )
      spids: [3190 3193]
    )
    (FuncDef
      name: kube-push-release
      body: (BraceGroup children:[(C {(find-release-tars)}) (C {(upload-server-tars)})] spids:[3266])
      spids: [3262 3265]
    )
    (FuncDef
      name: kube-push-local
      body: 
        (BraceGroup
          children: [
            (C {(rm)} {(-rf)} {(DQ ($ VSub_Name '$POOL_PATH') ('/kubernetes/bin/*'))})
            (C {(mkdir)} {(-p)} {(DQ ($ VSub_Name '$POOL_PATH') (/kubernetes/bin))})
            (C {(cp)} {(DQ (${ VSub_Name KUBE_ROOT) (/_output/local/go/bin)) (/) (Lit_Other '*')} 
              {(DQ ($ VSub_Name '$POOL_PATH') (/kubernetes/bin))}
            )
          ]
          spids: [3281]
        )
      spids: [3277 3280]
    )
    (FuncDef
      name: test-build-release
      body: (BraceGroup children:[(C {(echo)} {(DQ (TODO))})] spids:[3330])
      spids: [3326 3329]
    )
    (FuncDef
      name: test-setup
      body: 
        (BraceGroup
          children: [(C {(DQ (${ VSub_Name KUBE_ROOT) (/cluster/kube-up.sh))})]
          spids: [3349]
        )
      spids: [3345 3348]
    )
    (FuncDef
      name: test-teardown
      body: (BraceGroup children:[(C {(kube-down)})] spids:[3369])
      spids: [3365 3368]
    )
    (FuncDef
      name: ssh-to-node
      body: 
        (BraceGroup
          children: [
            (Assignment
              keyword: Assign_Local
              pairs: [
                (assign_pair
                  lhs: (LhsName name:node)
                  op: Equal
                  rhs: {(DQ ($ VSub_Number '$1'))}
                  spids: [3389]
                )
              ]
              spids: [3387]
            )
            (Assignment
              keyword: Assign_Local
              pairs: [
                (assign_pair
                  lhs: (LhsName name:cmd)
                  op: Equal
                  rhs: {(DQ ($ VSub_Number '$2'))}
                  spids: [3397]
                )
              ]
              spids: [3395]
            )
            (Assignment
              keyword: Assign_Local
              pairs: [(assign_pair lhs:(LhsName name:machine) op:Equal spids:[3405])]
              spids: [3403]
            )
            (If
              arms: [
                (if_arm
                  cond: [
                    (Sentence
                      child: 
                        (AndOr
                          children: [
                            (DBracket
                              expr: 
                                (BoolBinary
                                  op_id: BoolBinary_GlobDEqual
                                  left: {(DQ ($ VSub_Name '$node'))}
                                  right: {(DQ ($ VSub_Name '$MASTER_IP'))}
                                )
                            )
                            (DBracket
                              expr: 
                                (BoolBinary
                                  op_id: BoolBinary_EqualTilde
                                  left: {(DQ ($ VSub_Name '$node'))}
                                  right: {(Lit_Other '^') (DQ ($ VSub_Name '$NODE_IP_BASE'))}
                                )
                            )
                          ]
                          op_id: Op_DPipe
                        )
                      terminator: <Op_Semi ';'>
                    )
                  ]
                  action: [
                    (Assignment
                      keyword: Assign_None
                      pairs: [
                        (assign_pair
                          lhs: (LhsName name:machine)
                          op: Equal
                          rhs: {(DQ ($ VSub_Name '$node'))}
                          spids: [3446]
                        )
                      ]
                      spids: [3446]
                    )
                  ]
                  spids: [16777215 3443]
                )
                (if_arm
                  cond: [
                    (Sentence
                      child: 
                        (DBracket
                          expr: 
                            (BoolBinary
                              op_id: BoolBinary_GlobDEqual
                              left: {(DQ ($ VSub_Name '$node'))}
                              right: {(DQ ($ VSub_Name '$MASTER_NAME'))}
                            )
                        )
                      terminator: <Op_Semi ';'>
                    )
                  ]
                  action: [
                    (Assignment
                      keyword: Assign_None
                      pairs: [
                        (assign_pair
                          lhs: (LhsName name:machine)
                          op: Equal
                          rhs: {(DQ ($ VSub_Name '$MASTER_IP'))}
                          spids: [3472]
                        )
                      ]
                      spids: [3472]
                    )
                  ]
                  spids: [3452 3469]
                )
              ]
              else_action: [
                (ForExpr
                  init: 
                    (BinaryAssign
                      op_id: Arith_Equal
                      left: (LhsName name:i)
                      right: (ArithWord w:{(Lit_Digits 0)})
                    )
                  cond: 
                    (ArithBinary
                      op_id: Arith_Less
                      left: (ArithVarRef name:i)
                      right: (ArithVarRef name:NUM_NODES)
                    )
                  update: (UnaryAssign op_id:Node_PostDPlus child:(LhsName name:i))
                  body: 
                    (DoGroup
                      children: [
                        (If
                          arms: [
                            (if_arm
                              cond: [
                                (Sentence
                                  child: 
                                    (DBracket
                                      expr: 
                                        (BoolBinary
                                          op_id: BoolBinary_GlobDEqual
                                          left: {(DQ ($ VSub_Name '$node'))}
                                          right: 
                                            {
                                              (DQ 
                                                (BracedVarSub
                                                  token: <VSub_Name NODE_NAMES>
                                                  bracket_op: 
                                                    (ArrayIndex
                                                      expr: (ArithWord w:{($ VSub_Name '$i')})
                                                    )
                                                  spids: [3516 3521]
                                                )
                                              )
                                            }
                                        )
                                    )
                                  terminator: <Op_Semi ';'>
                                )
                              ]
                              action: [
                                (Assignment
                                  keyword: Assign_None
                                  pairs: [
                                    (assign_pair
                                      lhs: (LhsName name:machine)
                                      op: Equal
                                      rhs: 
                                        {
                                          (DQ 
                                            (BracedVarSub
                                              token: <VSub_Name NODE_IPS>
                                              bracket_op: 
                                                (ArrayIndex
                                                  expr: (ArithWord w:{($ VSub_Name '$i')})
                                                )
                                              spids: [3532 3537]
                                            )
                                          )
                                        }
                                      spids: [3530]
                                    )
                                  ]
                                  spids: [3530]
                                )
                                (ControlFlow
                                  token: <ControlFlow_Break break>
                                )
                              ]
                              spids: [16777215 3527]
                            )
                          ]
                          spids: [16777215 3544]
                        )
                      ]
                      spids: [3502 3547]
                    )
                )
              ]
              spids: [3478 3550]
            )
            (If
              arms: [
                (if_arm
                  cond: [
                    (Sentence
                      child: 
                        (DBracket
                          expr: (BoolUnary op_id:BoolUnary_z child:{(DQ ($ VSub_Name '$machine'))})
                        )
                      terminator: <Op_Semi ';'>
                    )
                  ]
                  action: [
                    (SimpleCommand
                      words: [{(echo)} {(DQ ($ VSub_Name '$node') (' is an unknown machine to ssh to'))}]
                      redirects: [
                        (Redir
                          op_id: Redir_GreatAnd
                          fd: 16777215
                          arg_word: {(2)}
                          spids: [3576]
                        )
                      ]
                    )
                  ]
                  spids: [16777215 3566]
                )
              ]
              spids: [16777215 3580]
            )
            (C {(ssh)} {(-o)} {(Lit_VarLike 'ConnectTimeout=') (30)} {(-o)} 
              {(Lit_VarLike 'StrictHostKeyChecking=') (no)} {(-o)} {(Lit_VarLike 'UserKnownHostsFile=') (/dev/null)} {(-o)} {(Lit_VarLike 'ControlMaster=') (no)} 
              {(DQ ('core@') ($ VSub_Name '$machine'))} {(DQ ($ VSub_Name '$cmd'))}
            )
          ]
          spids: [3384]
        )
      spids: [3380 3383]
    )
    (FuncDef
      name: prepare-e2e
      body: 
        (BraceGroup
          children: [
            (SimpleCommand
              words: [{(echo)} {(DQ ("libvirt-coreos doesn't need special preparations for e2e tests"))}]
              redirects: [(Redir op_id:Redir_GreatAnd fd:1 arg_word:{(2)} spids:[3635])]
            )
          ]
          spids: [3626]
        )
      spids: [3620 3625]
    )
  ]
)