def test_node_deletion_redeploy_started_for_proper_controllers( self, mcast): self.env.create(nodes_kwargs=[ { 'roles': ['controller'], 'status': consts.NODE_STATUSES.provisioned }, { 'roles': ['controller'], 'status': consts.NODE_STATUSES.discover }, ]) cluster_db = self.env.clusters[0] node_to_delete = self.env.create_node( cluster_id=cluster_db.id, roles=['controller'], status=consts.NODE_STATUSES.ready) node_to_deploy = self.env.create_node( cluster_id=cluster_db.id, roles=['controller'], status=consts.NODE_STATUSES.ready) manager_ = manager.NodeDeletionTaskManager(cluster_id=cluster_db.id) manager_.execute([node_to_delete]) args, kwargs = mcast.call_args_list[0] depl_info = args[1][0]['args']['deployment_info'] self.assertEqual(node_to_deploy.uid, depl_info[0]['uid'])
def test_delete_nodes_do_not_run_if_there_is_deletion_running(self, _): self.env.create(nodes_kwargs=[{'roles': ['controller']}] * 3) self.task_manager = manager.NodeDeletionTaskManager( cluster_id=self.env.clusters[0].id) self.task_manager.execute(self.env.nodes) self.assertRaisesRegexp( errors.DeploymentAlreadyStarted, 'Cannot perform the actions because there are running tasks', self.task_manager.execute, self.env.nodes)
def test_node_deletion_task_manager_invalid_cluster(self): self.env.create(nodes_kwargs=[{ "pending_deletion": True, "status": "ready" }]) cluster_db = self.env.clusters[0] objects.Cluster.clear_pending_changes(cluster_db) manager_ = manager.NodeDeletionTaskManager() self.assertRaises(errors.InvalidData, manager_.execute, cluster_db.nodes)
def test_node_deletion_task_manager(self): self.env.create(nodes_kwargs=[{ "pending_deletion": True, "status": "ready" }]) cluster_db = self.env.clusters[0] objects.Cluster.clear_pending_changes(cluster_db) manager_ = manager.NodeDeletionTaskManager(cluster_id=cluster_db.id) task = manager_.execute(cluster_db.nodes) node = cluster_db.nodes[0] self.assertEqual(node.status, NODE_STATUSES.removing) self.db.commit() self.env.wait_ready(task, timeout=5) self.assertEqual(self.db.query(models.Node).count(), 0)
def test_node_deletion_task_failed_with_controller_in_error(self): self.env.create(nodes_kwargs=[ {'roles': ['controller'], 'status': consts.NODE_STATUSES.error}, ]) cluster_db = self.env.clusters[0] node_to_delete = self.env.create_node( cluster_id=cluster_db.id, roles=['controller'], status=consts.NODE_STATUSES.ready ) manager_ = manager.NodeDeletionTaskManager(cluster_id=cluster_db.id) self.assertRaises(errors.ControllerInErrorState, manager_.execute, [node_to_delete])
def test_node_deletion_task_manager_works_for_nodes_not_in_cluster(self): self.env.create(nodes_kwargs=[{ "pending_deletion": True, "status": "ready" }]) cluster_db = self.env.clusters[0] objects.Cluster.clear_pending_changes(cluster_db) node = cluster_db.nodes[0] objects.Node.update(node, {'cluster_id': None}) self.db.commit() self.db.refresh(node) self.db.refresh(cluster_db) manager_ = manager.NodeDeletionTaskManager() task = manager_.execute([node]) self.db.commit() # Nodes are removed immediately self.assertEqual(task.status, TASK_STATUSES.ready) self.assertEqual(self.db.query(models.Node).count(), 0)
def test_delete_nodes_reelection_if_primary_for_deletion(self, _): self.env.create(nodes_kwargs=[{ 'roles': ['controller'], 'status': consts.NODE_STATUSES.ready }] * 3) cluster = self.env.clusters[0] task_manager = manager.NodeDeletionTaskManager(cluster_id=cluster.id) objects.Cluster.set_primary_roles(cluster, self.env.nodes) primary_node = filter(lambda n: 'controller' in n.primary_roles, self.env.nodes)[0] task_manager.execute([primary_node]) self.env.refresh_nodes() new_primary = filter( lambda n: ('controller' in n.primary_roles and n.pending_deletion is False), self.env.nodes)[0] self.assertNotEqual(primary_node.id, new_primary.id)