import datetime
import getpass
import logging
+
import socket
import time
import heatclient
import pkg_resources
-from oslo_serialization import jsonutils
+
from oslo_utils import encodeutils
import yardstick.common.openstack_utils as op_utils
HEAT_KEY_UUID_LENGTH = 8
+PROVIDER_SRIOV = "sriov"
+
def get_short_key_uuid(uuid):
return str(uuid)[:HEAT_KEY_UUID_LENGTH]
class HeatObject(object):
- """ base class for template and stack"""
+ """base class for template and stack"""
def __init__(self):
self._heat_client = None
class HeatStack(HeatObject):
- """ Represents a Heat stack (deployed template) """
+ """Represents a Heat stack (deployed template) """
stacks = []
def __init__(self, name):
log.debug("template object '%s' created", name)
- def add_network(self, 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)
+ if provider is None:
+ self.resources[name] = {
+ 'type': 'OS::Neutron::Net',
+ 'properties': {'name': name}
+ }
+ else:
+ self.resources[name] = {
+ 'type': 'OS::Neutron::ProviderNet',
+ 'properties': {
+ 'name': name,
+ 'network_type': 'vlan',
+ 'physical_network': physical_network
+ }
+ }
+
+ def add_server_group(self, name, policies): # pragma: no cover
+ """add to the template a ServerGroup"""
+ log.debug("adding Nova::ServerGroup '%s'", name)
+ policies = policies if isinstance(policies, list) else [policies]
self.resources[name] = {
- 'type': 'OS::Neutron::Net',
- 'properties': {'name': name}
+ 'type': 'OS::Nova::ServerGroup',
+ 'properties': {'name': name,
+ 'policies': policies}
}
def add_subnet(self, name, network, cidr):
def add_router(self, name, ext_gw_net, subnet_name):
"""add to the template a Neutron Router and interface"""
log.debug("adding Neutron::Router:'%s', gw-net:'%s'", name, ext_gw_net)
-
self.resources[name] = {
'type': 'OS::Neutron::Router',
'depends_on': [subnet_name],
"""add to the template a Neutron RouterInterface and interface"""
log.debug("adding Neutron::RouterInterface '%s' router:'%s', "
"subnet:'%s'", name, router_name, subnet_name)
-
self.resources[name] = {
'type': 'OS::Neutron::RouterInterface',
'depends_on': [router_name, subnet_name],
}
}
- def add_port(self, name, network_name, subnet_name, sec_group_id=None):
+ def add_port(self, name, network_name, subnet_name, sec_group_id=None,
+ provider=None):
"""add to the template a named Neutron Port"""
log.debug("adding Neutron::Port '%s', network:'%s', subnet:'%s', "
"secgroup:%s", name, network_name, subnet_name, sec_group_id)
}
}
+ if provider == PROVIDER_SRIOV:
+ self.resources[name]['properties']['binding:vnic_type'] = \
+ 'direct'
+
if sec_group_id:
self.resources[name]['depends_on'].append(sec_group_id)
self.resources[name]['properties']['security_groups'] = \
'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}}
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
stack = HeatStack(self.name)
heat = self._get_heat_client()
- json_template = jsonutils.dump_as_bytes(
- self._template)
start_time = time.time()
stack.uuid = self.uuid = heat.stacks.create(
- stack_name=self.name, template=json_template,
+ stack_name=self.name, template=self._template,
parameters=self.heat_parameters)['stack']['id']
status = self.status()