diff --git a/gso/oss-params-example.json b/gso/oss-params-example.json index 51702b5963ec89b763a87022ea9a8d3aeb6f4a93..ff6eb33dc70bcaad8cf453e5d678483cadb79c5f 100644 --- a/gso/oss-params-example.json +++ b/gso/oss-params-example.json @@ -91,5 +91,8 @@ "starttls_enabled": true, "smtp_username": "username", "smtp_password": "password" + }, + "SHAREPOINT": { + "checklist_site_url": "https://example.sharepoint.com/sites/example-site" } } diff --git a/gso/settings.py b/gso/settings.py index 2c86b723fa71b539df580d8d9eeecd20260dd13c..a49b3645bc30a00054eb3598cdaa09a6ddc8b6c3 100644 --- a/gso/settings.py +++ b/gso/settings.py @@ -166,6 +166,13 @@ class EmailParams(BaseSettings): smtp_password: str | None +class SharepointParams(BaseSettings): + """Settings for different Sharepoint sites.""" + + # TODO: Stricter typing after pydantic 2.x upgrade + checklist_site_url: str + + class OSSParams(BaseSettings): """The set of parameters required for running :term:`GSO`.""" @@ -177,6 +184,7 @@ class OSSParams(BaseSettings): CELERY: CeleryParams THIRD_PARTY_API_KEYS: dict[str, str] EMAIL: EmailParams + SHAREPOINT: SharepointParams def load_oss_params() -> OSSParams: diff --git a/gso/workflows/router/create_router.py b/gso/workflows/router/create_router.py index 30e7175e3b498429b69be648955d4a6253177011..978e33ba3205edd747e2193a30eca2f82699a77f 100644 --- a/gso/workflows/router/create_router.py +++ b/gso/workflows/router/create_router.py @@ -14,12 +14,13 @@ from pydantic import validator from pydantic_forms.core import ReadOnlyField from gso.products.product_blocks.router import RouterRole -from gso.products.product_types.router import RouterInactive +from gso.products.product_types.router import RouterInactive, RouterProvisioning from gso.products.product_types.site import Site from gso.services import infoblox, subscriptions from gso.services.crm import get_customer_by_name from gso.services.netbox_client import NetboxClient from gso.services.provisioning_proxy import pp_interaction +from gso.settings import load_oss_params from gso.utils.helpers import generate_fqdn, iso_from_ipv4 from gso.utils.shared_enums import PortNumber, Vendor from gso.utils.workflow_steps import deploy_base_config_dry, deploy_base_config_real, run_checks_after_base_config @@ -222,6 +223,26 @@ def prompt_insert_in_radius(subscription: RouterInactive) -> FormGenerator: return {} +@inputstep("Prompt for new Sharepoint checklist", assignee=Assignee.SYSTEM) +def prompt_start_new_checklist(subscription: RouterProvisioning) -> FormGenerator: + """Prompt the operator to start a new checklist in Sharepoint for approving this new router.""" + oss_params = load_oss_params() + + class SharepointPrompt(FormPage): + class Config: + title = "Start new checklist" + + info_label_1: Label = ( + f"Visit {oss_params.SHAREPOINT.checklist_site_url} and start a new Sharepoint checklist for " + f"{subscription.router.router_fqdn}." # type: ignore[assignment] + ) + info_label_2: Label = "Once this is done, click proceed to finish the workflow." # type: ignore[assignment] + + yield SharepointPrompt + + return {} + + @workflow( "Create router", initial_input_form=wrap_create_initial_input_form(initial_input_form_generator), @@ -254,6 +275,7 @@ def create_router() -> StepList: >> router_is_nokia(create_netbox_device) >> pp_interaction(run_checks_after_base_config) >> set_status(SubscriptionLifecycle.PROVISIONING) + >> prompt_start_new_checklist >> resync >> done ) diff --git a/test/workflows/router/test_create_router.py b/test/workflows/router/test_create_router.py index fbfd09e416875e44aa9ffb30740a9c5325e8c1fe..62808258924a554a8a0ff763a5943080c81afd45 100644 --- a/test/workflows/router/test_create_router.py +++ b/test/workflows/router/test_create_router.py @@ -94,6 +94,9 @@ def test_create_nokia_router_success( result, step_log = assert_pp_interaction_success(result, process_stat, step_log) + assert_suspended(result) + result, step_log = resume_workflow(process_stat, step_log, input_data=USER_CONFIRM_EMPTY_FORM) + assert_complete(result) state = extract_state(result)