API v2.44, added 'ou' field to security service

Added 'ou' field to security service field. Also, 'description'
field was added to display in both project and admin module.
Options to update dns_ip, ou, server, domain, password and
user fields were added as well. As this options are available
for command line interface.

Partial-Bug: #1823078
Change-Id: I03c0cb01cc04745e67d94a45e3f7570c1609ede0
This commit is contained in:
Dina Saparbaeva 2021-02-08 11:37:54 +00:00
parent 03caca6932
commit b748f23ed1
12 changed files with 109 additions and 34 deletions

View File

@ -28,7 +28,7 @@ from manilaclient import client as manila_client
LOG = logging.getLogger(__name__)
MANILA_UI_USER_AGENT_REPR = "manila_ui_plugin_for_horizon"
MANILA_VERSION = "2.41"
MANILA_VERSION = "2.44"
MANILA_SERVICE_TYPE = "sharev2"
# API static values
@ -312,22 +312,25 @@ def security_service_get(request, sec_service_id, search_opts=None):
return manilaclient(request).security_services.get(sec_service_id)
def security_service_create(request, type, dns_ip=None, server=None,
def security_service_create(request, type, dns_ip=None, ou=None, server=None,
domain=None, user=None, password=None, name=None,
description=None):
return manilaclient(request).security_services.create(
type, dns_ip=dns_ip, server=server, domain=domain, user=user,
type, dns_ip=dns_ip, ou=ou, server=server, domain=domain, user=user,
password=password, name=name, description=description)
def security_service_update(request, security_service_id, dns_ip=None,
server=None,
domain=None, user=None, password=None, name=None,
description=None):
def security_service_update(request, security_service_id,
dns_ip=None, ou=None,
server=None, domain=None,
password=None, user=None,
name=None, description=None):
return manilaclient(request).security_services.update(
security_service_id, dns_ip=dns_ip, server=server, domain=domain,
user=user, password=password, name=name, description=description,
)
security_service_id,
dns_ip=dns_ip, ou=ou,
server=server, domain=domain,
password=password, user=user,
name=name, description=description)
def security_service_delete(request, security_service_id):

View File

@ -44,8 +44,10 @@ class SecurityServicesTable(tables.DataTable):
name = tables.WrappingColumn(
"name", verbose_name=_("Name"),
link="horizon:admin:security_services:security_service_detail")
description = tables.Column("description", verbose_name=_("Description"))
project = tables.Column("project_name", verbose_name=_("Project"))
dns_ip = tables.Column("dns_ip", verbose_name=_("DNS IP"))
ou = tables.Column("ou", verbose_name=_("Organizational Unit"))
server = tables.Column("server", verbose_name=_("Server"))
domain = tables.Column("domain", verbose_name=_("Domain"))
user = tables.Column("user", verbose_name=_("Sid"))

View File

@ -26,6 +26,8 @@
<dl class="dl-horizontal">
<dt>{% trans "DNS IP" %}</dt>
<dd>{{ sec_service.dns_ip }}</dd>
<dt>{% trans "Organizational Unit" %}</dt>
<dd>{{ sec_service.ou }}</dd>
<dt>{% trans "Server" %}</dt>
<dd>{{ sec_service.server }}</dd>
<dt>{% trans "Domain" %}</dt>

View File

@ -27,6 +27,10 @@ from manila_ui.api import manila
class Create(forms.SelfHandlingForm):
name = forms.CharField(max_length="255", label=_("Name"))
dns_ip = forms.CharField(max_length="15", label=_("DNS IP"))
ou = forms.CharField(
max_length="255",
label=_("Organizational Unit"),
required=False)
server = forms.CharField(max_length="255", label=_("Server"))
domain = forms.CharField(max_length="255", label=_("Domain"))
user = forms.CharField(max_length="255", label=_("User"), required=False)
@ -36,7 +40,8 @@ class Create(forms.SelfHandlingForm):
required=False)
confirm_password = forms.CharField(
label=_("Confirm Password"),
widget=forms.PasswordInput(render_value=False))
widget=forms.PasswordInput(render_value=False),
required=False)
type = forms.ChoiceField(choices=(("", ""),
("active_directory", "Active Directory"),
("ldap", "LDAP"),
@ -70,15 +75,52 @@ class Create(forms.SelfHandlingForm):
class Update(forms.SelfHandlingForm):
name = forms.CharField(max_length="255", label=_("Share Name"))
dns_ip = forms.CharField(
max_length="15", label=_("DNS IP"), required=False)
ou = forms.CharField(
max_length="255",
label=_("Organizational Unit"),
required=False)
server = forms.CharField(
max_length="255", label=_("Server"), required=False)
domain = forms.CharField(
max_length="255", label=_("Domain"), required=False)
user = forms.CharField(
max_length="255", label=_("User"), required=False)
password = forms.CharField(
label=_("Password"),
widget=forms.PasswordInput(render_value=False),
required=False)
confirm_password = forms.CharField(
label=_("Confirm Password"),
widget=forms.PasswordInput(render_value=False),
required=False)
description = forms.CharField(
widget=forms.Textarea, label=_("Description"), required=False)
def clean(self):
'''Check to make sure password fields match.'''
cleaned_data = super(forms.Form, self).clean()
password = self.cleaned_data.get('password')
confirm_password = self.cleaned_data.get('confirm_password')
if password != confirm_password:
raise ValidationError(_('Passwords do not match.'))
return cleaned_data
@sensitive_variables('data')
def handle(self, request, data):
sec_service_id = self.initial['sec_service_id']
try:
manila.security_service_update(request, sec_service_id,
name=data['name'],
description=data['description'])
manila.security_service_update(
request, sec_service_id,
dns_ip=data['dns_ip'],
ou=data['ou'],
server=data['server'],
domain=data['domain'],
password=data.get('password') or None,
user=data['user'],
name=data['name'],
description=data['description'])
message = _('Successfully updated security service '
'"%s"') % data['name']

View File

@ -63,7 +63,9 @@ class SecurityServicesTable(tables.DataTable):
name = tables.WrappingColumn(
"name", verbose_name=_("Name"),
link="horizon:project:security_services:security_service_detail")
description = tables.Column("description", verbose_name=_("Description"))
dns_ip = tables.Column("dns_ip", verbose_name=_("DNS IP"))
ou = tables.Column("ou", verbose_name=_("Organizational Unit"))
server = tables.Column("server", verbose_name=_("Server"))
domain = tables.Column("domain", verbose_name=_("Domain"))
user = tables.Column("user", verbose_name=_("User"))

View File

@ -26,6 +26,8 @@
<dl class="dl-horizontal">
<dt>{% trans "DNS IP" %}</dt>
<dd>{{ sec_service.dns_ip }}</dd>
<dt>{% trans "Organizational Unit" %}</dt>
<dd>{{ sec_service.ou }}</dd>
<dt>{% trans "Server" %}</dt>
<dd>{{ sec_service.server }}</dd>
<dt>{% trans "Domain" %}</dt>

View File

@ -73,14 +73,21 @@ class UpdateView(forms.ModalFormView):
def get_context_data(self, **kwargs):
context = super(UpdateView, self).get_context_data(**kwargs)
args = (self.kwargs['sec_service_id'],)
context['submit_url'] = reverse(self.submit_url, args=args)
return context
def get_initial(self):
self.submit_url = reverse(self.submit_url, kwargs=self.kwargs)
sec_service = self.get_object()
return {'sec_service_id': self.kwargs["sec_service_id"],
'dns_ip': sec_service.dns_ip,
'ou': sec_service.ou,
'server': sec_service.server,
'domain': sec_service.domain,
'user': sec_service.user,
'name': sec_service.name,
'description': sec_service.description}
'description': sec_service.description,
}
class CreateView(forms.ModalFormView):

View File

@ -449,7 +449,7 @@ class ManilaApiTests(base.APITestCase):
("ldap", {}),
("kerberos", {}),
("ldap",
{"dns_ip": "8.8.8.8",
{"dns_ip": "8.8.8.8", "ou": "fakeOU",
"name": "my_fake_ldap_security_service",
"description": "LDAP security service"}),
("kerberos",
@ -462,10 +462,11 @@ class ManilaApiTests(base.APITestCase):
def test_security_service_create(self, ss_type, kwargs):
expected_kwargs = {
"dns_ip": None,
"ou": None,
"server": None,
"domain": None,
"user": None,
"password": None,
"user": None,
"name": None,
"description": None
}
@ -478,33 +479,25 @@ class ManilaApiTests(base.APITestCase):
ss_type, **expected_kwargs)
@ddt.data(
{"dns_ip": "8.8.4.4",
{"dns_ip": "8.8.4.4", "ou": "testOU",
"server": "10.254.0.3", "domain": "None",
"password": "wr67p6", "user": "demo",
"name": "my_fake_ldap_security_service_2",
"description": "LDAP security service 2"},
{"server": "10.254.0.10",
"user": "demo", "password": "n0_m0r3_s3cr37",
{"dns_ip": "None", "ou": "None",
"server": "10.254.0.10", "domain": "None",
"password": "None", "user": "demo",
"name": "my_fake_kerberos_security_service_2",
"description": "Kerberos security service 2"}
)
def test_security_service_update(self, kwargs):
sec_service_id = "fake_sec_service_id"
expected_kwargs = {
"dns_ip": None,
"server": None,
"domain": None,
"user": None,
"password": None,
"name": None,
"description": None
}
expected_kwargs.update(**kwargs)
api.security_service_update(self.request, sec_service_id, **kwargs)
mock_sec_service_update = self.manilaclient.security_services.update
mock_sec_service_update.assert_called_once_with(
sec_service_id, **expected_kwargs)
sec_service_id, **kwargs)
def test_security_service_delete(self):
sec_service_id = "fake_sec_service_id"

View File

@ -56,6 +56,7 @@ class SecurityServicesTests(test.BaseAdminViewTests):
self.assertContains(res, "<dd>%s</dd>" % sec_service.user, 1, 200)
self.assertContains(res, "<dd>%s</dd>" % sec_service.server, 1, 200)
self.assertContains(res, "<dd>%s</dd>" % sec_service.dns_ip, 1, 200)
self.assertContains(res, "<dd>%s</dd>" % sec_service.ou, 1, 200)
self.assertContains(res, "<dd>%s</dd>" % sec_service.domain, 1, 200)
self.assertNoMessages()
api_manila.security_service_get.assert_called_once_with(

View File

@ -37,6 +37,7 @@ class SecurityServicesViewTests(test.TestCase):
'description': 'This is test security service',
'method': 'CreateForm',
'dns_ip': '1.2.3.4',
'ou': 'someOU',
'user': 'SomeUser',
'password': 'safepass',
'confirm_password': 'safepass',
@ -94,6 +95,7 @@ class SecurityServicesViewTests(test.TestCase):
self.assertContains(res, "<dd>%s</dd>" % sec_service.user, 1, 200)
self.assertContains(res, "<dd>%s</dd>" % sec_service.server, 1, 200)
self.assertContains(res, "<dd>%s</dd>" % sec_service.dns_ip, 1, 200)
self.assertContains(res, "<dd>%s</dd>" % sec_service.ou, 1, 200)
self.assertContains(res, "<dd>%s</dd>" % sec_service.domain, 1, 200)
self.assertNoMessages()
api_manila.security_service_get.assert_called_once_with(
@ -141,6 +143,13 @@ class SecurityServicesViewTests(test.TestCase):
'method': 'UpdateForm',
'name': sec_service.name,
'description': sec_service.description,
'dns_ip': sec_service.dns_ip,
'ou': sec_service.ou,
'server': sec_service.server,
'domain': sec_service.domain,
'password': sec_service.password,
'confirm_password': sec_service.password,
'user': sec_service.user,
}
self.mock_object(api_manila, "security_service_update")
self.mock_object(
@ -156,4 +165,10 @@ class SecurityServicesViewTests(test.TestCase):
mock.ANY,
sec_service.id,
name=formData['name'],
description=formData['description'])
description=formData['description'],
dns_ip=formData['dns_ip'],
ou=formData['ou'],
server=formData['server'],
domain=formData['domain'],
password=formData['password'],
user=formData['user'])

View File

@ -260,6 +260,7 @@ sec_service = security_services.SecurityService(
{'id': '7f3d1c33-8d10-4511-29df-a2def31f3b5d',
'server': '1.1.1.1',
'dns_ip': '2.2.2.2',
'ou': 'someOU',
'user': 'someuser',
'password': 'somepass',
'type': 'active_directory',

View File

@ -0,0 +1,5 @@
---
features:
- |
Added ou field to security_service object. Additionally added options to update dns_ip,
ou, server, domain, password and user fields.