示例#1
0
    def test_astute_message_creation(self, mmake_astute_message, mrpc):
        # 'discover' node is not deployed yet -- it will be removed
        # immediately
        n_discover = self.add_node(consts.NODE_STATUSES.discover)
        # 'ready' node is deployed -- astute will take care of it
        self.add_node(consts.NODE_STATUSES.ready)
        # 'offline' node will also be passed to astute
        self.add_node(consts.NODE_STATUSES.ready, online=False)

        nodes = DeletionTask.get_task_nodes_for_cluster(self.cluster_db)
        astute_nodes = [
            node for node in nodes['nodes_to_delete']
            if node['id'] != n_discover.id
        ]

        self.assertEqual(len(nodes['nodes_to_delete']), 3)
        self.assertEqual(len(nodes['nodes_to_restore']), 0)

        task = models.Task(name=consts.TASK_NAMES.cluster_deletion,
                           cluster=self.cluster_db)
        db().add(task)
        db().commit()

        DeletionTask.execute(task, nodes=nodes)

        self.assertEqual(mmake_astute_message.call_count, 1)
        message = mmake_astute_message.call_args[0][3]

        self.assertIn('nodes', message)
        self.assertItemsEqual(message['nodes'], astute_nodes)

        self.assertEqual(mrpc.cast.call_count, 1)
示例#2
0
    def test_undeployed_node_called(
            self,
            mremove_undeployed_nodes_from_db,
            mmake_astute_message,
            mrpc):
        self.add_node(consts.NODE_STATUSES.discover)

        nodes = DeletionTask.get_task_nodes_for_cluster(self.cluster_db)

        self.assertEqual(len(nodes['nodes_to_delete']), 1)
        self.assertEqual(len(nodes['nodes_to_restore']), 0)

        task = models.Task(
            name=consts.TASK_NAMES.cluster_deletion,
            cluster=self.cluster_db
        )
        db().add(task)
        db().commit()

        mremove_undeployed_nodes_from_db.return_value = []
        DeletionTask.execute(task, nodes=nodes)

        mremove_undeployed_nodes_from_db.assert_called_once_with(
            nodes['nodes_to_delete'])
        self.assertEqual(mmake_astute_message.call_count, 1)
        self.assertEqual(mrpc.cast.call_count, 1)
 def test_does_not_fail_if_there_is_deleted_task(self):
     task = models.Task(name=consts.TASK_NAMES.deployment,
                        deleted_at=datetime.datetime.now(),
                        cluster_id=self.cluster.id)
     db.add(task)
     db.flush()
     self.assertNotRaises(errors.TaskAlreadyRunning,
                          self.task_manager.check_running_task)
示例#4
0
    def test_deploy_disabled_dpdk_check_ok_without_numa_meta(self, _):
        node = self.env.nodes[0]

        node.meta.pop('numa_topology', {})

        task = models.Task(name=consts.TASK_NAMES.deployment,
                           cluster=self.cluster)
        self.assertNotRaises(errors.InvalidData,
                             CheckBeforeDeploymentTask.execute, task)
    def test_fails_if_there_is_task(self):
        task = models.Task(name=consts.TASK_NAMES.deployment,
                           cluster_id=self.cluster.id,
                           status=consts.TASK_STATUSES.pending)
        db.add(task)
        db.flush()

        self.assertRaises(errors.TaskAlreadyRunning,
                          self.task_manager.check_running_task)
示例#6
0
 def test_no_node_no_cry(self):
     cluster = self.env.create_cluster(api=True)
     cluster_id = cluster['id']
     manager_ = manager.ApplyChangesTaskManager(cluster_id)
     task = models.Task(name='provision', cluster_id=cluster_id)
     self.db.add(task)
     self.db.commit()
     rpc.receiver.NailgunReceiver.deploy_resp(nodes=[
         {'uid': 666, 'id': 666, 'status': 'discover'}
     ], task_uuid=task.uuid)
     self.assertRaises(errors.WrongNodeStatus, manager_.execute)
