def test_is_valid_missing_a_key(self):
        params = {'region': u'us-west-2',
                  'subnet': u'subnet-3a78835f',
                  'purchase_type': u'on_demand',
                  'price': u'0.25',
                  'key_name': u'instance-cluster',
                  'security_group_ids': [u'sg-9206aaf7'],
                  'instance_type': u'm4x.large',
                  'tag_name': u'test-cluster',
                  'vol_size':100
                 }

        inst_conf = InstanceConfig(params)

        assert inst_conf.is_valid() is False
    def test_is_valid_missing_a_key(self):
        params = {
            'region': u'us-west-2',
            'subnet': u'subnet-3a78835f',
            'purchase_type': u'on_demand',
            'price': u'0.25',
            'key_name': u'instance-cluster',
            'security_group_ids': [u'sg-9206aaf7'],
            'instance_type': u'm4x.large',
            'tag_name': u'test-cluster',
            'vol_size': 100
        }

        inst_conf = InstanceConfig(params)

        assert inst_conf.is_valid() is False
    def test_is_valid_num_instances_str(self):
        params = {'region': u'us-west-2',
                  'subnet': u'subnet-3a78835f',
                  'purchase_type': u'spot',
                  'image': u'ami-5189a661',
                  'price': u'0.25',
                  'num_instances': "4",
                  'key_name': u'instance-cluster',
                  'security_group_ids': [u'sg-9206aaf7'],
                  'instance_type': u'm4x.large',
                  'tag_name': u'test-cluster',
                  'vol_size':100
                 }

        inst_conf = InstanceConfig(params)

        assert inst_conf.is_valid() is False
    def test_is_valid_correct_keys_str(self):
        params = {'region': 'us-west-2',
                  'subnet': 'subnet-3a78835f',
                  'purchase_type': 'on_demand',
                  'price': '0.25',
                  'num_instance': 4,
                  'key_name': 'instance-cluster',
                  'security_group_ids': ['sg-9206aaf7'],
                  'instance_type': 'm4x.large',
                  'tag_name': 'test-cluster',
                  'vol_size': 100,
                  'bdm': {}
                 }

        inst_conf = InstanceConfig(params)

        assert inst_conf.is_valid() is False
    def test_is_valid_correct_keys_str(self):
        params = {
            'region': 'us-west-2',
            'subnet': 'subnet-3a78835f',
            'purchase_type': 'on_demand',
            'price': '0.25',
            'num_instance': 4,
            'key_name': 'instance-cluster',
            'security_group_ids': ['sg-9206aaf7'],
            'instance_type': 'm4x.large',
            'tag_name': 'test-cluster',
            'vol_size': 100,
            'bdm': {}
        }

        inst_conf = InstanceConfig(params)

        assert inst_conf.is_valid() is False
Example #6
0
    def test_is_valid_num_instances_str(self):
        params = {
            'region': u'us-west-2',
            'subnet': u'subnet-3a78835f',
            'purchase_type': u'spot',
            'image': u'ami-5189a661',
            'price': u'0.25',
            'num_instances': "4",
            'key_name': u'instance-cluster',
            'security_group_ids': [u'sg-9206aaf7'],
            'instance_type': u'm4x.large',
            'tag_name': u'test-cluster',
            'vol_size': 100
        }

        inst_conf = InstanceConfig(params)

        assert inst_conf.is_valid() is False
Example #7
0
    def test_request_spot(self):
        region = 'us-west-2'
        ami_dummy = 'ami-1234abcd'  # default mock ami

        client = boto3.client('ec2', region)

        # setup mock vpc
        vpc = client.create_vpc(CidrBlock="10.0.0.0/16")
        vpc_id = vpc['Vpc']['VpcId']

        # setup mock subnet
        subnet = client.create_subnet(VpcId=vpc_id, CidrBlock="10.0.0.0/20")
        subnet_id = subnet['Subnet']['SubnetId']

        # setup mock key pair
        kp = client.create_key_pair(KeyName="instance-cluster")
        kp_name = kp['KeyName']

        # setup mock security group
        security_group = client.create_security_group(
            GroupName="sg-test",
            Description="test security group",
            VpcId=vpc_id)
        security_group_id = security_group['GroupId']

        # create InstanceConfig class with mocked parameters
        params = {
            'region': unicode(region),
            'subnet': unicode(subnet_id),
            'purchase_type': u'spot',
            'image': unicode(ami_dummy),
            'price': u'0.25',
            'num_instances': 4,
            'key_name': unicode(kp_name),
            'security_group_ids': [unicode(security_group_id)],
            'instance_type': u'm4x.large',
            'tag_name': u'test-cluster',
            'vol_size': 100
        }

        inst_conf = InstanceConfig(params)

        # request spot instance
        if inst_conf.is_valid():
            butil = BotoUtil(region)
            spot_req_ids = butil.request_spot(inst_conf)

        # fetch all on demand instances
        response = client.describe_spot_instance_requests(
            SpotInstanceRequestIds=spot_req_ids)

        num_requests = len(response['SpotInstanceRequests'])
        ami_ids = []
        key_names = []
        security_group_ids = []
        instance_types = []
        spot_request_ids = []
        spot_prices = []
        spot_names = []

        for spot_requests in response['SpotInstanceRequests']:
            spot_request_ids.append(spot_requests['SpotInstanceRequestId'])
            spot_prices.append(spot_requests['SpotPrice'])
            spot_names.append(spot_requests['Tags'][0]['Value'])

            launch_spec = spot_requests['LaunchSpecification']
            ami_ids.append(launch_spec['ImageId'])
            key_names.append(launch_spec['KeyName'])
            security_group_ids.append(
                launch_spec['SecurityGroups'][0]['GroupId'])
            instance_types.append(launch_spec['InstanceType'])

        assert num_requests == 4
        assert len(set(ami_ids)) == 1
        assert ami_ids[0] == ami_dummy
        assert len(set(key_names)) == 1
        assert key_names[0] == kp_name
        assert len(set(security_group_ids)) == 1
        #assert security_group_ids[0] == security_group_id
        assert len(set(instance_types)) == 1
        assert instance_types[0] == 'm4x.large'
        assert len(set(spot_prices)) == 1
        assert spot_prices[0] == '0.25'
        assert len(set(spot_names)) == 1
        assert spot_names[0] == 'test-cluster'
Example #8
0
#!/usr/local/bin/python

import argparse
import json
from util.boto_util import BotoUtil, InstanceConfig

if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument('template_path', help='path to instance template')
    args = parser.parse_args()

    with open(args.template_path) as json_file:
        params = json.load(json_file)

    BUtil = BotoUtil(params['region'])
    IConf = InstanceConfig(params)

    if IConf.is_valid():
        BUtil.launch_instances(IConf)
    def test_is_valid_one_correct_key(self):
        params = {"vol_size": 100}

        inst_conf = InstanceConfig(params)

        assert inst_conf.is_valid() is False
Example #10
0
    def test_request_spot(self):
        region = 'us-west-2'

        client = boto3.client('ec2', region)

        # setup mock vpc
        vpc = client.create_vpc(CidrBlock="10.0.0.0/16")
        vpc_id = vpc['Vpc']['VpcId']

        # setup mock subnet
        subnet = client.create_subnet(VpcId=vpc_id, CidrBlock="10.0.0.0/20")
        subnet_id = subnet['Subnet']['SubnetId']

        # setup mock key pair
        kp = client.create_key_pair(KeyName="instance-cluster")
        kp_name = kp['KeyName']

        # setup mock security group
        security_group = client.create_security_group(
            GroupName="sg-test",
            Description="test security group",
            VpcId=vpc_id)
        security_group_id = security_group['GroupId']

        # create InstanceConfig class with mocked parameters
        params = {'region': unicode(region),
                  'subnet': unicode(subnet_id),
                  'purchase_type': u'spot',
                  'price': u'0.25',
                  'num_instances': 4,
                  'key_name': unicode(kp_name),
                  'security_group_ids': [unicode(security_group_id)],
                  'instance_type': u'm4x.large',
                  'tag_name': u'test-cluster',
                  'vol_size': 100
                 }

        inst_conf = InstanceConfig(params)

        # request spot instance
        if inst_conf.is_valid():
            butil = BotoUtil(region)
            spot_req_ids = butil.request_spot(inst_conf)

        # fetch all on demand instances
        response = client.describe_spot_instance_requests(SpotInstanceRequestIds=spot_req_ids)

        num_requests = len(response['SpotInstanceRequests'])
        ami_ids = []
        key_names = []
        security_group_ids = []
        instance_types = []
        spot_request_ids = []
        spot_prices = []
        spot_names = []

        for spot_requests in response['SpotInstanceRequests']:
            spot_request_ids.append(spot_requests['SpotInstanceRequestId'])
            spot_prices.append(spot_requests['SpotPrice'])
            spot_names.append(spot_requests['Tags'][0]['Value'])

            launch_spec = spot_requests['LaunchSpecification']
            ami_ids.append(launch_spec['ImageId'])
            key_names.append(launch_spec['KeyName'])
            security_group_ids.append(launch_spec['SecurityGroups'][0]['GroupId'])
            instance_types.append(launch_spec['InstanceType'])

        assert num_requests == 4
        assert len(set(ami_ids)) == 1
        assert ami_ids[0] == "ami-4342a723"
        assert len(set(key_names)) == 1
        assert key_names[0] == kp_name
        assert len(set(security_group_ids)) == 1
        #assert security_group_ids[0] == security_group_id
        assert len(set(instance_types)) == 1
        assert instance_types[0] == 'm4x.large'
        assert len(set(spot_prices)) == 1
        assert spot_prices[0] == '0.25'
        assert len(set(spot_names)) == 1
        assert spot_names[0] == 'test-cluster'
Example #11
0
    def test_request_on_demand(self):
        region = 'us-west-2'

        client = boto3.client('ec2', region)

        # setup mock vpc
        vpc = client.create_vpc(CidrBlock="10.0.0.0/16")
        vpc_id = vpc['Vpc']['VpcId']

        # setup mock subnet
        subnet = client.create_subnet(VpcId=vpc_id, CidrBlock="10.0.0.0/20")
        subnet_id = subnet['Subnet']['SubnetId']

        # setup mock key pair
        kp = client.create_key_pair(KeyName="instance-cluster")
        kp_name = kp['KeyName']

        # setup mock security group
        security_group = client.create_security_group(
            GroupName="sg-test",
            Description="test security group",
            VpcId=vpc_id)
        security_group_id = security_group['GroupId']

        # create InstanceConfig class with mocked parameters
        params = {'region': unicode(region),
                  'subnet': unicode(subnet_id),
                  'purchase_type': u'on_demand',
                  'price': u'0.25',
                  'num_instances': 4,
                  'key_name': unicode(kp_name),
                  'security_group_ids': [unicode(security_group_id)],
                  'instance_type': u'm4x.large',
                  'tag_name': u'test-cluster',
                  'vol_size': 100
                 }

        inst_conf = InstanceConfig(params)

        # run on demand instance
        if inst_conf.is_valid():
            butil = BotoUtil(region)
            butil.request_ondemand(inst_conf)

        # fetch all on demand instances
        response = client.describe_instances()

        num_instances = 0
        ami_ids = []
        key_names = []
        security_group_ids = []
        instance_types = []

        for reservation in response['Reservations']:
            num_instances += len(reservation['Instances'])
            for instance in reservation['Instances']:
                ami_ids.append(instance['ImageId'])
                key_names.append(instance['KeyName'])
                security_group_ids.append(instance['SecurityGroups'][0]['GroupId'])
                instance_types.append(instance['InstanceType'])

        assert num_instances == 4
        assert len(set(ami_ids)) == 1
        assert ami_ids[0] == "ami-4342a723"
        assert len(set(key_names)) == 1
        assert key_names[0] == kp_name
        assert len(set(security_group_ids)) == 1
        assert security_group_ids[0] == security_group_id
        assert len(set(instance_types)) == 1
        assert instance_types[0] == 'm4x.large'
    def test_is_valid_one_correct_key(self):
        params = {"vol_size": 100}

        inst_conf = InstanceConfig(params)

        assert inst_conf.is_valid() is False
Example #13
0
    def test_request_on_demand(self):
        region = 'us-west-2'
        ami_dummy = 'ami-1234abcd' # default mock ami

        client = boto3.client('ec2', region)

        # setup mock vpc
        vpc = client.create_vpc(CidrBlock="10.0.0.0/16")
        vpc_id = vpc['Vpc']['VpcId']

        # setup mock subnet
        subnet = client.create_subnet(VpcId=vpc_id, CidrBlock="10.0.0.0/20")
        subnet_id = subnet['Subnet']['SubnetId']

        # setup mock key pair
        kp = client.create_key_pair(KeyName="instance-cluster")
        kp_name = kp['KeyName']

        # setup mock security group
        security_group = client.create_security_group(
            GroupName="sg-test",
            Description="test security group",
            VpcId=vpc_id)
        security_group_id = security_group['GroupId']

        # create InstanceConfig class with mocked parameters
        params = {'region': unicode(region),
                  'subnet': unicode(subnet_id),
                  'purchase_type': u'on_demand',
                  'image': unicode(ami_dummy),
                  'price': u'0.25',
                  'num_instances': 4,
                  'key_name': unicode(kp_name),
                  'security_group_ids': [unicode(security_group_id)],
                  'instance_type': u'm4x.large',
                  'tag_name': u'test-cluster',
                  'vol_size': 100
                 }

        inst_conf = InstanceConfig(params)

        # run on demand instance
        if inst_conf.is_valid():
            butil = BotoUtil(region)
            butil.request_ondemand(inst_conf)

        # fetch all on demand instances
        response = client.describe_instances()

        num_instances = 0
        ami_ids = []
        key_names = []
        security_group_ids = []
        instance_types = []

        for reservation in response['Reservations']:
            num_instances += len(reservation['Instances'])
            for instance in reservation['Instances']:
                ami_ids.append(instance['ImageId'])
                key_names.append(instance['KeyName'])
                security_group_ids.append(instance['SecurityGroups'][0]['GroupId'])
                instance_types.append(instance['InstanceType'])

        assert num_instances == 4
        assert len(set(ami_ids)) == 1
        assert ami_ids[0] == ami_dummy
        assert len(set(key_names)) == 1
        assert key_names[0] == kp_name
        assert len(set(security_group_ids)) == 1
        assert security_group_ids[0] == security_group_id
        assert len(set(instance_types)) == 1
        assert instance_types[0] == 'm4x.large'
Example #14
0
#!/usr/local/bin/python

import argparse
import json
from util.boto_util import BotoUtil, InstanceConfig

if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument('template_path', help='path to instance template')
    args = parser.parse_args()

    with open(args.template_path) as json_file:
        params = json.load(json_file)


    BUtil = BotoUtil(params['region'])
    IConf = InstanceConfig(params)

    if IConf.is_valid():
        BUtil.launch_instances(IConf)