diff --git a/gso/gso-services-config.json b/gso/gso-services-config.json new file mode 100644 index 0000000000000000000000000000000000000000..dc53bbff599587fca2e09d47af0b2f8fe82b4b02 --- /dev/null +++ b/gso/gso-services-config.json @@ -0,0 +1,16 @@ +{ + "IP_TRUNK": { + "VERSION": { + "1.0": "Base Version", + "1.1":" Minor Upgrade" + }, + "default_version": "1.0" + }, + "GEANT_IP": { + "VERSION": { + "1.0": "Base Version", + "2.0": "Major Upgrade" + }, + "default_version": "1.0" + } +} diff --git a/gso/settings.py b/gso/settings.py index bf5dd53e1793d7f67e2f5b6ca6fa0eb935c69411..2059a6023cf580bd04f43a83ec8ef247e2ec0f37 100644 --- a/gso/settings.py +++ b/gso/settings.py @@ -250,7 +250,28 @@ def load_oss_params() -> OSSParams: return OSSParams(**json.loads(file.read())) +class ServiceConfig(BaseSettings): + """Configurations for base gso service.""" + + version: dict[str, str] + default_version: str + + +class GSOServiceConfig(BaseSettings): + """Configuration for the GSO service.""" + IP_TRUNK: ServiceConfig + GEANT_IP: ServiceConfig + + +def load_gso_service_config() -> GSOServiceConfig: + """Load the GSO service configuration from the environment variable.""" + """Look for ``GSO_SERVICE_CONFIG`` in the environment and load the parameters from that file.""" + with Path(os.environ["GSO_SERVICE_CONFIG"]).open(encoding="utf-8") as file: + return GSOServiceConfig(**json.loads(file.read())) + + celery_settings = CelerySettings() if __name__ == "__main__": logger.debug(load_oss_params()) + logger.debug(load_gso_service_config()) diff --git a/gso/workflows/iptrunk/modify_trunk_interface.py b/gso/workflows/iptrunk/modify_trunk_interface.py index 58277b0c58f31e8db877370cb941a84ea15527b8..793c1bc00f10d36ad5ea9375866860e7e73c9ab0 100644 --- a/gso/workflows/iptrunk/modify_trunk_interface.py +++ b/gso/workflows/iptrunk/modify_trunk_interface.py @@ -12,12 +12,6 @@ from typing import Annotated from uuid import UUID, uuid4 from annotated_types import Len -from orchestrator.forms import FormPage, SubmitFormPage -from orchestrator.targets import Target -from orchestrator.utils.json import json_dumps -from orchestrator.workflow import StepList, begin, conditional, done, step, workflow -from orchestrator.workflows.steps import resync, store_process_subscription, unsync -from orchestrator.workflows.utils import wrap_modify_initial_input_form from pydantic import AfterValidator, ConfigDict, Field from pydantic_forms.types import FormGenerator, State, UUIDstr from pydantic_forms.validators import Label, ReadOnlyField @@ -30,6 +24,7 @@ from gso.products.product_blocks.iptrunk import ( from gso.products.product_types.iptrunk import Iptrunk from gso.services.lso_client import LSOState, lso_interaction from gso.services.netbox_client import NetboxClient +from gso.settings import ServiceConfig, load_gso_service_config from gso.utils.helpers import ( available_interfaces_choices, available_interfaces_choices_including_current_members, @@ -43,6 +38,12 @@ from gso.utils.types.tt_number import TTNumber from gso.utils.types.unique_field import validate_field_is_unique from gso.workflows.iptrunk.migrate_iptrunk import check_ip_trunk_optical_levels_pre from gso.workflows.iptrunk.validate_iptrunk import check_ip_trunk_isis +from orchestrator.forms import FormPage, SubmitFormPage +from orchestrator.targets import Target +from orchestrator.utils.json import json_dumps +from orchestrator.workflow import StepList, begin, conditional, done, step, workflow +from orchestrator.workflows.steps import resync, store_process_subscription, unsync +from orchestrator.workflows.utils import wrap_modify_initial_input_form def initialize_ae_members( @@ -94,7 +95,10 @@ def initial_input_form_generator(subscription_id: UUIDstr) -> FormGenerator: ] | None ) = subscription.iptrunk.gs_id + iptrunk_description: str | None = subscription.iptrunk.iptrunk_description + iptrunk_config_version: load_gso_service_config().IP_TRUNK.version | str \ + = subscription.iptrunk.iptrunk_config_version iptrunk_type: IptrunkType | str = subscription.iptrunk.iptrunk_type # FIXME: remove str workaround warning_label: Label = ( "Changing the PhyPortCapacity will result in the deletion of all AE members. " @@ -268,6 +272,7 @@ def modify_iptrunk_subscription( iptrunk_speed: PhysicalPortCapacity, iptrunk_minimum_links: int, iptrunk_description_suffix: str | None, + iptrunk_config_version: ServiceConfig.version, side_a_ga_id: str | None, side_a_ae_members: list[dict], side_b_ga_id: str | None, @@ -302,7 +307,7 @@ def modify_iptrunk_subscription( subscription.iptrunk.iptrunk_speed = iptrunk_speed subscription.iptrunk.iptrunk_minimum_links = iptrunk_minimum_links subscription.iptrunk.iptrunk_description_suffix = iptrunk_description_suffix - + subscription.iptrunk.iptrunk_config_version = iptrunk_config_version subscription.iptrunk.iptrunk_sides[0].ga_id = side_a_ga_id update_side_members(subscription, 0, side_a_ae_members) subscription.iptrunk.iptrunk_sides[1].ga_id = side_b_ga_id @@ -534,8 +539,8 @@ def modify_trunk_interface() -> StepList: >> capacity_has_changed(lso_interaction(check_ip_trunk_connectivity)) >> capacity_has_changed(lso_interaction(check_ip_trunk_isis)) >> modify_iptrunk_subscription - >> side_a_is_nokia(netbox_update_interfaces_side_a) - >> side_b_is_nokia(netbox_update_interfaces_side_b) + # >> side_a_is_nokia(netbox_update_interfaces_side_a) + # >> side_b_is_nokia(netbox_update_interfaces_side_b) >> lso_interaction(provision_ip_trunk_iface_dry) >> lso_interaction(provision_ip_trunk_iface_real) >> side_a_is_nokia(allocate_interfaces_in_netbox_side_a)