![Andrey Kurilin](/assets/img/avatar_default.png)
rally.plugins.openstack -> rally_openstack - rally_openstack.context -> rally_openstack.contexts rally.plugins.workloads -> rally_openstack/workloads rally.consts -> rally_openstack.consts TODO: fix pep8
79 lines
2.9 KiB
Python
79 lines
2.9 KiB
Python
#
|
|
# 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 cfg
|
|
from rally.common import utils as common_utils
|
|
from rally.task import atomic
|
|
from rally.task import utils
|
|
|
|
CONF = cfg.CONF
|
|
|
|
|
|
class Stack(common_utils.RandomNameGeneratorMixin):
|
|
"""Represent heat stack.
|
|
|
|
Usage:
|
|
>>> stack = Stack(scenario, task, "template.yaml", parameters={"nodes": 3})
|
|
>>> do_testing(stack)
|
|
>>> stack.update(nodes=4)
|
|
>>> do_testing(stack)
|
|
"""
|
|
|
|
def __init__(self, scenario, task, template, files, parameters=None):
|
|
"""Init heat wrapper.
|
|
|
|
:param Scenario scenario: scenario instance
|
|
:param Task task: task instance
|
|
:param str template: template file path
|
|
:param dict files: dict with file name and path
|
|
:param dict parameters: parameters for template
|
|
|
|
"""
|
|
self.scenario = scenario
|
|
self.task = task
|
|
self.template = open(template).read()
|
|
self.files = {}
|
|
self.parameters = parameters
|
|
for name, path in files.items():
|
|
self.files[name] = open(path).read()
|
|
|
|
def _wait(self, ready_statuses, failure_statuses):
|
|
self.stack = utils.wait_for_status(
|
|
self.stack,
|
|
check_interval=CONF.openstack.heat_stack_create_poll_interval,
|
|
timeout=CONF.openstack.heat_stack_create_timeout,
|
|
ready_statuses=ready_statuses,
|
|
failure_statuses=failure_statuses,
|
|
update_resource=utils.get_from_manager(),
|
|
)
|
|
|
|
def create(self):
|
|
with atomic.ActionTimer(self.scenario, "heat.create"):
|
|
self.stack = self.scenario.clients("heat").stacks.create(
|
|
stack_name=self.scenario.generate_random_name(),
|
|
template=self.template,
|
|
files=self.files,
|
|
parameters=self.parameters)
|
|
self.stack_id = self.stack["stack"]["id"]
|
|
self.stack = self.scenario.clients(
|
|
"heat").stacks.get(self.stack_id)
|
|
self._wait(["CREATE_COMPLETE"], ["CREATE_FAILED"])
|
|
|
|
def update(self, data):
|
|
self.parameters.update(data)
|
|
with atomic.ActionTimer(self.scenario, "heat.update"):
|
|
self.scenario.clients("heat").stacks.update(
|
|
self.stack_id, template=self.template,
|
|
files=self.files, parameters=self.parameters)
|
|
self._wait(["UPDATE_COMPLETE"], ["UPDATE_FAILED"])
|