Пример #1
0
    def create(self, name=None, **kwargs):
        """
        return: aws instance object
        instance is booting so don't forget to cotton.fabextras.wait_for_shell()
        """
        zone_config = get_provider_zone_config()

        result = self.filter(name=name)
        if result:
            abort(red("VM name already in use"))

        run_instances_args = dict()
        run_instances_args['image_id'] = zone_config['image_id']
        run_instances_args['key_name'] = zone_config['provisioning_ssh_key_name']
        run_instances_args['instance_type'] = zone_config['instance_type']
        if 'security_groups' in zone_config:
            run_instances_args['security_groups'] = zone_config['security_groups']

        reservation = self.connection.run_instances(**run_instances_args)
        instance = reservation.instances[0]

        instance.add_tag("Name", name)
        instance.add_tag("creator", getpass.getuser())

        print("Waiting for instance to run",)
        while instance.state != 'running':
            instance.update()
            sys.stdout.write(".")
            sys.stdout.flush()
            time.sleep(1)
        print(" OK")
        return instance
Пример #2
0
def create(name=None):
    from cotton.fabextras import wait_for_shell

    zone_config = get_provider_zone_config()
    vm_spec = zone_config.get('vm-defaults', {})
    vm_spec['name'] = name

    try:
        vm_spec['tags']
    except KeyError:
        vm_spec['tags'] = {}

    if 'environment' in env:
        vm_spec['tags']['env'] = env.environment
    if 'project' in env:
        vm_spec['tags']['project'] = env.project

    try:
        vm = env.provider.create(**vm_spec)
    except ValueError as e:
        abort(red(e))
    configure_fabric_for_host(
        name)  # TODO: we used to pass server object, check impact
    wait_for_shell()
    return vm
 def _find_node_size(cls, node_size):
     zone_config = get_provider_zone_config()
     for name, size in sorted(zone_config['sizes'].items(),
                              key=lambda t: t[1]):
         if node_size.ram <= size['memory'] and node_size.cpus <= size[
                 'cpu']:
             return name
     return 'xx-large-unknown'
Пример #4
0
def configure_fabric_for_host(name):
    """
    loads provider and configures current host based on name

    if zone_config['gateway'] than it will be configured
    if zone_config['ssh_key'] is supplied then we use it
    if we are in provisioning mode than zone_config['provisioning_ssh_key'] & zone_config['provisioning_user'] & zone_config['provisioning_password'] is used

    updated variables:
    env.provider
    env.vm
    env.vm_name
    env.host_string
    env.host
    env.key_filename
    env.user if in provisioning mode
    """
    get_provider_connection()
    vms = env.provider.filter(name=name)
    if not vms:
        abort(red("VM name='{}' not found".format(name)))
    # will pick first vm from list in case more are available
    env.vm = vms[0]

    env.vm_name = name

    get_provider_connection()
    env.host_string = env.provider.host_string(env.vm)

    zone_config = get_provider_zone_config()

    if env.provisioning:
        if 'provisioning_user' in zone_config:
            env.user = zone_config['provisioning_user']
        else:
            print(yellow("No 'provisioning_user' defined in zone config"))

        if 'provisioning_ssh_key' in zone_config:
            env.key_filename = zone_config['provisioning_ssh_key']
        else:
            print(yellow("No 'provisioning_ssh_key' defined in zone config"))
            print(yellow("Falling back to 'provisioning_password'"))
            if 'provisioning_password' in zone_config:
                env.password = zone_config['provisioning_password']
            else:
                print(
                    yellow(
                        "No 'provisioning_password' defined in zone config"))
    else:
        if 'ssh_key' in zone_config:
            env.key_filename = zone_config['ssh_key']

    if 'gateway' in zone_config:
        if 'gateway_user' in env and env.gateway_user:
            env.gateway = '{}@{}'.format(env.gateway_user,
                                         zone_config['gateway'])
        else:
            env.gateway = '{}@{}'.format(env.user, zone_config['gateway'])
Пример #5
0
    def create(self, name=None, **kwargs):
        """
        return: aws instance object
        instance is booting so don't forget to cotton.fabextras.wait_for_shell()
        """
        zone_config = get_provider_zone_config()

        result = self.filter(name=name)
        if result:
            raise ValueError("VM name already in use")

        run_instances_args = dict()
        run_instances_args['image_id'] = zone_config['image_id']
        run_instances_args['key_name'] = zone_config['provisioning_ssh_key_name']
        run_instances_args['instance_type'] = zone_config['instance_type']

        if 'subnet_id' in zone_config:
            print("Found subnet_id - creating instance within VPC")
            run_instances_args['subnet_id'] = zone_config['subnet_id']
            if 'security_groups' in zone_config:
                raise ValueError("VPC does not accept security_groups - use security_groups_ids instead")
            if 'security_groups_ids' in zone_config:
                run_instances_args['security_group_ids'] = zone_config['security_groups_ids']
        else:
            if 'security_groups_ids' in zone_config:
                raise ValueError("Non VPC does not accept security_group_ids - use security_groups instead")
            if 'security_groups' in zone_config:
                run_instances_args['security_groups'] = zone_config['security_groups']

        if 'root_ebs_size' in zone_config or 'root_ebs_type' in zone_config:
            dev_sda1 = boto.ec2.blockdevicemapping.EBSBlockDeviceType(delete_on_termination=True)
            if 'root_ebs_size' in zone_config:
                dev_sda1.size = zone_config['root_ebs_size'] # size in Gigabytes
            if 'root_ebs_type' in zone_config:
                dev_sda1.volume_type = zone_config['root_ebs_type']
            bdm = boto.ec2.blockdevicemapping.BlockDeviceMapping()
            bdm['/dev/sda1'] = dev_sda1
            run_instances_args['block_device_map'] = bdm

        reservation = self.connection.run_instances(**run_instances_args)
        instance = reservation.instances[0]

        instance.add_tag("Name", name)
        instance.add_tag("creator", getpass.getuser())

        if 'tags' in kwargs:
            for key in kwargs['tags']:
                instance.add_tag(key, kwargs['tags'][key])

        print("Waiting for instance to run",)
        while instance.state != 'running':
            instance.update()
            sys.stdout.write(".")
            sys.stdout.flush()
            time.sleep(1)
        print(" OK")
        return instance
Пример #6
0
def create(name=None):
    from cotton.fabextras import wait_for_shell

    zone_config = get_provider_zone_config()
    vm_spec = zone_config.get('vm-defaults', {})
    vm_spec['name'] = name

    vm = env.provider.create(**vm_spec)
    configure_fabric_for_host(name)  # TODO: we used to pass server object, check impact
    wait_for_shell()
 def _filter_to_vdc(cls, vapps):
     zone_config = get_provider_zone_config()
     if zone_config.get('vdc-filter', False):
         filtered = []
         for vapp in vapps:
             if vapp.extra['vdc'] == zone_config['vm-defaults']['vdc']:
                 filtered.append(vapp)
         return filtered
     else:
         return vapps
Пример #8
0
 def _filter_to_vdc(cls, vapps):
     zone_config = get_provider_zone_config()
     if zone_config.get('vdc-filter', False):
         filtered = []
         for vapp in vapps:
             if vapp.extra['vdc'] == zone_config['vm-defaults']['vdc']:
                 filtered.append(vapp)
         return filtered
     else:
         return vapps
