
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
637 lines
21 KiB
Python
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()
|