コード例 #1
0
ファイル: test_build.py プロジェクト: sbraverman/stacker
 def test_execute_plan_when_outline_not_specified(self):
     context = self._get_context()
     build_action = build.Action(context)
     with mock.patch.object(build_action, "_generate_plan") as \
             mock_generate_plan:
         build_action.run(outline=False)
         self.assertEqual(mock_generate_plan().execute.call_count, 1)
コード例 #2
0
ファイル: test_build.py プロジェクト: meloxl/stacker
    def setUp(self):
        self.context = self._get_context()
        self.provider = Provider(None, interactive=False,
                                 recreate_failed=False)
        self.build_action = build.Action(self.context, provider=self.provider)

        self.stack = mock.MagicMock()
        self.stack.name = 'vpc'
        self.stack.fqn = 'vpc'
        self.stack.locked = False
        self.stack_status = None

        plan = self.build_action._generate_plan()
        _, self.step = plan.list_pending()[0]
        self.step.stack = self.stack

        def patch_object(*args, **kwargs):
            m = mock.patch.object(*args, **kwargs)
            self.addCleanup(m.stop)
            m.start()

        def get_stack(name, *args, **kwargs):
            if name != self.stack.name or not self.stack_status:
                raise StackDoesNotExist(name)

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

        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.build_action, "s3_stack_push")
コード例 #3
0
 def test_dont_execute_plan_when_outline_specified(self):
     context = self._get_context()
     build_action = build.Action(context, cancel=MockThreadingEvent())
     with mock.patch.object(build_action, "_generate_plan") as \
             mock_generate_plan:
         build_action.run(outline=True)
         self.assertEqual(mock_generate_plan().execute.call_count, 0)
コード例 #4
0
ファイル: test_build.py プロジェクト: sbraverman/stacker
    def test_launch_stack_step_statuses(self):
        mock_provider = mock.MagicMock()
        mock_stack = mock.MagicMock()

        context = self._get_context()
        build_action = build.Action(context, provider=mock_provider)
        plan = build_action._generate_plan()
        _, step = plan.list_pending()[0]
        step.stack = mock.MagicMock()
        step.stack.locked = False

        # mock provider shouldn't return a stack at first since it hasn't been
        # launched
        mock_provider.get_stack.return_value = None
        with mock.patch.object(build_action, "s3_stack_push"):
            # initial status should be PENDING
            self.assertEqual(step.status, PENDING)
            # initial run should return SUBMITTED since we've passed off to CF
            status = step.run()
            step.set_status(status)
            self.assertEqual(status, SUBMITTED)
            self.assertEqual(status.reason, "creating new stack")

            # provider should now return the CF stack since it exists
            mock_provider.get_stack.return_value = mock_stack
            # simulate that we're still in progress
            mock_provider.is_stack_in_progress.return_value = True
            mock_provider.is_stack_completed.return_value = False
            status = step.run()
            step.set_status(status)
            # status should still be SUBMITTED since we're waiting for it to
            # complete
            self.assertEqual(status, SUBMITTED)
            self.assertEqual(status.reason, "creating new stack")
            # simulate completed stack
            mock_provider.is_stack_completed.return_value = True
            mock_provider.is_stack_in_progress.return_value = False
            status = step.run()
            step.set_status(status)
            self.assertEqual(status, COMPLETE)
            self.assertEqual(status.reason, "creating new stack")

            # simulate stack should be skipped
            mock_provider.is_stack_completed.return_value = False
            mock_provider.is_stack_in_progress.return_value = False
            mock_provider.update_stack.side_effect = StackDidNotChange
            status = step.run()
            step.set_status(status)
            self.assertEqual(status, SKIPPED)
            self.assertEqual(status.reason, "nochange")

            # simulate an update is required
            mock_provider.reset_mock()
            mock_provider.update_stack.side_effect = None
            step.set_status(PENDING)
            status = step.run()
            step.set_status(status)
            self.assertEqual(status, SUBMITTED)
            self.assertEqual(status.reason, "updating existing stack")
            self.assertEqual(mock_provider.update_stack.call_count, 1)
コード例 #5
0
ファイル: test_build.py プロジェクト: sbraverman/stacker
 def test_generate_plan(self):
     context = self._get_context()
     build_action = build.Action(context)
     plan = build_action._generate_plan()
     self.assertEqual(
         plan.keys(),
         [context.get_fqn(s) for s in ["other", "vpc", "bastion", "db"]],
     )
コード例 #6
0
ファイル: test_build.py プロジェクト: spuds51/stacker
 def test_generate_plan(self):
     context = self._get_context()
     build_action = build.Action(context)
     plan = build_action._generate_plan()
     self.assertEqual(
         plan.keys(),
         [context.get_fqn(s) for s in ['other', 'vpc', 'bastion', 'db']],
     )
コード例 #7
0
ファイル: test_build.py プロジェクト: sbraverman/stacker
 def test_get_stack_execution_order(self):
     context = self._get_context()
     build_action = build.Action(context)
     dependencies = build_action._get_dependencies()
     execution_order = build_action.get_stack_execution_order(dependencies)
     self.assertEqual(
         execution_order,
         [context.get_fqn(s) for s in ["other", "vpc", "bastion", "db"]],
     )
コード例 #8
0
ファイル: test_build.py プロジェクト: spuds51/stacker
 def test_get_stack_execution_order(self):
     context = self._get_context()
     build_action = build.Action(context)
     dependencies = build_action._get_dependencies()
     execution_order = build_action.get_stack_execution_order(dependencies)
     self.assertEqual(
         execution_order,
         [context.get_fqn(s) for s in ['other', 'vpc', 'bastion', 'db']],
     )
