rally-openstack/rally_openstack/common/services/heat/main.py

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"])