orchestrator-lso 2.0.0__tar.gz → 2.0.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {orchestrator_lso-2.0.0 → orchestrator_lso-2.0.1}/.bumpversion.cfg +1 -1
- {orchestrator_lso-2.0.0 → orchestrator_lso-2.0.1}/Dockerfile.example +1 -1
- {orchestrator_lso-2.0.0 → orchestrator_lso-2.0.1}/PKG-INFO +4 -4
- orchestrator_lso-2.0.1/docs/source/index.rst +34 -0
- {orchestrator_lso-2.0.0 → orchestrator_lso-2.0.1}/lso/__init__.py +4 -2
- {orchestrator_lso-2.0.0 → orchestrator_lso-2.0.1}/pyproject.toml +3 -3
- {orchestrator_lso-2.0.0 → orchestrator_lso-2.0.1}/test/routes/test_playbook.py +1 -1
- orchestrator_lso-2.0.0/docs/source/index.rst +0 -10
- {orchestrator_lso-2.0.0 → orchestrator_lso-2.0.1}/.github/dependabot.yml +0 -0
- {orchestrator_lso-2.0.0 → orchestrator_lso-2.0.1}/.github/styles/config/vocabularies/Sphinx/accept.txt +0 -0
- {orchestrator_lso-2.0.0 → orchestrator_lso-2.0.1}/.github/styles/config/vocabularies/jargon/accept.txt +0 -0
- {orchestrator_lso-2.0.0 → orchestrator_lso-2.0.1}/.github/workflows/publish-package.yaml +0 -0
- {orchestrator_lso-2.0.0 → orchestrator_lso-2.0.1}/.github/workflows/run-linting-tests.yaml +0 -0
- {orchestrator_lso-2.0.0 → orchestrator_lso-2.0.1}/.github/workflows/run-unit-tests.yaml +0 -0
- {orchestrator_lso-2.0.0 → orchestrator_lso-2.0.1}/.github/workflows/sphinx.yaml +0 -0
- {orchestrator_lso-2.0.0 → orchestrator_lso-2.0.1}/.gitignore +0 -0
- {orchestrator_lso-2.0.0 → orchestrator_lso-2.0.1}/.vale.ini +0 -0
- {orchestrator_lso-2.0.0 → orchestrator_lso-2.0.1}/LICENSE +0 -0
- {orchestrator_lso-2.0.0 → orchestrator_lso-2.0.1}/README.md +0 -0
- {orchestrator_lso-2.0.0 → orchestrator_lso-2.0.1}/docs/LSO_banner.jpg +0 -0
- {orchestrator_lso-2.0.0 → orchestrator_lso-2.0.1}/docs/Makefile +0 -0
- {orchestrator_lso-2.0.0 → orchestrator_lso-2.0.1}/docs/source/_static/custom.css +0 -0
- {orchestrator_lso-2.0.0 → orchestrator_lso-2.0.1}/docs/source/_static/lso_logo.png +0 -0
- {orchestrator_lso-2.0.0 → orchestrator_lso-2.0.1}/docs/source/conf.py +0 -0
- {orchestrator_lso-2.0.0 → orchestrator_lso-2.0.1}/docs/source/module/config.rst +0 -0
- {orchestrator_lso-2.0.0 → orchestrator_lso-2.0.1}/docs/source/module/playbook.rst +0 -0
- {orchestrator_lso-2.0.0 → orchestrator_lso-2.0.1}/docs/source/module/routes/default.rst +0 -0
- {orchestrator_lso-2.0.0 → orchestrator_lso-2.0.1}/docs/source/module/routes/index.rst +0 -0
- {orchestrator_lso-2.0.0 → orchestrator_lso-2.0.1}/docs/source/module/routes/playbook.rst +0 -0
- {orchestrator_lso-2.0.0 → orchestrator_lso-2.0.1}/docs/source/modules.rst +0 -0
- {orchestrator_lso-2.0.0 → orchestrator_lso-2.0.1}/env.example +0 -0
- {orchestrator_lso-2.0.0 → orchestrator_lso-2.0.1}/lso/app.py +0 -0
- {orchestrator_lso-2.0.0 → orchestrator_lso-2.0.1}/lso/config.py +0 -0
- {orchestrator_lso-2.0.0 → orchestrator_lso-2.0.1}/lso/environment.py +0 -0
- {orchestrator_lso-2.0.0 → orchestrator_lso-2.0.1}/lso/playbook.py +0 -0
- {orchestrator_lso-2.0.0 → orchestrator_lso-2.0.1}/lso/routes/__init__.py +0 -0
- {orchestrator_lso-2.0.0 → orchestrator_lso-2.0.1}/lso/routes/default.py +0 -0
- {orchestrator_lso-2.0.0 → orchestrator_lso-2.0.1}/lso/routes/playbook.py +0 -0
- {orchestrator_lso-2.0.0 → orchestrator_lso-2.0.1}/lso/tasks.py +0 -0
- {orchestrator_lso-2.0.0 → orchestrator_lso-2.0.1}/lso/worker.py +0 -0
- {orchestrator_lso-2.0.0 → orchestrator_lso-2.0.1}/setup.py +0 -0
- {orchestrator_lso-2.0.0 → orchestrator_lso-2.0.1}/test/__init__.py +0 -0
- {orchestrator_lso-2.0.0 → orchestrator_lso-2.0.1}/test/conftest.py +0 -0
- {orchestrator_lso-2.0.0 → orchestrator_lso-2.0.1}/test/routes/__init__.py +0 -0
- {orchestrator_lso-2.0.0 → orchestrator_lso-2.0.1}/test/routes/test_default.py +0 -0
- {orchestrator_lso-2.0.0 → orchestrator_lso-2.0.1}/test/test-playbook.yaml +0 -0
- {orchestrator_lso-2.0.0 → orchestrator_lso-2.0.1}/test/test_ansible.py +0 -0
|
@@ -11,7 +11,7 @@ COPY ./ansible-galaxy-requirements.yaml ./ansible-galaxy-requirements.yaml
|
|
|
11
11
|
RUN apk add --update --no-cache gcc libc-dev libffi-dev openssh
|
|
12
12
|
|
|
13
13
|
# Install the LSO python package, and additional requirements
|
|
14
|
-
RUN pip install orchestrator-lso=="2.0.
|
|
14
|
+
RUN pip install orchestrator-lso=="2.0.1"
|
|
15
15
|
RUN pip install -r requirements.txt
|
|
16
16
|
|
|
17
17
|
# Install required Ansible Galaxy roles and collections
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.3
|
|
2
2
|
Name: orchestrator-lso
|
|
3
|
-
Version: 2.0.
|
|
3
|
+
Version: 2.0.1
|
|
4
4
|
Summary: LSO, an API for remotely running Ansible playbooks.
|
|
5
5
|
Author-email: GÉANT Orchestration and Automation Team <goat@geant.org>
|
|
6
6
|
Requires-Python: >=3.11,<3.13
|
|
@@ -28,10 +28,10 @@ Classifier: Programming Language :: Python :: 3.12
|
|
|
28
28
|
Requires-Dist: ansible-runner==2.4.0
|
|
29
29
|
Requires-Dist: ansible==10.6.0
|
|
30
30
|
Requires-Dist: fastapi==0.115.5
|
|
31
|
-
Requires-Dist: httpx==0.
|
|
32
|
-
Requires-Dist: uvicorn[standard]==0.32.
|
|
31
|
+
Requires-Dist: httpx==0.28.0
|
|
32
|
+
Requires-Dist: uvicorn[standard]==0.32.1
|
|
33
33
|
Requires-Dist: requests==2.32.3
|
|
34
|
-
Requires-Dist: pydantic-settings==2.
|
|
34
|
+
Requires-Dist: pydantic-settings==2.6.1
|
|
35
35
|
Requires-Dist: celery==5.4.0
|
|
36
36
|
Requires-Dist: redis==5.2.0
|
|
37
37
|
Requires-Dist: types-setuptools ; extra == "dev"
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
Lightweight Service Orchestrator (LSO) Documentation
|
|
2
|
+
=====================================================
|
|
3
|
+
|
|
4
|
+
Introduction
|
|
5
|
+
------------
|
|
6
|
+
|
|
7
|
+
The Lightweight Service Orchestrator (LSO) is a simple tool designed to run Ansible playbooks remotely.
|
|
8
|
+
It provides a straightforward way to send instructions, like inventory and variables, to Ansible through
|
|
9
|
+
a REST API, making automation easier and more flexible.
|
|
10
|
+
|
|
11
|
+
Why LSO?
|
|
12
|
+
--------
|
|
13
|
+
|
|
14
|
+
LSO was built to solve a common problem: running Ansible playbooks from a remote machine without setting
|
|
15
|
+
up a complicated system. Many tools, like AWX, are powerful but require complex setups, like Kubernetes,
|
|
16
|
+
and are tied to specific ecosystems.
|
|
17
|
+
|
|
18
|
+
We wanted a lightweight, easy-to-use solution that works without extra layers. That’s why we created LSO.
|
|
19
|
+
|
|
20
|
+
What LSO Does
|
|
21
|
+
-------------
|
|
22
|
+
|
|
23
|
+
LSO is a small FastAPI server that receives requests from remote services and uses `ansible-runner` to execute playbooks.
|
|
24
|
+
|
|
25
|
+
It:
|
|
26
|
+
- Accepts the playbook name, inventory details, and extra variables as input.
|
|
27
|
+
- Runs the playbook on Ansible using this information.
|
|
28
|
+
- Sends the results back, including the output and execution status.
|
|
29
|
+
|
|
30
|
+
.. toctree::
|
|
31
|
+
:maxdepth: 1
|
|
32
|
+
:caption: Contents:
|
|
33
|
+
|
|
34
|
+
modules
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
|
|
14
14
|
"""LSO, an API for remotely running Ansible playbooks."""
|
|
15
15
|
|
|
16
|
-
__version__ = "2.0.
|
|
16
|
+
__version__ = "2.0.1"
|
|
17
17
|
|
|
18
18
|
import logging
|
|
19
19
|
|
|
@@ -24,6 +24,8 @@ from lso import environment
|
|
|
24
24
|
from lso.routes.default import router as default_router
|
|
25
25
|
from lso.routes.playbook import router as playbook_router
|
|
26
26
|
|
|
27
|
+
logger = logging.getLogger(__name__)
|
|
28
|
+
|
|
27
29
|
|
|
28
30
|
def create_app() -> FastAPI:
|
|
29
31
|
"""Initialise the :term:`LSO` app."""
|
|
@@ -38,6 +40,6 @@ def create_app() -> FastAPI:
|
|
|
38
40
|
|
|
39
41
|
environment.setup_logging()
|
|
40
42
|
|
|
41
|
-
|
|
43
|
+
logger.info("FastAPI app initialized")
|
|
42
44
|
|
|
43
45
|
return app
|
|
@@ -32,10 +32,10 @@ dependencies = [
|
|
|
32
32
|
"ansible-runner==2.4.0",
|
|
33
33
|
"ansible==10.6.0",
|
|
34
34
|
"fastapi==0.115.5",
|
|
35
|
-
"httpx==0.
|
|
36
|
-
"uvicorn[standard]==0.32.
|
|
35
|
+
"httpx==0.28.0",
|
|
36
|
+
"uvicorn[standard]==0.32.1",
|
|
37
37
|
"requests==2.32.3",
|
|
38
|
-
"pydantic-settings==2.
|
|
38
|
+
"pydantic-settings==2.6.1",
|
|
39
39
|
"celery==5.4.0",
|
|
40
40
|
"redis==5.2.0",
|
|
41
41
|
]
|
|
@@ -122,7 +122,7 @@ def test_playbook_endpoint_invalid_hosts(client: TestClient, mocked_ansible_runn
|
|
|
122
122
|
response = rv.json()
|
|
123
123
|
|
|
124
124
|
assert isinstance(response, dict)
|
|
125
|
-
assert 'Invalid "hosts" entry for "all" group' in re.sub("\n", " ", "".join(response["detail"]))
|
|
125
|
+
assert 'Invalid "hosts" entry for "all" group' in re.sub(r"\n", " ", "".join(response["detail"]))
|
|
126
126
|
responses.assert_call_count(TEST_CALLBACK_URL, 0)
|
|
127
127
|
|
|
128
128
|
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|