Exemple #1
0
    def test_copy_default_key_encrypted_snapshot_same_region(self):

        test_method = inspect.stack()[0][3]

        self.cleanup_leftover_source_snapshots(test_method)

        self.logger.test("Creating source snapshot")
        source_snapshot_encrypted_default = self.ec2.create_snapshot(
            self.volume_encrypted_default,
            tags={
                "Name": "Ec2CopySnapshot_{}".format(test_method),
                tasklist_tagname(TESTED_ACTION): test_method
            },
            description="Snapshot for testing Ec2CopySnapshot : {}".format(
                test_method))
        self.snapshots.append(source_snapshot_encrypted_default["SnapshotId"])

        parameters = {copy_snapshot.PARAM_DESTINATION_REGION: region()}

        self.logger.test("Running task")
        self.task_runner.run(parameters,
                             task_name=test_method,
                             complete_check_polling_interval=10)
        self.assertTrue(self.task_runner.success(),
                        "Task executed successfully")
        snapshot_copy_id = self.task_runner.results[0].result[
            "copy-snapshot-id"]
        self.snapshots.append(snapshot_copy_id)
        self.logger.test("[X] Task completed")

        self.logger.test("Checking snapshot copy")
        snapshot_copy = self.ec2.get_snapshot(snapshot_copy_id)
        self.assertIsNotNone(snapshot_copy, "Snapshot created")
    def test_delete_by_retention_days_all_deleted(self):

        test_method = inspect.stack()[0][3]

        self.cleanup_leftover_source_snapshots(test_method)

        snapshot = self.ec2.create_snapshot(self.volume_id, tags={
            tasklist_tagname(TESTED_ACTION): test_method
        }, wait_to_complete=300)
        assert (snapshot is not None)
        self.created_snapshots.append(snapshot["SnapshotId"])

        try:
            parameters = {
                delete_snapshot_action.PARAM_RETENTION_COUNT: 0,
                delete_snapshot_action.PARAM_RETENTION_DAYS: 2
            }

            test_method = inspect.stack()[0][3]

            self.logger.test("Running task at simulated date +3 days")

            self.task_runner.run(parameters,
                                 task_name=test_method,
                                 complete_check_polling_interval=30,
                                 datetime_delta=timedelta(days=3))
            self.assertTrue(self.task_runner.success(expected_executed_tasks=1), "Task executed successfully")
            self.logger.test("[X] Task completed")

            self.assertEqual(1, getattr(self.task_runner.results[0], "result", {}).get("snapshots-deleted"),
                             "Snapshot is deleted")
            self.assertIsNone(self.ec2.get_snapshot(snapshot["SnapshotId"]), "Snapshot no longer exists")
            self.logger.test("[X] Snapshot deleted")
        finally:
            self.delete_volume_snapshots()
Exemple #3
0
    def test_snapshot_not_longer_available(self):

        def delete_snapshot_after_select(tracker):
            for item in tracker.task_items:
                self.ec2.delete_snapshots(snapshot_ids=[item.get(handlers.TASK_TR_RESOURCES, {}).get("SnapshotId")])

        test_method = inspect.stack()[0][3]

        self.cleanup_leftover_source_snapshots(test_method)

        self.logger.test("Creating source snapshot")
        source_snapshot = self.ec2.create_snapshot(self.volume_unencrypted, tags={
            "Name": "Ec2CopySnapshot_{}".format(test_method),
            tasklist_tagname(TESTED_ACTION): test_method
        }, description="Snapshot for testing Ec2CopySnapshot : {}".format(test_method))
        assert (source_snapshot is not None)
        self.snapshots.append(source_snapshot["SnapshotId"])

        parameters = {
            copy_snapshot.PARAM_DESTINATION_REGION: region(),
        }

        self.logger.test("Running task to copy snapshot")
        self.task_runner.run(parameters,
                             task_name=test_method,
                             complete_check_polling_interval=10, run_after_select=delete_snapshot_after_select)

        self.logger.test("[X] Task completed")
        self.assertEqual(1, len(self.task_runner.results), "Snapshot not longer available")
        self.logger.test("[X] Snapshot was not longer available")