Пример #9
0
def configure_fabric_for_host(name):
    """
    loads provider and configures current host based on name

    if zone_config['gateway'] than it will be configured
    if zone_config['ssh_key'] is supplied then we use it
    if we are in provisioning mode than zone_config['provisioning_ssh_key'] & zone_config['provisioning_user'] & zone_config['provisioning_password'] is used

    updated variables:
    env.provider
    env.vm
    env.vm_name
    env.host_string
    env.host
    env.key_filename
    env.user if in provisioning mode
    """
    get_provider_connection()
    vms = env.provider.filter(name=name)
    if not vms:
        abort(red("VM name='{}' not found".format(name)))
    # will pick first vm from list in case more are available
    env.vm = vms[0]

    env.vm_name = name

    get_provider_connection()
    env.host_string = env.provider.host_string(env.vm)

    zone_config = get_provider_zone_config()

    if env.provisioning:
        if 'provisioning_user' in zone_config:
            env.user = zone_config['provisioning_user']
        else:
            print(yellow("No 'provisioning_user' defined in zone config"))

        if 'provisioning_ssh_key' in zone_config:
            env.key_filename = zone_config['provisioning_ssh_key']
        else:
            print(yellow("No 'provisioning_ssh_key' defined in zone config"))
            print(yellow("Falling back to 'provisioning_password'"))
            if 'provisioning_password' in zone_config:
                env.password = zone_config['provisioning_password']
            else:
                print(yellow("No 'provisioning_password' defined in zone config"))
    else:
        if 'ssh_key' in zone_config:
            env.key_filename = zone_config['ssh_key']

    if 'gateway' in zone_config:
        if 'gateway_user' in env and env.gateway_user:
            env.gateway = '{}@{}'.format(env.gateway_user, zone_config['gateway'])
        else:
            env.gateway = '{}@{}'.format(env.user, zone_config['gateway'])
Пример #10
0
def create(name=None):
    from cotton.fabextras import wait_for_shell

    zone_config = get_provider_zone_config()
    vm_spec = zone_config.get('vm-defaults', {})
    vm_spec['name'] = name

    vm = env.provider.create(**vm_spec)
    configure_fabric_for_host(
        name)  # TODO: we used to pass server object, check impact
    wait_for_shell()
Пример #11
0
def get_provider_connection():
    """
    returns initialized provider object and caches it in env.provider
    """
    zone_config = get_provider_zone_config()

    if 'verbose' in env and env.verbose:
        print("Selected provider zone config:")
        print(zone_config)

    if not 'provider' in env or not env.provider:
        p_class = provider_class(zone_config['driver'])
        env.provider = p_class(**zone_config)
    return env.provider
def get_provider_connection():
    """
    returns initialized provider object and caches it in env.provider
    """
    zone_config = get_provider_zone_config()

    if 'verbose' in env and env.verbose:
        print("Selected provider zone config:")
        print(zone_config)

    if 'provider' not in env or not env.provider:
        p_class = provider_class(zone_config['driver'])
        env.provider = p_class(**zone_config)
    return env.provider
Пример #13
0
    def create(self, name=None, **kwargs):
        """
        return: aws instance object
        instance is booting so don't forget to cotton.fabextras.wait_for_shell()
        """
        zone_config = get_provider_zone_config()

        result = self.filter(name=name)
        if result:
            abort(red("VM name already in use"))


        size = {}
        fields = ['size_id', 'size_slug']
        for field in fields:
            if field in zone_config:
                size[field] = zone_config[field]

        image = {}
        fields = ['image_id', 'image_slug']
        for field in fields:
            if field in zone_config:
                image[field] = zone_config[field]

        region = {}
        fields = ['region_id', 'region_slug']
        for field in fields:
            if field in zone_config:
                region[field] = zone_config[field]

        droplet = self.connection.create_droplet(
            name=name,
            size=size,
            image=image,
            region=region,
            backups_enabled=zone_config['backups_enabled'],
            private_networking=zone_config['private_networking'],
            ssh_key_ids=map(lambda x: str(x), zone_config['ssh_key_ids'])
        )

        print("Waiting for instance to run",)
        while droplet.ip_address is None or droplet.status != 'active':
            sys.stdout.write(".")
            sys.stdout.flush()
            time.sleep(1)
            droplet = self.connection.show_droplet(droplet.droplet_id)
        print(" OK")

        return droplet
    def filter(self, **kwargs):
        """
        return: list of objects matching filter args
        typically provide should support filter 'name'='foo'
        """
        instances = []

        if 'name' in kwargs:
            name = kwargs['name']

            zone_config = get_provider_zone_config()
            assert zone_config['driver'] == 'static'
            for host_spec in zone_config['hosts']:
                if host_spec['name'] == name:
                    print("selected static instance: {}".format(host_spec['name']))
                    instances.append(host_spec)
                    break
            else:
                print(yellow("Warning: {} not found!".format(name), bold=True))
        else:
            raise NotImplementedError()

        return instances
Пример #15
0
def create(name=None):
    from cotton.fabextras import wait_for_shell

    zone_config = get_provider_zone_config()
    vm_spec = zone_config.get('vm-defaults', {})
    vm_spec['name'] = name

    try:
        vm_spec['tags']
    except KeyError:
        vm_spec['tags'] = {}

    if 'environment' in env:
        vm_spec['tags']['env'] = env.environment
    if 'project' in env:
        vm_spec['tags']['project'] = env.project

    try:
        vm = env.provider.create(**vm_spec)
    except ValueError as e:
        abort(red(e))
    configure_fabric_for_host(name)  # TODO: we used to pass server object, check impact
    wait_for_shell()
    return vm
    def status(self):

        zone_config = get_provider_zone_config()
        return zone_config['hosts']
    def create(self, name=None, **kwargs):
        """
        return: aws instance object
        instance is booting so don't forget to cotton.fabextras.wait_for_shell()
        """
        zone_config = get_provider_zone_config()

        result = self.filter(name=name)
        if result:
            raise ValueError("VM name already in use")

        run_instances_args = dict()
        run_instances_args['image_id'] = zone_config['image_id']
        run_instances_args['key_name'] = zone_config[
            'provisioning_ssh_key_name']
        run_instances_args['instance_type'] = zone_config['instance_type']

        if 'subnet_id' in zone_config:
            print("Found subnet_id - creating instance within VPC")
            run_instances_args['subnet_id'] = zone_config['subnet_id']
            if 'security_groups' in zone_config:
                raise ValueError(
                    "VPC does not accept security_groups - use security_groups_ids instead"
                )
            if 'security_groups_ids' in zone_config:
                run_instances_args['security_group_ids'] = zone_config[
                    'security_groups_ids']
        else:
            if 'security_groups_ids' in zone_config:
                raise ValueError(
                    "Non VPC does not accept security_group_ids - use security_groups instead"
                )
            if 'security_groups' in zone_config:
                run_instances_args['security_groups'] = zone_config[
                    'security_groups']

        if 'root_ebs_size' in zone_config or 'root_ebs_type' in zone_config:
            dev_sda1 = boto.ec2.blockdevicemapping.EBSBlockDeviceType(
                delete_on_termination=True)
            if 'root_ebs_size' in zone_config:
                dev_sda1.size = zone_config[
                    'root_ebs_size']  # size in Gigabytes
            if 'root_ebs_type' in zone_config:
                dev_sda1.volume_type = zone_config['root_ebs_type']
            bdm = boto.ec2.blockdevicemapping.BlockDeviceMapping()
            bdm['/dev/sda1'] = dev_sda1
            run_instances_args['block_device_map'] = bdm

        reservation = self.connection.run_instances(**run_instances_args)
        instance = reservation.instances[0]

        instance.add_tag("Name", name)
        instance.add_tag("creator", getpass.getuser())

        if 'tags' in kwargs:
            for key in kwargs['tags']:
                instance.add_tag(key, kwargs['tags'][key])

        print("Waiting for instance to run", )
        while instance.state != 'running':
            instance.update()
            sys.stdout.write(".")
            sys.stdout.flush()
            time.sleep(1)
        print(" OK")
        return instance
Пример #18
0
 def _find_node_size(cls, node_size):
     zone_config = get_provider_zone_config()
     for name, size in sorted(zone_config['sizes'].items(), key=lambda t: t[1]):
         if node_size.ram <= size['memory'] and node_size.cpus <= size['cpu']:
             return name
     return 'xx-large-unknown'