mirror of
https://github.com/ansible/awx.git
synced 2026-05-19 14:57:39 -02:30
Integrate resources API in Controller (#14896)
* add resources api to controller * update setting models are not the source of truth in AWX * Force creation of ServiceID object in tests * fix typo * settings fix for CI --------- Co-authored-by: Alan Rominger <arominge@redhat.com>
This commit is contained in:
@@ -3,15 +3,19 @@ import pytest
|
|||||||
from unittest import mock
|
from unittest import mock
|
||||||
import urllib.parse
|
import urllib.parse
|
||||||
from unittest.mock import PropertyMock
|
from unittest.mock import PropertyMock
|
||||||
|
import importlib
|
||||||
|
|
||||||
# Django
|
# Django
|
||||||
from django.urls import resolve
|
from django.urls import resolve
|
||||||
from django.http import Http404
|
from django.http import Http404
|
||||||
|
from django.apps import apps
|
||||||
from django.core.handlers.exception import response_for_exception
|
from django.core.handlers.exception import response_for_exception
|
||||||
from django.contrib.auth.models import User
|
from django.contrib.auth.models import User
|
||||||
from django.core.serializers.json import DjangoJSONEncoder
|
from django.core.serializers.json import DjangoJSONEncoder
|
||||||
from django.db.backends.sqlite3.base import SQLiteCursorWrapper
|
from django.db.backends.sqlite3.base import SQLiteCursorWrapper
|
||||||
|
|
||||||
|
from django.db.models.signals import post_migrate
|
||||||
|
|
||||||
# AWX
|
# AWX
|
||||||
from awx.main.models.projects import Project
|
from awx.main.models.projects import Project
|
||||||
from awx.main.models.ha import Instance
|
from awx.main.models.ha import Instance
|
||||||
@@ -41,10 +45,19 @@ from awx.main.models.workflow import WorkflowJobTemplate
|
|||||||
from awx.main.models.ad_hoc_commands import AdHocCommand
|
from awx.main.models.ad_hoc_commands import AdHocCommand
|
||||||
from awx.main.models.oauth import OAuth2Application as Application
|
from awx.main.models.oauth import OAuth2Application as Application
|
||||||
from awx.main.models.execution_environments import ExecutionEnvironment
|
from awx.main.models.execution_environments import ExecutionEnvironment
|
||||||
|
from awx.main.utils import is_testing
|
||||||
|
|
||||||
__SWAGGER_REQUESTS__ = {}
|
__SWAGGER_REQUESTS__ = {}
|
||||||
|
|
||||||
|
|
||||||
|
# HACK: the dab_resource_registry app required ServiceID in migrations which checks do not run
|
||||||
|
dab_rr_initial = importlib.import_module('ansible_base.resource_registry.migrations.0001_initial')
|
||||||
|
|
||||||
|
|
||||||
|
if is_testing():
|
||||||
|
post_migrate.connect(lambda **kwargs: dab_rr_initial.create_service_id(apps, None))
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture(scope="session")
|
@pytest.fixture(scope="session")
|
||||||
def swagger_autogen(requests=__SWAGGER_REQUESTS__):
|
def swagger_autogen(requests=__SWAGGER_REQUESTS__):
|
||||||
return requests
|
return requests
|
||||||
|
|||||||
@@ -136,7 +136,7 @@ def underscore_to_camelcase(s):
|
|||||||
@functools.cache
|
@functools.cache
|
||||||
def is_testing(argv=None):
|
def is_testing(argv=None):
|
||||||
'''Return True if running django or py.test unit tests.'''
|
'''Return True if running django or py.test unit tests.'''
|
||||||
if 'PYTEST_CURRENT_TEST' in os.environ.keys():
|
if os.environ.get('DJANGO_SETTINGS_MODULE') == 'awx.main.tests.settings_for_test':
|
||||||
return True
|
return True
|
||||||
argv = sys.argv if argv is None else argv
|
argv = sys.argv if argv is None else argv
|
||||||
if len(argv) >= 1 and ('py.test' in argv[0] or 'py/test.py' in argv[0]):
|
if len(argv) >= 1 and ('py.test' in argv[0] or 'py/test.py' in argv[0]):
|
||||||
|
|||||||
22
awx/resource_api.py
Normal file
22
awx/resource_api.py
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
from ansible_base.resource_registry.registry import ParentResource, ResourceConfig, ServiceAPIConfig, SharedResource
|
||||||
|
from ansible_base.resource_registry.shared_types import OrganizationType, TeamType, UserType
|
||||||
|
|
||||||
|
from awx.main import models
|
||||||
|
|
||||||
|
|
||||||
|
class APIConfig(ServiceAPIConfig):
|
||||||
|
service_type = "awx"
|
||||||
|
|
||||||
|
|
||||||
|
RESOURCE_LIST = (
|
||||||
|
ResourceConfig(
|
||||||
|
models.Organization,
|
||||||
|
shared_resource=SharedResource(serializer=OrganizationType, is_provider=False),
|
||||||
|
),
|
||||||
|
ResourceConfig(models.User, shared_resource=SharedResource(serializer=UserType, is_provider=False), name_field="username"),
|
||||||
|
ResourceConfig(
|
||||||
|
models.Team,
|
||||||
|
shared_resource=SharedResource(serializer=TeamType, is_provider=False),
|
||||||
|
parent_resources=[ParentResource(model=models.Organization, field_name="organization")],
|
||||||
|
),
|
||||||
|
)
|
||||||
@@ -354,8 +354,10 @@ INSTALLED_APPS = [
|
|||||||
'solo',
|
'solo',
|
||||||
'ansible_base.rest_filters',
|
'ansible_base.rest_filters',
|
||||||
'ansible_base.jwt_consumer',
|
'ansible_base.jwt_consumer',
|
||||||
|
'ansible_base.resource_registry',
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
INTERNAL_IPS = ('127.0.0.1',)
|
INTERNAL_IPS = ('127.0.0.1',)
|
||||||
|
|
||||||
MAX_PAGE_SIZE = 200
|
MAX_PAGE_SIZE = 200
|
||||||
@@ -1110,6 +1112,7 @@ METRICS_SUBSYSTEM_CONFIG = {
|
|||||||
# django-ansible-base
|
# django-ansible-base
|
||||||
ANSIBLE_BASE_TEAM_MODEL = 'main.Team'
|
ANSIBLE_BASE_TEAM_MODEL = 'main.Team'
|
||||||
ANSIBLE_BASE_ORGANIZATION_MODEL = 'main.Organization'
|
ANSIBLE_BASE_ORGANIZATION_MODEL = 'main.Organization'
|
||||||
|
ANSIBLE_BASE_RESOURCE_CONFIG_MODULE = 'awx.resource_api'
|
||||||
|
|
||||||
from ansible_base.lib import dynamic_config # noqa: E402
|
from ansible_base.lib import dynamic_config # noqa: E402
|
||||||
|
|
||||||
|
|||||||
@@ -4,6 +4,8 @@
|
|||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from django.urls import re_path, include
|
from django.urls import re_path, include
|
||||||
|
|
||||||
|
from ansible_base.resource_registry.urls import urlpatterns as resource_api_urls
|
||||||
|
|
||||||
from awx.main.views import handle_400, handle_403, handle_404, handle_500, handle_csp_violation, handle_login_redirect
|
from awx.main.views import handle_400, handle_403, handle_404, handle_500, handle_csp_violation, handle_login_redirect
|
||||||
|
|
||||||
|
|
||||||
@@ -11,6 +13,7 @@ urlpatterns = [
|
|||||||
re_path(r'', include('awx.ui.urls', namespace='ui')),
|
re_path(r'', include('awx.ui.urls', namespace='ui')),
|
||||||
re_path(r'^ui_next/.*', include('awx.ui_next.urls', namespace='ui_next')),
|
re_path(r'^ui_next/.*', include('awx.ui_next.urls', namespace='ui_next')),
|
||||||
re_path(r'^api/', include('awx.api.urls', namespace='api')),
|
re_path(r'^api/', include('awx.api.urls', namespace='api')),
|
||||||
|
re_path(r'^api/v2/', include(resource_api_urls)),
|
||||||
re_path(r'^sso/', include('awx.sso.urls', namespace='sso')),
|
re_path(r'^sso/', include('awx.sso.urls', namespace='sso')),
|
||||||
re_path(r'^sso/', include('social_django.urls', namespace='social')),
|
re_path(r'^sso/', include('social_django.urls', namespace='social')),
|
||||||
re_path(r'^(?:api/)?400.html$', handle_400),
|
re_path(r'^(?:api/)?400.html$', handle_400),
|
||||||
|
|||||||
@@ -5,4 +5,4 @@ git+https://github.com/ansible/ansible-runner.git@devel#egg=ansible-runner
|
|||||||
# specifically need https://github.com/robgolding/django-radius/pull/27
|
# specifically need https://github.com/robgolding/django-radius/pull/27
|
||||||
git+https://github.com/ansible/django-radius.git@develop#egg=django-radius
|
git+https://github.com/ansible/django-radius.git@develop#egg=django-radius
|
||||||
git+https://github.com/ansible/python3-saml.git@devel#egg=python3-saml
|
git+https://github.com/ansible/python3-saml.git@devel#egg=python3-saml
|
||||||
django-ansible-base @ git+https://github.com/ansible/django-ansible-base@devel#egg=django-ansible-base[rest_filters,jwt_consumer]
|
django-ansible-base @ git+https://github.com/ansible/django-ansible-base@devel#egg=django-ansible-base[rest_filters,jwt_consumer,resource_registry]
|
||||||
|
|||||||
Reference in New Issue
Block a user