Merge "Add parameter alarm_granularity to telemetry section"
diff --git a/README.rst b/README.rst
index 4d24d42..5df03f5 100644
--- a/README.rst
+++ b/README.rst
@@ -12,6 +12,8 @@
 
 .. code-block:: yaml
   runtest:
+    keystonerc_node: ctl01*
+    test_target: gtw01*
     artifact_collector:
       enabled: true
       artifactory:
diff --git a/_modules/runtest/tempest_sections/dashboard.py b/_modules/runtest/tempest_sections/dashboard.py
index d9a20d0..008af2b 100644
--- a/_modules/runtest/tempest_sections/dashboard.py
+++ b/_modules/runtest/tempest_sections/dashboard.py
@@ -22,7 +22,7 @@
         nginx_enable = conditions.BaseRule('nginx.server.enabled', 'eq', True)
 
         if self.get_item_when_condition_match('horizon.server.enabled', horizon_enable):
-            if self.get_item_when_condition_match('nginx.server.enabled', nginx_enable):
+            if self.get_item_when_condition_match('nginx.server.site.nginx_proxy_openstack_web.enabled', nginx_enable):
                 port = self.get_item_when_condition_match('nginx.server.site.nginx_proxy_openstack_web.host.port', nginx_enable)
                 protocol = self.get_item_when_condition_match('nginx.server.site.nginx_proxy_openstack_web.host.protocol', nginx_enable)
                 ip = self.get_item_when_condition_match('nginx.server.site.nginx_proxy_openstack_web.host.name', nginx_enable)
@@ -39,4 +39,4 @@
 
     @property
     def disable_ssl_certificate_validation(self):
-        pass
\ No newline at end of file
+        pass
diff --git a/_modules/runtest/tempest_sections/heat_plugin.py b/_modules/runtest/tempest_sections/heat_plugin.py
index 0f2e16f..219b226 100644
--- a/_modules/runtest/tempest_sections/heat_plugin.py
+++ b/_modules/runtest/tempest_sections/heat_plugin.py
@@ -1,6 +1,8 @@
 
 import base_section
 
+from runtest import conditions
+
 class HeatPlugin(base_section.BaseSection):
 
     name = "heat_plugin"
@@ -53,7 +55,9 @@
 
     @property
     def admin_password(self):
-        pass
+        c = conditions.BaseRule('keystone.server.enabled', 'eq', True)
+        return self.get_item_when_condition_match(
+            'keystone.server.admin_password', c)
 
     @property
     def admin_project_name(self):
@@ -61,11 +65,20 @@
 
     @property
     def admin_username(self):
-        pass
+        c = conditions.BaseRule('keystone.server.enabled', 'eq', True)
+        return self.get_item_when_condition_match(
+            'keystone.server.admin_name', c)
 
     @property
     def auth_url(self):
-        pass
+        c = conditions.BaseRule('keystone.server.enabled', 'eq', True)
+        protocol = self.get_item_when_condition_match(
+            'keystone.server.bind.private_protocol', c) or 'http'
+        vip = self.get_item_when_condition_match(
+            '_param.cluster_vip_address', c)
+        port = self.get_item_when_condition_match(
+            'keystone.server.bind.private_port', c)
+        return "{}://{}:{}".format(protocol, vip, port)
 
     @property
     def auth_version(self):
@@ -149,7 +162,9 @@
 
     @property
     def password(self):
-        pass
+        c = conditions.BaseRule('keystone.server.enabled', 'eq', True)
+        return self.get_item_when_condition_match(
+            'keystone.server.admin_password', c)
 
     @property
     def project_domain_id(self):
@@ -161,11 +176,15 @@
 
     @property
     def project_name(self):
-        pass
+        c = conditions.BaseRule('keystone.server.enabled', 'eq', True)
+        return self.get_item_when_condition_match(
+            'keystone.server.admin_tenant', c)
 
     @property
     def region(self):
