Disable creation of public shares per configuration

Fix [1] for bug [2] disabled creating of public share types
per configuration but did not address the part of the bug
that required disabling of public *share* creation per
configuration.

Fix that here.

[1] Ia3808486b8604270127c22d45e455e1955b36dba
[2] https://bugs.launchpad.net/manila-ui/+bug/1593057

Change-Id: I0c256d0007395e659f804e8874424f4148021ca8
Closes-bug: #1650610
This commit is contained in:
Tom Barron 2016-12-14 13:52:35 -05:00
parent 43bbdcdb1f
commit a29fe60314
2 changed files with 152 additions and 6 deletions

View File

@ -13,6 +13,7 @@
# License for the specific language governing permissions and limitations
# under the License.
from django.conf import settings
from django.core.urlresolvers import reverse
from django.forms import ValidationError # noqa
from django.template.defaultfilters import filesizeformat # noqa
@ -46,6 +47,9 @@ class CreateForm(forms.SelfHandlingForm):
def __init__(self, request, *args, **kwargs):
super(CreateForm, self).__init__(request, *args, **kwargs)
manila_features = getattr(settings, 'OPENSTACK_MANILA_FEATURES', {})
self.enable_public_shares = manila_features.get(
'enable_public_shares', True)
share_protos = ('NFS', 'CIFS', 'GlusterFS', 'HDFS', 'CephFS')
share_networks = manila.share_network_list(request)
share_types = manila.share_type_list(request)
@ -94,10 +98,12 @@ class CreateForm(forms.SelfHandlingForm):
self.fields['metadata'] = forms.CharField(
label=_("Metadata"), required=False,
widget=forms.Textarea(attrs={'rows': 4}))
self.fields['is_public'] = forms.BooleanField(
label=_("Make visible for all"), required=False,
help_text=(
"If set then all tenants will be able to see this share."))
if self.enable_public_shares:
self.fields['is_public'] = forms.BooleanField(
label=_("Make visible for all"), required=False,
help_text=(
"If set then all tenants will be able to see this share."))
self.fields['share_proto'].choices = [(sp, sp) for sp in share_protos]
if "snapshot_id" in request.GET:
@ -215,6 +221,7 @@ class CreateForm(forms.SelfHandlingForm):
except ValidationError as e:
self.api_error(e.messages[0])
return False
is_public = self.enable_public_shares and data['is_public']
share = manila.share_create(
request,
size=data['size'],
@ -224,7 +231,7 @@ class CreateForm(forms.SelfHandlingForm):
share_network=share_network,
snapshot_id=snapshot_id,
share_type=data['share_type'],
is_public=data['is_public'],
is_public=is_public,
metadata=metadata,
availability_zone=data['availability_zone'])
message = _('Creating share "%s"') % data['name']
@ -254,13 +261,22 @@ class UpdateForm(forms.SelfHandlingForm):
widget=forms.Select(
attrs={'class': 'switched', 'data-slug': 'sharetype'}))
def __init__(self, request, *args, **kwargs):
super(UpdateForm, self).__init__(request, *args, **kwargs)
manila_features = getattr(settings, 'OPENSTACK_MANILA_FEATURES', {})
self.enable_public_shares = manila_features.get(
'enable_public_shares', True)
if not self.enable_public_shares:
self.fields.pop('is_public')
def handle(self, request, data):
share_id = self.initial['share_id']
is_public = data['is_public'] if self.enable_public_shares else False
try:
share = manila.share_get(self.request, share_id)
manila.share_update(
request, share, data['name'], data['description'],
is_public=data['is_public'])
is_public=is_public)
message = _('Updating share "%s"') % data['name']
messages.success(request, message)
return True

View File

@ -13,11 +13,15 @@
# under the License.
import ddt
from django.core.handlers import wsgi
from django.core.urlresolvers import reverse
import mock
import six
from horizon import messages as horizon_messages
from manila_ui.api import manila as api_manila
from manila_ui.dashboards.project.shares.shares import forms
from manila_ui.dashboards import utils
from manila_ui.tests.dashboards.project.shares import test_data
from manila_ui.tests import helpers as test
@ -489,3 +493,129 @@ class ShareViewTests(test.TestCase):
api_manila.share_set_metadata.assert_called_once_with(
mock.ANY, share, form_data['metadata'])
self.assertRedirectsNoFollow(res, SHARE_INDEX_URL)
@ddt.ddt
class ShareViewFormTests(ShareViewTests, test.APITestCase):
def setUp(self):
super(ShareViewFormTests, self).setUp()
FAKE_ENVIRON = {'REQUEST_METHOD': 'GET', 'wsgi.input': 'fake_input'}
self.request = wsgi.WSGIRequest(FAKE_ENVIRON)
self.mock_object(
horizon_messages, "success",
mock.Mock())
@ddt.data((True, True), (True, False), (False, False))
@ddt.unpack
def test_enable_public_share_creation(self,
enable_public_shares,
is_public):
def _get_form(**kwargs):
return forms.CreateForm(self.request, **kwargs)
self.mock_object(
api_manila, "share_create", mock.Mock(return_value=self.share))
self.mock_object(
api_manila, "share_snapshot_list", mock.Mock(return_value=[]))
self.mock_object(
api_manila, "share_network_list",
mock.Mock(return_value=[test_data.active_share_network]))
self.mock_object(
api_manila, "share_type_list",
mock.Mock(return_value=[self.fake_share_type, ]))
self.mock_object(
api_manila, "availability_zone_list",
mock.Mock(return_value=[self.FakeAZ('fake_az'), ]))
data = {
'name': u'new_share',
'description': u'This is test share',
'method': u'CreateForm',
'share_network': test_data.active_share_network.id,
'size': 1,
'share_proto': u'NFS',
'share_type': 'fake',
'share-network-choices-fake': test_data.active_share_network.id,
'availability_zone': 'fake_az',
'metadata': 'key=value',
'snapshot_id': None,
}
if enable_public_shares:
data.update({'is_public': is_public})
with self.settings(OPENSTACK_MANILA_FEATURES={
'enable_public_shares': enable_public_shares}):
form = _get_form()
result = form.handle(self.request, data)
self.assertTrue(result)
self.assertEqual(
enable_public_shares,
form.enable_public_shares)
if enable_public_shares:
self.assertIn("is_public", form.fields)
self.assertTrue(form.fields["is_public"])
else:
self.assertNotIn("is_public", form.fields)
api_manila.share_create.assert_called_once_with(
self.request,
availability_zone=data['availability_zone'],
description=data['description'],
is_public=is_public,
metadata=utils.parse_str_meta(data['metadata'])[0],
name=data['name'],
proto=data['share_proto'],
share_network=test_data.active_share_network.id,
share_type=data['share_type'],
size=data['size'],
snapshot_id=data['snapshot_id'],
)
horizon_messages.success.assert_called_once_with(
self.request, mock.ANY)
@ddt.data((True, True), (True, False), (False, False))
@ddt.unpack
def test_enable_public_share_update(self,
enable_public_shares,
is_public):
def _get_form(initial):
kwargs = {
'prefix': None,
'initial': initial,
}
return forms.UpdateForm(self.request, **kwargs)
initial = {'share_id': 'fake_share_id'}
self.mock_object(
api_manila, "share_update", mock.Mock(return_value=self.share))
data = {
'name': u'old_share',
'description': u'This is test share',
}
if enable_public_shares:
data.update({'is_public': is_public})
with self.settings(OPENSTACK_MANILA_FEATURES={
'enable_public_shares': enable_public_shares}):
form = _get_form(initial)
result = form.handle(self.request, data)
self.assertTrue(result)
self.assertEqual(
enable_public_shares,
form.enable_public_shares)
if enable_public_shares:
self.assertIn("is_public", form.fields)
self.assertTrue(form.fields["is_public"])
else:
self.assertNotIn("is_public", form.fields)
api_manila.share_update.assert_called_once_with(
self.request,
self.share,
data['name'],
data['description'],
is_public=is_public,
)
horizon_messages.success.assert_called_once_with(
self.request, mock.ANY)