def process_cluster_attributes(cls, cluster, attributes): """Generate Cluster-Plugins relation based on attributes. Iterates through plugins attributes, creates or deletes Cluster <-> Plugins relation if plugin is enabled or disabled. :param cluster: A cluster instance :type cluster: nailgun.db.sqlalchemy.models.cluster.Cluster :param attributes: Cluster attributes :type attributes: dict """ from nailgun.objects import Release plugins = {} # Detach plugins data for k in list(attributes): if cls.is_plugin_data(attributes[k]): plugins[k] = attributes.pop(k)['metadata'] propagate_task_deploy = get_in( attributes, 'common', 'propagate_task_deploy', 'value') if propagate_task_deploy is not None: legacy_tasks_are_ignored = not propagate_task_deploy else: legacy_tasks_are_ignored = not get_in( cluster.attributes.editable, 'common', 'propagate_task_deploy', 'value') for container in six.itervalues(plugins): default = container.get('default', False) for attrs in container.get('versions', []): version_metadata = attrs.pop('metadata') plugin_id = version_metadata['plugin_id'] plugin = Plugin.get_by_uid(plugin_id) if not plugin: logger.warning( 'Plugin with id "%s" is not found, skip it', plugin_id) continue enabled = container['enabled'] \ and plugin_id == container['chosen_id'] if (enabled and Release.is_lcm_supported(cluster.release) and legacy_tasks_are_ignored and cls.contains_legacy_tasks( wrap_plugin(Plugin.get_by_uid(plugin.id)))): raise errors.InvalidData( 'Cannot enable plugin with legacy tasks unless ' 'propagate_task_deploy attribute is set. ' 'Ensure tasks.yaml is empty and all tasks ' 'has version >= 2.0.0.') ClusterPlugin.set_attributes( cluster.id, plugin.id, enabled=enabled, attrs=attrs if enabled or default else None )
def process_cluster_attributes(cls, cluster, attributes): """Generate Cluster-Plugins relation based on attributes. Iterates through plugins attributes, creates or deletes Cluster <-> Plugins relation if plugin is enabled or disabled. :param cluster: A cluster instance :type cluster: nailgun.db.sqlalchemy.models.cluster.Cluster :param attributes: Cluster attributes :type attributes: dict """ from nailgun.objects import Release plugins = {} # Detach plugins data for k in list(attributes): if cls.is_plugin_data(attributes[k]): plugins[k] = attributes.pop(k)['metadata'] propagate_task_deploy = get_in(attributes, 'common', 'propagate_task_deploy', 'value') if propagate_task_deploy is not None: legacy_tasks_are_ignored = not propagate_task_deploy else: legacy_tasks_are_ignored = not get_in( cluster.attributes.editable, 'common', 'propagate_task_deploy', 'value') for container in six.itervalues(plugins): default = container.get('default', False) for attrs in container.get('versions', []): version_metadata = attrs.pop('metadata') plugin_id = version_metadata['plugin_id'] plugin = Plugin.get_by_uid(plugin_id) if not plugin: logger.warning('Plugin with id "%s" is not found, skip it', plugin_id) continue enabled = container['enabled'] \ and plugin_id == container['chosen_id'] if (enabled and Release.is_lcm_supported(cluster.release) and legacy_tasks_are_ignored and cls.contains_legacy_tasks( wrap_plugin(Plugin.get_by_uid(plugin.id)))): raise errors.InvalidData( 'Cannot enable plugin with legacy tasks unless ' 'propagate_task_deploy attribute is set. ' 'Ensure tasks.yaml is empty and all tasks ' 'has version >= 2.0.0.') ClusterPlugin.set_attributes( cluster.id, plugin.id, enabled=enabled, attrs=attrs if enabled or default else None)