def test_create_delete_network_with_kuryr_driver(self): """Create and Delete docker network with Kuryr This method creates a docker network with Kuryr driver and tests it was created in Neutron. It then deletes the docker network and tests that it was deleted from Neutron. """ fake_ipam = { "Driver": "kuryr", "Options": {}, "Config": [ { "Subnet": "10.0.0.0/16", "IPRange": "10.0.0.0/24", "Gateway": "10.0.0.1" } ] } net_name = lib_utils.get_random_string(8) res = self.docker_client.create_network(name=net_name, driver='kuryr', ipam=fake_ipam) net_id = res['Id'] try: network = self.neutron_client.list_networks( tags=utils.make_net_tags(net_id)) except Exception as e: self.docker_client.remove_network(net_id) message = ("Failed to list neutron networks: %s") self.fail(message % e.args[0]) self.assertEqual(1, len(network['networks'])) self.docker_client.remove_network(net_id) network = self.neutron_client.list_networks( tags=utils.make_net_tags(net_id)) self.assertEqual(0, len(network['networks']))
def test_create_delete_network_with_kuryr_driver(self): """Create and Delete docker network with Kuryr This method creates a docker network with Kuryr driver and tests it was created in Neutron. It then deletes the docker network and tests that it was deleted from Neutron. """ fake_ipam = { "Driver": "kuryr", "Options": {}, "Config": [{ "Subnet": "10.0.0.0/16", "IPRange": "10.0.0.0/24", "Gateway": "10.0.0.1" }] } net_name = lib_utils.get_random_string(8) res = self.docker_client.create_network(name=net_name, driver='kuryr', ipam=fake_ipam) net_id = res['Id'] try: network = self.neutron_client.list_networks( tags=utils.make_net_tags(net_id)) except Exception as e: self.docker_client.remove_network(net_id) message = ("Failed to list neutron networks: %s") self.fail(message % e.args[0]) self.assertEqual(1, len(network['networks'])) self.docker_client.remove_network(net_id) network = self.neutron_client.list_networks( tags=utils.make_net_tags(net_id)) self.assertEqual(0, len(network['networks']))
def setUp(self): super(ContainerTest, self).setUp() fake_ipam = { "Driver": "kuryr", "Options": {}, "Config": [ { "Subnet": "10.3.0.0/16", "IPRange": "10.3.0.0/24", "Gateway": "10.3.0.1" } ] } net_name = lib_utils.get_random_string(8) res = self.docker_client.create_network(name=net_name, driver='kuryr', ipam=fake_ipam) self.net_id = res.get('Id') try: networks = self.neutron_client.list_networks( tags=utils.make_net_tags(self.net_id)) except Exception as e: self.docker_client.remove_network(self.net_id) message = ("Failed to list neutron networks: %s") self.fail(message % e.args[0]) self.assertEqual(1, len(networks['networks'])) self.neutron_net_id = networks['networks'][0]['id']
def test_connect_disconnect_container(self): # Test if support connect/disconnect operations container_name = lib_utils.get_random_string(8) container = self.docker_client.create_container( image='kuryr/busybox', command='/bin/sleep 600', hostname='kuryr_test_container', name=container_name) warn_msg = container.get('Warning') container_id = container.get('Id') self.assertIsNone(warn_msg, 'Warn in creating container') self.assertIsNotNone(container_id, 'Create container id must not ' 'be None') self.docker_client.start(container=container_id) self.docker_client.connect_container_to_network(container_id, self.net_id) try: ports = self.neutron_client.list_ports( network_id=self.neutron_net_id) except Exception as e: self.docker_client.disconnect_container_from_network( container_id, self.net_id) message = ("Failed to list neutron ports: %s") self.fail(message % e.args[0]) # A dhcp port gets created as well; dhcp is enabled by default self.assertEqual(2, len(ports['ports'])) self.docker_client.disconnect_container_from_network(container_id, self.net_id) ports = self.neutron_client.list_ports( network_id=self.neutron_net_id) self.assertEqual(1, len(ports['ports'])) self.docker_client.stop(container=container_id)
def test_create_network_with_same_name(self): """Create docker network with same name Create two docker networks with same name, delete them and see that neutron networks are deleted as well """ fake_ipam_1 = { "Driver": "kuryr", "Options": {}, "Config": [{ "Subnet": "10.1.0.0/16", "IPRange": "10.1.0.0/24", "Gateway": "10.1.0.1" }] } fake_ipam_2 = { "Driver": "kuryr", "Options": {}, "Config": [{ "Subnet": "10.2.0.0/16", "IPRange": "10.2.0.0/24", "Gateway": "10.2.0.1" }] } net_name = lib_utils.get_random_string(8) res = self.docker_client.create_network(name=net_name, driver='kuryr', ipam=fake_ipam_1) net_id1 = res['Id'] res = self.docker_client.create_network(name=net_name, driver='kuryr', ipam=fake_ipam_2) net_id2 = res['Id'] try: network = self.neutron_client.list_networks( tags=utils.make_net_tags(net_id1)) self.assertEqual(1, len(network['networks'])) network = self.neutron_client.list_networks( tags=utils.make_net_tags(net_id2)) self.assertEqual(1, len(network['networks'])) except Exception as e: self.docker_client.remove_network(net_id1) self.docker_client.remove_network(net_id2) message = ("Failed to list neutron networks: %s") self.fail(message % e.args[0]) self.docker_client.remove_network(net_id1) self.docker_client.remove_network(net_id2) network = self.neutron_client.list_networks( tags=utils.make_net_tags(net_id1)) self.assertEqual(0, len(network['networks'])) network = self.neutron_client.list_networks( tags=utils.make_net_tags(net_id2)) self.assertEqual(0, len(network['networks']))
def test_create_network_with_same_name(self): """Create docker network with same name Create two docker networks with same name, delete them and see that neutron networks are deleted as well """ fake_ipam_1 = { "Driver": "kuryr", "Options": {}, "Config": [ { "Subnet": "10.1.0.0/16", "IPRange": "10.1.0.0/24", "Gateway": "10.1.0.1" } ] } fake_ipam_2 = { "Driver": "kuryr", "Options": {}, "Config": [ { "Subnet": "10.2.0.0/16", "IPRange": "10.2.0.0/24", "Gateway": "10.2.0.1" } ] } net_name = lib_utils.get_random_string(8) res = self.docker_client.create_network(name=net_name, driver='kuryr', ipam=fake_ipam_1) net_id1 = res['Id'] res = self.docker_client.create_network(name=net_name, driver='kuryr', ipam=fake_ipam_2) net_id2 = res['Id'] try: network = self.neutron_client.list_networks( tags=utils.make_net_tags(net_id1)) self.assertEqual(1, len(network['networks'])) network = self.neutron_client.list_networks( tags=utils.make_net_tags(net_id2)) self.assertEqual(1, len(network['networks'])) except Exception as e: self.docker_client.remove_network(net_id1) self.docker_client.remove_network(net_id2) message = ("Failed to list neutron networks: %s") self.fail(message % e.args[0]) self.docker_client.remove_network(net_id1) self.docker_client.remove_network(net_id2) network = self.neutron_client.list_networks( tags=utils.make_net_tags(net_id1)) self.assertEqual(0, len(network['networks'])) network = self.neutron_client.list_networks( tags=utils.make_net_tags(net_id2)) self.assertEqual(0, len(network['networks']))
def test_create_delete_dualstack_network_with_kuryr_driver(self): """Create and Delete docker dual-stack network with Kuryr This method creates a docker network with Kuryr driver and tests it was created in Neutron. It then deletes the docker network and tests that it was deleted from Neutron. """ fake_ipam = { "Driver": "kuryr", "Options": {}, "Config": [{ "Subnet": "10.4.0.0/16", "IPRange": "10.4.0.0/24", "Gateway": "10.4.0.1" }, { "Subnet": "2001:db8:a0b:12f0::/64", "IPRange": "2001:db8:a0b:12f0::/64", "Gateway": "2001:db8:a0b:12f0::1" }] } net_name = lib_utils.get_random_string(8) res = self.docker_client.create_network(name=net_name, driver='kuryr', enable_ipv6=True, ipam=fake_ipam) net_id = res['Id'] try: network = self.neutron_client.list_networks( tags=utils.make_net_tags(net_id)) except Exception as e: self.docker_client.remove_network(net_id) message = ("Failed to list neutron networks: %s") self.fail(message % e.args[0]) self.assertEqual(1, len(network['networks'])) neutron_netid = network['networks'][0]['id'] subnets = self.neutron_client.list_subnets(network_id=neutron_netid) self.assertEqual(2, len(subnets['subnets'])) subnet_version = [] subnet_name = [] for subnet in subnets['subnets']: subnet_version.append(subnet['ip_version']) subnet_name.append(subnet['name']) self.assertIn(4, subnet_version) self.assertIn(6, subnet_version) self.assertIn(constants.SUBNET_NAME_PREFIX + '10.4.0.0/24', subnet_name) self.assertIn(constants.SUBNET_NAME_PREFIX + '2001:db8:a0b:12f0::/64', subnet_name) self.docker_client.remove_network(net_id) network = self.neutron_client.list_networks( tags=utils.make_net_tags(net_id)) self.assertEqual(0, len(network['networks'])) subnets = self.neutron_client.list_subnets(network_id=neutron_netid) self.assertEqual(0, len(subnets['subnets']))
def test_create_delete_network_without_kuryr_driver(self): """Create and Delete docker network without Kuryr This method create a docker network with the default docker driver, It tests that it was created correctly, but not added to Neutron """ net_name = lib_utils.get_random_string(8) res = self.docker_client.create_network(name=net_name) net_id = res['Id'] network = self.neutron_client.list_networks( tags=utils.make_net_tags(net_id)) self.assertEqual(0, len(network['networks'])) docker_networks = self.docker_client.networks() network_found = False for docker_net in docker_networks: if docker_net['Id'] == net_id: network_found = True self.assertTrue(network_found) self.docker_client.remove_network(net_id)
def test_get_random_string(self): fake_string_len = 20 self.assertEqual(fake_string_len, len(utils.get_random_string(fake_string_len)))
def test_container_ipam_request_address(self): fake_ipam = { "Driver": "kuryr", "Options": {}, "Config": [{ "Subnet": "10.12.0.0/16", "IPRange": "10.12.0.0/24", "Gateway": "10.12.0.1" }] } container_net_name = lib_utils.get_random_string(8) container_net = self.docker_client.create_network( name=container_net_name, driver='kuryr', ipam=fake_ipam) container_net_id = container_net.get('Id') try: networks = self.neutron_client.list_networks( tags=utils.make_net_tags(container_net_id)) except Exception as e: self.docker_client.remove_network(container_net_id) message = ("Failed to list neutron networks: %s") self.fail(message % e.args[0]) # Currently we cannot get IPAM pool from docker client. pool_name = "kuryrPool-" + "10.12.0.0/24" subnetpools = self.neutron_client.list_subnetpools(name=pool_name) self.assertEqual(1, len(subnetpools['subnetpools'])) subnets = self.neutron_client.list_subnets( network_id=networks['networks'][0]['id'], cidr="10.12.0.0/24") self.assertEqual(1, len(subnets['subnets'])) # Boot a container, and connect to the docker network. container_name = lib_utils.get_random_string(8) container = self.docker_client.create_container( image='kuryr/busybox', command='/bin/sleep 600', hostname='kuryr_test_container', name=container_name) warn_msg = container.get('Warning') container_id = container.get('Id') self.assertIsNone(warn_msg, 'Warn in creating container') self.assertIsNotNone(container_id, 'Create container id must not ' 'be None') self.docker_client.start(container=container_id) self.docker_client.connect_container_to_network( container_id, container_net_id) try: ports = self.neutron_client.list_ports( network_id=networks['networks'][0]['id']) except Exception as e: self.docker_client.disconnect_container_from_network( container_id, container_net_id) message = ("Failed to list neutron ports: %s") self.fail(message % e.args[0]) # DHCP port and container endpoint self.assertEqual(2, len(ports['ports'])) # Find the kuryr port kuryr_port_param = {"network_id": networks['networks'][0]['id']} kuryr_ports = self.neutron_client.list_ports(**kuryr_port_param) kuryr_port = [ port for port in kuryr_ports['ports'] if (lib_const.DEVICE_OWNER in port['tags'] or port['name'] == utils.get_neutron_port_name(port['device_id'])) ] self.assertEqual(1, len(kuryr_port)) # Disconnect container from network, this release ip address. self.docker_client.disconnect_container_from_network( container_id, container_net_id) # Cleanup resources self.docker_client.stop(container=container_id) self.docker_client.remove_network(container_net_id)
def test_container_ipam_release_address_with_existing_port_same_ip(self): ipv4_address = "10.15.0.10" # pre-created the first Neutron network and subnet and port neutron_net_name = lib_utils.get_random_string(8) neutron_network = self.neutron_client.create_network( {'network': { 'name': neutron_net_name, "admin_state_up": True }}) neutron_subnet_name = lib_utils.get_random_string(8) subnet_param = [{ 'name': neutron_subnet_name, 'network_id': neutron_network['network']['id'], 'ip_version': 4, 'cidr': "10.15.0.0/24", }] neutron_subnet = self.neutron_client.create_subnet( {'subnets': subnet_param}) existing_neutron_port = self.neutron_client.create_port({ 'port': { 'network_id': neutron_network['network']['id'], 'fixed_ips': [{ 'ip_address': ipv4_address }] } }) fake_ipam = { "Driver": "kuryr", "Options": { 'neutron.subnet.name': neutron_subnet_name }, "Config": [{ "Subnet": "10.15.0.0/24", "Gateway": "10.15.0.1" }] } # Create docker network using existing Neutron network options = { 'neutron.net.name': neutron_net_name, 'neutron.subnet.name': neutron_subnet_name } container_net_name = lib_utils.get_random_string(8) container_net = self.docker_client.create_network( name=container_net_name, driver='kuryr', options=options, ipam=fake_ipam) container_net_id = container_net.get('Id') # pre-created the second Neutron network and subnet and port neutron_net_name2 = lib_utils.get_random_string(8) neutron_network2 = self.neutron_client.create_network( {'network': { 'name': neutron_net_name2, "admin_state_up": True }}) neutron_subnet_name2 = lib_utils.get_random_string(8) subnet_param2 = [{ 'name': neutron_subnet_name2, 'network_id': neutron_network2['network']['id'], 'ip_version': 4, 'cidr': "10.15.0.0/24", }] neutron_subnet2 = self.neutron_client.create_subnet( {'subnets': subnet_param2}) existing_neutron_port2 = self.neutron_client.create_port({ 'port': { 'network_id': neutron_network2['network']['id'], 'fixed_ips': [{ 'ip_address': ipv4_address }] } }) fake_ipam2 = { "Driver": "kuryr", "Options": { 'neutron.subnet.name': neutron_subnet_name2 }, "Config": [{ "Subnet": "10.15.0.0/24", "Gateway": "10.15.0.1" }] } # Create docker network using existing Neutron network options = { 'neutron.net.name': neutron_net_name2, 'neutron.subnet.name': neutron_subnet_name2 } container_net_name2 = lib_utils.get_random_string(8) container_net2 = self.docker_client.create_network( name=container_net_name2, driver='kuryr', options=options, ipam=fake_ipam2) container_net_id2 = container_net2.get('Id') # Boot the first container, and connect to the first docker network. endpoint_config = self.docker_client.create_endpoint_config( ipv4_address=ipv4_address) network_config = self.docker_client.create_networking_config( {container_net_id: endpoint_config}) container_name = lib_utils.get_random_string(8) container = self.docker_client.create_container( image='kuryr/busybox', command='/bin/sleep 600', hostname='kuryr_test_container', name=container_name, networking_config=network_config) container_id = container.get('Id') self.docker_client.start(container=container_id) # Boot the second container, and connect to the second docker network. endpoint_config = self.docker_client.create_endpoint_config( ipv4_address=ipv4_address) network_config = self.docker_client.create_networking_config( {container_net_id2: endpoint_config}) container_name2 = lib_utils.get_random_string(8) container2 = self.docker_client.create_container( image='kuryr/busybox', command='/bin/sleep 600', hostname='kuryr_test_container2', name=container_name2, networking_config=network_config) container_id2 = container2.get('Id') self.docker_client.start(container=container_id2) # Assert both existing neutron ports active for port_id in (existing_neutron_port['port']['id'], existing_neutron_port2['port']['id']): utils.wait_for_port_active(self.neutron_client, port_id, 60) neutron_port = self.neutron_client.show_port(port_id) self.assertEqual('ACTIVE', neutron_port['port']['status']) # Disconnect the first container from network and # assert the first neutron port is down and the second is still active self.docker_client.disconnect_container_from_network( container_id, container_net_id) existing_neutron_port = self.neutron_client.show_port( existing_neutron_port['port']['id']) self.assertEqual('DOWN', existing_neutron_port['port']['status']) existing_neutron_port2 = self.neutron_client.show_port( existing_neutron_port2['port']['id']) self.assertEqual('ACTIVE', existing_neutron_port2['port']['status']) # Disconnect the second container from network and # assert both neutron ports are down. self.docker_client.disconnect_container_from_network( container_id2, container_net_id2) for port_id in (existing_neutron_port['port']['id'], existing_neutron_port2['port']['id']): neutron_port = self.neutron_client.show_port(port_id) self.assertEqual('DOWN', neutron_port['port']['status']) # Cleanup resources self.docker_client.stop(container=container_id) self.docker_client.stop(container=container_id2) self.docker_client.remove_network(container_net_id) self.docker_client.remove_network(container_net_id2) self.neutron_client.delete_port(existing_neutron_port['port']['id']) self.neutron_client.delete_port(existing_neutron_port2['port']['id']) self.neutron_client.delete_subnet(neutron_subnet['subnets'][0]['id']) self.neutron_client.delete_subnet(neutron_subnet2['subnets'][0]['id']) self.neutron_client.delete_network(neutron_network['network']['id']) self.neutron_client.delete_network(neutron_network2['network']['id'])
def test_container_ipam_request_address_with_existing_port(self): # pre-created Neutron network and subnet and port neutron_net_name = lib_utils.get_random_string(8) neutron_network = self.neutron_client.create_network( {'network': { 'name': neutron_net_name, "admin_state_up": True }}) neutron_subnet_name = lib_utils.get_random_string(8) subnet_param = [{ 'name': neutron_subnet_name, 'network_id': neutron_network['network']['id'], 'ip_version': 4, 'cidr': "10.14.0.0/24", }] neutron_subnet = self.neutron_client.create_subnet( {'subnets': subnet_param}) neutron_v6_subnet_name = lib_utils.get_random_string(8) v6_subnet_param = [{ 'name': neutron_v6_subnet_name, 'network_id': neutron_network['network']['id'], 'ip_version': 6, 'cidr': "fe81::/64", }] neutron_v6_subnet = self.neutron_client.create_subnet( {'subnets': v6_subnet_param}) existing_neutron_port = self.neutron_client.create_port( {'port': { 'network_id': neutron_network['network']['id'] }}) fixed_ips = { fip['subnet_id']: fip['ip_address'] for fip in existing_neutron_port['port']['fixed_ips'] } ipv4_address = fixed_ips[neutron_subnet['subnets'][0]['id']] ipv6_address = fixed_ips[neutron_v6_subnet['subnets'][0]['id']] fake_ipam = { "Driver": "kuryr", "Options": {}, "Config": [ { "Subnet": "10.14.0.0/24", "Gateway": "10.14.0.1" }, { "Subnet": "fe81::/64", "Gateway": "fe81::1" }, ] } # Create docker network using existing Neutron network options = {'neutron.net.name': neutron_net_name} container_net_name = lib_utils.get_random_string(8) container_net = self.docker_client.create_network( name=container_net_name, driver='kuryr', enable_ipv6=True, options=options, ipam=fake_ipam) container_net_id = container_net.get('Id') try: networks = self.neutron_client.list_networks( tags=utils.make_net_tags(container_net_id)) except Exception as e: self.docker_client.remove_network(container_net_id) message = ("Failed to list neutron networks: %s") self.fail(message % e.args[0]) self.assertEqual(1, len(networks['networks'])) # Boot a container, and connect to the docker network. container_name = lib_utils.get_random_string(8) container = self.docker_client.create_container( image='kuryr/busybox', command='/bin/sleep 600', hostname='kuryr_test_container', name=container_name) warn_msg = container.get('Warning') container_id = container.get('Id') self.assertIsNone(warn_msg, 'Warn in creating container') self.assertIsNotNone(container_id, 'Create container id must not ' 'be None') self.docker_client.start(container=container_id) self.docker_client.connect_container_to_network( container_id, container_net_id, ipv4_address=ipv4_address, ipv6_address=ipv6_address) try: ports = self.neutron_client.list_ports( network_id=neutron_network['network']['id']) except Exception as e: self.docker_client.disconnect_container_from_network( container_id, container_net_id) message = ("Failed to list neutron ports: %s") self.fail(message % e.args[0]) # A dhcp port gets created as well; dhcp is enabled by default self.assertEqual(2, len(ports['ports'])) # Find the existing neutron port neutron_port_param = {"network_id": neutron_network['network']['id']} neutron_ports = self.neutron_client.list_ports(**neutron_port_param) neutron_port = [ port for port in neutron_ports['ports'] if (const.KURYR_EXISTING_NEUTRON_PORT in port['tags'] or port['name'] == utils.get_neutron_port_name(port['device_id'])) ] self.assertEqual(1, len(neutron_port)) # Disconnect container from network. self.docker_client.disconnect_container_from_network( container_id, container_net_id) ports = self.neutron_client.list_ports( network_id=neutron_network['network']['id']) self.assertEqual(2, len(ports['ports'])) neutron_ports = self.neutron_client.list_ports(**neutron_port_param) neutron_port = [ port for port in neutron_ports['ports'] if (const.KURYR_EXISTING_NEUTRON_PORT in port['tags'] or port['name'] == utils.get_neutron_port_name(port['device_id'])) ] self.assertEqual(0, len(neutron_port)) # Cleanup resources self.docker_client.stop(container=container_id) self.docker_client.remove_network(container_net_id) self.neutron_client.delete_port(existing_neutron_port['port']['id']) self.neutron_client.delete_subnet(neutron_subnet['subnets'][0]['id']) self.neutron_client.delete_subnet( neutron_v6_subnet['subnets'][0]['id']) self.neutron_client.delete_network(neutron_network['network']['id'])
def test_container_ipam_release_address_with_existing_network(self): # pre-created Neutron network and subnet neutron_net_name = lib_utils.get_random_string(8) neutron_network = self.neutron_client.create_network( {'network': { 'name': neutron_net_name, "admin_state_up": True }}) neutron_subnet_name = lib_utils.get_random_string(8) subnet_param = [{ 'name': neutron_subnet_name, 'network_id': neutron_network['network']['id'], 'ip_version': 4, 'cidr': "10.10.0.0/24", 'enable_dhcp': True, }] self.neutron_client.create_subnet({'subnets': subnet_param}) fake_ipam = { "Driver": "kuryr", "Options": {}, "Config": [{ "Subnet": "10.10.0.0/16", "IPRange": "10.10.0.0/24", "Gateway": "10.10.0.1" }] } # Create docker network using existing Neutron network options = {'neutron.net.name': neutron_net_name} container_net_name = lib_utils.get_random_string(8) container_net = self.docker_client.create_network( name=container_net_name, driver='kuryr', options=options, ipam=fake_ipam) container_net_id = container_net.get('Id') try: networks = self.neutron_client.list_networks( tags=utils.make_net_tags(container_net_id)) except Exception as e: self.docker_client.remove_network(container_net_id) message = ("Failed to list neutron networks: %s") self.fail(message % e.args[0]) self.assertEqual(1, len(networks['networks'])) # Boot a container, and connect to the docker network. container_name = lib_utils.get_random_string(8) container = self.docker_client.create_container( image='kuryr/busybox', command='/bin/sleep 600', hostname='kuryr_test_container', name=container_name) warn_msg = container.get('Warning') container_id = container.get('Id') self.assertIsNone(warn_msg, 'Warn in creating container') self.assertIsNotNone(container_id, 'Create container id must not ' 'be None') self.docker_client.start(container=container_id) self.docker_client.connect_container_to_network( container_id, container_net_id) try: ports = self.neutron_client.list_ports( network_id=neutron_network['network']['id']) except Exception as e: self.docker_client.disconnect_container_from_network( container_id, container_net_id) message = ("Failed to list neutron ports: %s") self.fail(message % e.args[0]) # A dhcp port gets created as well; dhcp is enabled by default self.assertEqual(2, len(ports['ports'])) # Find the kuryr port kuryr_port_param = {"network_id": neutron_network['network']['id']} kuryr_ports = self.neutron_client.list_ports(**kuryr_port_param) kuryr_port = [ port for port in kuryr_ports['ports'] if (lib_const.DEVICE_OWNER in port['tags'] or port['name'] == utils.get_neutron_port_name(port['device_id'])) ] self.assertEqual(1, len(kuryr_port)) # Disconnect container from network, this release ip address. self.docker_client.disconnect_container_from_network( container_id, container_net_id) ports = self.neutron_client.list_ports( network_id=neutron_network['network']['id']) self.assertEqual(1, len(ports['ports'])) kuryr_ports = self.neutron_client.list_ports(**kuryr_port_param) kuryr_port = [ port for port in kuryr_ports['ports'] if (lib_const.DEVICE_OWNER in port['tags'] or port['name'] == utils.get_neutron_port_name(port['device_id'])) ] self.assertEqual(0, len(kuryr_port)) # Cleanup resources self.docker_client.stop(container=container_id) self.docker_client.remove_network(container_net_id) self.neutron_client.delete_network(neutron_network['network']['id'])
def test_container_ipam_request_release_pool(self): fake_ipam = { "Driver": "kuryr", "Options": {}, "Config": [{ "Subnet": "10.11.0.0/16", "IPRange": "10.11.0.0/24", "Gateway": "10.11.0.1" }] } container_net_name = lib_utils.get_random_string(8) container_net = self.docker_client.create_network( name=container_net_name, driver='kuryr', ipam=fake_ipam) container_net_id = container_net.get('Id') try: networks = self.neutron_client.list_networks( tags=utils.make_net_tags(container_net_id)) except Exception as e: self.docker_client.remove_network(container_net_id) message = ("Failed to list neutron networks: %s") self.fail(message % e.args[0]) # Currently we cannot get IPAM pool from docker client. pool_name = "kuryrPool-" + "10.11.0.0/24" subnetpools = self.neutron_client.list_subnetpools(name=pool_name) self.assertEqual(1, len(subnetpools['subnetpools'])) # Boot a container, and connect to the docker network. container_name = lib_utils.get_random_string(8) container = self.docker_client.create_container( image='kuryr/busybox', command='/bin/sleep 600', hostname='kuryr_test_container', name=container_name) warn_msg = container.get('Warning') container_id = container.get('Id') self.assertIsNone(warn_msg, 'Warn in creating container') self.assertIsNotNone(container_id, 'Create container id must not ' 'be None') self.docker_client.start(container=container_id) self.docker_client.connect_container_to_network( container_id, container_net_id) try: self.neutron_client.list_ports( network_id=networks['networks'][0]['id']) except Exception as e: self.docker_client.disconnect_container_from_network( container_id, container_net_id) message = ("Failed to list neutron ports: %s") self.fail(message % e.args[0]) # Disconnect container from network, this release ip address. self.docker_client.disconnect_container_from_network( container_id, container_net_id) # Delete docker network, if no endpoint, will release the pool # and delete the subnetpool in Neutron. self.docker_client.stop(container=container_id) self.docker_client.remove_network(container_net_id) subnetpools = self.neutron_client.list_subnetpools(name=pool_name) self.assertEqual(0, len(subnetpools['subnetpools']))
def test_create_delete_dualstack_network_with_kuryr_driver(self): """Create and Delete docker dual-stack network with Kuryr This method creates a docker network with Kuryr driver and tests it was created in Neutron. It then deletes the docker network and tests that it was deleted from Neutron. """ fake_ipam = { "Driver": "kuryr", "Options": {}, "Config": [ { "Subnet": "10.4.0.0/16", "IPRange": "10.4.0.0/24", "Gateway": "10.4.0.1" }, { "Subnet": "2001:db8:a0b:12f0::/64", "IPRange": "2001:db8:a0b:12f0::/64", "Gateway": "2001:db8:a0b:12f0::1" } ] } net_name = lib_utils.get_random_string(8) res = self.docker_client.create_network(name=net_name, driver='kuryr', enable_ipv6=True, ipam=fake_ipam) net_id = res['Id'] try: network = self.neutron_client.list_networks( tags=utils.make_net_tags(net_id)) except Exception as e: self.docker_client.remove_network(net_id) message = ("Failed to list neutron networks: %s") self.fail(message % e.args[0]) self.assertEqual(1, len(network['networks'])) neutron_netid = network['networks'][0]['id'] subnets = self.neutron_client.list_subnets( network_id=neutron_netid) self.assertEqual(2, len(subnets['subnets'])) subnet_version = [] subnet_name = [] for subnet in subnets['subnets']: subnet_version.append(subnet['ip_version']) subnet_name.append(subnet['name']) self.assertIn(4, subnet_version) self.assertIn(6, subnet_version) self.assertIn( constants.SUBNET_NAME_PREFIX + '10.4.0.0/24', subnet_name) self.assertIn( constants.SUBNET_NAME_PREFIX + '2001:db8:a0b:12f0::/64', subnet_name) self.docker_client.remove_network(net_id) network = self.neutron_client.list_networks( tags=utils.make_net_tags(net_id)) self.assertEqual(0, len(network['networks'])) subnets = self.neutron_client.list_subnets( network_id=neutron_netid) self.assertEqual(0, len(subnets['subnets']))
def test_container_ipam_request_release_pool(self): fake_ipam = { "Driver": "kuryr", "Options": {}, "Config": [ { "Subnet": "10.11.0.0/16", "IPRange": "10.11.0.0/24", "Gateway": "10.11.0.1" } ] } container_net_name = lib_utils.get_random_string(8) container_net = self.docker_client.create_network( name=container_net_name, driver='kuryr', ipam=fake_ipam) container_net_id = container_net.get('Id') try: networks = self.neutron_client.list_networks( tags=utils.make_net_tags(container_net_id)) except Exception as e: self.docker_client.remove_network(container_net_id) message = ("Failed to list neutron networks: %s") self.fail(message % e.args[0]) # Currently we cannot get IPAM pool from docker client. pool_name = "kuryrPool-" + "10.11.0.0/24" subnetpools = self.neutron_client.list_subnetpools(name=pool_name) self.assertEqual(1, len(subnetpools['subnetpools'])) # Boot a container, and connect to the docker network. container_name = lib_utils.get_random_string(8) container = self.docker_client.create_container( image='kuryr/busybox', command='/bin/sleep 600', hostname='kuryr_test_container', name=container_name) warn_msg = container.get('Warning') container_id = container.get('Id') self.assertIsNone(warn_msg, 'Warn in creating container') self.assertIsNotNone(container_id, 'Create container id must not ' 'be None') self.docker_client.start(container=container_id) self.docker_client.connect_container_to_network(container_id, container_net_id) try: self.neutron_client.list_ports( network_id=networks['networks'][0]['id']) except Exception as e: self.docker_client.disconnect_container_from_network( container_id, container_net_id) message = ("Failed to list neutron ports: %s") self.fail(message % e.args[0]) # Disconnect container from network, this release ip address. self.docker_client.disconnect_container_from_network(container_id, container_net_id) # Delete docker network, if no endpoint, will release the pool # and delete the subnetpool in Neutron. self.docker_client.stop(container=container_id) self.docker_client.remove_network(container_net_id) subnetpools = self.neutron_client.list_subnetpools(name=pool_name) self.assertEqual(0, len(subnetpools['subnetpools']))
def test_container_ipam_release_address_with_existing_network(self): # pre-created Neutron network and subnet neutron_net_name = lib_utils.get_random_string(8) neutron_network = self.neutron_client.create_network( {'network': {'name': neutron_net_name, "admin_state_up": True}}) neutron_subnet_name = lib_utils.get_random_string(8) subnet_param = [{ 'name': neutron_subnet_name, 'network_id': neutron_network['network']['id'], 'ip_version': 4, 'cidr': "10.10.0.0/24", 'enable_dhcp': True, }] self.neutron_client.create_subnet({'subnets': subnet_param}) fake_ipam = { "Driver": "kuryr", "Options": {}, "Config": [ { "Subnet": "10.10.0.0/16", "IPRange": "10.10.0.0/24", "Gateway": "10.10.0.1" } ] } # Create docker network using existing Neutron network options = {'neutron.net.name': neutron_net_name} container_net_name = lib_utils.get_random_string(8) container_net = self.docker_client.create_network( name=container_net_name, driver='kuryr', options=options, ipam=fake_ipam) container_net_id = container_net.get('Id') try: networks = self.neutron_client.list_networks( tags=utils.make_net_tags(container_net_id)) except Exception as e: self.docker_client.remove_network(container_net_id) message = ("Failed to list neutron networks: %s") self.fail(message % e.args[0]) self.assertEqual(1, len(networks['networks'])) # Boot a container, and connect to the docker network. container_name = lib_utils.get_random_string(8) container = self.docker_client.create_container( image='kuryr/busybox', command='/bin/sleep 600', hostname='kuryr_test_container', name=container_name) warn_msg = container.get('Warning') container_id = container.get('Id') self.assertIsNone(warn_msg, 'Warn in creating container') self.assertIsNotNone(container_id, 'Create container id must not ' 'be None') self.docker_client.start(container=container_id) self.docker_client.connect_container_to_network(container_id, container_net_id) try: ports = self.neutron_client.list_ports( network_id=neutron_network['network']['id']) except Exception as e: self.docker_client.disconnect_container_from_network( container_id, container_net_id) message = ("Failed to list neutron ports: %s") self.fail(message % e.args[0]) # A dhcp port gets created as well; dhcp is enabled by default self.assertEqual(2, len(ports['ports'])) # Find the kuryr port kuryr_port_param = {"network_id": neutron_network['network']['id']} kuryr_ports = self.neutron_client.list_ports( **kuryr_port_param) kuryr_port = [port for port in kuryr_ports['ports'] if (lib_const.DEVICE_OWNER in port['tags'] or port['name'] == utils.get_neutron_port_name(port['device_id']))] self.assertEqual(1, len(kuryr_port)) # Disconnect container from network, this release ip address. self.docker_client.disconnect_container_from_network(container_id, container_net_id) ports = self.neutron_client.list_ports( network_id=neutron_network['network']['id']) self.assertEqual(1, len(ports['ports'])) kuryr_ports = self.neutron_client.list_ports( **kuryr_port_param) kuryr_port = [port for port in kuryr_ports['ports'] if (lib_const.DEVICE_OWNER in port['tags'] or port['name'] == utils.get_neutron_port_name(port['device_id']))] self.assertEqual(0, len(kuryr_port)) # Cleanup resources self.docker_client.stop(container=container_id) self.docker_client.remove_network(container_net_id) self.neutron_client.delete_network(neutron_network['network']['id'])
def test_container_ipam_request_address_with_existing_port(self): # pre-created Neutron network and subnet and port neutron_net_name = lib_utils.get_random_string(8) neutron_network = self.neutron_client.create_network( {'network': {'name': neutron_net_name, "admin_state_up": True}}) neutron_subnet_name = lib_utils.get_random_string(8) subnet_param = [{ 'name': neutron_subnet_name, 'network_id': neutron_network['network']['id'], 'ip_version': 4, 'cidr': "10.14.0.0/24", }] neutron_subnet = self.neutron_client.create_subnet( {'subnets': subnet_param}) neutron_v6_subnet_name = lib_utils.get_random_string(8) v6_subnet_param = [{ 'name': neutron_v6_subnet_name, 'network_id': neutron_network['network']['id'], 'ip_version': 6, 'cidr': "fe81::/64", }] neutron_v6_subnet = self.neutron_client.create_subnet( {'subnets': v6_subnet_param}) existing_neutron_port = self.neutron_client.create_port( {'port': {'network_id': neutron_network['network']['id']}}) fixed_ips = {fip['subnet_id']: fip['ip_address'] for fip in existing_neutron_port['port']['fixed_ips']} ipv4_address = fixed_ips[neutron_subnet['subnets'][0]['id']] ipv6_address = fixed_ips[neutron_v6_subnet['subnets'][0]['id']] fake_ipam = { "Driver": "kuryr", "Options": {}, "Config": [ { "Subnet": "10.14.0.0/24", "Gateway": "10.14.0.1" }, { "Subnet": "fe81::/64", "Gateway": "fe81::1" }, ] } # Create docker network using existing Neutron network options = {'neutron.net.name': neutron_net_name} container_net_name = lib_utils.get_random_string(8) container_net = self.docker_client.create_network( name=container_net_name, driver='kuryr', enable_ipv6=True, options=options, ipam=fake_ipam) container_net_id = container_net.get('Id') try: networks = self.neutron_client.list_networks( tags=utils.make_net_tags(container_net_id)) except Exception as e: self.docker_client.remove_network(container_net_id) message = ("Failed to list neutron networks: %s") self.fail(message % e.args[0]) self.assertEqual(1, len(networks['networks'])) # Boot a container, and connect to the docker network. container_name = lib_utils.get_random_string(8) container = self.docker_client.create_container( image='kuryr/busybox', command='/bin/sleep 600', hostname='kuryr_test_container', name=container_name) warn_msg = container.get('Warning') container_id = container.get('Id') self.assertIsNone(warn_msg, 'Warn in creating container') self.assertIsNotNone(container_id, 'Create container id must not ' 'be None') self.docker_client.start(container=container_id) self.docker_client.connect_container_to_network( container_id, container_net_id, ipv4_address=ipv4_address, ipv6_address=ipv6_address) try: ports = self.neutron_client.list_ports( network_id=neutron_network['network']['id']) except Exception as e: self.docker_client.disconnect_container_from_network( container_id, container_net_id) message = ("Failed to list neutron ports: %s") self.fail(message % e.args[0]) # A dhcp port gets created as well; dhcp is enabled by default self.assertEqual(2, len(ports['ports'])) # Find the existing neutron port neutron_port_param = {"network_id": neutron_network['network']['id']} neutron_ports = self.neutron_client.list_ports( **neutron_port_param) neutron_port = [port for port in neutron_ports['ports'] if (const.KURYR_EXISTING_NEUTRON_PORT in port['tags'] or port['name'] == utils.get_neutron_port_name(port['device_id']))] self.assertEqual(1, len(neutron_port)) # Disconnect container from network. self.docker_client.disconnect_container_from_network(container_id, container_net_id) ports = self.neutron_client.list_ports( network_id=neutron_network['network']['id']) self.assertEqual(2, len(ports['ports'])) neutron_ports = self.neutron_client.list_ports( **neutron_port_param) neutron_port = [port for port in neutron_ports['ports'] if (const.KURYR_EXISTING_NEUTRON_PORT in port['tags'] or port['name'] == utils.get_neutron_port_name(port['device_id']))] self.assertEqual(0, len(neutron_port)) # Cleanup resources self.docker_client.stop(container=container_id) self.docker_client.remove_network(container_net_id) self.neutron_client.delete_port(existing_neutron_port['port']['id']) self.neutron_client.delete_subnet(neutron_subnet['subnets'][0]['id']) self.neutron_client.delete_subnet( neutron_v6_subnet['subnets'][0]['id']) self.neutron_client.delete_network(neutron_network['network']['id'])
def test_container_ipam_release_address_with_existing_port_same_ip(self): ipv4_address = "10.15.0.10" # pre-created the first Neutron network and subnet and port neutron_net_name = lib_utils.get_random_string(8) neutron_network = self.neutron_client.create_network( {'network': {'name': neutron_net_name, "admin_state_up": True}}) neutron_subnet_name = lib_utils.get_random_string(8) subnet_param = [{ 'name': neutron_subnet_name, 'network_id': neutron_network['network']['id'], 'ip_version': 4, 'cidr': "10.15.0.0/24", }] neutron_subnet = self.neutron_client.create_subnet( {'subnets': subnet_param}) existing_neutron_port = self.neutron_client.create_port( {'port': {'network_id': neutron_network['network']['id'], 'fixed_ips': [{'ip_address': ipv4_address}]}}) fake_ipam = { "Driver": "kuryr", "Options": { 'neutron.subnet.name': neutron_subnet_name }, "Config": [ { "Subnet": "10.15.0.0/24", "Gateway": "10.15.0.1" } ] } # Create docker network using existing Neutron network options = {'neutron.net.name': neutron_net_name, 'neutron.subnet.name': neutron_subnet_name} container_net_name = lib_utils.get_random_string(8) container_net = self.docker_client.create_network( name=container_net_name, driver='kuryr', options=options, ipam=fake_ipam) container_net_id = container_net.get('Id') # pre-created the second Neutron network and subnet and port neutron_net_name2 = lib_utils.get_random_string(8) neutron_network2 = self.neutron_client.create_network( {'network': {'name': neutron_net_name2, "admin_state_up": True}}) neutron_subnet_name2 = lib_utils.get_random_string(8) subnet_param2 = [{ 'name': neutron_subnet_name2, 'network_id': neutron_network2['network']['id'], 'ip_version': 4, 'cidr': "10.15.0.0/24", }] neutron_subnet2 = self.neutron_client.create_subnet( {'subnets': subnet_param2}) existing_neutron_port2 = self.neutron_client.create_port( {'port': {'network_id': neutron_network2['network']['id'], 'fixed_ips': [{'ip_address': ipv4_address}]}}) fake_ipam2 = { "Driver": "kuryr", "Options": { 'neutron.subnet.name': neutron_subnet_name2 }, "Config": [ { "Subnet": "10.15.0.0/24", "Gateway": "10.15.0.1" } ] } # Create docker network using existing Neutron network options = {'neutron.net.name': neutron_net_name2, 'neutron.subnet.name': neutron_subnet_name2} container_net_name2 = lib_utils.get_random_string(8) container_net2 = self.docker_client.create_network( name=container_net_name2, driver='kuryr', options=options, ipam=fake_ipam2) container_net_id2 = container_net2.get('Id') # Boot the first container, and connect to the first docker network. endpoint_config = self.docker_client.create_endpoint_config( ipv4_address=ipv4_address) network_config = self.docker_client.create_networking_config({ container_net_id: endpoint_config}) container_name = lib_utils.get_random_string(8) container = self.docker_client.create_container( image='kuryr/busybox', command='/bin/sleep 600', hostname='kuryr_test_container', name=container_name, networking_config=network_config) container_id = container.get('Id') self.docker_client.start(container=container_id) # Boot the second container, and connect to the second docker network. endpoint_config = self.docker_client.create_endpoint_config( ipv4_address=ipv4_address) network_config = self.docker_client.create_networking_config({ container_net_id2: endpoint_config}) container_name2 = lib_utils.get_random_string(8) container2 = self.docker_client.create_container( image='kuryr/busybox', command='/bin/sleep 600', hostname='kuryr_test_container2', name=container_name2, networking_config=network_config) container_id2 = container2.get('Id') self.docker_client.start(container=container_id2) # Assert both existing neutron ports active for port_id in (existing_neutron_port['port']['id'], existing_neutron_port2['port']['id']): utils.wait_for_port_active( self.neutron_client, port_id, 60) neutron_port = self.neutron_client.show_port(port_id) self.assertEqual('ACTIVE', neutron_port['port']['status']) # Disconnect the first container from network and # assert the first neutron port is down and the second is still active self.docker_client.disconnect_container_from_network(container_id, container_net_id) existing_neutron_port = self.neutron_client.show_port( existing_neutron_port['port']['id']) self.assertEqual('DOWN', existing_neutron_port['port']['status']) existing_neutron_port2 = self.neutron_client.show_port( existing_neutron_port2['port']['id']) self.assertEqual('ACTIVE', existing_neutron_port2['port']['status']) # Disconnect the second container from network and # assert both neutron ports are down. self.docker_client.disconnect_container_from_network(container_id2, container_net_id2) for port_id in (existing_neutron_port['port']['id'], existing_neutron_port2['port']['id']): neutron_port = self.neutron_client.show_port(port_id) self.assertEqual('DOWN', neutron_port['port']['status']) # Cleanup resources self.docker_client.stop(container=container_id) self.docker_client.stop(container=container_id2) self.docker_client.remove_network(container_net_id) self.docker_client.remove_network(container_net_id2) self.neutron_client.delete_port(existing_neutron_port['port']['id']) self.neutron_client.delete_port(existing_neutron_port2['port']['id']) self.neutron_client.delete_subnet(neutron_subnet['subnets'][0]['id']) self.neutron_client.delete_subnet(neutron_subnet2['subnets'][0]['id']) self.neutron_client.delete_network(neutron_network['network']['id']) self.neutron_client.delete_network(neutron_network2['network']['id'])
def test_container_ipam_request_address(self): fake_ipam = { "Driver": "kuryr", "Options": {}, "Config": [ { "Subnet": "10.12.0.0/16", "IPRange": "10.12.0.0/24", "Gateway": "10.12.0.1" } ] } container_net_name = lib_utils.get_random_string(8) container_net = self.docker_client.create_network( name=container_net_name, driver='kuryr', ipam=fake_ipam) container_net_id = container_net.get('Id') try: networks = self.neutron_client.list_networks( tags=utils.make_net_tags(container_net_id)) except Exception as e: self.docker_client.remove_network(container_net_id) message = ("Failed to list neutron networks: %s") self.fail(message % e.args[0]) # Currently we cannot get IPAM pool from docker client. pool_name = "kuryrPool-" + "10.12.0.0/24" subnetpools = self.neutron_client.list_subnetpools(name=pool_name) self.assertEqual(1, len(subnetpools['subnetpools'])) subnets = self.neutron_client.list_subnets( network_id=networks['networks'][0]['id'], cidr="10.12.0.0/24") self.assertEqual(1, len(subnets['subnets'])) # Boot a container, and connect to the docker network. container_name = lib_utils.get_random_string(8) container = self.docker_client.create_container( image='kuryr/busybox', command='/bin/sleep 600', hostname='kuryr_test_container', name=container_name) warn_msg = container.get('Warning') container_id = container.get('Id') self.assertIsNone(warn_msg, 'Warn in creating container') self.assertIsNotNone(container_id, 'Create container id must not ' 'be None') self.docker_client.start(container=container_id) self.docker_client.connect_container_to_network(container_id, container_net_id) try: ports = self.neutron_client.list_ports( network_id=networks['networks'][0]['id']) except Exception as e: self.docker_client.disconnect_container_from_network( container_id, container_net_id) message = ("Failed to list neutron ports: %s") self.fail(message % e.args[0]) # DHCP port and container endpoint self.assertEqual(2, len(ports['ports'])) # Find the kuryr port kuryr_port_param = {"network_id": networks['networks'][0]['id']} kuryr_ports = self.neutron_client.list_ports( **kuryr_port_param) kuryr_port = [port for port in kuryr_ports['ports'] if (lib_const.DEVICE_OWNER in port['tags'] or port['name'] == utils.get_neutron_port_name(port['device_id']))] self.assertEqual(1, len(kuryr_port)) # Disconnect container from network, this release ip address. self.docker_client.disconnect_container_from_network(container_id, container_net_id) # Cleanup resources self.docker_client.stop(container=container_id) self.docker_client.remove_network(container_net_id)