def __init__(self, sname): ''' Reads profile names associated with this service from database, creates objects for them and stores these objects into instance attributes ''' ServicePrintObject.__init__(self, sname) self.profiles = list() self.max_profman_len = 0 self.max_crit_len = 0 try: # Read all profiles for this service for name in AIdb.getNames(self.aiqueue, AIdb.PROFILES_TABLE): # Record the longest profile name if self.max_profman_len < len(name): self.max_profman_len = len(name) profile = ProfilePrintObject(self.aiqueue, name) # Record the longest criteria in this service if profile.get_max_crit_len() > self.max_crit_len: self.max_crit_len = profile.get_max_crit_len() self.profiles.append(profile) except StandardError as err: sys.stderr.write(_('Error: AI database access error\n%s\n') % err) raise
def __init__(self, sname): ''' Reads manifest names associated with this service from database, creates objects for them and stores these objects into instance attributes. Manifests are sorted into 3 groups - Active, Inactive and Default. ''' ServicePrintObject.__init__(self, sname) try: default_mname = self.service.get_default_manifest() except StandardError: default_mname = "" self.default_manifest = None self.active_manifests = list() self.inactive_manifests = list() self.max_profman_len = 0 self.max_crit_len = 0 try: # Read all manifests for this service for name in AIdb.getNames(self.aiqueue, AIdb.MANIFESTS_TABLE): if self.max_profman_len < len(name): self.max_profman_len = len(name) if name == default_mname: manifest = ManifestPrintObject(self.aiqueue, name, default=True) self.default_manifest = manifest else: manifest = ManifestPrintObject(self.aiqueue, name) if manifest.get_has_crit(): self.active_manifests.append(manifest) else: self.inactive_manifests.append(manifest) if manifest.get_max_crit_len() > self.max_crit_len: self.max_crit_len = manifest.get_max_crit_len() except StandardError as err: sys.stderr.write(_('Error: AI database access error\n%s\n') % err) raise
def get_mfest_or_profile_criteria(sname, services, dbtable): """ Iterate through all the manifests or profiles for the named service (sname) pointed to by the SCF service. Args sname = service name services = config.get_all_service_props() dbtable = database table, distinguishing manifests from profiles Assumed to be one of AIdb.MANIFESTS_TABLE or AIdb.PROFILES_TABLE Returns a dictionary of the criteria for the named service within a list: { servicename1:[ { 'arch':arch1, 'mem':memory1, 'ipv4':ipaddress1, 'mac':macaddr1, 'platform':platform1, 'network':network1, 'cpu':cpu1, 'zonename':z1 }, ... ] } * Note1: platform, network and cpu are currently not-implemented upstream. * Note2: could simply use a list of dictionaries but implemented as a dictionary of a list of dictionary which will allow for multiple services to be listed at the same time. width of longest manifest or profile name width of longest criteria Raises None """ sdict = dict() width = 0 cwidth = 0 # ensure the named service is in our service dictionary. lservices = services.keys() if sname in lservices: try: path = AIService(sname).database_path except VersionError as version_err: warn_version(version_err) return sdict, width, cwidth if os.path.exists(path): try: maisql = AIdb.DB(path) maisql.verifyDBStructure() aiqueue = maisql.getQueue() if dbtable == AIdb.MANIFESTS_TABLE: for name in AIdb.getNames(aiqueue, dbtable): sdict[name] = list() instances = AIdb.numInstances(name, aiqueue) for instance in range(0, instances): width = max(len(name), width) criteria = AIdb.getManifestCriteria(name, instance, aiqueue, humanOutput=True, onlyUsed=True) if criteria: tdict, twidth = get_criteria_info(criteria) cwidth = max(twidth, cwidth) sdict[name].append(tdict) elif dbtable == AIdb.PROFILES_TABLE: for name in AIdb.getNames(aiqueue, dbtable): sdict[name] = list() criteria = AIdb.getProfileCriteria(name, aiqueue, humanOutput=True, onlyUsed=True) width = max(len(name), width) tdict, twidth = get_criteria_info(criteria) cwidth = max(twidth, cwidth) sdict[name].append(tdict) else: raise ValueError("Invalid value for dbtable: %s" % dbtable) except StandardError as err: sys.stderr.write(_('Error: AI database access error\n%s\n') % err) sys.exit(1) else: sys.stderr.write(_('Error: unable to locate AI database on server ' 'for %s\n') % sname) sys.exit(1) return sdict, width, cwidth
def get_manifest_or_profile_names(services, dbtable): """ Iterate through the services retrieving all the stored manifest or profile names. Args services = dictionary of service properties dbtable = database table, distinguishing manifests from profiles Returns a dictionary of service manifests or profiles within a list: { servicename1: [ [name, has_criteria (boolean), {crit:value, ... }], ... ], ... } the width of the longest service name (swidth) the width of the longest manifest name (mwidth) the width of the longest criteria (cwidth) Raises None """ swidth = 0 mwidth = 0 cwidth = 0 sdict = dict() for sname in sorted(services.keys()): try: service = AIService(sname) except VersionError as err: warn_version(err) continue path = service.database_path if os.path.exists(path): try: maisql = AIdb.DB(path) maisql.verifyDBStructure() aiqueue = maisql.getQueue() swidth = max(len(sname), swidth) if not AIdb.tableExists(aiqueue, dbtable): continue for name in AIdb.getNames(aiqueue, dbtable): mwidth = max(len(name), mwidth) tdict = dict() if dbtable == 'manifests': instances = AIdb.numInstances(name, aiqueue) for instance in range(0, instances): criteria = AIdb.getTableCriteria(name, instance, aiqueue, dbtable, humanOutput=False, onlyUsed=True) has_criteria = False if criteria is not None: for key in criteria.keys(): if criteria[key] is not None: has_criteria = True break if has_criteria: # We need criteria in human readable form hrcrit = AIdb.getTableCriteria(name, instance, aiqueue, dbtable, humanOutput=True, onlyUsed=True) tdict, twidth = get_criteria_info(hrcrit) cwidth = max(twidth, cwidth) else: criteria = AIdb.getTableCriteria(name, None, aiqueue, dbtable, humanOutput=False, onlyUsed=True) has_criteria = False if criteria is not None: for key in criteria.keys(): if criteria[key] is not None: has_criteria = True break if sname in sdict: slist = sdict[sname] slist.append([name, has_criteria, tdict]) sdict[sname] = slist else: sdict[sname] = [[name, has_criteria, tdict]] except StandardError as err: sys.stderr.write(_('Error: AI database access error\n%s\n') % err) continue else: sys.stderr.write(_('Error: unable to locate AI database for "%s" ' 'on server\n') % sname) continue return sdict, swidth, mwidth, cwidth
def get_mfest_or_profile_criteria(sname, services, dbtable): """ Iterate through all the manifests or profiles for the named service (sname) pointed to by the SCF service. Args sname = service name services = config.get_all_service_props() dbtable = database table, distinguishing manifests from profiles Assumed to be one of AIdb.MANIFESTS_TABLE or AIdb.PROFILES_TABLE Returns a dictionary of the criteria for the named service within a list: { servicename1:[ { 'arch':arch1, 'mem':memory1, 'ipv4':ipaddress1, 'mac':macaddr1, 'platform':platform1, 'network':network1, 'cpu':cpu1, 'zonename':z1 }, ... ] } * Note1: platform, network and cpu are currently not-implemented upstream. * Note2: could simply use a list of dictionaries but implemented as a dictionary of a list of dictionary which will allow for multiple services to be listed at the same time. width of longest manifest or profile name width of longest criteria Raises None """ sdict = dict() width = 0 cwidth = 0 # ensure the named service is in our service dictionary. lservices = services.keys() if sname in lservices: try: path = AIService(sname).database_path except VersionError as version_err: warn_version(version_err) return sdict, width, cwidth if os.path.exists(path): try: maisql = AIdb.DB(path) maisql.verifyDBStructure() aiqueue = maisql.getQueue() if dbtable == AIdb.MANIFESTS_TABLE: for name in AIdb.getNames(aiqueue, dbtable): sdict[name] = list() instances = AIdb.numInstances(name, aiqueue) for instance in range(0, instances): width = max(len(name), width) criteria = AIdb.getManifestCriteria( name, instance, aiqueue, humanOutput=True, onlyUsed=True) if criteria: tdict, twidth = get_criteria_info(criteria) cwidth = max(twidth, cwidth) sdict[name].append(tdict) elif dbtable == AIdb.PROFILES_TABLE: for name in AIdb.getNames(aiqueue, dbtable): sdict[name] = list() criteria = AIdb.getProfileCriteria(name, aiqueue, humanOutput=True, onlyUsed=True) width = max(len(name), width) tdict, twidth = get_criteria_info(criteria) cwidth = max(twidth, cwidth) sdict[name].append(tdict) else: raise ValueError("Invalid value for dbtable: %s" % dbtable) except StandardError as err: sys.stderr.write( _('Error: AI database access error\n%s\n') % err) sys.exit(1) else: sys.stderr.write( _('Error: unable to locate AI database on server ' 'for %s\n') % sname) sys.exit(1) return sdict, width, cwidth
def get_manifest_or_profile_names(services, dbtable): """ Iterate through the services retrieving all the stored manifest or profile names. Args services = dictionary of service properties dbtable = database table, distinguishing manifests from profiles Returns a dictionary of service manifests or profiles within a list: { servicename1: [ [name, has_criteria (boolean), {crit:value, ... }], ... ], ... } the width of the longest service name (swidth) the width of the longest manifest name (mwidth) the width of the longest criteria (cwidth) Raises None """ swidth = 0 mwidth = 0 cwidth = 0 sdict = dict() for sname in sorted(services.keys()): try: service = AIService(sname) except VersionError as err: warn_version(err) continue path = service.database_path if os.path.exists(path): try: maisql = AIdb.DB(path) maisql.verifyDBStructure() aiqueue = maisql.getQueue() swidth = max(len(sname), swidth) if not AIdb.tableExists(aiqueue, dbtable): continue for name in AIdb.getNames(aiqueue, dbtable): mwidth = max(len(name), mwidth) tdict = dict() if dbtable == 'manifests': instances = AIdb.numInstances(name, aiqueue) for instance in range(0, instances): criteria = AIdb.getTableCriteria(name, instance, aiqueue, dbtable, humanOutput=False, onlyUsed=True) has_criteria = False if criteria is not None: for key in criteria.keys(): if criteria[key] is not None: has_criteria = True break if has_criteria: # We need criteria in human readable form hrcrit = AIdb.getTableCriteria( name, instance, aiqueue, dbtable, humanOutput=True, onlyUsed=True) tdict, twidth = get_criteria_info(hrcrit) cwidth = max(twidth, cwidth) else: criteria = AIdb.getTableCriteria(name, None, aiqueue, dbtable, humanOutput=False, onlyUsed=True) has_criteria = False if criteria is not None: for key in criteria.keys(): if criteria[key] is not None: has_criteria = True break if sname in sdict: slist = sdict[sname] slist.append([name, has_criteria, tdict]) sdict[sname] = slist else: sdict[sname] = [[name, has_criteria, tdict]] except StandardError as err: sys.stderr.write( _('Error: AI database access error\n%s\n') % err) continue else: sys.stderr.write( _('Error: unable to locate AI database for "%s" ' 'on server\n') % sname) continue return sdict, swidth, mwidth, cwidth