Skip to content
Snippets Groups Projects
Verified Commit 4bc757f7 authored by Saket Agrahari's avatar Saket Agrahari Committed by Karel van Klink
Browse files

Update drop-down menus in IPtrunk workflows

changes for drop down menu

ruff fix

ruff

ruff

uncommenting steps

mypy issue

modify ip trunk test
parent 1362114b
No related branches found
No related tags found
1 merge request!424Resolve NAT-1048 "Service version"
{
"IP_TRUNK": {
"VERSION": {
"version": {
"1.0": "Base Version",
"1.1":" Minor Upgrade"
"1.1": "Minor Upgrade"
},
"default_version": "1.0"
},
"GEANT_IP": {
"VERSION": {
"version": {
"1.0": "Base Version",
"2.0": "Major Upgrade"
},
......
......@@ -4,6 +4,8 @@ import ipaddress
from typing import Annotated
from annotated_types import Len
from orchestrator.domain.base import ProductBlockModel, T
from orchestrator.types import SubscriptionLifecycle
from pydantic import AfterValidator
from pydantic_forms.types import strEnum
from pydantic_forms.validators import validate_unique_list
......@@ -15,8 +17,6 @@ from gso.products.product_blocks.router import (
RouterBlockProvisioning,
)
from gso.utils.types.interfaces import LAGMemberList, PhysicalPortCapacity
from orchestrator.domain.base import ProductBlockModel, T
from orchestrator.types import SubscriptionLifecycle
class IptrunkType(strEnum):
......
......@@ -253,12 +253,13 @@ def load_oss_params() -> OSSParams:
class ServiceConfig(BaseSettings):
"""Configurations for base gso service."""
version: dict[str, str]
version: dict[str, str]
default_version: str
class GSOServiceConfig(BaseSettings):
"""Configuration for the GSO service."""
IP_TRUNK: ServiceConfig
GEANT_IP: ServiceConfig
......
......@@ -4,6 +4,12 @@ import ipaddress
from typing import Annotated
from uuid import uuid4
from orchestrator import workflow
from orchestrator.forms import SubmitFormPage
from orchestrator.targets import Target
from orchestrator.types import SubscriptionLifecycle
from orchestrator.workflow import StepList, begin, done, step
from orchestrator.workflows.steps import resync, set_status, store_process_subscription
from pydantic import AfterValidator, ConfigDict
from pydantic_forms.types import FormGenerator, State
from pydantic_forms.validators import validate_unique_list
......@@ -17,12 +23,6 @@ from gso.services.partners import get_partner_by_name
from gso.utils.helpers import active_router_selector
from gso.utils.types.geant_ids import IMPORTED_GA_ID, IMPORTED_GS_ID
from gso.utils.types.interfaces import LAGMember, LAGMemberList, PhysicalPortCapacity
from orchestrator import workflow
from orchestrator.forms import SubmitFormPage
from orchestrator.targets import Target
from orchestrator.types import SubscriptionLifecycle
from orchestrator.workflow import StepList, begin, done, step
from orchestrator.workflows.steps import resync, set_status, store_process_subscription
def initial_input_form_generator() -> FormGenerator:
......@@ -39,7 +39,6 @@ def initial_input_form_generator() -> FormGenerator:
iptrunk_minimum_links: int
iptrunk_isis_metric: int
iptrunk_description_suffix: str | None = None
iptrunk_config_version: str | None = None
side_a_node_id: active_router_selector() # type: ignore[valid-type]
side_a_ae_iface: str
......@@ -90,7 +89,6 @@ def initialize_subscription(
side_b_ae_iface: str,
side_b_ga_id: IMPORTED_GA_ID | None,
side_b_ae_members: LAGMemberList,
iptrunk_config_version: str | None,
) -> State:
"""Take all input from the user, and store it in the database."""
subscription.iptrunk.gs_id = gs_id
......@@ -100,7 +98,6 @@ def initialize_subscription(
subscription.iptrunk.iptrunk_isis_metric = iptrunk_isis_metric
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].iptrunk_side_node = Router.from_subscription(side_a_node_id).router
subscription.iptrunk.iptrunk_sides[0].iptrunk_side_ae_iface = side_a_ae_iface
......
......@@ -31,6 +31,15 @@ from typing import Annotated
from uuid import uuid4
from annotated_types import Len
from orchestrator.forms import FormPage
from orchestrator.forms.validators import Choice, Label
from orchestrator.targets import Target
from orchestrator.types import SubscriptionLifecycle
from orchestrator.utils.errors import ProcessFailureError
from orchestrator.utils.json import json_dumps
from orchestrator.workflow import StepList, begin, conditional, done, step, step_group, workflow
from orchestrator.workflows.steps import resync, set_status, store_process_subscription
from orchestrator.workflows.utils import wrap_create_initial_input_form
from ping3 import ping
from pydantic import ConfigDict
from pydantic_forms.types import FormGenerator, State, UUIDstr
......@@ -53,7 +62,7 @@ from gso.services.subscriptions import (
generate_unique_id,
get_non_terminated_iptrunk_subscriptions,
)
from gso.settings import load_oss_params
from gso.settings import load_gso_service_config, load_oss_params
from gso.utils.helpers import (
available_interfaces_choices,
available_lags_choices,
......@@ -66,15 +75,6 @@ from gso.utils.types.netbox_router import NetboxEnabledRouter
from gso.utils.types.tt_number import TTNumber
from gso.utils.workflow_steps import prompt_sharepoint_checklist_url
from gso.workflows.shared import create_summary_form
from orchestrator.forms import FormPage
from orchestrator.forms.validators import Choice, Label
from orchestrator.targets import Target
from orchestrator.types import SubscriptionLifecycle
from orchestrator.utils.errors import ProcessFailureError
from orchestrator.utils.json import json_dumps
from orchestrator.workflow import StepList, begin, conditional, done, step, step_group, workflow
from orchestrator.workflows.steps import resync, set_status, store_process_subscription
from orchestrator.workflows.utils import wrap_create_initial_input_form
def initial_input_form_generator(product_name: str) -> FormGenerator:
......@@ -85,6 +85,10 @@ def initial_input_form_generator(product_name: str) -> FormGenerator:
) + subscriptions.get_provisioning_router_subscriptions(includes=["subscription_id", "description"])
routers = {str(router["subscription_id"]): router["description"] for router in active_and_provisioning_routers}
# Get version choices from config
iptrunk_versions = list(load_gso_service_config().IP_TRUNK.version.keys())
iptrunk_version_choices = Choice("Select version", [(v, v) for v in iptrunk_versions]) # type: ignore[arg-type]
class CreateIptrunkForm(FormPage):
model_config = ConfigDict(title=product_name)
......@@ -95,7 +99,7 @@ def initial_input_form_generator(product_name: str) -> FormGenerator:
iptrunk_speed: PhysicalPortCapacity
iptrunk_number_of_members: int
iptrunk_description_suffix: str | None = None
iptrunk_config_version: str | None = None
iptrunk_config_version: iptrunk_version_choices # type: ignore[valid-type]
initial_user_input = yield CreateIptrunkForm
recommended_minimum_links = calculate_recommended_minimum_links(
......@@ -329,7 +333,7 @@ def initialize_subscription(
iptrunk_speed: PhysicalPortCapacity,
iptrunk_minimum_links: int,
iptrunk_description_suffix: str | None,
iptrunk_config_version: str | None,
iptrunk_config_version: str,
side_a_node_id: str,
side_a_ae_iface: str,
side_a_ae_members: list[dict],
......
......@@ -12,9 +12,15 @@ 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
from pydantic_forms.validators import Choice, Label, ReadOnlyField
from gso.products.product_blocks.iptrunk import (
IptrunkInterfaceBlock,
......@@ -24,7 +30,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.settings import load_gso_service_config
from gso.utils.helpers import (
available_interfaces_choices,
available_interfaces_choices_including_current_members,
......@@ -38,12 +44,6 @@ 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(
......@@ -87,6 +87,10 @@ def initial_input_form_generator(subscription_id: UUIDstr) -> FormGenerator:
"""Gather input from the operator on the interfaces that should be modified."""
subscription = Iptrunk.from_subscription(subscription_id)
# Get version choices from config (single-select dropdown)
iptrunk_versions = list(load_gso_service_config().IP_TRUNK.version.keys())
iptrunk_version_choices = Choice("Select version", [(v, v) for v in iptrunk_versions]) # type: ignore[arg-type]
class ModifyIptrunkForm(FormPage):
tt_number: TTNumber
gs_id: (
......@@ -95,10 +99,8 @@ 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_config_version: iptrunk_version_choices = subscription.iptrunk.iptrunk_config_version # type: ignore[valid-type]
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. "
......@@ -272,7 +274,7 @@ def modify_iptrunk_subscription(
iptrunk_speed: PhysicalPortCapacity,
iptrunk_minimum_links: int,
iptrunk_description_suffix: str | None,
iptrunk_config_version: ServiceConfig.version,
iptrunk_config_version: str,
side_a_ga_id: str | None,
side_a_ae_members: list[dict],
side_b_ga_id: str | None,
......@@ -539,8 +541,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)
......
......@@ -23,7 +23,6 @@ def workflow_input_data(faker, router_subscription_factory):
"iptrunk_minimum_links": 2,
"iptrunk_isis_metric": 10000,
"iptrunk_description_suffix": faker.word(),
"iptrunk_config_version": "1.0",
"side_a_node_id": str(router_subscription_factory().subscription_id),
"side_a_ae_iface": faker.nokia_lag_interface_name(),
"side_a_ga_id": faker.imported_ga_id(),
......
......@@ -74,7 +74,7 @@ def input_form_wizard_data(request, router_subscription_factory, faker):
"iptrunk_speed": PhysicalPortCapacity.HUNDRED_GIGABIT_PER_SECOND,
"iptrunk_number_of_members": 2,
"iptrunk_description_suffix": faker.word(),
"iptrunk_config_version": "1.0"
"iptrunk_config_version": "1.0",
}
create_ip_trunk_confirm_step = {"iptrunk_minimum_links": 1}
create_ip_trunk_side_a_router_name = {"side_a_node_id": router_side_a}
......
......@@ -121,6 +121,7 @@ def input_form_iptrunk_data(
"iptrunk_speed": new_speed,
"iptrunk_number_of_members": new_link_count,
"iptrunk_description_suffix": faker.word(),
"iptrunk_config_version": "1.0",
},
{},
{
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment