Skip to content
Snippets Groups Projects
Verified Commit 40b9809d authored by Karel van Klink's avatar Karel van Klink :smiley_cat:
Browse files

Initial update for the router model

parent 446e9581
No related branches found
No related tags found
No related merge requests found
Showing
with 161 additions and 72 deletions
...@@ -12,8 +12,9 @@ from pydantic import BaseModel, root_validator, validator ...@@ -12,8 +12,9 @@ from pydantic import BaseModel, root_validator, validator
from pydantic.fields import ModelField from pydantic.fields import ModelField
from gso.products.product_blocks.iptrunk import IptrunkType, PhyPortCapacity from gso.products.product_blocks.iptrunk import IptrunkType, PhyPortCapacity
from gso.products.product_blocks.router import RouterRole, RouterVendor from gso.products.product_blocks.router import RouterRole
from gso.products.product_blocks.site import SiteTier from gso.products.product_blocks.site import SiteTier
from gso.products.product_types.router import RouterVendor
from gso.services import subscriptions from gso.services import subscriptions
from gso.services.crm import CustomerNotFoundError, get_customer_by_name from gso.services.crm import CustomerNotFoundError, get_customer_by_name
from gso.utils.helpers import ( from gso.utils.helpers import (
......
...@@ -10,7 +10,7 @@ from alembic import op ...@@ -10,7 +10,7 @@ from alembic import op
# revision identifiers, used by Alembic. # revision identifiers, used by Alembic.
revision = 'a6eefd32c4f7' revision = 'a6eefd32c4f7'
down_revision = '3657611f0dfc' down_revision = '91047dd30b40'
branch_labels = None branch_labels = None
depends_on = None depends_on = None
......
"""Modify Router product model.
Revision ID: 30bc55e5be3e
Revises: 259c320235f5
Create Date: 2023-11-08 13:58:21.149708
"""
import sqlalchemy as sa
from alembic import op
# revision identifiers, used by Alembic.
revision = '30bc55e5be3e'
down_revision = '259c320235f5'
branch_labels = None
depends_on = None
def upgrade() -> None:
conn = op.get_bind()
conn.execute(sa.text("""
DELETE FROM product_block_resource_types WHERE product_block_resource_types.product_block_id IN (SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('RouterBlock')) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('router_vendor'))
"""))
conn.execute(sa.text("""
DELETE FROM subscription_instance_values USING product_block_resource_types WHERE subscription_instance_values.subscription_instance_id IN (SELECT subscription_instances.subscription_instance_id FROM subscription_instances WHERE subscription_instances.subscription_instance_id IN (SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('RouterBlock'))) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('router_vendor'))
"""))
conn.execute(sa.text("""
DELETE FROM subscription_instance_values WHERE subscription_instance_values.resource_type_id IN (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('router_vendor'))
"""))
conn.execute(sa.text("""
DELETE FROM resource_types WHERE resource_types.resource_type IN ('router_vendor')
"""))
conn.execute(sa.text("""
DELETE FROM processes WHERE processes.pid IN (SELECT processes_subscriptions.pid FROM processes_subscriptions WHERE processes_subscriptions.subscription_id IN (SELECT subscriptions.subscription_id FROM subscriptions WHERE subscriptions.product_id IN (SELECT products.product_id FROM products WHERE products.name IN ('Router'))))
"""))
conn.execute(sa.text("""
DELETE FROM processes_subscriptions WHERE processes_subscriptions.subscription_id IN (SELECT subscriptions.subscription_id FROM subscriptions WHERE subscriptions.product_id IN (SELECT products.product_id FROM products WHERE products.name IN ('Router')))
"""))
conn.execute(sa.text("""
DELETE FROM subscription_instances WHERE subscription_instances.subscription_id IN (SELECT subscriptions.subscription_id FROM subscriptions WHERE subscriptions.product_id IN (SELECT products.product_id FROM products WHERE products.name IN ('Router')))
"""))
conn.execute(sa.text("""
DELETE FROM subscriptions WHERE subscriptions.product_id IN (SELECT products.product_id FROM products WHERE products.name IN ('Router'))
"""))
conn.execute(sa.text("""
DELETE FROM products WHERE products.name IN ('Router')
"""))
conn.execute(sa.text("""
INSERT INTO products (name, description, product_type, tag, status) VALUES ('Nokia router', 'A Nokia router', 'Router', 'NOKIA_RT', 'active') RETURNING products.product_id
"""))
conn.execute(sa.text("""
INSERT INTO products (name, description, product_type, tag, status) VALUES ('Juniper router', 'A Juniper router', 'Router', 'JUNIPER_RT', 'active') RETURNING products.product_id
"""))
conn.execute(sa.text("""
INSERT INTO fixed_inputs (name, value, product_id) VALUES ('vendor', 'nokia', (SELECT products.product_id FROM products WHERE products.name IN ('Nokia router'))), ('vendor', 'juniper', (SELECT products.product_id FROM products WHERE products.name IN ('Juniper router')))
"""))
conn.execute(sa.text("""
INSERT INTO product_product_blocks (product_id, product_block_id) VALUES ((SELECT products.product_id FROM products WHERE products.name IN ('Nokia router')), (SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('RouterBlock'))), ((SELECT products.product_id FROM products WHERE products.name IN ('Juniper router')), (SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('RouterBlock')))
"""))
def downgrade() -> None:
conn = op.get_bind()
conn.execute(sa.text("""
DELETE FROM product_product_blocks WHERE product_product_blocks.product_id IN (SELECT products.product_id FROM products WHERE products.name IN ('Nokia router', 'Juniper router')) AND product_product_blocks.product_block_id IN (SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('RouterBlock'))
"""))
conn.execute(sa.text("""
DELETE FROM fixed_inputs WHERE fixed_inputs.product_id IN (SELECT products.product_id FROM products WHERE products.name IN ('Nokia router', 'Juniper router')) AND fixed_inputs.name = 'vendor'
"""))
conn.execute(sa.text("""
DELETE FROM processes WHERE processes.pid IN (SELECT processes_subscriptions.pid FROM processes_subscriptions WHERE processes_subscriptions.subscription_id IN (SELECT subscriptions.subscription_id FROM subscriptions WHERE subscriptions.product_id IN (SELECT products.product_id FROM products WHERE products.name IN ('Nokia router', 'Juniper router'))))
"""))
conn.execute(sa.text("""
DELETE FROM processes_subscriptions WHERE processes_subscriptions.subscription_id IN (SELECT subscriptions.subscription_id FROM subscriptions WHERE subscriptions.product_id IN (SELECT products.product_id FROM products WHERE products.name IN ('Nokia router', 'Juniper router')))
"""))
conn.execute(sa.text("""
DELETE FROM subscription_instances WHERE subscription_instances.subscription_id IN (SELECT subscriptions.subscription_id FROM subscriptions WHERE subscriptions.product_id IN (SELECT products.product_id FROM products WHERE products.name IN ('Nokia router', 'Juniper router')))
"""))
conn.execute(sa.text("""
DELETE FROM subscriptions WHERE subscriptions.product_id IN (SELECT products.product_id FROM products WHERE products.name IN ('Nokia router', 'Juniper router'))
"""))
conn.execute(sa.text("""
DELETE FROM products WHERE products.name IN ('Nokia router', 'Juniper router')
"""))
"""Add Router workflows. """Add router workflows.
Revision ID: 3657611f0dfc Revision ID: 7f46df0f4f95
Revises: 91047dd30b40 Revises: 30bc55e5be3e
Create Date: 2023-08-14 15:44:25.616608 Create Date: 2023-11-09 14:18:38.705753
""" """
import sqlalchemy as sa import sqlalchemy as sa
from alembic import op from alembic import op
# revision identifiers, used by Alembic. # revision identifiers, used by Alembic.
revision = '3657611f0dfc' revision = '7f46df0f4f95'
down_revision = '91047dd30b40' down_revision = '30bc55e5be3e'
branch_labels = None branch_labels = None
depends_on = None depends_on = None
......
"""Module that updates the domain model of :term:`GSO`. Should contain all types of subscriptions. """Module that updates the domain model of :term:`GSO`. Should contain all types of subscriptions.
.. warning:: .. warning::
Whenever a new product type is added, this should be reflected in the :py:class:`gso.products.ProductType` Whenever a new product is added, this should be reflected in the :py:class:`gso.products.ProductType` enumerator.
enumerator. This does not hold for adding a new type of already existing product.
""" """
from orchestrator.domain import SUBSCRIPTION_MODEL_REGISTRY from orchestrator.domain import SUBSCRIPTION_MODEL_REGISTRY
...@@ -17,14 +17,16 @@ class ProductType(strEnum): ...@@ -17,14 +17,16 @@ class ProductType(strEnum):
"""An enumerator of available products in :term:`GSO`.""" """An enumerator of available products in :term:`GSO`."""
SITE = "Site" SITE = "Site"
ROUTER = "Router" NOKIA_ROUTER = "Nokia router"
JUNIPER_ROUTER = "Juniper router"
IP_TRUNK = "IP trunk" IP_TRUNK = "IP trunk"
SUBSCRIPTION_MODEL_REGISTRY.update( SUBSCRIPTION_MODEL_REGISTRY.update(
{ {
"Site": Site, "Site": Site,
"Router": Router, "Nokia router": Router,
"Juniper router": Router,
"IP trunk": Iptrunk, "IP trunk": Iptrunk,
}, },
) )
...@@ -82,7 +82,9 @@ def get_active_router_subscriptions( ...@@ -82,7 +82,9 @@ def get_active_router_subscriptions(
:return: A list of Subscription objects for routers. :return: A list of Subscription objects for routers.
:rtype: list[Subscription] :rtype: list[Subscription]
""" """
return get_active_subscriptions(product_type=ProductType.ROUTER, includes=includes) active_nokia_routers = get_active_subscriptions(product_type=ProductType.NOKIA_ROUTER, includes=includes)
active_juniper_routers = get_active_subscriptions(product_type=ProductType.JUNIPER_ROUTER, includes=includes)
return active_nokia_routers + active_juniper_routers
def get_product_id_by_name(product_name: ProductType) -> UUID: def get_product_id_by_name(product_name: ProductType) -> UUID:
......
...@@ -12,9 +12,8 @@ from pydantic import BaseModel ...@@ -12,9 +12,8 @@ from pydantic import BaseModel
from pydantic_forms.validators import Choice from pydantic_forms.validators import Choice
from gso.products.product_blocks.iptrunk import IptrunkInterfaceBlock from gso.products.product_blocks.iptrunk import IptrunkInterfaceBlock
from gso.products.product_blocks.router import RouterVendor
from gso.products.product_types.iptrunk import Iptrunk from gso.products.product_types.iptrunk import Iptrunk
from gso.products.product_types.router import Router from gso.products.product_types.router import Router, RouterVendor
from gso.services import provisioning_proxy from gso.services import provisioning_proxy
from gso.services.netbox_client import NetboxClient from gso.services.netbox_client import NetboxClient
from gso.services.subscriptions import get_active_subscriptions_by_field_and_value from gso.services.subscriptions import get_active_subscriptions_by_field_and_value
...@@ -63,7 +62,7 @@ def available_interfaces_choices(router_id: UUID, speed: str) -> Choice | None: ...@@ -63,7 +62,7 @@ def available_interfaces_choices(router_id: UUID, speed: str) -> Choice | None:
For Nokia routers, return a list of available interfaces. For Nokia routers, return a list of available interfaces.
For Juniper routers, return a string. For Juniper routers, return a string.
""" """
if Router.from_subscription(router_id).router.router_vendor != RouterVendor.NOKIA: if get_router_vendor(router_id) != RouterVendor.NOKIA:
return None return None
interfaces = { interfaces = {
interface["name"]: f"{interface['name']} - {interface['module']['display']} - {interface['description']}" interface["name"]: f"{interface['name']} - {interface['module']['display']} - {interface['description']}"
...@@ -82,7 +81,7 @@ def available_interfaces_choices_including_current_members( ...@@ -82,7 +81,7 @@ def available_interfaces_choices_including_current_members(
For Nokia routers, return a list of available interfaces. For Nokia routers, return a list of available interfaces.
For Juniper routers, return a string. For Juniper routers, return a string.
""" """
if Router.from_subscription(router_id).router.router_vendor != RouterVendor.NOKIA: if get_router_vendor(router_id) != RouterVendor.NOKIA:
return None return None
available_interfaces = list(NetboxClient().get_available_interfaces(router_id, speed)) available_interfaces = list(NetboxClient().get_available_interfaces(router_id, speed))
...@@ -106,9 +105,9 @@ def available_lags_choices(router_id: UUID) -> Choice | None: ...@@ -106,9 +105,9 @@ def available_lags_choices(router_id: UUID) -> Choice | None:
"""Return a list of available lags for a given router. """Return a list of available lags for a given router.
For Nokia routers, return a list of available lags. For Nokia routers, return a list of available lags.
For Juniper routers, return a string. For Juniper routers, return ``None``.
""" """
if Router.from_subscription(router_id).router.router_vendor != RouterVendor.NOKIA: if get_router_vendor(router_id) != RouterVendor.NOKIA:
return None return None
side_a_ae_iface_list = NetboxClient().get_available_lags(router_id) side_a_ae_iface_list = NetboxClient().get_available_lags(router_id)
return Choice("ae iface", zip(side_a_ae_iface_list, side_a_ae_iface_list, strict=True)) # type: ignore[arg-type] return Choice("ae iface", zip(side_a_ae_iface_list, side_a_ae_iface_list, strict=True)) # type: ignore[arg-type]
...@@ -123,7 +122,7 @@ def get_router_vendor(router_id: UUID) -> str: ...@@ -123,7 +122,7 @@ def get_router_vendor(router_id: UUID) -> str:
:return: The vendor of the router. :return: The vendor of the router.
:rtype: str: :rtype: str:
""" """
return Router.from_subscription(router_id).router.router_vendor return Router.from_subscription(router_id).vendor
def iso_from_ipv4(ipv4_address: IPv4Address) -> str: def iso_from_ipv4(ipv4_address: IPv4Address) -> str:
...@@ -149,9 +148,9 @@ def validate_router_in_netbox(subscription_id: UUIDstr) -> UUIDstr: ...@@ -149,9 +148,9 @@ def validate_router_in_netbox(subscription_id: UUIDstr) -> UUIDstr:
:return: The :term:`UUID` of the router subscription. :return: The :term:`UUID` of the router subscription.
:rtype: :class:`UUIDstr` :rtype: :class:`UUIDstr`
""" """
router = Router.from_subscription(subscription_id).router router_type = Router.from_subscription(subscription_id)
if router.router_vendor == RouterVendor.NOKIA: if router_type.vendor == RouterVendor.NOKIA:
device = NetboxClient().get_device_by_name(router.router_fqdn) device = NetboxClient().get_device_by_name(router_type.router.router_fqdn)
if not device: if not device:
msg = "The selected router does not exist in Netbox." msg = "The selected router does not exist in Netbox."
raise ValueError(msg) raise ValueError(msg)
......
...@@ -19,7 +19,7 @@ from gso.products.product_blocks.iptrunk import ( ...@@ -19,7 +19,7 @@ from gso.products.product_blocks.iptrunk import (
) )
from gso.products.product_blocks.router import RouterVendor from gso.products.product_blocks.router import RouterVendor
from gso.products.product_types.iptrunk import IptrunkInactive, IptrunkProvisioning from gso.products.product_types.iptrunk import IptrunkInactive, IptrunkProvisioning
from gso.products.product_types.router import Router from gso.products.product_types.router import Router, RouterVendor
from gso.services import infoblox, provisioning_proxy, subscriptions from gso.services import infoblox, provisioning_proxy, subscriptions
from gso.services.crm import customer_selector from gso.services.crm import customer_selector
from gso.services.netbox_client import NetboxClient from gso.services.netbox_client import NetboxClient
......
...@@ -24,9 +24,8 @@ from pydantic_forms.core import ReadOnlyField ...@@ -24,9 +24,8 @@ from pydantic_forms.core import ReadOnlyField
from pynetbox.models.dcim import Interfaces from pynetbox.models.dcim import Interfaces
from gso.products.product_blocks.iptrunk import IptrunkInterfaceBlock from gso.products.product_blocks.iptrunk import IptrunkInterfaceBlock
from gso.products.product_blocks.router import RouterVendor
from gso.products.product_types.iptrunk import Iptrunk from gso.products.product_types.iptrunk import Iptrunk
from gso.products.product_types.router import Router from gso.products.product_types.router import Router, RouterVendor
from gso.services import provisioning_proxy from gso.services import provisioning_proxy
from gso.services.netbox_client import NetboxClient from gso.services.netbox_client import NetboxClient
from gso.services.provisioning_proxy import pp_interaction from gso.services.provisioning_proxy import pp_interaction
...@@ -494,15 +493,16 @@ def reserve_interfaces_in_netbox( ...@@ -494,15 +493,16 @@ def reserve_interfaces_in_netbox(
new_lag_member_interfaces: list[dict], new_lag_member_interfaces: list[dict],
) -> State: ) -> State:
"""Reserve new interfaces in Netbox.""" """Reserve new interfaces in Netbox."""
new_side = Router.from_subscription(new_node).router new_side_type = Router.from_subscription(new_node)
new_side_router = new_side_type.router
nbclient = NetboxClient() nbclient = NetboxClient()
if new_side.router_vendor == RouterVendor.NOKIA: if new_side_type.vendor == RouterVendor.NOKIA:
# Create :term:`LAG` interfaces # Create :term:`LAG` interfaces
lag_interface: Interfaces = nbclient.create_interface( lag_interface: Interfaces = nbclient.create_interface(
iface_name=new_lag_interface, iface_name=new_lag_interface,
interface_type="lag", interface_type="lag",
device_name=new_side.router_fqdn, device_name=new_side_router.router_fqdn,
description=str(subscription.subscription_id), description=str(subscription.subscription_id),
enabled=True, enabled=True,
) )
...@@ -510,13 +510,13 @@ def reserve_interfaces_in_netbox( ...@@ -510,13 +510,13 @@ def reserve_interfaces_in_netbox(
# Reserve interfaces # Reserve interfaces
for interface in new_lag_member_interfaces: for interface in new_lag_member_interfaces:
nbclient.attach_interface_to_lag( nbclient.attach_interface_to_lag(
device_name=new_side.router_fqdn, device_name=new_side_router.router_fqdn,
lag_name=lag_interface.name, lag_name=lag_interface.name,
iface_name=interface["interface_name"], iface_name=interface["interface_name"],
description=str(subscription.subscription_id), description=str(subscription.subscription_id),
) )
nbclient.reserve_interface( nbclient.reserve_interface(
device_name=new_side.router_fqdn, device_name=new_side_router.router_fqdn,
iface_name=interface["interface_name"], iface_name=interface["interface_name"],
) )
return {"subscription": subscription} return {"subscription": subscription}
......
...@@ -18,8 +18,8 @@ from gso.products.product_blocks.iptrunk import ( ...@@ -18,8 +18,8 @@ from gso.products.product_blocks.iptrunk import (
IptrunkType, IptrunkType,
PhyPortCapacity, PhyPortCapacity,
) )
from gso.products.product_blocks.router import RouterVendor
from gso.products.product_types.iptrunk import Iptrunk from gso.products.product_types.iptrunk import Iptrunk
from gso.products.product_types.router import RouterVendor
from gso.services import provisioning_proxy from gso.services import provisioning_proxy
from gso.services.netbox_client import NetboxClient from gso.services.netbox_client import NetboxClient
from gso.services.provisioning_proxy import pp_interaction from gso.services.provisioning_proxy import pp_interaction
...@@ -27,15 +27,16 @@ from gso.utils.helpers import ( ...@@ -27,15 +27,16 @@ from gso.utils.helpers import (
LAGMember, LAGMember,
available_interfaces_choices, available_interfaces_choices,
available_interfaces_choices_including_current_members, available_interfaces_choices_including_current_members,
validate_iptrunk_unique_interface, validate_iptrunk_unique_interface, get_router_vendor,
) )
def initialize_ae_members(subscription: Iptrunk, initial_user_input: dict, side_index: int) -> type[LAGMember]: def initialize_ae_members(subscription: Iptrunk, initial_user_input: dict, side_index: int) -> type[LAGMember]:
"""Initialize the list of AE members.""" """Initialize the list of AE members."""
router = subscription.iptrunk.iptrunk_sides[side_index].iptrunk_side_node router = subscription.iptrunk.iptrunk_sides[side_index].iptrunk_side_node
router_vendor = get_router_vendor(router.owner_subscription_id)
iptrunk_minimum_link = initial_user_input["iptrunk_minimum_links"] iptrunk_minimum_link = initial_user_input["iptrunk_minimum_links"]
if router.router_vendor == RouterVendor.NOKIA: if router_vendor == RouterVendor.NOKIA:
iptrunk_speed = initial_user_input["iptrunk_speed"] iptrunk_speed = initial_user_input["iptrunk_speed"]
class NokiaLAGMember(LAGMember): class NokiaLAGMember(LAGMember):
......
...@@ -15,12 +15,12 @@ from orchestrator.workflows.steps import ( ...@@ -15,12 +15,12 @@ from orchestrator.workflows.steps import (
) )
from orchestrator.workflows.utils import wrap_modify_initial_input_form from orchestrator.workflows.utils import wrap_modify_initial_input_form
from gso.products.product_blocks.router import RouterVendor
from gso.products.product_types.iptrunk import Iptrunk from gso.products.product_types.iptrunk import Iptrunk
from gso.products.product_types.router import Router, RouterVendor
from gso.services import infoblox, provisioning_proxy from gso.services import infoblox, provisioning_proxy
from gso.services.netbox_client import NetboxClient from gso.services.netbox_client import NetboxClient
from gso.services.provisioning_proxy import pp_interaction from gso.services.provisioning_proxy import pp_interaction
from gso.utils.helpers import set_isis_to_90000 from gso.utils.helpers import set_isis_to_90000, get_router_vendor
def initial_input_form_generator() -> FormGenerator: def initial_input_form_generator() -> FormGenerator:
...@@ -86,8 +86,9 @@ def free_interfaces_in_netbox(subscription: Iptrunk) -> State: ...@@ -86,8 +86,9 @@ def free_interfaces_in_netbox(subscription: Iptrunk) -> State:
""" """
for side in [0, 1]: for side in [0, 1]:
router = subscription.iptrunk.iptrunk_sides[side].iptrunk_side_node router = subscription.iptrunk.iptrunk_sides[side].iptrunk_side_node
router_vendor = get_router_vendor(router.owner_subscription_id)
router_fqdn = router.router_fqdn router_fqdn = router.router_fqdn
if router.router_vendor == RouterVendor.NOKIA: if router_vendor == RouterVendor.NOKIA:
nbclient = NetboxClient() nbclient = NetboxClient()
# Remove physical interfaces from LAGs # Remove physical interfaces from LAGs
for member in subscription.iptrunk.iptrunk_sides[side].iptrunk_side_ae_members: for member in subscription.iptrunk.iptrunk_sides[side].iptrunk_side_ae_members:
......
...@@ -16,10 +16,9 @@ from pydantic import validator ...@@ -16,10 +16,9 @@ from pydantic import validator
from gso.products.product_blocks.router import ( from gso.products.product_blocks.router import (
PortNumber, PortNumber,
RouterRole, RouterRole,
RouterVendor,
generate_fqdn, generate_fqdn,
) )
from gso.products.product_types.router import RouterInactive, RouterProvisioning from gso.products.product_types.router import RouterInactive, RouterProvisioning, RouterVendor
from gso.products.product_types.site import Site from gso.products.product_types.site import Site
from gso.services import infoblox, provisioning_proxy, subscriptions from gso.services import infoblox, provisioning_proxy, subscriptions
from gso.services.crm import customer_selector from gso.services.crm import customer_selector
...@@ -49,7 +48,6 @@ def initial_input_form_generator(product_name: str) -> FormGenerator: ...@@ -49,7 +48,6 @@ def initial_input_form_generator(product_name: str) -> FormGenerator:
router_site: _site_selector() # type: ignore[valid-type] router_site: _site_selector() # type: ignore[valid-type]
hostname: str hostname: str
ts_port: PortNumber ts_port: PortNumber
router_vendor: RouterVendor
router_role: RouterRole router_role: RouterRole
is_ias_connected: bool | None = False is_ias_connected: bool | None = False
...@@ -89,13 +87,13 @@ def initialize_subscription( ...@@ -89,13 +87,13 @@ def initialize_subscription(
subscription: RouterInactive, subscription: RouterInactive,
hostname: str, hostname: str,
ts_port: PortNumber, ts_port: PortNumber,
router_vendor: RouterVendor, vendor: RouterVendor,
router_site: str, router_site: str,
router_role: RouterRole, router_role: RouterRole,
) -> State: ) -> State:
"""Initialise the subscription object in the service database.""" """Initialise the subscription object in the service database."""
subscription.router.router_ts_port = ts_port subscription.router.router_ts_port = ts_port
subscription.router.router_vendor = router_vendor subscription.vendor = vendor
subscription.router.router_site = Site.from_subscription(router_site).site subscription.router.router_site = Site.from_subscription(router_site).site
fqdn = generate_fqdn( fqdn = generate_fqdn(
hostname, hostname,
...@@ -179,7 +177,7 @@ def create_netbox_device(subscription: RouterProvisioning) -> State: ...@@ -179,7 +177,7 @@ def create_netbox_device(subscription: RouterProvisioning) -> State:
HACK: use a conditional instead for execution of this step HACK: use a conditional instead for execution of this step
""" """
if subscription.router.router_vendor == RouterVendor.NOKIA: if subscription.vendor == RouterVendor.NOKIA:
NetboxClient().create_device( NetboxClient().create_device(
subscription.router.router_fqdn, subscription.router.router_fqdn,
str(subscription.router.router_site.site_tier), # type: ignore[union-attr] str(subscription.router.router_site.site_tier), # type: ignore[union-attr]
......
...@@ -16,8 +16,7 @@ from orchestrator.workflows.steps import ( ...@@ -16,8 +16,7 @@ from orchestrator.workflows.steps import (
) )
from orchestrator.workflows.utils import wrap_modify_initial_input_form from orchestrator.workflows.utils import wrap_modify_initial_input_form
from gso.products.product_blocks.router import RouterVendor from gso.products.product_types.router import Router, RouterVendor
from gso.products.product_types.router import Router
from gso.services import infoblox from gso.services import infoblox
from gso.services.netbox_client import NetboxClient from gso.services.netbox_client import NetboxClient
...@@ -78,7 +77,7 @@ def remove_config_from_router() -> None: ...@@ -78,7 +77,7 @@ def remove_config_from_router() -> None:
@step("Remove Device from NetBox") @step("Remove Device from NetBox")
def remove_device_from_netbox(subscription: Router) -> dict[str, Router]: def remove_device_from_netbox(subscription: Router) -> dict[str, Router]:
"""Remove the device from Netbox.""" """Remove the device from Netbox."""
if subscription.router.router_vendor == RouterVendor.NOKIA: if subscription.vendor == RouterVendor.NOKIA:
NetboxClient().delete_device(subscription.router.router_fqdn) NetboxClient().delete_device(subscription.router.router_fqdn)
return {"subscription": subscription} return {"subscription": subscription}
......
...@@ -12,9 +12,9 @@ from orchestrator.workflows.steps import resync, set_status, store_process_subsc ...@@ -12,9 +12,9 @@ from orchestrator.workflows.steps import resync, set_status, store_process_subsc
from gso.products import ProductType from gso.products import ProductType
from gso.products.product_blocks import router as router_pb from gso.products.product_blocks import router as router_pb
from gso.products.product_blocks.router import PortNumber, RouterRole, RouterVendor, generate_fqdn from gso.products.product_blocks.router import PortNumber, RouterRole, generate_fqdn
from gso.products.product_types import router from gso.products.product_types import router
from gso.products.product_types.router import RouterInactive from gso.products.product_types.router import RouterInactive, RouterVendor
from gso.products.product_types.site import Site from gso.products.product_types.site import Site
from gso.services import subscriptions from gso.services import subscriptions
from gso.services.crm import get_customer_by_name from gso.services.crm import get_customer_by_name
...@@ -35,10 +35,16 @@ def _get_site_by_name(site_name: str) -> Site: ...@@ -35,10 +35,16 @@ def _get_site_by_name(site_name: str) -> Site:
@step("Create subscription") @step("Create subscription")
def create_subscription(customer: str) -> State: def create_subscription(customer: str, router_vendor: RouterVendor) -> State:
"""Create a new subscription object.""" """Create a new subscription object."""
customer_id = get_customer_by_name(customer)["id"] customer_id = get_customer_by_name(customer)["id"]
product_id: UUID = subscriptions.get_product_id_by_name(ProductType.ROUTER) if router_vendor == RouterVendor.NOKIA:
product_id: UUID = subscriptions.get_product_id_by_name(ProductType.NOKIA_ROUTER)
elif router_vendor == RouterVendor.JUNIPER:
product_id: UUID = subscriptions.get_product_id_by_name(ProductType.JUNIPER_ROUTER)
else:
raise ValueError(f"Unknown router vendor: {router_vendor}")
subscription = RouterInactive.from_product_id(product_id, customer_id) subscription = RouterInactive.from_product_id(product_id, customer_id)
return { return {
...@@ -78,7 +84,6 @@ def initialize_subscription( ...@@ -78,7 +84,6 @@ def initialize_subscription(
subscription: RouterInactive, subscription: RouterInactive,
hostname: str, hostname: str,
ts_port: PortNumber, ts_port: PortNumber,
router_vendor: router_pb.RouterVendor,
router_site: str, router_site: str,
router_role: router_pb.RouterRole, router_role: router_pb.RouterRole,
is_ias_connected: bool | None = None, is_ias_connected: bool | None = None,
...@@ -91,7 +96,6 @@ def initialize_subscription( ...@@ -91,7 +96,6 @@ def initialize_subscription(
) -> State: ) -> State:
"""Initialise the router subscription using input data.""" """Initialise the router subscription using input data."""
subscription.router.router_ts_port = ts_port subscription.router.router_ts_port = ts_port
subscription.router.router_vendor = router_vendor
router_site_obj = _get_site_by_name(router_site).site router_site_obj = _get_site_by_name(router_site).site
subscription.router.router_site = router_site_obj subscription.router.router_site = router_site_obj
fqdn = generate_fqdn(hostname, router_site_obj.site_name, router_site_obj.site_country_code) fqdn = generate_fqdn(hostname, router_site_obj.site_name, router_site_obj.site_country_code)
......
...@@ -12,7 +12,7 @@ from gso.products.product_blocks.iptrunk import ( ...@@ -12,7 +12,7 @@ from gso.products.product_blocks.iptrunk import (
IptrunkType, IptrunkType,
PhyPortCapacity, PhyPortCapacity,
) )
from gso.products.product_blocks.router import RouterRole, RouterVendor from gso.products.product_blocks.router import RouterRole
from gso.products.product_blocks.site import SiteTier from gso.products.product_blocks.site import SiteTier
from gso.products.product_types.iptrunk import IptrunkInactive from gso.products.product_types.iptrunk import IptrunkInactive
from gso.products.product_types.router import Router, RouterInactive from gso.products.product_types.router import Router, RouterInactive
...@@ -74,7 +74,7 @@ def site_subscription_factory(faker): ...@@ -74,7 +74,7 @@ def site_subscription_factory(faker):
@pytest.fixture() @pytest.fixture()
def router_subscription_factory(site_subscription_factory, faker): def nokia_router_subscription_factory(site_subscription_factory, faker):
def subscription_create( def subscription_create(
description=None, description=None,
start_date="2023-05-24T00:00:00+00:00", start_date="2023-05-24T00:00:00+00:00",
...@@ -87,7 +87,6 @@ def router_subscription_factory(site_subscription_factory, faker): ...@@ -87,7 +87,6 @@ def router_subscription_factory(site_subscription_factory, faker):
router_si_ipv4_network=None, router_si_ipv4_network=None,
router_ias_lt_ipv4_network=None, router_ias_lt_ipv4_network=None,
router_ias_lt_ipv6_network=None, router_ias_lt_ipv6_network=None,
router_vendor=RouterVendor.NOKIA,
router_role=RouterRole.PE, router_role=RouterRole.PE,
router_site=None, router_site=None,
router_is_ias_connected=True, # noqa: FBT002 router_is_ias_connected=True, # noqa: FBT002
...@@ -105,7 +104,7 @@ def router_subscription_factory(site_subscription_factory, faker): ...@@ -105,7 +104,7 @@ def router_subscription_factory(site_subscription_factory, faker):
router_ias_lt_ipv6_network = router_ias_lt_ipv6_network or faker.ipv6_network() router_ias_lt_ipv6_network = router_ias_lt_ipv6_network or faker.ipv6_network()
router_site = router_site or site_subscription_factory() router_site = router_site or site_subscription_factory()
product_id = subscriptions.get_product_id_by_name(ProductType.ROUTER) product_id = subscriptions.get_product_id_by_name(ProductType.NOKIA_ROUTER)
router_subscription = RouterInactive.from_product_id(product_id, customer_id=CUSTOMER_ID, insync=True) router_subscription = RouterInactive.from_product_id(product_id, customer_id=CUSTOMER_ID, insync=True)
router_subscription.router.router_fqdn = router_fqdn router_subscription.router.router_fqdn = router_fqdn
router_subscription.router.router_ts_port = router_ts_port router_subscription.router.router_ts_port = router_ts_port
...@@ -116,7 +115,6 @@ def router_subscription_factory(site_subscription_factory, faker): ...@@ -116,7 +115,6 @@ def router_subscription_factory(site_subscription_factory, faker):
router_subscription.router.router_si_ipv4_network = router_si_ipv4_network router_subscription.router.router_si_ipv4_network = router_si_ipv4_network
router_subscription.router.router_ias_lt_ipv4_network = router_ias_lt_ipv4_network router_subscription.router.router_ias_lt_ipv4_network = router_ias_lt_ipv4_network
router_subscription.router.router_ias_lt_ipv6_network = router_ias_lt_ipv6_network router_subscription.router.router_ias_lt_ipv6_network = router_ias_lt_ipv6_network
router_subscription.router.router_vendor = router_vendor
router_subscription.router.router_role = router_role router_subscription.router.router_role = router_role
router_subscription.router.router_site = Site.from_subscription(router_site).site router_subscription.router.router_site = Site.from_subscription(router_site).site
router_subscription.router.router_is_ias_connected = router_is_ias_connected router_subscription.router.router_is_ias_connected = router_is_ias_connected
...@@ -137,7 +135,7 @@ def router_subscription_factory(site_subscription_factory, faker): ...@@ -137,7 +135,7 @@ def router_subscription_factory(site_subscription_factory, faker):
@pytest.fixture() @pytest.fixture()
def iptrunk_side_subscription_factory(router_subscription_factory, faker): def iptrunk_side_subscription_factory(nokia_router_subscription_factory, faker):
def subscription_create( def subscription_create(
iptrunk_side_node=None, iptrunk_side_node=None,
iptrunk_side_ae_iface=None, iptrunk_side_ae_iface=None,
...@@ -145,7 +143,7 @@ def iptrunk_side_subscription_factory(router_subscription_factory, faker): ...@@ -145,7 +143,7 @@ def iptrunk_side_subscription_factory(router_subscription_factory, faker):
iptrunk_side_ae_members=None, iptrunk_side_ae_members=None,
iptrunk_side_ae_members_description=None, iptrunk_side_ae_members_description=None,
) -> IptrunkSideBlock: ) -> IptrunkSideBlock:
iptrunk_side_node_id = iptrunk_side_node or router_subscription_factory() iptrunk_side_node_id = iptrunk_side_node or nokia_router_subscription_factory()
iptrunk_side_node = Router.from_subscription(iptrunk_side_node_id).router iptrunk_side_node = Router.from_subscription(iptrunk_side_node_id).router
iptrunk_side_ae_iface = iptrunk_side_ae_iface or faker.pystr() iptrunk_side_ae_iface = iptrunk_side_ae_iface or faker.pystr()
iptrunk_side_ae_geant_a_sid = iptrunk_side_ae_geant_a_sid or faker.geant_sid() iptrunk_side_ae_geant_a_sid = iptrunk_side_ae_geant_a_sid or faker.geant_sid()
......
from test.fixtures import ( # noqa: F401 from test.fixtures import ( # noqa: F401
iptrunk_side_subscription_factory, iptrunk_side_subscription_factory,
iptrunk_subscription_factory, iptrunk_subscription_factory,
router_subscription_factory, nokia_router_subscription_factory,
site_subscription_factory, site_subscription_factory,
) )
...@@ -6,8 +6,9 @@ from orchestrator.db import SubscriptionTable ...@@ -6,8 +6,9 @@ from orchestrator.db import SubscriptionTable
from orchestrator.services import subscriptions from orchestrator.services import subscriptions
from gso.products.product_blocks.iptrunk import IptrunkType, PhyPortCapacity from gso.products.product_blocks.iptrunk import IptrunkType, PhyPortCapacity
from gso.products.product_blocks.router import RouterRole, RouterVendor from gso.products.product_blocks.router import RouterRole
from gso.products.product_blocks.site import SiteTier from gso.products.product_blocks.site import SiteTier
from gso.products.product_types.router import RouterVendor
from gso.utils.helpers import iso_from_ipv4 from gso.utils.helpers import iso_from_ipv4
SITE_IMPORT_ENDPOINT = "/api/v1/imports/sites" SITE_IMPORT_ENDPOINT = "/api/v1/imports/sites"
...@@ -16,9 +17,9 @@ IPTRUNK_IMPORT_API_URL = "/api/v1/imports/iptrunks" ...@@ -16,9 +17,9 @@ IPTRUNK_IMPORT_API_URL = "/api/v1/imports/iptrunks"
@pytest.fixture() @pytest.fixture()
def iptrunk_data(router_subscription_factory, faker): def iptrunk_data(nokia_router_subscription_factory, faker):
router_side_a = router_subscription_factory() router_side_a = nokia_router_subscription_factory()
router_side_b = router_subscription_factory() router_side_b = nokia_router_subscription_factory()
return { return {
"customer": "GÉANT", "customer": "GÉANT",
"geant_s_sid": faker.geant_sid(), "geant_s_sid": faker.geant_sid(),
......
from test.fixtures import router_subscription_factory, site_subscription_factory # noqa: F401 from test.fixtures import nokia_router_subscription_factory, site_subscription_factory # noqa: F401
...@@ -3,12 +3,12 @@ from orchestrator.types import SubscriptionLifecycle ...@@ -3,12 +3,12 @@ from orchestrator.types import SubscriptionLifecycle
ROUTER_SUBSCRIPTION_ENDPOINT = "/api/v1/subscriptions/routers" ROUTER_SUBSCRIPTION_ENDPOINT = "/api/v1/subscriptions/routers"
def test_router_subscriptions_endpoint(test_client, router_subscription_factory): def test_router_subscriptions_endpoint(test_client, nokia_router_subscription_factory):
router_subscription_factory() nokia_router_subscription_factory()
router_subscription_factory() nokia_router_subscription_factory()
router_subscription_factory() nokia_router_subscription_factory()
router_subscription_factory(status=SubscriptionLifecycle.TERMINATED) nokia_router_subscription_factory(status=SubscriptionLifecycle.TERMINATED)
router_subscription_factory(status=SubscriptionLifecycle.INITIAL) nokia_router_subscription_factory(status=SubscriptionLifecycle.INITIAL)
response = test_client.get(ROUTER_SUBSCRIPTION_ENDPOINT) response = test_client.get(ROUTER_SUBSCRIPTION_ENDPOINT)
......
...@@ -4,7 +4,7 @@ from urllib3_mock import Responses ...@@ -4,7 +4,7 @@ from urllib3_mock import Responses
from test.fixtures import ( # noqa: F401 from test.fixtures import ( # noqa: F401
iptrunk_side_subscription_factory, iptrunk_side_subscription_factory,
iptrunk_subscription_factory, iptrunk_subscription_factory,
router_subscription_factory, nokia_router_subscription_factory,
site_subscription_factory, site_subscription_factory,
) )
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment