From 93bd1e67052b0c2c3230d6f96dfaf33f43574d34 Mon Sep 17 00:00:00 2001 From: Rebeccah Date: Tue, 15 Oct 2019 17:36:55 -0400 Subject: [PATCH 1/3] Added in validation for each of the 3 fields that should not be changed if the instance is a container group, defaults in the textarea persist with these 3 options --- awx/api/generics.py | 9 ++++++++- awx/api/serializers.py | 12 ++++++++++++ awx/main/utils/common.py | 4 ++++ 3 files changed, 24 insertions(+), 1 deletion(-) diff --git a/awx/api/generics.py b/awx/api/generics.py index 8b8fb55894..ee6db9634d 100644 --- a/awx/api/generics.py +++ b/awx/api/generics.py @@ -46,7 +46,7 @@ from awx.main.utils import ( decrypt_field ) from awx.main.utils.db import get_all_field_names -from awx.api.serializers import ResourceAccessListElementSerializer, CopySerializer, UserSerializer +from awx.api.serializers import ResourceAccessListElementSerializer, CopySerializer, UserSerializer, InstanceGroupSerializer from awx.api.versioning import URLPathVersioning from awx.api.metadata import SublistAttachDetatchMetadata, Metadata @@ -317,6 +317,13 @@ class GenericAPIView(generics.GenericAPIView, APIView): for name, field in list(serializer.fields.items()): if getattr(field, 'read_only', None): del serializer.fields[name] + # Additionally, remove the following fields if an instance group is containerized. + if name == 'is_containerized': + import sdb + sdb.set_trace() + del serializer.fields['policy_instance_percentage'] + del serializer.fields['policy_instance_minimum'] + del serializer.fields['policy_instance_list'] serializer._data = self.update_raw_data(serializer.data) return serializer diff --git a/awx/api/serializers.py b/awx/api/serializers.py index 09066a4871..c4f86a9842 100644 --- a/awx/api/serializers.py +++ b/awx/api/serializers.py @@ -4801,6 +4801,18 @@ class InstanceGroupSerializer(BaseSerializer): raise serializers.ValidationError(_('Isolated instances may not be added or removed from instances groups via the API.')) if self.instance and self.instance.controller_id is not None: raise serializers.ValidationError(_('Isolated instance group membership may not be managed via the API.')) + if self.instance.is_containerized: + raise serializers.ValidationError(_('Containerized instances may not be managed via the API')) + return value + + def validate_policy_instance_percentage(self, value): + if value and self.instance.is_containerized: + raise serializers.ValidationError(_('Containerized instances may not be managed via the API')) + return value + + def validate_policy_instance_minimum(self, value): + if value and self.instance.is_containerized: + raise serializers.ValidationError(_('Containerized instances may not be managed via the API')) return value def validate_name(self, value): diff --git a/awx/main/utils/common.py b/awx/main/utils/common.py index 11e4722f5f..e7603fb037 100644 --- a/awx/main/utils/common.py +++ b/awx/main/utils/common.py @@ -366,6 +366,10 @@ def get_allowed_fields(obj, serializer_mapping): field_blacklist = ACTIVITY_STREAM_FIELD_EXCLUSIONS.get(obj._meta.model_name, []) if field_blacklist: allowed_fields = [f for f in allowed_fields if f not in field_blacklist] + # raise Exception(_("please render this")) + # if obj.__class__.__name__ == 'InstanceGroup' and obj.is_containerized: + # container_group_blacklist = ["policy_instance_percentage", "policy_instance_minimum", "policy_instance_list"] + # allowed_fields = [f for f in allowed_fields if f not in container_group_blacklist] return allowed_fields From ef7b3fec94a8a80a9a79ec2e48fbadeac1ecff26 Mon Sep 17 00:00:00 2001 From: Rebeccah Date: Tue, 22 Oct 2019 15:57:06 -0400 Subject: [PATCH 2/3] removed policy_instance variables from container groups default values in the API put/patch view --- awx/api/generics.py | 11 +++++------ awx/api/serializers.py | 2 +- awx/main/utils/common.py | 4 ---- 3 files changed, 6 insertions(+), 11 deletions(-) diff --git a/awx/api/generics.py b/awx/api/generics.py index ee6db9634d..4f595cb384 100644 --- a/awx/api/generics.py +++ b/awx/api/generics.py @@ -318,12 +318,11 @@ class GenericAPIView(generics.GenericAPIView, APIView): if getattr(field, 'read_only', None): del serializer.fields[name] # Additionally, remove the following fields if an instance group is containerized. - if name == 'is_containerized': - import sdb - sdb.set_trace() - del serializer.fields['policy_instance_percentage'] - del serializer.fields['policy_instance_minimum'] - del serializer.fields['policy_instance_list'] + if name == 'is_containerized' and type(serializer) == InstanceGroupSerializer: + if serializer.instance is not None and serializer.instance.is_containerized: + del serializer.fields['policy_instance_percentage'] + del serializer.fields['policy_instance_minimum'] + del serializer.fields['policy_instance_list'] serializer._data = self.update_raw_data(serializer.data) return serializer diff --git a/awx/api/serializers.py b/awx/api/serializers.py index c4f86a9842..816a7bf4e0 100644 --- a/awx/api/serializers.py +++ b/awx/api/serializers.py @@ -4802,7 +4802,7 @@ class InstanceGroupSerializer(BaseSerializer): if self.instance and self.instance.controller_id is not None: raise serializers.ValidationError(_('Isolated instance group membership may not be managed via the API.')) if self.instance.is_containerized: - raise serializers.ValidationError(_('Containerized instances may not be managed via the API')) + raise serializers.ValidationError(_('Containerized instances may not be managed via the API')) return value def validate_policy_instance_percentage(self, value): diff --git a/awx/main/utils/common.py b/awx/main/utils/common.py index e7603fb037..11e4722f5f 100644 --- a/awx/main/utils/common.py +++ b/awx/main/utils/common.py @@ -366,10 +366,6 @@ def get_allowed_fields(obj, serializer_mapping): field_blacklist = ACTIVITY_STREAM_FIELD_EXCLUSIONS.get(obj._meta.model_name, []) if field_blacklist: allowed_fields = [f for f in allowed_fields if f not in field_blacklist] - # raise Exception(_("please render this")) - # if obj.__class__.__name__ == 'InstanceGroup' and obj.is_containerized: - # container_group_blacklist = ["policy_instance_percentage", "policy_instance_minimum", "policy_instance_list"] - # allowed_fields = [f for f in allowed_fields if f not in container_group_blacklist] return allowed_fields From 4c199b0ab21d1998a96ee497f6b79cfee445b2af Mon Sep 17 00:00:00 2001 From: Rebeccah Date: Wed, 23 Oct 2019 17:15:40 -0400 Subject: [PATCH 3/3] moved filterint out policy instance values in the api browser input box into the instanceGroupDetail class where I overrode the update_raw_data function to parse out the unneeded data. Additionally added the fix for checking the value in the serializer. --- awx/api/generics.py | 8 +------- awx/api/serializers.py | 2 +- awx/api/views/__init__.py | 7 +++++++ 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/awx/api/generics.py b/awx/api/generics.py index 4f595cb384..8b8fb55894 100644 --- a/awx/api/generics.py +++ b/awx/api/generics.py @@ -46,7 +46,7 @@ from awx.main.utils import ( decrypt_field ) from awx.main.utils.db import get_all_field_names -from awx.api.serializers import ResourceAccessListElementSerializer, CopySerializer, UserSerializer, InstanceGroupSerializer +from awx.api.serializers import ResourceAccessListElementSerializer, CopySerializer, UserSerializer from awx.api.versioning import URLPathVersioning from awx.api.metadata import SublistAttachDetatchMetadata, Metadata @@ -317,12 +317,6 @@ class GenericAPIView(generics.GenericAPIView, APIView): for name, field in list(serializer.fields.items()): if getattr(field, 'read_only', None): del serializer.fields[name] - # Additionally, remove the following fields if an instance group is containerized. - if name == 'is_containerized' and type(serializer) == InstanceGroupSerializer: - if serializer.instance is not None and serializer.instance.is_containerized: - del serializer.fields['policy_instance_percentage'] - del serializer.fields['policy_instance_minimum'] - del serializer.fields['policy_instance_list'] serializer._data = self.update_raw_data(serializer.data) return serializer diff --git a/awx/api/serializers.py b/awx/api/serializers.py index 816a7bf4e0..00a90b2653 100644 --- a/awx/api/serializers.py +++ b/awx/api/serializers.py @@ -4801,7 +4801,7 @@ class InstanceGroupSerializer(BaseSerializer): raise serializers.ValidationError(_('Isolated instances may not be added or removed from instances groups via the API.')) if self.instance and self.instance.controller_id is not None: raise serializers.ValidationError(_('Isolated instance group membership may not be managed via the API.')) - if self.instance.is_containerized: + if value and self.instance.is_containerized: raise serializers.ValidationError(_('Containerized instances may not be managed via the API')) return value diff --git a/awx/api/views/__init__.py b/awx/api/views/__init__.py index 23e66810fe..dd31948acf 100644 --- a/awx/api/views/__init__.py +++ b/awx/api/views/__init__.py @@ -383,6 +383,13 @@ class InstanceGroupDetail(RelatedJobsPreventDeleteMixin, RetrieveUpdateDestroyAP serializer_class = serializers.InstanceGroupSerializer permission_classes = (InstanceGroupTowerPermission,) + def update_raw_data(self, data): + if self.get_object().is_containerized: + data.pop('policy_instance_percentage', None) + data.pop('policy_instance_minimum', None) + data.pop('policy_instance_list', None) + return super(InstanceGroupDetail, self).update_raw_data(data) + def destroy(self, request, *args, **kwargs): instance = self.get_object() if instance.controller is not None: