tempest: migrate api and scnario tests from tempest

tempest: use ceilometer client manager instead of tempest one

This patch replaces client manager used in base test class from tempest
one to ceilometer dedicated manager which only has clients necessary to
specific ceilometer test cases.

The conflicts in config parameter are solved by adding '_plugin' in
paramter names as suffix.

This patch also includes the following changes in tempest.

  - Ie99bbbe7655138c4c3ecae69ae0b361198a9651d
  - I340d96c27f0e906df5b8a109494920e9cd3b21d1
  - I14e16a1a7d9813b324ee40545c07f0e88fb637b7

Closes-Bug: 1549424
Depends-On: Ifc29617743b76b01eb6cd30a375cf47b56e4f635
Implements: blueprint tempest-plugin
Change-Id: Ifbe3152c486ddba79bb851c0ec3097213975f95c
diff --git a/ceilometer/tests/tempest/api/base.py b/ceilometer/tests/tempest/api/base.py
index 938bc88..103a123 100644
--- a/ceilometer/tests/tempest/api/base.py
+++ b/ceilometer/tests/tempest/api/base.py
@@ -13,27 +13,43 @@
 import time
 
 from oslo_utils import timeutils
-from tempest_lib import exceptions as lib_exc
-
 from tempest.common import compute
 from tempest.common.utils import data_utils
 from tempest import config
 from tempest import exceptions
+from tempest.lib import exceptions as lib_exc
 import tempest.test
 
+from ceilometer.tests.tempest.service import client
+
+
 CONF = config.CONF
 
 
+class ClientManager(client.Manager):
+
+    load_clients = [
+        'servers_client',
+        'compute_networks_client',
+        'compute_floating_ips_client',
+        'flavors_client',
+        'image_client',
+        'image_client_v2',
+        'telemetry_client',
+    ]
+
+
 class BaseTelemetryTest(tempest.test.BaseTestCase):
 
     """Base test case class for all Telemetry API tests."""
 
     credentials = ['primary']
+    client_manager = ClientManager
 
     @classmethod
     def skip_checks(cls):
         super(BaseTelemetryTest, cls).skip_checks()
-        if not CONF.service_available.ceilometer:
+        if not CONF.service_available.ceilometer_plugin:
             raise cls.skipException("Ceilometer support is required")
 
     @classmethod
@@ -44,11 +60,11 @@
     @classmethod
     def setup_clients(cls):
         super(BaseTelemetryTest, cls).setup_clients()
-        cls.telemetry_client = cls.os.telemetry_client
-        cls.servers_client = cls.os.servers_client
-        cls.flavors_client = cls.os.flavors_client
-        cls.image_client = cls.os.image_client
-        cls.image_client_v2 = cls.os.image_client_v2
+        cls.telemetry_client = cls.os_primary.telemetry_client
+        cls.servers_client = cls.os_primary.servers_client
+        cls.flavors_client = cls.os_primary.flavors_client
+        cls.image_client = cls.os_primary.image_client
+        cls.image_client_v2 = cls.os_primary.image_client_v2
 
     @classmethod
     def resource_setup(cls):
@@ -67,7 +83,7 @@
     def create_server(cls):
         tenant_network = cls.get_tenant_network()
         body, server = compute.create_test_server(
-            cls.os,
+            cls.os_primary,
             tenant_network=tenant_network,
             name=data_utils.rand_name('ceilometer-instance'),
             wait_until='ACTIVE')
@@ -75,10 +91,11 @@
         return body
 
     @classmethod
-    def create_image(cls, client):
-        body = client.create_image(
-            data_utils.rand_name('image'), container_format='bare',
-            disk_format='raw', visibility='private')
+    def create_image(cls, client, **kwargs):
+        body = client.create_image(name=data_utils.rand_name('image'),
+                                   container_format='bare',
+                                   disk_format='raw',
+                                   **kwargs)
         # TODO(jswarren) Move ['image'] up to initial body value assignment
         # once both v1 and v2 glance clients include the full response
         # object.
diff --git a/ceilometer/tests/tempest/api/test_telemetry_notification_api.py b/ceilometer/tests/tempest/api/test_telemetry_notification_api.py
new file mode 100644
index 0000000..6c1ee6b
--- /dev/null
+++ b/ceilometer/tests/tempest/api/test_telemetry_notification_api.py
@@ -0,0 +1,87 @@
+#    Licensed under the Apache License, Version 2.0 (the "License"); you may
+#    not use this file except in compliance with the License. You may obtain
+#    a copy of the License at
+#
+#         http://www.apache.org/licenses/LICENSE-2.0
+#
+#    Unless required by applicable law or agreed to in writing, software
+#    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+#    License for the specific language governing permissions and limitations
+#    under the License.
+
+# Change-Id: I14e16a1a7d9813b324ee40545c07f0e88fb637b7
+
+import testtools
+
+from ceilometer.tests.tempest.api import base
+from tempest import config
+from tempest.lib import decorators
+from tempest import test
+
+
+CONF = config.CONF
+
+
+class TelemetryNotificationAPITest(base.BaseTelemetryTest):
+
+    @test.idempotent_id('d7f8c1c8-d470-4731-8604-315d3956caae')
+    @test.services('compute')
+    def test_check_nova_notification(self):
+
+        body = self.create_server()
+
+        query = ('resource', 'eq', body['id'])
+
+        for metric in self.nova_notifications:
+            self.await_samples(metric, query)
+
+    @test.attr(type="smoke")
+    @test.idempotent_id('04b10bfe-a5dc-47af-b22f-0460426bf499')
+    @test.services("image")
+    @testtools.skipIf(not CONF.image_feature_enabled.api_v1,
+                      "Glance api v1 is disabled")
+    def test_check_glance_v1_notifications(self):
+        body = self.create_image(self.image_client, is_public=False)
+        self.image_client.update_image(body['id'], data='data')
+
+        query = 'resource', 'eq', body['id']
+
+        self.image_client.delete_image(body['id'])
+
+        for metric in self.glance_notifications:
+            self.await_samples(metric, query)
+
+    @test.attr(type="smoke")
+    @test.idempotent_id('c240457d-d943-439b-8aea-85e26d64fe8f')
+    @test.services("image")
+    @testtools.skipIf(not CONF.image_feature_enabled.api_v2,
+                      "Glance api v2 is disabled")
+    def test_check_glance_v2_notifications(self):
+        body = self.create_image(self.image_client_v2, visibility='private')
+
+        self.image_client_v2.store_image_file(body['id'], "file")
+        self.image_client_v2.show_image_file(body['id'])
+
+        query = 'resource', 'eq', body['id']
+
+        for metric in self.glance_v2_notifications:
+            self.await_samples(metric, query)
+
+
+class TelemetryNotificationAdminAPITest(base.BaseTelemetryAdminTest):
+
+    @test.idempotent_id('29604198-8b45-4fc0-8af8-1cae4f94ebea')
+    @test.services('compute')
+    @decorators.skip_because(bug='1480490')
+    def test_check_nova_notification_event_and_meter(self):
+
+        body = self.create_server()
+
+        if CONF.telemetry_plugin.event_enabled:
+            query = ('instance_id', 'eq', body['id'])
+            self.await_events(query)
+
+        query = ('resource', 'eq', body['id'])
+        for metric in self.nova_notifications:
+            self.await_samples(metric, query)