Files
rally-openstack/rally_openstack/task/contexts/swift/utils.py
Andrey Kurilin d2f4e9717d Restruct the project
Move all modules under the next structure:

- rally_openstack.common
- rally_openstack.enviromnet
- rally_openstack.task
- rally_openstack.verification

Change-Id: I41702d017cd49b117da3b8e12b19c7327229ae32
2020-03-27 19:06:13 +02:00

147 lines
5.9 KiB
Python

# Copyright 2015: Cisco Systems, 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.
import tempfile
from rally.common import broker
from rally_openstack.task.scenarios.swift import utils as swift_utils
class SwiftObjectMixin(object):
"""Mix-in method for Swift Object Context."""
def _create_containers(self, containers_per_tenant, threads):
"""Create containers and store results in Rally context.
:param containers_per_tenant: int, number of containers to create
per tenant
:param threads: int, number of threads to use for broker pattern
:returns: list of tuples containing (account, container)
"""
containers = []
def publish(queue):
for user, tenant_id in self._iterate_per_tenants():
self.context["tenants"][tenant_id]["containers"] = []
for i in range(containers_per_tenant):
args = (user,
self.context["tenants"][tenant_id]["containers"])
queue.append(args)
def consume(cache, args):
user, tenant_containers = args
if user["id"] not in cache:
cache[user["id"]] = swift_utils.SwiftScenario(
{"user": user, "task": self.context.get("task", {})})
container_name = cache[user["id"]]._create_container()
tenant_containers.append({"user": user,
"container": container_name,
"objects": []})
containers.append((user["tenant_id"], container_name))
broker.run(publish, consume, threads)
return containers
def _create_objects(self, objects_per_container, object_size, threads):
"""Create objects and store results in Rally context.
:param objects_per_container: int, number of objects to create
per container
:param object_size: int, size of created swift objects in byte
:param threads: int, number of threads to use for broker pattern
:returns: list of tuples containing (account, container, object)
"""
objects = []
with tempfile.TemporaryFile() as dummy_file:
# set dummy file to specified object size
dummy_file.truncate(object_size)
def publish(queue):
for tenant_id in self.context["tenants"]:
items = self.context["tenants"][tenant_id]["containers"]
for container in items:
for i in range(objects_per_container):
queue.append(container)
def consume(cache, container):
user = container["user"]
if user["id"] not in cache:
cache[user["id"]] = swift_utils.SwiftScenario(
{"user": user, "task": self.context.get("task", {})})
dummy_file.seek(0)
object_name = cache[user["id"]]._upload_object(
container["container"],
dummy_file)[1]
container["objects"].append(object_name)
objects.append((user["tenant_id"], container["container"],
object_name))
broker.run(publish, consume, threads)
return objects
def _delete_containers(self, threads):
"""Delete containers created by Swift context and update Rally context.
:param threads: int, number of threads to use for broker pattern
"""
def publish(queue):
for tenant_id in self.context["tenants"]:
containers = self.context["tenants"][tenant_id]["containers"]
for container in containers[:]:
args = container, containers
queue.append(args)
def consume(cache, args):
container, tenant_containers = args
user = container["user"]
if user["id"] not in cache:
cache[user["id"]] = swift_utils.SwiftScenario(
{"user": user, "task": self.context.get("task", {})})
cache[user["id"]]._delete_container(container["container"])
tenant_containers.remove(container)
broker.run(publish, consume, threads)
def _delete_objects(self, threads):
"""Delete objects created by Swift context and update Rally context.
:param threads: int, number of threads to use for broker pattern
"""
def publish(queue):
for tenant_id in self.context["tenants"]:
containers = self.context["tenants"][tenant_id]["containers"]
for container in containers:
for object_name in container["objects"][:]:
args = object_name, container
queue.append(args)
def consume(cache, args):
object_name, container = args
user = container["user"]
if user["id"] not in cache:
cache[user["id"]] = swift_utils.SwiftScenario(
{"user": user, "task": self.context.get("task", {})})
cache[user["id"]]._delete_object(container["container"],
object_name)
container["objects"].remove(object_name)
broker.run(publish, consume, threads)