Create a NFS share and Access it from the VM
This Scenario: - create NFS share - launch VM - Attach provider network (StorageNFS) to VM - authorize VM's ip (StorageNFS) to access the share - mount the share inside the VM - write to share - delete VM - delete share In the browbeat-config.yaml, the user needs to provide the network id of the provider network(StorageNFS network) and external network. Change-Id: I6febed2168a1a5e38569500ddb4dbcfa5b1c097b
This commit is contained in:
parent
bb856ce938
commit
a217af06f7
@ -58,6 +58,7 @@ rally:
|
|||||||
- workloads: rally/rally-plugins/workloads
|
- workloads: rally/rally-plugins/workloads
|
||||||
- dynamic-workloads: rally/rally-plugins/dynamic-workloads
|
- dynamic-workloads: rally/rally-plugins/dynamic-workloads
|
||||||
- reports: rally/rally-plugins/reports
|
- reports: rally/rally-plugins/reports
|
||||||
|
- manila: rally/rally-plugins/manila
|
||||||
shaker:
|
shaker:
|
||||||
server: 1.1.1.1
|
server: 1.1.1.1
|
||||||
port: 5555
|
port: 5555
|
||||||
@ -698,3 +699,12 @@ workloads:
|
|||||||
access: "127.0.0.1"
|
access: "127.0.0.1"
|
||||||
access_type: "ip"
|
access_type: "ip"
|
||||||
file: rally/manila/create-share-allow-and-deny-access.yml
|
file: rally/manila/create-share-allow-and-deny-access.yml
|
||||||
|
- name: create-share-boot-vm-mount-share-write-delete-vm-share
|
||||||
|
enabled: true
|
||||||
|
flavor_name: m1.small
|
||||||
|
image_name: centos7
|
||||||
|
user: centos
|
||||||
|
share_type: default
|
||||||
|
provider_net_id:
|
||||||
|
ext_net_id:
|
||||||
|
file: rally/rally-plugins/manila/create-share-boot-vm-mount-share-write-delete-vm-share.yml
|
||||||
|
@ -0,0 +1,159 @@
|
|||||||
|
# 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 rally.common import logging
|
||||||
|
from rally import exceptions
|
||||||
|
from rally.task import types
|
||||||
|
from rally.task import utils as rally_utils
|
||||||
|
from rally.task import validation
|
||||||
|
from rally.task import scenario
|
||||||
|
|
||||||
|
from rally_openstack.common import consts
|
||||||
|
from rally_openstack.task.scenarios.manila import utils
|
||||||
|
from rally_openstack.task.scenarios.vm import utils as vm_utils
|
||||||
|
from rally_openstack.task.scenarios.neutron import utils as neutron_utils
|
||||||
|
|
||||||
|
"""Scenarios for Manila shares."""
|
||||||
|
|
||||||
|
LOG = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
@types.convert(image={"type": "glance_image"},
|
||||||
|
flavor={"type": "nova_flavor"})
|
||||||
|
@validation.add("image_valid_on_flavor", flavor_param="flavor",
|
||||||
|
image_param="image", fail_on_404_image=False)
|
||||||
|
@validation.add("number", param_name="port", minval=1, maxval=65535,
|
||||||
|
nullable=True, integer_only=True)
|
||||||
|
@validation.add("external_network_exists", param_name="floating_network")
|
||||||
|
@validation.add("required_services", services=[consts.Service.MANILA,
|
||||||
|
consts.Service.NEUTRON,
|
||||||
|
consts.Service.NOVA])
|
||||||
|
@validation.add("required_platform", platform="openstack", users=True)
|
||||||
|
@scenario.configure(context={"cleanup@openstack": ["manila", "nova", "neutron"],
|
||||||
|
"keypair@openstack": {},
|
||||||
|
"allow_ssh@openstack": None},
|
||||||
|
name="BrowbeatPlugin.create_share_boot_vm_access_share",
|
||||||
|
platform="openstack")
|
||||||
|
class CreateNFSShareBootVMAndAccessShare(utils.ManilaScenario, vm_utils.VMScenario,
|
||||||
|
neutron_utils.NeutronScenario):
|
||||||
|
def run(self, image, flavor, username, provider_net_id, ext_net_id, size=1, password=None,
|
||||||
|
router_create_args=None, network_create_args=None, subnet_create_args=None,
|
||||||
|
port=22, use_floating_ip=True, force_delete=False, max_log_length=None,
|
||||||
|
**kwargs):
|
||||||
|
"""Create a share and access it from VM.
|
||||||
|
|
||||||
|
- create NFS share
|
||||||
|
- launch VM
|
||||||
|
- Attach provider network (StorageNFS) to VM
|
||||||
|
- authorize VM's ip (StorageNFS) to access the share
|
||||||
|
- mount share inside the VM
|
||||||
|
- write to share
|
||||||
|
- delete VM
|
||||||
|
- delete share
|
||||||
|
|
||||||
|
:param size: share size in GB, should be greater than 0
|
||||||
|
:param image: glance image name to use for the vm
|
||||||
|
:param flavor: VM flavor name
|
||||||
|
:param username: ssh username on server
|
||||||
|
:param provider_net_id: ID of the StorageNFS provider network
|
||||||
|
:param ext_net_id: ID of external network
|
||||||
|
:param password: Password on SSH authentication
|
||||||
|
:param floating_network: external network name, for floating ip
|
||||||
|
:param port: ssh port for SSH connection
|
||||||
|
:param use_floating_ip: bool, floating or fixed IP for SSH connection
|
||||||
|
:param force_delete: whether to use force_delete for servers
|
||||||
|
:param max_log_length: The number of tail nova console-log lines user
|
||||||
|
would like to retrieve
|
||||||
|
:param kwargs: optional args to create a share or a VM
|
||||||
|
"""
|
||||||
|
share_proto = "nfs"
|
||||||
|
share = self._create_share(
|
||||||
|
share_proto=share_proto,
|
||||||
|
size=size,
|
||||||
|
**kwargs)
|
||||||
|
location = self._export_location(share)
|
||||||
|
|
||||||
|
ext_net_name = self.clients("neutron").show_network(
|
||||||
|
ext_net_id)["network"]["name"]
|
||||||
|
router_create_args["tenant_id"] = self.context["tenant"]["id"]
|
||||||
|
router_create_args.setdefault("external_gateway_info",
|
||||||
|
{"network_id": ext_net_id, "enable_snat": True})
|
||||||
|
router = self.admin_clients("neutron").create_router({"router": router_create_args})
|
||||||
|
|
||||||
|
network = self._create_network(network_create_args or {})
|
||||||
|
subnet = self._create_subnet(network, subnet_create_args or {})
|
||||||
|
self._add_interface_router(subnet['subnet'], router['router'])
|
||||||
|
kwargs["nics"] = [{"net-id": network['network']['id']}]
|
||||||
|
|
||||||
|
server, fip = self._boot_server_with_fip(
|
||||||
|
image, flavor, use_floating_ip=use_floating_ip,
|
||||||
|
floating_network=ext_net_name,
|
||||||
|
key_name=self.context["user"]["keypair"]["name"],
|
||||||
|
**kwargs)
|
||||||
|
self._attach_interface(server, net_id=provider_net_id)
|
||||||
|
server = self._show_server(server)
|
||||||
|
|
||||||
|
for net in server.addresses:
|
||||||
|
if str(net) == self.clients("neutron").show_network(provider_net_id)["network"]["name"]:
|
||||||
|
ip = str(server.addresses[net][0]["addr"])
|
||||||
|
self._allow_access_share(share, "ip", ip, "rw")
|
||||||
|
|
||||||
|
mount_opt = "-t nfs -o nfsvers=4.1,proto=tcp"
|
||||||
|
test_data = "Test Data"
|
||||||
|
script = f"sudo cloud-init status -w;" \
|
||||||
|
f"sudo ip add add {ip}/24 dev eth1;" \
|
||||||
|
f"sudo ip link set eth1 up;" \
|
||||||
|
f"sudo mount {mount_opt} {location[0]} /mnt || exit 1;" \
|
||||||
|
f"df -h;" \
|
||||||
|
f"sudo echo {test_data} | sudo tee /mnt/testfile || exit 2"
|
||||||
|
|
||||||
|
command = {
|
||||||
|
"script_inline": script,
|
||||||
|
"interpreter": "/bin/bash"
|
||||||
|
}
|
||||||
|
try:
|
||||||
|
rally_utils.wait_for_status(
|
||||||
|
server,
|
||||||
|
ready_statuses=["ACTIVE"],
|
||||||
|
update_resource=rally_utils.get_from_manager(),
|
||||||
|
)
|
||||||
|
|
||||||
|
code, out, err = self._run_command(
|
||||||
|
fip["ip"], port, username, password, command=command)
|
||||||
|
if code:
|
||||||
|
raise exceptions.ScriptError(
|
||||||
|
"Error running command %(command)s. "
|
||||||
|
"Error %(code)s: %(error)s" % {
|
||||||
|
"command": command, "code": code, "error": err})
|
||||||
|
except (exceptions.TimeoutException,
|
||||||
|
exceptions.SSHTimeout):
|
||||||
|
console_logs = self._get_server_console_output(server,
|
||||||
|
max_log_length)
|
||||||
|
LOG.debug("VM console logs:\n%s" % console_logs)
|
||||||
|
raise
|
||||||
|
|
||||||
|
finally:
|
||||||
|
self._delete_server_with_fip(server, fip,
|
||||||
|
force_delete=force_delete)
|
||||||
|
self._delete_share(share)
|
||||||
|
self._remove_interface_router(subnet['subnet'], router['router'])
|
||||||
|
|
||||||
|
self.add_output(complete={
|
||||||
|
"title": "Script StdOut",
|
||||||
|
"chart_plugin": "TextArea",
|
||||||
|
"data": str(out).split("\n")
|
||||||
|
})
|
||||||
|
if err:
|
||||||
|
self.add_output(complete={
|
||||||
|
"title": "Script StdErr",
|
||||||
|
"chart_plugin": "TextArea",
|
||||||
|
"data": err.split("\n")
|
||||||
|
})
|
@ -0,0 +1,48 @@
|
|||||||
|
{% set image_name = image_name or "centos7" %}
|
||||||
|
{% set flavor_name = flavor_name or "m1.small" %}
|
||||||
|
{% set sla_max_avg_duration = sla_max_avg_duration or 60 %}
|
||||||
|
{% set sla_max_failure = sla_max_failure or 0 %}
|
||||||
|
{% set sla_max_seconds = sla_max_seconds or 60 %}
|
||||||
|
---
|
||||||
|
BrowbeatPlugin.create_share_boot_vm_access_share:
|
||||||
|
-
|
||||||
|
args:
|
||||||
|
size: 1
|
||||||
|
share_type: {{share_type}}
|
||||||
|
flavor:
|
||||||
|
name: {{flavor_name}}
|
||||||
|
image:
|
||||||
|
name: {{image_name}}
|
||||||
|
username: {{user}}
|
||||||
|
provider_net_id: "{{ provider_net_id }}"
|
||||||
|
ext_net_id: "{{ ext_net_id }}"
|
||||||
|
router_create_args: {}
|
||||||
|
network_create_args: {}
|
||||||
|
subnet_create_args: {}
|
||||||
|
runner:
|
||||||
|
type: "constant"
|
||||||
|
times: {{times}}
|
||||||
|
concurrency: {{concurrency}}
|
||||||
|
context:
|
||||||
|
quotas:
|
||||||
|
manila:
|
||||||
|
shares: -1
|
||||||
|
gigabytes: -1
|
||||||
|
nova:
|
||||||
|
instances: -1
|
||||||
|
cores: -1
|
||||||
|
ram: -1
|
||||||
|
neutron:
|
||||||
|
network: -1
|
||||||
|
port: -1
|
||||||
|
router: -1
|
||||||
|
subnet: -1
|
||||||
|
floatingip: -1
|
||||||
|
users:
|
||||||
|
tenants: 1
|
||||||
|
users_per_tenant: 1
|
||||||
|
sla:
|
||||||
|
max_avg_duration: {{ sla_max_avg_duration }}
|
||||||
|
max_seconds_per_iteration: {{ sla_max_seconds }}
|
||||||
|
failure_rate:
|
||||||
|
max: {{ sla_max_failure }}
|
Loading…
x
Reference in New Issue
Block a user