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:
@@ -28,7 +28,7 @@ from manilaclient import client as manila_client
|
|||||||
LOG = logging.getLogger(__name__)
|
LOG = logging.getLogger(__name__)
|
||||||
|
|
||||||
MANILA_UI_USER_AGENT_REPR = "manila_ui_plugin_for_horizon"
|
MANILA_UI_USER_AGENT_REPR = "manila_ui_plugin_for_horizon"
|
||||||
MANILA_VERSION = "2.41"
|
MANILA_VERSION = "2.44"
|
||||||
MANILA_SERVICE_TYPE = "sharev2"
|
MANILA_SERVICE_TYPE = "sharev2"
|
||||||
|
|
||||||
# API static values
|
# 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)
|
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,
|
domain=None, user=None, password=None, name=None,
|
||||||
description=None):
|
description=None):
|
||||||
return manilaclient(request).security_services.create(
|
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)
|
password=password, name=name, description=description)
|
||||||
|
|
||||||
|
|
||||||
def security_service_update(request, security_service_id, dns_ip=None,
|
def security_service_update(request, security_service_id,
|
||||||
server=None,
|
dns_ip=None, ou=None,
|
||||||
domain=None, user=None, password=None, name=None,
|
server=None, domain=None,
|
||||||
description=None):
|
password=None, user=None,
|
||||||
|
name=None, description=None):
|
||||||
return manilaclient(request).security_services.update(
|
return manilaclient(request).security_services.update(
|
||||||
security_service_id, dns_ip=dns_ip, server=server, domain=domain,
|
security_service_id,
|
||||||
user=user, password=password, name=name, description=description,
|
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):
|
def security_service_delete(request, security_service_id):
|
||||||
|
@@ -44,8 +44,10 @@ class SecurityServicesTable(tables.DataTable):
|
|||||||
name = tables.WrappingColumn(
|
name = tables.WrappingColumn(
|
||||||
"name", verbose_name=_("Name"),
|
"name", verbose_name=_("Name"),
|
||||||
link="horizon:admin:security_services:security_service_detail")
|
link="horizon:admin:security_services:security_service_detail")
|
||||||
|
description = tables.Column("description", verbose_name=_("Description"))
|
||||||
project = tables.Column("project_name", verbose_name=_("Project"))
|
project = tables.Column("project_name", verbose_name=_("Project"))
|
||||||
dns_ip = tables.Column("dns_ip", verbose_name=_("DNS IP"))
|
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"))
|
server = tables.Column("server", verbose_name=_("Server"))
|
||||||
domain = tables.Column("domain", verbose_name=_("Domain"))
|
domain = tables.Column("domain", verbose_name=_("Domain"))
|
||||||
user = tables.Column("user", verbose_name=_("Sid"))
|
user = tables.Column("user", verbose_name=_("Sid"))
|
||||||
|
@@ -26,6 +26,8 @@
|
|||||||
<dl class="dl-horizontal">
|
<dl class="dl-horizontal">
|
||||||
<dt>{% trans "DNS IP" %}</dt>
|
<dt>{% trans "DNS IP" %}</dt>
|
||||||
<dd>{{ sec_service.dns_ip }}</dd>
|
<dd>{{ sec_service.dns_ip }}</dd>
|
||||||
|
<dt>{% trans "Organizational Unit" %}</dt>
|
||||||
|
<dd>{{ sec_service.ou }}</dd>
|
||||||
<dt>{% trans "Server" %}</dt>
|
<dt>{% trans "Server" %}</dt>
|
||||||
<dd>{{ sec_service.server }}</dd>
|
<dd>{{ sec_service.server }}</dd>
|
||||||
<dt>{% trans "Domain" %}</dt>
|
<dt>{% trans "Domain" %}</dt>
|
||||||
|
@@ -27,6 +27,10 @@ from manila_ui.api import manila
|
|||||||
class Create(forms.SelfHandlingForm):
|
class Create(forms.SelfHandlingForm):
|
||||||
name = forms.CharField(max_length="255", label=_("Name"))
|
name = forms.CharField(max_length="255", label=_("Name"))
|
||||||
dns_ip = forms.CharField(max_length="15", label=_("DNS IP"))
|
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"))
|
server = forms.CharField(max_length="255", label=_("Server"))
|
||||||
domain = forms.CharField(max_length="255", label=_("Domain"))
|
domain = forms.CharField(max_length="255", label=_("Domain"))
|
||||||
user = forms.CharField(max_length="255", label=_("User"), required=False)
|
user = forms.CharField(max_length="255", label=_("User"), required=False)
|
||||||
@@ -36,7 +40,8 @@ class Create(forms.SelfHandlingForm):
|
|||||||
required=False)
|
required=False)
|
||||||
confirm_password = forms.CharField(
|
confirm_password = forms.CharField(
|
||||||
label=_("Confirm Password"),
|
label=_("Confirm Password"),
|
||||||
widget=forms.PasswordInput(render_value=False))
|
widget=forms.PasswordInput(render_value=False),
|
||||||
|
required=False)
|
||||||
type = forms.ChoiceField(choices=(("", ""),
|
type = forms.ChoiceField(choices=(("", ""),
|
||||||
("active_directory", "Active Directory"),
|
("active_directory", "Active Directory"),
|
||||||
("ldap", "LDAP"),
|
("ldap", "LDAP"),
|
||||||
@@ -70,15 +75,52 @@ class Create(forms.SelfHandlingForm):
|
|||||||
|
|
||||||
class Update(forms.SelfHandlingForm):
|
class Update(forms.SelfHandlingForm):
|
||||||
name = forms.CharField(max_length="255", label=_("Share Name"))
|
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(
|
description = forms.CharField(
|
||||||
widget=forms.Textarea, label=_("Description"), required=False)
|
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):
|
def handle(self, request, data):
|
||||||
sec_service_id = self.initial['sec_service_id']
|
sec_service_id = self.initial['sec_service_id']
|
||||||
try:
|
try:
|
||||||
manila.security_service_update(request, sec_service_id,
|
manila.security_service_update(
|
||||||
name=data['name'],
|
request, sec_service_id,
|
||||||
description=data['description'])
|
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 '
|
message = _('Successfully updated security service '
|
||||||
'"%s"') % data['name']
|
'"%s"') % data['name']
|
||||||
|
@@ -63,7 +63,9 @@ class SecurityServicesTable(tables.DataTable):
|
|||||||
name = tables.WrappingColumn(
|
name = tables.WrappingColumn(
|
||||||
"name", verbose_name=_("Name"),
|
"name", verbose_name=_("Name"),
|
||||||
link="horizon:project:security_services:security_service_detail")
|
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"))
|
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"))
|
server = tables.Column("server", verbose_name=_("Server"))
|
||||||
domain = tables.Column("domain", verbose_name=_("Domain"))
|
domain = tables.Column("domain", verbose_name=_("Domain"))
|
||||||
user = tables.Column("user", verbose_name=_("User"))
|
user = tables.Column("user", verbose_name=_("User"))
|
||||||
|
@@ -26,6 +26,8 @@
|
|||||||
<dl class="dl-horizontal">
|
<dl class="dl-horizontal">
|
||||||
<dt>{% trans "DNS IP" %}</dt>
|
<dt>{% trans "DNS IP" %}</dt>
|
||||||
<dd>{{ sec_service.dns_ip }}</dd>
|
<dd>{{ sec_service.dns_ip }}</dd>
|
||||||
|
<dt>{% trans "Organizational Unit" %}</dt>
|
||||||
|
<dd>{{ sec_service.ou }}</dd>
|
||||||
<dt>{% trans "Server" %}</dt>
|
<dt>{% trans "Server" %}</dt>
|
||||||
<dd>{{ sec_service.server }}</dd>
|
<dd>{{ sec_service.server }}</dd>
|
||||||
<dt>{% trans "Domain" %}</dt>
|
<dt>{% trans "Domain" %}</dt>
|
||||||
|
@@ -73,14 +73,21 @@ class UpdateView(forms.ModalFormView):
|
|||||||
|
|
||||||
def get_context_data(self, **kwargs):
|
def get_context_data(self, **kwargs):
|
||||||
context = super(UpdateView, self).get_context_data(**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
|
return context
|
||||||
|
|
||||||
def get_initial(self):
|
def get_initial(self):
|
||||||
self.submit_url = reverse(self.submit_url, kwargs=self.kwargs)
|
|
||||||
sec_service = self.get_object()
|
sec_service = self.get_object()
|
||||||
return {'sec_service_id': self.kwargs["sec_service_id"],
|
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,
|
'name': sec_service.name,
|
||||||
'description': sec_service.description}
|
'description': sec_service.description,
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
class CreateView(forms.ModalFormView):
|
class CreateView(forms.ModalFormView):
|
||||||
|
@@ -449,7 +449,7 @@ class ManilaApiTests(base.APITestCase):
|
|||||||
("ldap", {}),
|
("ldap", {}),
|
||||||
("kerberos", {}),
|
("kerberos", {}),
|
||||||
("ldap",
|
("ldap",
|
||||||
{"dns_ip": "8.8.8.8",
|
{"dns_ip": "8.8.8.8", "ou": "fakeOU",
|
||||||
"name": "my_fake_ldap_security_service",
|
"name": "my_fake_ldap_security_service",
|
||||||
"description": "LDAP security service"}),
|
"description": "LDAP security service"}),
|
||||||
("kerberos",
|
("kerberos",
|
||||||
@@ -462,10 +462,11 @@ class ManilaApiTests(base.APITestCase):
|
|||||||
def test_security_service_create(self, ss_type, kwargs):
|
def test_security_service_create(self, ss_type, kwargs):
|
||||||
expected_kwargs = {
|
expected_kwargs = {
|
||||||
"dns_ip": None,
|
"dns_ip": None,
|
||||||
|
"ou": None,
|
||||||
"server": None,
|
"server": None,
|
||||||
"domain": None,
|
"domain": None,
|
||||||
"user": None,
|
|
||||||
"password": None,
|
"password": None,
|
||||||
|
"user": None,
|
||||||
"name": None,
|
"name": None,
|
||||||
"description": None
|
"description": None
|
||||||
}
|
}
|
||||||
@@ -478,33 +479,25 @@ class ManilaApiTests(base.APITestCase):
|
|||||||
ss_type, **expected_kwargs)
|
ss_type, **expected_kwargs)
|
||||||
|
|
||||||
@ddt.data(
|
@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",
|
"name": "my_fake_ldap_security_service_2",
|
||||||
"description": "LDAP security service 2"},
|
"description": "LDAP security service 2"},
|
||||||
{"server": "10.254.0.10",
|
{"dns_ip": "None", "ou": "None",
|
||||||
"user": "demo", "password": "n0_m0r3_s3cr37",
|
"server": "10.254.0.10", "domain": "None",
|
||||||
|
"password": "None", "user": "demo",
|
||||||
"name": "my_fake_kerberos_security_service_2",
|
"name": "my_fake_kerberos_security_service_2",
|
||||||
"description": "Kerberos security service 2"}
|
"description": "Kerberos security service 2"}
|
||||||
)
|
)
|
||||||
def test_security_service_update(self, kwargs):
|
def test_security_service_update(self, kwargs):
|
||||||
sec_service_id = "fake_sec_service_id"
|
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)
|
api.security_service_update(self.request, sec_service_id, **kwargs)
|
||||||
|
|
||||||
mock_sec_service_update = self.manilaclient.security_services.update
|
mock_sec_service_update = self.manilaclient.security_services.update
|
||||||
mock_sec_service_update.assert_called_once_with(
|
mock_sec_service_update.assert_called_once_with(
|
||||||
sec_service_id, **expected_kwargs)
|
sec_service_id, **kwargs)
|
||||||
|
|
||||||
def test_security_service_delete(self):
|
def test_security_service_delete(self):
|
||||||
sec_service_id = "fake_sec_service_id"
|
sec_service_id = "fake_sec_service_id"
|
||||||
|
@@ -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.user, 1, 200)
|
||||||
self.assertContains(res, "<dd>%s</dd>" % sec_service.server, 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.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.assertContains(res, "<dd>%s</dd>" % sec_service.domain, 1, 200)
|
||||||
self.assertNoMessages()
|
self.assertNoMessages()
|
||||||
api_manila.security_service_get.assert_called_once_with(
|
api_manila.security_service_get.assert_called_once_with(
|
||||||
|
@@ -37,6 +37,7 @@ class SecurityServicesViewTests(test.TestCase):
|
|||||||
'description': 'This is test security service',
|
'description': 'This is test security service',
|
||||||
'method': 'CreateForm',
|
'method': 'CreateForm',
|
||||||
'dns_ip': '1.2.3.4',
|
'dns_ip': '1.2.3.4',
|
||||||
|
'ou': 'someOU',
|
||||||
'user': 'SomeUser',
|
'user': 'SomeUser',
|
||||||
'password': 'safepass',
|
'password': 'safepass',
|
||||||
'confirm_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.user, 1, 200)
|
||||||
self.assertContains(res, "<dd>%s</dd>" % sec_service.server, 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.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.assertContains(res, "<dd>%s</dd>" % sec_service.domain, 1, 200)
|
||||||
self.assertNoMessages()
|
self.assertNoMessages()
|
||||||
api_manila.security_service_get.assert_called_once_with(
|
api_manila.security_service_get.assert_called_once_with(
|
||||||
@@ -141,6 +143,13 @@ class SecurityServicesViewTests(test.TestCase):
|
|||||||
'method': 'UpdateForm',
|
'method': 'UpdateForm',
|
||||||
'name': sec_service.name,
|
'name': sec_service.name,
|
||||||
'description': sec_service.description,
|
'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(api_manila, "security_service_update")
|
||||||
self.mock_object(
|
self.mock_object(
|
||||||
@@ -156,4 +165,10 @@ class SecurityServicesViewTests(test.TestCase):
|
|||||||
mock.ANY,
|
mock.ANY,
|
||||||
sec_service.id,
|
sec_service.id,
|
||||||
name=formData['name'],
|
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'])
|
||||||
|
@@ -260,6 +260,7 @@ sec_service = security_services.SecurityService(
|
|||||||
{'id': '7f3d1c33-8d10-4511-29df-a2def31f3b5d',
|
{'id': '7f3d1c33-8d10-4511-29df-a2def31f3b5d',
|
||||||
'server': '1.1.1.1',
|
'server': '1.1.1.1',
|
||||||
'dns_ip': '2.2.2.2',
|
'dns_ip': '2.2.2.2',
|
||||||
|
'ou': 'someOU',
|
||||||
'user': 'someuser',
|
'user': 'someuser',
|
||||||
'password': 'somepass',
|
'password': 'somepass',
|
||||||
'type': 'active_directory',
|
'type': 'active_directory',
|
||||||
|
@@ -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.
|
Reference in New Issue
Block a user