def test_execute_plan_cancelled(self): """Test execute plan cancelled.""" vpc = Stack(definition=generate_definition("vpc", 1), context=self.context) bastion = Stack( definition=generate_definition("bastion", 1, requires=[vpc.name]), context=self.context, ) calls = [] def fn(stack, status=None): calls.append(stack.fqn) if stack.fqn == vpc_step.name: raise CancelExecution return COMPLETE vpc_step = Step(vpc, fn) bastion_step = Step(bastion, fn) graph = Graph.from_steps([vpc_step, bastion_step]) plan = Plan(description="Test", graph=graph) plan.execute(walk) self.assertEqual(calls, ["namespace-vpc.1", "namespace-bastion.1"])
def test_execute_plan_exception(self): """Test execute plan exception.""" vpc = Stack(definition=generate_definition("vpc", 1), context=self.context) bastion = Stack( definition=generate_definition("bastion", 1, requires=[vpc.name]), context=self.context, ) calls = [] def fn(stack, status=None): calls.append(stack.fqn) if stack.name == vpc_step.name: raise ValueError("Boom") return COMPLETE vpc_step = Step(vpc, fn) bastion_step = Step(bastion, fn) graph = Graph.from_steps([vpc_step, bastion_step]) plan = Plan(description="Test", graph=graph) with self.assertRaises(PlanFailed): plan.execute(walk) self.assertEqual(calls, ["namespace-vpc.1"]) self.assertEqual(vpc_step.status, FAILED)
def test_execute_plan_failed(self): """Test execute plan failed.""" vpc = Stack(definition=generate_definition("vpc", 1), context=self.context) bastion = Stack( definition=generate_definition("bastion", 1, requires=[vpc.name]), context=self.context, ) db = Stack(definition=generate_definition("db", 1), context=self.context) calls = [] def fn(stack, status=None): calls.append(stack.fqn) if stack.name == vpc_step.name: return FAILED return COMPLETE vpc_step = Step(vpc, fn) bastion_step = Step(bastion, fn) db_step = Step(db, fn) graph = Graph.from_steps([vpc_step, bastion_step, db_step]) plan = Plan(description="Test", graph=graph) with self.assertRaises(PlanFailed): plan.execute(walk) calls.sort() self.assertEqual(calls, ["namespace-db.1", "namespace-vpc.1"])
def test_execute_plan_locked(self): """Test execute plan locked. Locked stacks still need to have their requires evaluated when they're being created. """ vpc = Stack(definition=generate_definition("vpc", 1), context=self.context) bastion = Stack( definition=generate_definition("bastion", 1, requires=[vpc.name]), locked=True, context=self.context, ) calls = [] def fn(stack, status=None): calls.append(stack.fqn) return COMPLETE graph = Graph.from_steps([Step(vpc, fn), Step(bastion, fn)]) plan = Plan(description="Test", graph=graph) plan.execute(walk) self.assertEqual(calls, ["namespace-vpc.1", "namespace-bastion.1"])
def test_execute_plan_filtered(self): """Test execute plan filtered.""" vpc = Stack(definition=generate_definition("vpc", 1), context=self.context) db = Stack( definition=generate_definition("db", 1, requires=[vpc.name]), context=self.context, ) app = Stack( definition=generate_definition("app", 1, requires=[db.name]), context=self.context, ) calls = [] def fn(stack, status=None): calls.append(stack.fqn) return COMPLETE context = mock.MagicMock() context.persistent_graph_locked = False context.stack_names = ["db.1"] graph = Graph.from_steps([Step(vpc, fn), Step(db, fn), Step(app, fn)]) plan = Plan(context=context, description="Test", graph=graph) plan.execute(walk) self.assertEqual(calls, ["namespace-vpc.1", "namespace-db.1"])
def test_execute_plan_no_persist(self): """Test execute plan with no persistent graph.""" context = Context(config=self.config) context.put_persistent_graph = mock.MagicMock() vpc = Stack(definition=generate_definition("vpc", 1), context=context) bastion = Stack( definition=generate_definition("bastion", 1, requires=[vpc.name]), context=context, ) calls = [] def _launch_stack(stack, status=None): calls.append(stack.fqn) return COMPLETE graph = Graph.from_steps( [Step(vpc, _launch_stack), Step(bastion, _launch_stack)]) plan = Plan(description="Test", graph=graph, context=context) plan.execute(walk) self.assertEqual(calls, ["namespace-vpc.1", "namespace-bastion.1"]) context.put_persistent_graph.assert_not_called()
def test_execute_plan_skipped(self): """Test execute plan skipped.""" vpc = Stack(definition=generate_definition('vpc', 1), context=self.context) bastion = Stack(definition=generate_definition('bastion', 1, requires=[vpc.name]), context=self.context) calls = [] def fn(stack, status=None): calls.append(stack.fqn) if stack.fqn == vpc_step.name: return SKIPPED return COMPLETE vpc_step = Step(vpc, fn) bastion_step = Step(bastion, fn) graph = Graph.from_steps([vpc_step, bastion_step]) plan = Plan(description="Test", graph=graph) plan.execute(walk) self.assertEqual(calls, ['namespace-vpc.1', 'namespace-bastion.1'])
def test_execute_plan_graph_locked(self): """Test execute plan with locked persistent graph.""" context = Context(config=self.config) context._persistent_graph = Graph.from_dict({"stack1": []}, context) context._persistent_graph_lock_code = "1111" plan = Plan(description="Test", graph=Graph(), context=context) print(plan.locked) with self.assertRaises(PersistentGraphLocked): plan.execute()
def test_execute_plan(self) -> None: """Test execute plan.""" context = CfnginContext(config=self.config) context.put_persistent_graph = mock.MagicMock() vpc = Stack(definition=generate_definition("vpc", 1), context=context) bastion = Stack( definition=generate_definition("bastion", 1, requires=[vpc.name]), context=context, ) removed = Stack( definition=generate_definition("removed", 1, requires=[]), context=context ) context._persistent_graph = Graph.from_steps([Step(removed)]) calls: List[str] = [] def _launch_stack(stack: Stack, status: Optional[Status] = None) -> Status: calls.append(stack.fqn) return COMPLETE def _destroy_stack(stack: Stack, status: Optional[Status] = None) -> Status: calls.append(stack.fqn) return COMPLETE graph = Graph.from_steps( [ Step(removed, fn=_destroy_stack), Step(vpc, fn=_launch_stack), Step(bastion, fn=_launch_stack), ] ) plan = Plan(description="Test", graph=graph, context=context) plan.context._persistent_graph_lock_code = plan.lock_code # type: ignore plan.execute(walk) # the order these are appended changes between python2/3 self.assertIn("namespace-vpc.1", calls) self.assertIn("namespace-bastion.1", calls) self.assertIn("namespace-removed.1", calls) context.put_persistent_graph.assert_called() # order is different between python2/3 so can't compare dicts result_graph_dict = context.persistent_graph.to_dict() # type: ignore self.assertEqual(2, len(result_graph_dict)) self.assertEqual(set(), result_graph_dict.get("vpc.1")) self.assertEqual(set(["vpc.1"]), result_graph_dict.get("bastion.1")) self.assertIsNone(result_graph_dict.get("namespace-removed.1"))
def test_execute_plan(self): """Test execute plan.""" context = Context(config=self.config) context.put_persistent_graph = mock.MagicMock() vpc = Stack(definition=generate_definition('vpc', 1), context=context) bastion = Stack(definition=generate_definition('bastion', 1, requires=[vpc.name]), context=context) removed = Stack(definition=generate_definition('removed', 1, requires=[]), context=context) context._persistent_graph = Graph.from_steps([removed]) calls = [] def _launch_stack(stack, status=None): calls.append(stack.fqn) return COMPLETE def _destroy_stack(stack, status=None): calls.append(stack.fqn) return COMPLETE graph = Graph.from_steps([ Step(removed, _destroy_stack), Step(vpc, _launch_stack), Step(bastion, _launch_stack) ]) plan = Plan(description="Test", graph=graph, context=context) plan.context._persistent_graph_lock_code = plan.lock_code plan.execute(walk) # the order these are appended changes between python2/3 self.assertIn('namespace-vpc.1', calls) self.assertIn('namespace-bastion.1', calls) self.assertIn('namespace-removed.1', calls) context.put_persistent_graph.assert_called() # order is different between python2/3 so can't compare dicts result_graph_dict = context.persistent_graph.to_dict() self.assertEqual(2, len(result_graph_dict)) self.assertEqual(set(), result_graph_dict.get('vpc.1')) self.assertEqual(set(['vpc.1']), result_graph_dict.get('bastion.1')) self.assertIsNone(result_graph_dict.get('namespace-removed.1'))
def test_execute_plan_skipped(self) -> None: """Test execute plan skipped.""" vpc = Stack(definition=generate_definition("vpc", 1), context=self.context) bastion = Stack( definition=generate_definition("bastion", 1, requires=[vpc.name]), context=self.context, ) calls: List[str] = [] def fn(stack: Stack, status: Optional[Status] = None) -> Status: calls.append(stack.fqn) if stack.fqn == vpc_step.name: return SKIPPED return COMPLETE vpc_step = Step(vpc, fn=fn) bastion_step = Step(bastion, fn=fn) graph = Graph.from_steps([vpc_step, bastion_step]) plan = Plan(description="Test", graph=graph) plan.execute(walk) self.assertEqual(calls, ["namespace-vpc.1", "namespace-bastion.1"])