Exemple #4
0
    def test_copy_unencrypted_snapshot_other_region(self):

        test_method = inspect.stack()[0][3]

        self.cleanup_leftover_source_snapshots(test_method)

        destination_ec2 = Ec2(region=remote_region())
        remote_snapshot_copy_id = None

        try:
            self.logger.test("Creating source snapshot")
            source_snapshot_unencrypted = self.ec2.create_snapshot(self.volume_unencrypted, tags={
                "Name": "Ec2CopySnapshot_{}".format(test_method),
                "copied-tag": "copied-value",
                "not-copied-tag": "not-copied-value",
                tasklist_tagname(TESTED_ACTION): test_method
            }, description="Snapshot for testing Ec2CopySnapshot : {}".format(test_method))

            self.snapshots.append(source_snapshot_unencrypted["SnapshotId"])

            parameters = {

                copy_snapshot.PARAM_DESTINATION_REGION: remote_region(),
                copy_snapshot.PARAM_ACCOUNTS_VOLUME_CREATE_PERMISSIONS: ["123456789012"],
                copy_snapshot.PARAM_COPIED_SNAPSHOT_TAGS: "copied-tag",
                copy_snapshot.PARAM_SNAPSHOT_DESCRIPTION: "{{{}}}".format(copy_snapshot.TAG_PLACEHOLDER_SOURCE_DESCRIPTION),
                copy_snapshot.PARAM_SNAPSHOT_TAGS: testing.tags.common_placeholder_tags(
                    test_delete=False,
                    placeholders=[
                        copy_snapshot.TAG_PLACEHOLDER_SOURCE_REGION,
                        copy_snapshot.TAG_PLACEHOLDER_SOURCE_SNAPSHOT_ID,
                        copy_snapshot.TAG_PLACEHOLDER_SOURCE_VOLUME,
                        copy_snapshot.TAG_PLACEHOLDER_OWNER_ACCOUNT]),
                copy_snapshot.PARAM_SOURCE_TAGS: testing.tags.common_placeholder_tags([
                    copy_snapshot.TAG_PLACEHOLDER_COPIED_SNAPSHOT_ID,
                    copy_snapshot.TAG_PLACEHOLDER_COPIED_REGION
                ])
            }

            self.logger.test("Running task")
            self.task_runner.run(parameters,
                                 task_name=test_method,
                                 complete_check_polling_interval=10)
            self.assertTrue(self.task_runner.success(), "Task executed successfully")

            remote_snapshot_copy_id = self.task_runner.results[0].result["copy-snapshot-id"]
            self.logger.test("[X] Task completed")

            self.logger.test("Checking snapshot copy")
            snapshot_copy = destination_ec2.get_snapshot(remote_snapshot_copy_id)
            self.assertIsNotNone(snapshot_copy, "Snapshot created in destination region")

            self.check_copy_snapshot(remote_snapshot_copy_id, source_snapshot_unencrypted, remote_region())
            self.check_source_snapshot(source_snapshot_unencrypted["SnapshotId"],
                                       remote_snapshot_copy_id, test_method,
                                       remote_region())

        finally:
            if remote_snapshot_copy_id is not None:
                destination_ec2.delete_snapshots([remote_snapshot_copy_id])
Exemple #5
0
    def test_snapshot_only_copied_once(self):

        test_method = inspect.stack()[0][3]

        self.cleanup_leftover_source_snapshots(test_method)

        self.logger.test("Creating source snapshot")
        source_snapshot = self.ec2.create_snapshot(self.volume_unencrypted, tags={
            "Name": "Ec2CopySnapshot_{}".format(test_method),
            tasklist_tagname(TESTED_ACTION): test_method
        }, description="Snapshot for testing Ec2CopySnapshot : {}".format(test_method))
        assert (source_snapshot is not None)
        self.snapshots.append(source_snapshot["SnapshotId"])

        parameters = {
            copy_snapshot.PARAM_DESTINATION_REGION: region(),
        }

        self.logger.test("Running task to copy snapshot")
        self.task_runner.run(parameters,
                             task_name=test_method,
                             complete_check_polling_interval=10)
        self.assertTrue(self.task_runner.success(), "Task executed successfully")
        snapshot_copy_id = self.task_runner.results[0].result["copy-snapshot-id"]
        self.snapshots.append(snapshot_copy_id)

        self.logger.test("Running task again")
        self.task_runner.run(parameters, task_name=test_method, complete_check_polling_interval=10)
        self.logger.test("[X] Task completed")
        self.assertEqual(0, len(self.task_runner.results), "Snapshot already copied")
        self.logger.test("[X] Snapshot was not copied for second time")
Exemple #6
0
    def test_copy_snapshot_description(self):

        test_method = inspect.stack()[0][3]

        self.cleanup_leftover_source_snapshots(test_method)

        self.logger.test("Creating source snapshot")
        source_snapshot = self.ec2.create_snapshot(self.volume_unencrypted,
                                                   tags={
                                                       "Name": "Ec2CopySnapshot_{}".format(test_method),
                                                       tasklist_tagname(TESTED_ACTION): test_method
                                                   }, description="Snapshot for testing Ec2CopySnapshot : {}".format(test_method))
        self.snapshots.append(source_snapshot["SnapshotId"])

        parameters = {
            copy_snapshot.PARAM_DESTINATION_REGION: region(),
            copy_snapshot.PARAM_COPIED_SNAPSHOTS: copy_snapshot.COPIED_OWNED_BY_ACCOUNT,
            copy_snapshot.PARAM_DELETE_AFTER_COPY: False,
            copy_snapshot.PARAM_ENCRYPTED: False
        }

        self.logger.test("Running task")
        self.task_runner.run(parameters,
                             task_name=test_method,
                             complete_check_polling_interval=10)
        self.assertTrue(self.task_runner.success(), "Task executed successfully")
        snapshot_copy_id = self.task_runner.results[0].result["copy-snapshot-id"]
        self.snapshots.append(snapshot_copy_id)
        self.logger.test("[X] Task completed")

        copied_snapshot = self.ec2.get_snapshot(snapshot_copy_id)
        self.assertEqual(source_snapshot.get("Description"), copied_snapshot.get("Description"), "Description copied as default")
        self.logger.test("[X]Source description copied")
    def test_delete_by_retention_count_all_retained(self):

        test_method = inspect.stack()[0][3]

        self.cleanup_leftover_source_snapshots(test_method)

        self.logger.test("Creating (source) snapshot")
        snapshot = self.ec2.create_snapshot(self.volume_id, tags={
            tasklist_tagname(TESTED_ACTION): test_method
        }, wait_to_complete=300)
        assert (snapshot is not None)
        self.created_snapshots.append(snapshot["SnapshotId"])

        try:
            parameters = {
                delete_snapshot_action.PARAM_RETENTION_COUNT: 1,
                delete_snapshot_action.PARAM_RETENTION_DAYS: 0
            }

            self.logger.test("Running task")
            self.task_runner.run(parameters,
                                 task_name=test_method)
            self.assertTrue(self.task_runner.success(expected_executed_tasks=1), "Task executed successfully")
            self.logger.test("[X] Task completed")

            self.logger.test("Checking retained snapshot")
            self.assertEqual(0, getattr(self.task_runner.results[0], "result", {}).get("snapshots-deleted"),
                             "Snapshot is not deleted")
            self.assertIsNotNone(self.ec2.get_snapshot(snapshot["SnapshotId"]), "Snapshot still exists")
            self.logger.test("[X] Snapshot is retained")

        finally:
            self.delete_volume_snapshots()
Exemple #8
0
    def test_copy_snapshot_encrypted_with_default_key(self):

        test_method = inspect.stack()[0][3]

        self.cleanup_leftover_source_snapshots(test_method)

        snapshot_unencrypted = self.ec2.create_snapshot(self.volume_unencrypted, tags={
            "Name": "Ec2CopySnapshot_{}".format(test_method),
            tasklist_tagname(TESTED_ACTION): test_method
        }, description="Snapshot for testing Ec2CopySnapshot : {}".format(test_method))
        assert (snapshot_unencrypted is not None)
        self.snapshots.append(snapshot_unencrypted["SnapshotId"])

        parameters = {
            copy_snapshot.PARAM_DESTINATION_REGION: region(),
            copy_snapshot.PARAM_ENCRYPTED: True
        }

        self.logger.test("Running task")
        self.task_runner.run(parameters,
                             task_name=test_method,
                             complete_check_polling_interval=10)
        self.assertTrue(self.task_runner.success(), "Task executed successfully")
        snapshot_copy_id = self.task_runner.results[0].result["copy-snapshot-id"]
        self.snapshots.append(snapshot_copy_id)
        self.logger.test("[X] Task completed")

        self.logger.test("Checking snapshot copy")
        snapshot_copy = self.ec2.get_snapshot(snapshot_copy_id)
        self.assertIsNotNone(snapshot_copy, "Snapshot created")
        self.assertTrue(snapshot_copy["Encrypted"], "Snapshot is encrypted")
        self.assertEqual(snapshot_copy["KmsKeyId"], self.ec2.ebs_default_key_arn, "Default EBS encryption key is used")
        self.logger.test("[X] Snapshot created and encrypted")
    def test_delete_by_retention_count_with_copied_snapshot(self):

        test_method = inspect.stack()[0][3]

        self.cleanup_leftover_source_snapshots(test_method)

        self.logger.test("Creating (source) snapshot")
        snapshot_source = self.ec2.create_snapshot(self.volume_id, tags={
            tasklist_tagname(TESTED_ACTION): test_method
        }, wait_to_complete=300)
        assert (snapshot_source is not None)
        self.created_snapshots.append(snapshot_source["SnapshotId"])

        self.logger.test("Copying snapshot")
        snapshot_copy = self.ec2.copy_snapshot(snapshot_id=snapshot_source["SnapshotId"], destination_region=region(), tags={
            tasklist_tagname(TESTED_ACTION): test_method
        })
        assert (snapshot_copy is not None)
        self.created_snapshots.append(snapshot_copy["SnapshotId"])
        set_snapshot_sources_tags(snapshot_id=snapshot_copy["SnapshotId"], source_volume_id=self.volume_id,
                                  source_snapshot_id=snapshot_source["SnapshotId"])

        try:
            parameters = {
                delete_snapshot_action.PARAM_RETENTION_COUNT: 1,
                delete_snapshot_action.PARAM_RETENTION_DAYS: 0
            }

            self.logger.test("Running task")
            self.task_runner.run(parameters,
                                 task_name=test_method)
            self.assertTrue(self.task_runner.success(expected_executed_tasks=1), "Task executed successfully")
            self.logger.test("[X] Task completed")

            self.deleted_snapshots = getattr(self.task_runner.results[0], "result", {})["deleted"][region()]

            self.logger.test("Checking deleted snapshot")
            self.assertEqual(1, len(self.deleted_snapshots), "Deleted single snapshot")
            self.assertEqual(self.deleted_snapshots[0], snapshot_source["SnapshotId"], "Oldest (source) snapshot deleted")
            self.logger.test("[X] Source snapshot deleted ")

            remaining_snapshot = self.ec2.get_snapshot(snapshot_copy["SnapshotId"])
            self.assertIsNotNone(remaining_snapshot, "Copied snapshot still exists")
            self.logger.test("[X] Copied snapshot still exists")

        finally:
            self.delete_volume_snapshots()
        def create_replaced_instance():

            def register_to_load_balancers():
                self.elb.register_instance(load_balancer_name=self.v1_elb_name, instance_id=self.replaced_instance_id)
                self.elbv2.register_instance(target_group_arn=self.v2_target_group_arn, instance_id=self.replaced_instance_id)

            def tag_instance_volumes():

                volumes = list(self.ec2.get_instance_volumes(self.replaced_instance_id))

                if same_volume_tags:
                    volume_ids = [v["VolumeId"] for v in volumes]
                    vol_tags = {"Tag": TESTED_ACTION}
                    self.ec2.ec2_client.create_tags(Resources=volume_ids, Tags=tag_key_value_list(vol_tags))
                    self.tags_on_replaced_instance = {v["Attachments"][0]["Device"]: vol_tags for v in volumes}

                else:
                    self.tags_on_replaced_instance = {}
                    for v in volumes:
                        dev = v["Attachments"][0]["Device"]
                        vol_tags = {"Tag": dev}
                        self.ec2.ec2_client.create_tags(Resources=[v["VolumeId"]], Tags=tag_key_value_list(vol_tags))
                        self.tags_on_replaced_instance[dev] = vol_tags

            ami = self.get_multi_volume_ami() if multiple_volumes else self.ami_single_volume
            self.logger.test("Start creating replaced instance from AMI {}", ami)

            if replaced_type is not None:
                self.start_type = replaced_type
            else:
                self.start_type = TEST_INSTANCE_TYPES[0 if mode == replace_instance.REPLACE_BY_SPECIFIED_TYPE else 1]

            instance_tags = {
                "Name": test_method,
                tasklist_tagname(TESTED_ACTION): test_method
            }

            if tags is not None:
                instance_tags.update(tags)

            self.replaced_instance = self.ec2.create_instance(self.start_type,
                                                              image_id=ami,
                                                              key_pair=self.key_pair,
                                                              role_name=self.instance_profile,
                                                              tags=instance_tags)

            self.replaced_instance_id = self.replaced_instance["InstanceId"]
            self.logger.test("Created instance {}", self.replaced_instance_id)
            tag_instance_volumes()
            self.new_instance_id = None
            if load_balancing:
                self.logger.test("Registering instance to load balancer(s)")
                register_to_load_balancers()

            if stopped_instance:
                self.ec2.stop_instance(self.replaced_instance_id)
Exemple #11
0
    def test_copy_snapshot_encrypt_with_custom_key_other_region(self):

        destination_ec2 = Ec2(region=remote_region())

        self.logger.test("Creating stack in destination region with custom encryption key")
        remote_stack = get_resource_stack(TESTED_ACTION, create_resource_stack_func=self.create_remote_resource_stack,
                                          use_existing=KEEP_AND_USE_EXISTING_RESOURCES_STACK, region_name=remote_region())

        remote_snapshot_copy_id = None
        try:

            remote_custom_key_arn = remote_stack.stack_outputs["EncryptionKeyArn"]

            test_method = inspect.stack()[0][3]

            self.cleanup_leftover_source_snapshots(test_method)

            self.logger.test("Creating source snapshot")
            source_snapshot_unencrypted = self.ec2.create_snapshot(self.volume_unencrypted, tags={
                "Name": "Ec2CopySnapshot_{}".format(test_method),
                tasklist_tagname(TESTED_ACTION): test_method
            }, description="Snapshot for testing Ec2CopySnapshot : {}".format(test_method))
            assert (source_snapshot_unencrypted is not None)
            self.snapshots.append(source_snapshot_unencrypted["SnapshotId"])

            parameters = {
                copy_snapshot.PARAM_DESTINATION_REGION: remote_region(),
                copy_snapshot.PARAM_ENCRYPTED: True,
                copy_snapshot.PARAM_KMS_KEY_ID: remote_custom_key_arn
            }

            self.snapshots.append(source_snapshot_unencrypted["SnapshotId"])

            self.logger.test("Running task")
            self.task_runner.run(parameters,
                                 task_name=test_method,
                                 complete_check_polling_interval=10)
            self.assertTrue(self.task_runner.success(), "Task executed successfully")
            remote_snapshot_copy_id = self.task_runner.results[0].result["copy-snapshot-id"]
            self.logger.test("[X] Task completed")

            self.logger.test("Checking snapshot copy")
            snapshot_copy = destination_ec2.get_snapshot(remote_snapshot_copy_id)
            self.assertIsNotNone(snapshot_copy, "Snapshot created in destination region")
            self.assertTrue(snapshot_copy["Encrypted"], "Snapshot is encrypted")
            self.assertEqual(snapshot_copy["KmsKeyId"], remote_custom_key_arn, "Custom encryption key is used")
            self.logger.test("[X] Snapshot created and encrypted")

        finally:
            if not KEEP_AND_USE_EXISTING_RESOURCES_STACK and remote_stack is not None:
                remote_stack.delete_stack(600)
            if remote_snapshot_copy_id is not None:
                destination_ec2.delete_snapshots([remote_snapshot_copy_id])
Exemple #12
0
    def test_copy_unencrypted_snapshot_same_region(self):

        test_method = inspect.stack()[0][3]

        self.cleanup_leftover_source_snapshots(test_method)

        self.logger.test("Creating source snapshot")
        source_snapshot_unencrypted = self.ec2.create_snapshot(self.volume_unencrypted, tags={
            "copied-tag": "copied-value",
            "not-copied-tag": "not-copied-value",
            "Name": "Ec2CopySnapshot_{}".format(test_method),
            tasklist_tagname(TESTED_ACTION): test_method
        }, description="Snapshot for testing Ec2CopySnapshot : {}".format(test_method))
        self.snapshots.append(source_snapshot_unencrypted["SnapshotId"])

        testing.tags.set_ec2_tag_to_delete(self.ec2, [source_snapshot_unencrypted["SnapshotId"]])

        parameters = {
            copy_snapshot.PARAM_DESTINATION_REGION: region(),
            copy_snapshot.PARAM_ACCOUNTS_VOLUME_CREATE_PERMISSIONS: ["123456789012"],
            copy_snapshot.PARAM_COPIED_SNAPSHOT_TAGS: "copied-tag",
            copy_snapshot.PARAM_SNAPSHOT_DESCRIPTION: "{{{}}}".format(copy_snapshot.TAG_PLACEHOLDER_SOURCE_DESCRIPTION),
            copy_snapshot.PARAM_SNAPSHOT_TAGS: testing.tags.common_placeholder_tags(
                test_delete=False,
                placeholders=[
                    copy_snapshot.TAG_PLACEHOLDER_SOURCE_REGION,
                    copy_snapshot.TAG_PLACEHOLDER_SOURCE_SNAPSHOT_ID,
                    copy_snapshot.TAG_PLACEHOLDER_SOURCE_VOLUME,
                    copy_snapshot.TAG_PLACEHOLDER_OWNER_ACCOUNT]),
            copy_snapshot.PARAM_SOURCE_TAGS: testing.tags.common_placeholder_tags([
                copy_snapshot.TAG_PLACEHOLDER_COPIED_SNAPSHOT_ID,
                copy_snapshot.TAG_PLACEHOLDER_COPIED_REGION
            ]),
            copy_snapshot.PARAM_COPIED_SNAPSHOTS: copy_snapshot.COPIED_OWNED_BY_ACCOUNT,
            copy_snapshot.PARAM_DELETE_AFTER_COPY: False,
            copy_snapshot.PARAM_ENCRYPTED: False
        }

        self.logger.test("Running task")
        self.task_runner.run(parameters,
                             task_name=test_method,
                             complete_check_polling_interval=10)
        self.assertTrue(self.task_runner.success(), "Task executed successfully")
        snapshot_copy_id = self.task_runner.results[0].result["copy-snapshot-id"]
        self.snapshots.append(snapshot_copy_id)
        self.logger.test("[X] Task completed")

        self.check_copy_snapshot(snapshot_copy_id, source_snapshot_unencrypted, region())
        self.check_source_snapshot(source_snapshot_unencrypted["SnapshotId"], snapshot_copy_id, test_method, region())

        assert (self.task_runner.max_concurrency == 5)
        assert (self.task_runner.concurrency_key == "ec2:CopySnapshot:{}:{}".format(self.task_runner.tested_account,
                                                                                    self.task_runner.tested_region))
Exemple #13
0
 def create_resource_stack(cls, resource_stack_name):
     try:
         cls.logger.test("Creating test resources stack {}", resource_stack_name)
         ami = Ec2(region()).latest_aws_linux_image["ImageId"]
         resource_stack = Stack(resource_stack_name, region=region())
         resource_stack.create_stack(template_file=template_path(__file__, TEST_RESOURCES_TEMPLATE), iam_capability=True,
                                     params={
                                         "InstanceAmi": ami,
                                         "InstanceType": "t2.micro",
                                         "TaskListTagName": tasklist_tagname(TESTED_ACTION),
                                         "TaskListTagValue": ",".join(cls.get_methods())
                                     })
         return resource_stack
     except Exception as ex:
         cls.logger.test("Error creating stack {}, {}", resource_stack_name, ex)
         return None
    def test_delete_by_retention_count(self):

        snapshots_to_create = 4
        snapshots_to_keep = 2

        test_method = inspect.stack()[0][3]

        self.cleanup_leftover_source_snapshots(test_method)

        for i in range(0, snapshots_to_create):
            snapshot = self.ec2.create_snapshot(self.volume_id, tags={
                tasklist_tagname(TESTED_ACTION): test_method
            }, wait_to_complete=300)
            assert (snapshot is not None)
            self.created_snapshots.append(snapshot["SnapshotId"])

        try:
            parameters = {
                delete_snapshot_action.PARAM_RETENTION_COUNT: snapshots_to_keep,
                delete_snapshot_action.PARAM_RETENTION_DAYS: 0
            }

            test_method = inspect.stack()[0][3]

            self.logger.test("Running task")
            self.task_runner.run(parameters,
                                 task_name=test_method, debug=False)
            self.assertTrue(self.task_runner.success(expected_executed_tasks=1), "Task executed successfully")
            self.logger.test("[X] Task completed")

            self.deleted_snapshots = getattr(self.task_runner.results[0], "result", {})["deleted"][region()]

            self.assertEqual(sorted(self.created_snapshots[0:snapshots_to_create - snapshots_to_keep]),
                              sorted(self.deleted_snapshots), "Expected snapshots deleted")
            self.logger.test("[X] {} oldest snapshots deleted out of {}", len(self.deleted_snapshots), len(self.created_snapshots))

            remaining_snapshots = [s["SnapshotId"] for s in self.ec2.get_snapshots_for_volume(volume_id=self.volume_id)]
            self.assertEqual(sorted(self.created_snapshots[snapshots_to_create - snapshots_to_keep:]),
                              sorted(remaining_snapshots), "Expected snapshots retained")
            self.logger.test("[X] {} latest snapshots retained out of {}", len(remaining_snapshots), len(self.created_snapshots))

        finally:
            self.delete_volume_snapshots()
Exemple #15
0
 def create_resource_stack(cls, resource_stack_name):
     try:
         cls.logger.test("Creating test resources stack {}",
                         resource_stack_name)
         resource_stack = Stack(resource_stack_name, region=region())
         resource_stack.create_stack(template_file=template_path(
             __file__, TEST_RESOURCES_TEMPLATE),
                                     iam_capability=False,
                                     params={
                                         "IndexName":
                                         INDEX_NAME,
                                         "TaskListTagName":
                                         tasklist_tagname(TESTED_ACTION),
                                         "TaskListTagValue":
                                         "/".join(cls.get_methods())
                                     })
         return resource_stack
     except Exception as ex:
         cls.logger.test("Error creating stack {}, {}", resource_stack_name,
                         ex)
         return None
 def cleanup_leftover_source_snapshots(self, test_method):
     self.ec2.delete_snapshots_by_tags(tag_filter_expression="{}={}".format(tasklist_tagname(TESTED_ACTION), test_method))
    def do_test_resize(self,
                       test_method,
                       resize_mode,
                       start_type,
                       expected_type,
                       resized_types=None,
                       scaling_range=None,
                       unavailable_types=None,
                       tags=None,
                       assumed_type=None,
                       try_next_in_range=None,
                       running=True):

        if not running:
            self.ec2.stop_instance(self.instance_id)

        self.reset_instance_type(start_type)

        if running:
            time.sleep(10)
            self.ec2.start_instance(self.instance_id)

        org_size = self.ec2.get_instance(instance_id=self.instance_id)["InstanceType"]

        try:

            instance_tags = {tasklist_tagname(TESTED_ACTION): test_method}
            if tags:
                instance_tags.update(tags)

            self.ec2.create_tags(self.instance_id, tags=instance_tags)

            parameters = {
                r.PARAM_RESIZED_INSTANCE_TAGS: testing.tags.common_placeholder_tags(placeholders=[
                    r.TAG_PLACEHOLDER_NEW_INSTANCE_TYPE,
                    r.TAG_PLACEHOLDER_ORG_INSTANCE_TYPE]),

                r.PARAM_RESIZE_MODE: resize_mode
            }

            if resize_mode == r.RESIZE_BY_SPECIFIED_TYPE:
                parameters[r.PARAM_INSTANCE_TYPES] = resized_types
            else:
                parameters[r.PARAM_SCALING_RANGE] = scaling_range
                parameters[r.PARAM_TAGFILTER_SCALE_UP] = "scaling=up"
                parameters[r.PARAM_TAGFILTER_SCALE_DOWN] = "scaling=down"
                if assumed_type is not None:
                    parameters[r.PARAM_ASSUMED_TYPE] = assumed_type
                parameters[r.PARAM_TRY_NEXT_IN_RANGE] = try_next_in_range

            if unavailable_types is not None:
                parameters[r.PARAM_TEST_UNAVAILABLE_TYPES] = unavailable_types if isinstance(unavailable_types, list) else [
                    unavailable_types]

            events = {
                handlers.ec2_tag_event_handler.EC2_TAG_EVENT_SOURCE: {
                    handlers.TAG_CHANGE_EVENT: [
                        handlers.ec2_tag_event_handler.EC2_CHANGED_INSTANCE_TAGS_EVENT
                    ]
                }
            }

            self.logger.test("Running task")
            self.task_runner.run(parameters,
                                 task_name=test_method,
                                 complete_check_polling_interval=15,
                                 events=events)

            self.assertTrue(self.task_runner.success(expected_executed_tasks=1), "Task executed successfully")
            self.logger.test("[X] Task completed")

            # test instance type here
            instance = self.ec2.get_instance(self.instance_id)
            new_type = instance["InstanceType"]
            self.assertEqual(expected_type, new_type, "Expected instance type")

            self.assertTrue(self.ec2.get_instance_status(self.instance_id) == "running" if running else "stopped", "Instance state")
            self.assertEqual(expected_type, new_type, "Expected instance state")

            instance_tags = self.ec2.get_instance_tags(self.instance_id)
            if not self.task_runner.executed_tasks[0].ActionResult.get("not-resized", False):
                self.assertTrue(testing.tags.verify_placeholder_tags(instance_tags,
                                                                     action_placeholders={
                                                                         r.TAG_PLACEHOLDER_NEW_INSTANCE_TYPE: new_type,
                                                                         r.TAG_PLACEHOLDER_ORG_INSTANCE_TYPE: org_size
                                                                     }),
                                "All placeholder tags set on resized instance")
                self.logger.test("[X] Instance placeholder tags created")

            if resize_mode == r.RESIZE_BY_STEP:
                self.assertFalse("scaling" in instance_tags, 'Scaling tags removed')
                self.logger.test("[X] Scaling filter tags removed")

        finally:
            self.restore_tags()