diff options
| author | Jenkins <jenkins@review.openstack.org> | 2012-12-05 18:51:58 +0000 |
|---|---|---|
| committer | Gerrit Code Review <review@openstack.org> | 2012-12-05 18:51:58 +0000 |
| commit | 2804b01a6bb404d3e120289680a3cfa4e4c3e380 (patch) | |
| tree | c9b6aa55a51bb2d37c7932ffc779d95d10149654 /nova/tests | |
| parent | f9245c8353f1f9a89a2f578c2b53264c0ea3b3a5 (diff) | |
| parent | 82042ac2766b892d561836cd312656940522734a (diff) | |
Merge "Add agent build API support for list/create/delete/modify agent build"
Diffstat (limited to 'nova/tests')
16 files changed, 388 insertions, 0 deletions
diff --git a/nova/tests/api/openstack/compute/contrib/test_agents.py b/nova/tests/api/openstack/compute/contrib/test_agents.py new file mode 100644 index 000000000..60659b3c6 --- /dev/null +++ b/nova/tests/api/openstack/compute/contrib/test_agents.py @@ -0,0 +1,185 @@ +# Copyright 2012 IBM +# 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 nova.api.openstack.compute.contrib import agents +from nova import context +from nova import db +from nova.db.sqlalchemy import models +from nova import test + +fake_agents_list = [{'hypervisor': 'kvm', 'os': 'win', + 'architecture': 'x86', + 'version': '7.0', + 'url': 'xxx://xxxx/xxx/xxx', + 'md5hash': 'add6bb58e139be103324d04d82d8f545', + 'id': 1}, + {'hypervisor': 'kvm', 'os': 'linux', + 'architecture': 'x86', + 'version': '16.0', + 'url': 'xxx://xxxx/xxx/xxx1', + 'md5hash': 'add6bb58e139be103324d04d82d8f546', + 'id': 2}, + {'hypervisor': 'xen', 'os': 'linux', + 'architecture': 'x86', + 'version': '16.0', + 'url': 'xxx://xxxx/xxx/xxx2', + 'md5hash': 'add6bb58e139be103324d04d82d8f547', + 'id': 3}, + {'hypervisor': 'xen', 'os': 'win', + 'architecture': 'power', + 'version': '7.0', + 'url': 'xxx://xxxx/xxx/xxx3', + 'md5hash': 'add6bb58e139be103324d04d82d8f548', + 'id': 4}, + ] + + +def fake_agent_build_get_all(context, hypervisor): + agent_build_all = [] + for agent in fake_agents_list: + if hypervisor and hypervisor != agent['hypervisor']: + continue + agent_build_ref = models.AgentBuild() + agent_build_ref.update(agent) + agent_build_all.append(agent_build_ref) + return agent_build_all + + +def fake_agent_build_update(context, agent_build_id, values): + pass + + +def fake_agent_build_destroy(context, agent_update_id): + pass + + +def fake_agent_build_create(context, values): + values['id'] = 1 + agent_build_ref = models.AgentBuild() + agent_build_ref.update(values) + return agent_build_ref + + +class FakeRequest(object): + environ = {"nova.context": context.get_admin_context()} + GET = {} + + +class FakeRequestWithHypervisor(object): + environ = {"nova.context": context.get_admin_context()} + GET = {'hypervisor': 'kvm'} + + +class AgentsTest(test.TestCase): + + def setUp(self): + super(AgentsTest, self).setUp() + + self.stubs.Set(db, "agent_build_get_all", + fake_agent_build_get_all) + self.stubs.Set(db, "agent_build_update", + fake_agent_build_update) + self.stubs.Set(db, "agent_build_destroy", + fake_agent_build_destroy) + self.stubs.Set(db, "agent_build_create", + fake_agent_build_create) + self.context = context.get_admin_context() + self.controller = agents.AgentController() + + def tearDown(self): + super(AgentsTest, self).tearDown() + + def test_agents_create(self): + req = FakeRequest() + body = {'agent': {'hypervisor': 'kvm', + 'os': 'win', + 'architecture': 'x86', + 'version': '7.0', + 'url': 'xxx://xxxx/xxx/xxx', + 'md5hash': 'add6bb58e139be103324d04d82d8f545'}} + response = {'agent': {'hypervisor': 'kvm', + 'os': 'win', + 'architecture': 'x86', + 'version': '7.0', + 'url': 'xxx://xxxx/xxx/xxx', + 'md5hash': 'add6bb58e139be103324d04d82d8f545', + 'agent_id': 1}} + res_dict = self.controller.create(req, body) + self.assertEqual(res_dict, response) + + def test_agents_delete(self): + req = FakeRequest() + self.controller.delete(req, 1) + + def test_agents_list(self): + req = FakeRequest() + res_dict = self.controller.index(req) + agents_list = [{'hypervisor': 'kvm', 'os': 'win', + 'architecture': 'x86', + 'version': '7.0', + 'url': 'xxx://xxxx/xxx/xxx', + 'md5hash': 'add6bb58e139be103324d04d82d8f545', + 'agent_id': 1}, + {'hypervisor': 'kvm', 'os': 'linux', + 'architecture': 'x86', + 'version': '16.0', + 'url': 'xxx://xxxx/xxx/xxx1', + 'md5hash': 'add6bb58e139be103324d04d82d8f546', + 'agent_id': 2}, + {'hypervisor': 'xen', 'os': 'linux', + 'architecture': 'x86', + 'version': '16.0', + 'url': 'xxx://xxxx/xxx/xxx2', + 'md5hash': 'add6bb58e139be103324d04d82d8f547', + 'agent_id': 3}, + {'hypervisor': 'xen', 'os': 'win', + 'architecture': 'power', + 'version': '7.0', + 'url': 'xxx://xxxx/xxx/xxx3', + 'md5hash': 'add6bb58e139be103324d04d82d8f548', + 'agent_id': 4}, + ] + self.assertEqual(res_dict, {'agents': agents_list}) + + def test_agents_list_with_hypervisor(self): + req = FakeRequestWithHypervisor() + res_dict = self.controller.index(req) + response = [{'hypervisor': 'kvm', 'os': 'win', + 'architecture': 'x86', + 'version': '7.0', + 'url': 'xxx://xxxx/xxx/xxx', + 'md5hash': 'add6bb58e139be103324d04d82d8f545', + 'agent_id': 1}, + {'hypervisor': 'kvm', 'os': 'linux', + 'architecture': 'x86', + 'version': '16.0', + 'url': 'xxx://xxxx/xxx/xxx1', + 'md5hash': 'add6bb58e139be103324d04d82d8f546', + 'agent_id': 2}, + ] + self.assertEqual(res_dict, {'agents': response}) + + def test_agents_update(self): + req = FakeRequest() + body = {'para': {'version': '7.0', + 'url': 'xxx://xxxx/xxx/xxx', + 'md5hash': 'add6bb58e139be103324d04d82d8f545'}} + response = {'agent': {'agent_id': 1, + 'version': '7.0', + 'url': 'xxx://xxxx/xxx/xxx', + 'md5hash': 'add6bb58e139be103324d04d82d8f545'}} + res_dict = self.controller.update(req, 1, body) + self.assertEqual(res_dict, response) diff --git a/nova/tests/api/openstack/compute/test_extensions.py b/nova/tests/api/openstack/compute/test_extensions.py index eab55f95e..66dac3feb 100644 --- a/nova/tests/api/openstack/compute/test_extensions.py +++ b/nova/tests/api/openstack/compute/test_extensions.py @@ -158,6 +158,7 @@ class ExtensionControllerTest(ExtensionTestCase): "AdminActions", "Aggregates", "AvailabilityZone", + "Agents", "Certificates", "Cloudpipe", "CloudpipeUpdate", diff --git a/nova/tests/fake_policy.py b/nova/tests/fake_policy.py index b3ae0fa17..7813cddc0 100644 --- a/nova/tests/fake_policy.py +++ b/nova/tests/fake_policy.py @@ -103,6 +103,7 @@ policy_data = """ "compute_extension:admin_actions:resetState": "", "compute_extension:admin_actions:migrate": "", "compute_extension:aggregates": "", + "compute_extension:agents": "", "compute_extension:certificates": "", "compute_extension:cloudpipe": "", "compute_extension:cloudpipe_update": "", diff --git a/nova/tests/integrated/api_samples/all_extensions/extensions-get-resp.json.tpl b/nova/tests/integrated/api_samples/all_extensions/extensions-get-resp.json.tpl index 65cbb4889..0b27896fd 100644 --- a/nova/tests/integrated/api_samples/all_extensions/extensions-get-resp.json.tpl +++ b/nova/tests/integrated/api_samples/all_extensions/extensions-get-resp.json.tpl @@ -73,6 +73,14 @@ "updated": "%(timestamp)s" }, { + "alias": "os-agents", + "description": "%(text)s", + "links": [], + "name": "Agents", + "namespace": "http://docs.openstack.org/compute/ext/agents/api/v2", + "updated": "%(timestamp)s" + }, + { "alias": "os-availability-zone", "description": "%(text)s", "links": [], diff --git a/nova/tests/integrated/api_samples/all_extensions/extensions-get-resp.xml.tpl b/nova/tests/integrated/api_samples/all_extensions/extensions-get-resp.xml.tpl index bdef0266c..fec850997 100644 --- a/nova/tests/integrated/api_samples/all_extensions/extensions-get-resp.xml.tpl +++ b/nova/tests/integrated/api_samples/all_extensions/extensions-get-resp.xml.tpl @@ -30,6 +30,9 @@ <extension alias="os-availability-zone" updated="%(timestamp)s" namespace="http://docs.openstack.org/compute/ext/availabilityzone/api/v1.1" name="AvailabilityZone"> <description>%(text)s</description> </extension> + <extension alias="os-agents" name="Agents" namespace="http://docs.openstack.org/compute/ext/agents/api/v2" updated="%(timestamp)s"> + <description>%(text)s</description> + </extension> <extension alias="os-certificates" updated="%(timestamp)s" namespace="http://docs.openstack.org/compute/ext/certificates/api/v1.1" name="Certificates"> <description>%(text)s</description> </extension> diff --git a/nova/tests/integrated/api_samples/os-agents/agent-post-req.json.tpl b/nova/tests/integrated/api_samples/os-agents/agent-post-req.json.tpl new file mode 100644 index 000000000..6dbd2f17c --- /dev/null +++ b/nova/tests/integrated/api_samples/os-agents/agent-post-req.json.tpl @@ -0,0 +1,10 @@ +{ + "agent": { + "hypervisor": "%(hypervisor)s", + "os": "%(os)s", + "architecture": "%(architecture)s", + "version": "%(version)s", + "md5hash": "%(md5hash)s", + "url": "%(url)s" + } +} diff --git a/nova/tests/integrated/api_samples/os-agents/agent-post-req.xml.tpl b/nova/tests/integrated/api_samples/os-agents/agent-post-req.xml.tpl new file mode 100644 index 000000000..5c777749a --- /dev/null +++ b/nova/tests/integrated/api_samples/os-agents/agent-post-req.xml.tpl @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="UTF-8"?> +<agent> + <hypervisor>%(hypervisor)s</hypervisor> + <os>%(os)s</os> + <architecture>%(architecture)s</architecture> + <version>%(version)s</version> + <md5hash>%(md5hash)s</md5hash> + <url>%(url)s</url> +</agent> diff --git a/nova/tests/integrated/api_samples/os-agents/agent-post-resp.json.tpl b/nova/tests/integrated/api_samples/os-agents/agent-post-resp.json.tpl new file mode 100644 index 000000000..abe83564f --- /dev/null +++ b/nova/tests/integrated/api_samples/os-agents/agent-post-resp.json.tpl @@ -0,0 +1,12 @@ +{ + "agent": { + "hypervisor": "%(hypervisor)s", + "os": "%(os)s", + "architecture": "%(architecture)s", + "version": "%(version)s", + "md5hash": "%(md5hash)s", + "url": "%(url)s", + "agent_id": "%(agent_id)d" + } +} + diff --git a/nova/tests/integrated/api_samples/os-agents/agent-post-resp.xml.tpl b/nova/tests/integrated/api_samples/os-agents/agent-post-resp.xml.tpl new file mode 100644 index 000000000..ecf97b91e --- /dev/null +++ b/nova/tests/integrated/api_samples/os-agents/agent-post-resp.xml.tpl @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="UTF-8"?> +<agent> + <url>%(url)s</url> + <hypervisor>%(hypervisor)s</hypervisor> + <md5hash>%(md5hash)s</md5hash> + <version>%(version)s</version> + <architecture>%(architecture)s</architecture> + <os>%(os)s</os> + <agent_id>%(agent_id)d</agent_id> +</agent> diff --git a/nova/tests/integrated/api_samples/os-agents/agent-update-put-req.json.tpl b/nova/tests/integrated/api_samples/os-agents/agent-update-put-req.json.tpl new file mode 100644 index 000000000..d447350e0 --- /dev/null +++ b/nova/tests/integrated/api_samples/os-agents/agent-update-put-req.json.tpl @@ -0,0 +1,7 @@ +{ + "para": { + "url": "%(url)s", + "md5hash": "%(md5hash)s", + "version": "%(version)s" + } +} diff --git a/nova/tests/integrated/api_samples/os-agents/agent-update-put-req.xml.tpl b/nova/tests/integrated/api_samples/os-agents/agent-update-put-req.xml.tpl new file mode 100644 index 000000000..19751dc80 --- /dev/null +++ b/nova/tests/integrated/api_samples/os-agents/agent-update-put-req.xml.tpl @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="UTF-8"?> +<para> + <version>%(version)s</version> + <url>%(url)s</url> + <md5hash>%(md5hash)s</md5hash> +</para> diff --git a/nova/tests/integrated/api_samples/os-agents/agent-update-put-resp.json.tpl b/nova/tests/integrated/api_samples/os-agents/agent-update-put-resp.json.tpl new file mode 100644 index 000000000..110e52cd3 --- /dev/null +++ b/nova/tests/integrated/api_samples/os-agents/agent-update-put-resp.json.tpl @@ -0,0 +1,8 @@ +{ + "agent": { + "agent_id": "%(agent_id)d", + "url": "%(url)s", + "md5hash": "%(md5hash)s", + "version": "%(version)s" + } +} diff --git a/nova/tests/integrated/api_samples/os-agents/agent-update-put-resp.xml.tpl b/nova/tests/integrated/api_samples/os-agents/agent-update-put-resp.xml.tpl new file mode 100644 index 000000000..2c9e50572 --- /dev/null +++ b/nova/tests/integrated/api_samples/os-agents/agent-update-put-resp.xml.tpl @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<agent> + <agent_id>%(agent_id)d</agent_id> + <version>%(version)s</version> + <url>%(url)s</url> + <md5hash>%(md5hash)s</md5hash> +</agent> diff --git a/nova/tests/integrated/api_samples/os-agents/agents-get-resp.json.tpl b/nova/tests/integrated/api_samples/os-agents/agents-get-resp.json.tpl new file mode 100644 index 000000000..dac1f76ff --- /dev/null +++ b/nova/tests/integrated/api_samples/os-agents/agents-get-resp.json.tpl @@ -0,0 +1,13 @@ +{ + "agents": [ + { + "hypervisor": "%(hypervisor)s", + "os": "%(os)s", + "architecture": "%(architecture)s", + "version": "%(version)s", + "md5hash": "%(md5hash)s", + "url": "%(url)s", + "agent_id": "%(agent_id)d" + } + ] +} diff --git a/nova/tests/integrated/api_samples/os-agents/agents-get-resp.xml.tpl b/nova/tests/integrated/api_samples/os-agents/agents-get-resp.xml.tpl new file mode 100644 index 000000000..fbbbdad28 --- /dev/null +++ b/nova/tests/integrated/api_samples/os-agents/agents-get-resp.xml.tpl @@ -0,0 +1,4 @@ +<?xml version='1.0' encoding='UTF-8'?> +<agents> + <agent hypervisor="%(hypervisor)s" os="%(os)s" architecture="%(architecture)s" version="%(version)s" md5hash="%(md5hash)s" url="%(url)s" agent_id="%(agent_id)d"/> +</agents> diff --git a/nova/tests/integrated/test_api_samples.py b/nova/tests/integrated/test_api_samples.py index 1fbf16fd3..4142e058f 100644 --- a/nova/tests/integrated/test_api_samples.py +++ b/nova/tests/integrated/test_api_samples.py @@ -26,6 +26,7 @@ from nova.cloudpipe.pipelib import CloudPipe from nova.compute import api from nova import context from nova import db +from nova.db.sqlalchemy import models from nova.network.manager import NetworkManager from nova.openstack.common import cfg from nova.openstack.common import importutils @@ -1284,6 +1285,109 @@ class CloudPipeUpdateXmlTest(CloudPipeUpdateJsonTest): ctype = "xml" +class AgentsJsonTest(ApiSampleTestBase): + extension_name = "nova.api.openstack.compute.contrib.agents.Agents" + + def _get_flags(self): + f = super(AgentsJsonTest, self)._get_flags() + f['osapi_compute_extension'] = CONF.osapi_compute_extension[:] + return f + + def setUp(self): + super(AgentsJsonTest, self).setUp() + + fake_agents_list = [{'url': 'xxxxxxxxxxxx', + 'hypervisor': 'hypervisor', + 'architecture': 'x86', + 'os': 'os', + 'version': '8.0', + 'md5hash': 'add6bb58e139be103324d04d82d8f545', + 'id': '1'}] + + def fake_agent_build_create(context, values): + values['id'] = '1' + agent_build_ref = models.AgentBuild() + agent_build_ref.update(values) + return agent_build_ref + + def fake_agent_build_get_all(context, hypervisor): + agent_build_all = [] + for agent in fake_agents_list: + if hypervisor and hypervisor != agent['hypervisor']: + continue + agent_build_ref = models.AgentBuild() + agent_build_ref.update(agent) + agent_build_all.append(agent_build_ref) + return agent_build_all + + def fake_agent_build_update(context, agent_build_id, values): + pass + + def fake_agent_build_destroy(context, agent_update_id): + pass + + self.stubs.Set(db, "agent_build_create", + fake_agent_build_create) + self.stubs.Set(db, "agent_build_get_all", + fake_agent_build_get_all) + self.stubs.Set(db, "agent_build_update", + fake_agent_build_update) + self.stubs.Set(db, "agent_build_destroy", + fake_agent_build_destroy) + + def test_agent_create(self): + """Creates a new agent build.""" + project = {'url': 'xxxxxxxxxxxx', + 'hypervisor': 'hypervisor', + 'architecture': 'x86', + 'os': 'os', + 'version': '8.0', + 'md5hash': 'add6bb58e139be103324d04d82d8f545' + } + response = self._do_post('os-agents', 'agent-post-req', + project) + self.assertEqual(response.status, 200) + project['agent_id'] = 1 + self._verify_response('agent-post-resp', project, response) + return project + + def test_agent_list(self): + """ Return a list of all agent builds.""" + response = self._do_get('os-agents') + self.assertEqual(response.status, 200) + project = {'url': 'xxxxxxxxxxxx', + 'hypervisor': 'hypervisor', + 'architecture': 'x86', + 'os': 'os', + 'version': '8.0', + 'md5hash': 'add6bb58e139be103324d04d82d8f545', + 'agent_id': 1 + } + return self._verify_response('agents-get-resp', project, response) + + def test_agent_update(self): + """Update an existing agent build.""" + agent_id = 1 + subs = {'version': '7.0', + 'url': 'xxx://xxxx/xxx/xxx', + 'md5hash': 'add6bb58e139be103324d04d82d8f545'} + response = self._do_put('os-agents/%s' % agent_id, + 'agent-update-put-req', subs) + self.assertEqual(response.status, 200) + subs['agent_id'] = 1 + return self._verify_response('agent-update-put-resp', subs, response) + + def test_agent_delete(self): + """Deletes an existing agent build.""" + agent_id = 1 + response = self._do_delete('os-agents/%s' % agent_id) + self.assertEqual(response.status, 200) + + +class AgentsXmlTest(AgentsJsonTest): + ctype = "xml" + + class AggregatesSampleJsonTest(ServersSampleBase): extension_name = "nova.api.openstack.compute.contrib" + \ ".aggregates.Aggregates" |
