def test_wait_for_introspection_partial_success(self):

        mock_inspector = mock.Mock()
        self.node_uuids = [
            'NODE1',
            'NODE2',
        ]

        mock_inspector.get_status.side_effect = [{
            'finished': True,
            'error': None
        }, {
            'finished': True,
            'error': "Failed"
        }]

        result = utils.wait_for_node_introspection(mock_inspector,
                                                   self.node_uuids,
                                                   loops=4,
                                                   sleep=0.01)

        self.assertEqual(list(result), [('NODE1', {
            'error': None,
            'finished': True
        }), ('NODE2', {
            'error': "Failed",
            'finished': True
        })])
    def test_wait_for_introspection_success(self):

        mock_inspector = mock.Mock()
        self.node_uuids = [
            'NODE1',
            'NODE2',
        ]

        mock_inspector.get_status.return_value = {
            'finished': True,
            'error': None
        }

        result = utils.wait_for_node_introspection(mock_inspector,
                                                   self.node_uuids,
                                                   loops=4,
                                                   sleep=0.01)

        self.assertEqual(list(result), [('NODE1', {
            'error': None,
            'finished': True
        }), ('NODE2', {
            'error': None,
            'finished': True
        })])
    def take_action(self, parsed_args):

        self.log.debug("take_action(%s)" % parsed_args)
        client = self.app.client_manager.baremetal
        inspector_client = self.app.client_manager.baremetal_introspection

        node_uuids = []

        print("Setting nodes for introspection to manageable...")
        self.log.debug("Moving available/enroll nodes to manageable state.")
        available_nodes = utils.nodes_in_states(client,
                                                ("available", "enroll"))
        for uuid in utils.set_nodes_state(client, available_nodes, 'manage',
                                          'manageable'):
            self.log.debug("Node {0} has been set to manageable.".format(uuid))

        manageable_nodes = utils.nodes_in_states(client, ("manageable",))
        for node in manageable_nodes:
            node_uuids.append(node.uuid)

            print("Starting introspection of node: {0}".format(node.uuid))
            inspector_client.introspect(node.uuid)

            # NOTE(dtantsur): PXE firmware on virtual machines misbehaves when
            # a lot of nodes start DHCPing simultaneously: it ignores NACK from
            # DHCP server, tries to get the same address, then times out. Work
            # around it by using sleep, anyway introspection takes much longer.
            time.sleep(5)

        print("Waiting for introspection to finish...")
        errors = []
        successful_node_uuids = set()
        for uuid, status in utils.wait_for_node_introspection(
                inspector_client, node_uuids):
            if status['error'] is None:
                print("Introspection for UUID {0} finished successfully."
                      .format(uuid))
                successful_node_uuids.add(uuid)
            else:
                print("Introspection for UUID {0} finished with error: {1}"
                      .format(uuid, status['error']))
                errors.append("%s: %s" % (uuid, status['error']))

        print("Setting manageable nodes to available...")

        self.log.debug("Moving manageable nodes to available state.")
        successful_nodes = [n for n in manageable_nodes
                            if n.uuid in successful_node_uuids]
        for uuid in utils.set_nodes_state(
                client, successful_nodes, 'provide',
                'available', skipped_states=("available", "active")):
            print("Node {0} has been set to available.".format(uuid))

        if errors:
            raise exceptions.IntrospectionError(
                "Introspection completed with errors:\n%s" % '\n'.join(errors))
        else:
            print("Introspection completed.")
    def test_wait_for_introspection_timeout(self):

        mock_inspector = mock.Mock()
        self.node_uuids = ["NODE1", "NODE2"]

        mock_inspector.get_status.return_value = {"finished": False, "error": None}

        result = utils.wait_for_node_introspection(mock_inspector, "TOKEN", "URL", self.node_uuids, loops=4, sleep=0.01)

        self.assertEqual(list(result), [])
    def test_wait_for_introspection_partial_success(self):

        mock_inspector = mock.Mock()
        self.node_uuids = ["NODE1", "NODE2"]

        mock_inspector.get_status.side_effect = [
            {"finished": True, "error": None},
            {"finished": True, "error": "Failed"},
        ]

        result = utils.wait_for_node_introspection(mock_inspector, "TOKEN", "URL", self.node_uuids, loops=4, sleep=0.01)

        self.assertEqual(
            list(result),
            [("NODE1", {"error": None, "finished": True}), ("NODE2", {"error": "Failed", "finished": True})],
        )
    def _run_introspection(self, nodes):
        inspector_client = self.app.client_manager.baremetal_introspection
        node_uuids = []

        for node in nodes:
            print("Starting introspection on node {0}".format(node.uuid))
            inspector_client.introspect(node.uuid)
            node_uuids.append(node.uuid)

        print("Waiting for introspection to finish")
        for uuid, status in utils.wait_for_node_introspection(
                inspector_client, node_uuids):
            if status['error'] is None:
                print("Introspection for node {0} finished successfully."
                      .format(uuid))
            else:
                print("Introspection for node {0} finished with error: {1}"
                      .format(uuid, status['error']))
    def test_wait_for_introspection_timeout(self):

        mock_inspector = mock.Mock()
        self.node_uuids = [
            'NODE1',
            'NODE2',
        ]

        mock_inspector.get_status.return_value = {
            'finished': False,
            'error': None
        }

        result = utils.wait_for_node_introspection(mock_inspector,
                                                   self.node_uuids,
                                                   loops=4, sleep=0.01)

        self.assertEqual(list(result), [])
示例#8
0
    def _run_introspection(self, nodes):
        inspector_client = self.app.client_manager.baremetal_introspection
        node_uuids = []

        for node in nodes:
            print("Starting introspection on node {0}".format(node.uuid))
            inspector_client.introspect(node.uuid)
            node_uuids.append(node.uuid)

        print("Waiting for introspection to finish")
        for uuid, status in utils.wait_for_node_introspection(
                inspector_client, node_uuids):
            if status['error'] is None:
                print(
                    "Introspection for node {0} finished successfully.".format(
                        uuid))
            else:
                print("Introspection for node {0} finished with error: {1}".
                      format(uuid, status['error']))
示例#9
0
    def test_wait_for_introspection_success(self):

        mock_inspector = mock.Mock()
        self.node_uuids = [
            'NODE1',
            'NODE2',
        ]

        mock_inspector.get_status.return_value = {
            'finished': True,
            'error': None
        }

        result = utils.wait_for_node_introspection(mock_inspector, "TOKEN",
                                                   "URL", self.node_uuids,
                                                   loops=4, sleep=0.01)

        self.assertEqual(list(result), [
            ('NODE1', {'error': None, 'finished': True}),
            ('NODE2', {'error': None, 'finished': True})
        ])
示例#10
0
    def test_wait_for_introspection_timeout(self):

        mock_inspector = mock.Mock()
        self.node_uuids = [
            'NODE1',
            'NODE2',
        ]

        mock_inspector.get_status.return_value = {
            'finished': False,
            'error': None
        }

        result = utils.wait_for_node_introspection(mock_inspector,
                                                   "TOKEN",
                                                   "URL",
                                                   self.node_uuids,
                                                   loops=4,
                                                   sleep=0.01)

        self.assertEqual(list(result), [])
    def test_wait_for_introspection_partial_success(self):

        mock_inspector = mock.Mock()
        self.node_uuids = [
            'NODE1',
            'NODE2',
        ]

        mock_inspector.get_status.side_effect = [{
            'finished': True,
            'error': None
        }, {
            'finished': True,
            'error': "Failed"
        }]

        result = utils.wait_for_node_introspection(mock_inspector,
                                                   self.node_uuids,
                                                   loops=4, sleep=0.01)

        self.assertEqual(list(result), [
            ('NODE1', {'error': None, 'finished': True}),
            ('NODE2', {'error': "Failed", 'finished': True})
        ])
    def take_action(self, parsed_args):

        self.log.debug("take_action(%s)" % parsed_args)
        client = self.app.client_manager.tripleoclient.baremetal()

        auth_token = self.app.client_manager.auth_ref.auth_token
        node_uuids = []

        print("Setting available nodes to manageable...")
        self.log.debug("Moving available nodes to manageable state.")
        available_nodes = [node for node in client.node.list()
                           if node.provision_state == "available"]
        for uuid in utils.set_nodes_state(client, available_nodes, 'manage',
                                          'manageable'):
            self.log.debug("Node {0} has been set to manageable.".format(uuid))

        for node in client.node.list():
            if node.provision_state != "manageable":
                continue

            node_uuids.append(node.uuid)

            print("Starting introspection of node: {0}".format(node.uuid))
            inspector_client.introspect(
                node.uuid,
                base_url=parsed_args.inspector_url,
                auth_token=auth_token)

            # NOTE(dtantsur): PXE firmware on virtual machines misbehaves when
            # a lot of nodes start DHCPing simultaneously: it ignores NACK from
            # DHCP server, tries to get the same address, then times out. Work
            # around it by using sleep, anyway introspection takes much longer.
            time.sleep(5)

        print("Waiting for introspection to finish...")
        has_errors = False
        for uuid, status in utils.wait_for_node_introspection(
                inspector_client, auth_token, parsed_args.inspector_url,
                node_uuids):
            if status['error'] is None:
                print("Introspection for UUID {0} finished successfully."
                      .format(uuid))
            else:
                print("Introspection for UUID {0} finished with error: {1}"
                      .format(uuid, status['error']))
                has_errors = True

        clients = self.app.client_manager
        baremetal_client = clients.tripleoclient.baremetal()
        print("Setting manageable nodes to available...")

        self.log.debug("Moving manageable nodes to available state.")
        available_nodes = [node for node in client.node.list()
                           if node.provision_state == "manageable"]
        for uuid in utils.set_nodes_state(
                baremetal_client, baremetal_client.node.list(), 'provide',
                'available', skipped_states=("available", "active")):
            print("Node {0} has been set to available.".format(uuid))

        if has_errors:
            print("Introspection completed with errors.")
        else:
            print("Introspection completed.")
示例#13
0
    def take_action(self, parsed_args):

        self.log.debug("take_action(%s)" % parsed_args)
        client = self.app.client_manager.baremetal
        inspector_client = self.app.client_manager.baremetal_introspection

        node_uuids = []

        print("Setting nodes for introspection to manageable...")
        self.log.debug("Moving available/enroll nodes to manageable state.")
        available_nodes = utils.nodes_in_states(client,
                                                ("available", "enroll"))
        for uuid in utils.set_nodes_state(client, available_nodes, 'manage',
                                          'manageable'):
            self.log.debug("Node {0} has been set to manageable.".format(uuid))

        manageable_nodes = utils.nodes_in_states(client, ("manageable", ))
        for node in manageable_nodes:
            node_uuids.append(node.uuid)

            print("Starting introspection of node: {0}".format(node.uuid))
            inspector_client.introspect(node.uuid)

            # NOTE(dtantsur): PXE firmware on virtual machines misbehaves when
            # a lot of nodes start DHCPing simultaneously: it ignores NACK from
            # DHCP server, tries to get the same address, then times out. Work
            # around it by using sleep, anyway introspection takes much longer.
            time.sleep(5)

        print("Waiting for introspection to finish...")
        errors = []
        successful_node_uuids = set()
        for uuid, status in utils.wait_for_node_introspection(
                inspector_client, node_uuids):
            if status['error'] is None:
                print(
                    "Introspection for UUID {0} finished successfully.".format(
                        uuid))
                successful_node_uuids.add(uuid)
            else:
                print("Introspection for UUID {0} finished with error: {1}".
                      format(uuid, status['error']))
                errors.append("%s: %s" % (uuid, status['error']))

        print("Setting manageable nodes to available...")

        self.log.debug("Moving manageable nodes to available state.")
        successful_nodes = [
            n for n in manageable_nodes if n.uuid in successful_node_uuids
        ]
        for uuid in utils.set_nodes_state(client,
                                          successful_nodes,
                                          'provide',
                                          'available',
                                          skipped_states=("available",
                                                          "active")):
            print("Node {0} has been set to available.".format(uuid))

        if errors:
            raise exceptions.IntrospectionError(
                "Introspection completed with errors:\n%s" % '\n'.join(errors))
        else:
            print("Introspection completed.")
示例#14
0
    def take_action(self, parsed_args):

        self.log.debug("take_action(%s)" % parsed_args)
        client = self.app.client_manager.tripleoclient.baremetal

        auth_token = self.app.client_manager.auth_ref.auth_token
        node_uuids = []

        print("Setting available nodes to manageable...")
        self.log.debug("Moving available nodes to manageable state.")
        available_nodes = [
            node
            for node in client.node.list(maintenance=False, associated=False)
            if node.provision_state == "available"
        ]
        for uuid in utils.set_nodes_state(client, available_nodes, 'manage',
                                          'manageable'):
            self.log.debug("Node {0} has been set to manageable.".format(uuid))

        for node in client.node.list(maintenance=False, associated=False):
            if node.provision_state != "manageable":
                continue

            node_uuids.append(node.uuid)

            print("Starting introspection of node: {0}".format(node.uuid))
            inspector_client.introspect(node.uuid,
                                        base_url=parsed_args.inspector_url,
                                        auth_token=auth_token)

            # NOTE(dtantsur): PXE firmware on virtual machines misbehaves when
            # a lot of nodes start DHCPing simultaneously: it ignores NACK from
            # DHCP server, tries to get the same address, then times out. Work
            # around it by using sleep, anyway introspection takes much longer.
            time.sleep(5)

        print("Waiting for introspection to finish...")
        has_errors = False
        for uuid, status in utils.wait_for_node_introspection(
                inspector_client, auth_token, parsed_args.inspector_url,
                node_uuids):
            if status['error'] is None:
                print(
                    "Introspection for UUID {0} finished successfully.".format(
                        uuid))
            else:
                print("Introspection for UUID {0} finished with error: {1}".
                      format(uuid, status['error']))
                has_errors = True

        print("Setting manageable nodes to available...")

        self.log.debug("Moving manageable nodes to available state.")
        available_nodes = [
            node
            for node in client.node.list(maintenance=False, associated=False)
            if node.provision_state == "manageable"
        ]
        for uuid in utils.set_nodes_state(client,
                                          available_nodes,
                                          'provide',
                                          'available',
                                          skipped_states=("available",
                                                          "active")):
            print("Node {0} has been set to available.".format(uuid))

        if has_errors:
            print("Introspection completed with errors.")
        else:
            print("Introspection completed.")