def validate_allowed_attributes(cls, cluster, data, force): """Validates if attributes are hot pluggable or not. :param cluster: A cluster instance :type cluster: nailgun.db.sqlalchemy.models.cluster.Cluster :param data: Changed attributes of cluster :type data: dict :param force: Allow forcefully update cluster attributes :type force: bool :raises: errors.NotAllowed """ # TODO(need to enable restrictions check for cluster attributes[1]) # [1] https://bugs.launchpad.net/fuel/+bug/1519904 # Validates only that plugin can be installed on deployed env. # If cluster is locked we have to check which attributes # we want to change and block an entire operation if there # one with always_editable=False. if not cluster.is_locked or force: return editable_cluster = objects.Cluster.get_editable_attributes( cluster, all_plugins_versions=True) editable_request = data.get('editable', {}) for attr_name, attr_request in six.iteritems(editable_request): attr_cluster = editable_cluster.get(attr_name, {}) meta_cluster = attr_cluster.get('metadata', {}) meta_request = attr_request.get('metadata', {}) if PluginManager.is_plugin_data(attr_cluster): if meta_request['enabled']: changed_ids = [meta_request['chosen_id']] if meta_cluster['enabled']: changed_ids.append(meta_cluster['chosen_id']) changed_ids = set(changed_ids) elif meta_cluster['enabled']: changed_ids = [meta_cluster['chosen_id']] else: continue for plugin in meta_cluster['versions']: plugin_id = plugin['metadata']['plugin_id'] always_editable = plugin['metadata']\ .get('always_editable', False) if plugin_id in changed_ids and not always_editable: raise errors.NotAllowed( "Plugin '{0}' version '{1}' couldn't be changed " "after or during deployment." .format(attr_name, plugin['metadata']['plugin_version']), log_message=True ) elif not meta_cluster.get('always_editable', False): raise errors.NotAllowed( "Environment attribute '{0}' couldn't be changed " "after or during deployment.".format(attr_name), log_message=True )
def validate_allowed_attributes(cls, cluster, data, force): """Validates if attributes are hot pluggable or not. :param cluster: A cluster instance :type cluster: nailgun.db.sqlalchemy.models.cluster.Cluster :param data: Changed attributes of cluster :type data: dict :param force: Allow forcefully update cluster attributes :type force: bool :raises: errors.NotAllowed """ # TODO(need to enable restrictions check for cluster attributes[1]) # [1] https://bugs.launchpad.net/fuel/+bug/1519904 # Validates only that plugin can be installed on deployed env. # If cluster is locked we have to check which attributes # we want to change and block an entire operation if there # one with always_editable=False. if not cluster.is_locked or force: return editable_cluster = objects.Cluster.get_editable_attributes( cluster, all_plugins_versions=True) editable_request = data.get('editable', {}) for attr_name, attr_request in six.iteritems(editable_request): attr_cluster = editable_cluster.get(attr_name, {}) meta_cluster = attr_cluster.get('metadata', {}) meta_request = attr_request.get('metadata', {}) if PluginManager.is_plugin_data(attr_cluster): if meta_request['enabled']: changed_ids = [meta_request['chosen_id']] if meta_cluster['enabled']: changed_ids.append(meta_cluster['chosen_id']) changed_ids = set(changed_ids) elif meta_cluster['enabled']: changed_ids = [meta_cluster['chosen_id']] else: continue for plugin in meta_cluster['versions']: plugin_id = plugin['metadata']['plugin_id'] always_editable = plugin['metadata']\ .get('always_editable', False) if plugin_id in changed_ids and not always_editable: raise errors.NotAllowed( "Plugin '{0}' version '{1}' couldn't be changed " "after or during deployment." .format(attr_name, plugin['metadata']['plugin_version']), log_message=True ) elif not meta_cluster.get('always_editable', False): raise errors.NotAllowed( "Environment attribute '{0}' couldn't be changed " "after or during deployment.".format(attr_name), log_message=True )