Example #1
0
    def test_generate_plan_persist_destroy(
            self, mock_graph_tags: PropertyMock) -> None:
        """Test generate plan persist destroy."""
        mock_graph_tags.return_value = {}
        context = self._get_context(
            extra_config_args={"persistent_graph_key": "test.json"})
        context._persistent_graph = Graph.from_steps(
            [Step.from_stack_name("removed", context)])
        deploy_action = deploy.Action(context=context)
        plan = cast(Plan,
                    deploy_action._Action__generate_plan())  # type: ignore

        self.assertIsInstance(plan, Plan)
        self.assertEqual(deploy.Action.DESCRIPTION, plan.description)
        mock_graph_tags.assert_called_once()
        # order is different between python2/3 so can't compare dicts
        result_graph_dict = plan.graph.to_dict()
        self.assertEqual(5, len(result_graph_dict))
        self.assertEqual(set(), result_graph_dict["other"])
        self.assertEqual(set(), result_graph_dict["removed"])
        self.assertEqual(set(), result_graph_dict["vpc"])
        self.assertEqual(set(["vpc"]), result_graph_dict["bastion"])
        self.assertEqual(set(["bastion", "vpc"]), result_graph_dict["db"])
        self.assertEqual(deploy_action._destroy_stack,
                         plan.graph.steps["removed"].fn)
        self.assertEqual(deploy_action._launch_stack,
                         plan.graph.steps["vpc"].fn)
        self.assertEqual(deploy_action._launch_stack,
                         plan.graph.steps["bastion"].fn)
        self.assertEqual(deploy_action._launch_stack,
                         plan.graph.steps["db"].fn)
        self.assertEqual(deploy_action._launch_stack,
                         plan.graph.steps["other"].fn)
Example #2
0
    def setUp(self) -> None:
        """Run before tests."""
        self.context = self._get_context()
        self.session = get_session(region=None)
        self.provider = Provider(self.session,
                                 interactive=False,
                                 recreate_failed=False)
        provider_builder = MockProviderBuilder(provider=self.provider)
        self.deploy_action = deploy.Action(
            self.context,
            provider_builder=provider_builder,
            cancel=MockThreadingEvent(),  # type: ignore
        )

        self.stack = MagicMock()
        self.stack.region = None
        self.stack.name = "vpc"
        self.stack.fqn = "vpc"
        self.stack.blueprint.rendered = "{}"
        self.stack.locked = False
        self.stack_status = None

        plan = cast(
            Plan, self.deploy_action._Action__generate_plan())  # type: ignore
        self.step = plan.steps[0]
        self.step.stack = self.stack

        def patch_object(*args: Any, **kwargs: Any) -> None:
            mock_object = patch.object(*args, **kwargs)
            self.addCleanup(mock_object.stop)
            mock_object.start()

        def get_stack(name: str, *_args: Any,
                      **_kwargs: Any) -> Dict[str, Any]:
            if name != self.stack.name or not self.stack_status:
                raise StackDoesNotExist(name)

            return {
                "StackName": self.stack.name,
                "StackStatus": self.stack_status,
                "Outputs": [],
                "Tags": [],
            }

        def get_events(name: str, *_args: Any,
                       **_kwargs: Any) -> List[Dict[str, str]]:
            return [{
                "ResourceStatus": "ROLLBACK_IN_PROGRESS",
                "ResourceStatusReason": "CFN fail",
            }]

        patch_object(self.provider, "get_stack", side_effect=get_stack)
        patch_object(self.provider, "update_stack")
        patch_object(self.provider, "create_stack")
        patch_object(self.provider, "destroy_stack")
        patch_object(self.provider, "get_events", side_effect=get_events)

        patch_object(self.deploy_action, "s3_stack_push")
Example #3
0
 def test_execute_plan_when_outline_not_specified(self) -> None:
     """Test execute plan when outline not specified."""
     context = self._get_context()
     deploy_action = deploy.Action(
         context, cancel=MockThreadingEvent())  # type: ignore
     with patch.object(deploy_action,
                       "_generate_plan") as mock_generate_plan:
         deploy_action.run(outline=False)
         self.assertEqual(mock_generate_plan().execute.call_count, 1)
Example #4
0
 def setUp(self) -> None:
     """Run before tests."""
     self.context = CfnginContext(
         config=CfnginConfig.parse_obj({"namespace": "namespace"}))
     self.provider = MockProvider()
     self.deploy_action = deploy.Action(
         self.context,
         provider_builder=MockProviderBuilder(
             provider=self.provider),  # type: ignore
     )
Example #5
0
 def test_generate_plan(self) -> None:
     """Test generate plan."""
     context = self._get_context()
     deploy_action = deploy.Action(
         context, cancel=MockThreadingEvent())  # type: ignore
     plan = cast(Plan,
                 deploy_action._Action__generate_plan())  # type: ignore
     self.assertEqual(
         {
             "db": set(["bastion", "vpc"]),
             "bastion": set(["vpc"]),
             "other": set([]),
             "vpc": set([]),
         },
         plan.graph.to_dict(),
     )
Example #6
0
    def test_run_persist(
        self,
        mock_execute: MagicMock,
        mock_unlock: MagicMock,
        mock_lock: MagicMock,
        mock_graph_tags: PropertyMock,
    ) -> None:
        """Test run persist."""
        mock_graph_tags.return_value = {}
        context = self._get_context(
            extra_config_args={"persistent_graph_key": "test.json"})
        context._persistent_graph = Graph.from_steps(
            [Step.from_stack_name("removed", context)])
        deploy_action = deploy.Action(context=context)
        deploy_action.run()

        mock_graph_tags.assert_called_once()
        mock_lock.assert_called_once()
        mock_execute.assert_called_once()
        mock_unlock.assert_called_once()