예제 #1
0
    def create_external_network(cls):
        """Creates an external network by the name specified in the config file.

        Skips creating one, if such a network already exists. Also stores the
        href and name of the network as class variables for future use.
        """
        cls._basic_check()
        net_name = cls._config['external_network']['name']

        platform = Platform(cls._sys_admin_client)

        net_refs = platform.list_external_networks()
        if net_name is not '*':
            for net_ref in net_refs:
                if net_ref.get('name').lower() == net_name.lower():
                    cls._logger.debug('Reusing existing ' + net_name)
                    cls._external_network_href = net_ref.get('href')
                    cls._external_network_name = net_name
                    return
            cls._logger.debug('Creating new external network' + net_name)
            ext_nw = cls._create_external_network()
            cls._external_network_href = ext_nw.get('href')
            cls._external_network_name = net_name
            cls._logger.debug('Created external network ' + net_name)
        else:
            if len(net_refs) > 0:
                cls._logger.debug('Defaulting to first network : ' +
                                  net_refs[0].get('name'))
                cls._external_network_href = net_refs[0].get('href')
                cls._external_network_name = net_refs[0].get('name')
            else:
                cls._logger.debug('No usable network found. Aborting test.')
                raise Exception('Test Aborted. No usable external network.')
예제 #2
0
def list_external_networks(ctx):
    try:
        client = ctx.obj['client']

        platform = Platform(client)
        ext_nets = platform.list_external_networks()

        result = []
        for ext_net in ext_nets:
            result.append({'name': ext_net.get('name')})
        stdout(result, ctx)
    except Exception as e:
        stderr(e, ctx)
예제 #3
0
    def test_0000_setup(self):
        """Setup the gateway required for the other tests in this module.

        Create a gateway as per the configuration stated
        above.

        This test passes if the gateway is created successfully.
        """
        logger = Environment.get_default_logger()

        TestGateway._client = Environment.get_sys_admin_client()
        vdc = Environment.get_test_vdc(TestGateway._client)
        platform = Platform(TestGateway._client)
        external_networks = platform.list_external_networks()
        self.assertTrue(len(external_networks) > 0)
        external_network = external_networks[0]

        ext_net_resource = TestGateway._client.get_resource(
            external_network.get('href'))
        ip_scopes = ext_net_resource.xpath(
            'vcloud:Configuration/vcloud:IpScopes/vcloud:IpScope',
            namespaces=NSMAP)
        first_ipscope = ip_scopes[0]
        gateway_ip = first_ipscope.Gateway.text

        subnet_addr = gateway_ip + '/' + str(first_ipscope.SubnetPrefixLength)
        ext_net_to_participated_subnet_with_ip_settings = {
            ext_net_resource.get('name'): {
                subnet_addr: 'Auto'
            }
        }

        gateway_ip_arr = gateway_ip.split('.')
        last_ip_digit = int(gateway_ip_arr[-1]) + 1
        gateway_ip_arr[-1] = str(last_ip_digit)
        next_ip = '.'.join(gateway_ip_arr)
        ext_net_to_subnet_with_ip_range = {
            ext_net_resource.get('name'): {
                subnet_addr: [next_ip + '-' + next_ip]
            }
        }
        ext_net_to_rate_limit = {ext_net_resource.get('name'): {100: 100}}
        TestGateway._gateway = vdc.create_gateway(
            self._name, [ext_net_resource.get('name')], 'compact', None, True,
            ext_net_resource.get('name'), gateway_ip, True, False, False,
            False, True, ext_net_to_participated_subnet_with_ip_settings, True,
            ext_net_to_subnet_with_ip_range, ext_net_to_rate_limit)
        result = TestGateway._client.get_task_monitor().wait_for_success(
            task=TestGateway._gateway.Tasks.Task)
        self.assertEqual(result.get('status'), TaskStatus.SUCCESS.value)
예제 #4
0
    def test_0007_list_external_network_config_ip_allocations(self):
        """List external network configure ip allocations.

        Invoke the list_gateways_configure_ip_settings of the gateway.
        """
        for client in (TestGateway._client, TestGateway._org_client):
            gateway_obj = Gateway(client, self._name,
                                  TestGateway._gateway.get('href'))
            ip_allocations = gateway_obj.list_configure_ip_settings()
            platform = Platform(TestGateway._client)
            external_networks = platform.list_external_networks()
            self.assertTrue(bool(ip_allocations))
            exnet = ip_allocations[0].get('external_network')
            self.assertEqual(external_networks[0].get('name'), exnet)
