diff --git a/gso/migrations/versions/2023-06-18_84d0ad6e7294_add_device_access_via_ts_attr.py b/gso/migrations/versions/2023-06-18_84d0ad6e7294_add_device_access_via_ts_attr.py new file mode 100644 index 0000000000000000000000000000000000000000..f9bd129e056beb05f12e8855762ba4edf4335c8c --- /dev/null +++ b/gso/migrations/versions/2023-06-18_84d0ad6e7294_add_device_access_via_ts_attr.py @@ -0,0 +1,64 @@ +"""Add device access_via_ts attr. + +Revision ID: 84d0ad6e7294 +Revises: c7def54cc165 +Create Date: 2023-06-18 12:03:23.365781 + +""" +import sqlalchemy as sa +from alembic import op + +# revision identifiers, used by Alembic. +revision = '84d0ad6e7294' +down_revision = 'c7def54cc165' +branch_labels = None +depends_on = None + + +def upgrade() -> None: + conn = op.get_bind() + conn.execute(""" +INSERT INTO resource_types (resource_type, description) VALUES ('device_access_via_ts', 'Access to the device via 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 ('DeviceBlock')), (SELECT resource_types.resource_type_id FROM resource_types WHERE resource_types.resource_type IN ('device_access_via_ts'))) + """) + 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, + 'false' + FROM resource_types + CROSS JOIN subscription_instance_ids + WHERE resource_types.resource_type = 'device_access_via_ts' + + """) + + +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 ('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_access_via_ts')) + """) + 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_access_via_ts')) + """) + 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_access_via_ts')) + """) + conn.execute(""" +DELETE FROM resource_types WHERE resource_types.resource_type IN ('device_access_via_ts') + """) diff --git a/gso/products/product_blocks/device.py b/gso/products/product_blocks/device.py index 38f2b53145679238abf90e5a010ebcf31bfb0e41..cc627b0e1509d6f3822e8ae398071fdee591ac92 100644 --- a/gso/products/product_blocks/device.py +++ b/gso/products/product_blocks/device.py @@ -24,6 +24,7 @@ class DeviceBlockInactive(ProductBlockModel, 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 device_lo_ipv6_address: Optional[ipaddress.IPv6Address] = None device_lo_iso_address: Optional[str] = None @@ -40,6 +41,7 @@ class DeviceBlockProvisioning(DeviceBlockInactive, 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 device_lo_ipv6_address: Optional[ipaddress.IPv6Address] = None device_lo_iso_address: Optional[str] = None @@ -56,6 +58,7 @@ class DeviceBlock(DeviceBlockProvisioning, device_fqdn: str device_ts_address: str device_ts_port: int + device_access_via_ts: bool device_lo_ipv4_address: ipaddress.IPv4Address device_lo_ipv6_address: ipaddress.IPv6Address device_lo_iso_address: str diff --git a/gso/workflows/device/create_device.py b/gso/workflows/device/create_device.py index fc91d8ead05c8368d598d029a9b125eb3746ae80..f7fcaab91f1486328dcaf7ccdfeb5232d06ed66d 100644 --- a/gso/workflows/device/create_device.py +++ b/gso/workflows/device/create_device.py @@ -128,6 +128,7 @@ def initialize_subscription( f'.geant.net' subscription.device.device_fqdn = fqdn subscription.device.device_role = device_role + subscription.device.device_access_via_ts = True subscription.description = f'Device {fqdn} ' \ f'({subscription.device_type})' @@ -144,9 +145,9 @@ def provision_device_dry(subscription: DeviceProvisioning, provisioning_proxy.provision_device(subscription, process_id) return {'subscription': subscription, - 'label_text': f'This is a dry run for the deployment of a new ' - f'{subscription.device_type}. Deployment is being ' - f'taken care of by the provisioning proxy, please ' + 'label_text': f'Dry run for the deployment of base config on a' + f'new {subscription.device_type}. Deployment is ' + f'done by the provisioning proxy, please ' f'wait for the results to come back before ' f'continuing.' } @@ -158,7 +159,7 @@ def provision_device_real(subscription: DeviceProvisioning, provisioning_proxy.provision_device(subscription, process_id, False) return {'subscription': subscription, - 'label_text': f'This is a live deployment of a new ' + 'label_text': f'Deployment of base config for a new ' f'{subscription.device_type}. Deployment is being ' f'taken care of by the provisioning proxy, please ' f'wait for the results to come back before '