From 132b4f8482697ef7392adb2f5afc6d5a35ab2957 Mon Sep 17 00:00:00 2001 From: Alexey Shtokolov Date: Mon, 28 Mar 2016 22:21:16 +0300 Subject: [PATCH] Add Deployment Info handlers /api/transactions/:transaction_id/deployment_info /api/transactions/:transaction_id/settings /api/transactions/:transaction_id/network_configuration Closes-Bug: #1564133 Change-Id: Ifbb539757b1954c07eb12d01b82c57480930e1a3 --- .../nailgun/api/v1/handlers/transactions.py | 31 ++++++ nailgun/nailgun/api/v1/urls.py | 10 ++ .../test/unit/test_transaction_handler.py | 105 ++++++++++++++++++ 3 files changed, 146 insertions(+) diff --git a/nailgun/nailgun/api/v1/handlers/transactions.py b/nailgun/nailgun/api/v1/handlers/transactions.py index 4d5ec72f44..8f5abb1912 100644 --- a/nailgun/nailgun/api/v1/handlers/transactions.py +++ b/nailgun/nailgun/api/v1/handlers/transactions.py @@ -56,3 +56,34 @@ class TransactionCollectionHandler(CollectionHandler): ) else: return self.collection.to_json() + + +class BaseTransactionDataHandler(TransactionHandler): + + get_data = None + + @content + def GET(self, transaction_id): + """:returns: Collection of JSONized DeploymentInfo objects. + + :http: * 200 (OK) + * 404 (cluster not found in db) + """ + transaction = self.get_object_or_404(objects.Transaction, + transaction_id) + return self.get_data(transaction) + + +class TransactionDeploymentInfo(BaseTransactionDataHandler): + + get_data = objects.Transaction.get_deployment_info + + +class TransactionClusterSettings(BaseTransactionDataHandler): + + get_data = objects.Transaction.get_cluster_settings + + +class TransactionNetworkSettings(BaseTransactionDataHandler): + + get_data = objects.Transaction.get_network_settings diff --git a/nailgun/nailgun/api/v1/urls.py b/nailgun/nailgun/api/v1/urls.py index ac6ea2913a..faba83d49f 100644 --- a/nailgun/nailgun/api/v1/urls.py +++ b/nailgun/nailgun/api/v1/urls.py @@ -127,8 +127,12 @@ from nailgun.api.v1.handlers.role import RoleHandler from nailgun.api.v1.handlers.tasks import TaskCollectionHandler from nailgun.api.v1.handlers.tasks import TaskHandler +from nailgun.api.v1.handlers.transactions import TransactionClusterSettings from nailgun.api.v1.handlers.transactions import TransactionCollectionHandler +from nailgun.api.v1.handlers.transactions import TransactionDeploymentInfo from nailgun.api.v1.handlers.transactions import TransactionHandler +from nailgun.api.v1.handlers.transactions import TransactionNetworkSettings + from nailgun.api.v1.handlers.version import VersionHandler @@ -318,6 +322,12 @@ urls = ( TransactionHandler, r'/transactions/(?P\d+)/deployment_history/?$', DeploymentHistoryCollectionHandler, + r'/transactions/(?P\d+)/deployment_info/?$', + TransactionDeploymentInfo, + r'/transactions/(?P\d+)/network_configuration/?$', + TransactionNetworkSettings, + r'/transactions/(?P\d+)/settings/?$', + TransactionClusterSettings, r'/plugins/(?P\d+)/links/?$', PluginLinkCollectionHandler, diff --git a/nailgun/nailgun/test/unit/test_transaction_handler.py b/nailgun/nailgun/test/unit/test_transaction_handler.py index 82510ef134..7639021bff 100644 --- a/nailgun/nailgun/test/unit/test_transaction_handler.py +++ b/nailgun/nailgun/test/unit/test_transaction_handler.py @@ -15,6 +15,8 @@ from nailgun import consts from nailgun.db.sqlalchemy.models import Task +from nailgun import objects +from nailgun.orchestrator import deployment_serializers from nailgun.test.base import BaseTestCase from nailgun.utils import reverse @@ -131,3 +133,106 @@ class TestTransactionHandlers(BaseTestCase): ) self.assertEqual(resp.status_code, 404) self.assertIsNone(self.db().query(Task).get(task.id)) + + def test_get_transaction_cluster_attributes(self): + cluster = self.cluster_db + cluster_attrs = objects.Cluster.get_editable_attributes(cluster) + transaction = objects.Transaction.create({ + 'cluster_id': cluster.id, + 'status': consts.TASK_STATUSES.ready, + 'name': consts.TASK_NAMES.deployment + }) + objects.Transaction.attach_cluster_settings( + transaction, {'editable': cluster_attrs} + ) + self.assertIsNotNone( + objects.Transaction.get_cluster_settings(transaction) + ) + resp = self.app.get( + reverse( + 'TransactionClusterSettings', + kwargs={'transaction_id': transaction.id}), + headers=self.default_headers + ) + self.assertEqual(200, resp.status_code) + self.datadiff(cluster_attrs, resp.json_body['editable']) + + def test_get_cluster_attributes_fail_not_existed_transaction(self): + resp = self.app.get( + reverse( + 'TransactionClusterSettings', + kwargs={'transaction_id': -1}), + headers=self.default_headers, + expect_errors=True + ) + self.assertEqual(resp.status_code, 404) + + def test_get_transaction_deployment_info(self): + cluster = self.cluster_db + nodes = objects.Cluster.get_nodes_not_for_deletion(cluster) + deployment_node_info = deployment_serializers.serialize_for_lcm( + cluster, nodes + ) + deployment_info = {node['uid']: node for node in deployment_node_info} + transaction = objects.Transaction.create({ + 'cluster_id': cluster.id, + 'status': consts.TASK_STATUSES.ready, + 'name': consts.TASK_NAMES.deployment + }) + objects.Transaction.attach_deployment_info( + transaction, deployment_info + ) + self.assertIsNotNone( + objects.Transaction.get_deployment_info(transaction) + ) + resp = self.app.get( + reverse( + 'TransactionDeploymentInfo', + kwargs={'transaction_id': transaction.id}), + headers=self.default_headers + ) + self.assertEqual(200, resp.status_code) + self.datadiff(deployment_info, resp.json_body) + + def test_get_deployment_info_fail_not_existed_transaction(self): + resp = self.app.get( + reverse( + 'TransactionDeploymentInfo', + kwargs={'transaction_id': -1}), + headers=self.default_headers, + expect_errors=True + ) + self.assertEqual(resp.status_code, 404) + + def test_get_transaction_network_settings(self): + cluster = self.cluster_db + resp = self.env.neutron_networks_get(cluster.id) + self.assertEqual(200, resp.status_code) + net_attrs = resp.json_body + transaction = objects.Transaction.create({ + 'cluster_id': cluster.id, + 'status': consts.TASK_STATUSES.ready, + 'name': consts.TASK_NAMES.deployment + }) + objects.Transaction.attach_network_settings(transaction, net_attrs) + self.assertIsNotNone( + objects.Transaction.get_network_settings(transaction) + ) + resp = self.app.get( + reverse( + 'TransactionNetworkSettings', + kwargs={'transaction_id': transaction.id}), + headers=self.default_headers + ) + self.assertEqual(200, resp.status_code) + self.datadiff(net_attrs, resp.json_body) + + def test_get_network_settings_fail_not_existed_transaction(self): + resp = self.app.get( + reverse( + 'TransactionNetworkSettings', + kwargs={'transaction_id': -1}), + headers=self.default_headers, + expect_errors=True + ) + self.assertEqual(resp.status_code, 404)