cloudcomputinghust/CAL

View on GitHub
calplus/v1/network/drivers/amazon.py

Summary

Maintainability
D
1 day
Test Coverage
""" AmazonDriver for Network
    based on BaseDriver
"""


import boto3

from calplus.v1.network.drivers.base import BaseDriver, BaseQuota


PROVIDER = "AMAZON"


class AmazonDriver(BaseDriver):

    """docstring for AmazonDriver"""

    def __init__(self, cloud_config):
        super(AmazonDriver, self).__init__()
        self.aws_access_key_id = cloud_config['aws_access_key_id']
        self.aws_secret_access_key = cloud_config['aws_secret_access_key']
        self.endpoint_url = cloud_config['endpoint_url']
        self.region_name = cloud_config.get('region_name', None)
        self.driver_name = \
            cloud_config.get('driver_name', 'default')
        self.limit = cloud_config.get('limit', None)
        self._setup()

    def _setup(self):
        self.client = boto3.client(
            'ec2',
            aws_access_key_id=self.aws_access_key_id,
            aws_secret_access_key=self.aws_secret_access_key,
            region_name=self.region_name,
            endpoint_url=self.endpoint_url
        )
        self.quota = None

    def create(self, name, cidr, **kargs):

        # step1: create vpc
        vpc = self.client.create_vpc(
            CidrBlock=cidr,
            InstanceTenancy='default'
        ).get('Vpc')
        # step 2: create subnet
        subnet = self.client.create_subnet(
            VpcId=vpc.get('VpcId'),
            CidrBlock=cidr
        ).get('Subnet')

        result = {'name': subnet['SubnetId'],
                  'description': None,
                  'id': subnet['SubnetId'],
                  'cidr': subnet['CidrBlock'],
                  'cloud': PROVIDER,
                  'gateway_ip': None,
                  'security_group': None,
                  'allocation_pools': None,
                  'dns_nameservers': None
                  }

        return result

    def show(self, subnet_id):
        subnet = self.client.describe_subnets(
            SubnetIds=[subnet_id]).get('Subnets')[0]

        result = {'name': subnet['SubnetId'],
                  'description': None,
                  'id': subnet['SubnetId'],
                  'cidr': subnet['CidrBlock'],
                  'cloud': PROVIDER,
                  'gateway_ip': None,
                  'security_group': None,
                  'allocation_pools': None,
                  'dns_nameservers': None
                  }

        return result

    def list(self, **search_opts):
        subnets = self.client.describe_subnets(**search_opts).get('Subnets')
        result = []
        for subnet in subnets:
            sub = {'name': subnet['SubnetId'],
                   'description': None,
                   'id': subnet['SubnetId'],
                   'cidr': subnet['CidrBlock'],
                   'cloud': PROVIDER,
                   'gateway_ip': None,
                   'security_group': None,
                   'allocation_pools': None,
                   'dns_nameservers': None
                   }
            result.append(sub)

        return result

    def update(self, subnet_id, subnet):
        pass

    def delete(self, subnet_id):
        """
        This is bad delete function
        because one vpc can have more than one subnet.
        It is Ok if user only use CAL for manage cloud resource
        We will update ASAP.
        """
        # 1 : show subnet
        subnet = self.client.describe_subnets(
            SubnetIds=[subnet_id]).get('Subnets')[0]
        vpc_id = subnet.get('VpcId')
        # 2 : delete subnet
        self.client.delete_subnet(SubnetId=subnet_id)
        # 3 : delete vpc
        return self.client.delete_vpc(VpcId=vpc_id)

    def connect_external_net(self, network_id):
        pass

    def disconnect_external_net(self, network_id):
        pass

    def allocate_public_ip(self):
        self.client.allocate_address(Domain='vpc')
        return True

    def list_public_ip(self, **search_opts):
        """

        :param search_opts:
        :return: list PublicIP
        """
        result = self.client.describe_addresses(**search_opts)
        ips = result.get('Addresses')
        return_format = []
        for ip in ips:
            return_format.append({
                'public_ip': ip.get('PublicIp'),
                'id': ip.get('AllocationId')
            })
        return return_format

    def release_public_ip(self, public_ip_id):
        self.client.release_address(AllocationId=public_ip_id)
        return True


class AmazonQuota(BaseQuota):

    """docstring for AmazonQuota"""

    def __init__(self, client, limit=None):
        super(AmazonQuota, self).__init__()
        self.client = client
        self.limit = limit
        self._setup()

    def _setup(self):
        if self.limit is None:
            self.limit = None

    def get_networks(self):
        pass

    def get_security_groups(self):
        pass

    def get_floating_ips(self):
        pass

    def get_routers(self):
        pass

    def get_internet_gateways(self):
        pass