示例#7
0
    def test_skip_private_net_for_the_only_node_wo_dpdk(self):
        self.env.create_node(cluster_id=self.cluster.id,
                             pending_addition=True,
                             roles=['compute'])
        self.assertEqual(len(self.env.nodes), 2)

        dpdk_iface = None
        network_config = []
        private_ifaces = {}
        for node in self.env.nodes:
            nic_1 = node.interfaces[0]
            nic_2 = node.interfaces[1]
            default_vlans = {
                consts.NETWORKS.public: [100],
                consts.NETWORKS.storage: [101],
                consts.NETWORKS.management: [102],
                consts.NETWORKS.fuelweb_admin: [103],
                consts.NETWORKS.private: [1234, 1235]
            }

            if not dpdk_iface:
                dpdk_iface = nic_2
            nets_1 = nic_1.assigned_networks_list
            nets_2 = nic_2.assigned_networks_list

            for i, net in enumerate(nets_1):
                if net['name'] == consts.NETWORKS.private:
                    nets_2.append(nets_1.pop(i))
                    break
            objects.NIC.assign_networks(nic_1, nets_1)
            objects.NIC.assign_networks(nic_2, nets_2)

            node.status = consts.NODE_STATUSES.ready
            for iface in node.interfaces:
                for ng in iface.assigned_networks_list:
                    network_config.append({'name': ng.name,
                                           'vlans': default_vlans[ng.name]})
                    if ng.name == consts.NETWORKS.private:
                        private_ifaces[node.name] = iface.name

        dpdk_iface.attributes['dpdk']['enabled']['value'] = True

        task = models.Task(
            name=consts.TASK_NAMES.check_networks,
            cluster=self.cluster
        )

        verify_task = VerifyNetworksTask(task, network_config)

        message = verify_task.get_message_body()
        for node in message['nodes']:
            self.assertNotIn(private_ifaces[node['name']],
                             (n['iface'] for n in node['networks']))
示例#8
0
    def test_does_not_fail_if_there_is_deleted_task(self):
        for task_name in DeploymentCheckMixin.deployment_tasks:
            task = models.Task(name=task_name,
                               deleted_at=datetime.datetime.now(),
                               cluster_id=self.cluster.id)
            db.add(task)
            db.flush()
            self.addCleanup(db.query(models.Task).delete)

            self.assertNotRaises(
                errors.DeploymentAlreadyStarted,
                DeploymentCheckMixin.check_no_running_deployment, self.cluster)
示例#9
0
    def test_fails_if_there_is_task(self):
        for task_name in DeploymentCheckMixin.deployment_tasks:
            task = models.Task(name=task_name, cluster_id=self.cluster.id)
            db.add(task)
            db.flush()
            self.assertRaisesWithMessage(
                errors.DeploymentAlreadyStarted,
                'Cannot perform the actions because there are '
                'running tasks {0}'.format([task]),
                DeploymentCheckMixin.check_no_running_deployment, self.cluster)

            db.query(models.Task).delete()
示例#10
0
    def POST(self, cluster_id):
        cluster = self.get_object_or_404(objects.Cluster, cluster_id)
        data = self.checked_data()
        node_id = data["node_id"]
        node = self.get_object_or_404(objects.Node, node_id)

        netgroups_mapping = self.get_netgroups_map(node.cluster, cluster)

        orig_roles = node.roles

        objects.Node.update_roles(node, [])  # flush
        objects.Node.update_pending_roles(node, [])  # flush

        node.replaced_deployment_info = []
        node.deployment_info = []
        node.kernel_params = None
        node.cluster_id = cluster.id
        node.group_id = None

        objects.Node.assign_group(node)  # flush
        objects.Node.update_pending_roles(node, orig_roles)  # flush

        for ip in node.ip_addrs:
            ip.network = netgroups_mapping[ip.network]

        nic_assignments = db.query(models.NetworkNICAssignment).\
            join(models.NodeNICInterface).\
            filter(models.NodeNICInterface.node_id == node.id).\
            all()
        for nic_assignment in nic_assignments:
            nic_assignment.network_id = \
                netgroups_mapping[nic_assignment.network_id]

        bond_assignments = db.query(models.NetworkBondAssignment).\
            join(models.NodeBondInterface).\
            filter(models.NodeBondInterface.node_id == node.id).\
            all()
        for bond_assignment in bond_assignments:
            bond_assignment.network_id = \
                netgroups_mapping[bond_assignment.network_id]

        objects.Node.add_pending_change(node,
                                        consts.CLUSTER_CHANGES.interfaces)

        node.pending_addition = True
        node.pending_deletion = False

        task = models.Task(name=consts.TASK_NAMES.node_deletion,
                           cluster=cluster)

        db.commit()

        self.delete_node_by_astute(task, node)
示例#11
0
    def test_execute_with_zabbix_node(self, mock_zabbix_manager,
                                      mmake_astute_message, mrpc):
        self.add_node(consts.NODE_STATUSES.ready)

        nodes = DeletionTask.get_task_nodes_for_cluster(self.cluster_db)
        self.assertEqual(len(nodes['nodes_to_delete']), 1)

        task = models.Task(name=consts.TASK_NAMES.cluster_deletion,
                           cluster=self.cluster_db)
        db().add(task)
        db().commit()

        DeletionTask.execute(task, nodes=nodes)
        self.assertEqual(mock_zabbix_manager.get_zabbix_node.called, False)