rally/rally/plugins/openstack/scenarios/manila/utils.py

247 lines
9.7 KiB
Python

# Copyright 2015 Mirantis Inc.
# All Rights Reserved.
#
# 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 oslo_config import cfg
from rally.plugins.openstack.context.manila import consts
from rally.plugins.openstack import scenario
from rally.task import atomic
from rally.task import utils
MANILA_BENCHMARK_OPTS = [
cfg.FloatOpt(
"manila_share_create_prepoll_delay",
default=2.0,
help="Delay between creating Manila share and polling for its "
"status."),
cfg.FloatOpt(
"manila_share_create_timeout",
default=300.0,
help="Timeout for Manila share creation."),
cfg.FloatOpt(
"manila_share_create_poll_interval",
default=3.0,
help="Interval between checks when waiting for Manila share "
"creation."),
cfg.FloatOpt(
"manila_share_delete_timeout",
default=180.0,
help="Timeout for Manila share deletion."),
cfg.FloatOpt(
"manila_share_delete_poll_interval",
default=2.0,
help="Interval between checks when waiting for Manila share "
"deletion."),
]
CONF = cfg.CONF
benchmark_group = cfg.OptGroup(name="benchmark", title="benchmark options")
CONF.register_opts(MANILA_BENCHMARK_OPTS, group=benchmark_group)
class ManilaScenario(scenario.OpenStackScenario):
"""Base class for Manila scenarios with basic atomic actions."""
@atomic.action_timer("manila.create_share")
def _create_share(self, share_proto, size=1, **kwargs):
"""Create a share.
:param share_proto: share protocol for new share,
available values are NFS, CIFS, GlusterFS and HDFS.
:param size: size of a share in GB
:param snapshot_id: ID of the snapshot
:param name: name of new share
:param description: description of a share
:param metadata: optional metadata to set on share creation
:param share_network: either instance of ShareNetwork or str with ID
:param share_type: either instance of ShareType or str with ID
:param is_public: defines whether to set share as public or not.
:returns: instance of :class:`Share`
"""
if self.context:
share_networks = self.context.get("tenant", {}).get(
consts.SHARE_NETWORKS_CONTEXT_NAME, {}).get(
"share_networks", [])
if share_networks and not kwargs.get("share_network"):
kwargs["share_network"] = share_networks[
self.context["iteration"] % len(share_networks)]["id"]
if not kwargs.get("name"):
kwargs["name"] = self.generate_random_name()
share = self.clients("manila").shares.create(
share_proto, size, **kwargs)
self.sleep_between(CONF.benchmark.manila_share_create_prepoll_delay)
share = utils.wait_for(
share,
ready_statuses=["available"],
update_resource=utils.get_from_manager(),
timeout=CONF.benchmark.manila_share_create_timeout,
check_interval=CONF.benchmark.manila_share_create_poll_interval,
)
return share
@atomic.action_timer("manila.delete_share")
def _delete_share(self, share):
"""Delete the given share.
:param share: :class:`Share`
"""
share.delete()
error_statuses = ("error_deleting", )
utils.wait_for_status(
share,
ready_statuses=["deleted"],
check_deletion=True,
update_resource=utils.get_from_manager(error_statuses),
timeout=CONF.benchmark.manila_share_delete_timeout,
check_interval=CONF.benchmark.manila_share_delete_poll_interval)
@atomic.action_timer("manila.list_shares")
def _list_shares(self, detailed=True, search_opts=None):
"""Returns user shares list.
:param detailed: defines either to return detailed list of
objects or not.
:param search_opts: container of search opts such as
"name", "host", "share_type", etc.
"""
return self.clients("manila").shares.list(
detailed=detailed, search_opts=search_opts)
@atomic.action_timer("manila.create_share_network")
def _create_share_network(self, neutron_net_id=None,
neutron_subnet_id=None,
nova_net_id=None, description=None):
"""Create share network.
:param neutron_net_id: ID of Neutron network
:param neutron_subnet_id: ID of Neutron subnet
:param nova_net_id: ID of Nova network
:param description: share network description
:returns: instance of :class:`ShareNetwork`
"""
share_network = self.clients("manila").share_networks.create(
neutron_net_id=neutron_net_id,
neutron_subnet_id=neutron_subnet_id,
nova_net_id=nova_net_id,
name=self.generate_random_name(),
description=description)
return share_network
@atomic.action_timer("manila.delete_share_network")
def _delete_share_network(self, share_network):
"""Delete share network.
:param share_network: instance of :class:`ShareNetwork`.
"""
share_network.delete()
utils.wait_for_status(
share_network,
ready_statuses=["deleted"],
check_deletion=True,
update_resource=utils.get_from_manager(),
timeout=CONF.benchmark.manila_share_delete_timeout,
check_interval=CONF.benchmark.manila_share_delete_poll_interval)
@atomic.action_timer("manila.list_share_networks")
def _list_share_networks(self, detailed=True, search_opts=None):
"""List share networks.
:param detailed: defines either to return detailed list of
objects or not.
:param search_opts: container of search opts such as
"project_id" and "name".
:returns: list of instances of :class:`ShareNetwork`
"""
share_networks = self.clients("manila").share_networks.list(
detailed=detailed, search_opts=search_opts)
return share_networks
@atomic.action_timer("manila.list_share_servers")
def _list_share_servers(self, search_opts=None):
"""List share servers. Admin only.
:param search_opts: set of key-value pairs to filter share servers by.
Example: {"share_network": "share_network_name_or_id"}
:returns: list of instances of :class:`ShareServer`
"""
share_servers = self.admin_clients("manila").share_servers.list(
search_opts=search_opts)
return share_servers
@atomic.action_timer("manila.create_security_service")
def _create_security_service(self, security_service_type, dns_ip=None,
server=None, domain=None, user=None,
password=None, description=None):
"""Create security service.
'Security service' is data container in Manila that stores info
about auth services 'Active Directory', 'Kerberos' and catalog
service 'LDAP' that should be used for shares.
:param security_service_type: security service type, permitted values
are 'ldap', 'kerberos' or 'active_directory'.
:param dns_ip: dns ip address used inside tenant's network
:param server: security service server ip address or hostname
:param domain: security service domain
:param user: security identifier used by tenant
:param password: password used by user
:param description: security service description
:returns: instance of :class:`SecurityService`
"""
security_service = self.clients("manila").security_services.create(
type=security_service_type,
dns_ip=dns_ip,
server=server,
domain=domain,
user=user,
password=password,
name=self.generate_random_name(),
description=description)
return security_service
@atomic.action_timer("manila.delete_security_service")
def _delete_security_service(self, security_service):
"""Delete security service.
:param security_service: instance of :class:`SecurityService`.
"""
security_service.delete()
utils.wait_for_status(
security_service,
ready_statuses=["deleted"],
check_deletion=True,
update_resource=utils.get_from_manager(),
timeout=CONF.benchmark.manila_share_delete_timeout,
check_interval=CONF.benchmark.manila_share_delete_poll_interval)
@atomic.action_timer("manila.add_security_service_to_share_network")
def _add_security_service_to_share_network(self, share_network,
security_service):
"""Associate given security service with a share network.
:param share_network: ID or instance of :class:`ShareNetwork`.
:param security_service: ID or instance of :class:`SecurityService`.
:returns: instance of :class:`ShareNetwork`.
"""
share_network = self.clients(
"manila").share_networks.add_security_service(
share_network, security_service)
return share_network