Extend 'slave-ip-list' CLI options
- show address pool names or specify an --address-pool-name=<...> - show node names or set --ip-only flag Output examples: $ dos.py slave-ip-list ac_linear_test public-pool01: master,10.100.0.128 slave-0,10.100.0.129 slave-1,10.100.0.130 neutron-pool01: master,10.100.2.2 slave-0,10.100.2.3 slave-1,10.100.2.4 private-pool01: master,10.100.1.128 slave-0,10.100.1.129 slave-1,10.100.1.130 $ dos.py slave-ip-list ac_linear_test --ip-only public-pool01: 10.100.0.128 10.100.0.129 10.100.0.130 neutron-pool01: 10.100.2.2 10.100.2.3 10.100.2.4 private-pool01: 10.100.1.128 10.100.1.129 10.100.1.130 $ dos.py slave-ip-list ac_linear_test --address-pool-name=public-pool01 master,10.100.0.128 slave-0,10.100.0.129 slave-1,10.100.0.130 $ dos.py slave-ip-list ac_linear_test --address-pool-name=public-pool01 --ip-only 10.100.0.128 10.100.0.129 10.100.0.130 Change-Id: I75635f73b90f37d9e50de1772bc7da6720c41cec Related-Bug:#1658630
This commit is contained in:
parent
891559577e
commit
9d9b495c5b
|
@ -291,13 +291,12 @@ class Node(
|
||||||
return None
|
return None
|
||||||
return self.interface_set.get(label=label)
|
return self.interface_set.get(label=label)
|
||||||
|
|
||||||
# NOTE: this method works only for master node
|
|
||||||
def get_ip_address_by_network_name(self, name, interface=None):
|
def get_ip_address_by_network_name(self, name, interface=None):
|
||||||
interface = interface or self.interface_set.filter(
|
interface = interface or self.interface_set.filter(
|
||||||
l2_network_device__name=name).order_by('id')[0]
|
l2_network_device__name=name).order_by('id')[0]
|
||||||
return interface.address_set.get(interface=interface).ip_address
|
return interface.address_set.get(interface=interface).ip_address
|
||||||
|
|
||||||
# NOTE: this method works only for master node
|
# NOTE: this method works only for Fuel master node
|
||||||
def get_ip_address_by_nailgun_network_name(self, name):
|
def get_ip_address_by_nailgun_network_name(self, name):
|
||||||
interface = self.get_interface_by_nailgun_network_name(name)
|
interface = self.get_interface_by_nailgun_network_name(name)
|
||||||
return interface.address_set.first().ip_address
|
return interface.address_set.first().ip_address
|
||||||
|
@ -318,7 +317,6 @@ class Node(
|
||||||
password=password, private_keys=private_keys, auth=auth)
|
password=password, private_keys=private_keys, auth=auth)
|
||||||
|
|
||||||
# LEGACY
|
# LEGACY
|
||||||
# NOTE: this method works only for master node
|
|
||||||
def await(self, network_name, timeout=120, by_port=22):
|
def await(self, network_name, timeout=120, by_port=22):
|
||||||
helpers.wait_pass(
|
helpers.wait_pass(
|
||||||
lambda: helpers.tcp_ping_(
|
lambda: helpers.tcp_ping_(
|
||||||
|
|
|
@ -144,19 +144,35 @@ class Shell(object):
|
||||||
self.print_table(headers=headers, columns=columns)
|
self.print_table(headers=headers, columns=columns)
|
||||||
|
|
||||||
def do_slave_ip_list(self):
|
def do_slave_ip_list(self):
|
||||||
slave_ips = []
|
address_pool_name = self.params.address_pool_name
|
||||||
|
|
||||||
|
slave_ips = {}
|
||||||
for l2dev in self.env.get_env_l2_network_devices():
|
for l2dev in self.env.get_env_l2_network_devices():
|
||||||
# Suppress output of IPs from non-DHCP nets
|
if address_pool_name and \
|
||||||
if not l2dev.dhcp:
|
l2dev.address_pool.name != address_pool_name:
|
||||||
continue
|
continue
|
||||||
|
|
||||||
|
ap_slave_ips = []
|
||||||
for node in self.env.get_nodes():
|
for node in self.env.get_nodes():
|
||||||
slave_ips.append(
|
if self.params.ip_only:
|
||||||
node.get_ip_address_by_network_name(l2dev.name))
|
ap_slave_ips.append(
|
||||||
|
node.get_ip_address_by_network_name(l2dev.name))
|
||||||
|
else:
|
||||||
|
ap_slave_ips.append(
|
||||||
|
"{0},{1}".format(
|
||||||
|
node.name,
|
||||||
|
node.get_ip_address_by_network_name(l2dev.name)))
|
||||||
|
if ap_slave_ips:
|
||||||
|
slave_ips[l2dev.address_pool.name] = ap_slave_ips
|
||||||
|
|
||||||
if not slave_ips:
|
if not slave_ips:
|
||||||
print('No IPs allocated for environment!')
|
sys.exit('No IPs were allocated for environment!')
|
||||||
else:
|
|
||||||
print(' '.join(slave_ips))
|
for ap, n_ips in sorted(slave_ips.items()):
|
||||||
|
if address_pool_name:
|
||||||
|
print(' '.join(n_ips))
|
||||||
|
else:
|
||||||
|
print(ap + ": " + ' '.join(n_ips))
|
||||||
|
|
||||||
def do_time_sync(self):
|
def do_time_sync(self):
|
||||||
if not self.env.has_admin():
|
if not self.env.has_admin():
|
||||||
|
@ -379,6 +395,17 @@ class Shell(object):
|
||||||
net_pool.add_argument('--net-pool', '-P', dest='net_pool',
|
net_pool.add_argument('--net-pool', '-P', dest='net_pool',
|
||||||
help='Set ip network pool (cidr)',
|
help='Set ip network pool (cidr)',
|
||||||
default="10.21.0.0/16:24", type=str)
|
default="10.21.0.0/16:24", type=str)
|
||||||
|
address_pool_name = argparse.ArgumentParser(add_help=False)
|
||||||
|
address_pool_name.add_argument(
|
||||||
|
'--address-pool-name', '-A',
|
||||||
|
dest='address_pool_name',
|
||||||
|
help='Specified address pool for printing IPs',
|
||||||
|
default=None, type=str)
|
||||||
|
ip_only_parser = argparse.ArgumentParser(add_help=False)
|
||||||
|
ip_only_parser.add_argument('--ip-only', dest='ip_only',
|
||||||
|
action='store_const', const=True,
|
||||||
|
help='Print just IP addresses',
|
||||||
|
default=False)
|
||||||
second_disk_size = argparse.ArgumentParser(add_help=False)
|
second_disk_size = argparse.ArgumentParser(add_help=False)
|
||||||
second_disk_size.add_argument('--second-disk-size',
|
second_disk_size.add_argument('--second-disk-size',
|
||||||
dest='second_disk_size',
|
dest='second_disk_size',
|
||||||
|
@ -453,7 +480,9 @@ class Shell(object):
|
||||||
description="Display allocated networks for "
|
description="Display allocated networks for "
|
||||||
"environment")
|
"environment")
|
||||||
subparsers.add_parser('slave-ip-list',
|
subparsers.add_parser('slave-ip-list',
|
||||||
parents=[name_parser],
|
parents=[name_parser,
|
||||||
|
address_pool_name,
|
||||||
|
ip_only_parser],
|
||||||
help="Show slave node IPs in environment",
|
help="Show slave node IPs in environment",
|
||||||
description="Display allocated IPs for "
|
description="Display allocated IPs for "
|
||||||
"environment slave nodes")
|
"environment slave nodes")
|
||||||
|
|
|
@ -86,6 +86,7 @@ class TestShell(unittest.TestCase):
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
super(TestShell, self).setUp()
|
super(TestShell, self).setUp()
|
||||||
|
|
||||||
|
self.sys_mock = self.patch('devops.shell.sys')
|
||||||
self.print_mock = self.patch('devops.shell.print')
|
self.print_mock = self.patch('devops.shell.print')
|
||||||
self.tzlocal_mock = self.patch(
|
self.tzlocal_mock = self.patch(
|
||||||
'devops.helpers.helpers.tz.tzlocal',
|
'devops.helpers.helpers.tz.tzlocal',
|
||||||
|
@ -101,16 +102,32 @@ class TestShell(unittest.TestCase):
|
||||||
m.created = datetime.datetime(2016, 5, 12, 15, 12, t)
|
m.created = datetime.datetime(2016, 5, 12, 15, 12, t)
|
||||||
return m
|
return m
|
||||||
|
|
||||||
def create_l2netdev_mock(name, dhcp=False):
|
def create_ap_mock(name, ip_network):
|
||||||
|
m = mock.Mock(spec=models.AddressPool)
|
||||||
|
m.name = name
|
||||||
|
m.ip_network = netaddr.IPNetwork(ip_network)
|
||||||
|
return m
|
||||||
|
|
||||||
|
self.aps = {
|
||||||
|
'env1': [
|
||||||
|
create_ap_mock('fuelweb_admin-pool01', '109.10.0.0/24'),
|
||||||
|
create_ap_mock('public-pool01', '109.10.1.0/24'),
|
||||||
|
create_ap_mock('storage-pool01', '109.10.2.0/24'),
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
def create_l2netdev_mock(name, address_pool, dhcp=False):
|
||||||
m = mock.Mock(spec=models.L2NetworkDevice)
|
m = mock.Mock(spec=models.L2NetworkDevice)
|
||||||
m.name = name
|
m.name = name
|
||||||
m.dhcp = dhcp
|
m.dhcp = dhcp
|
||||||
|
m.address_pool = address_pool
|
||||||
return name, m
|
return name, m
|
||||||
|
|
||||||
self.l2netdevs = collections.OrderedDict((
|
self.l2netdevs = collections.OrderedDict((
|
||||||
create_l2netdev_mock('fuelweb_admin', dhcp=True),
|
create_l2netdev_mock('fuelweb_admin', self.aps['env1'][0],
|
||||||
create_l2netdev_mock('public', dhcp=True),
|
dhcp=True),
|
||||||
create_l2netdev_mock('storage'),
|
create_l2netdev_mock('public', self.aps['env1'][1], dhcp=True),
|
||||||
|
create_l2netdev_mock('storage', self.aps['env1'][2], ),
|
||||||
))
|
))
|
||||||
|
|
||||||
def create_node_mock(name, vnc_port=5005, snapshots=None, ips=None):
|
def create_node_mock(name, vnc_port=5005, snapshots=None, ips=None):
|
||||||
|
@ -148,20 +165,6 @@ class TestShell(unittest.TestCase):
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
|
|
||||||
def create_ap_mock(name, ip_network):
|
|
||||||
m = mock.Mock(spec=models.AddressPool)
|
|
||||||
m.name = name
|
|
||||||
m.ip_network = netaddr.IPNetwork(ip_network)
|
|
||||||
return m
|
|
||||||
|
|
||||||
self.aps = {
|
|
||||||
'env1': [
|
|
||||||
create_ap_mock('fuelweb_admin-pool01', '109.10.0.0/24'),
|
|
||||||
create_ap_mock('public-pool01', '109.10.1.0/24'),
|
|
||||||
create_ap_mock('storage-pool01', '109.10.2.0/24'),
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
def create_env_mock(env_name, created, nodes, aps, admin_ip=None):
|
def create_env_mock(env_name, created, nodes, aps, admin_ip=None):
|
||||||
m = mock.Mock(created=created)
|
m = mock.Mock(created=created)
|
||||||
m.name = env_name
|
m.name = env_name
|
||||||
|
@ -351,16 +354,51 @@ class TestShell(unittest.TestCase):
|
||||||
sh = shell.Shell(['slave-ip-list', 'env1'])
|
sh = shell.Shell(['slave-ip-list', 'env1'])
|
||||||
sh.execute()
|
sh.execute()
|
||||||
|
|
||||||
|
self.print_mock.assert_has_calls((
|
||||||
|
mock.call('fuelweb_admin-pool01: admin,192.168.1.2'
|
||||||
|
' slave-01,192.168.1.3 slave-02,192.168.1.4'),
|
||||||
|
mock.call('public-pool01: admin,192.168.2.2'
|
||||||
|
' slave-01,192.168.2.3 slave-02,192.168.2.4'),
|
||||||
|
mock.call('storage-pool01: admin,192.168.3.2'
|
||||||
|
' slave-01,192.168.3.3 slave-02,192.168.3.4'),
|
||||||
|
))
|
||||||
|
|
||||||
|
def test_slave_ip_list_ip_only(self):
|
||||||
|
sh = shell.Shell(['slave-ip-list', 'env1', '--ip-only'])
|
||||||
|
sh.execute()
|
||||||
|
|
||||||
|
self.print_mock.assert_has_calls((
|
||||||
|
mock.call(
|
||||||
|
'fuelweb_admin-pool01: 192.168.1.2 192.168.1.3 192.168.1.4'),
|
||||||
|
mock.call('public-pool01: 192.168.2.2 192.168.2.3 192.168.2.4'),
|
||||||
|
mock.call('storage-pool01: 192.168.3.2 192.168.3.3 192.168.3.4'),
|
||||||
|
))
|
||||||
|
|
||||||
|
def test_slave_ip_list_specific_ap(self):
|
||||||
|
sh = shell.Shell(['slave-ip-list', 'env1',
|
||||||
|
'--address-pool-name', 'public-pool01'])
|
||||||
|
sh.execute()
|
||||||
|
|
||||||
self.print_mock.assert_called_once_with(
|
self.print_mock.assert_called_once_with(
|
||||||
'192.168.1.2 192.168.1.3 192.168.1.4 '
|
'admin,192.168.2.2 slave-01,192.168.2.3 slave-02,192.168.2.4')
|
||||||
'192.168.2.2 192.168.2.3 192.168.2.4')
|
|
||||||
|
def test_slave_ip_list_specific_ap_ip_only(self):
|
||||||
|
sh = shell.Shell([
|
||||||
|
'slave-ip-list', 'env1',
|
||||||
|
'--address-pool-name', 'fuelweb_admin-pool01',
|
||||||
|
'--ip-only'])
|
||||||
|
sh.execute()
|
||||||
|
|
||||||
|
self.print_mock.assert_called_once_with(
|
||||||
|
'192.168.1.2 192.168.1.3 192.168.1.4'
|
||||||
|
)
|
||||||
|
|
||||||
def test_slave_ip_list_empty(self):
|
def test_slave_ip_list_empty(self):
|
||||||
sh = shell.Shell(['slave-ip-list', 'env2'])
|
sh = shell.Shell(['slave-ip-list', 'env2'])
|
||||||
sh.execute()
|
sh.execute()
|
||||||
|
|
||||||
self.print_mock.assert_called_once_with(
|
self.sys_mock.exit.assert_called_once_with(
|
||||||
'No IPs allocated for environment!')
|
'No IPs were allocated for environment!')
|
||||||
|
|
||||||
def test_net_list(self):
|
def test_net_list(self):
|
||||||
sh = shell.Shell(['net-list', 'env1'])
|
sh = shell.Shell(['net-list', 'env1'])
|
||||||
|
|
Loading…
Reference in New Issue