コード例 #9
0
 def test_generate_plan(self):
     context = self._get_context()
     build_action = build.Action(context, cancel=MockThreadingEvent())
     plan = build_action._generate_plan()
     self.assertEqual(
         {
             'db': set(['bastion', 'vpc']),
             'bastion': set(['vpc']),
             'other': set([]),
             'vpc': set([])
         }, plan.graph.to_dict())
コード例 #10
0
ファイル: test_build.py プロジェクト: mgla/stacker
 def test_generate_plan(self):
     context = self._get_context()
     build_action = build.Action(context)
     plan = build_action._generate_plan()
     self.assertEqual(
         {
             'namespace-db': set(['namespace-bastion', 'namespace-vpc']),
             'namespace-bastion': set(['namespace-vpc']),
             'namespace-other': set([]),
             'namespace-vpc': set([])
         }, plan.graph.to_dict())
コード例 #11
0
    def setUp(self):
        self.context = self._get_context()
        self.session = get_session(region=None)
        self.provider = Provider(self.session,
                                 interactive=False,
                                 recreate_failed=False)
        provider_builder = MockProviderBuilder(self.provider)
        self.build_action = build.Action(self.context,
                                         provider_builder=provider_builder,
                                         cancel=MockThreadingEvent())

        self.stack = mock.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 = self.build_action._generate_plan()
        self.step = plan.steps[0]
        self.step.stack = self.stack

        def patch_object(*args, **kwargs):
            m = mock.patch.object(*args, **kwargs)
            self.addCleanup(m.stop)
            m.start()

        def get_stack(name, *args, **kwargs):
            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, *args, **kwargs):
            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.build_action, "s3_stack_push")
コード例 #12
0
ファイル: test_build.py プロジェクト: sbraverman/stacker
 def test_get_dependencies(self):
     context = self._get_context()
     build_action = build.Action(context)
     dependencies = build_action._get_dependencies()
     self.assertEqual(
         dependencies[context.get_fqn("bastion")],
         set([context.get_fqn("vpc")]),
     )
     self.assertEqual(
         dependencies[context.get_fqn("db")],
         set([context.get_fqn(s) for s in ["vpc", "bastion"]]),
     )
     self.assertFalse(dependencies[context.get_fqn("other")])
コード例 #13
0
ファイル: test_build.py プロジェクト: spuds51/stacker
 def test_get_dependencies(self):
     context = self._get_context()
     build_action = build.Action(context)
     dependencies = build_action._get_dependencies()
     self.assertEqual(
         dependencies[context.get_fqn('bastion')],
         set([context.get_fqn('vpc')]),
     )
     self.assertEqual(
         dependencies[context.get_fqn('db')],
         set([context.get_fqn(s) for s in ['vpc', 'bastion']]),
     )
     self.assertFalse(dependencies[context.get_fqn('other')])
コード例 #14
0
ファイル: test_build.py プロジェクト: meloxl/stacker
 def test_Raises_StackDoesNotExist_from_lookup_non_included_stack(self):
     # This test is testing the specific scenario listed in PR 466
     # Because the issue only threw a KeyError when a stack was missing
     # in the `--stacks` flag at runtime of a `stacker build` run
     # but needed for an output lookup in the stack specified
     mock_provider = mock.MagicMock()
     context = Context(config=Config({
         "namespace": "namespace",
         "stacks": [
             {"name": "bastion",
              "variables": {"test": "${output vpc::something}"}
              }]
     }))
     build_action = build.Action(context, provider=mock_provider)
     with self.assertRaises(StackDoesNotExist):
         build_action._generate_plan()
コード例 #15
0
ファイル: test_build.py プロジェクト: Cobliteam/stacker
    def setUp(self):
        self.context = self._get_context()
        self.session = get_session(region=None)
        self.provider = self._make_provider()
        provider_builder = MockProviderBuilder(self.provider)
        self.build_action = build.Action(self.context,
                                         provider_builder=provider_builder,
                                         cancel=MockThreadingEvent())
        self._patch_object(self.build_action, "s3_stack_push")

        self.stack = TestStack("vpc", self.context)
        self.stack_status = None

        plan = self.build_action._generate_plan()
        self.step = plan.steps[0]
        self.step.stack = self.stack
コード例 #16
0
 def setUp(self):
     self.context = Context(config=Config({"namespace": "namespace"}))
     self.provider = TestProvider()
     self.build_action = build.Action(self.context,
                                      provider_builder=MockProviderBuilder(
                                          self.provider))
コード例 #17
0
ファイル: test_build.py プロジェクト: sbraverman/stacker
 def setUp(self):
     self.context = Context({"namespace": "namespace"})
     self.build_action = build.Action(self.context, provider=TestProvider())
コード例 #18
0
ファイル: e2e.py プロジェクト: aarongorka/ebs-pin
    response = ec2.describe_subnets(
        Filters=[
            {
                'Name': 'vpc-id',
                'Values': [
                    vpc_id
                ]
            }
        ]
    )
    subnet_ids = [x['SubnetId'] for x in response['Subnets']]

    provider_builder = ProviderBuilder(region="ap-southeast-2", recreate_failed=True, interactive=False)
    context = construct_context(subnet_ids[0])

    action = build.Action(context, provider_builder=provider_builder)
    action.run(tail=True)

    cloudformation = boto3.client("cloudformation")
    asg_name = cloudformation.describe_stack_resources(
        StackName="ebs-pin-test",
        LogicalResourceId="AutoScalingGroup"
    )['StackResources'][0]['PhysicalResourceId']
    logging.info("asg_name: {}".format(asg_name))

    autoscaling = boto3.client('autoscaling')
    count = return_count_after_update(asg_name, subnet_ids[0], autoscaling=autoscaling, ec2=ec2)
    assert count >= 1
    previous_count = count

    context = construct_context(subnet_ids[1])