Add zte-pod1 info in Yardstick test cases Grafana page.
[yardstick.git] / yardstick / orchestrator / heat.py
index ddab896..f3a1915 100644 (file)
@@ -21,6 +21,9 @@ import json
 import heatclient.client
 import keystoneclient
 
+from yardstick.common import template_format
+
+
 log = logging.getLogger(__name__)
 
 
@@ -39,7 +42,8 @@ class HeatObject(object):
                 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
 
@@ -145,14 +149,7 @@ class HeatStack(HeatObject):
 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'
 
@@ -161,13 +158,35 @@ class HeatTemplate(HeatObject):
             '''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 = {}
 
@@ -239,7 +258,7 @@ class HeatTemplate(HeatObject):
             'properties': {
                 'name': name,
                 'fixed_ips': [{'subnet': {'get_resource': subnet_name}}],
-                'network': network_name,
+                'network_id': {'get_resource': network_name},
                 'replacement_policy': 'AUTO',
             }
         }
@@ -256,18 +275,17 @@ class HeatTemplate(HeatObject):
 
     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
             }
         }
 
@@ -276,7 +294,22 @@ class HeatTemplate(HeatObject):
 
         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):
@@ -320,9 +353,13 @@ class HeatTemplate(HeatObject):
                 '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'}
                 ]
@@ -335,8 +372,8 @@ class HeatTemplate(HeatObject):
         }
 
     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)
@@ -352,6 +389,9 @@ class HeatTemplate(HeatObject):
             '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}
@@ -404,7 +444,8 @@ class HeatTemplate(HeatObject):
         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()