diff --git a/gso/migrations/versions/2023-08-07_7728b3ef410c_modify_sites_and_device_pb.py b/gso/migrations/versions/2023-08-07_7728b3ef410c_modify_sites_and_device_pb.py new file mode 100644 index 0000000000000000000000000000000000000000..176403a5fb7e4ceb661e76b511f8a5dbd6cf4641 --- /dev/null +++ b/gso/migrations/versions/2023-08-07_7728b3ef410c_modify_sites_and_device_pb.py @@ -0,0 +1,111 @@ +"""Modify sites and device PB. + +Revision ID: 7728b3ef410c +Revises: e57ebfade80b +Create Date: 2023-08-07 12:53:31.090424 + +""" +import sqlalchemy as sa +from alembic import op + +# revision identifiers, used by Alembic. +revision = '7728b3ef410c' +down_revision = 'e57ebfade80b' +branch_labels = None +depends_on = None + + +def upgrade() -> None: + conn = op.get_bind() + conn.execute(""" +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 ('DeviceBlock')) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('device_ts_address')) + """) + conn.execute(""" +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 ('DeviceBlock'))) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('device_ts_address')) + """) + conn.execute(""" +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 ('device_ts_address')) + """) + conn.execute(""" +DELETE FROM resource_types WHERE resource_types.resource_type IN ('device_ts_address') + """) + conn.execute(""" +INSERT INTO resource_types (resource_type, description) VALUES ('device_is_ias_connected', 'device has lt to IAS') RETURNING resource_types.resource_type_id + """) + conn.execute(""" +INSERT INTO resource_types (resource_type, description) VALUES ('site_ts_address', 'Address of the terminal server') RETURNING resource_types.resource_type_id + """) + conn.execute(""" +INSERT INTO product_block_resource_types (product_block_id, resource_type_id) VALUES ((SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('SiteBlock')), (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('site_ts_address'))) + """) + conn.execute(""" +INSERT INTO product_block_resource_types (product_block_id, resource_type_id) VALUES ((SELECT product_blocks.product_block_id FROM product_blocks WHERE product_blocks.name IN ('DeviceBlock')), (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('device_is_ias_connected'))) + """) + conn.execute(""" + + WITH subscription_instance_ids AS ( + SELECT subscription_instances.subscription_instance_id + FROM subscription_instances + WHERE subscription_instances.product_block_id IN ( + SELECT product_blocks.product_block_id + FROM product_blocks + WHERE product_blocks.name = 'SiteBlock' + ) + ) + + INSERT INTO + subscription_instance_values (subscription_instance_id, resource_type_id, value) + SELECT + subscription_instance_ids.subscription_instance_id, + resource_types.resource_type_id, + 'Address of the terminal server' + FROM resource_types + CROSS JOIN subscription_instance_ids + WHERE resource_types.resource_type = 'site_ts_address' + + """) + conn.execute(""" + + WITH subscription_instance_ids AS ( + SELECT subscription_instances.subscription_instance_id + FROM subscription_instances + WHERE subscription_instances.product_block_id IN ( + SELECT product_blocks.product_block_id + FROM product_blocks + WHERE product_blocks.name = 'DeviceBlock' + ) + ) + + INSERT INTO + subscription_instance_values (subscription_instance_id, resource_type_id, value) + SELECT + subscription_instance_ids.subscription_instance_id, + resource_types.resource_type_id, + 'true' + FROM resource_types + CROSS JOIN subscription_instance_ids + WHERE resource_types.resource_type = 'device_is_ias_connected' + + """) + + +def downgrade() -> None: + conn = op.get_bind() + conn.execute(""" +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 ('SiteBlock')) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('site_ts_address')) + """) + conn.execute(""" +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 ('SiteBlock'))) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('site_ts_address')) + """) + conn.execute(""" +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 ('DeviceBlock')) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('device_is_ias_connected')) + """) + conn.execute(""" +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 ('DeviceBlock'))) AND product_block_resource_types.resource_type_id = (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('device_is_ias_connected')) + """) + conn.execute(""" +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 ('device_is_ias_connected', 'site_ts_address')) + """) + conn.execute(""" +DELETE FROM resource_types WHERE resource_types.resource_type IN ('device_is_ias_connected', 'site_ts_address') + """) diff --git a/gso/products/product_blocks/device.py b/gso/products/product_blocks/device.py index 301b51c79d36956f85414b2ac41a0978a9ad9e05..b3545e991cdaec21f66dd0cf85a0f3d2a06f8f3b 100644 --- a/gso/products/product_blocks/device.py +++ b/gso/products/product_blocks/device.py @@ -34,7 +34,6 @@ class DeviceBlockInactive( """A device that's being currently inactive. See {class}`DeviceBlock`.""" device_fqdn: Optional[str] = None - device_ts_address: Optional[str] = None device_ts_port: Optional[int] = None device_access_via_ts: Optional[bool] = None device_lo_ipv4_address: Optional[ipaddress.IPv4Address] = None @@ -46,13 +45,13 @@ class DeviceBlockInactive( device_vendor: Optional[DeviceVendor] = None device_role: Optional[DeviceRole] = None device_site: Optional[SiteBlockInactive] + device_is_ias_connected: Optional[bool] = None class DeviceBlockProvisioning(DeviceBlockInactive, lifecycle=[SubscriptionLifecycle.PROVISIONING]): """A device that's being provisioned. See {class}`DeviceBlock`.""" device_fqdn: str - device_ts_address: str device_ts_port: int device_access_via_ts: Optional[bool] = None device_lo_ipv4_address: Optional[ipaddress.IPv4Address] = None @@ -64,6 +63,7 @@ class DeviceBlockProvisioning(DeviceBlockInactive, lifecycle=[SubscriptionLifecy device_vendor: Optional[DeviceVendor] = None device_role: Optional[DeviceRole] = None device_site: Optional[SiteBlockProvisioning] + device_is_ias_connected: Optional[bool] = None class DeviceBlock(DeviceBlockProvisioning, lifecycle=[SubscriptionLifecycle.ACTIVE]): @@ -71,10 +71,6 @@ class DeviceBlock(DeviceBlockProvisioning, lifecycle=[SubscriptionLifecycle.ACTI device_fqdn: str """{term}`FQDN` of a device.""" - device_ts_address: str - """The address of the terminal server that this device is connected to. The terminal server provides out of band - access. This is required in case a link goes down, or when a device is initially added to the network and it does - not have any IP trunks connected to it yet.""" device_ts_port: int """The port of the terminal server that this device is connected to. Used for the same reason as mentioned previously.""" @@ -86,11 +82,11 @@ class DeviceBlock(DeviceBlockProvisioning, lifecycle=[SubscriptionLifecycle.ACTI """The IPv6 loopback address of the device.""" device_lo_iso_address: str """The {term}`ISO` {term}`NET` of the device, used for {term}`IS-IS` support.""" - device_si_ipv4_network: ipaddress.IPv4Network + device_si_ipv4_network: Optional[ipaddress.IPv4Network] """The SI IPv4 network of the device.""" - device_ias_lt_ipv4_network: ipaddress.IPv4Network + device_ias_lt_ipv4_network: Optional[ipaddress.IPv4Network] """The IAS LT IPv4 network of the device.""" - device_ias_lt_ipv6_network: ipaddress.IPv6Network + device_ias_lt_ipv6_network: Optional[ipaddress.IPv6Network] """The IAS LT IPv6 network of the device.""" device_vendor: DeviceVendor """The vendor of the device, can be any of the values defined in {class}`DeviceVendor`.""" @@ -98,3 +94,5 @@ class DeviceBlock(DeviceBlockProvisioning, lifecycle=[SubscriptionLifecycle.ACTI """The role of the device, which can be any of the values defined in {class}`DeviceRole`.""" device_site: SiteBlock """The {class}`Site` that this device resides in. Both physically and computationally.""" + device_is_ias_connected: bool + """The device is going to have a lt interface between inet0 and IAS""" diff --git a/gso/products/product_blocks/site.py b/gso/products/product_blocks/site.py index 6137b824f264b2e71d2c0fdcc03b031838f8e9d1..0364b094eae2aad9de9888219611b21159808613 100644 --- a/gso/products/product_blocks/site.py +++ b/gso/products/product_blocks/site.py @@ -31,6 +31,7 @@ class SiteBlockInactive(ProductBlockModel, lifecycle=[SubscriptionLifecycle.INIT site_internal_id: Optional[int] = None site_bgp_community_id: Optional[int] = None site_tier: Optional[SiteTier] = None + site_ts_address: Optional[str] = None class SiteBlockProvisioning(SiteBlockInactive, lifecycle=[SubscriptionLifecycle.PROVISIONING]): @@ -45,6 +46,7 @@ class SiteBlockProvisioning(SiteBlockInactive, lifecycle=[SubscriptionLifecycle. site_internal_id: Optional[int] = None site_bgp_community_id: Optional[int] = None site_tier: Optional[SiteTier] = None + site_ts_address: Optional[str] = None class SiteBlock(SiteBlockProvisioning, lifecycle=[SubscriptionLifecycle.ACTIVE]): @@ -70,3 +72,7 @@ class SiteBlock(SiteBlockProvisioning, lifecycle=[SubscriptionLifecycle.ACTIVE]) """The {term}`BGP` community ID of a site, used to advertise routes learned at this site.""" site_tier: SiteTier """The tier of a site, as described in {class}`SiteTier`.""" + site_ts_address: Optional[str] = None + """The address of the terminal server that this device is connected to. The terminal server provides out of band + access. This is required in case a link goes down, or when a device is initially added to the network and it does + not have any IP trunks connected to it yet."""