예제 #5
0
    def test_0015_list_external_network_config_ip_allocations(self):
        """List external network configure ip allocations.

        Invoke the list_gateways_configure_ip_settings of the gateway.
        """
        for client in (TestGateway._client, TestGateway._org_client):
            gateway_obj = Gateway(client, self._name,
                                  TestGateway._gateway.get('href'))
            ip_allocations = gateway_obj.list_configure_ip_settings()
            platform = Platform(TestGateway._client)
            external_networks = platform.list_external_networks()
            self.assertTrue(bool(ip_allocations))
            exnet = ip_allocations[0].get('external_network')
            self.assertEqual(external_networks[0].get('name'), exnet)
예제 #6
0
 def test_030_list_external_networks(self):
     platform = Platform(self.client)
     ext_net_refs = platform.list_external_networks()
     assert len(ext_net_refs) > 0
class VcdExternalNetwork(VcdAnsibleModule):
    def __init__(self, **kwargs):
        super(VcdExternalNetwork, self).__init__(**kwargs)
        self.platform = Platform(self.client)

    def manage_states(self):
        state = self.params.get('state')
        if state == "present":
            return self.create()

        if state == "update":
            return self.update()

        if state == "absent":
            return self.delete()

    def manage_operations(self):
        operation = self.params.get('operation')
        if operation == "list_networks":
            return self.list_external_networks()

        if operation == "add_subnet":
            return self.add_subnet()

        if operation == "add_ip_ranges":
            return self.add_ip_ranges()

        if operation == "modify_ip_ranges":
            return self.modify_ip_ranges()

        if operation == "delete_ip_ranges":
            return self.delete_ip_ranges()

        if operation == "enable_subnet":
            return self.enable_subnet()

        if operation == "attach_port_group":
            return self.attach_port_group()

        if operation == "detach_port_group":
            return self.detach_port_group()

    def create(self):
        vc_name = self.params.get('vc_name')
        port_group_names = self.params.get('port_group_names')
        network_name = self.params.get('network_name')
        gateway_ip = self.params.get('gateway_ip')
        netmask = self.params.get('netmask')
        ip_ranges = self.params.get('ip_ranges')
        primary_dns_ip = self.params.get('primary_dns_ip')
        secondary_dns_ip = self.params.get('secondary_dns_ip')
        dns_suffix = self.params.get('dns_suffix')
        description = self.params.get('description')
        response = dict()
        response['changed'] = False

        try:
            self.platform.get_external_network(network_name)
        except EntityNotFoundException:
            self.platform.create_external_network(network_name, vc_name,
                                                  port_group_names, gateway_ip,
                                                  netmask, ip_ranges,
                                                  description,
                                                  primary_dns_ip,
                                                  secondary_dns_ip,
                                                  dns_suffix)
            msg = "External Network {0} is created"
            response['msg'] = msg.format(network_name)
            response['changed'] = True
        else:
            msg = "External Network {0} is already present"
            response['warnings'] = msg.format(network_name)

        return response

    def update(self):
        network_name = self.params.get('network_name')
        new_network_name = self.params.get('new_network_name')
        description = self.params.get('description')
        response = dict()
        response['changed'] = False

        try:
            self.platform.get_external_network(network_name)
            self.platform.update_external_network(
                network_name, new_network_name, description)
        except EntityNotFoundException:
            msg = "External Network {0} does not exists"
            response['msg'] = msg.format(network_name)
        else:
            msg = "External Network {0} has been updated with {1}"
            response['msg'] = msg.format(network_name, new_network_name)
            response['changed'] = True

        return response

    def delete(self):
        network_name = self.params.get('network_name')
        force_delete = self.params.get('force_delete')
        response = dict()
        response['changed'] = False

        try:
            task = self.platform.delete_external_network(
                network_name, force_delete)
            self.execute_task(task)
        except EntityNotFoundException:
            msg = "External Network {0} does not exists"
            response['msg'] = msg.format(network_name)
        else:
            msg = "External Network {0} has been deleted"
            response['msg'] = msg.format(network_name)
            response['changed'] = True

        return response

    def list_external_networks(self):
        response = dict()
        response['msg'] = list()
        response['changed'] = False

        networks = self.platform.list_external_networks()
        response['msg'] = [v for k, v in networks.items() if k == "name"]

        return response

    def add_subnet(self):
        network_name = self.params.get('network_name')
        gateway_ip = self.params.get('gateway_ip')
        netmask = self.params.get('netmask')
        ip_ranges = self.params.get('ip_ranges')
        primary_dns_ip = self.params.get('primary_dns_ip')
        secondary_dns_ip = self.params.get('secondary_dns_ip')
        dns_suffix = self.params.get('dns_suffix')
        response = dict()
        response['changed'] = False

        network = self.get_network(network_name)
        network.add_subnet(network_name, gateway_ip, netmask, ip_ranges,
                           primary_dns_ip, secondary_dns_ip, dns_suffix)
        msg = "A new subnet has been added to network {0}"
        response['msg'] = msg.format(network_name)
        response['changed'] = True

        return response

    def add_ip_ranges(self):
        network_name = self.params.get('network_name')
        gateway_ip = self.params.get('gateway_ip')
        ip_ranges = self.params.get('ip_ranges')
        response = dict()
        response['changed'] = False

        network = self.get_network(network_name)
        network.add_ip_range(gateway_ip, ip_ranges)
        msg = "A new ip ranges has been added to network {0}"
        response['msg'] = msg.format(network_name)
        response['changed'] = True

        return response

    def modify_ip_ranges(self):
        network_name = self.params.get('network_name')
        gateway_ip = self.params.get('gateway_ip')
        ip_ranges = self.params.get('ip_ranges')
        new_ip_ranges = self.params.get('new_ip_ranges')
        response = dict()
        response['changed'] = False

        if len(ip_ranges) != len(new_ip_ranges):
            raise ValueError(
                "ip_ranges and new_ip_ranges should have same length")

        network = self.get_network(network_name)
        for i in range(len(ip_ranges)):
            network.modify_ip_range(gateway_ip, ip_ranges[i], new_ip_ranges[i])

        msg = "Ip ranges have been updated to network {0}"
        response['msg'] = msg.format(network_name)
        response['changed'] = True

        return response

    def delete_ip_ranges(self):
        network_name = self.params.get('network_name')
        gateway_ip = self.params.get('gateway_ip')
        ip_ranges = self.params.get('ip_ranges')
        response = dict()
        response['changed'] = False

        network = self.get_network(network_name)
        network.delete_ip_range(gateway_ip, ip_ranges)
        msg = "Ip ranges have been deleted from network {0}"
        response['msg'] = msg.format(network_name)
        response['changed'] = True

        return response

    def enable_subnet(self):
        network_name = self.params.get('network_name')
        gateway_ip = self.params.get('gateway_ip')
        enable_subnet = self.params.get('enable_subnet')
        response = dict()
        response['changed'] = False

        network = self.get_network(network_name)
        network.enable_subnet(gateway_ip, enable_subnet)
        s = "has been enabled" if enable_subnet else "has been disabled"
        msg = "subnet with gatway {0} {1} now in network {2}"
        response['msg'] = msg.format(gateway_ip, s, network_name)
        response['changed'] = True

        return response

    def attach_port_group(self):
        network_name = self.params.get('network_name')
        vc_name = self.params.get('vc_name')
        port_group_names = self.params.get('port_group_names')
        response = dict()
        response['changed'] = False

        network = self.get_network(network_name)
        for port_group_name in port_group_names:
            network.attach_port_group(vc_name, port_group_name)

        msg = "port groups {0} have been attached now from network {1}"
        response['msg'] = msg.format(','.join(port_group_names), network_name)
        response['changed'] = True

        return response

    def detach_port_group(self):
        network_name = self.params.get('network_name')
        vc_name = self.params.get('vc_name')
        port_group_names = self.params.get('port_group_names')
        response = dict()
        response['changed'] = False
        network = self.get_network(network_name)

        for port_group_name in port_group_names:
            network.detach_port_group(vc_name, port_group_name)

        msg = "port groups {0} have been detached now from network {1}"
        response['msg'] = msg.format(','.join(port_group_names), network_name)
        response['changed'] = True

        return response

    def get_network(self, network_name):
        network_resource = self.platform.get_external_network(network_name)

        return ExternalNetwork(self.client, resource=network_resource)
예제 #8
0
 def test_0030_list_external_networks(self):
     vdc = Environment.get_test_vdc(TestNetwork._client)
     platform = Platform(TestNetwork._client)
     ext_net_refs = platform.list_external_networks()
     self.assertTrue(len(ext_net_refs) > 0)
예제 #9
0
 def test_030_list_external_networks(self):
     platform = Platform(self.client)
     ext_net_refs = platform.list_external_networks()
     assert len(ext_net_refs) > 0