aboutsummaryrefslogtreecommitdiffstats
path: root/yardstick/orchestrator
diff options
context:
space:
mode:
authorDanielMartinBuckley <daniel.m.buckley@intel.com>2017-04-05 11:20:46 +0100
committerRoss Brattain <ross.b.brattain@intel.com>2017-05-12 21:01:54 +0000
commitd002db9a10fed7cdba2cc43a8c064864250994ce (patch)
tree5cda13ea59ad732c2cd047ebfb0468e6ee425aef /yardstick/orchestrator
parent344921452e405189b8b5ec0697bf5d1ca88eb8ed (diff)
Create flavor from heat context
JIRA: YARDSTICK-582 Create a customizable flavor via heat context. All heat parameters are configurable including Core Affinity. The default flavor name is XXXX-flavor where XXXX is stackname. Flavor attributes are taken from the heat context file. If a flavor attribute is not used it takes default attribute value. If flavor name is not specified it uses the server name + "-flavor" or stack-name + "-flavor". Compute node specific attributes are configurable via "extra_specs" attribute. See https://docs.openstack.org/admin-guide/compute-flavors.html for details. Change-Id: If4015970b889b0b95bfa8eba9491ebf31e92f2c7 Signed-off-by: DanielMartinBuckley <daniel.m.buckley@intel.com>
Diffstat (limited to 'yardstick/orchestrator')
-rw-r--r--yardstick/orchestrator/heat.py66
1 files changed, 55 insertions, 11 deletions
diff --git a/yardstick/orchestrator/heat.py b/yardstick/orchestrator/heat.py
index fa2da5e11..ea9bd1b08 100644
--- a/yardstick/orchestrator/heat.py
+++ b/yardstick/orchestrator/heat.py
@@ -16,11 +16,13 @@ import collections
import datetime
import getpass
import logging
+
import socket
import time
import heatclient
import pkg_resources
+
from oslo_utils import encodeutils
import yardstick.common.openstack_utils as op_utils
@@ -39,7 +41,7 @@ def get_short_key_uuid(uuid):
class HeatObject(object):
- """ base class for template and stack"""
+ """base class for template and stack"""
def __init__(self):
self._heat_client = None
@@ -65,7 +67,7 @@ class HeatObject(object):
class HeatStack(HeatObject):
- """ Represents a Heat stack (deployed template) """
+ """Represents a Heat stack (deployed template) """
stacks = []
def __init__(self, name):
@@ -190,6 +192,40 @@ class HeatTemplate(HeatObject):
log.debug("template object '%s' created", name)
+ def add_flavor(self, name, vcpus=1, ram=1024, disk=1, ephemeral=0,
+ is_public=True, rxtx_factor=1.0, swap=0,
+ extra_specs=None):
+ """add to the template a Flavor description"""
+ if name is None:
+ name = 'auto'
+ log.debug("adding Nova::Flavor '%s' vcpus '%d' ram '%d' disk '%d' " +
+ "ephemeral '%d' is_public '%s' rxtx_factor '%d' " +
+ "swap '%d' extra_specs '%s' ",
+ name, vcpus, ram, disk, ephemeral, is_public,
+ rxtx_factor, swap, str(extra_specs))
+
+ if extra_specs:
+ assert isinstance(extra_specs, collections.Mapping)
+
+ self.resources[name] = {
+ 'type': 'OS::Nova::Flavor',
+ 'properties': {'name': name,
+ 'disk': disk,
+ 'vcpus': vcpus,
+ 'swap': swap,
+ 'flavorid': name,
+ 'rxtx_factor': rxtx_factor,
+ 'ram': ram,
+ 'is_public': is_public,
+ 'ephemeral': ephemeral,
+ 'extra_specs': extra_specs}
+ }
+
+ self._template['outputs'][name] = {
+ 'description': 'Flavor %s ID' % name,
+ 'value': {'get_resource': name}
+ }
+
def add_network(self, name, physical_network='physnet1', provider=None):
"""add to the template a Neutron Net"""
log.debug("adding Neutron::Net '%s'", name)
@@ -397,34 +433,41 @@ class HeatTemplate(HeatObject):
'value': {'get_resource': name}
}
- def add_server(self, name, image, flavor, ports=None, networks=None,
- scheduler_hints=None, user=None, key_name=None,
- user_data=None, metadata=None, additional_properties=None):
+ def add_server(self, name, image, flavor, flavors, ports=None,
+ networks=None, scheduler_hints=None, user=None,
+ key_name=None, user_data=None, metadata=None,
+ additional_properties=None):
"""add to the template a Nova Server"""
log.debug("adding Nova::Server '%s', image '%s', flavor '%s', "
"ports %s", name, image, flavor, ports)
self.resources[name] = {
- 'type': 'OS::Nova::Server'
+ 'type': 'OS::Nova::Server',
+ 'depends_on': []
}
server_properties = {
'name': name,
'image': image,
- 'flavor': flavor,
+ 'flavor': {},
'networks': [] # list of dictionaries
}
+ if flavor in flavors:
+ self.resources[name]['depends_on'].append(flavor)
+ server_properties["flavor"] = {'get_resource': flavor}
+ else:
+ server_properties["flavor"] = flavor
+
if user:
server_properties['admin_user'] = user
if key_name:
- self.resources[name]['depends_on'] = [key_name]
+ self.resources[name]['depends_on'].append(key_name)
server_properties['key_name'] = {'get_resource': key_name}
if ports:
- self.resources[name]['depends_on'] = ports
-
+ self.resources[name]['depends_on'].extend(ports)
for port in ports:
server_properties['networks'].append(
{'port': {'get_resource': port}}
@@ -460,7 +503,8 @@ class HeatTemplate(HeatObject):
def create(self, block=True):
"""creates a template in the target cloud using heat
- returns a dict with the requested output values from the template"""
+ returns a dict with the requested output values from the template
+ """
log.info("Creating stack '%s'", self.name)
# create stack early to support cleanup, e.g. ctrl-c while waiting