Example #1
0
    def updateNode(self, nodeName, updateNodeRequest):
        self.getLogger().debug('updateNode(): name=[{0}]'.format(nodeName))

        session = DbManager().openSession()

        try:
            node = NodesDbHandler().getNode(session, nodeName)

            if 'nics' in updateNodeRequest:
                nic = updateNodeRequest['nics'][0]

                if 'ip' in nic:
                    node.nics[0].ip = nic['ip']
                    node.nics[0].boot = True

            # Call resource adapter
            NodesDbHandler().updateNode(session, node, updateNodeRequest)

            run_post_install = False

            if 'state' in updateNodeRequest:
                run_post_install = node.state == 'Allocated' and \
                    updateNodeRequest['state'] == 'Provisioned'

                node.state = updateNodeRequest['state']

            session.commit()

            if run_post_install:
                self.getLogger().debug(
                    'updateNode(): run-post-install for node [{0}]'.format(
                        node.name))

                self.__scheduleUpdate()
        except Exception:
            session.rollback()

            self.getLogger().exception(
                'Exception updating node [{0}]'.format(nodeName))
        finally:
            DbManager().closeSession()
Example #2
0
    def updateNodeStatus(self, nodeName, state=None, bootFrom=None):
        """Update node status

        If neither 'state' nor 'bootFrom' are not None, this operation will
        update only the 'lastUpdated' timestamp.

        Returns:
            bool indicating whether state and/or bootFrom differed from
            current value
        """

        value = 'None' if bootFrom is None else \
            '1 (disk)' if int(bootFrom) == 1 else '0 (network)'

        self.getLogger().debug(
            'updateNodeStatus(): node=[%s], state=[%s], bootFrom=[%s]' %
            (nodeName, state, value))

        session = DbManager().openSession()

        try:
            dbNode = NodesDbHandler().getNode(session, nodeName)

            # Bitfield representing node changes (0 = state change, 1 = bootFrom
            # change)
            changed = 0

            if state is not None and state != dbNode.state:
                # 'state' changed
                changed |= 1

            if bootFrom is not None and bootFrom != dbNode.bootFrom:
                # 'bootFrom' changed
                changed |= 2

            if changed:
                # Create custom log message
                msg = 'Node [%s] state change:' % (dbNode.name)

                if changed & 1:
                    msg += ' state: [%s] -> [%s]' % (dbNode.state, state)

                    dbNode.state = state

                if changed & 2:
                    msg += ' bootFrom: [%d] -> [%d]' % (dbNode.bootFrom,
                                                        bootFrom)

                    dbNode.bootFrom = bootFrom

                self.getLogger().info(msg)
            else:
                self.getLogger().info('Updated timestamp for node [%s]' %
                                      (dbNode.name))

            dbNode.lastUpdate = time.strftime('%Y-%m-%d %H:%M:%S',
                                              time.localtime(time.time()))

            result = bool(changed)

            # Only change local boot configuration if the hardware profile is
            # not marked as 'remote' and we're not acting on the installer node.
            if dbNode.softwareprofile and \
                    dbNode.softwareprofile.type != 'installer' and \
                    dbNode.hardwareprofile.location != 'remote':
                # update local boot configuration for on-premise nodes
                self._bhm.writePXEFile(dbNode, localboot=bootFrom)

            session.commit()

            return result
        finally:
            DbManager().closeSession()