-        pass
+        c = conditions.BaseRule('keystone.server.enabled', 'eq', True)
+        return self.get_item_when_condition_match(
+            'keystone.server.region', c)
 
     @property
     def sighup_config_edit_retries(self):
@@ -217,7 +236,9 @@
 
     @property
     def username(self):
-        pass
+        c = conditions.BaseRule('keystone.server.enabled', 'eq', True)
+        return self.get_item_when_condition_match(
+            'keystone.server.admin_name', c)
 
     @property
     def volume_size(self):
diff --git a/_modules/runtest/tempest_sections/network.py b/_modules/runtest/tempest_sections/network.py
index 1fb61b3..68d4fea 100644
--- a/_modules/runtest/tempest_sections/network.py
+++ b/_modules/runtest/tempest_sections/network.py
@@ -91,7 +91,7 @@
           return
 
         res = self.authenticated_openstack_module_call(
-            nodes[0], 'neutronng.list_netowkrs')[nodes[0]]['networks']
+            nodes[0], 'neutronng.list_networks')[nodes[0]]['networks']
         networks = [n['id'] for n in res if n['name'] == network_name]
 
         if len(networks) != 1:
diff --git a/_modules/runtest/tempest_sections/service_available.py b/_modules/runtest/tempest_sections/service_available.py
index 381eab8..64fd929 100644
--- a/_modules/runtest/tempest_sections/service_available.py
+++ b/_modules/runtest/tempest_sections/service_available.py
@@ -5,16 +5,23 @@
 
     name = "service_available"
     options = [
+        'aodh',
+        'barbican',
         'cinder',
+        'ceilometer',
         'designate',
         'glance',
+        'gnocchi',
         'heat',
         'ironic',
+        'manila',
         'neutron',
         'nova',
+        'panko',
         'sahara',
         'swift',
         'horizon',
+        'keystone',
     ]
 
 
@@ -42,10 +49,22 @@
         return False
 
     @property
+    def aodh(self):
+        return self._is_service_enabled('aodh')
+
+    @property
+    def barbican(self):
+        return self._is_service_enabled('barbican')
+
+    @property
     def cinder(self):
         return self._is_service_enabled('cinder')
 
     @property
+    def ceilometer(self):
+        return self._is_service_enabled('ceilometer')
+
+    @property
     def designate(self):
         return self._is_service_enabled('designate')
 
@@ -54,6 +73,10 @@
         return self._is_service_enabled('glance')
 
     @property
+    def gnocchi(self):
+        return self._is_service_enabled('gnocchi')
+
+    @property
     def heat(self):
         return self._is_service_enabled('heat')
 
@@ -62,6 +85,10 @@
         return self._is_service_enabled('ironic')
 
     @property
+    def manila(self):
+        return self._is_service_enabled('manila')
+
+    @property
     def neutron(self):
         return self._is_service_enabled('neutron')
 
@@ -70,6 +97,10 @@
         return self._is_service_enabled('nova')
 
     @property
+    def panko(self):
+        return self._is_service_enabled('panko')
+
+    @property
     def sahara(self):
         return self._is_service_enabled('sahara')
 
@@ -79,4 +110,8 @@
 
     @property
     def horizon(self):
