def process(self): try: errors = [] for task in LUNCloneJob.pending(): try: Log.info('%s job %s started' % (task.job_type.code, task.id)) task.set_status_start_job() if task.is_create(): self.create_clones(task) else: self.delete_clones(task) task.set_status_complete() Log.info('%s job %s completed' % (task.job_type.code, task.id)) except (Exception), e: error = u'%s:\n%s' % (str(e), traceback.format_exc()) Log.error('%s job %s failed' % (task.job_type.code, task.id)) Log.error(error) task.set_status_failed(error) errors.append(task.error) if len(errors) > 0: message = {'message': errors} return {'status': 'error', 'errors': errors}
def parseSNMPLine(self, line): """ Private member, parses a line of output from snmpwalk Returns ------- A tuple (oid, value) """ oid = None value = None # Split the line on the first '=' character parts = line.split('=', 1) if len(parts) == 2: oid = parts[0].rstrip().lstrip() value = parts[1].rstrip().lstrip() valueParts = value.split(':', 1) if len(valueParts) == 2: type = valueParts[0].rstrip().lstrip() value = valueParts[1].rstrip().lstrip() if type == 'STRING': value = value.rstrip('"').lstrip('"') else: Log.error('Cannot parse SNMP value: "%s"' % (valueType)) else: Log.error('Cannot parse SNMP key/value pair: "%s"' % (line)) return (oid, value)
def discoverIncorrectBIOSSettings(cls, expectedFilename, dumpCmd): """ Discover incorrect BIOS settings Params ------ expectedFilename: string A filename of expected bios settings dumpCmd: array Command to dump bios settings Returns A dictionary of key value pairs of incorrect bios settings """ try: # Read expected bios settings expectedFile = Blade.openFile(expectedFilename) expected = Blade.parseBios(expectedFile) # Read actual bios settings (actualFile, exitcode) = Command.run(dumpCmd) actual = Blade.parseBios(actualFile) return Blade.compareBiosSettings(expected, actual) except (OSError, IOError) as e: Log.error(str(e)) sys.exit(1) return None
def discoverIncorrectBIOSSettings(cls, expectedFilename, dumpCmd): """ Discover incorrect BIOS settings Params ------ expectedFilename: string A filename of expected bios settings dumpCmd: array Command to dump bios settings Returns A dictionary of key value pairs of incorrect bios settings """ try: # Read expected bios settings expectedFile = Blade.openFile(expectedFilename) expected = Blade.parseBios(expectedFile) # Read actual bios settings (actualFile, exitcode) = Command.run(dumpCmd) actual = Blade.parseBios(actualFile) return Blade.compareBiosSettings(expected, actual) except (OSError, IOError) as e: Log.error(str(e)) sys.exit(1) return None
def parseSNMPLine(self, line): """ Private member, parses a line of output from snmpwalk Returns ------- A tuple (oid, value) """ oid = None value = None # Split the line on the first '=' character parts = line.split('=', 1) if len(parts) == 2: oid = parts[0].rstrip().lstrip() value = parts[1].rstrip().lstrip() valueParts = value.split(':', 1) if len(valueParts) == 2: type = valueParts[0].rstrip().lstrip() value = valueParts[1].rstrip().lstrip() if type == 'STRING': value = value.rstrip('"').lstrip('"') else: Log.error('Cannot parse SNMP value: "%s"' % (valueType)) else: Log.error('Cannot parse SNMP key/value pair: "%s"' % (line)) return (oid, value)
def process(self): try: errors = [] for task in LUNCloneJob.pending(): try: Log.info('%s job %s started' % (task.job_type.code, task.id)) task.set_status_start_job() if task.is_create(): self.create_clones(task) else: self.delete_clones(task) task.set_status_complete() Log.info('%s job %s completed' % (task.job_type.code, task.id)) except (Exception), e: error = u'%s:\n%s' % (str(e), traceback.format_exc()) Log.error('%s job %s failed' % (task.job_type.code, task.id)) Log.error(error) task.set_status_failed(error) errors.append(task.error) if len(errors) > 0: message = {'message': errors} return {'status': 'error', 'errors': errors}
def putDocument(self, docId, params): """ PUT a document on the CouchDB server. If the document already exists, you will need to pass in a _rev param with the revision you would like to update. The saveDocument() method handles this for you, if all you want to do is save a document, regardless of whether or not it already exists. Params ------ docId : string The unique ID of the document params : dictionary A dictionary of parameters that define the document """ path = '/%s/%s' % (self.db, docId.replace(' ', '+')) Log.debug(100, 'Putting %s' % path) connection = httplib.HTTPConnection(self.host, self.port) connection.connect() params['updatedAt'] = CouchDB.now() connection.request('PUT', path, json.dumps(params), { 'Content-Type': 'application/json' }) result = json.loads(connection.getresponse().read()) if result.has_key(u'error'): Log.error('PUT %s: %s' % (path, result)) return result
def create_task(self, job_type_name): try: args = self.array_parser.parse_args() details = LUNCloneJob.with_args(args, job_type_name) Log.info('%s job %s added to queue' % (job_type_name, details.id)) return {'status': 'ok', 'job_id': details.id}, 201 except (Exception), e: Log.error('%s:\n%s' % (str(e), traceback.format_exc())) return {'status': str(e), 'stacktrace': traceback.format_exc()}, 501
def run(cls, args): output = None exitCode = 0 try: Log.debug(100, ' '.join(args)) proc = Popen(args, stdout=PIPE) output = proc.communicate()[0].split('\n') exitCode = proc.returncode except (OSError) as e: Log.error(str(e)) return (output, exitCode)
def run(cls, args): output = None exitCode = 0 try: Log.debug(100, " ".join(args)) proc = Popen(args, stdout=PIPE) output = proc.communicate()[0].split("\n") exitCode = proc.returncode except (OSError) as e: Log.error(str(e)) return (output, exitCode)
def bladeInfo(self, snmp, inOid): """ Retrieve information about blades in a chassis """ values = snmp.walk(inOid) slotValues = [] for (oid, value) in values: slot = snmp.extractLastOctet(oid) if slot: slotValues.append( (slot, value) ) if not slotValues: Log.error('No results for %s %s' % (host, inOid)) return slotValues
def bladeInfo(self, snmp, inOid): """ Retrieve information about blades in a chassis """ values = snmp.walk(inOid) slotValues = [] for (oid, value) in values: slot = snmp.extractLastOctet(oid) if slot: slotValues.append((slot, value)) if not slotValues: Log.error('No results for %s %s' % (host, inOid)) return slotValues
def delete(self, params): """ Delete a document. Params must have an _id and _rev param """ path = '/%s/%s?rev=%s' % (self.db, params['_id'].replace(' ', '+'), params['_rev'].replace(' ', '+')) Log.debug(10, 'DELETE %s' % path) connection = httplib.HTTPConnection(self.host, self.port) connection.connect() connection.request('DELETE', path) result = json.loads(connection.getresponse().read()) if result.has_key(u'error'): if result[u'error'] != u'not_found': Log.error('GET %s: %s' % (path, result)) return result
def getDocument(self, docId): """ GET a document from the server Params ------ docId : string The unique ID of the document """ path = '/%s/%s' % (self.db, docId.replace(' ', '+')) connection = httplib.HTTPConnection(self.host, self.port) connection.connect() connection.request('GET', path) result = json.loads( connection.getresponse().read()) if result.has_key(u'error'): if result[u'error'] != u'not_found': Log.error('GET %s: %s' % (path, result)) return result
def get(self, id): try: results = LUNCloneJob.get_job(id) if results.count() == 0: return {'status': 'error', 'reason': 'unknown job id'}, 501 if results.count() > 1: return {'status': 'error', 'reason': 'too many jobs match this id'}, 501 job = results.one() retval = { 'status': '%s' % job.status.code, 'job_type': '%s' % job.job_type.code, 'num_requested': job.num_requested, 'num_clones': job.num_clones, 'num_targets': job.num_targets, 'num_completed': job.num_completed, 'percent_completed': job.percent_completed, 'job_time': job.job_time, 'clone_time': job.clone_time, 'target_time': job.target_time, 'udevd_time': job.udevd_time, 'lag_time': job.lag_time, } if job.status == 'failed': if job.error is not None: if job.error != '': retval['error'] = job.error return retval, 201 except (Exception), e: Log.error('%s:\n%s' % (str(e), traceback.format_exc())) return {'status': str(e), 'stacktrace': traceback.format_exc()}, 501
def split(self, line): """ Private member, splits a line of snmpwalk output into the oid and value Returns ------- A tuple (oid, value) """ oid = None value = None # Split the line on the first '=' character parts = line.split('=', 1) if len(parts) == 2: oid = parts[0].rstrip().lstrip() value = parts[1].rstrip().lstrip().rstrip('"').lstrip('"') #print('oid:value %s:%s' % (oid, value)) # start valueParts = value.split(':', 1) if len(valueParts) == 2: type = valueParts[0].rstrip().lstrip() value = valueParts[1].rstrip().lstrip() if type == 'STRING': value = value.rstrip('"').lstrip('"') else: print('type: %s' % type) else: Log.error('Cannot parse SNMP value: "%s"' % (valueType)) # end else: Log.error('Cannot parse SNMP key/value pair: "%s"' % (line)) return (oid, value)
def split(self, line): """ Private member, splits a line of snmpwalk output into the oid and value Returns ------- A tuple (oid, value) """ oid = None value = None # Split the line on the first '=' character parts = line.split('=', 1) if len(parts) == 2: oid = parts[0].rstrip().lstrip() value = parts[1].rstrip().lstrip().rstrip('"').lstrip('"') #print('oid:value %s:%s' % (oid, value)) # start valueParts = value.split(':', 1) if len(valueParts) == 2: type = valueParts[0].rstrip().lstrip() value = valueParts[1].rstrip().lstrip() if type == 'STRING': value = value.rstrip('"').lstrip('"') else: print ('type: %s' % type) else: Log.error('Cannot parse SNMP value: "%s"' % (valueType)) # end else: Log.error('Cannot parse SNMP key/value pair: "%s"' % (line)) return (oid, value)
def typeIs(cls, arg, tp): if not type(arg) is tp: message = 'Type %s required, received %s: %s' % (tp.__name__, type(arg).__name__, repr(arg)) Log.error(message) raise TypeError(message)
def log_error_node(params, message): message = '%s: %s' % (params['initiator_fqdn'], message) Log.error(message)
class LUNQueue: '''Processes the LUN clone queue''' def create_clone(self, zfs, args): created_clone = None # Create the ZFS clone created_clone = zfs.clone(args) if created_clone is not None: return True return None def create_target(self, mgr, args): created = None # Create the iSCSI target args['device'] = '/dev/zvol/%s' % args['dst'] created = mgr.create_iscsi_target(args) if created is not None: return True return None def remove_target(self, mgr, args): mgr.delete_target_and_block_store(args) def remove_clone(self, task, zfs, args): # If deleteClones = true, then the dst parameter is also required. deleteClones = args.get('deleteClones', None) if deleteClones: if args.get('dst', None) is None: message = { 'message': 'deleteClones parameter requires dst ' 'parameter' } return message zfs.destroy(args) else: Log.info( 'Delete task %s did not specify deleteClones param for %s' % (task.id, args[u'dst'])) def create_clones(self, task): # Set up ZFS and Target management zfs = ZFS() mgr = TargetManager() num_created = 0 task.set_status_start_creating_clones() for arg in task.details['clones']: self.create_clone(zfs, arg) task.increment_num_clones() task.set_status_done_creating_clones() # Give udevd a chance to settle down and create associated devices task.set_status_start_waiting_udevd() zfs.udevd_settle_down() task.set_status_done_waiting_udevd() task.set_status_start_creating_targets() for arg in task.details['clones']: self.create_target(mgr, arg) task.increment_num_targets() task.increment_num_completed() task.set_status_done_creating_targets() mgr.save() def delete_clones(self, task): # Set up ZFS and Target management zfs = ZFS() mgr = TargetManager() task.set_status_start_deleting_targets() for arg in task.details['clones']: self.remove_target(mgr, arg) task.increment_num_clones() task.set_status_done_deleting_targets() task.set_status_start_deleting_clones() for arg in task.details['clones']: self.remove_clone(task, zfs, arg) task.increment_num_targets() task.increment_num_completed() task.set_status_done_deleting_clones() mgr.save() def process(self): try: errors = [] for task in LUNCloneJob.pending(): try: Log.info('%s job %s started' % (task.job_type.code, task.id)) task.set_status_start_job() if task.is_create(): self.create_clones(task) else: self.delete_clones(task) task.set_status_complete() Log.info('%s job %s completed' % (task.job_type.code, task.id)) except (Exception), e: error = u'%s:\n%s' % (str(e), traceback.format_exc()) Log.error('%s job %s failed' % (task.job_type.code, task.id)) Log.error(error) task.set_status_failed(error) errors.append(task.error) if len(errors) > 0: message = {'message': errors} return {'status': 'error', 'errors': errors} except (Exception), e: error = u'%s:\n%s' % (str(e), traceback.format_exc()) Log.error(error) return {'status': 'error', 'message': error}