def main(self,argv):
    methodName ="main"
    self.rc = 0
    self.bootstrap = Bootstrap()
    
    try:  
        beginTime = Utilities.currentTimeMillis()
        cmdLineArgs = Utilities.getInputArgs(self.ArgsSignature,argv[1:])
        trace, logFile = self.bootstrap._configureTraceAndLogging(cmdLineArgs)
        TR.info(methodName,"BOOT0101I BEGIN Bootstrap AWS ICPD Quickstart version 1.0.0.")
        if (trace):
            TR.info(methodName,"BOOT0102I Tracing with specification: '%s' to log file: '%s'" % (trace,logFile))
        #endIf
       
        region = cmdLineArgs.get('region')
        self.bootstrap.region = region
        self.bootstrap.role = cmdLineArgs.get('role')
        self.bootstrap.fqdn = socket.getfqdn()

        self.bootStackId = cmdLineArgs.get('stackid')
        self.bootstrap.rootStackName = cmdLineArgs.get('stack-name')  
        self.bootstrap._init(self.bootstrap.rootStackName,self.bootStackId)
        
        self.logExporter = LogExporter(region=self.bootstrap.region,
                                   bucket=self.bootstrap.ICPDeploymentLogsBucketName,
                                   keyPrefix='logs/%s' % self.bootstrap.rootStackName,
                                   role=self.bootstrap.role,
                                   fqdn=self.bootstrap.fqdn
                                   )
        self.icpHome = "/opt/icp/%s" % self.bootstrap.ICPVersion
        installMapPath = os.path.join(self.home,"maps","icpd-install-artifact-map.yaml")
        self.installMap = self.bootstrap.loadInstallMap(mapPath=installMapPath, version=self.bootstrap.ICPDVersion, region=self.bootstrap.region)
        icpdS3Path = "{version}/{object}".format(version=self.installMap['version'],object=self.installMap['icpd-base-install-archive'])
        destPath = "/tmp/icp4d.tar"
        storageClassCmd = "kubectl get storageclass | nl | grep aws-efs | awk '{print $1}'"
        TR.info(methodName,"check_output Get StorageClass value from kubectl %s"%(storageClassCmd))
        self.storageclassValue=check_output(['bash','-c', storageClassCmd])
        TR.info(methodName,"check_output  StorageclassValue returned : %s"%(self.storageclassValue))
        self.bootstrap.getS3Object(self.bootstrap.ICPDArchiveBucketName, icpdS3Path, destPath) 
      
        self.stackIds =  self.bootstrap._getStackIds(self.bootStackId)
        self.bootstrap._getHosts(self.stackIds)
        
        self.installICPD()
    except ExitException:
        pass # ExitException is used as a "goto" end of program after emitting help info

    except Exception, e:
        TR.error(methodName,"ERROR: %s" % e, e)
        self.rc = 1