-        return self._is_service_enabled('horizon')
\ No newline at end of file
+        return self._is_service_enabled('horizon')
+
+    @property
+    def keystone(self):
+        return self._is_service_enabled('keystone')
\ No newline at end of file
diff --git a/metadata/service/tempest.yml b/metadata/service/tempest.yml
deleted file mode 100644
index 36ab4ec..0000000
--- a/metadata/service/tempest.yml
+++ /dev/null
@@ -1,8 +0,0 @@
-applications:
- - runtest
-parameters:
-  runtest:
-    enabled: true
-    openstack_version: stable/${_param:openstack_version}
-    tempest:
-      enabled: true
diff --git a/metadata/service/tempest/glance.yml b/metadata/service/tempest/glance.yml
new file mode 100644
index 0000000..6093c84
--- /dev/null
+++ b/metadata/service/tempest/glance.yml
@@ -0,0 +1,32 @@
+parameters:
+  _param:
+    glance_image_cirros_location: 'http://download.cirros-cloud.net/0.3.5/cirros-0.3.5-x86_64-disk.img'
+    glance_image_fedora_location: 'https://mirror.chpc.utah.edu/pub/fedora/linux/releases/27/CloudImages/x86_64/images/Fedora-Cloud-Base-27-1.6.x86_64.qcow2'
+    glance_image_cirros_name: 'TestCirros-0.3.5'
+    glance_image_fedora_name: 'TestFedora-27-1.6'
+  glance:
+    client:
+      enabled: True
+      identity:
+        admin_identity:
+          image:
+            cirros:
+              name: ${_param:glance_image_cirros_name}
+              location: ${_param:glance_image_cirros_location}
+              import_from_format: 'qcow2'
+              container_format: 'bare'
+              disk_format: 'qcow2'
+              tags:
+                - 'cirros'
+              visibility: public
+              wait_timeout: 1000
+            fedora:
+              name: ${_param:glance_image_fedora_name}
+              location: ${_param:glance_image_fedora_location}
+              import_from_format: 'qcow2'
+              container_format: 'bare'
+              disk_format: 'qcow2'
+              tags:
+                - 'fedora'
+              visibility: public
+              wait_timeout: 1000
\ No newline at end of file
diff --git a/metadata/service/tempest/init.yml b/metadata/service/tempest/init.yml
new file mode 100644
index 0000000..5f00c21
--- /dev/null
+++ b/metadata/service/tempest/init.yml
@@ -0,0 +1,28 @@
+classes:
+  - service.runtest.tempest.glance
+  - service.runtest.tempest.nova
+  - service.runtest.tempest.neutron
+applications:
+ - runtest
+parameters:
+  _param:
+    runtest_heat_plugin_skip_scenario_test_list: 'SoftwareConfigIntegrationTest, VolumeBackupRestoreIntegrationTest'
+    runtest_path_to_ca_file: '/etc/ssl/certs/ca-certificates.crt'
+    tempest_test_target: cfg01*
+  runtest:
+    enabled: true
+    openstack_version: stable/${_param:openstack_version}
+    tempest:
+      enabled: true
+      test_target: ${_param:tempest_test_target}
+      heat_plugin:
+        skip_scenario_test_list: ${_param:runtest_heat_plugin_skip_scenario_test_list}
+        instance_type: 'test-m1.tiny'
+        minimal_instance_type: 'test-m1.extra_tiny'
+        auth_version: 3
+        project_domain_id: default
+        user_domain_id: default
+        disable_ssl_certificate_validation: False
+        ca_file: ${_param:runtest_path_to_ca_file}
+        image_ref: ${glance:client:identity:admin_identity:image:fedora:name}
+        minimal_image_ref: ${glance:client:identity:admin_identity:image:cirros:name}
diff --git a/metadata/service/tempest/neutron.yml b/metadata/service/tempest/neutron.yml
new file mode 100644
index 0000000..a4bcce7
--- /dev/null
+++ b/metadata/service/tempest/neutron.yml
@@ -0,0 +1,20 @@
+parameters:
+  neutron:
+    client:
+      server:
+        admin_identity:
+          network:
+            heat-net:
+              tenant: admin
+              shared: False
+              router_external: True
+              default: True
+              admin_state_up: True
+              subnet:
+                heat_subnet:
+                  cidr: 10.20.30.0/24
+                  allocation_pools:
+                    - start: 10.20.30.10
+                      end: 10.20.30.254
+                  gateway: 10.20.30.1
+                  enable_dhcp: False
\ No newline at end of file
diff --git a/metadata/service/tempest/nova.yml b/metadata/service/tempest/nova.yml
new file mode 100644
index 0000000..34e3d2b
--- /dev/null
+++ b/metadata/service/tempest/nova.yml
@@ -0,0 +1,15 @@
+parameters:
+  nova:
+    client:
+      enabled: True
+      server:
+        admin_identity:
+          flavor:
+            test-m1.tiny:
+              ram: 512
+              disk: 5
+              vcpus: 1
+            test-m1.extra_tiny:
+              ram: 256
+              disk: 1
+              vcpus: 1
\ No newline at end of file
diff --git a/runtest/map.jinja b/runtest/map.jinja
index 7360cbc..6e892f8 100644
--- a/runtest/map.jinja
+++ b/runtest/map.jinja
@@ -8,6 +8,7 @@
     'default': {
         'cfg_dir': '/root/',
         'cfg_name': 'tempest.conf',
+        'keystonerc': '/root/keystonercv3'
     }
 }, grain='os', merge=salt['pillar.get']('runtest', {}).get('tempest', {}), base='default') %}
 
