def _verify_l2domain(self, domain_json, vspk_domain,
                         vspk_backend_domain=None):
        # The backend l2domain is only relevant when the l2 domain is linked
        # to a backend domain in Shared Infrastructure.
        vspk_backend_domain = vspk_backend_domain or vspk_domain
        self.assertEqual(vspk_domain.id, domain_json.get('id'))
        self.assertEqual(vspk_domain.name, domain_json.get('name'))
        self.assertEqual('L2', domain_json.get('type'))
        self.assertEqual(vspk_domain.parent_id,
                         domain_json.get('net_partition_id'))
        if Topology.has_full_dhcp_control_in_vsd():
            self.assertEqual(vspk_backend_domain.dhcp_managed,
                             domain_json.get('dhcp_managed'))
            self.assertEqual(vspk_backend_domain.ip_type,
                             domain_json.get('ip_version'))
            l2dom_address = IPNetwork(
                vspk_backend_domain.address + '/' +
                vspk_backend_domain.netmask)
            self.assertEqual(str(l2dom_address), domain_json.get('cidr'))
            self.assertEqual(vspk_backend_domain.ipv6_address,
                             domain_json.get('ipv6_cidr'))
            self.assertEqual(vspk_backend_domain.ipv6_gateway,
                             domain_json.get('ipv6_gateway'))

            dhcp_option = vspk_backend_domain.dhcp_options.get_first()
            if dhcp_option:
                self.assertEqual(dhcp_option.actual_values[0],
                                 domain_json['gateway'])
            else:
                self.assertIsNone(domain_json.get('gateway'))
 def _given_vsd_l2_dhcp_disabled_domain(self,
                                        gateway=None,
                                        IPv6Gateway=None):
     if self.vsd_dhcp_managed:
         if not Topology.has_full_dhcp_control_in_vsd():
             self.skipTest(
                 'DHCP cannot be disabled on mgd l2 domain in this release')
         return self._given_vsd_l2domain(dhcp_managed=True,
                                         cidr4=self.cidr4,
                                         enable_dhcpv4=False,
                                         cidr6=self.cidr6,
                                         enable_dhcpv6=False,
                                         return_template=True,
                                         gateway=gateway,
                                         IPv6Gateway=IPv6Gateway)
     else:
         return self._given_vsd_l2domain(dhcp_managed=False,
                                         cidr4=self.cidr4,
                                         cidr6=self.cidr6,
                                         return_template=True)
 def _validate_dhcp_flag(self, l2_dom, enable_dhcp):
     if Topology.has_full_dhcp_control_in_vsd():
         if self._ip_version == 4:
             self.assertEqual(l2_dom.enable_dhcpv4, enable_dhcp)
         else:
             self.assertEqual(l2_dom.enable_dhcpv6, enable_dhcp)
