Add missing organizational unit (--ou) parameter in manila cli

Organizational Unit (OU) support was added into the Manila backend via
the https://bugs.launchpad.net/manila/+bug/1696669. However the manila
CLI still doesn't support this paramater. This commit adds OU support
into the Manila CLI.

Change-Id: Ia00ddea6a0d60714cf57c16b3328177f3d3981d0
closes-bug: 1799934
This commit is contained in:
kayrus 2018-10-25 13:48:52 +02:00
parent cc6fadbc96
commit 2e97ad08bd
9 changed files with 98 additions and 13 deletions

@ -273,7 +273,7 @@ class BaseTestCase(base.ClientTestBase):
@classmethod @classmethod
def create_security_service(cls, type='ldap', name=None, description=None, def create_security_service(cls, type='ldap', name=None, description=None,
dns_ip=None, server=None, domain=None, dns_ip=None, ou=None, server=None, domain=None,
user=None, password=None, client=None, user=None, password=None, client=None,
cleanup_in_class=False, microversion=None): cleanup_in_class=False, microversion=None):
if client is None: if client is None:
@ -287,6 +287,7 @@ class BaseTestCase(base.ClientTestBase):
'server': server, 'server': server,
'domain': domain, 'domain': domain,
'dns_ip': dns_ip, 'dns_ip': dns_ip,
'ou': ou,
'microversion': microversion, 'microversion': microversion,
} }
ss = client.create_security_service(**data) ss = client.create_security_service(**data)

@ -1196,7 +1196,7 @@ class ManilaCLIClient(base.CLIClient):
return output_parser.listing(response) return output_parser.listing(response)
def create_security_service(self, type='ldap', name=None, description=None, def create_security_service(self, type='ldap', name=None, description=None,
dns_ip=None, server=None, domain=None, dns_ip=None, ou=None, server=None, domain=None,
user=None, password=None, microversion=None): user=None, password=None, microversion=None):
"""Creates security service. """Creates security service.
@ -1204,6 +1204,7 @@ class ManilaCLIClient(base.CLIClient):
:param name: desired name of new security service. :param name: desired name of new security service.
:param description: desired description of new security service. :param description: desired description of new security service.
:param dns_ip: DNS IP address inside tenant's network. :param dns_ip: DNS IP address inside tenant's network.
:param ou: security service organizational unit
:param server: security service IP address or hostname. :param server: security service IP address or hostname.
:param domain: security service domain. :param domain: security service domain.
:param user: user of the new security service. :param user: user of the new security service.
@ -1215,6 +1216,7 @@ class ManilaCLIClient(base.CLIClient):
name=name, name=name,
description=description, description=description,
dns_ip=dns_ip, dns_ip=dns_ip,
ou=ou,
server=server, server=server,
domain=domain, domain=domain,
user=user, user=user,
@ -1226,14 +1228,15 @@ class ManilaCLIClient(base.CLIClient):
@not_found_wrapper @not_found_wrapper
def update_security_service(self, security_service, name=None, def update_security_service(self, security_service, name=None,
description=None, dns_ip=None, server=None, description=None, dns_ip=None, ou=None,
domain=None, user=None, password=None, server=None, domain=None, user=None,
microversion=None): password=None, microversion=None):
cmd = 'security-service-update %s ' % security_service cmd = 'security-service-update %s ' % security_service
cmd += self. _combine_security_service_data( cmd += self. _combine_security_service_data(
name=name, name=name,
description=description, description=description,
dns_ip=dns_ip, dns_ip=dns_ip,
ou=ou,
server=server, server=server,
domain=domain, domain=domain,
user=user, user=user,
@ -1242,8 +1245,8 @@ class ManilaCLIClient(base.CLIClient):
self.manila(cmd, microversion=microversion)) self.manila(cmd, microversion=microversion))
def _combine_security_service_data(self, name=None, description=None, def _combine_security_service_data(self, name=None, description=None,
dns_ip=None, server=None, domain=None, dns_ip=None, ou=None, server=None,
user=None, password=None): domain=None, user=None, password=None):
data = '' data = ''
if name is not None: if name is not None:
data += '--name %s ' % name data += '--name %s ' % name
@ -1251,6 +1254,8 @@ class ManilaCLIClient(base.CLIClient):
data += '--description %s ' % description data += '--description %s ' % description
if dns_ip is not None: if dns_ip is not None:
data += '--dns-ip %s ' % dns_ip data += '--dns-ip %s ' % dns_ip
if ou is not None:
data += '--ou %s ' % ou
if server is not None: if server is not None:
data += '--server %s ' % server data += '--server %s ' % server
if domain is not None: if domain is not None:

@ -32,6 +32,7 @@ class SecurityServiceReadWriteTest(base.BaseTestCase):
cls.server = 'fake_server' cls.server = 'fake_server'
cls.domain = 'fake_domain' cls.domain = 'fake_domain'
cls.dns_ip = '1.2.3.4' cls.dns_ip = '1.2.3.4'
cls.ou = 'fake_ou'
@ddt.data( @ddt.data(
{'name': 'test_name'}, {'name': 'test_name'},
@ -41,6 +42,7 @@ class SecurityServiceReadWriteTest(base.BaseTestCase):
{'server': 'test_server'}, {'server': 'test_server'},
{'domain': 'test_domain'}, {'domain': 'test_domain'},
{'dns_ip': 'test_dns_ip'}, {'dns_ip': 'test_dns_ip'},
{'ou': 'test_ou'},
{'name': '""'}, {'name': '""'},
{'description': '""'}, {'description': '""'},
{'user': '""'}, {'user': '""'},
@ -48,6 +50,7 @@ class SecurityServiceReadWriteTest(base.BaseTestCase):
{'server': '""'}, {'server': '""'},
{'domain': '""'}, {'domain': '""'},
{'dns_ip': '""'}, {'dns_ip': '""'},
{'ou': '""'},
) )
def test_create_update_security_service(self, ss_data): def test_create_update_security_service(self, ss_data):
expected_data = { expected_data = {
@ -58,6 +61,7 @@ class SecurityServiceReadWriteTest(base.BaseTestCase):
'server': self.server, 'server': self.server,
'domain': self.domain, 'domain': self.domain,
'dns_ip': self.dns_ip, 'dns_ip': self.dns_ip,
'ou': self.ou,
} }
ss = self.create_security_service(**expected_data) ss = self.create_security_service(**expected_data)

@ -658,6 +658,7 @@ class FakeHTTPClient(fakes.FakeHTTPClient):
'domain': 'fake_domain', 'domain': 'fake_domain',
'server': 'fake_server', 'server': 'fake_server',
'dns_ip': 'fake_dns_ip', 'dns_ip': 'fake_dns_ip',
'ou': 'fake_ou',
'type': 'fake_type', 'type': 'fake_type',
'status': 'fake_status', 'status': 'fake_status',
'project_id': 'fake_project_id', 'project_id': 'fake_project_id',