示例#2
0
  def main(self,argv):
    """
      Main does command line argument processing, sets up trace and then kicks off the methods to
      do the work.
    """
    methodName = "main"

    self.rc = 0
    try:
      ####### Start command line processing
      cmdLineArgs = Utilities.getInputArgs(self.ArgsSignature,argv[1:])

      # if trace is set from command line the trace variable holds the trace spec.
      trace, logFile = self._configureTraceAndLogging(cmdLineArgs)

      if (cmdLineArgs.get("help")):
        self._usage()
        raise ExitException("After emitting help, jump to the end of main.")
      #endIf

      beginTime = Utilities.currentTimeMillis()
      TR.info(methodName,"NINIT0101I BEGIN Node initialization AWS ICP Quickstart version @{VERSION}.")

      if (trace):
        TR.info(methodName,"NINIT0102I Tracing with specification: '%s' to log file: '%s'" % (trace,logFile))
      #endIf
      
      region = cmdLineArgs.get('region')
      if (not region):
        raise MissingArgumentException("The AWS region (--region) must be provided.")
      #endIf
      self.region = region

      # The stackId is the "nested" stackId  It is used to get input parameter values.
      stackId = cmdLineArgs.get('stackid')
      if (not stackId):
        raise MissingArgumentException("The stack ID (--stackid) must be provided.")
      #endIf

      self.stackId = stackId
      TR.info(methodName,"Stack ID: %s" % stackId)

      # NOTE: The stackName is the root stack name as that is the name used in 
      # the SSM parameter keys by the boot node stack and the nested stacks.
      # For communication purposes all stacks must use the same root stack name.
      stackName = cmdLineArgs.get('stack-name')
      if (not stackName):
        raise MissingArgumentException("The stack name (--stack-name) must be provided.")
      #endIf
      
      self.stackName = stackName
      TR.info(methodName,"Stack name: %s" % stackName)
      
      role = cmdLineArgs.get('role')
      if (not role):
        raise MissingArgumentException("The role of this node (--role) must be provided.")
      #endIf
      
      self.role = role
      TR.info(methodName,"Node role: %s" % role)
      
      # Additional initialization of the instance.
      self._init(stackId)

      # Get the appropriate docker image
      self.installMap = self.loadInstallMap(version=self.ICPVersion, region=self.region)
      self.getInstallImages(self.installMap)
          
      # The sleep() is a hack to give bootnode time to do get its act together.
      # PVS: I've run into rare cases where it appears that the the cluster nodes
      # pick up a bad public key.  I think it may be due to accidentally reusing
      # an ssm parameter.  Don't have time to troubleshoot, now.  I'm thinking 
      # if the boot node gets to it first, it will overwrite anything old that 
      # may be there.
      time.sleep(30)
      
      authorizedKeyEntry = self.getBootNodePublicKey()
      self.addAuthorizedKey(authorizedKeyEntry)

      # NOTE: All CFN outputs, parameters are strings even when the Type is Number.
      # Hence, the conversion of MasterNodeCount to an int.
      if (self.role == 'master' and int(self.MasterNodeCount) > 1):
        efsServer = self.EFSDNSName # An input to the master stack
        efsVolumes = [EFSVolume(efsServer,mountPoint) for mountPoint in ['/var/lib/registry','/var/lib/icp/audit','/var/log/audit']]
        self.mountEFSVolumes(efsVolumes)
      #endIf
            
      self.publishReadiness(self.stackName,self.fqdn)

      # Wait until boot node completes the Docker installation
      self.getSSMParameterValue("/%s/docker-installation" % self.stackName,expectedValue="COMPLETED")
      
      # NOTE: It looks like kubectl gets installed on the master node as part of the ICP install, at least as of ICP 3.1.0.
      
      self.publishReadiness(self.stackName,self.fqdn)
          

    except ExitException:
      pass # ExitException is used as a "goto" end of program after emitting help info

    except Exception, e:
      TR.error(methodName,"Exception: %s" % e, e)
      self.rc = 1
示例#3
0
      pass # ExitException is used as a "goto" end of program after emitting help info

    except Exception, e:
      TR.error(methodName,"Exception: %s" % e, e)
      self.rc = 1
    finally:
      
      try:
        # Copy the deployment logs in logsHome to the S3 bucket for logs.
        self.exportLogs(self.ICPDeploymentLogsBucketName,self.stackName,self.logsHome)
      except Exception, e:
        TR.error(methodName,"Exception: %s" % e, e)
        self.rc = 1
      #endTry

      endTime = Utilities.currentTimeMillis()
      elapsedTime = (endTime - beginTime)/1000
      etm, ets = divmod(elapsedTime,60)
      eth, etm = divmod(etm,60) 
      
      if (self.rc == 0):
        TR.info(methodName,"NINIT0103I END Node initialization AWS ICP Quickstart.  Elapsed time (hh:mm:ss): %d:%02d:%02d" % (eth,etm,ets))
      else:
        TR.info(methodName,"NINIT0104I FAILED END Node initialization AWS ICP Quickstart.  Elapsed time (hh:mm:ss): %d:%02d:%02d" % (eth,etm,ets))
      #endIf
      
    #endTry

    if (TR.traceFile):
      TR.closeTraceLog()
    #endIf