diff --git a/runtest/put_keystone_file.sls b/runtest/put_keystone_file.sls
new file mode 100644
index 0000000..08a4137
--- /dev/null
+++ b/runtest/put_keystone_file.sls
@@ -0,0 +1,9 @@
+{%- from "runtest/map.jinja" import tempest with context %}
+
+{%- set keystone_client_file = salt['mine.get']('*', 'keystonerc_file', 'compound') %}
+
+put_keystone_file:
+  file.managed:
+    - name: {{ tempest.keystonerc }}
+    - contents: '{{ keystone_client_file.values()[0] }}'
+
diff --git a/runtest/salttest/modules/openstack/glance.sls b/runtest/salttest/modules/openstack/glance.sls
index 718a3fe..b208318 100644
--- a/runtest/salttest/modules/openstack/glance.sls
+++ b/runtest/salttest/modules/openstack/glance.sls
@@ -1,10 +1,9 @@
-#glanceng_task_list:
-#  module.run:
-#    - name: glanceng.task_list
-#    - profile: admin_identity
+glanceng_task_list:
+  module.run:
+    - name: glanceng.task_list
+    - profile: admin_identity
 
-#glanceng_image_schema:
-#  module.run:
-#    - name: glanceng.image_schema
-#    - profile: admin_identity
-
+glanceng_image_schema:
+  module.run:
+    - name: glanceng.image_schema
+    - profile: admin_identity
diff --git a/runtest/tempest.sls b/runtest/tempest.sls
index 06024ac..6f6d3c9 100644
--- a/runtest/tempest.sls
+++ b/runtest/tempest.sls
@@ -13,4 +13,38 @@
     - require:
       - file: tempest_config_dir
 
+{%- if tempest.test_target is defined %}
+create_on_target:
+  salt.function:
+    - tgt: {{ tempest.test_target }}
+    - tgt_type: compound
+    - name: file.mkdir
+    - arg:
+      -  {{ tempest.cfg_dir }}
+
+copy_to_target:
+  cmd.run:
+    - name: salt-cp {{ tempest.test_target }} {{ tempest.cfg_dir }}/{{ tempest.cfg_name }} {{ tempest.cfg_dir }}/{{ tempest.cfg_name }}
+    - require:
+      - salt: create_on_target
+
+mine_send_keystonerc_file:
+  salt.function:
+    - tgt: 'I@keystone:server and *01*'
+    - tgt_type: compound
+    - name: mine.send
+    - arg:
+      - 'keystonerc_file'
+      - 'mine_function=cmd.shell'
+      - 'cat {{ tempest.keystonerc }}'
+
+put_keystone_rc_file:
+  salt.state:
+    - tgt: {{ tempest.test_target }}
+    - tgt_type: compound
+    - sls: runtest.put_keystone_file
+    - require:
+      - salt: mine_send_keystonerc_file
+
+{%- endif %}
 {%- endif -%}