From ae7be2eea1521aa40c6cd019c81c14bb1497ac60 Mon Sep 17 00:00:00 2001 From: Gabriel Muniz Date: Fri, 26 May 2023 08:09:44 -0400 Subject: [PATCH] Add instance_group to bulk api (#13982) Co-authored-by: Elijah DeLee Co-authored-by: Jessica Steurer <70719005+jay-steurer@users.noreply.github.com> --- awx/api/serializers.py | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/awx/api/serializers.py b/awx/api/serializers.py index 49a097b395..c7117b3120 100644 --- a/awx/api/serializers.py +++ b/awx/api/serializers.py @@ -4686,12 +4686,11 @@ class BulkJobNodeSerializer(WorkflowJobNodeSerializer): # many-to-many fields credentials = serializers.ListField(child=serializers.IntegerField(min_value=1), required=False) labels = serializers.ListField(child=serializers.IntegerField(min_value=1), required=False) - # TODO: Use instance group role added via PR 13584(once merged), for now everything related to instance group is commented - # instance_groups = serializers.ListField(child=serializers.IntegerField(min_value=1), required=False) + instance_groups = serializers.ListField(child=serializers.IntegerField(min_value=1), required=False) class Meta: model = WorkflowJobNode - fields = ('*', 'credentials', 'labels') # m2m fields are not canonical for WJ nodes, TODO: add instance_groups once supported + fields = ('*', 'credentials', 'labels', 'instance_groups') # m2m fields are not canonical for WJ nodes def validate(self, attrs): return super(LaunchConfigurationBaseSerializer, self).validate(attrs) @@ -4751,21 +4750,21 @@ class BulkJobLaunchSerializer(serializers.Serializer): requested_use_execution_environments = {job['execution_environment'] for job in attrs['jobs'] if 'execution_environment' in job} requested_use_credentials = set() requested_use_labels = set() - # requested_use_instance_groups = set() + requested_use_instance_groups = set() for job in attrs['jobs']: for cred in job.get('credentials', []): requested_use_credentials.add(cred) for label in job.get('labels', []): requested_use_labels.add(label) - # for instance_group in job.get('instance_groups', []): - # requested_use_instance_groups.add(instance_group) + for instance_group in job.get('instance_groups', []): + requested_use_instance_groups.add(instance_group) key_to_obj_map = { "unified_job_template": {obj.id: obj for obj in UnifiedJobTemplate.objects.filter(id__in=requested_ujts)}, "inventory": {obj.id: obj for obj in Inventory.objects.filter(id__in=requested_use_inventories)}, "credentials": {obj.id: obj for obj in Credential.objects.filter(id__in=requested_use_credentials)}, "labels": {obj.id: obj for obj in Label.objects.filter(id__in=requested_use_labels)}, - # "instance_groups": {obj.id: obj for obj in InstanceGroup.objects.filter(id__in=requested_use_instance_groups)}, + "instance_groups": {obj.id: obj for obj in InstanceGroup.objects.filter(id__in=requested_use_instance_groups)}, "execution_environment": {obj.id: obj for obj in ExecutionEnvironment.objects.filter(id__in=requested_use_execution_environments)}, } @@ -4792,7 +4791,7 @@ class BulkJobLaunchSerializer(serializers.Serializer): self.check_list_permission(Credential, requested_use_credentials, 'use_role') self.check_list_permission(Label, requested_use_labels) - # self.check_list_permission(InstanceGroup, requested_use_instance_groups) # TODO: change to use_role for conflict + self.check_list_permission(InstanceGroup, requested_use_instance_groups) # TODO: change to use_role for conflict self.check_list_permission(ExecutionEnvironment, requested_use_execution_environments) # TODO: change if roles introduced jobs_object = self.get_objectified_jobs(attrs, key_to_obj_map) @@ -4839,7 +4838,7 @@ class BulkJobLaunchSerializer(serializers.Serializer): node_m2m_object_types_to_through_model = { 'credentials': WorkflowJobNode.credentials.through, 'labels': WorkflowJobNode.labels.through, - # 'instance_groups': WorkflowJobNode.instance_groups.through, + 'instance_groups': WorkflowJobNode.instance_groups.through, } node_deferred_attr_names = ( 'limit', @@ -4892,9 +4891,9 @@ class BulkJobLaunchSerializer(serializers.Serializer): if field_name in node_m2m_objects[node_identifier] and field_name == 'labels': for label in node_m2m_objects[node_identifier][field_name]: through_model_objects.append(through_model(label=label, workflowjobnode=node_m2m_objects[node_identifier]['node'])) - # if obj_type in node_m2m_objects[node_identifier] and obj_type == 'instance_groups': - # for instance_group in node_m2m_objects[node_identifier][obj_type]: - # through_model_objects.append(through_model(instancegroup=instance_group, workflowjobnode=node_m2m_objects[node_identifier]['node'])) + if field_name in node_m2m_objects[node_identifier] and field_name == 'instance_groups': + for instance_group in node_m2m_objects[node_identifier][field_name]: + through_model_objects.append(through_model(instancegroup=instance_group, workflowjobnode=node_m2m_objects[node_identifier]['node'])) if through_model_objects: through_model.objects.bulk_create(through_model_objects)