Ejemplo n.º 1
0
def test_deletion_filtered_tags():
    """ Test deletion methods """

    # creating tests objects
    first_ami = AMI()
    first_ami.name = "test-ami1"
    first_ami.id = 'ami-28c2b348'
    first_ami.creation_date = "2017-11-04T01:35:31.000Z"

    second_ami = AMI()
    second_ami.name = "test-ami2"
    second_ami.id = 'ami-28c2b349'
    second_ami.creation_date = "2017-11-04T01:35:31.000Z"
    second_ami.tags = [
        AWSTag.object_with_json(dict(Key="env", Value="prod")),
        AWSTag.object_with_json(dict(Key="role", Value="nginx")),
    ]

    third_ami = AMI()
    third_ami.name = "test-ami3"
    third_ami.id = 'ami-28c2b350'
    third_ami.creation_date = "2017-11-04T01:35:31.000Z"
    third_ami.tags = [
        AWSTag.object_with_json(dict(Key="env", Value="dev")),
        AWSTag.object_with_json(dict(Key="role", Value="nginx")),
    ]

    # constructing dicts
    amis_dict = dict()
    amis_dict[first_ami.id] = first_ami
    amis_dict[second_ami.id] = second_ami
    amis_dict[third_ami.id] = third_ami

    parser = parse_args(
        [
            '--keep-previous', '0',
            '--tag', 'role=nginx',
        ]
    )

    app = App(parser)
    # testing filter
    candidates = app.fetch_candidates(amis_dict)

    candidates_tobedeleted = app.prepare_candidates(candidates)
    assert len(candidates) == 3
    assert candidates_tobedeleted == [second_ami, third_ami]

    parser = parse_args(
        [
            '--keep-previous', '0',
            '--tag', 'role=nginx',
            '--tag', 'env=dev',
        ]
    )

    app = App(parser)
    candidates_tobedeleted2 = app.prepare_candidates(candidates)
    assert len(candidates) == 3
    assert candidates_tobedeleted2 == [third_ami]
Ejemplo n.º 2
0
def test_deletion_ami_min_days():
    """ Test deletion methods """

    # creating tests objects
    first_ami = AMI()
    first_ami.name = "test-ami"
    first_ami.id = "ami-28c2b348"
    first_ami.creation_date = "2017-11-04T01:35:31.000Z"

    second_ami = AMI()
    second_ami.name = "test-ami"
    second_ami.id = "ami-28c2b349"
    second_ami.creation_date = "2017-11-04T01:35:31.000Z"

    # constructing dicts
    amis_dict = dict()
    amis_dict[first_ami.id] = first_ami
    amis_dict[second_ami.id] = second_ami

    parser = parse_args(
        [
            "--keep-previous",
            "0",
            "--ami-min-days",
            "1",
            "--mapping-key",
            "name",
            "--mapping-values",
            "test-ami",
        ]
    )

    app = App(parser)
    # testing filter
    candidates = app.fetch_candidates(amis_dict)

    candidates_tobedeleted = app.prepare_candidates(candidates)
    assert len(candidates) == 2
    assert len(candidates_tobedeleted) == 2

    parser = parse_args(
        [
            "--keep-previous",
            "0",
            "--ami-min-days",
            "10000",
            "--mapping-key",
            "name",
            "--mapping-values",
            "test-ami",
        ]
    )

    app = App(parser)
    candidates_tobedeleted2 = app.prepare_candidates(candidates)
    assert len(candidates) == 2
    assert len(candidates_tobedeleted2) == 0
Ejemplo n.º 3
0
def test_parse_args():
    parser = parse_args(['--keep-previous', '10', '--full-report'])
    assert parser.keep_previous == 10
    assert parser.full_report is True

    parser = parse_args(['--mapping-key', 'name'])
    assert parser is None

    parser = parse_args(
        ['--mapping-key', 'tags', '--mapping-values', 'group1', 'group2'])
    assert parser.mapping_key == "tags"
    assert len(parser.mapping_values) == 2
Ejemplo n.º 4
0
def test_deletion_filtered_name():
    """ Test deletion methods """

    # creating tests objects
    first_ami = AMI()
    first_ami.name = "test-ami-delete-1"
    first_ami.id = 'ami-28c2b348'
    first_ami.creation_date = "2017-11-04T01:35:31.000Z"

    second_ami = AMI()
    second_ami.name = "test-ami-keepme"
    second_ami.id = 'ami-28c2b349'
    second_ami.creation_date = "2017-11-04T01:35:31.000Z"

    third_ami = AMI()
    third_ami.name = "test-ami-delete-2"
    third_ami.id = 'ami-28c2b350'
    third_ami.creation_date = "2017-11-04T01:35:31.000Z"

    # constructing dicts
    amis_dict = dict()
    amis_dict[first_ami.id] = first_ami
    amis_dict[second_ami.id] = second_ami
    amis_dict[third_ami.id] = third_ami

    parser = parse_args(
        [
            '--keep-previous', '0',
            '--mapping-key', 'name',
            '--mapping-values', 'test-ami-delete']
    )

    app = App(parser)
    # testing filter
    candidates = app.fetch_candidates(amis_dict)

    candidates_tobedeleted = app.prepare_candidates(candidates)
    assert len(candidates) == 3
    assert candidates_tobedeleted == [first_ami, third_ami]

    parser = parse_args(
        [
            '--keep-previous', '0',
            '--name', 'test-ami-delete-1',
        ]
    )

    app = App(parser)
    candidates_tobedeleted2 = app.prepare_candidates(candidates)
    assert len(candidates) == 3
    assert candidates_tobedeleted2 == [first_ami]
Ejemplo n.º 5
0
def test_parse_args():
    parser = parse_args(['--keep-previous', '10', '--full-report'])
    assert parser.keep_previous == 10
    assert parser.full_report is True

    parser = parse_args(['--mapping-key', 'name'])
    assert parser is None

    parser = parse_args(['--mapping-key', 'name', '--mapping-values', 'foo'])
    assert parser.mapping_key == "name"
    assert len(parser.mapping_values) == 1

    parser = parse_args(['--ami-min-days', '10'])
    assert parser.ami_min_days == 10

    parser = parse_args(['--name', 'foo'])
    assert parser.filter_names == ["foo"]

    parser = parse_args(['--name', 'foo', 'bar'])
    assert parser.filter_names == ["foo", 'bar']

    parser = parse_args(['--tag', 'foo=alpha', '--tag', 'bar=beta'])
    assert parser.filter_tags == ["foo=alpha", "bar=beta"]

    parser = parse_args(['--exclude-ami', 'foo', 'bar'])
    assert parser.exclude_amis == ["foo", "bar"]
Ejemplo n.º 6
0
def test_deletion():
    """ Test deletion methods """

    base_ami = "ami-1234abcd"

    parser = parse_args([
        '--keep-previous', '0', '--mapping-key', 'name', '--mapping-values',
        'test-ami'
    ])

    conn = boto3.client('ec2')
    reservation = conn.run_instances(ImageId=base_ami, MinCount=1, MaxCount=1)
    instance = reservation["Instances"][0]

    # create amis
    images = []
    for i in xrange(5):
        image = conn.create_image(InstanceId=instance.get("InstanceId"),
                                  Name="test-ami")
        images.append(image.get("ImageId"))

    # delete one by id
    app = App(parser)
    assert len(AMICleaner(conn).fetch_available_amis()) == 5
    assert app.prepare_delete_amis(candidates=[images[4]],
                                   from_ids=True) is None
    assert len(AMICleaner(conn).fetch_available_amis()) == 4

    # delete with mapping strategy
    candidates = app.fetch_and_prepare()
    assert len(candidates) == 4
    assert app.prepare_delete_amis(candidates) is None
    assert len(AMICleaner(conn).fetch_available_amis()) == 0
Ejemplo n.º 7
0
    def __init__(self, cleaner_params):

        self.cleaner = Cleaner(parse_args([
            '--ami-min-days', cleaner_params["min_days"],
            '--mapping-key', cleaner_params["mapping_key"],
            '--mapping-values', cleaner_params["mapping_values"]
        ]))
Ejemplo n.º 8
0
def test_fetch_candidates():
    # creating tests objects
    first_ami = AMI()
    first_ami.id = 'ami-28c2b348'
    first_ami.creation_date = datetime.now()

    first_instance = AWSEC2Instance()
    first_instance.id = 'i-9f9f6a2a'
    first_instance.name = "first-instance"
    first_instance.image_id = first_ami.id
    first_instance.launch_time = datetime.now()

    second_ami = AMI()
    second_ami.id = 'unused-ami'
    second_ami.creation_date = datetime.now()

    second_instance = AWSEC2Instance()
    second_instance.id = 'i-9f9f6a2b'
    second_instance.name = "second-instance"
    second_instance.image_id = first_ami.id
    second_instance.launch_time = datetime.now()

    # constructing dicts
    amis_dict = {first_ami.id: first_ami, second_ami.id: second_ami}
    instances_dict = {}
    instances_dict[first_instance.image_id] = instances_dict
    instances_dict[second_instance.image_id] = second_instance

    # testing filter
    unused_ami_dict = App(parse_args([])).fetch_candidates(
        amis_dict, list(instances_dict))
    assert len(unused_ami_dict) == 1
    assert amis_dict.get('unused-ami') is not None
Ejemplo n.º 9
0
def test_parse_args():
    parser = parse_args(['--keep-previous', '10', '--full-report'])
    assert parser.keep_previous == 10
    assert parser.full_report is True

    parser = parse_args(['--mapping-key', 'name'])
    assert parser is None

    parser = parse_args(['--mapping-key', 'tags',
                         '--mapping-values', 'group1', 'group2'])
    assert parser.mapping_key == "tags"
    assert len(parser.mapping_values) == 2

    parser = parse_args(['--ami-min-days', '10', '--full-report'])
    assert parser.ami_min_days == 10
    assert parser.full_report is True
Ejemplo n.º 10
0
def test_deletion_ami_min_days():
    """ Test deletion methods """

    # creating tests objects
    first_ami = AMI()
    first_ami.name = "test-ami"
    first_ami.id = 'ami-28c2b348'
    first_ami.creation_date = "2017-11-04T01:35:31.000Z"

    second_ami = AMI()
    second_ami.name = "test-ami"
    second_ami.id = 'ami-28c2b349'
    second_ami.creation_date = "2017-11-04T01:35:31.000Z"

    # constructing dicts
    amis_dict = dict()
    amis_dict[first_ami.id] = first_ami
    amis_dict[second_ami.id] = second_ami

    parser = parse_args(
        [
            '--keep-previous', '0',
            '--ami-min-days', '1',
            '--mapping-key', 'name',
            '--mapping-values', 'test-ami']
    )

    app = App(parser)
    # testing filter
    candidates = app.fetch_candidates(amis_dict)

    candidates_tobedeleted = app.prepare_candidates(candidates)
    assert len(candidates) == 2
    assert len(candidates_tobedeleted) == 2

    parser = parse_args(
        [
            '--keep-previous', '0',
            '--ami-min-days', '10000',
            '--mapping-key', 'name',
            '--mapping-values', 'test-ami']
    )

    app = App(parser)
    candidates_tobedeleted2 = app.prepare_candidates(candidates)
    assert len(candidates) == 2
    assert len(candidates_tobedeleted2) == 0
Ejemplo n.º 11
0
def test_parse_args():
    parser = parse_args(["--keep-previous", "10", "--full-report"])
    assert parser.keep_previous == 10
    assert parser.full_report is True

    parser = parse_args(["--mapping-key", "name"])
    assert parser is None

    parser = parse_args(
        ["--mapping-key", "tags", "--mapping-values", "group1", "group2"]
    )
    assert parser.mapping_key == "tags"
    assert len(parser.mapping_values) == 2

    parser = parse_args(["--ami-min-days", "10", "--full-report"])
    assert parser.ami_min_days == 10
    assert parser.full_report is True
Ejemplo n.º 12
0
def test_parse_args_no_args():
    parser = parse_args([])
    assert parser.force_delete is False
    assert parser.from_ids is None
    assert parser.from_ids is None
    assert parser.full_report is False
    assert parser.mapping_key is None
    assert parser.mapping_values is None
    assert parser.keep_previous is 4
Ejemplo n.º 13
0
def test_parse_args_no_args():
    parser = parse_args([])
    assert parser.force_delete is False
    assert parser.from_ids is None
    assert parser.from_ids is None
    assert parser.full_report is False
    assert parser.mapping_key is None
    assert parser.mapping_values is None
    assert parser.keep_previous is 4
    assert parser.ami_min_days is -1
Ejemplo n.º 14
0
def main():

    args = parse_args(sys.argv[1:])
    if not args:
        sys.exit(1)

    app = App(args)

    if app.version is True:
        app.print_version()
    else:
        app.run_cli()
Ejemplo n.º 15
0
def test_deletion_ami_min_days():
    """ Test deletion methods """

    # creating tests objects
    first_ami = AMI()
    first_ami.name = "test-ami"
    first_ami.id = 'ami-28c2b348'
    first_ami.creation_date = "2017-11-04T01:35:31.000Z"

    second_ami = AMI()
    second_ami.name = "test-ami"
    second_ami.id = 'ami-28c2b349'
    second_ami.creation_date = "2017-11-04T01:35:31.000Z"

    # constructing dicts
    amis_dict = {first_ami.id: first_ami, second_ami.id: second_ami}
    parser = parse_args([
        '--keep-previous', '0', '--ami-min-days', '1', '--mapping-key', 'name',
        '--mapping-values', 'test-ami'
    ])

    app = App(parser)
    # testing filter
    candidates = app.fetch_candidates(amis_dict)

    candidates_tobedeleted = app.prepare_candidates(candidates)
    assert len(candidates) == 2
    assert len(candidates_tobedeleted) == 2

    parser = parse_args([
        '--keep-previous', '0', '--ami-min-days', '10000', '--mapping-key',
        'name', '--mapping-values', 'test-ami'
    ])

    app = App(parser)
    candidates_tobedeleted2 = app.prepare_candidates(candidates)
    assert len(candidates) == 2
    assert len(candidates_tobedeleted2) == 0
Ejemplo n.º 16
0
def test_deletion():
    """ Test deletion methods """

    base_ami = "ami-1234abcd"

    parser = parse_args(
        [
            '--keep-previous', '0',
            '--mapping-key', 'name',
            '--mapping-values', 'test-ami']
    )

    ec2 = boto3.client('ec2')
    reservation = ec2.run_instances(
        ImageId=base_ami, MinCount=1, MaxCount=1
    )
    instance = reservation["Instances"][0]

    # create amis
    images = []
    for i in range(5):
        image = ec2.create_image(
            InstanceId=instance.get("InstanceId"),
            Name="test-ami"
        )
        images.append(image.get("ImageId"))

    # delete one AMI by id
    app = App(parser)
    asg = boto3.client('autoscaling')
    f = Fetcher(ec2=ec2, autoscaling=asg)

    assert len(f.fetch_available_amis()) == 5
    assert app.prepare_delete_amis(
        candidates=[images[4]], from_ids=True
    ) is None
    assert len(f.fetch_available_amis()) == 4

    # delete with mapping strategy
    candidates = app.prepare_candidates()
    assert len(candidates) == 4
    assert app.prepare_delete_amis(candidates) is None
    assert len(f.fetch_available_amis()) == 0
Ejemplo n.º 17
0
def test_deletion():
    """ Test deletion methods """

    base_ami = "ami-1234abcd"

    parser = parse_args(
        [
            "--keep-previous",
            "0",
            "--mapping-key",
            "name",
            "--mapping-values",
            "test-ami",
        ]
    )

    ec2 = boto3.client("ec2")
    reservation = ec2.run_instances(ImageId=base_ami, MinCount=1, MaxCount=1)
    instance = reservation["Instances"][0]

    # create amis
    images = []
    for i in range(5):
        image = ec2.create_image(InstanceId=instance.get("InstanceId"), Name="test-ami")
        images.append(image.get("ImageId"))

    # delete one AMI by id
    app = App(parser)
    asg = boto3.client("autoscaling")
    f = Fetcher(ec2=ec2, autoscaling=asg)

    assert len(f.fetch_available_amis()) == 5
    assert app.prepare_delete_amis(candidates=[images[4]], from_ids=True) is None
    assert len(f.fetch_available_amis()) == 4

    # delete with mapping strategy
    candidates = app.prepare_candidates()
    assert len(candidates) == 4
    assert app.prepare_delete_amis(candidates) is None
    assert len(f.fetch_available_amis()) == 0
Ejemplo n.º 18
0
def test_fetch_candidates():
    # creating tests objects
    first_ami = AMI()
    first_ami.id = 'ami-28c2b348'
    first_ami.creation_date = datetime.now()

    first_instance = AWSEC2Instance()
    first_instance.id = 'i-9f9f6a2a'
    first_instance.name = "first-instance"
    first_instance.image_id = first_ami.id
    first_instance.launch_time = datetime.now()

    second_ami = AMI()
    second_ami.id = 'unused-ami'
    second_ami.creation_date = datetime.now()

    second_instance = AWSEC2Instance()
    second_instance.id = 'i-9f9f6a2b'
    second_instance.name = "second-instance"
    second_instance.image_id = first_ami.id
    second_instance.launch_time = datetime.now()

    # constructing dicts
    amis_dict = dict()
    amis_dict[first_ami.id] = first_ami
    amis_dict[second_ami.id] = second_ami

    instances_dict = dict()
    instances_dict[first_instance.image_id] = instances_dict
    instances_dict[second_instance.image_id] = second_instance

    # testing filter
    unused_ami_dict = App(parse_args([])).fetch_candidates(
        amis_dict, list(instances_dict)
    )
    assert len(unused_ami_dict) == 1
    assert amis_dict.get('unused-ami') is not None
Ejemplo n.º 19
0
def test_fetch_candidates_exclude_amis():
    # creating tests objects
    first_ami = AMI()
    first_ami.id = 'ami-28c2b348'
    first_ami.creation_date = datetime.now()

    first_instance = AWSEC2Instance()
    first_instance.id = 'i-9f9f6a2a'
    first_instance.name = "first-instance"
    first_instance.image_id = first_ami.id
    first_instance.launch_time = datetime.now()

    second_ami = AMI()
    second_ami.id = 'excluded-ami'
    second_ami.creation_date = datetime.now()

    second_instance = AWSEC2Instance()
    second_instance.id = 'i-9f9f6a2b'
    second_instance.name = "second-instance"
    second_instance.image_id = first_ami.id
    second_instance.launch_time = datetime.now()

    # constructing dicts
    amis_dict = dict()
    amis_dict[first_ami.id] = first_ami
    amis_dict[second_ami.id] = second_ami

    instances_dict = dict()
    instances_dict[first_instance.image_id] = instances_dict
    instances_dict[second_instance.image_id] = second_instance

    # testing filter
    unused_ami_dict = App(parse_args(["--exclude-ami", "excluded-ami"])).fetch_candidates(
        amis_dict, list(instances_dict)
    )
    assert len(unused_ami_dict) == 0
Ejemplo n.º 20
0
def test_print_defaults():
    assert App(parse_args([])).print_defaults() is None
Ejemplo n.º 21
0
def test_fetch_and_prepare():
    parser = parse_args(['--keep-previous', '0'])
    assert App(parser).prepare_candidates() is None
Ejemplo n.º 22
0
def test_print_defaults():
    assert App(parse_args([])).print_defaults() is None
Ejemplo n.º 23
0
def test_fetch_and_prepare():
    parser = parse_args(['--keep-previous', '0'])
    assert App(parser).prepare_candidates() is None