Added information about plugins data into astute.yaml

Added information about plugins scripts and plugins repositories.
This information will be used by puppet to create repositories and
synchronise plugins scripts.

Change-Id: Ie2df470a4f05b73162144f9c87d1023760b282c7
Closes-Bug: 1565061
This commit is contained in:
Bulat Gaifullin 2016-04-01 23:02:28 +03:00
parent 7e1d537e8e
commit 463097a6c7
2 changed files with 129 additions and 4 deletions

View File

@ -27,6 +27,8 @@ from nailgun.extensions import node_extension_call
from nailgun.extensions.volume_manager import manager as volume_manager
from nailgun.logger import logger
from nailgun import objects
from nailgun.plugins import adapters
from nailgun.settings import settings
from nailgun import utils
from nailgun.utils.ceph import get_pool_pg_count
from nailgun.utils.role_resolver import NameMatchingPolicy
@ -333,10 +335,25 @@ class DeploymentMultinodeSerializer(object):
for node in serialized_nodes:
node['tasks'] = self.task_graph.deploy_task_serialize(node)
@classmethod
def inject_list_of_plugins(cls, attributes, cluster):
def inject_list_of_plugins(self, attributes, cluster):
"""Added information about plugins to serialized attributes.
:param attributes: the serialized attributes
:param cluster: the cluster object
"""
plugins = objects.ClusterPlugins.get_enabled(cluster.id)
attributes['plugins'] = [p['name'] for p in plugins]
attributes['plugins'] = [
self.serialize_plugin(cluster, p) for p in plugins
]
@classmethod
def serialize_plugin(cls, cluster, plugin):
"""Gets plugin information to include into serialized attributes.
:param cluster: the cluster object
:param plugin: the plugin object
"""
return plugin['name']
class DeploymentHASerializer(DeploymentMultinodeSerializer):
@ -724,6 +741,47 @@ class DeploymentLCMSerializer(DeploymentHASerializer90):
self.inject_configs(node, roles, serialized_node)
return serialized_node
@classmethod
def serialize_plugin(cls, cluster, plugin):
os_name = cluster.release.operating_system
adapter = adapters.wrap_plugin(plugin)
result = {
'name': plugin['name'],
'scripts': [
{
'remote_url': adapter.master_scripts_path(cluster),
'local_path': adapter.slaves_scripts_path
}
]
}
if not adapter.repo_files(cluster):
return result
# TODO(bgaifullin) move priority to plugin metadata
if os_name == consts.RELEASE_OS.centos:
repo = {
'type': 'rpm',
'name': adapter.full_name,
'uri': adapter.repo_url(cluster),
'priority': settings.REPO_PRIORITIES['plugins']['centos']
}
elif os_name == consts.RELEASE_OS.ubuntu:
repo = {
'type': 'deb',
'name': adapter.full_name,
'uri': adapter.repo_url(cluster),
'suite': '/',
'section': '',
'priority': settings.REPO_PRIORITIES['plugins']['ubuntu']
}
else:
logger.warning("Unsupported OS: %s.", os_name)
return result
result['repositories'] = [repo]
return result
def inject_configs(self, node, roles, output):
node_config = output.setdefault('configuration', {})
for config in self._configs:

View File

@ -20,6 +20,7 @@ import six
from nailgun import consts
from nailgun import objects
from nailgun.orchestrator import deployment_serializers
from nailgun.plugins import adapters
from nailgun.orchestrator.neutron_serializers import \
NeutronNetworkDeploymentSerializer90
@ -437,7 +438,10 @@ class TestDeploymentLCMSerialization90(
def setUp(self):
super(TestDeploymentLCMSerialization90, self).setUp()
self.cluster = self.env.create(
release_kwargs={'version': self.env_version},
release_kwargs={
'version': self.env_version,
'operating_system': consts.RELEASE_OS.ubuntu
},
cluster_kwargs={
'mode': consts.CLUSTER_MODES.ha_compact,
'net_provider': consts.CLUSTER_NET_PROVIDERS.neutron,
@ -501,6 +505,69 @@ class TestDeploymentLCMSerialization90(
serialized[1]['roles']
)
@mock.patch.object(
adapters.PluginAdapterBase, 'repo_files',
mock.MagicMock(return_value=True)
)
def test_plugins_in_serialized(self):
releases = [
{'repository_path': 'repositories/ubuntu',
'version': 'mitaka-9.0', 'os': 'ubuntu',
'mode': ['ha', 'multinode'],
'deployment_scripts_path': 'deployment_scripts/'}
]
plugin1 = self.env.create_plugin(
cluster=self.cluster_db,
name='plugin_1',
attributes_metadata={'attributes': {'name': 'plugin_1'}},
package_version='4.0.0',
releases=releases
)
plugin2 = self.env.create_plugin(
cluster=self.cluster_db,
name='plugin_2',
attributes_metadata={'attributes': {'name': 'plugin_2'}},
package_version='4.0.0',
releases=releases
)
self.env.create_plugin(
cluster=self.cluster_db,
enabled=False,
name='plugin_3',
attributes_metadata={'attributes': {'name': 'plugin_3'}},
package_version='4.0.0',
releases=releases
)
self.env.create_node(
cluster_id=self.cluster_db.id,
roles=['compute']
)
plugins_data = [
{
'name': p.name,
'scripts': [{
'remote_url': p.master_scripts_path(self.cluster_db),
'local_path': p.slaves_scripts_path
}],
'repositories': [{
'type': 'deb',
'name': p.full_name,
'uri': p.repo_url(self.cluster_db),
'suite': '/',
'section': '',
'priority': 1100
}]
}
for p in six.moves.map(adapters.wrap_plugin, [plugin1, plugin2])
]
objects.Cluster.prepare_for_deployment(self.cluster_db)
serialized = self.serializer.serialize(
self.cluster_db, self.cluster_db.nodes)
for node in serialized:
self.assertIn('plugins', node)
self.datadiff(plugins_data, node['plugins'], compare_sorted=True)
class TestDeploymentHASerializer90(
TestSerializer90Mixin,