class Ipv4OsMgdL3ConnectivityTest(SingleStackOsMgdConnectivityTestBase):

    @decorators.attr(type='smoke')
    def test_icmp_connectivity_l3_os_managed(self):
        self._icmp_connectivity_l3_os_managed_by_name('test-server')

    @testtools.skipUnless(sys.version_info >= (3, 0),
                          reason='Skip with python 2')
    def test_icmp_connectivity_l3_os_managed_russian(self):
        # Let's serve some Russian horseradish...
        name = (u'\u0445\u0440\u0435\u043d-\u0441-' +
                u'\u0440\u0443\u0447\u043a\u043e\u0439')

        self._icmp_connectivity_l3_os_managed_by_name(name)

    @testtools.skipUnless(sys.version_info >= (3, 0),
                          reason='Skip with python 2')
    def test_icmp_connectivity_l3_os_managed_line_tab(self):
        line_tab = u'\u000b'
        name = 'test' + line_tab + 'server'

        self._icmp_connectivity_l3_os_managed_by_name(name, 'test-server')

    def test_icmp_connectivity_l3_os_managed_neg(self):
        network, _ = self._create_resources(is_l3=True)

        # create open-ssh security group
        ssh_security_group = self.create_open_ssh_security_group()

        # Launch tenant servers in OpenStack network
        server2 = self.create_tenant_server(
            [network],  # in default sg - so not accessible!
            #             -- hence also can't set prepare_for_connectivity
            prepare_for_connectivity=False)

        server1 = self.create_tenant_server(
            [network],
            security_groups=[ssh_security_group],
            prepare_for_connectivity=True)

        # Test connectivity between peer servers
        self.assert_ping(server1, server2, network, should_pass=False)

    def test_icmp_connectivity_l3_os_managed_dual_nic(self):
        network1, _ = self._create_resources(is_l3=True, cidr=self._cidr1)
        network2, _ = self._create_resources(cidr=self._cidr2)

        # create open-ssh security group
        ssh_security_group = self.create_open_ssh_security_group()

        # Launch tenant servers in OpenStack network
        server1 = self.create_tenant_server(
            [network1],
            security_groups=[ssh_security_group])

        server2 = self.create_tenant_server(
            [network2],
            security_groups=[ssh_security_group])

        # create server12 ports
        p1 = self.create_port(
            network=network1,
            security_groups=[ssh_security_group['id']])
        p2 = self.create_port(
            network=network2,
            security_groups=[ssh_security_group['id']],
            extra_dhcp_opts=[{'opt_name': 'router', 'opt_value': '0'}])

        server12 = self.create_tenant_server(
            ports=[p1, p2],
            prepare_for_connectivity=True)

        # Test connectivity between peer servers
        self.assert_ping(server12, server1, network1)
        self.assert_ping(server12, server2, network2)

    @testtools.skipIf(not Topology.has_full_dhcp_control_in_vsd(),
                      'L3 with no DHCP is supported from 6.0 onwards only')
    @testtools.skipIf(not CONF.scenario.dhcp_client,
                      reason='IP statically configured through cloud-init')
    def test_icmp_connectivity_l3_os_managed_no_dhcp(self):
        # Provision OpenStack network resources
        network, _ = self._create_resources(is_l3=True, enable_dhcp=False)

        # create open-ssh security group
        ssh_security_group = self.create_open_ssh_security_group()

        # Launch tenant servers in OpenStack network
        server2 = self.create_tenant_server(
            [network],
            security_groups=[ssh_security_group])

        # to make it reachable via FIP, gateway also must be configured.
        server1 = self.create_tenant_server(
            [network],
            security_groups=[ssh_security_group],
            prepare_for_connectivity=True)

        # Test connectivity between peer servers
        self.assert_ping(server1, server2, network)

    @testtools.skipIf(not Topology.has_full_dhcp_control_in_vsd(),
                      'L3 with no DHCP is supported from 6.0 onwards only')
    @testtools.skipIf(not CONF.scenario.dhcp_client,
                      reason='IP statically configured through cloud-init')
    def test_icmp_connectivity_l3_os_managed_no_dhcp_neg(self):
        # Provision OpenStack network resources
        network, _ = self._create_resources(is_l3=True, enable_dhcp=False)

        # create open-ssh security group
        ssh_security_group = self.create_open_ssh_security_group()

        # Launch tenant servers in OpenStack networks
        # Force DHCP config even though subnet has no
        # DHCP enabled (won't work)
        server2 = self.create_tenant_server(
            [network],
            security_groups=[ssh_security_group],
            force_dhcp_config=True)

        server1 = self.create_tenant_server(
            [network],
            security_groups=[ssh_security_group],
            prepare_for_connectivity=True)

        # Test connectivity between peer servers
        self.assert_ping(server1, server2, network, should_pass=False)

    def test_icmp_connectivity_stateful_acl_os_managed_l3(self):
        self._test_icmp_connectivity_stateful_acl_os_managed(is_l3=True)

    def test_icmp_connectivity_stateless_acl_os_managed_l3_neg(self):
        self._test_icmp_connectivity_stateful_acl_os_managed(
            is_l3=True, stateful=False)

    @testtools.skipUnless(CONF.compute.min_compute_nodes > 1,
                          'Less than 2 compute nodes, skipping multinode '
                          'tests.')
    def test_multi_compute_icmp_connectivity_l3_os_managed(self):
        self._test_multi_compute_icmp_connectivity_os_managed(is_l3=True)

    def test_tcp_stateful_connectivity_l3_os_managed(self):
        # Provision OpenStack network resources
        router = self.create_public_router()
        network = self.create_network()
        subnet = self.create_subnet(network)
        self.router_attach(router, subnet)
        self.validate_tcp_stateful_traffic(network)

    def test_icmp_connectivity_multiple_subnets_in_shared_network(self):
        """test_icmp_connectivity_multiple_subnets_in_shared_network

        Check that there is connectivity between VM's with floatingip's
        in different subnets of the same network. These subnets have
        underlay=False so they end up in a new L3 domain on VSD instead of the
        existing shared FIP to underlay domain.

        """
        # Provision OpenStack network resources
        kwargs = {
            "router:external": True
        }
        ext_network = self.create_network(manager=self.admin_manager, **kwargs)
        ext_s1 = self.create_subnet(ext_network, manager=self.admin_manager,
                                    cidr=data_utils.gimme_a_cidr(),
                                    underlay=False)
        ext_s2 = self.create_subnet(ext_network, manager=self.admin_manager,
                                    cidr=data_utils.gimme_a_cidr(),
                                    underlay=False)

        r1 = self.create_router(external_network_id=ext_network['id'])
        r2 = self.create_router(external_network_id=ext_network['id'])
        r_access = self.create_router(external_network_id=self.ext_net_id)

        n1 = self.create_network()
        s1 = self.create_subnet(n1, cidr=IPNetwork('52.0.0.0/24'))
        self.router_attach(r1, s1)

        n2 = self.create_network()
        s2 = self.create_subnet(n2, cidr=IPNetwork('53.0.0.0/24'))
        self.router_attach(r2, s2)

        # create resources in order to ssh into server 1
        n_access = self.create_network()
        s_access = self.create_subnet(n_access, cidr=data_utils.gimme_a_cidr())
        self.router_attach(r_access, s_access)

        # create open-ssh security group
        ssh_security_group = self.create_open_ssh_security_group()

        # Launch tenant servers in OpenStack network
        p1 = self.create_port(
            network=n1,
            security_groups=[ssh_security_group['id']],
            extra_dhcp_opts=[{'opt_name': 'router', 'opt_value': '0'}]
        )
        p2 = self.create_port(
            network=n2,
            security_groups=[ssh_security_group['id']])
        p_access = self.create_port(
            network=n_access,
            security_groups=[ssh_security_group['id']])

        self.create_floatingip(external_network_id=ext_network['id'],
                               subnet_id=ext_s1['id'], port_id=p1['id'])
        fip2 = self.create_floatingip(external_network_id=ext_network['id'],
                                      subnet_id=ext_s2['id'], port_id=p2['id'])
        server2 = self.create_tenant_server(
            ports=[p2], pre_prepared_fip=fip2,
            prepare_for_connectivity=False)
        server1 = self.create_tenant_server(
            ports=[p_access, p1],
            prepare_for_connectivity=True,
            user_data='ip route add {} via {}'.format(ext_s2['cidr'],
                                                      s1['gateway_ip']))

        # Test connectivity between peer servers
        self.assert_ping(server1, server2, ext_network,
                         address=fip2['floating_ip_address'])

    @decorators.attr(type='smoke')
    def test_icmp_connectivity_l3_os_managed_cross_subnet(self):
        # Provision OpenStack network resources
        # A goal of this tests is also to use the small /30 subnet
        network_1 = self.create_network(port_security_enabled=False)
        subnet_1 = self.create_subnet(network_1)
        network_2 = self.create_network(port_security_enabled=False)
        subnet_2 = self.create_subnet(network_2,
                                      cidr=IPNetwork('10.11.12.1/30'),
                                      mask_bits=30)
        # attach subnets to router
        router = self.create_router(
            external_network_id=self.ext_net_id)
        self.router_attach(router, subnet_1)
        self.router_attach(router, subnet_2)

        # Launch tenant servers in OpenStack network
        server2 = self.create_tenant_server(
            [network_2],
            security_groups=[],
            prepare_for_connectivity=False)

        # to make it reachable via FIP, gateway also must be configured.
        server1 = self.create_tenant_server(
            [network_1],
            security_groups=[],
            prepare_for_connectivity=True)

        # Test connectivity between peer servers
        self.assert_ping(server1, server2, network_2)
    def _verify_vsd_l2domain_template(self,
                                      l2domain_template,
                                      ip_type="IPV4",
                                      dhcp_managed=False,
                                      cidr4=None,
                                      cidr6=None,
                                      **kwargs):

        if dhcp_managed:
            self.assertTrue(l2domain_template.dhcp_managed)

            if ip_type == "IPV4":
                self.assertEqual("IPV4", l2domain_template.ip_type)
                self.assertIsNone(l2domain_template.ipv6_address)
                self.assertIsNone(l2domain_template.ipv6_gateway)
            elif ip_type == "IPV6":
                self.assertEqual("IPV6", l2domain_template.ip_type)
                self.assertIsNone(l2domain_template.address)
                self.assertIsNone(l2domain_template.gateway)
                self.assertIsNone(l2domain_template.netmask)
            elif ip_type == "DUALSTACK":
                self.assertEqual("DUALSTACK", l2domain_template.ip_type)
            else:
                self.assertEqual("IPV6", l2domain_template.ip_type)
                self.assertIsNone(cidr4)

            if cidr4:
                self.assertEqual(str(cidr4.ip), l2domain_template.address)

                if not kwargs.get('netmask'):
                    netmask = str(cidr4.netmask)
                    self.assertEqual(netmask, l2domain_template.netmask)

                if not kwargs.get('gateway'):
                    gateway_ip = str(IPAddress(cidr4) + 1)
                    if not Topology.has_full_dhcp_control_in_vsd():
                        self.assertEqual(gateway_ip, l2domain_template.gateway)
                        kwargs.pop('gateway', None)  # in case set to None
                    elif l2domain_template.enable_dhcpv4:
                        self.assertEqual(gateway_ip, l2domain_template.gateway)
                    else:
                        self.assertIsNone(l2domain_template.gateway)

                if not Topology.has_full_dhcp_control_in_vsd():
                    kwargs.pop('enable_dhcpv4', None)

            else:
                self.assertIsNone(l2domain_template.address)
                self.assertIsNone(l2domain_template.gateway)
                self.assertIsNone(l2domain_template.netmask)

            if cidr6:
                self.assertEqual(str(cidr6), l2domain_template.ipv6_address)
                if not Topology.has_full_dhcp_control_in_vsd():
                    kwargs.pop('enable_dhcpv6', None)
                    kwargs.pop('ipv6_gateway', None)

                elif not kwargs.get('ipv6_gateway'):
                    if kwargs.get('enable_dhcpv6'):
                        gateway_ip = str(IPAddress(cidr6) + 1)
                        self.assertEqual(gateway_ip,
                                         l2domain_template.ipv6_gateway)
                    else:
                        self.assertIsNone(l2domain_template.ipv6_gateway)

        else:
            self.assertFalse(l2domain_template.dhcp_managed)

        # verify all other kwargs as attributes (key,value) pairs
        for key, value in iteritems(kwargs):
            self.assertEqual(value, getattr(l2domain_template, key),
                             'Unexpected value for {}'.format(key))

        self.assertIsNone(l2domain_template.external_id)