def _parse_network_data_services(services_data): services = [] dns_nameservers = BaseOpenStackService._parse_dns_data(services_data) if len(dns_nameservers): service = network_model.NameServerService( addresses=dns_nameservers, search=None) services.append(service) return services
def _parse_nameserver_config_item(self, item): return network_model.NetworkDetailsV2( links=[], networks=[], services=[ network_model.NameServerService(addresses=item.get( 'address', []), search=item.get('search')) ])
def _get_network_details_v2(self): links = [] link1 = network_model.Link(id=mock.sentinel.link_id1, name=mock.sentinel.link_name1, type=network_model.LINK_TYPE_PHYSICAL, enabled=mock.sentinel.link_enabled1, mac_address=mock.sentinel.link_mac1, mtu=mock.sentinel.link_mtu1, bond=None, vlan_link=None, vlan_id=None) links.append(link1) bond1 = network_model.Bond(members=[mock.sentinel.link_id1], type=mock.sentinel.bond_type1, lb_algorithm=mock.sentinel.bond_lb_algo1, lacp_rate=mock.sentinel.lacp_rate1) bond_link1 = network_model.Link( id=mock.sentinel.bond_link_id1, name=mock.sentinel.bond_link_name1, type=network_model.LINK_TYPE_BOND, enabled=mock.sentinel.bond_link_enabled1, mac_address=mock.sentinel.bond_link_mac1, mtu=mock.sentinel.bond_link_mtu1, bond=bond1, vlan_link=None, vlan_id=None) links.append(bond_link1) vlan_link1 = network_model.Link( id=mock.sentinel.vlan_link_id1, name=mock.sentinel.vlan_link_name1, type=network_model.LINK_TYPE_VLAN, enabled=mock.sentinel.vlan_link_enabled1, mac_address=mock.sentinel.vlan_link_mac1, mtu=mock.sentinel.vlan_link_mtu1, bond=None, vlan_link=mock.sentinel.bond_link_id1, vlan_id=mock.sentinel.vlan_id1) links.append(vlan_link1) networks = [] route1 = network_model.Route(network_cidr=mock.sentinel.network_cidr1, gateway=mock.sentinel.gateway1) route2 = network_model.Route(network_cidr=mock.sentinel.network_cidr2, gateway=mock.sentinel.gateway2) network1 = network_model.Network( link=mock.sentinel.link_id1, address_cidr=mock.sentinel.address_cidr1, dns_nameservers=mock.sentinel.network_dns_list1, routes=[route1, route2]) networks.append(network1) services = [] service1 = network_model.NameServerService( addresses=[mock.sentinel.dns1, mock.sentinel.dns3], search=mock.sentinel.dns_search1) services.append(service1) return network_model.NetworkDetailsV2(links=links, networks=networks, services=services)
def _test_get_network_details_v2(self, mock_get_network_data, unsupported_version=False, invalid_bond_type=False, invalid_bond_lb_algo=False, unsupported_config_type=False): mock.sentinel.bond_subnet_address1 = "10.0.0.1/24" mock.sentinel.bond_subnet_gateway1 = "10.0.0.254" mock.sentinel.bond_subnet_address2 = "172.16.0.1/16" mock.sentinel.vlan_subnet_address1 = "2001:cdba::3257:9652/24" mock.sentinel.vlan_subnet_gateway1 = "2001:cdba::3257:1" if invalid_bond_type: mock.sentinel.bond_mode1 = "invalid bond type" else: mock.sentinel.bond_mode1 = network_model.BOND_TYPE_BALANCE_ALB if invalid_bond_lb_algo: mock.sentinel.bond_lb_algo1 = "invalid lb algorithm" else: mock.sentinel.bond_lb_algo1 = network_model.BOND_LB_ALGO_L2 if unsupported_version: mock.sentinel.network_data_version = "unsupported" else: mock.sentinel.network_data_version = 1 if unsupported_config_type: mock.sentinel.nameserver_config_type = "unsupported" else: mock.sentinel.nameserver_config_type = "nameserver" network_data = self._get_network_data() mock_get_network_data.return_value = network_data if (unsupported_version or invalid_bond_type or invalid_bond_lb_algo or unsupported_config_type): with self.assertRaises(exception.CloudbaseInitException): self._maasservice.get_network_details_v2() return network_details = self._maasservice.get_network_details_v2() self.assertEqual( 1, len([ l for l in network_details.links if l.type == network_model.LINK_TYPE_PHYSICAL and l.id == mock.sentinel.link_id1 and l.name == mock.sentinel.link_name1 and l.enabled is True and l.mac_address == mock.sentinel.link_mac1 and l.mtu == mock.sentinel.link_mtu1 ])) self.assertEqual( 1, len([ l for l in network_details.links if l.type == network_model.LINK_TYPE_PHYSICAL and l.id == mock.sentinel.link_id2 and l.name == mock.sentinel.link_name2 and l.enabled is True and l.mac_address == mock.sentinel.link_mac2 and l.mtu == mock.sentinel.link_mtu2 ])) # Disconnected network adapter, ensure it's not enabled self.assertEqual( 1, len([ l for l in network_details.links if l.type == network_model.LINK_TYPE_PHYSICAL and l.id == mock.sentinel.link_id3 and l.name == mock.sentinel.link_name3 and l.enabled is False and l.mac_address == mock.sentinel.link_mac3 and l.mtu == mock.sentinel.link_mtu3 ])) self.assertEqual( 1, len([ l for l in network_details.links if l.type == network_model.LINK_TYPE_BOND and l.id == mock.sentinel.bond_id1 and l.enabled is True and l.name == mock.sentinel.bond_name1 and l.mtu == mock. sentinel.bond_mtu1 and l.mac_address == mock.sentinel.bond_mac1 and l.vlan_link is None and l.vlan_id is None and l.bond.type == network_model.BOND_TYPE_BALANCE_ALB and l.bond.members == [mock.sentinel.link_id1, mock.sentinel.link_id2] and l.bond.lb_algorithm == network_model.BOND_LB_ALGO_L2 and l.bond.lacp_rate == network_model.BOND_LACP_RATE_FAST ])) self.assertEqual( 1, len([ l for l in network_details.links if l.type == network_model.LINK_TYPE_VLAN and l.id == mock. sentinel.vlan_link_id1 and l.name == mock.sentinel.vlan_name1 and l.enabled is True and l.mac_address is None and l.mtu == mock.sentinel.vlan_mtu1 and l.vlan_link == mock.sentinel.bond_id1 and l.vlan_id == mock.sentinel.vlan_id1 ])) self.assertEqual(3, len(network_details.networks)) network_bond1 = [ n for n in network_details.networks if n.address_cidr == mock.sentinel.bond_subnet_address1 and n.dns_nameservers == [mock.sentinel.bond_subnet_dns1, mock.sentinel.bond_subnet_dns2] and n.link == mock.sentinel.bond_id1 and n.routes == [ network_model.Route(network_cidr=u'0.0.0.0/0', gateway=mock.sentinel.bond_subnet_gateway1) ] ] self.assertEqual(1, len(network_bond1)) network_bond2 = [ n for n in network_details.networks if n.address_cidr == mock.sentinel.bond_subnet_address2 and n.dns_nameservers == [] and n.link == mock.sentinel.bond_id1 and n.routes == [] ] self.assertEqual(1, len(network_bond2)) network_vlan1 = [ n for n in network_details.networks if n.address_cidr == mock.sentinel.vlan_subnet_address1 and n.dns_nameservers == [] and n.link == mock.sentinel.vlan_link_id1 and n.routes == [ network_model.Route(network_cidr=u'::/0', gateway=mock.sentinel.vlan_subnet_gateway1) ] ] self.assertEqual(1, len(network_vlan1)) self.assertEqual([ network_model.NameServerService(addresses=[ mock.sentinel.bond_subnet_dns1, mock.sentinel.bond_subnet_dns2 ], search=[mock.sentinel.dns_search1]) ], network_details.services)
def _parse_config_nameserver(config): return network_model.NameServerService(addresses=config.get( "address", []), search=config.get("search", []))
def _test_get_network_details_v2(self, mock_get_network_data, invalid_bond_type=False, invalid_bond_lb_algo=False): mock.sentinel.ip_address1 = "10.0.0.1" mock.sentinel.netmask1 = "255.255.255.0" mock.sentinel.route_network1 = "172.16.0.0" mock.sentinel.route_netmask1 = "255.255.0.0" mock.sentinel.route_gateway1 = "172.16.1.1" mock.sentinel.route_network2 = "0.0.0.0" mock.sentinel.route_netmask2 = "0.0.0.0" mock.sentinel.route_gateway2 = "10.0.0.254" mock.sentinel.ip_address_ipv61 = "2001:cdba::3257:9652/24" mock.sentinel.route_network_ipv61 = "::/0" mock.sentinel.route_gateway_ipv61 = "fd00::1" if invalid_bond_type: mock.sentinel.bond_type1 = "invalid bond type" else: mock.sentinel.bond_type1 = network_model.BOND_TYPE_ACTIVE_BACKUP if invalid_bond_lb_algo: mock.sentinel.bond_lb_algo1 = "invalid lb algorithm" else: mock.sentinel.bond_lb_algo1 = network_model.BOND_LB_ALGO_L2 network_data = self._get_network_data() mock_get_network_data.return_value = network_data if invalid_bond_type or invalid_bond_lb_algo: with self.assertRaises(exception.CloudbaseInitException): self._service.get_network_details_v2() return network_details = self._service.get_network_details_v2() self.assertEqual(len(network_data["links"]), len(network_details.links)) self.assertEqual( 1, len([ l for l in network_details.links if l.type == network_model.LINK_TYPE_PHYSICAL and l.id == mock.sentinel.link_id1 and l.name == mock.sentinel.link_id1 and l.mac_address == mock.sentinel.link_mac1 and l.mtu == mock.sentinel.link_mtu1 ])) self.assertEqual( 1, len([ l for l in network_details.links if l.type == network_model.LINK_TYPE_PHYSICAL and l.id == mock.sentinel.link_id2 and l.name == mock.sentinel.link_id2 and l.mac_address == mock.sentinel.link_mac2 and l.mtu == mock.sentinel.link_mtu2 ])) self.assertEqual( 1, len([ l for l in network_details.links if l.type == network_model.LINK_TYPE_BOND and l.id == mock.sentinel.bond_id1 and l.name == mock.sentinel.bond_id1 and l.mtu == mock.sentinel.bond_mtu1 and l.mac_address == mock.sentinel.bond_mac1 and l.vlan_link is None and l.vlan_id is None and l.bond.type == network_model.BOND_TYPE_ACTIVE_BACKUP and l.bond.members == [mock.sentinel.link_id1, mock.sentinel.link_id2] and l.bond.lb_algorithm == network_model.BOND_LB_ALGO_L2 and l.bond.lacp_rate is None ])) self.assertEqual( 1, len([ l for l in network_details.links if l.type == network_model.LINK_TYPE_VLAN and l.id == mock.sentinel.vlan_link_id1 and l.name == mock.sentinel. vlan_link_id1 and l.mac_address == mock.sentinel.vlan_mac1 and l.mtu == mock.sentinel.vlan_mtu1 and l.vlan_link == mock.sentinel.bond_id1 and l.vlan_id == mock.sentinel.vlan_id1 ])) self.assertEqual( len([ n for n in network_data["networks"] if n["type"] in [ baseopenstackservice.NETWORK_TYPE_IPV4, baseopenstackservice.NETWORK_TYPE_IPV6 ] ]), len(network_details.networks)) def _get_cidr_address(ip_address, netmask): prefix_len = netaddr.IPNetwork(u"%s/%s" % (ip_address, netmask)).prefixlen return u"%s/%s" % (ip_address, prefix_len) address_cidr = _get_cidr_address(mock.sentinel.ip_address1, mock.sentinel.netmask1) network = [ n for n in network_details.networks if n.address_cidr == address_cidr and n.dns_nameservers == [mock.sentinel.dns1, mock.sentinel.dns2] and n.link == mock.sentinel.bond_id1 ] self.assertEqual(1, len(network)) network_cidr1 = _get_cidr_address(mock.sentinel.route_network1, mock.sentinel.route_netmask1) network_cidr2 = _get_cidr_address(mock.sentinel.route_network2, mock.sentinel.route_netmask2) self.assertEqual([ network_model.Route(network_cidr=network_cidr1, gateway=mock.sentinel.route_gateway1), network_model.Route(network_cidr=network_cidr2, gateway=mock.sentinel.route_gateway2) ], network[0].routes) network_ipv6 = [ n for n in network_details.networks if n.address_cidr == mock.sentinel.ip_address_ipv61 and n.link == mock.sentinel.bond_id1 ] self.assertEqual(1, len(network_ipv6)) self.assertEqual([ network_model.NameServerService( addresses=[mock.sentinel.dns3, mock.sentinel.dns4], search=None) ], network_details.services)
def test_network_details_v2(self): expected_bond = nm.Bond( members=["gbe0", "gbe1"], type=nm.BOND_TYPE_ACTIVE_BACKUP, lb_algorithm=None, lacp_rate=None, ) expected_link_bond = nm.Link( id='bond0', name='bond0', type=nm.LINK_TYPE_BOND, enabled=True, mac_address="52:54:00:12:34:00", mtu=1450, bond=expected_bond, vlan_link=None, vlan_id=None, ) expected_link = nm.Link( id='interface0', name='interface0', type=nm.LINK_TYPE_PHYSICAL, enabled=True, mac_address="52:54:00:12:34:00", mtu=1450, bond=None, vlan_link=None, vlan_id=None, ) expected_link_vlan = nm.Link( id='vlan0', name='vlan0', type=nm.LINK_TYPE_VLAN, enabled=True, mac_address="52:54:00:12:34:00", mtu=1450, bond=None, vlan_link='eth1', vlan_id=150, ) expected_network = nm.Network( link='interface0', address_cidr='192.168.1.10/24', dns_nameservers=['192.168.1.11'], routes=[nm.Route(network_cidr='0.0.0.0/0', gateway="192.168.1.1")]) expected_network_bond = nm.Network( link='bond0', address_cidr='192.168.1.10/24', dns_nameservers=['192.168.1.11'], routes=[], ) expected_network_vlan = nm.Network( link='vlan0', address_cidr='192.168.1.10/24', dns_nameservers=['192.168.1.11'], routes=[], ) expected_nameservers = nm.NameServerService( addresses=['192.168.23.2', '8.8.8.8'], search='acme.local') parser_data = """ - type: physical name: interface0 mac_address: "52:54:00:12:34:00" mtu: 1450 subnets: - type: static address: 192.168.1.10 netmask: 255.255.255.0 gateway: 192.168.1.1 dns_nameservers: - 192.168.1.11 - type: bond name: bond0 bond_interfaces: - gbe0 - gbe1 mac_address: "52:54:00:12:34:00" params: bond-mode: active-backup bond-lacp-rate: false mtu: 1450 subnets: - type: static address: 192.168.1.10 netmask: 255.255.255.0 dns_nameservers: - 192.168.1.11 - type: vlan name: vlan0 vlan_link: eth1 vlan_id: 150 mac_address: "52:54:00:12:34:00" mtu: 1450 subnets: - type: static address: 192.168.1.10 netmask: 255.255.255.0 dns_nameservers: - 192.168.1.11 - type: nameserver address: - 192.168.23.2 - 8.8.8.8 search: acme.local """ result = self._parser.parse(serialization.parse_json_yaml(parser_data)) self.assertEqual(result.links[0], expected_link) self.assertEqual(result.networks[0], expected_network) self.assertEqual(result.links[1], expected_link_bond) self.assertEqual(result.networks[1], expected_network_bond) self.assertEqual(result.links[2], expected_link_vlan) self.assertEqual(result.networks[2], expected_network_vlan) self.assertEqual(result.services[0], expected_nameservers)