From 529cdacd84e6f1e54d09a94d6badd897f74deb6c Mon Sep 17 00:00:00 2001 From: changzhi1990 Date: Wed, 23 Mar 2016 11:52:43 +0800 Subject: [PATCH] Upload check dhcp on network node Change-Id: I488cf1429f37a1a668fa3f89d156658f13f4582f --- steth/stethclient/drivers/dhcp.py | 81 +++++++++++++++++++ steth/stethclient/shell.py | 1 + .../unit/stethclient/test_stethclient.py | 28 +++++++ 3 files changed, 110 insertions(+) diff --git a/steth/stethclient/drivers/dhcp.py b/steth/stethclient/drivers/dhcp.py index fba1bbc..3397c47 100644 --- a/steth/stethclient/drivers/dhcp.py +++ b/steth/stethclient/drivers/dhcp.py @@ -93,3 +93,84 @@ class CheckDHCPonComputeNodes(Lister): ['qvb', data['qvb']], ['qbr', data['qbr']], ['tap', data['tap']])) + + +class CheckDHCPonNetworkNodes(Lister): + "Check DHCP on network nodes." + + log = logging.getLogger(__name__) + + def get_parser(self, prog_name): + parser = super(CheckDHCPonNetworkNodes, self).get_parser(prog_name) + parser.add_argument('port_id', default='bad', + help='ID of port to look up.') + parser.add_argument('physical_interface', default='bad', + help=('Name of physical interface.' + 'We catch packets at this interface')) + parser.add_argument('network_type', default='vlan', + help='Network type, you want to check.') + return parser + + def take_action(self, parsed_args): + self.log.debug('Get parsed_args: %s' % parsed_args) + if not utils.is_uuid_like(parsed_args.port_id): + utils.Logger.log_fail("Port id: %s is not like" + "uuid." % parsed_args.port_id) + sys.exit() + # get network_type + network_type = parsed_args.network_type + if network_type != 'vlan' and network_type != 'vxlan': + utils.Logger.log_fail("Network type %s not support!" + "Please choose from 'vlan' and 'vxlan'." + % network_type) + sys.exit() + self.log.debug("network_type is %s" % network_type) + + # get port's network_id and ip address + port_network_id = neutron.get_port_attr(parsed_args.port_id, + 'network_id') + if not port_network_id: + utils.Logger.log_fail("Get port network_id fails." + "Please check this port.") + sys.exit() + self.log.debug("port network id is %s" % port_network_id) + + port_ip_addr = neutron.get_port_attr(parsed_args.port_id, + 'fixed_ips')[0]['ip_address'] + if not port_ip_addr: + utils.Logger.log_fail("Get port ip_addr fails." + "Please check this port.") + sys.exit() + self.log.debug("port ip addr is %s" % port_ip_addr) + + # get port's host info + host_id = neutron.get_port_attr(parsed_args.port_id, 'binding:host_id') + if not host_id: + utils.Logger.log_fail("Port %s doesn't attach to any vms." + % parsed_args.port_id) + sys.exit() + self.log.debug("port host id is %s" % host_id) + + # setup steth server + try: + server = utils.setup_server(host_id) + self.log.debug("setup server: %s" % host_id) + except: + utils.Logger.log_fail("Setup server fail in: %s." % server) + sys.exit() + + # get physical interface name + physical_interface = parsed_args.physical_interface + self.log.debug("Physical interface is %s" % physical_interface) + res = server.check_dhcp_on_net(net_id=port_network_id, + port_ip=port_ip_addr, + phy_iface=physical_interface, + net_type=network_type) + self.log.debug("Response is %s" % res) + if res['code'] == 0: + data = res['data'] + return (['Device Name', 'Result'], + (['br-int', data['br-int']], + ['ovsbr3', data['ovsbr3']], + ['eth0', data['eth0']])) + return (['Error Mssage', ' '], [('message', res['message'])]) diff --git a/steth/stethclient/shell.py b/steth/stethclient/shell.py index 56156dd..db02d64 100644 --- a/steth/stethclient/shell.py +++ b/steth/stethclient/shell.py @@ -39,6 +39,7 @@ COMMAND_V1 = { 'check-vlan-interface': agent_api.CheckVlanInterface, 'check-iperf': iperf_api.CheckIperf, 'check-dhcp-on-comp': dhcp.CheckDHCPonComputeNodes, + 'check-dhcp-on-network': dhcp.CheckDHCPonNetworkNodes, 'print-agents-info': agent_api.PrintAgentsInfo, } diff --git a/steth/tests/unit/stethclient/test_stethclient.py b/steth/tests/unit/stethclient/test_stethclient.py index 69c492b..04453f6 100644 --- a/steth/tests/unit/stethclient/test_stethclient.py +++ b/steth/tests/unit/stethclient/test_stethclient.py @@ -123,3 +123,31 @@ class TestStethClientMethods(unittest.TestCase): 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa', 'eth0', 'vlan']) self.assertEqual(self.server.check_dhcp_on_comp.called, True) + + @mock.patch('neutronclient.v2_0.client.Client.show_port') + def test_check_dhcp_on_net(self, show_port): + show_port.return_value = { + 'port': { + 'mac_address': 'aa:bb:cc:dd:ee:ff', + 'binding:host_id': 'server-9', + 'network_id': '0912af24-4525-4737-beb7-c77aa14e0567', + 'fixed_ips': [ + { + 'subnet_id': '73b19b70-c469-473a-b589-459524f2c6a6', + 'ip_address': u'10.0.0.3' + }] + } + } + device = "tapaaaaaaaa-aa" + msg = device + "No such device exists (SIOCGIFHWADDR: No such device)" + check_dhcp_on_net_r = { + 'message': msg, + 'code': 1, + 'data': {} + } + self.server.check_dhcp_on_net = mock.Mock( + return_value=check_dhcp_on_net_r) + shell.main(['check-dhcp-on-net', + 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa', + 'eth0', 'vlan']) + self.assertEqual(self.server.check_dhcp_on_net.called, True)