def handle(self, request, data): try: set_dict, unset_list = utils.parse_str_meta(data['extra_specs']) if set_dict: manila.share_type_set_extra_specs(request, self.initial["id"], set_dict) if unset_list: get = manila.share_type_get_extra_specs( request, self.initial["id"]) # NOTE(vponomaryov): skip keys that are already unset to_unset = set(unset_list).intersection(set(get.keys())) if to_unset: manila.share_type_unset_extra_specs( request, self.initial["id"], to_unset) msg = _("Successfully updated extra specs for share type '%s'.") msg = msg % self.initial['name'] messages.success(request, msg) return True except ValidationError as e: # handle error without losing dialog self.api_error(e.messages[0]) return False except Exception: msg = _("Unable to update extra_specs for share type.") exceptions.handle(request, msg) return False
def handle(self, request, data): share_id = self.initial['share_id'] metadata = {} try: set_dict, unset_list = utils.parse_str_meta(data['metadata']) if unset_list: msg = _("Expected only pairs of key=value.") raise ValidationError(message=msg) metadata = set_dict except ValidationError as e: self.api_error(e.messages[0]) return False try: manila.share_allow(request, share_id, access_to=data['access_to'], access_type=data['access_type'], access_level=data['access_level'], metadata=metadata) message = _('Creating rule for "%s"') % data['access_to'] messages.success(request, message) return True except Exception: redirect = reverse("horizon:project:shares:manage_rules", args=[self.initial['share_id']]) exceptions.handle(request, _('Unable to add rule.'), redirect=redirect)
def handle(self, request, data): try: set_dict, unset_list = utils.parse_str_meta(data['extra_specs']) if set_dict: manila.share_type_set_extra_specs( request, self.initial["id"], set_dict) if unset_list: get = manila.share_type_get_extra_specs( request, self.initial["id"]) # NOTE(vponomaryov): skip keys that are already unset to_unset = set(unset_list).intersection(set(get.keys())) if to_unset: manila.share_type_unset_extra_specs( request, self.initial["id"], to_unset) msg = _("Successfully updated extra specs for share type '%s'.") msg = msg % self.initial['name'] messages.success(request, msg) return True except ValidationError as e: # handle error without losing dialog self.api_error(e.messages[0]) return False except Exception: msg = _("Unable to update extra_specs for share type.") exceptions.handle(request, msg) return False
def handle(self, request, data): try: set_dict, unset_list = utils.parse_str_meta(data['group_specs']) if unset_list: msg = _("Expected only pairs of key=value.") raise ValidationError(message=msg) is_public = ( self.enable_public_share_group_type_creation and data["is_public"]) share_group_type = manila.share_group_type_create( request, data["name"], share_types=data['share_types'], is_public=is_public) if set_dict: manila.share_group_type_set_specs( request, share_group_type.id, set_dict) msg = _("Successfully created share group type: " "%s") % share_group_type.name messages.success(request, msg) return True except ValidationError as e: # handle error without losing dialog self.api_error(e.messages[0]) return False except Exception: exceptions.handle(request, _('Unable to create share group type.')) return False
def handle(self, request, data): try: spec_dhss = data['spec_driver_handles_share_servers'].lower() allowed_dhss_values = ('true', 'false') if spec_dhss not in allowed_dhss_values: msg = _("Improper value set to required extra spec " "'spec_driver_handles_share_servers'. " "Allowed values are %s. " "Case insensitive.") % allowed_dhss_values raise ValidationError(message=msg) set_dict, unset_list = utils.parse_str_meta(data['extra_specs']) if unset_list: msg = _("Expected only pairs of key=value.") raise ValidationError(message=msg) is_public = (self.enable_public_share_type_creation and data["is_public"]) share_type = manila.share_type_create( request, data["name"], spec_dhss, is_public=is_public) if set_dict: manila.share_type_set_extra_specs( request, share_type.id, set_dict) msg = _("Successfully created share type: %s") % share_type.name messages.success(request, msg) return True except ValidationError as e: # handle error without losing dialog self.api_error(e.messages[0]) return False except Exception: exceptions.handle(request, _('Unable to create share type.')) return False
def handle(self, request, data): try: snapshot_id = None source_type = data.get('share_source_type', None) share_network = data.get('share_network', None) if (data.get("snapshot", None) and source_type in [None, 'snapshot']): # Create from Snapshot snapshot = self.get_snapshot(request, data["snapshot"]) snapshot_id = snapshot.id if (data['size'] < snapshot.size): error_message = _('The share size cannot be less than the ' 'snapshot size (%sGiB)') % snapshot.size raise ValidationError(error_message) else: data['size'] = int(data['size']) metadata = {} try: set_dict, unset_list = utils.parse_str_meta(data['metadata']) if unset_list: msg = _("Expected only pairs of key=value.") raise ValidationError(message=msg) metadata = set_dict 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'], name=data['name'], description=data['description'], proto=data['share_proto'], share_network=share_network, snapshot_id=snapshot_id, share_type=data['share_type'], is_public=is_public, metadata=metadata, availability_zone=data['availability_zone'], share_group_id=data.get('sg') or None, ) message = _('Creating share "%s"') % data['name'] messages.success(request, message) return share except ValidationError as e: self.api_error(e.messages[0]) except m_exceptions.BadRequest as e: self.api_error(_("Unable to create share. %s") % e.message) except Exception: exceptions.handle(request, ignore=True) self.api_error(_("Unable to create share.")) return False
def handle(self, request, data): share_id = self.initial['share_id'] try: share = manila.share_get(self.request, share_id) set_dict, unset_list = utils.parse_str_meta(data['metadata']) if set_dict: manila.share_set_metadata(request, share, set_dict) if unset_list: manila.share_delete_metadata(request, share, unset_list) message = _('Updating share metadata "%s"') % share.name messages.success(request, message) return True except ValidationError as e: self.api_error(e.messages[0]) return False except Exception: redirect = reverse("horizon:project:shares:index") exceptions.handle(request, _('Unable to update share metadata.'), redirect=redirect)
def handle(self, request, data): rule_id = self.initial['rule_id'] try: rule = manila.share_rule_get(self.request, rule_id) set_dict, unset_list = utils.parse_str_meta(data['metadata']) if set_dict: manila.share_rule_set_metadata(request, rule, set_dict) if unset_list: manila.share_rule_unset_metadata(request, rule, unset_list) message = _('Updating share access rule metadata ') messages.success(request, message) return True except ValidationError as e: self.api_error(e.messages[0]) return False except Exception: redirect = reverse("horizon:project:shares:manage_rules", args=[self.initial['share_id']]) exceptions.handle(request, _('Unable to update rule metadata.'), redirect=redirect)
def handle(self, request, data): try: driver_options = data.get('driver_options') or {} driver_options_error_msg = _( "Got improper value for field 'driver_options'. " "Expected only pairs of key=value.") if driver_options and isinstance(driver_options, str): try: set_dict, unset_list = utils.parse_str_meta(driver_options) if unset_list: raise ValidationError(message=driver_options_error_msg) driver_options = set_dict except ValidationError as e: self.api_error(e.messages[0]) return False elif not isinstance(driver_options, dict): self.api_error(driver_options_error_msg) return False manila.share_manage( request, service_host=data['host'], protocol=data['protocol'], export_path=data['export_location'], driver_options=driver_options, share_type=data['share_type'], name=data['name'], description=data['description'], is_public=data['is_public']) share_name = data.get('name', data.get('id')) messages.success( request, _('Successfully sent the request to manage share: %s') % share_name) return True except Exception: exceptions.handle(request, _("Unable to manage share")) return False
def handle(self, request, data): try: driver_options = data.get('driver_options') or {} driver_options_error_msg = _( "Got improper value for field 'driver_options'. " "Expected only pairs of key=value.") if driver_options and isinstance(driver_options, six.string_types): try: set_dict, unset_list = utils.parse_str_meta(driver_options) if unset_list: raise ValidationError(message=driver_options_error_msg) driver_options = set_dict except ValidationError as e: self.api_error(e.messages[0]) return False elif not isinstance(driver_options, dict): self.api_error(driver_options_error_msg) return False manila.share_manage( request, service_host=data['host'], protocol=data['protocol'], export_path=data['export_location'], driver_options=driver_options, share_type=data['share_type'], name=data['name'], description=data['description'], is_public=data['is_public']) share_name = data.get('name', data.get('id')) messages.success( request, _('Successfully sent the request to manage share: %s') % share_name) return True except Exception: exceptions.handle(request, _("Unable to manage share")) return False
def handle(self, request, data): try: spec_dhss = data['spec_driver_handles_share_servers'].lower() allowed_dhss_values = ('true', 'false') if spec_dhss not in allowed_dhss_values: msg = _("Improper value set to required extra spec " "'spec_driver_handles_share_servers'. " "Allowed values are %s. " "Case insensitive.") % allowed_dhss_values raise ValidationError(message=msg) set_dict, unset_list = utils.parse_str_meta(data['extra_specs']) if unset_list: msg = _("Expected only pairs of key=value.") raise ValidationError(message=msg) is_public = (self.enable_public_share_type_creation and data["is_public"]) share_type = manila.share_type_create( request, data["name"], spec_dhss, description=data["description"], is_public=is_public) if set_dict: manila.share_type_set_extra_specs(request, share_type.id, set_dict) msg = _("Successfully created share type: %s") % share_type.name messages.success(request, msg) return True except ValidationError as e: # handle error without losing dialog self.api_error(e.messages[0]) return False except Exception: exceptions.handle(request, _('Unable to create share type.')) return False
def handle(self, request, data): try: # usages = quotas.tenant_limit_usages(self.request) # availableGB = usages['maxTotalShareGigabytes'] - \ # usages['gigabytesUsed'] # availableVol = usages['maxTotalShares'] - usages['sharesUsed'] snapshot_id = None source_type = data.get('share_source_type', None) share_network = data.get('share_network', None) if (data.get("snapshot", None) and source_type in [None, 'snapshot']): # Create from Snapshot snapshot = self.get_snapshot(request, data["snapshot"]) snapshot_id = snapshot.id if (data['size'] < snapshot.size): error_message = _('The share size cannot be less than the ' 'snapshot size (%sGiB)') % snapshot.size raise ValidationError(error_message) else: if type(data['size']) is str: data['size'] = int(data['size']) # # if availableGB < data['size']: # error_message = _('A share of %(req)iGB cannot be created as ' # 'you only have %(avail)iGB of your quota ' # 'available.') # params = {'req': data['size'], # 'avail': availableGB} # raise ValidationError(error_message % params) # elif availableVol <= 0: # error_message = _('You are already using all of your ' # 'available' # ' shares.') # raise ValidationError(error_message) metadata = {} try: set_dict, unset_list = utils.parse_str_meta(data['metadata']) if unset_list: msg = _("Expected only pairs of key=value.") raise ValidationError(message=msg) metadata = set_dict except ValidationError as e: self.api_error(e.messages[0]) return False share = manila.share_create( request, size=data['size'], name=data['name'], description=data['description'], proto=data['share_proto'], share_network=share_network, snapshot_id=snapshot_id, share_type=data['share_type'], is_public=data['is_public'], metadata=metadata, availability_zone=data['availability_zone']) message = _('Creating share "%s"') % data['name'] messages.success(request, message) return share except ValidationError as e: self.api_error(e.messages[0]) return False except Exception: exceptions.handle(request, ignore=True) self.api_error(_("Unable to create share.")) return False
def test_parse_str_meta_success(self, input_data, expect_set_dict, expected_unset_list): set_dict, unset_list = utils.parse_str_meta(input_data) self.assertEqual(expect_set_dict, set_dict) self.assertEqual(expected_unset_list, unset_list)
def test_parse_str_meta_success( self, input_data, expect_set_dict, expected_unset_list): set_dict, unset_list = utils.parse_str_meta(input_data) self.assertEqual(expect_set_dict, set_dict) self.assertEqual(expected_unset_list, unset_list)
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_group_id=None, 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)
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_group_id=None, 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)