Skip to content
Snippets Groups Projects
Commit 7451259a authored by Mohammad Torkashvand's avatar Mohammad Torkashvand
Browse files

upgrade requirement.txt and refactor duplicate codes

parent 76d0de63
No related branches found
No related tags found
1 merge request!55upgrade requirement.txt and refactor duplicate codes
Pipeline #84587 passed
...@@ -50,6 +50,6 @@ def load() -> Config: ...@@ -50,6 +50,6 @@ def load() -> Config:
:return: a dict containing the parsed configuration parameters :return: a dict containing the parsed configuration parameters
""" """
assert "SETTINGS_FILENAME" in os.environ assert "SETTINGS_FILENAME" in os.environ, "Environment variable SETTINGS_FILENAME not set"
with open(os.environ["SETTINGS_FILENAME"], encoding="utf-8") as file: with open(os.environ["SETTINGS_FILENAME"], encoding="utf-8") as file:
return load_from_file(file) return load_from_file(file)
...@@ -2,6 +2,7 @@ ...@@ -2,6 +2,7 @@
import enum import enum
import json import json
import logging import logging
import os
import threading import threading
import uuid import uuid
from typing import Any from typing import Any
...@@ -12,10 +13,13 @@ import xmltodict ...@@ -12,10 +13,13 @@ import xmltodict
from dictdiffer import diff from dictdiffer import diff
from pydantic import BaseModel, HttpUrl from pydantic import BaseModel, HttpUrl
from lso import config
from lso.config import DEFAULT_REQUEST_TIMEOUT from lso.config import DEFAULT_REQUEST_TIMEOUT
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
config_params = config.load()
# enum.StrEnum is only available in python 3.11 # enum.StrEnum is only available in python 3.11
class PlaybookJobStatus(str, enum.Enum): class PlaybookJobStatus(str, enum.Enum):
...@@ -45,6 +49,10 @@ class PlaybookLaunchResponse(BaseModel): ...@@ -45,6 +49,10 @@ class PlaybookLaunchResponse(BaseModel):
info: str = "" info: str = ""
def get_playbook_path(playbook_name: str) -> str:
return os.path.join(config_params.ansible_playbooks_root_dir, playbook_name)
def playbook_launch_success(job_id: str) -> PlaybookLaunchResponse: def playbook_launch_success(job_id: str) -> PlaybookLaunchResponse:
"""Return a :class:`PlaybookLaunchResponse` for the successful start of a playbook execution. """Return a :class:`PlaybookLaunchResponse` for the successful start of a playbook execution.
...@@ -156,7 +164,7 @@ def _run_playbook_proc(job_id: str, playbook_path: str, extra_vars: dict, invent ...@@ -156,7 +164,7 @@ def _run_playbook_proc(job_id: str, playbook_path: str, extra_vars: dict, invent
} }
request_result = requests.post(callback, json=payload, timeout=DEFAULT_REQUEST_TIMEOUT) request_result = requests.post(callback, json=payload, timeout=DEFAULT_REQUEST_TIMEOUT)
assert request_result.status_code == 200 assert request_result.status_code == 200, f"Callback failed: {request_result.text}"
def run_playbook(playbook_path: str, extra_vars: dict, inventory: str, callback: HttpUrl) -> PlaybookLaunchResponse: def run_playbook(playbook_path: str, extra_vars: dict, inventory: str, callback: HttpUrl) -> PlaybookLaunchResponse:
......
"""Routes for handling events related to the IP trunk service.""" """Routes for handling events related to the IP trunk service."""
from os import path
from fastapi import APIRouter from fastapi import APIRouter
from pydantic import BaseModel, HttpUrl from pydantic import BaseModel, HttpUrl
from lso import config from lso.playbook import PlaybookLaunchResponse, get_playbook_path, run_playbook
from lso.playbook import PlaybookLaunchResponse, run_playbook
router = APIRouter() router = APIRouter()
config_params = config.load()
class IPTrunkParams(BaseModel): class IPTrunkParams(BaseModel):
...@@ -97,13 +94,9 @@ def provision_ip_trunk(params: IPTrunkProvisioningParams) -> PlaybookLaunchRespo ...@@ -97,13 +94,9 @@ def provision_ip_trunk(params: IPTrunkProvisioningParams) -> PlaybookLaunchRespo
} }
return run_playbook( return run_playbook(
playbook_path=path.join(config_params.ansible_playbooks_root_dir, "iptrunks.yaml"), playbook_path=get_playbook_path("iptrunks.yaml"),
inventory=str( inventory=f"{params.subscription['iptrunk']['iptrunk_sides'][0]['iptrunk_side_node']['router_fqdn']}\n"
params.subscription["iptrunk"]["iptrunk_sides"][0]["iptrunk_side_node"]["router_fqdn"] f"{params.subscription['iptrunk']['iptrunk_sides'][1]['iptrunk_side_node']['router_fqdn']}\n",
+ "\n"
+ params.subscription["iptrunk"]["iptrunk_sides"][1]["iptrunk_side_node"]["router_fqdn"]
+ "\n"
),
extra_vars=extra_vars, extra_vars=extra_vars,
callback=params.callback, callback=params.callback,
) )
...@@ -129,13 +122,9 @@ def modify_ip_trunk(params: IPTrunkModifyParams) -> PlaybookLaunchResponse: ...@@ -129,13 +122,9 @@ def modify_ip_trunk(params: IPTrunkModifyParams) -> PlaybookLaunchResponse:
} }
return run_playbook( return run_playbook(
playbook_path=path.join(config_params.ansible_playbooks_root_dir, "iptrunks.yaml"), playbook_path=get_playbook_path("iptrunks.yaml"),
inventory=str( inventory=f"{params.subscription['iptrunk']['iptrunk_sides'][0]['iptrunk_side_node']['router_fqdn']}\n"
params.subscription["iptrunk"]["iptrunk_sides"][0]["iptrunk_side_node"]["router_fqdn"] f"{params.subscription['iptrunk']['iptrunk_sides'][1]['iptrunk_side_node']['router_fqdn']}\n",
+ "\n"
+ params.subscription["iptrunk"]["iptrunk_sides"][1]["iptrunk_side_node"]["router_fqdn"]
+ "\n"
),
extra_vars=extra_vars, extra_vars=extra_vars,
callback=params.callback, callback=params.callback,
) )
...@@ -162,13 +151,9 @@ def delete_ip_trunk(params: IPTrunkDeleteParams) -> PlaybookLaunchResponse: ...@@ -162,13 +151,9 @@ def delete_ip_trunk(params: IPTrunkDeleteParams) -> PlaybookLaunchResponse:
} }
return run_playbook( return run_playbook(
playbook_path=path.join(config_params.ansible_playbooks_root_dir, "iptrunks.yaml"), playbook_path=get_playbook_path("iptrunks.yaml"),
inventory=str( inventory=f"{params.subscription['iptrunk']['iptrunk_sides'][0]['iptrunk_side_node']['router_fqdn']}\n"
params.subscription["iptrunk"]["iptrunk_sides"][0]["iptrunk_side_node"]["router_fqdn"] f"{params.subscription['iptrunk']['iptrunk_sides'][1]['iptrunk_side_node']['router_fqdn']}\n",
+ "\n"
+ params.subscription["iptrunk"]["iptrunk_sides"][1]["iptrunk_side_node"]["router_fqdn"]
+ "\n"
),
extra_vars=extra_vars, extra_vars=extra_vars,
callback=params.callback, callback=params.callback,
) )
...@@ -189,7 +174,7 @@ def check_ip_trunk(params: IPTrunkCheckParams) -> PlaybookLaunchResponse: ...@@ -189,7 +174,7 @@ def check_ip_trunk(params: IPTrunkCheckParams) -> PlaybookLaunchResponse:
# writing tests. # writing tests.
return run_playbook( return run_playbook(
playbook_path=path.join(config_params.ansible_playbooks_root_dir, "iptrunks_checks.yaml"), playbook_path=get_playbook_path("iptrunks_checks.yaml"),
inventory=params.subscription["iptrunk"]["iptrunk_sides"][0]["iptrunk_side_node"]["router_fqdn"], inventory=params.subscription["iptrunk"]["iptrunk_sides"][0]["iptrunk_side_node"]["router_fqdn"],
extra_vars=extra_vars, extra_vars=extra_vars,
callback=params.callback, callback=params.callback,
...@@ -221,15 +206,10 @@ def migrate_ip_trunk(params: IPTrunkMigrationParams) -> PlaybookLaunchResponse: ...@@ -221,15 +206,10 @@ def migrate_ip_trunk(params: IPTrunkMigrationParams) -> PlaybookLaunchResponse:
} }
return run_playbook( return run_playbook(
playbook_path=path.join(config_params.ansible_playbooks_root_dir, "iptrunks_migration.yaml"), playbook_path=get_playbook_path("iptrunks_migration.yaml"),
inventory=str( inventory=f"{params.subscription['iptrunk']['iptrunk_sides'][0]['iptrunk_side_node']['router_fqdn']}\n"
params.subscription["iptrunk"]["iptrunk_sides"][0]["iptrunk_side_node"]["router_fqdn"] f"{params.subscription['iptrunk']['iptrunk_sides'][1]['iptrunk_side_node']['router_fqdn']}\n"
+ "\n" f"{params.new_side['new_node']['router']['router_fqdn']}\n",
+ params.subscription["iptrunk"]["iptrunk_sides"][1]["iptrunk_side_node"]["router_fqdn"]
+ "\n"
+ params.new_side["new_node"]["router"]["router_fqdn"]
+ "\n"
),
extra_vars=extra_vars, extra_vars=extra_vars,
callback=params.callback, callback=params.callback,
) )
"""Routes for handling device/base_config-related requests.""" """Routes for handling device/base_config-related requests."""
import os
from fastapi import APIRouter from fastapi import APIRouter
from pydantic import BaseModel, HttpUrl from pydantic import BaseModel, HttpUrl
from lso import config, playbook from lso import playbook
from lso.playbook import get_playbook_path
router = APIRouter() router = APIRouter()
config_params = config.load()
class NodeProvisioningParams(BaseModel): class NodeProvisioningParams(BaseModel):
...@@ -51,10 +50,8 @@ async def provision_node(params: NodeProvisioningParams) -> playbook.PlaybookLau ...@@ -51,10 +50,8 @@ async def provision_node(params: NodeProvisioningParams) -> playbook.PlaybookLau
"commit_comment": f"GSO_PROCESS_ID: {params.process_id} - TT_NUMBER: {params.tt_number} - Deploy base config", "commit_comment": f"GSO_PROCESS_ID: {params.process_id} - TT_NUMBER: {params.tt_number} - Deploy base config",
} }
playbook_path = os.path.join(config_params.ansible_playbooks_root_dir, "base_config.yaml")
return playbook.run_playbook( return playbook.run_playbook(
playbook_path=playbook_path, playbook_path=get_playbook_path("base_config.yaml"),
inventory=f"{params.subscription['router']['router_fqdn']}", inventory=f"{params.subscription['router']['router_fqdn']}",
extra_vars=extra_vars, extra_vars=extra_vars,
callback=params.callback, callback=params.callback,
......
--extra-index-url https://artifactory.software.geant.org/artifactory/api/pypi/geant-swd-pypi/simple jsonschema~=4.20.0
fastapi~=0.104.1
jsonschema~=4.18.0 pydantic~=2.0.3
fastapi~=0.100.0 ansible-runner==2.3.4
pydantic~=2.0.2
ansible-runner==2.3.3
uvicorn[standard]~=0.22.0 uvicorn[standard]~=0.22.0
httpx~=0.24.0 httpx~=0.25.1
ansible-core~=2.15.1 ansible-core~=2.16.0
ansible_merge_vars~=5.0.0 ansible_merge_vars~=5.0.0
GitPython~=3.1.31 GitPython~=3.1.40
jinja2==3.1.1 jinja2==3.1.2
junos-eznc~=2.6.7 junos-eznc~=2.6.8
jxmlease~=1.0.3 jxmlease~=1.0.3
ncclient~=0.6.13 ncclient~=0.6.13
ruamel.yaml~=0.17.32 ruamel.yaml~=0.18.5
xmltodict~=0.13.0 xmltodict~=0.13.0
dictdiffer~=0.9.0 dictdiffer~=0.9.0
jmespath~=1.0.1 jmespath~=1.0.1
pytest~=7.4.0 # dev requirements
Faker~=19.3.1 pytest~=7.4.3
responses~=0.23.1 Faker~=20.0.3
sphinx~=6.2.1 responses~=0.24.1
sphinx-rtd-theme~=1.2.2 sphinx~=7.2.6
sphinx-rtd-theme~=1.3.0
requests~=2.31.0 requests~=2.31.0
docutils~=0.18.1 docutils~=0.18.1
isort~=5.12.0 isort~=5.12.0
black~=23.3.0 black~=23.11.0
flake8~=6.0.0 flake8~=6.1.0
mypy~=1.4.1 mypy~=1.7.0
ruff~=0.0.277 ruff~=0.1.6
types-setuptools~=68.0.0.1 types-setuptools~=68.2.0.1
types-requests~=2.31.0.1 types-requests~=2.31.0.10
...@@ -10,10 +10,10 @@ from lso.routes.default import API_VERSION, Version ...@@ -10,10 +10,10 @@ from lso.routes.default import API_VERSION, Version
@responses.activate @responses.activate
def test_ip_trunk_modification(client: TestClient) -> None: def test_ip_trunk_modification(client: TestClient) -> None:
rv = client.get("/api/version/") rv = client.get("/api/version/")
assert rv.status_code == 200 assert rv.status_code == 200, rv.text
response = rv.json() response = rv.json()
jsonschema.validate(response, Version.model_json_schema()) jsonschema.validate(response, Version.model_json_schema())
assert response["api"] == API_VERSION assert response["api"] == API_VERSION, response["api"]
assert response["module"] == metadata.version("goat-lso") assert response["module"] == metadata.version("goat-lso"), response["module"]
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment