From 7e64a6fd6074febf5c402a8480305f2ccb61a100 Mon Sep 17 00:00:00 2001 From: Ryan Petrello Date: Wed, 12 Apr 2017 11:48:51 -0400 Subject: [PATCH] add "added_in_api_version" metadata to OPTIONS requests --- awx/api/generics.py | 1 + awx/api/metadata.py | 8 ++++++++ awx/api/templates/api/api_v2_root_view.md | 4 ++++ awx/api/urls.py | 4 ++-- awx/api/views.py | 17 ++++++++++++++--- 5 files changed, 29 insertions(+), 5 deletions(-) create mode 100644 awx/api/templates/api/api_v2_root_view.md diff --git a/awx/api/generics.py b/awx/api/generics.py index 895880b85e..016045d31f 100644 --- a/awx/api/generics.py +++ b/awx/api/generics.py @@ -165,6 +165,7 @@ class APIView(views.APIView): 'new_in_300': getattr(self, 'new_in_300', False), 'new_in_310': getattr(self, 'new_in_310', False), 'new_in_320': getattr(self, 'new_in_320', False), + 'new_in_api_v2': getattr(self, 'new_in_api_v2', False), 'deprecated': getattr(self, 'deprecated', False), } diff --git a/awx/api/metadata.py b/awx/api/metadata.py index 232ec059f8..60c74372e7 100644 --- a/awx/api/metadata.py +++ b/awx/api/metadata.py @@ -186,6 +186,14 @@ class Metadata(metadata.SimpleMetadata): break metadata['added_in_version'] = added_in_version + # Add API version number in which view was added to Tower. + added_in_api_version = 'v1' + for version in ('v2',): + if getattr(view, 'new_in_api_%s' % version, False): + added_in_api_version = version + break + metadata['added_in_api_version'] = added_in_api_version + # Add type(s) handled by this view/serializer. if hasattr(view, 'get_serializer'): serializer = view.get_serializer() diff --git a/awx/api/templates/api/api_v2_root_view.md b/awx/api/templates/api/api_v2_root_view.md new file mode 100644 index 0000000000..837d90c1b4 --- /dev/null +++ b/awx/api/templates/api/api_v2_root_view.md @@ -0,0 +1,4 @@ +Version 2 of the Ansible Tower REST API. + +Make a GET request to this resource to obtain a list of all child resources +available via the API. diff --git a/awx/api/urls.py b/awx/api/urls.py index eefd4b22f1..ea84ed3c06 100644 --- a/awx/api/urls.py +++ b/awx/api/urls.py @@ -340,7 +340,7 @@ activity_stream_urls = patterns('awx.api.views', ) v1_urls = patterns('awx.api.views', - url(r'^$', 'api_version_root_view'), + url(r'^$', 'api_v1_root_view'), url(r'^ping/$', 'api_v1_ping_view'), url(r'^config/$', 'api_v1_config_view'), url(r'^auth/$', 'auth_view'), @@ -384,7 +384,7 @@ v1_urls = patterns('awx.api.views', ) v2_urls = patterns('awx.api.views', - url(r'^$', 'api_version_root_view'), + url(r'^$', 'api_v2_root_view'), url(r'^credential_types/', include(credential_type_urls)), ) diff --git a/awx/api/views.py b/awx/api/views.py index 8701c7bab3..836d2db869 100644 --- a/awx/api/views.py +++ b/awx/api/views.py @@ -134,8 +134,8 @@ class ApiRootView(APIView): def get(self, request, format=None): ''' list supported API versions ''' - v1 = reverse('api:api_version_root_view', kwargs={'version': 'v1'}) - v2 = reverse('api:api_version_root_view', kwargs={'version': 'v2'}) + v1 = reverse('api:api_v1_root_view', kwargs={'version': 'v1'}) + v2 = reverse('api:api_v2_root_view', kwargs={'version': 'v2'}) data = dict( description = _('Ansible Tower REST API'), current_version = v2, @@ -150,7 +150,6 @@ class ApiRootView(APIView): class ApiVersionRootView(APIView): authentication_classes = [] - view_name = _('Version') permission_classes = (AllowAny,) def get(self, request, format=None): @@ -197,6 +196,16 @@ class ApiVersionRootView(APIView): return Response(data) +class ApiV1RootView(ApiVersionRootView): + view_name = _('Version 1') + + +class ApiV2RootView(ApiVersionRootView): + view_name = _('Version 2') + new_in_320 = True + new_in_api_v2 = True + + class ApiV1PingView(APIView): """A simple view that reports very basic information about this Tower instance, which is acceptable to be public information. @@ -1482,6 +1491,7 @@ class CredentialTypeList(ListCreateAPIView): model = CredentialType serializer_class = CredentialTypeSerializer new_in_320 = True + new_in_api_v2 = True class CredentialTypeDetail(RetrieveUpdateDestroyAPIView): @@ -1489,6 +1499,7 @@ class CredentialTypeDetail(RetrieveUpdateDestroyAPIView): model = CredentialType serializer_class = CredentialTypeSerializer new_in_320 = True + new_in_api_v2 = True class CredentialList(ListCreateAPIView):