@ -34,6 +34,7 @@ class SecurityServiceTest(utils.TestCase):
values = { values = {
'type': 'ldap', 'type': 'ldap',
'dns_ip': 'fake dns ip', 'dns_ip': 'fake dns ip',
'ou': 'fake ou',
'server': 'fake.ldap.server', 'server': 'fake.ldap.server',
'domain': 'fake.ldap.domain', 'domain': 'fake.ldap.domain',
'user': 'fake user', 'user': 'fake user',
@ -139,6 +140,7 @@ class SecurityServiceTest(utils.TestCase):
security_service = 'fake service' security_service = 'fake service'
values = { values = {
'dns_ip': 'new dns ip', 'dns_ip': 'new dns ip',
'ou': 'new ou',
'server': 'new.ldap.server', 'server': 'new.ldap.server',
'domain': 'new.ldap.domain', 'domain': 'new.ldap.domain',
'user': 'new user', 'user': 'new user',

@ -1912,6 +1912,7 @@ class ShellTest(test_utils.TestCase):
'type': 'ldap', 'type': 'ldap',
'user': 'fake-user', 'user': 'fake-user',
'dns-ip': '1.1.1.1', 'dns-ip': '1.1.1.1',
'ou': 'fake-ou',
'server': 'fake-server', 'server': 'fake-server',
'domain': 'fake-domain', 'domain': 'fake-domain',
'offset': 10, 'offset': 10,
@ -1925,8 +1926,8 @@ class ShellTest(test_utils.TestCase):
self.assert_called( self.assert_called(
'GET', 'GET',
'/security-services?dns_ip=1.1.1.1&domain=fake-domain&limit=20' '/security-services?dns_ip=1.1.1.1&domain=fake-domain&limit=20'
'&name=fake-name&offset=10&server=fake-server&status=new' '&name=fake-name&offset=10&ou=fake-ou&server=fake-server'
'&type=ldap&user=fake-user', '&status=new&type=ldap&user=fake-user',
) )
cliutils.print_list.assert_called_once_with( cliutils.print_list.assert_called_once_with(
mock.ANY, mock.ANY,
@ -1943,10 +1944,22 @@ class ShellTest(test_utils.TestCase):
mock.ANY, mock.ANY,
fields=['id', 'name', 'status', 'type']) fields=['id', 'name', 'status', 'type'])
@mock.patch.object(cliutils, 'print_list', mock.Mock())
def test_security_service_list_filter_by_ou_alias(self):
self.run_command('security-service-list --ou fake-ou')
self.assert_called(
'GET',
'/security-services?ou=fake-ou',
)
cliutils.print_list.assert_called_once_with(
mock.ANY,
fields=['id', 'name', 'status', 'type'])
@ddt.data( @ddt.data(
{'--name': 'fake_name'}, {'--name': 'fake_name'},
{'--description': 'fake_description'}, {'--description': 'fake_description'},
{'--dns-ip': 'fake_dns_ip'}, {'--dns-ip': 'fake_dns_ip'},
{'--ou': 'fake_ou'},
{'--domain': 'fake_domain'}, {'--domain': 'fake_domain'},
{'--server': 'fake_server'}, {'--server': 'fake_server'},
{'--user': 'fake_user'}, {'--user': 'fake_user'},
@ -1954,6 +1967,7 @@ class ShellTest(test_utils.TestCase):
{'--name': 'fake_name', {'--name': 'fake_name',
'--description': 'fake_description', '--description': 'fake_description',
'--dns-ip': 'fake_dns_ip', '--dns-ip': 'fake_dns_ip',
'--ou': 'fake_ou',
'--domain': 'fake_domain', '--domain': 'fake_domain',
'--server': 'fake_server', '--server': 'fake_server',
'--user': 'fake_user', '--user': 'fake_user',
@ -1961,6 +1975,7 @@ class ShellTest(test_utils.TestCase):
{'--name': '""'}, {'--name': '""'},
{'--description': '""'}, {'--description': '""'},
{'--dns-ip': '""'}, {'--dns-ip': '""'},
{'--ou': '""'},
{'--domain': '""'}, {'--domain': '""'},
{'--server': '""'}, {'--server': '""'},
{'--user': '""'}, {'--user': '""'},
@ -1968,6 +1983,7 @@ class ShellTest(test_utils.TestCase):
{'--name': '""', {'--name': '""',
'--description': '""', '--description': '""',
'--dns-ip': '""', '--dns-ip': '""',
'--ou': '""',
'--domain': '""', '--domain': '""',
'--server': '""', '--server': '""',
'--user': '""', '--user': '""',

@ -42,13 +42,15 @@ class SecurityServiceManager(base.ManagerWithFind):
resource_class = SecurityService resource_class = SecurityService
def create(self, type, dns_ip=None, server=None, domain=None, user=None, def create(self, type, dns_ip=None, ou=None, server=None, domain=None,
password=None, name=None, description=None): user=None, password=None, name=None,
description=None):
"""Create security service for NAS. """Create security service for NAS.
:param type: security service type - 'ldap', 'kerberos' or :param type: security service type - 'ldap', 'kerberos' or
'active_directory' 'active_directory'
:param dns_ip: dns ip address used inside tenant's network :param dns_ip: dns ip address used inside tenant's network
:param ou: security service organizational unit
:param server: security service server ip address or hostname :param server: security service server ip address or hostname
:param domain: security service domain :param domain: security service domain
:param user: security identifier used by tenant :param user: security identifier used by tenant
@ -60,6 +62,8 @@ class SecurityServiceManager(base.ManagerWithFind):
values = {'type': type} values = {'type': type}
if dns_ip: if dns_ip:
values['dns_ip'] = dns_ip values['dns_ip'] = dns_ip
if ou:
values['ou'] = ou
if server: if server:
values['server'] = server values['server'] = server
if domain: if domain:
@ -88,12 +92,14 @@ class SecurityServiceManager(base.ManagerWithFind):
RESOURCE_NAME, RESOURCE_NAME,
) )
def update(self, security_service, dns_ip=None, server=None, domain=None, def update(self, security_service, dns_ip=None, ou=None, server=None,
password=None, user=None, name=None, description=None): domain=None, password=None, user=None, name=None,
description=None):
"""Updates a security service. """Updates a security service.
:param security_service: security service to update. :param security_service: security service to update.
:param dns_ip: dns ip address used inside tenant's network :param dns_ip: dns ip address used inside tenant's network
:param ou: security service organizational unit
:param server: security service server ip address or hostname :param server: security service server ip address or hostname
:param domain: security service domain :param domain: security service domain
:param user: security identifier used by tenant :param user: security identifier used by tenant
@ -106,6 +112,8 @@ class SecurityServiceManager(base.ManagerWithFind):
values = {} values = {}
if dns_ip is not None: if dns_ip is not None:
values['dns_ip'] = dns_ip values['dns_ip'] = dns_ip
if ou is not None:
values['ou'] = ou
if server is not None: if server is not None:
values['server'] = server values['server'] = server
if domain is not None: if domain is not None:

@ -3099,6 +3099,12 @@ def do_share_network_delete(cs, args):
metavar='<dns_ip>', metavar='<dns_ip>',
default=None, default=None,
help="DNS IP address used inside tenant's network.") help="DNS IP address used inside tenant's network.")
@cliutils.arg(
'--ou',
metavar='<ou>',
default=None,
help="Security service OU (Organizational Unit). Available only for "
"microversion >= 2.44.")
@cliutils.arg( @cliutils.arg(
'--server', '--server',
metavar='<server>', metavar='<server>',
@ -3140,6 +3146,15 @@ def do_security_service_create(cs, args):
'name': args.name, 'name': args.name,
'description': args.description, 'description': args.description,
} }
if cs.api_version.matches(api_versions.APIVersion("2.44"),
api_versions.APIVersion()):
values['ou'] = args.ou
elif args.ou:
raise exceptions.CommandError(
"Security service Organizational Unit (ou) option "
"is only available with manila API version >= 2.44")
security_service = cs.security_services.create(args.type, **values) security_service = cs.security_services.create(args.type, **values)
info = security_service._info.copy() info = security_service._info.copy()
cliutils.print_dict(info) cliutils.print_dict(info)
@ -3154,6 +3169,12 @@ def do_security_service_create(cs, args):
metavar='<dns-ip>', metavar='<dns-ip>',
default=None, default=None,
help="DNS IP address used inside tenant's network.") help="DNS IP address used inside tenant's network.")
@cliutils.arg(
'--ou',
metavar='<ou>',
default=None,
help="Security service OU (Organizational Unit). Available only for "
"microversion >= 2.44.")
@cliutils.arg( @cliutils.arg(
'--server', '--server',
metavar='<server>', metavar='<server>',
@ -3195,6 +3216,15 @@ def do_security_service_update(cs, args):
'name': args.name, 'name': args.name,
'description': args.description, 'description': args.description,
} }
if cs.api_version.matches(api_versions.APIVersion("2.44"),
api_versions.APIVersion()):
values['ou'] = args.ou
elif args.ou:
raise exceptions.CommandError(
"Security service Organizational Unit (ou) option "
"is only available with manila API version >= 2.44")
security_service = _find_security_service( security_service = _find_security_service(
cs, args.security_service).update(**values) cs, args.security_service).update(**values)
cliutils.print_dict(security_service._info) cliutils.print_dict(security_service._info)
@ -3254,6 +3284,12 @@ def do_security_service_show(cs, args):
action='single_alias', action='single_alias',
default=None, default=None,
help="Filter results by DNS IP address used inside tenant's network.") help="Filter results by DNS IP address used inside tenant's network.")
@cliutils.arg(
'--ou',
metavar='<ou>',
default=None,
help="Filter results by security service OU (Organizational Unit)."
" Available only for microversion >= 2.44.")
@cliutils.arg( @cliutils.arg(
'--server', '--server',
metavar='<server>', metavar='<server>',
@ -3305,6 +3341,15 @@ def do_security_service_list(cs, args):
'offset': args.offset, 'offset': args.offset,
'limit': args.limit, 'limit': args.limit,
} }
if cs.api_version.matches(api_versions.APIVersion("2.44"),
api_versions.APIVersion()):
search_opts['ou'] = args.ou
elif args.ou:
raise exceptions.CommandError(
"Security service Organizational Unit (ou) option "
"is only available with manila API version >= 2.44")
if args.share_network: if args.share_network:
search_opts['share_network_id'] = _find_share_network( search_opts['share_network_id'] = _find_share_network(
cs, args.share_network).id cs, args.share_network).id

@ -0,0 +1,3 @@
---
features:
- organizational unit (--ou) parameter support added in manila cli