diff --git a/awx/api/serializers.py b/awx/api/serializers.py index a571190199..7a67041128 100644 --- a/awx/api/serializers.py +++ b/awx/api/serializers.py @@ -1950,7 +1950,7 @@ class InventorySourceOptionsSerializer(BaseSerializer): class Meta: fields = ('*', 'source', 'source_path', 'source_script', 'source_vars', 'credential', 'source_regions', 'instance_filters', 'group_by', 'overwrite', 'overwrite_vars', - 'timeout', 'verbosity') + 'custom_virtualenv', 'timeout', 'verbosity') def get_related(self, obj): res = super(InventorySourceOptionsSerializer, self).get_related(obj) diff --git a/awx/main/migrations/0066_v350_inventorysource_custom_virtualenv.py b/awx/main/migrations/0066_v350_inventorysource_custom_virtualenv.py new file mode 100644 index 0000000000..bc16ded15a --- /dev/null +++ b/awx/main/migrations/0066_v350_inventorysource_custom_virtualenv.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.16 on 2019-03-28 17:56 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('main', '0065_v350_index_job_status'), + ] + + operations = [ + migrations.AddField( + model_name='inventorysource', + name='custom_virtualenv', + field=models.CharField(blank=True, default=None, help_text='Local absolute file path containing a custom Python virtualenv to use', max_length=100, null=True), + ), + ] diff --git a/awx/main/models/inventory.py b/awx/main/models/inventory.py index 6230f6c660..6004bebba4 100644 --- a/awx/main/models/inventory.py +++ b/awx/main/models/inventory.py @@ -1429,7 +1429,7 @@ class InventorySourceOptions(BaseModel): return '' -class InventorySource(UnifiedJobTemplate, InventorySourceOptions, RelatedJobsMixin): +class InventorySource(UnifiedJobTemplate, InventorySourceOptions, CustomVirtualEnvMixin, RelatedJobsMixin): SOFT_UNIQUE_TOGETHER = [('polymorphic_ctype', 'name', 'inventory')] @@ -1776,14 +1776,12 @@ class InventoryUpdate(UnifiedJob, InventorySourceOptions, JobNotificationMixin, @property def ansible_virtualenv_path(self): + if self.inventory_source and self.inventory_source.custom_virtualenv: + return self.inventory_source.custom_virtualenv if self.inventory_source and self.inventory_source.source_project: project = self.inventory_source.source_project if project and project.custom_virtualenv: return project.custom_virtualenv - if self.inventory_source and self.inventory_source.inventory: - organization = self.inventory_source.inventory.organization - if organization and organization.custom_virtualenv: - return organization.custom_virtualenv return settings.ANSIBLE_VENV_PATH def cancel(self, job_explanation=None, is_chain=False):