def get_network_roles(cls, cluster, merge_policy): """Returns the network roles from plugins. The roles cluster and plugins will be mixed according to merge policy. """ instance_roles = cluster.release.network_roles_metadata all_roles = dict((role['id'], role) for role in instance_roles) conflict_roles = dict() for plugin in ClusterPlugin.get_enabled(cluster.id): for role in plugin.network_roles_metadata: role_id = role['id'] if role_id in all_roles: try: merge_policy.apply_patch( all_roles[role_id], role ) except errors.UnresolvableConflict as e: logger.error("cannot merge plugin {0}: {1}" .format(plugin.name, e)) conflict_roles[role_id] = plugin.name else: all_roles[role_id] = role if conflict_roles: raise errors.NetworkRoleConflict( "Cannot override existing network roles: '{0}' in " "plugins: '{1}'".format( ', '.join(conflict_roles), ', '.join(set(conflict_roles.values())))) return list(all_roles.values())
def get_plugins_deployment_graph(cls, cluster, graph_type=None): deployment_tasks = [] processed_tasks = {} enabled_plugins = ClusterPlugin.get_enabled(cluster.id) graph_metadata = {} for plugin_adapter in map(wrap_plugin, enabled_plugins): depl_graph = plugin_adapter.get_deployment_graph(graph_type) depl_tasks = depl_graph.pop('tasks') dict_update(graph_metadata, depl_graph) for t in depl_tasks: t_id = t['id'] if t_id in processed_tasks: raise errors.AlreadyExists( 'Plugin {0} is overlapping with plugin {1} ' 'by introducing the same deployment task with ' 'id {2}'.format( plugin_adapter.full_name, processed_tasks[t_id], t_id ) ) processed_tasks[t_id] = plugin_adapter.full_name deployment_tasks.extend(depl_tasks) graph_metadata['tasks'] = deployment_tasks return graph_metadata
def get_network_roles(cls, cluster, merge_policy): """Returns the network roles from plugins. The roles cluster and plugins will be mixed according to merge policy. """ instance_roles = cluster.release.network_roles_metadata all_roles = dict((role['id'], role) for role in instance_roles) conflict_roles = dict() for plugin in ClusterPlugin.get_enabled(cluster.id): for role in plugin.network_roles_metadata: role_id = role['id'] if role_id in all_roles: try: merge_policy.apply_patch(all_roles[role_id], role) except errors.UnresolvableConflict as e: logger.error("cannot merge plugin {0}: {1}".format( plugin.name, e)) conflict_roles[role_id] = plugin.name else: all_roles[role_id] = role if conflict_roles: raise errors.NetworkRoleConflict( "Cannot override existing network roles: '{0}' in " "plugins: '{1}'".format( ', '.join(conflict_roles), ', '.join(set(conflict_roles.values())))) return list(all_roles.values())
def get_plugins_node_roles(cls, cluster): result = {} core_roles = set(cluster.release.roles_metadata) for plugin_db in ClusterPlugin.get_enabled(cluster.id): plugin_roles = wrap_plugin(plugin_db).normalized_roles_metadata # we should check all possible cases of roles intersection # with core ones and those from other plugins # and afterwards show them in error message; # thus role names for which following checks # fails are accumulated in err_info variable err_roles = set( r for r in plugin_roles if r in core_roles or r in result ) if err_roles: raise errors.AlreadyExists( "Plugin (ID={0}) is unable to register the following " "node roles: {1}".format(plugin_db.id, ", ".join(sorted(err_roles))) ) # update info on processed roles in case of # success of all intersection checks result.update(plugin_roles) return result
def get_plugins_node_roles(cls, cluster): result = {} core_roles = set(cluster.release.roles_metadata) for plugin_db in ClusterPlugin.get_enabled(cluster.id): plugin_roles = wrap_plugin(plugin_db).normalized_roles_metadata # we should check all possible cases of roles intersection # with core ones and those from other plugins # and afterwards show them in error message; # thus role names for which following checks # fails are accumulated in err_info variable err_roles = set(r for r in plugin_roles if r in core_roles or r in result) if err_roles: raise errors.AlreadyExists( "Plugin (ID={0}) is unable to register the following " "node roles: {1}".format(plugin_db.id, ", ".join(sorted(err_roles)))) # update info on processed roles in case of # success of all intersection checks result.update(plugin_roles) return result
def get_cluster_plugins_info(self, cluster): plugins_info = [] for plugin_inst in ClusterPlugin.get_enabled(cluster.id): plugin_info = self.get_attributes(plugin_inst.__dict__, self.plugin_info_white_list) plugins_info.append(plugin_info) return plugins_info
def get_volumes_metadata(cls, cluster): """Get volumes metadata for all plugins enabled for the cluster :param cluster: A cluster instance :type cluster: Cluster model :return: dict -- Object with merged volumes data from plugins """ def _get_volumes_ids(instance): return [v['id'] for v in instance.volumes_metadata.get('volumes', [])] volumes_metadata = { 'volumes': [], 'volumes_roles_mapping': {}, 'rule_to_pick_boot_disk': [], } cluster_volumes_ids = _get_volumes_ids(cluster) release_volumes_ids = _get_volumes_ids(cluster.release) processed_volumes = {} enabled_plugins = ClusterPlugin.get_enabled(cluster.id) for plugin_adapter in map(wrap_plugin, enabled_plugins): metadata = plugin_adapter.volumes_metadata for volume in metadata.get('volumes', []): volume_id = volume['id'] for owner, volumes_ids in (('cluster', cluster_volumes_ids), ('release', release_volumes_ids)): if volume_id in volumes_ids: raise errors.AlreadyExists( 'Plugin {0} is overlapping with {1} ' 'by introducing the same volume with ' 'id "{2}"'.format(plugin_adapter.full_name, owner, volume_id) ) elif volume_id in processed_volumes: raise errors.AlreadyExists( 'Plugin {0} is overlapping with plugin {1} ' 'by introducing the same volume with ' 'id "{2}"'.format( plugin_adapter.full_name, processed_volumes[volume_id], volume_id ) ) processed_volumes[volume_id] = plugin_adapter.full_name volumes_metadata.get('volumes_roles_mapping', {}).update( metadata.get('volumes_roles_mapping', {})) volumes_metadata.get('volumes', []).extend( metadata.get('volumes', [])) volumes_metadata.get('rule_to_pick_boot_disk', []).extend( metadata.get('rule_to_pick_boot_disk', [])) return volumes_metadata
def get_cluster_tags_query(cls, cluster): plugins_ids = (ClusterPlugin.get_enabled(cluster.id) .with_entities(models.Plugin.id).subquery()) return db().query(models.Tag).filter( ((models.Tag.owner_id == cluster.release.id) & (models.Tag.owner_type == 'release')) | ((models.Tag.owner_id == cluster.id) & (models.Tag.owner_type == 'cluster')) | ((models.Tag.owner_id.in_(plugins_ids)) & (models.Tag.owner_type == 'plugin')) )
def get_volumes_metadata(cls, cluster): """Get volumes metadata for all plugins enabled for the cluster :param cluster: A cluster instance :type cluster: Cluster model :return: dict -- Object with merged volumes data from plugins """ def _get_volumes_ids(instance): return [ v['id'] for v in instance.volumes_metadata.get('volumes', []) ] volumes_metadata = { 'volumes': [], 'volumes_roles_mapping': {}, 'rule_to_pick_boot_disk': [], } cluster_volumes_ids = _get_volumes_ids(cluster) release_volumes_ids = _get_volumes_ids(cluster.release) processed_volumes = {} enabled_plugins = ClusterPlugin.get_enabled(cluster.id) for plugin_adapter in map(wrap_plugin, enabled_plugins): metadata = plugin_adapter.volumes_metadata for volume in metadata.get('volumes', []): volume_id = volume['id'] for owner, volumes_ids in (('cluster', cluster_volumes_ids), ('release', release_volumes_ids)): if volume_id in volumes_ids: raise errors.AlreadyExists( 'Plugin {0} is overlapping with {1} ' 'by introducing the same volume with ' 'id "{2}"'.format(plugin_adapter.full_name, owner, volume_id)) elif volume_id in processed_volumes: raise errors.AlreadyExists( 'Plugin {0} is overlapping with plugin {1} ' 'by introducing the same volume with ' 'id "{2}"'.format(plugin_adapter.full_name, processed_volumes[volume_id], volume_id)) processed_volumes[volume_id] = plugin_adapter.full_name volumes_metadata.get('volumes_roles_mapping', {}).update( metadata.get('volumes_roles_mapping', {})) volumes_metadata.get('volumes', []).extend(metadata.get('volumes', [])) volumes_metadata.get('rule_to_pick_boot_disk', []).extend( metadata.get('rule_to_pick_boot_disk', [])) return volumes_metadata
def get_tags_metadata(cls, cluster): """Get tags metadata for all plugins enabled for the cluster :param cluster: A cluster instance :type cluster: Cluster model :return: dict -- Object with merged tags data from plugins """ tags_metadata = {} enabled_plugins = ClusterPlugin.get_enabled(cluster.id) for plugin in enabled_plugins: tags_metadata.update(plugin.tags_metadata) return tags_metadata
def get_plugins_node_default_attributes(cls, cluster): """Get node attributes metadata for enabled plugins of the cluster. :param cluster: A cluster instance :type cluster: models.Cluster :returns: dict -- Object with node attributes """ plugins_node_metadata = {} enabled_plugins = ClusterPlugin.get_enabled(cluster.id) for plugin_adapter in map(wrap_plugin, enabled_plugins): metadata = plugin_adapter.node_attributes_metadata # TODO(ekosareva): resolve conflicts of same attribute names # for different plugins plugins_node_metadata.update(metadata) return plugins_node_metadata
def get_volumes_metadata(cls, cluster): """Get volumes metadata for cluster from all plugins which enabled it. :param cluster: A cluster instance :type cluster: Cluster model :return: dict -- Object with merged volumes data from plugins """ volumes_metadata = { 'volumes': [], 'volumes_roles_mapping': {}, 'rule_to_pick_boot_disk': [], } release_volumes = cluster.release.volumes_metadata.get('volumes', []) release_volumes_ids = [v['id'] for v in release_volumes] processed_volumes = {} enabled_plugins = ClusterPlugin.get_enabled(cluster.id) for plugin_adapter in map(wrap_plugin, enabled_plugins): metadata = plugin_adapter.volumes_metadata for volume in metadata.get('volumes', []): volume_id = volume['id'] if volume_id in release_volumes_ids: raise errors.AlreadyExists( 'Plugin {0} is overlapping with release ' 'by introducing the same volume with id "{1}"' .format(plugin_adapter.full_name, volume_id)) elif volume_id in processed_volumes: raise errors.AlreadyExists( 'Plugin {0} is overlapping with plugin {1} ' 'by introducing the same volume with id "{2}"' .format(plugin_adapter.full_name, processed_volumes[volume_id], volume_id)) processed_volumes[volume_id] = plugin_adapter.full_name volumes_metadata.get('volumes_roles_mapping', {}).update( metadata.get('volumes_roles_mapping', {})) volumes_metadata.get('volumes', []).extend( metadata.get('volumes', [])) volumes_metadata.get('rule_to_pick_boot_disk', []).extend( metadata.get('rule_to_pick_boot_disk', [])) return volumes_metadata
def get_volumes_metadata(cls, cluster): """Get volumes metadata for cluster from all plugins which enabled it. :param cluster: A cluster instance :type cluster: Cluster model :return: dict -- Object with merged volumes data from plugins """ volumes_metadata = { 'volumes': [], 'volumes_roles_mapping': {}, 'rule_to_pick_boot_disk': [], } release_volumes = cluster.release.volumes_metadata.get('volumes', []) release_volumes_ids = [v['id'] for v in release_volumes] processed_volumes = {} enabled_plugins = ClusterPlugin.get_enabled(cluster.id) for plugin_adapter in map(wrap_plugin, enabled_plugins): metadata = plugin_adapter.volumes_metadata for volume in metadata.get('volumes', []): volume_id = volume['id'] if volume_id in release_volumes_ids: raise errors.AlreadyExists( 'Plugin {0} is overlapping with release ' 'by introducing the same volume with id "{1}"'.format( plugin_adapter.full_name, volume_id)) elif volume_id in processed_volumes: raise errors.AlreadyExists( 'Plugin {0} is overlapping with plugin {1} ' 'by introducing the same volume with id "{2}"'.format( plugin_adapter.full_name, processed_volumes[volume_id], volume_id)) processed_volumes[volume_id] = plugin_adapter.full_name volumes_metadata.get('volumes_roles_mapping', {}).update( metadata.get('volumes_roles_mapping', {})) volumes_metadata.get('volumes', []).extend(metadata.get('volumes', [])) volumes_metadata.get('rule_to_pick_boot_disk', []).extend( metadata.get('rule_to_pick_boot_disk', [])) return volumes_metadata
def get_nic_default_attributes(cls, cluster): """Get default plugin nic attributes for cluster. :param cluster: A cluster instance :type cluster: Cluster model :returns: dict -- Object with nic attributes """ plugins_nic_metadata = {} enabled_plugins = ClusterPlugin.get_enabled(cluster.id) for plugin_adapter in six.moves.map(wrap_plugin, enabled_plugins): metadata = plugin_adapter.nic_attributes_metadata if metadata: metadata = dict_merge({ 'metadata': { 'label': plugin_adapter.title, 'class': 'plugin'}}, metadata) plugins_nic_metadata[plugin_adapter.name] = metadata return plugins_nic_metadata
def get_plugins_deployment_tasks(cls, cluster, graph_type=None): deployment_tasks = [] processed_tasks = {} enabled_plugins = ClusterPlugin.get_enabled(cluster.id) for plugin_adapter in map(wrap_plugin, enabled_plugins): depl_tasks = plugin_adapter.get_deployment_tasks(graph_type) for t in depl_tasks: t_id = t['id'] if t_id in processed_tasks: raise errors.AlreadyExists( 'Plugin {0} is overlapping with plugin {1} ' 'by introducing the same deployment task with ' 'id {2}'.format(plugin_adapter.full_name, processed_tasks[t_id], t_id)) processed_tasks[t_id] = plugin_adapter.full_name deployment_tasks.extend(depl_tasks) return deployment_tasks
def get_nic_default_attributes(cls, cluster): """Get default plugin nic attributes for cluster. :param cluster: A cluster instance :type cluster: Cluster model :returns: dict -- Object with nic attributes """ plugins_nic_metadata = {} enabled_plugins = ClusterPlugin.get_enabled(cluster.id) for plugin_adapter in six.moves.map(wrap_plugin, enabled_plugins): metadata = plugin_adapter.nic_attributes_metadata if metadata: metadata = dict_merge( { 'metadata': { 'label': plugin_adapter.title, 'class': 'plugin' } }, metadata) plugins_nic_metadata[plugin_adapter.name] = metadata return plugins_nic_metadata
def get_enabled_plugins(cls, cluster): return [wrap_plugin(plugin) for plugin in ClusterPlugin.get_enabled(cluster.id)]
def get_enabled_plugins(cls, cluster): return [ wrap_plugin(plugin) for plugin in ClusterPlugin.get_enabled(cluster.id) ]