From c35686b05b6c1b7bff2edc53681e79729d35214e Mon Sep 17 00:00:00 2001 From: Tara Subedi Date: Mon, 4 Mar 2024 17:12:54 -0500 Subject: [PATCH] Implement new network-addrpool CLI This change introduces the new CLI commands for network to address-pools: system network-addrpool-assign system network-addrpool-remove system network-addrpool-list system network-addrpool-show Test Plan [PASS] new unit test [PASS] Install AIO-SX and AIO-DX and verify: - no alarms or failed services - add secondary pool via new CLI - new CLI commands to verify correct values - Lock/Unlock and swact - delete pool via new CLI, verify as above. Story: 2011027 Task: 49678 Change-Id: Ib21476e0c6f7dfb311889078a26c1f688565326f Signed-off-by: Tara Nath Subedi --- .../cgtsclient/tests/test_shell.py | 6 ++ .../cgts-client/cgtsclient/v1/address_pool.py | 18 +++++ .../cgts-client/cgtsclient/v1/client.py | 2 + .../cgtsclient/v1/network_addrpool.py | 50 +++++++++++++ .../cgtsclient/v1/network_addrpool_shell.py | 72 +++++++++++++++++++ .../cgts-client/cgtsclient/v1/shell.py | 2 + 6 files changed, 150 insertions(+) create mode 100755 sysinv/cgts-client/cgts-client/cgtsclient/v1/network_addrpool.py create mode 100755 sysinv/cgts-client/cgts-client/cgtsclient/v1/network_addrpool_shell.py diff --git a/sysinv/cgts-client/cgts-client/cgtsclient/tests/test_shell.py b/sysinv/cgts-client/cgts-client/cgtsclient/tests/test_shell.py index 4c04363053..052a477b4f 100644 --- a/sysinv/cgts-client/cgts-client/cgtsclient/tests/test_shell.py +++ b/sysinv/cgts-client/cgts-client/cgtsclient/tests/test_shell.py @@ -120,3 +120,9 @@ class ShellTest(utils.BaseTestCase): host_results = self.shell("host-list") self.assertIn('controller-0', host_results) self.assertNotIn('controller-1', host_results) + + def test_help_on_network_addrpool_subcommand(self): + self.shell("help network-addrpool-list") + self.shell("help network-addrpool-show") + self.shell("help network-addrpool-assign") + self.shell("help network-addrpool-remove") diff --git a/sysinv/cgts-client/cgts-client/cgtsclient/v1/address_pool.py b/sysinv/cgts-client/cgts-client/cgtsclient/v1/address_pool.py index 03e9830027..a2109ed15a 100644 --- a/sysinv/cgts-client/cgts-client/cgtsclient/v1/address_pool.py +++ b/sysinv/cgts-client/cgts-client/cgtsclient/v1/address_pool.py @@ -8,6 +8,7 @@ # from cgtsclient.common import base +from cgtsclient.common import utils from cgtsclient import exc @@ -52,3 +53,20 @@ class AddressPoolManager(base.Manager): def update(self, pool_id, patch): path = '/v1/addrpools/%s' % pool_id return self._update(path, patch) + + +def _find_addrpool(cc, addrpool): + if utils.is_uuid_like(addrpool): + try: + a = cc.address_pool.get(addrpool) + except exc.HTTPNotFound: + raise exc.CommandError('address pool not found: %s' % addrpool) + else: + return a + else: + addrpool_list = cc.address_pool.list() + for a in addrpool_list: + if a.name == addrpool: + return a + else: + raise exc.CommandError('address pool not found: %s' % addrpool) diff --git a/sysinv/cgts-client/cgts-client/cgtsclient/v1/client.py b/sysinv/cgts-client/cgts-client/cgtsclient/v1/client.py index 61ce8c85ac..a0b9dae068 100644 --- a/sysinv/cgts-client/cgts-client/cgtsclient/v1/client.py +++ b/sysinv/cgts-client/cgts-client/cgtsclient/v1/client.py @@ -66,6 +66,7 @@ from cgtsclient.v1 import lldp_agent from cgtsclient.v1 import lldp_neighbour from cgtsclient.v1 import load from cgtsclient.v1 import network +from cgtsclient.v1 import network_addrpool from cgtsclient.v1 import partition from cgtsclient.v1 import pci_device from cgtsclient.v1 import port @@ -146,6 +147,7 @@ class Client(object): self.load = load.LoadManager(self.http_client) self.upgrade = upgrade.UpgradeManager(self.http_client) self.network = network.NetworkManager(self.http_client) + self.network_addrpool = network_addrpool.NetworkAddrPoolManager(self.http_client) self.datanetwork = datanetwork.DataNetworkManager(self.http_client) self.interface_datanetwork = \ interface_datanetwork.InterfaceDataNetworkManager(self.http_client) diff --git a/sysinv/cgts-client/cgts-client/cgtsclient/v1/network_addrpool.py b/sysinv/cgts-client/cgts-client/cgtsclient/v1/network_addrpool.py new file mode 100755 index 0000000000..1e17b9620a --- /dev/null +++ b/sysinv/cgts-client/cgts-client/cgtsclient/v1/network_addrpool.py @@ -0,0 +1,50 @@ +# +# Copyright (c) 2024 Wind River Systems, Inc. +# +# SPDX-License-Identifier: Apache-2.0 +# + +# -*- encoding: utf-8 -*- +# + +from cgtsclient.common import base +from cgtsclient import exc + + +CREATION_ATTRIBUTES = [ + 'address_pool_uuid', 'network_uuid' +] + + +class NetworkAddrPool(base.Resource): + def __repr__(self): + return "" % self._info + + +class NetworkAddrPoolManager(base.Manager): + resource_class = NetworkAddrPool + + def list(self): + path = '/v1/network_addresspools' + return self._list(path, "network_addresspools") + + def get(self, network_addrpool_uuid): + path = '/v1/network_addresspools/%s' % network_addrpool_uuid + try: + return self._list(path)[0] + except IndexError: + return None + + def assign(self, **kwargs): + path = '/v1/network_addresspools' + new = {} + for (key, value) in kwargs.items(): + if key in CREATION_ATTRIBUTES: + new[key] = value + else: + raise exc.InvalidAttribute('%s' % key) + return self._create(path, new) + + def remove(self, network_addrpool_uuid): + path = '/v1/network_addresspools/%s' % network_addrpool_uuid + return self._delete(path) diff --git a/sysinv/cgts-client/cgts-client/cgtsclient/v1/network_addrpool_shell.py b/sysinv/cgts-client/cgts-client/cgtsclient/v1/network_addrpool_shell.py new file mode 100755 index 0000000000..bfc80dc9b9 --- /dev/null +++ b/sysinv/cgts-client/cgts-client/cgtsclient/v1/network_addrpool_shell.py @@ -0,0 +1,72 @@ +# +# Copyright (c) 2024 Wind River Systems, Inc. +# +# SPDX-License-Identifier: Apache-2.0 +# + +# -*- encoding: utf-8 -*- +# + +from cgtsclient.common import utils +from cgtsclient import exc +from cgtsclient.v1 import address_pool as addrpool_utils +from cgtsclient.v1 import network as network_utils + + +def _print_network_addrpool_show(cc, obj): + fields = ['uuid', 'network_name', 'address_pool_name'] + fields_labels = ['uuid', 'network_name', 'pool_name'] + data = [(fields_labels[index], getattr(obj, f, '')) + for index, f in enumerate(fields)] + utils.print_tuple_list(data) + + +def do_network_addrpool_list(cc, args): + """List network and address pools.""" + fields = ['uuid', 'network_name', 'address_pool_name'] + fields_labels = ['uuid', 'network_name', 'addrpool_name'] + network_addrpools = cc.network_addrpool.list() + utils.print_list(network_addrpools, fields, fields_labels, sortby=1) + + +@utils.arg('network_addrpool_uuid', + metavar='', + help="UUID of network addrpool entry") +def do_network_addrpool_show(cc, args): + """Show network address-pool attributes.""" + network_addrpool = cc.network_addrpool.get(args.network_addrpool_uuid) + _print_network_addrpool_show(cc, network_addrpool) + + +@utils.arg('netnameoruuid', + metavar='', + help="Name or UUID of IP network [REQUIRED]") +@utils.arg('addrpoolnameoruuid', + metavar='', + help="Name or UUID of address pool [REQUIRED]") +def do_network_addrpool_assign(cc, args): + """Assign a network to an address pool.""" + # Determine address pool and network using the given arguments + addrpool = addrpool_utils._find_addrpool(cc, args.addrpoolnameoruuid) + network = network_utils._find_network(cc, args.netnameoruuid) + + data = dict() + data['address_pool_uuid'] = addrpool.uuid + data['network_uuid'] = network.uuid + + network_addrpool = cc.network_addrpool.assign(**data) + uuid = getattr(network_addrpool, 'uuid', '') + try: + network_addrpool = cc.network_addrpool.get(uuid) + except exc.HTTPNotFound: + raise exc.CommandError('Created Network AddrPool UUID not found: %s' % uuid) + _print_network_addrpool_show(cc, network_addrpool) + + +@utils.arg('network_addrpool_uuid', + metavar='', + help="UUID of network addrpool entry") +def do_network_addrpool_remove(cc, args): + """Remove an assigned address pool from a network.""" + cc.network_addrpool.remove(args.network_addrpool_uuid) + print('Deleted Network Addrpool: %s' % args.network_addrpool_uuid) diff --git a/sysinv/cgts-client/cgts-client/cgtsclient/v1/shell.py b/sysinv/cgts-client/cgts-client/cgtsclient/v1/shell.py index 5e50ef02f1..930b80ed22 100644 --- a/sysinv/cgts-client/cgts-client/cgtsclient/v1/shell.py +++ b/sysinv/cgts-client/cgts-client/cgtsclient/v1/shell.py @@ -51,6 +51,7 @@ from cgtsclient.v1 import license_shell from cgtsclient.v1 import lldp_agent_shell from cgtsclient.v1 import lldp_neighbour_shell from cgtsclient.v1 import load_shell +from cgtsclient.v1 import network_addrpool_shell from cgtsclient.v1 import network_shell from cgtsclient.v1 import partition_shell from cgtsclient.v1 import pci_device_shell @@ -111,6 +112,7 @@ COMMAND_MODULES = [ pci_device_shell, upgrade_shell, network_shell, + network_addrpool_shell, interface_network_shell, datanetwork_shell, interface_datanetwork_shell,