def test_delete_non_default_node_group_reset_node_to_error( self, _, notify): node_group = self.env.create_node_group(api=False, cluster_id=self.cluster.id) self.env._create_network_group(cluster=self.cluster, group_id=node_group.id) node2 = self.env.create_node(group_id=node_group.id, roles=['compute'], status=consts.NODE_STATUSES.provisioned, cluster_id=self.cluster.id, ip='10.3.0.42') task = self.env.launch_deployment() NailgunReceiver.deploy_resp( task_uuid=task.uuid, status=consts.TASK_STATUSES.ready, progress=100, nodes=[{'uid': n.uid, 'status': consts.NODE_STATUSES.ready, 'progress': 100} for n in self.env.nodes], ) reset_task = self.env.reset_environment() NailgunReceiver.reset_environment_resp( task_uuid=reset_task.uuid, status=consts.TASK_STATUSES.ready, progress=100, nodes=[{'uid': n.uid} for n in self.env.nodes], ) self.env.delete_node_group(node_group.id) self.assertEqual(node2.status, consts.NODE_STATUSES.error) self.assertEqual(node2.error_type, consts.NODE_ERRORS.discover) self.assertIsNone(node2.cluster) notify.assert_called()
def test_multiline_error_message(self, mnotify): task_resp = { "status": "error", "task_uuid": self.task.uuid, "error": "Method granular_deploy.\n\n Something Something" } NailgunReceiver.deploy_resp(**task_resp) mnotify.assert_called_with( task_resp['status'], u'Deployment has failed. Method granular_deploy.', self.cluster.id)
def test_multiline_error_message(self, mnotify): task_resp = { "status": "error", "task_uuid": self.task.uuid, "error": "Method granular_deploy.\n\n Something Something"} NailgunReceiver.deploy_resp(**task_resp) mnotify.assert_called_with( task_resp['status'], u'Deployment has failed. Method granular_deploy.', self.cluster.id)
def test_master_uid_in_deploy_resp(self): node_resp = { "task_uuid": self.task.uuid, "nodes": [ {"status": "error", "hook": None, "error_type": "deploy", "role": "hook", "uid": "master"}]} NailgunReceiver.deploy_resp(**node_resp) self.assertEqual(self.task.status, 'error') task_resp = { "status": "error", "task_uuid": self.task.uuid, "error": "Method granular_deploy."} NailgunReceiver.deploy_resp(**task_resp) self.assertEqual(self.task.status, 'error') self.assertIn(task_resp['error'], self.task.message)
def test_config_execute_fails_if_deployment_running(self, mocked_rpc): task_manager = OpenstackConfigTaskManager(self.cluster.id) task = task_manager.execute({'cluster_id': self.cluster.id}) self.assertEqual(task.status, consts.TASK_STATUSES.pending) NailgunReceiver.deploy_resp( task_uuid=task.uuid, status=consts.TASK_STATUSES.running, progress=50, nodes=[{'uid': n.uid, 'status': consts.NODE_STATUSES.ready} for n in self.env.nodes], ) self.assertEqual(task.status, consts.TASK_STATUSES.running) task2 = OpenstackConfigTaskManager(self.cluster.id) self.assertRaises(errors.TaskAlreadyRunning, task2.execute, {'cluster_id': self.cluster.id})
def test_stop_deployment(self): supertask = self.env.launch_deployment() self.assertEqual(supertask.status, consts.TASK_STATUSES.pending) deploy_task = [t for t in supertask.subtasks if t.name in (consts.TASK_NAMES.deployment)][0] NailgunReceiver.deploy_resp( task_uuid=deploy_task.uuid, status=consts.TASK_STATUSES.running, progress=50, ) stop_task = self.env.stop_deployment() NailgunReceiver.stop_deployment_resp( task_uuid=stop_task.uuid, status=consts.TASK_STATUSES.ready, progress=100, nodes=[{'uid': n.uid} for n in self.env.nodes], ) self.assertEqual(stop_task.status, consts.TASK_STATUSES.ready) self.assertTrue(self.db().query(Task).filter_by( uuid=deploy_task.uuid ).first()) self.assertIsNone(objects.Task.get_by_uuid(deploy_task.uuid)) self.assertEqual(self.cluster.status, consts.CLUSTER_STATUSES.stopped) self.assertEqual(stop_task.progress, 100) self.assertFalse(self.cluster.is_locked) for n in self.cluster.nodes: self.assertEqual(n.roles, []) self.assertNotEqual(n.pending_roles, []) notification = self.db.query(Notification).filter_by( cluster_id=stop_task.cluster_id ).order_by( Notification.datetime.desc() ).first() self.assertRegexpMatches( notification.message, 'was successfully stopped')
def test_stop_deployment(self): supertask = self.env.launch_deployment() self.assertEqual(supertask.status, consts.TASK_STATUSES.pending) deploy_task = [ t for t in supertask.subtasks if t.name == consts.TASK_NAMES.deployment ][0] NailgunReceiver.deploy_resp( task_uuid=deploy_task.uuid, status=consts.TASK_STATUSES.running, progress=50, ) stop_task = self.env.stop_deployment() NailgunReceiver.stop_deployment_resp( task_uuid=stop_task.uuid, status=consts.TASK_STATUSES.ready, progress=100, nodes=[{ 'uid': n.uid } for n in self.env.nodes], ) self.assertEqual(stop_task.status, consts.TASK_STATUSES.ready) self.assertTrue( self.db().query(Task).filter_by(uuid=deploy_task.uuid).first()) self.assertIsNone(objects.Task.get_by_uuid(deploy_task.uuid)) self.assertEqual(self.cluster.status, consts.CLUSTER_STATUSES.stopped) self.assertEqual(stop_task.progress, 100) self.assertFalse(self.cluster.is_locked) for n in self.cluster.nodes: self.assertEqual(n.roles, []) self.assertNotEqual(n.pending_roles, []) notification = self.db.query(Notification).filter_by( cluster_id=stop_task.cluster_id).order_by( Notification.datetime.desc()).first() self.assertRegexpMatches(notification.message, 'was successfully stopped')
def test_stop_deployment_fail_if_deployed_before(self): task = self.env.launch_deployment() deploy_task = [ t for t in task.subtasks if t.name == consts.TASK_NAMES.deployment ][0] # In objects/task.py cluster status is set to operational. Cluster # function __update_cluster_status checks if nodes are in # expected_node_status, and if they are - then # set_deployed_before_flag is set. This flag is used to determine if # cluster was ever deployed before. NailgunReceiver.deploy_resp( task_uuid=deploy_task.uuid, status=consts.TASK_STATUSES.ready, progress=100, nodes=[{ 'uid': n.uid, 'status': consts.NODE_STATUSES.ready } for n in self.env.nodes], ) # If we don't send 'ready' for main task, then redeploy can't be # started - as we still have deployment running # TODO(mihgen): investigate why DeploymentAlreadyStarted is unhandled for sub_task in task.subtasks: NailgunReceiver.deploy_resp( task_uuid=sub_task.uuid, status=consts.TASK_STATUSES.ready, ) # changes to deploy self.env.create_node(cluster_id=self.cluster.id, roles=["controller"], pending_addition=True) supertask = self.env.launch_deployment() redeploy_task = [ t for t in supertask.subtasks if t.name == consts.TASK_NAMES.deployment ][0] NailgunReceiver.deploy_resp( task_uuid=redeploy_task.uuid, status=consts.TASK_STATUSES.running, progress=50, ) # stop task will not be created as in this situation # the error will be raised by validator thus we cannot use # self.env.stop_deployment to check the result resp = self.app.put(reverse('ClusterStopDeploymentHandler', kwargs={'cluster_id': self.cluster.id}), expect_errors=True, headers=self.default_headers) self.assertEqual(resp.status_code, 400) self.assertEqual( resp.json_body['message'], 'Stop action is forbidden for the cluster. Current ' 'deployment process is running on a pre-deployed ' 'cluster that does not support LCM.')
def test_stop_deployment_fail_if_deployed_before(self): task = self.env.launch_deployment() deploy_task = [t for t in task.subtasks if t.name == consts.TASK_NAMES.deployment][0] # In objects/task.py cluster status is set to operational. Cluster # function __update_cluster_status checks if nodes are in # expected_node_status, and if they are - then # set_deployed_before_flag is set. This flag is used to determine if # cluster was ever deployed before. NailgunReceiver.deploy_resp( task_uuid=deploy_task.uuid, status=consts.TASK_STATUSES.ready, progress=100, nodes=[{'uid': n.uid, 'status': consts.NODE_STATUSES.ready} for n in self.env.nodes], ) # If we don't send 'ready' for main task, then redeploy can't be # started - as we still have deployment running # TODO(mihgen): investigate why DeploymentAlreadyStarted is unhandled NailgunReceiver.deploy_resp( task_uuid=task.uuid, status=consts.TASK_STATUSES.ready, ) # changes to deploy self.env.create_node( cluster_id=self.cluster.id, roles=["controller"], pending_addition=True ) supertask = self.env.launch_deployment() redeploy_task = [t for t in supertask.subtasks if t.name == consts.TASK_NAMES.deployment][0] NailgunReceiver.deploy_resp( task_uuid=redeploy_task.uuid, status=consts.TASK_STATUSES.running, progress=50, ) # stop task will not be created as in this situation # the error will be raised by validator thus we cannot use # self.env.stop_deployment to check the result resp = self.app.put( reverse( 'ClusterStopDeploymentHandler', kwargs={'cluster_id': self.cluster.id}), expect_errors=True, headers=self.default_headers ) self.assertEqual(resp.status_code, 400) self.assertEqual(resp.json_body['message'], 'Stop action is forbidden for the cluster. Current ' 'deployment process is running on a pre-deployed ' 'cluster that does not support LCM.')
def test_delete_non_default_node_group_reset_node_to_error( self, _, notify): node_group = self.env.create_node_group(api=False, cluster_id=self.cluster.id) self.env._create_network_group(cluster=self.cluster, group_id=node_group.id) node2 = self.env.create_node(group_id=node_group.id, roles=['compute'], status=consts.NODE_STATUSES.provisioned, cluster_id=self.cluster.id, ip='10.3.0.42') task = self.env.launch_deployment() NailgunReceiver.deploy_resp( task_uuid=task.uuid, status=consts.TASK_STATUSES.ready, progress=100, nodes=[{ 'uid': n.uid, 'status': consts.NODE_STATUSES.ready, 'progress': 100 } for n in self.env.nodes], ) reset_task = self.env.reset_environment() NailgunReceiver.reset_environment_resp( task_uuid=reset_task.uuid, status=consts.TASK_STATUSES.ready, progress=100, nodes=[{ 'uid': n.uid } for n in self.env.nodes], ) self.env.delete_node_group(node_group.id) self.assertEqual(node2.status, consts.NODE_STATUSES.error) self.assertEqual(node2.error_type, consts.NODE_ERRORS.discover) self.assertIsNone(node2.cluster) notify.assert_called()