Files
manila-ui/manila_ui/api/manila.py
Akihiro Motoki 6b4acf19a7 Use EXTRA_TABS/EXTRA_STEPS mechanism to handle manila quotas
The previous manila-ui approach to show shared-file-system default
quotas is too hacky and fragile as the bug reveals.
This commit applies EXTRA_TABS/EXTRA_STEPS plugin interface
introduced to horizon in Rocky to show the manila quota tab
in the default quotas table and quota related forms.

monkey-patching from manila quotas has been dropped.

Note that EXTRA_STEPS feature is being reviewd in horizon
https://review.openstack.org/#/c/560679/ so workflow steps related to
manila in the project quota form and the default quota form are not
shown until the corresponding horizon feature is merged.
However, this commit will unblock manila-ui CI so I believe this is
a good compromise.

Note that manila support in the project overview panel is dropped
temporarily as further refactoring in the project overview panel
is being done in horizon side (which will land in Rocky-2).

Closes-Bug: #1759340
Co-Authored-By: Victoria Martinez de la Cruz <victoria@redhat.com>
Change-Id: I22ed7d757c5e5e902f1e85a15c33b34de6c609f1
2018-04-15 02:21:22 +00:00

637 lines
21 KiB
Python

# Copyright 2012 United States Government as represented by the
# Administrator of the National Aeronautics and Space Administration.
# All Rights Reserved.
#
# Copyright 2012 OpenStack Foundation
# Copyright 2012 Nebula, Inc.
# Copyright (c) 2012 X.commerce, a business unit of eBay Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
from __future__ import absolute_import
from django.conf import settings
from horizon import exceptions
import logging
from openstack_dashboard.api import base
import six
from manilaclient import client as manila_client
LOG = logging.getLogger(__name__)
MANILA_UI_USER_AGENT_REPR = "manila_ui_plugin_for_horizon"
# NOTE(vponomaryov): update version to 2.34 when manilaclient is released with
# its support. It will allow to show 'availability zones' for share groups.
MANILA_VERSION = "2.32" # requires manilaclient 1.13.0 or newer
MANILA_SERVICE_TYPE = "sharev2"
# API static values
SHARE_STATE_AVAILABLE = "available"
DEFAULT_QUOTA_NAME = 'default'
MANILA_QUOTA_FIELDS = {
"shares",
"share_gigabytes",
"share_snapshots",
"share_snapshot_gigabytes",
"share_networks",
}
def manilaclient(request):
insecure = getattr(settings, 'OPENSTACK_SSL_NO_VERIFY', False)
cacert = getattr(settings, 'OPENSTACK_SSL_CACERT', None)
manila_url = ""
try:
manila_url = base.url_for(request, MANILA_SERVICE_TYPE)
except exceptions.ServiceCatalogException:
LOG.debug('no share service configured.')
return None
LOG.debug('manilaclient connection created using token "%s" and url "%s"' %
(request.user.token.id, manila_url))
c = manila_client.Client(
MANILA_VERSION,
username=request.user.username,
input_auth_token=request.user.token.id,
project_id=request.user.tenant_id,
service_catalog_url=manila_url,
insecure=insecure,
cacert=cacert,
http_log_debug=settings.DEBUG,
user_agent=MANILA_UI_USER_AGENT_REPR,
)
c.client.auth_token = request.user.token.id
c.client.management_url = manila_url
return c
def share_list(request, search_opts=None):
return manilaclient(request).shares.list(search_opts=search_opts)
def share_get(request, share_id):
share_data = manilaclient(request).shares.get(share_id)
return share_data
def share_create(request, size, name, description, proto, snapshot_id=None,
metadata=None, share_network=None, share_type=None,
is_public=None, availability_zone=None, share_group_id=None):
return manilaclient(request).shares.create(
proto, size, name=name, description=description,
share_network=share_network, snapshot_id=snapshot_id,
metadata=metadata, share_type=share_type, is_public=is_public,
availability_zone=availability_zone,
share_group_id=share_group_id,
)
def share_delete(request, share_id, share_group_id=None):
return manilaclient(request).shares.delete(
share_id,
share_group_id=share_group_id,
)
def share_update(request, share_id, name, description, is_public=''):
share_data = {'display_name': name, 'display_description': description}
if not isinstance(is_public, six.string_types):
is_public = six.text_type(is_public)
if is_public and is_public.lower() != 'none':
share_data['is_public'] = is_public
return manilaclient(request).shares.update(share_id, **share_data)
def share_rules_list(request, share_id):
return manilaclient(request).shares.access_list(share_id)
def share_export_location_list(request, share_id):
return manilaclient(request).share_export_locations.list(share_id)
def share_instance_export_location_list(request, share_instance_id):
return manilaclient(request).share_instance_export_locations.list(
share_instance_id)
def share_allow(request, share_id, access_type, access_to, access_level):
return manilaclient(request).shares.allow(
share_id, access_type, access_to, access_level)
def share_deny(request, share_id, rule_id):
return manilaclient(request).shares.deny(share_id, rule_id)
def share_manage(request, service_host, protocol, export_path,
driver_options=None, share_type=None,
name=None, description=None, is_public=False):
return manilaclient(request).shares.manage(
service_host=service_host,
protocol=protocol,
export_path=export_path,
driver_options=driver_options,
share_type=share_type,
name=name,
description=description,
is_public=is_public,
)
def migration_start(request, share, dest_host, force_host_assisted_migration,
writable, preserve_metadata, preserve_snapshots,
nondisruptive, new_share_network_id, new_share_type_id):
return manilaclient(request).shares.migration_start(
share,
host=dest_host,
force_host_assisted_migration=force_host_assisted_migration,
writable=writable,
preserve_metadata=preserve_metadata,
preserve_snapshots=preserve_snapshots,
nondisruptive=nondisruptive,
new_share_network_id=new_share_network_id,
new_share_type_id=new_share_type_id
)
def migration_complete(request, share):
return manilaclient(request).shares.migration_complete(share)
def migration_get_progress(request, share):
return manilaclient(request).shares.migration_get_progress(share)
def migration_cancel(request, share):
return manilaclient(request).shares.migration_cancel(share)
def share_unmanage(request, share):
# Param 'share' can be either string with ID or object with attr 'id'.
return manilaclient(request).shares.unmanage(share)
def share_extend(request, share_id, new_size):
return manilaclient(request).shares.extend(share_id, new_size)
def share_revert(request, share, snapshot):
"""Sends request to revert share to specific snapshot.
This API available only since 2.27 microversion.
:param share: Share class instance or share ID
:param snapshot: ShareSnapshot class instance or share snapshot ID
"""
return manilaclient(request).shares.revert_to_snapshot(share, snapshot)
def share_snapshot_get(request, snapshot_id):
return manilaclient(request).share_snapshots.get(snapshot_id)
def share_snapshot_update(request, snapshot_id, name, description):
snapshot_data = {'display_name': name,
'display_description': description}
return manilaclient(request).share_snapshots.update(
snapshot_id, **snapshot_data)
def share_snapshot_list(request, detailed=True, search_opts=None,
sort_key=None, sort_dir=None):
# Example of 'search_opts' value:
# {'share_id': 'id_of_existing_share'}
return manilaclient(request).share_snapshots.list(
detailed=detailed,
search_opts=search_opts,
sort_key=sort_key,
sort_dir=sort_dir,
)
def share_snapshot_create(request, share_id, name=None,
description=None, force=False):
return manilaclient(request).share_snapshots.create(
share_id, force=force, name=name, description=description)
def share_snapshot_delete(request, snapshot_id):
return manilaclient(request).share_snapshots.delete(snapshot_id)
def share_snapshot_allow(request, snapshot_id, access_type, access_to):
return manilaclient(request).share_snapshots.allow(
snapshot_id, access_type, access_to)
def share_snapshot_deny(request, snapshot_id, rule_id):
return manilaclient(request).share_snapshots.deny(snapshot_id, rule_id)
def share_snapshot_rules_list(request, snapshot_id):
return manilaclient(request).share_snapshots.access_list(snapshot_id)
def share_snap_export_location_list(request, snapshot):
return manilaclient(request).share_snapshot_export_locations.list(
snapshot=snapshot)
def share_snap_instance_export_location_list(request, snapshot_instance):
return manilaclient(request).share_snapshot_export_locations.list(
snapshot_instance=snapshot_instance)
def share_server_list(request, search_opts=None):
return manilaclient(request).share_servers.list(search_opts=search_opts)
def share_server_get(request, share_serv_id):
return manilaclient(request).share_servers.get(share_serv_id)
def share_server_delete(request, share_serv_id):
return manilaclient(request).share_servers.delete(share_serv_id)
def share_network_list(request, detailed=False, search_opts=None):
return manilaclient(request).share_networks.list(detailed=detailed,
search_opts=search_opts)
def share_network_create(request, neutron_net_id=None, neutron_subnet_id=None,
name=None, description=None):
return manilaclient(request).share_networks.create(
neutron_net_id=neutron_net_id, neutron_subnet_id=neutron_subnet_id,
name=name, description=description)
def share_network_get(request, share_net_id):
return manilaclient(request).share_networks.get(share_net_id)
def share_network_update(request, share_net_id, name=None, description=None):
return manilaclient(request).share_networks.update(
share_net_id, name=name, description=description)
def share_network_delete(request, share_network_id):
return manilaclient(request).share_networks.delete(share_network_id)
def security_service_list(request, search_opts=None):
return manilaclient(request).security_services.list(
detailed=True,
search_opts=search_opts)
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,
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,
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):
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,
)
def security_service_delete(request, security_service_id):
return manilaclient(request).security_services.delete(security_service_id)
def share_network_security_service_add(request, share_network_id,
security_service_id):
return manilaclient(request).share_networks.add_security_service(
share_network_id, security_service_id)
def share_network_security_service_remove(request, share_network_id,
security_service_id):
return manilaclient(request).share_networks.remove_security_service(
share_network_id, security_service_id)
def share_network_security_service_list(request, share_network_id):
return manilaclient(request).security_services.list(
search_opts={'share_network_id': share_network_id})
def share_set_metadata(request, share_id, metadata):
return manilaclient(request).shares.set_metadata(share_id, metadata)
def share_delete_metadata(request, share_id, keys):
return manilaclient(request).shares.delete_metadata(share_id, keys)
def tenant_quota_get(request, tenant_id):
return base.QuotaSet(manilaclient(request).quotas.get(tenant_id))
def _map_quota_names_for_update(data):
mapping = {
'share_gigabytes': 'gigabytes',
'share_snapshots': 'snapshots',
'share_snapshot_gigabytes': 'snapshot_gigabytes',
}
for k, v in mapping.items():
if k in data:
data[v] = data.pop(k)
return data
def tenant_quota_update(request, tenant_id, **kwargs):
_map_quota_names_for_update(kwargs)
return manilaclient(request).quotas.update(tenant_id, **kwargs)
def default_quota_get(request, tenant_id):
return base.QuotaSet(manilaclient(request).quotas.defaults(tenant_id))
def default_quota_update(request, **kwargs):
_map_quota_names_for_update(kwargs)
manilaclient(request).quota_classes.update(DEFAULT_QUOTA_NAME, **kwargs)
def share_type_list(request):
return manilaclient(request).share_types.list()
def share_type_get(request, share_type_id):
return manilaclient(request).share_types.get(share_type_id)
def share_type_create(request, name, spec_driver_handles_share_servers,
spec_snapshot_support=True, is_public=True):
return manilaclient(request).share_types.create(
name=name,
spec_driver_handles_share_servers=spec_driver_handles_share_servers,
spec_snapshot_support=spec_snapshot_support,
is_public=is_public)
def share_type_delete(request, share_type_id):
return manilaclient(request).share_types.delete(share_type_id)
def share_type_get_extra_specs(request, share_type_id):
return manilaclient(request).share_types.get(share_type_id).get_keys()
def share_type_set_extra_specs(request, share_type_id, extra_specs):
return manilaclient(request).share_types.get(
share_type_id).set_keys(extra_specs)
def share_type_unset_extra_specs(request, share_type_id, keys):
return manilaclient(request).share_types.get(
share_type_id).unset_keys(keys)
def share_type_access_list(request, share_type_id):
return manilaclient(request).share_type_access.list(share_type_id)
def share_type_access_add(request, share_type_id, project_id):
return manilaclient(request).share_type_access.add_project_access(
share_type_id, project_id)
def share_type_access_remove(request, share_type_id, project_id):
return manilaclient(request).share_type_access.remove_project_access(
share_type_id, project_id)
def share_replica_list(request, share=None):
return manilaclient(request).share_replicas.list(share)
def share_replica_create(request, share, availability_zone,
share_network=None):
return manilaclient(request).share_replicas.create(
share,
availability_zone=availability_zone,
share_network=share_network)
def share_replica_get(request, replica):
return manilaclient(request).share_replicas.get(replica)
def share_replica_delete(request, replica):
return manilaclient(request).share_replicas.delete(replica)
def share_replica_promote(request, replica):
return manilaclient(request).share_replicas.promote(replica)
def share_replica_reset_status(request, replica, status):
return manilaclient(request).share_replicas.reset_state(
replica, status)
def share_replica_reset_state(request, replica, state):
return manilaclient(request).share_replicas.reset_replica_state(
replica, state)
def share_replica_resync(request, replica):
return manilaclient(request).share_replicas.resync(replica)
def tenant_absolute_limits(request):
limits = manilaclient(request).limits.get().absolute
limits_dict = {}
for limit in limits:
# -1 is used to represent unlimited quotas
if limit.value == -1:
limits_dict[limit.name] = float("inf")
else:
limits_dict[limit.name] = limit.value
return limits_dict
def share_instance_list(request):
return manilaclient(request).share_instances.list()
def share_instance_get(request, share_instance_id):
return manilaclient(request).share_instances.get(share_instance_id)
def availability_zone_list(request):
return manilaclient(request).availability_zones.list()
def pool_list(request, detailed=False):
return manilaclient(request).pools.list(detailed=detailed)
# ####### Share Groups # #######
def share_group_create(request, name, description=None,
share_group_type=None,
share_types=None,
share_network=None,
source_share_group_snapshot=None,
availability_zone=None):
return manilaclient(request).share_groups.create(
name=name,
description=description,
share_group_type=share_group_type,
share_types=share_types,
share_network=share_network,
source_share_group_snapshot=source_share_group_snapshot,
availability_zone=availability_zone,
)
def share_group_get(request, share_group):
return manilaclient(request).share_groups.get(share_group)
def share_group_update(request, share_group, name, description):
return manilaclient(request).share_groups.update(
share_group,
name=name,
description=description,
)
def share_group_delete(request, share_group, force=False):
return manilaclient(request).share_groups.delete(share_group, force=force)
def share_group_reset_state(request, share_group, state):
return manilaclient(request).share_groups.reset_state(share_group, state)
def share_group_list(request, detailed=True, search_opts=None, sort_key=None,
sort_dir=None):
return manilaclient(request).share_groups.list(
detailed=detailed,
search_opts=search_opts,
sort_key=sort_key,
sort_dir=sort_dir,
)
# ####### Share Group Snapshots # #######
def share_group_snapshot_create(request, share_group, name, description=None):
return manilaclient(request).share_group_snapshots.create(
share_group=share_group,
name=name,
description=description,
)
def share_group_snapshot_get(request, share_group_snapshot):
return manilaclient(request).share_group_snapshots.get(
share_group_snapshot)
def share_group_snapshot_update(request, share_group_snapshot, name,
description):
return manilaclient(request).share_group_snapshots.update(
share_group_snapshot,
name=name,
description=description,
)
def share_group_snapshot_delete(request, share_group_snapshot, force=False):
return manilaclient(request).share_group_snapshots.delete(
share_group_snapshot, force=force)
def share_group_snapshot_reset_state(request, share_group_snapshot, state):
return manilaclient(request).share_group_snapshots.reset_state(
share_group_snapshot, state)
def share_group_snapshot_list(request, detailed=True, search_opts=None,
sort_key=None, sort_dir=None):
return manilaclient(request).share_group_snapshots.list(
detailed=detailed,
search_opts=search_opts,
sort_key=sort_key,
sort_dir=sort_dir,
)
# ####### Share Group Types # ########
def share_group_type_create(request, name, share_types, is_public=False,
group_specs=None):
return manilaclient(request).share_group_types.create(
name=name, share_types=share_types, is_public=is_public,
group_specs=group_specs)
def share_group_type_get(request, share_group_type):
return manilaclient(request).share_group_types.get(share_group_type)
def share_group_type_list(request, show_all=True):
return manilaclient(request).share_group_types.list(show_all=show_all)
def share_group_type_delete(request, share_group_type):
return manilaclient(request).share_group_types.delete(share_group_type)
def share_group_type_access_list(request, share_group_type):
return manilaclient(request).share_group_type_access.list(share_group_type)
def share_group_type_access_add(request, share_group_type, project):
return manilaclient(request).share_group_type_access.add_project_access(
share_group_type, project)
def share_group_type_access_remove(request, share_group_type, project):
return manilaclient(request).share_group_type_access.remove_project_access(
share_group_type, project)
def share_group_type_set_specs(request, share_group_type, group_specs):
return manilaclient(request).share_group_types.get(
share_group_type).set_keys(group_specs)
def share_group_type_unset_specs(request, share_group_type, keys):
return manilaclient(request).share_group_types.get(
share_group_type).unset_keys(keys)
def share_group_type_get_specs(request, share_group_type):
return manilaclient(request).share_group_types.get(
share_group_type).get_keys()