Merge "Custom graph support for OpenstackConfigExecuteHandler"
This commit is contained in:
commit
e53540d019
@ -116,6 +116,7 @@ class OpenstackConfigExecuteHandler(BaseHandler):
|
|||||||
* 400 (Invalid data)
|
* 400 (Invalid data)
|
||||||
* 404 (Object dependencies not found)
|
* 404 (Object dependencies not found)
|
||||||
"""
|
"""
|
||||||
|
graph_type = web.input(graph_type=None).graph_type
|
||||||
filters = self.checked_data(self.validator.validate_execute)
|
filters = self.checked_data(self.validator.validate_execute)
|
||||||
|
|
||||||
cluster = self.get_object_or_404(
|
cluster = self.get_object_or_404(
|
||||||
@ -124,7 +125,7 @@ class OpenstackConfigExecuteHandler(BaseHandler):
|
|||||||
# Execute upload task for nodes
|
# Execute upload task for nodes
|
||||||
task_manager = self.task_manager(cluster_id=cluster.id)
|
task_manager = self.task_manager(cluster_id=cluster.id)
|
||||||
try:
|
try:
|
||||||
task = task_manager.execute(filters)
|
task = task_manager.execute(filters, graph_type=graph_type)
|
||||||
except Exception as exc:
|
except Exception as exc:
|
||||||
logger.warn(
|
logger.warn(
|
||||||
u'Cannot execute %s task nodes: %s',
|
u'Cannot execute %s task nodes: %s',
|
||||||
|
@ -1138,7 +1138,8 @@ class Cluster(NailgunObject):
|
|||||||
return PluginManager.get_legacy_tasks_for_cluster(instance)
|
return PluginManager.get_legacy_tasks_for_cluster(instance)
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def get_refreshable_tasks(cls, instance, filter_by_configs=None):
|
def get_refreshable_tasks(cls, instance, filter_by_configs=None,
|
||||||
|
graph_type=None):
|
||||||
"""Return list of refreshable tasks
|
"""Return list of refreshable tasks
|
||||||
|
|
||||||
If 'filter_by_configs' specified then only tasks needed to update
|
If 'filter_by_configs' specified then only tasks needed to update
|
||||||
@ -1147,12 +1148,13 @@ class Cluster(NailgunObject):
|
|||||||
|
|
||||||
:param instance: a Cluster instance
|
:param instance: a Cluster instance
|
||||||
:param filter_by_configs: a list with configs resources
|
:param filter_by_configs: a list with configs resources
|
||||||
|
:param graph_type: deployment graph type
|
||||||
:return: list of tasks
|
:return: list of tasks
|
||||||
"""
|
"""
|
||||||
if filter_by_configs:
|
if filter_by_configs:
|
||||||
filter_by_configs = set(filter_by_configs)
|
filter_by_configs = set(filter_by_configs)
|
||||||
tasks = []
|
tasks = []
|
||||||
for task in cls.get_deployment_tasks(instance):
|
for task in cls.get_deployment_tasks(instance, graph_type):
|
||||||
refresh_on = task.get(consts.TASK_REFRESH_FIELD)
|
refresh_on = task.get(consts.TASK_REFRESH_FIELD)
|
||||||
if (refresh_on
|
if (refresh_on
|
||||||
and (filter_by_configs is None
|
and (filter_by_configs is None
|
||||||
|
@ -1317,7 +1317,7 @@ class OpenstackConfigTaskManager(TaskManager):
|
|||||||
return tasks.ClusterTransaction
|
return tasks.ClusterTransaction
|
||||||
return tasks.UpdateOpenstackConfigTask
|
return tasks.UpdateOpenstackConfigTask
|
||||||
|
|
||||||
def execute(self, filters, force=False, **kwargs):
|
def execute(self, filters, force=False, graph_type=None, **kwargs):
|
||||||
self.check_running_task(consts.TASK_NAMES.deployment)
|
self.check_running_task(consts.TASK_NAMES.deployment)
|
||||||
|
|
||||||
task = Task(name=consts.TASK_NAMES.deployment,
|
task = Task(name=consts.TASK_NAMES.deployment,
|
||||||
@ -1332,6 +1332,7 @@ class OpenstackConfigTaskManager(TaskManager):
|
|||||||
task,
|
task,
|
||||||
self.get_deployment_task(),
|
self.get_deployment_task(),
|
||||||
nodes_to_update,
|
nodes_to_update,
|
||||||
|
graph_type=graph_type,
|
||||||
method_name='message',
|
method_name='message',
|
||||||
force=force
|
force=force
|
||||||
)
|
)
|
||||||
|
@ -2114,7 +2114,7 @@ class UpdateOpenstackConfigTask(BaseDeploymentTask):
|
|||||||
})
|
})
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def message(cls, task, nodes, **kwargs):
|
def message(cls, task, nodes, graph_type, **kwargs):
|
||||||
configs = objects.OpenstackConfigCollection.find_configs_for_nodes(
|
configs = objects.OpenstackConfigCollection.find_configs_for_nodes(
|
||||||
task.cluster, nodes)
|
task.cluster, nodes)
|
||||||
updated_configs = set()
|
updated_configs = set()
|
||||||
@ -2127,10 +2127,11 @@ class UpdateOpenstackConfigTask(BaseDeploymentTask):
|
|||||||
raise errors.NoChanges()
|
raise errors.NoChanges()
|
||||||
|
|
||||||
refreshable_tasks = objects.Cluster.get_refreshable_tasks(
|
refreshable_tasks = objects.Cluster.get_refreshable_tasks(
|
||||||
task.cluster, updated_configs
|
task.cluster, updated_configs, graph_type
|
||||||
)
|
)
|
||||||
task_ids = {t['id'] for t in refreshable_tasks}
|
task_ids = {t['id'] for t in refreshable_tasks}
|
||||||
deployment_tasks = objects.Cluster.get_deployment_tasks(task.cluster)
|
deployment_tasks = objects.Cluster.get_deployment_tasks(
|
||||||
|
task.cluster, graph_type)
|
||||||
return cls.call_deployment_method(
|
return cls.call_deployment_method(
|
||||||
task, tasks=deployment_tasks, nodes=nodes, task_ids=task_ids
|
task, tasks=deployment_tasks, nodes=nodes, task_ids=task_ids
|
||||||
)[1]
|
)[1]
|
||||||
|
@ -16,6 +16,7 @@ from mock import patch
|
|||||||
|
|
||||||
from nailgun import consts
|
from nailgun import consts
|
||||||
from nailgun.db.sqlalchemy.models import DeploymentGraphTask
|
from nailgun.db.sqlalchemy.models import DeploymentGraphTask
|
||||||
|
from nailgun import objects
|
||||||
from nailgun.orchestrator.tasks_templates import make_generic_task
|
from nailgun.orchestrator.tasks_templates import make_generic_task
|
||||||
from nailgun.task.manager import OpenstackConfigTaskManager
|
from nailgun.task.manager import OpenstackConfigTaskManager
|
||||||
from nailgun.test import base
|
from nailgun.test import base
|
||||||
@ -119,6 +120,28 @@ class TestOpenstackConfigTaskManager80(base.BaseIntegrationTest):
|
|||||||
self.assertItemsEqual(deployment_tasks, [
|
self.assertItemsEqual(deployment_tasks, [
|
||||||
make_generic_task([self.nodes[0].uid], self.refreshable_task)])
|
make_generic_task([self.nodes[0].uid], self.refreshable_task)])
|
||||||
|
|
||||||
|
@patch('nailgun.rpc.cast')
|
||||||
|
def test_configuration_execute_w_custom_graph(self, mocked_rpc):
|
||||||
|
custom_tasks = [
|
||||||
|
{
|
||||||
|
'id': 'custom-task',
|
||||||
|
'type': 'puppet',
|
||||||
|
'roles': '*'
|
||||||
|
}
|
||||||
|
]
|
||||||
|
objects.DeploymentGraph.create_for_model(
|
||||||
|
{'tasks': custom_tasks}, self.cluster, 'custom-graph')
|
||||||
|
task_manager = OpenstackConfigTaskManager(self.cluster.id)
|
||||||
|
task = task_manager.execute(
|
||||||
|
{'cluster_id': self.cluster.id}, graph_type='custom-graph')
|
||||||
|
|
||||||
|
self.assertEqual(task.status, consts.TASK_STATUSES.pending)
|
||||||
|
|
||||||
|
self.assertEqual(
|
||||||
|
mocked_rpc.call_args[0][1]['args']['tasks'][0]['task_name'],
|
||||||
|
'custom-task'
|
||||||
|
)
|
||||||
|
|
||||||
@patch('nailgun.rpc.cast')
|
@patch('nailgun.rpc.cast')
|
||||||
def test_configuration_execute_by_node_id(self, mocked_rpc):
|
def test_configuration_execute_by_node_id(self, mocked_rpc):
|
||||||
task_manager = OpenstackConfigTaskManager(self.cluster.id)
|
task_manager = OpenstackConfigTaskManager(self.cluster.id)
|
||||||
|
@ -1413,6 +1413,26 @@ class TestClusterObject(BaseTestCase):
|
|||||||
self.assertIn(deployment_tasks[1]['id'], tasks_ids)
|
self.assertIn(deployment_tasks[1]['id'], tasks_ids)
|
||||||
self.assertNotIn(deployment_tasks[0]['id'], tasks_ids)
|
self.assertNotIn(deployment_tasks[0]['id'], tasks_ids)
|
||||||
|
|
||||||
|
def test_get_refreshable_tasks_w_custom_graph(self):
|
||||||
|
deployment_tasks = [
|
||||||
|
self.env.get_default_plugin_deployment_tasks(**{
|
||||||
|
'id': 'refreshable_task_on_keystone',
|
||||||
|
consts.TASK_REFRESH_FIELD: ['keystone_config']
|
||||||
|
})[0]
|
||||||
|
]
|
||||||
|
cluster = self.cluster
|
||||||
|
release_graph = objects.DeploymentGraph.get_for_model(cluster.release)
|
||||||
|
release_tasks = objects.DeploymentGraph.get_tasks(release_graph)
|
||||||
|
objects.DeploymentGraph.create_for_model(
|
||||||
|
{'tasks': release_tasks}, cluster.release, 'custom-graph')
|
||||||
|
objects.DeploymentGraph.create_for_model(
|
||||||
|
{'tasks': deployment_tasks}, cluster, 'custom-graph')
|
||||||
|
|
||||||
|
refreshable_tasks = objects.Cluster.get_refreshable_tasks(
|
||||||
|
cluster, None, 'custom-graph')
|
||||||
|
tasks_ids = [t['id'] for t in refreshable_tasks]
|
||||||
|
self.assertIn(deployment_tasks[0]['id'], tasks_ids)
|
||||||
|
|
||||||
def test_get_plugin_network_roles(self):
|
def test_get_plugin_network_roles(self):
|
||||||
network_roles = [self._get_network_role_metadata()]
|
network_roles = [self._get_network_role_metadata()]
|
||||||
plugin_data = self.env.get_default_plugin_metadata(
|
plugin_data = self.env.get_default_plugin_metadata(
|
||||||
|
@ -473,6 +473,21 @@ class TestOpenstackConfigHandlers(BaseIntegrationTest):
|
|||||||
expect_errors=True)
|
expect_errors=True)
|
||||||
self.check_fail_deploy_running(deploy_task_id, resp)
|
self.check_fail_deploy_running(deploy_task_id, resp)
|
||||||
|
|
||||||
|
@mock.patch('objects.Cluster.get_deployment_tasks')
|
||||||
|
@mock.patch('nailgun.task.task.rpc.cast')
|
||||||
|
def test_execute_update_open_stack_config_w_custom_graph(
|
||||||
|
self, mock_rpc, tasks_mock):
|
||||||
|
data = {'cluster_id': self.clusters[0].id}
|
||||||
|
resp = self.app.put(
|
||||||
|
reverse('OpenstackConfigExecuteHandler') +
|
||||||
|
'?graph_type=custom-graph',
|
||||||
|
jsonutils.dumps(data),
|
||||||
|
headers=self.default_headers,
|
||||||
|
expect_errors=False
|
||||||
|
)
|
||||||
|
self.assertEqual(202, resp.status_code)
|
||||||
|
self.assertIn('custom-graph', tasks_mock.call_args[0])
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def _make_filter_url(cls, **kwargs):
|
def _make_filter_url(cls, **kwargs):
|
||||||
return '{0}?{1}'.format(
|
return '{0}?{1}'.format(
|
||||||
|
Loading…
Reference in New Issue
Block a user