def __init__(self): ''' Constructor. Ensure that package directory exists. ''' self._basedir = common.props['cluster.emversionmgr.packages_base'] if not os.path.exists(self._basedir): raise Exception("Package reference directory %s does not exist!" % self._basedir) self._pkgfilenameparser = PkgFileNameParser()
def __init__(self, cluster, optype): ''' Constructor ''' self._cluster = cluster self._optype = optype if ((self._optype != 'pkginstall') and (self._optype != 'pkgupgrade') and (self._optype != 'bininstall') and (self._optype != 'binupgrade')): raise Exception( "Invalid cluster ansible playbook installer type: %s" % self._optype) self._pkgfilenameparser = PkgFileNameParser() self._ansible_file = "" self._extra_vars = "" self._inventory_filename = "infinidb"
class EmVersionManager(object): ''' Simplified version of versionmgr.py found in autooam. This class finds the tar ball file to be used in a db install. ''' def __init__(self): ''' Constructor. Ensure that package directory exists. ''' self._basedir = common.props['cluster.emversionmgr.packages_base'] if not os.path.exists(self._basedir): raise Exception("Package reference directory %s does not exist!" % self._basedir) self._pkgfilenameparser = PkgFileNameParser() def retrieve(self, version, ptype): '''locates the specified package type. @param version - version to retrieve. @param ptype - package type. One of 'bin', 'deb', or 'rpm' Returns the relative path to the package tarball which is guaranteed to be located in /opt/infinidb/em/packages/database. Raises exceptions on failure to locate the specified package (or other misc. errors such as a bad type, etc.). ''' if not ptype in ['binary']: # presently only support binary raise Exception("Unsupported package type %s!" % ptype) # search for applicable pkg in self._basedir for p in os.listdir(self._basedir): mat = self._pkgfilenameparser.match(ptype, p) if mat and (self._pkgfilenameparser.get_pkg_version(p) == version): return p raise Exception("No %s package found in %s for version %s" % (ptype, self._basedir, version))
def __init__(self): """ Constructor. Ensure that package directory exists. """ self._basedir = common.props["cluster.emversionmgr.packages_base"] if not os.path.exists(self._basedir): raise Exception("Package reference directory %s does not exist!" % self._basedir) self._pkgfilenameparser = PkgFileNameParser()
class EmVersionManager(object): """ Simplified version of versionmgr.py found in autooam. This class finds the tar ball file to be used in a db install. """ def __init__(self): """ Constructor. Ensure that package directory exists. """ self._basedir = common.props["cluster.emversionmgr.packages_base"] if not os.path.exists(self._basedir): raise Exception("Package reference directory %s does not exist!" % self._basedir) self._pkgfilenameparser = PkgFileNameParser() def retrieve(self, version, ptype): """locates the specified package type. @param version - version to retrieve. @param ptype - package type. One of 'bin', 'deb', or 'rpm' Returns the relative path to the package tarball which is guaranteed to be located in /opt/infinidb/em/packages/database. Raises exceptions on failure to locate the specified package (or other misc. errors such as a bad type, etc.). """ if not ptype in ["binary"]: # presently only support binary raise Exception("Unsupported package type %s!" % ptype) # search for applicable pkg in self._basedir for p in os.listdir(self._basedir): mat = self._pkgfilenameparser.match(ptype, p) if mat and (self._pkgfilenameparser.get_pkg_version(p) == version): return p raise Exception("No %s package found in %s for version %s" % (ptype, self._basedir, version))
def __init__(self, cluster, optype): """ Constructor """ self._cluster = cluster self._optype = optype if ( (self._optype != "pkginstall") and (self._optype != "pkgupgrade") and (self._optype != "bininstall") and (self._optype != "binupgrade") ): raise Exception("Invalid cluster ansible playbook installer type: %s" % self._optype) self._pkgfilenameparser = PkgFileNameParser() self._ansible_file = "" self._extra_vars = "" self._inventory_filename = "infinidb"
class PlaybookInstall(object): ''' PlaybookGen can be used to generate and execute ansible playbooks to perform binary/package installs or upgrades. ''' def __init__(self, cluster, optype): ''' Constructor ''' self._cluster = cluster self._optype = optype if ((self._optype != 'pkginstall') and (self._optype != 'pkgupgrade') and (self._optype != 'bininstall') and (self._optype != 'binupgrade')): raise Exception( "Invalid cluster ansible playbook installer type: %s" % self._optype) self._pkgfilenameparser = PkgFileNameParser() self._ansible_file = "" self._extra_vars = "" self._inventory_filename = "infinidb" def run_cmd(self): ''' Prepare and run the ansible playbook command for the operation type specified in the constructor ''' self._rundir = self._cluster.get_rundir() self._pkgdir = self._cluster.get_pkgdir() self._pkgfile = self._cluster.get_pkgfile() self._idbuser = self._cluster.config()['idbuser'] eflag = self._cluster.config()['enterprise'] if eflag: self._entflag = "true" else: self._entflag = "false" self._version = self._pkgfilenameparser.get_pkg_version(self._pkgfile) self._hadoop = self._cluster.config()['hadoop'] self._hdfsflag = "false" if self._hadoop: self._hdfsflag = "true" self._upgfile = self._cluster.get_upgfile() self._upgversion = None if self._upgfile: self._upgversion = self._pkgfilenameparser.get_pkg_version( self._upgfile) m = self._cluster.machine('pm1') self._pm1_ip = m['ip'] self._postconfig_opts = self._cluster.get_postconfig_opts() # Add -em to postconfig flags for version 4.6 and up if self._optype == 'pkginstall': if ConfigSpec._version_greaterthan(self._version, '4.6.0-0'): self._postconfig_opts += " -em" (ansible_yml, cmdargs) = self._prepare_playbook_pkginstall() elif self._optype == 'pkgupgrade': if ConfigSpec._version_greaterthan(self._upgversion, '4.6.0-0'): self._postconfig_opts += " -em" (ansible_yml, cmdargs) = self._prepare_playbook_pkgupgrade() elif self._optype == 'bininstall': if ConfigSpec._version_greaterthan(self._version, '4.6.0-0'): self._postconfig_opts += " -em" (ansible_yml, cmdargs) = self._prepare_playbook_bininstall() elif self._optype == 'binupgrade': if ConfigSpec._version_greaterthan(self._upgversion, '4.6.0-0'): self._postconfig_opts += " -em" (ansible_yml, cmdargs) = self._prepare_playbook_binupgrade() else: raise Exception("Unsupported ansible playbook type to run: %s" % self._optype) extra_playdir = self._cluster.get_extra_playbook_dir() p = PlaybookMgr(os.path.basename(self._rundir), extra_playdir) # create ansible inventory file with list of hosts; # should already exist for an EM-triggered install. full_inv_file = '%s/%s' % (p.get_rootdir(), self._inventory_filename) if not os.path.exists(full_inv_file): machines = self._cluster.machines() iplist = [] infnodelist = [] for key in machines: m = machines[key] iplist.append(m['ip']) # if we are using the EM in invm mode we don't want that # node to participate in the normal InfiniDB install if key != 'em1': #f.write("key: %s.calpont.com; ip: %s\n" % (key,m['ip'])) infnodelist.append(m['ip']) ipdict = {'all': iplist, 'infinidb_nodes': infnodelist} p.write_inventory(self._inventory_filename, ipdict) # create ansible.cfg file; # should already exist for an EM-triggered install. full_ans_file = '%s/%s' % (p.get_rootdir(), 'ansible.cfg') if not os.path.exists(full_ans_file): keytext = self._cluster.get_sshkey_text() p.config_ssh(self._idbuser, keytext) # execute playbook thru PlaybookMgr self._ansible_file = ansible_yml self._extra_vars = cmdargs rc, results, out, err = p.run_playbook(ansible_yml, self._inventory_filename, playbook_args=cmdargs) return rc, results, out, err def get_playbook_filename(self): """ Return main ansible playbook file """ return self._ansible_file def get_extra_vars(self): """ Return extra variable list passed to ansible """ return self._extra_vars def get_inventory_filename(self): """ Return inventory file name that was created """ return self._inventory_filename def _prepare_playbook_pkginstall(self): """ Prepare pkg install using ansible playbook. """ playbook = ('%s/pkginstall.yml' % self._rundir) cmdargs = ("\"pkgbasever=%s " "pkgver=%s " "pkgfile=%s " "pkgfilebase=%s " "enterprise=%s " "pm1_host=%s " "postconfig_opts='%s' " "hdfs=%s " "rundir=%s " "pkgdir=%s " "\"" % (self._version[0], self._version, self._pkgfile, os.path.basename(self._pkgfile), self._entflag, self._pm1_ip, self._postconfig_opts, self._hdfsflag, self._rundir, self._pkgdir)) if self._hadoop: Log.info( "Running pkg install playbook with Hadoop; --extra-vars=%s" % cmdargs) else: Log.info("Running pkg install playbook; --extra-vars=%s" % cmdargs) return (playbook, cmdargs) def _prepare_playbook_pkgupgrade(self): """ Prepare pkg upgrade using ansible playbook. """ playbook = ("%s/pkgupgrade.yml" % self._rundir) cmdargs = ( "\"pm1_host=%s " "pkgdir=%s " "pkgbasever=%s " "upgbasever=%s " "upgver=%s " "upgfile=%s " "upgfilebase=%s " "enterprise=%s " "postconfig_opts='%s' " "\"" % (self._pm1_ip, self._pkgdir, self._version[0], self._upgversion[0], self._upgversion, self._upgfile, os.path.basename( self._upgfile), self._entflag, self._postconfig_opts)) Log.info("Running pkg upgrade playbook; --extra-vars=%s" % cmdargs) return (playbook, cmdargs) def _prepare_playbook_bininstall(self): """ Prepare binary install using ansible playbook. """ playbook = ('%s/bininstall.yml' % self._rundir) if self._idbuser == 'root': suflag = "no" else: suflag = "yes" cmdargs = ("\"idbuser=%s " "pm1_host=%s " "sudo_flag=%s " "pkgbasever=%s " "pkgver=%s " "pkgfile=%s " "pkgfilebase=%s " "postconfig_opts='%s' " "hdfs=%s " "rundir=%s " "pkgdir=%s " "\"" % (self._idbuser, self._pm1_ip, suflag, self._version[0], self._version, self._pkgfile, os.path.basename(self._pkgfile), self._postconfig_opts, self._hdfsflag, self._rundir, self._pkgdir)) if self._hadoop: Log.info( "Running binary install playbook; with Hadoop; --extra-vars=%s" % cmdargs) else: Log.info("Running binary install playbook; --extra-vars=%s" % cmdargs) return (playbook, cmdargs) def _prepare_playbook_binupgrade(self): """ Prepare binary upgrade using ansible playbook. """ playbook = ("%s/binupgrade.yml" % self._rundir) cmdargs = ("\"idbuser=%s " "pm1_host=%s " "pkgdir=%s " "upgfile=%s " "upgfilebase=%s " "postconfig_opts='%s' " "\"" % (self._idbuser, self._pm1_ip, self._pkgdir, self._upgfile, os.path.basename(self._upgfile), self._postconfig_opts)) Log.info("Running binary upgrade playbook; --extra-vars=%s" % cmdargs) return (playbook, cmdargs)
class PlaybookInstall(object): """ PlaybookGen can be used to generate and execute ansible playbooks to perform binary/package installs or upgrades. """ def __init__(self, cluster, optype): """ Constructor """ self._cluster = cluster self._optype = optype if ( (self._optype != "pkginstall") and (self._optype != "pkgupgrade") and (self._optype != "bininstall") and (self._optype != "binupgrade") ): raise Exception("Invalid cluster ansible playbook installer type: %s" % self._optype) self._pkgfilenameparser = PkgFileNameParser() self._ansible_file = "" self._extra_vars = "" self._inventory_filename = "infinidb" def run_cmd(self): """ Prepare and run the ansible playbook command for the operation type specified in the constructor """ self._rundir = self._cluster.get_rundir() self._pkgdir = self._cluster.get_pkgdir() self._pkgfile = self._cluster.get_pkgfile() self._idbuser = self._cluster.config()["idbuser"] eflag = self._cluster.config()["enterprise"] if eflag: self._entflag = "true" else: self._entflag = "false" self._version = self._pkgfilenameparser.get_pkg_version(self._pkgfile) self._hadoop = self._cluster.config()["hadoop"] self._hdfsflag = "false" if self._hadoop: self._hdfsflag = "true" self._upgfile = self._cluster.get_upgfile() self._upgversion = None if self._upgfile: self._upgversion = self._pkgfilenameparser.get_pkg_version(self._upgfile) m = self._cluster.machine("pm1") self._pm1_ip = m["ip"] self._postconfig_opts = self._cluster.get_postconfig_opts() # Add -em to postconfig flags for version 4.6 and up if self._optype == "pkginstall": if ConfigSpec._version_greaterthan(self._version, "4.6.0-0"): self._postconfig_opts += " -em" (ansible_yml, cmdargs) = self._prepare_playbook_pkginstall() elif self._optype == "pkgupgrade": if ConfigSpec._version_greaterthan(self._upgversion, "4.6.0-0"): self._postconfig_opts += " -em" (ansible_yml, cmdargs) = self._prepare_playbook_pkgupgrade() elif self._optype == "bininstall": if ConfigSpec._version_greaterthan(self._version, "4.6.0-0"): self._postconfig_opts += " -em" (ansible_yml, cmdargs) = self._prepare_playbook_bininstall() elif self._optype == "binupgrade": if ConfigSpec._version_greaterthan(self._upgversion, "4.6.0-0"): self._postconfig_opts += " -em" (ansible_yml, cmdargs) = self._prepare_playbook_binupgrade() else: raise Exception("Unsupported ansible playbook type to run: %s" % self._optype) extra_playdir = self._cluster.get_extra_playbook_dir() p = PlaybookMgr(os.path.basename(self._rundir), extra_playdir) # create ansible inventory file with list of hosts; # should already exist for an EM-triggered install. full_inv_file = "%s/%s" % (p.get_rootdir(), self._inventory_filename) if not os.path.exists(full_inv_file): machines = self._cluster.machines() iplist = [] infnodelist = [] for key in machines: m = machines[key] iplist.append(m["ip"]) # if we are using the EM in invm mode we don't want that # node to participate in the normal InfiniDB install if key != "em1": # f.write("key: %s.calpont.com; ip: %s\n" % (key,m['ip'])) infnodelist.append(m["ip"]) ipdict = {"all": iplist, "infinidb_nodes": infnodelist} p.write_inventory(self._inventory_filename, ipdict) # create ansible.cfg file; # should already exist for an EM-triggered install. full_ans_file = "%s/%s" % (p.get_rootdir(), "ansible.cfg") if not os.path.exists(full_ans_file): keytext = self._cluster.get_sshkey_text() p.config_ssh(self._idbuser, keytext) # execute playbook thru PlaybookMgr self._ansible_file = ansible_yml self._extra_vars = cmdargs rc, results, out, err = p.run_playbook(ansible_yml, self._inventory_filename, playbook_args=cmdargs) return rc, results, out, err def get_playbook_filename(self): """ Return main ansible playbook file """ return self._ansible_file def get_extra_vars(self): """ Return extra variable list passed to ansible """ return self._extra_vars def get_inventory_filename(self): """ Return inventory file name that was created """ return self._inventory_filename def _prepare_playbook_pkginstall(self): """ Prepare pkg install using ansible playbook. """ playbook = "%s/pkginstall.yml" % self._rundir cmdargs = ( '"pkgbasever=%s ' "pkgver=%s " "pkgfile=%s " "pkgfilebase=%s " "enterprise=%s " "pm1_host=%s " "postconfig_opts='%s' " "hdfs=%s " "rundir=%s " "pkgdir=%s " '"' % ( self._version[0], self._version, self._pkgfile, os.path.basename(self._pkgfile), self._entflag, self._pm1_ip, self._postconfig_opts, self._hdfsflag, self._rundir, self._pkgdir, ) ) if self._hadoop: Log.info("Running pkg install playbook with Hadoop; --extra-vars=%s" % cmdargs) else: Log.info("Running pkg install playbook; --extra-vars=%s" % cmdargs) return (playbook, cmdargs) def _prepare_playbook_pkgupgrade(self): """ Prepare pkg upgrade using ansible playbook. """ playbook = "%s/pkgupgrade.yml" % self._rundir cmdargs = ( '"pm1_host=%s ' "pkgdir=%s " "pkgbasever=%s " "upgbasever=%s " "upgver=%s " "upgfile=%s " "upgfilebase=%s " "enterprise=%s " "postconfig_opts='%s' " '"' % ( self._pm1_ip, self._pkgdir, self._version[0], self._upgversion[0], self._upgversion, self._upgfile, os.path.basename(self._upgfile), self._entflag, self._postconfig_opts, ) ) Log.info("Running pkg upgrade playbook; --extra-vars=%s" % cmdargs) return (playbook, cmdargs) def _prepare_playbook_bininstall(self): """ Prepare binary install using ansible playbook. """ playbook = "%s/bininstall.yml" % self._rundir if self._idbuser == "root": suflag = "no" else: suflag = "yes" cmdargs = ( '"idbuser=%s ' "pm1_host=%s " "sudo_flag=%s " "pkgbasever=%s " "pkgver=%s " "pkgfile=%s " "pkgfilebase=%s " "postconfig_opts='%s' " "hdfs=%s " "rundir=%s " "pkgdir=%s " '"' % ( self._idbuser, self._pm1_ip, suflag, self._version[0], self._version, self._pkgfile, os.path.basename(self._pkgfile), self._postconfig_opts, self._hdfsflag, self._rundir, self._pkgdir, ) ) if self._hadoop: Log.info("Running binary install playbook; with Hadoop; --extra-vars=%s" % cmdargs) else: Log.info("Running binary install playbook; --extra-vars=%s" % cmdargs) return (playbook, cmdargs) def _prepare_playbook_binupgrade(self): """ Prepare binary upgrade using ansible playbook. """ playbook = "%s/binupgrade.yml" % self._rundir cmdargs = ( '"idbuser=%s ' "pm1_host=%s " "pkgdir=%s " "upgfile=%s " "upgfilebase=%s " "postconfig_opts='%s' " '"' % ( self._idbuser, self._pm1_ip, self._pkgdir, self._upgfile, os.path.basename(self._upgfile), self._postconfig_opts, ) ) Log.info("Running binary upgrade playbook; --extra-vars=%s" % cmdargs) return (playbook, cmdargs)