Merge pull request #6144 from wwitzel3/issue-5745

Support dynamic Inventory
This commit is contained in:
Wayne Witzel III
2017-05-02 13:28:48 -04:00
committed by GitHub
9 changed files with 372 additions and 214 deletions

View File

@@ -45,6 +45,8 @@ from awx.main.fields import ImplicitRoleField
from awx.main.utils import (
get_type_for_model, get_model_for_type, timestamp_apiformat,
camelcase_to_underscore, getattrd, parse_yaml_or_json)
from awx.main.utils.filters import DynamicFilter
from awx.main.validators import vars_validate_or_raise
from awx.conf.license import feature_enabled
@@ -1104,7 +1106,7 @@ class InventorySerializer(BaseSerializerWithVariables):
class Meta:
model = Inventory
fields = ('*', 'organization', 'variables', 'has_active_failures',
fields = ('*', 'organization', 'kind', 'host_filter', 'variables', 'has_active_failures',
'total_hosts', 'hosts_with_active_failures', 'total_groups',
'groups_with_active_failures', 'has_inventory_sources',
'total_inventory_sources', 'inventory_sources_with_failures')
@@ -1136,6 +1138,17 @@ class InventorySerializer(BaseSerializerWithVariables):
ret['organization'] = None
return ret
def validate(self, attrs):
kind = attrs.get('kind', 'standard')
if kind == 'dynamic':
host_filter = attrs.get('host_filter')
if host_filter is not None:
try:
DynamicFilter().query_from_string(host_filter)
except RuntimeError, e:
raise models.base.ValidationError(e)
return super(InventorySerializer, self).validate(attrs)
class InventoryDetailSerializer(InventorySerializer):

View File

@@ -72,6 +72,8 @@ from awx.main.utils import * # noqa
from awx.main.utils import (
callback_filter_out_ansible_extra_vars
)
from awx.main.utils.filters import DynamicFilter
from awx.api.permissions import * # noqa
from awx.api.renderers import * # noqa
from awx.api.serializers import * # noqa
@@ -79,7 +81,6 @@ from awx.api.metadata import RoleMetadata
from awx.main.consumers import emit_channel_notification
from awx.main.models.unified_jobs import ACTIVE_STATES
from awx.main.scheduler.tasks import run_job_complete
from awx.main.fields import DynamicFilterField
logger = logging.getLogger('awx.api.views')
@@ -1685,6 +1686,15 @@ class InventoryDetail(RetrieveUpdateDestroyAPIView):
model = Inventory
serializer_class = InventoryDetailSerializer
def update(self, request, *args, **kwargs):
obj = self.get_object()
kind = self.request.data.get('kind') or kwargs.get('kind')
# Do not allow changes to an Inventory kind.
if kind is not None and obj.kind != kind:
return self.http_method_not_allowed(request, *args, **kwargs)
return super(InventoryDetail, self).update(request, *args, **kwargs)
def destroy(self, request, *args, **kwargs):
with ignore_inventory_computed_fields():
with ignore_inventory_group_removal():
@@ -1767,7 +1777,7 @@ class HostList(ListCreateAPIView):
qs = super(HostList, self).get_queryset()
filter_string = self.request.query_params.get('host_filter', None)
if filter_string:
filter_q = DynamicFilterField.filter_string_to_q(filter_string)
filter_q = DynamicFilter.query_from_string(filter_string)
qs = qs.filter(filter_q)
return qs