Пример #1
0
    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}
Пример #2
0
    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)
Пример #3
0
    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
Пример #4
0
    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
Пример #5
0
    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)
Пример #6
0
    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}
Пример #7
0
    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
Пример #8
0
 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
Пример #9
0
    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)
Пример #10
0
    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)
Пример #11
0
    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
Пример #12
0
    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
Пример #13
0
    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
Пример #14
0
    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
Пример #15
0
    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
Пример #16
0
    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)
Пример #17
0
    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)
Пример #18
0
 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)
Пример #19
0
def log_error_node(params, message):
    message = '%s: %s' % (params['initiator_fqdn'], message)
    Log.error(message)
Пример #20
0
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}