import heatclient.client
import keystoneclient
+from yardstick.common import template_format
+
+
log = logging.getLogger(__name__)
auth_url=os.environ.get('OS_AUTH_URL'),
username=os.environ.get('OS_USERNAME'),
password=os.environ.get('OS_PASSWORD'),
- tenant_name=os.environ.get('OS_TENANT_NAME'))
+ tenant_name=os.environ.get('OS_TENANT_NAME'),
+ cacert=os.environ.get('OS_CACERT'))
return self._keystone_client
class HeatTemplate(HeatObject):
'''Describes a Heat template and a method to deploy template to a stack'''
- def __init__(self, name):
- super(HeatTemplate, self).__init__()
- self.name = name
- self.state = "NOT_CREATED"
- self.keystone_client = None
- self.heat_client = None
-
- # Heat template
+ def _init_template(self):
self._template = {}
self._template['heat_template_version'] = '2013-05-23'
'''Stack built by the yardstick framework for %s on host %s %s.
All referred generated resources are prefixed with the template
name (i.e. %s).''' % (getpass.getuser(), socket.gethostname(),
- timestamp, name)
+ timestamp, self.name)
# short hand for resources part of template
self.resources = self._template['resources'] = {}
self._template['outputs'] = {}
+ def __init__(self, name, template_file=None, heat_parameters=None):
+ super(HeatTemplate, self).__init__()
+ self.name = name
+ self.state = "NOT_CREATED"
+ self.keystone_client = None
+ self.heat_client = None
+ self.heat_parameters = {}
+
+ # heat_parameters is passed to heat in stack create, empty dict when
+ # yardstick creates the template (no get_param in resources part)
+ if heat_parameters:
+ self.heat_parameters = heat_parameters
+
+ if template_file:
+ with open(template_file) as stream:
+ print "Parsing external template:", template_file
+ template_str = stream.read()
+ self._template = template_format.parse(template_str)
+ self._parameters = heat_parameters
+ else:
+ self._init_template()
+
# holds results of requested output after deployment
self.outputs = {}
'properties': {
'name': name,
'fixed_ips': [{'subnet': {'get_resource': subnet_name}}],
- 'network': network_name,
+ 'network_id': {'get_resource': network_name},
'replacement_policy': 'AUTO',
}
}
def add_floating_ip(self, name, network_name, port_name, router_if_name,
secgroup_name=None):
- '''add to the template a Neutron FloatingIP resource
+ '''add to the template a Nova FloatingIP resource
see: https://bugs.launchpad.net/heat/+bug/1299259
'''
- log.debug("adding Neutron::FloatingIP '%s', network '%s', port '%s', "
+ log.debug("adding Nova::FloatingIP '%s', network '%s', port '%s', "
"rif '%s'", name, network_name, port_name, router_if_name)
self.resources[name] = {
- 'type': 'OS::Neutron::FloatingIP',
+ 'type': 'OS::Nova::FloatingIP',
'depends_on': [port_name, router_if_name],
'properties': {
- 'floating_network': network_name,
- 'port_id': {'get_resource': port_name}
+ 'pool': network_name
}
}
self._template['outputs'][name] = {
'description': 'floating ip %s' % name,
- 'value': {'get_attr': [name, 'floating_ip_address']}
+ 'value': {'get_attr': [name, 'ip']}
+ }
+
+ def add_floating_ip_association(self, name, floating_ip_name, port_name):
+ '''add to the template a Nova FloatingIP Association resource
+ '''
+ log.debug("adding Nova::FloatingIPAssociation '%s', server '%s', "
+ "floating_ip '%s'", name, port_name, floating_ip_name)
+
+ self.resources[name] = {
+ 'type': 'OS::Neutron::FloatingIPAssociation',
+ 'depends_on': [port_name],
+ 'properties': {
+ 'floatingip_id': {'get_resource': floating_ip_name},
+ 'port_id': {'get_resource': port_name}
+ }
}
def add_keypair(self, name):
'description': "Group allowing icmp and upd/tcp on all ports",
'rules': [
{'remote_ip_prefix': '0.0.0.0/0',
- 'protocol': 'tcp'},
+ 'protocol': 'tcp',
+ 'port_range_min': '1',
+ 'port_range_max': '65535'},
{'remote_ip_prefix': '0.0.0.0/0',
- 'protocol': 'udp'},
+ 'protocol': 'udp',
+ 'port_range_min': '1',
+ 'port_range_max': '65535'},
{'remote_ip_prefix': '0.0.0.0/0',
'protocol': 'icmp'}
]
}
def add_server(self, name, image, flavor, ports=None, networks=None,
- scheduler_hints=None, key_name=None, user_data=None,
- metadata=None, additional_properties=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)
'networks': [] # list of dictionaries
}
+ if user:
+ server_properties['admin_user'] = user
+
if key_name:
self.resources[name]['depends_on'] = [key_name]
server_properties['key_name'] = {'get_resource': key_name}
json_template = json.dumps(self._template)
start_time = time.time()
stack.uuid = self.uuid = heat.stacks.create(
- stack_name=self.name, template=json_template)['stack']['id']
+ stack_name=self.name, template=json_template,
+ parameters=self.heat_parameters)['stack']['id']
status = self.status()