Add agents tests for Nova v3 API
This patch adds tests for agents API.
Partially implements blueprint nova-v3-api-tests
Change-Id: I7d46dd5bb8cef32a9fae58e17ffc7feb99036815
diff --git a/tempest/api/compute/base.py b/tempest/api/compute/base.py
index 9162926..9ed709f 100644
--- a/tempest/api/compute/base.py
+++ b/tempest/api/compute/base.py
@@ -409,3 +409,4 @@
cls.aggregates_admin_client = cls.os_adm.aggregates_v3_client
cls.hosts_admin_client = cls.os_adm.hosts_v3_client
cls.quotas_admin_client = cls.os_adm.quotas_v3_client
+ cls.agents_admin_client = cls.os_adm.agents_v3_client
diff --git a/tempest/api/compute/v3/admin/test_agents.py b/tempest/api/compute/v3/admin/test_agents.py
new file mode 100644
index 0000000..9d01b71
--- /dev/null
+++ b/tempest/api/compute/v3/admin/test_agents.py
@@ -0,0 +1,91 @@
+# Copyright 2014 NEC Corporation. All rights reserved.
+#
+# 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.
+
+from tempest.api.compute import base
+from tempest import test
+
+
+class AgentsAdminV3Test(base.BaseV3ComputeAdminTest):
+
+ """
+ Tests Agents API that require admin privileges
+ """
+
+ @classmethod
+ def setUpClass(cls):
+ super(AgentsAdminV3Test, cls).setUpClass()
+ cls.client = cls.agents_admin_client
+
+ @test.attr(type='gate')
+ def test_create_update_list_delete_agents(self):
+
+ """
+ 1. Create 2 agents.
+ 2. Update one of the agents.
+ 3. List all agent builds.
+ 4. List the agent builds by the filter.
+ 5. Delete agents.
+ """
+ params_kvm = expected_kvm = {'hypervisor': 'kvm',
+ 'os': 'win',
+ 'architecture': 'x86',
+ 'version': '7.0',
+ 'url': 'xxx://xxxx/xxx/xxx',
+ 'md5hash': ("""add6bb58e139be103324d04d"""
+ """82d8f545""")}
+
+ resp, agent_kvm = self.client.create_agent(**params_kvm)
+ self.assertEqual(201, resp.status)
+ for expected_item, value in expected_kvm.items():
+ self.assertEqual(value, agent_kvm[expected_item])
+
+ params_xen = expected_xen = {'hypervisor': 'xen',
+ 'os': 'linux',
+ 'architecture': 'x86',
+ 'version': '7.0',
+ 'url': 'xxx://xxxx/xxx/xxx1',
+ 'md5hash': """add6bb58e139be103324d04d8"""
+ """2d8f546"""}
+
+ resp, agent_xen = self.client.create_agent(**params_xen)
+ self.assertEqual(201, resp.status)
+
+ for expected_item, value in expected_xen.items():
+ self.assertEqual(value, agent_xen[expected_item])
+
+ params_kvm_new = expected_kvm_new = {'version': '8.0',
+ 'url': 'xxx://xxxx/xxx/xxx2',
+ 'md5hash': """add6bb58e139be103"""
+ """324d04d82d8f547"""}
+
+ resp, resp_agent_kvm = self.client.update_agent(agent_kvm['agent_id'],
+ **params_kvm_new)
+ self.assertEqual(200, resp.status)
+ for expected_item, value in expected_kvm_new.items():
+ self.assertEqual(value, resp_agent_kvm[expected_item])
+
+ resp, agents = self.client.list_agents()
+ self.assertEqual(200, resp.status)
+ self.assertTrue(len(agents) > 1)
+
+ params_filter = {'hypervisor': 'kvm'}
+ resp, agent = self.client.list_agents(params_filter)
+ self.assertEqual(200, resp.status)
+ self.assertTrue(len(agent) > 0)
+ self.assertEqual('kvm', agent[0]['hypervisor'])
+
+ resp, _ = self.client.delete_agent(agent_kvm['agent_id'])
+ self.assertEqual(204, resp.status)
+ resp, _ = self.client.delete_agent(agent_xen['agent_id'])
+ self.assertEqual(204, resp.status)
diff --git a/tempest/clients.py b/tempest/clients.py
index 8db399a..7956eed 100644
--- a/tempest/clients.py
+++ b/tempest/clients.py
@@ -61,6 +61,7 @@
TenantUsagesClientJSON
from tempest.services.compute.json.volumes_extensions_client import \
VolumesExtensionsClientJSON
+from tempest.services.compute.v3.json.agents_client import AgentsV3ClientJSON
from tempest.services.compute.v3.json.aggregates_client import \
AggregatesV3ClientJSON
from tempest.services.compute.v3.json.availability_zone_client import \
@@ -306,6 +307,7 @@
self.services_v3_client = ServicesV3ClientJSON(
self.auth_provider)
self.service_client = ServiceClientJSON(self.auth_provider)
+ self.agents_v3_client = AgentsV3ClientJSON(self.auth_provider)
self.aggregates_v3_client = AggregatesV3ClientJSON(
self.auth_provider)
self.aggregates_client = AggregatesClientJSON(
diff --git a/tempest/services/compute/v3/json/agents_client.py b/tempest/services/compute/v3/json/agents_client.py
new file mode 100644
index 0000000..6893af2
--- /dev/null
+++ b/tempest/services/compute/v3/json/agents_client.py
@@ -0,0 +1,52 @@
+# Copyright 2014 NEC Corporation. All rights reserved.
+#
+# 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.
+
+import json
+import urllib
+
+from tempest.common import rest_client
+from tempest import config
+
+CONF = config.CONF
+
+
+class AgentsV3ClientJSON(rest_client.RestClient):
+
+ def __init__(self, auth_provider):
+ super(AgentsV3ClientJSON, self).__init__(auth_provider)
+ self.service = CONF.compute.catalog_v3_type
+
+ def list_agents(self, params=None):
+ """List all agent builds."""
+ url = 'os-agents'
+ if params:
+ url += '?%s' % urllib.urlencode(params)
+ resp, body = self.get(url)
+ return resp, self._parse_resp(body)
+
+ def create_agent(self, **kwargs):
+ """Create an agent build."""
+ post_body = json.dumps({'agent': kwargs})
+ resp, body = self.post('os-agents', post_body)
+ return resp, self._parse_resp(body)
+
+ def delete_agent(self, agent_id):
+ """Delete an existing agent build."""
+ return self.delete('os-agents/%s' % str(agent_id))
+
+ def update_agent(self, agent_id, **kwargs):
+ """Update an agent build."""
+ put_body = json.dumps({'agent': kwargs})
+ resp, body = self.put('os-agents/%s' % str(agent_id), put_body)
+ return resp, self._parse_resp(body)