diff --git a/.gitignore b/.gitignore index 6afde985213dd261d8fd1a20004a400ab29610ad..6bed67465ad6341d9c73f3d94c641b0aa1398621 100644 --- a/.gitignore +++ b/.gitignore @@ -12,12 +12,12 @@ oss-params.json build/ # Documentation -docs/build -docs/vale/styles/* -!docs/vale/styles/config/ -!docs/vale/styles/custom/ +site +vale/styles/* +!vale/styles/config/ +!vale/styles/custom/ .DS_Store .idea .venv -.env \ No newline at end of file +.env diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 05fe9af7cf0863703bde6341001f27280b339b05..ee5b8bc3cc1f2338e476348c43108beaa7ed5c05 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -4,8 +4,6 @@ stages: - documentation - sonarqube - trigger_jenkins_build -include: - - docs/.gitlab-ci.yml #################################### tox - Testing and linting run-tox-pipeline: @@ -45,6 +43,43 @@ run-tox-pipeline: paths: - htmlcov +##### Sphinx - Generate documentation +build-documentation: + stage: documentation + tags: + - docker-executor + image: sphinxdoc/sphinx:latest + + before_script: + - pip install sphinx_rtd_theme sphinxcontrib-jquery + - cd $CI_PROJECT_DIR/docs/source + script: + - make html + + artifacts: + paths: + - $CI_PROJECT_DIR/docs/build/html + +##### Vale - Documentation linter +lint-documentation: + stage: documentation + image: + name: jdkato/vale:latest + entrypoint: [""] + + tags: + - docker-executor + needs: + - job: build-documentation # Only run when documentation has been built + artifacts: true + + before_script: + - cd $CI_PROJECT_DIR/docs/vale + - vale sync + + script: + - vale --glob='!*/migrations/*' $CI_PROJECT_DIR/docs/source $CI_PROJECT_DIR/gso + sonarqube: stage: sonarqube image: sonarsource/sonar-scanner-cli:10.0 diff --git a/build-docs.sh b/build-docs.sh index 02e3a418955d27e1103cae93ecfeedacf6374d5c..e57c78c728511e89c1f51230840180e4a1f37b62 100755 --- a/build-docs.sh +++ b/build-docs.sh @@ -2,7 +2,7 @@ set -o errexit set -o nounset -export OSS_PARAMS_FILENAME=../gso/oss-params-example.json +export OSS_PARAMS_FILENAME=gso/oss-params-example.json export TESTING=true pip install mkdocstrings-python mkdocs_gen_files mkdocs-material mkdocs-literate-nav mkdocs-section-index diff --git a/docs/.gitlab-ci.yml b/docs/.gitlab-ci.yml deleted file mode 100644 index 68d7fd2a3ea36f9a3a4b331e014b6cecef156d36..0000000000000000000000000000000000000000 --- a/docs/.gitlab-ci.yml +++ /dev/null @@ -1,37 +0,0 @@ ---- -##### Sphinx - Generate documentation -build-documentation: - stage: documentation - tags: - - docker-executor - image: sphinxdoc/sphinx:latest - - before_script: - - pip install sphinx_rtd_theme sphinxcontrib-jquery - - cd $CI_PROJECT_DIR/docs/source - script: - - make html - - artifacts: - paths: - - $CI_PROJECT_DIR/docs/build/html - -##### Vale - Documentation linter -lint-documentation: - stage: documentation - image: - name: jdkato/vale:latest - entrypoint: [""] - - tags: - - docker-executor - needs: - - job: build-documentation # Only run when documentation has been built - artifacts: true - - before_script: - - cd $CI_PROJECT_DIR/docs/vale - - vale sync - - script: - - vale --glob='!*/migrations/*' $CI_PROJECT_DIR/docs/source $CI_PROJECT_DIR/gso diff --git a/docs/admin_guide/ansible/ansible.md b/docs/admin_guide/ansible/ansible.md new file mode 100644 index 0000000000000000000000000000000000000000..d30d40aaccac4f3079933e7638901d5f488cdca8 --- /dev/null +++ b/docs/admin_guide/ansible/ansible.md @@ -0,0 +1,7 @@ +# Ansible + +## Design + +## Ansible roles and playbooks + +## Troubleshooting \ No newline at end of file diff --git a/docs/admin_guide/index.md b/docs/admin_guide/index.md new file mode 100644 index 0000000000000000000000000000000000000000..8ac22375d7150c0ac5cb6cba62e2150ae7b7badc --- /dev/null +++ b/docs/admin_guide/index.md @@ -0,0 +1,11 @@ +# About this section + +All the information regarding modeling and Ansible mechanics are described in this section. + +The structure is: + +- WFO + - Modelling +- Ansible + - Design + - Low level description diff --git a/docs/admin_guide/oss_bss/ipam.md b/docs/admin_guide/oss_bss/ipam.md new file mode 100644 index 0000000000000000000000000000000000000000..9d1ef645ff75185ad7d5698502c8b5e610e4db05 --- /dev/null +++ b/docs/admin_guide/oss_bss/ipam.md @@ -0,0 +1,4 @@ +# Integration with Infoblox + +The Infoblox service in GAP takes care of IP resources when creating routers, +IP trunks, and other customer-facing services. diff --git a/docs/admin_guide/oss_bss/kentik.md b/docs/admin_guide/oss_bss/kentik.md new file mode 100644 index 0000000000000000000000000000000000000000..aa5b57e42ddbd2170db8dec31b9ff8822504a6ab --- /dev/null +++ b/docs/admin_guide/oss_bss/kentik.md @@ -0,0 +1,8 @@ +# Integration with Kentik + +Routers are added to Kentik when they have a PE role. This can be either when +creating a new PE router, or upgrading an existing P router to PE. + +When the router is added to Kentik, a placeholder license is applied. Then, +a member of the service management team is able to run the +`modify_router_kentik_license` workflow to apply a different license. diff --git a/docs/admin_guide/oss_bss/librenms.md b/docs/admin_guide/oss_bss/librenms.md new file mode 100644 index 0000000000000000000000000000000000000000..c4d7ae62c0d6621e776df751780c629ca5f03844 --- /dev/null +++ b/docs/admin_guide/oss_bss/librenms.md @@ -0,0 +1,3 @@ +# Integration with LibreNMS + +When a router is created or terminated, it is added or removed from LibreNMS. diff --git a/docs/admin_guide/oss_bss/netbox.md b/docs/admin_guide/oss_bss/netbox.md new file mode 100644 index 0000000000000000000000000000000000000000..352202dfb3467e12fa0236f075e43c686169c34e --- /dev/null +++ b/docs/admin_guide/oss_bss/netbox.md @@ -0,0 +1,4 @@ +# Integration with Netbox + +Netbox is used for bookkeeping of interface usage, and suggesting options to +the operator for available LAGs. diff --git a/docs/admin_guide/wfo/iptrunks.md b/docs/admin_guide/wfo/iptrunks.md new file mode 100644 index 0000000000000000000000000000000000000000..fc9955c6572798c850d2d6e0daddedf9c350f39c --- /dev/null +++ b/docs/admin_guide/wfo/iptrunks.md @@ -0,0 +1,25 @@ +# IP trunks + +IP trunks are core links between two GÉANT routers. +The IP trunk is a special service since on the interfaces at the end of the trunk, no VLAN multiplexing is allowed. +For this reason, in case of an IP trunk, we do not use the canonical decomposition that leverages a demarcation point. + +## Modelling and attributes + +The relevant attributes for an IPTrunk are the following: + +| Attribute name | Attribute type | Description | +|---------------------------------------|----------------|------------------------------------------------------------------------------------------------------| +| `geant_s_sid` | `str` | GÉANT service ID associated with this trunk. | +| `iptrunk_description` | `str` | A human-readable description of this trunk. | +| `iptrunk_type` | `IptrunkType` | The type of trunk, can be either dark fibre or leased capacity. | +| `iptrunk_speed` | `str` | should be of PhyPortCapacity type The speed of the trunk, measured per interface associated with it. | +| `iptrunk_minimum_links` | `int` | The minimum amount of links the trunk should consist of. | +| `iptrunk_isis_metric` | `int` | The IS-IS metric of this link | +| `iptrunk_ipv4_network` | `IPv4Network` | The IPv4 network used for this trunk. | +| `iptrunk_ipv6_network` | `IPv6Network` | The IPv6 network used for this trunk. | +| `iptrunk_side_node` | `DeviceBlock` | The router that hosts the A side of the trunk. | +| `iptrunk_side_ae_iface` | `str` | The name of the interface on which the trunk connects. | +| `iptrunk_side_ae_geant_a_sid` | `str` | The service ID of the interface. | +| `iptrunk_side_ae_members` | `list[str]` | A list of interface members that make up the aggregated Ethernet interface. | +| `iptrunk_side_ae_members_description` | `list[str]` | The list of descriptions that describe the list of interface members. | diff --git a/docs/admin_guide/wfo/overview.md b/docs/admin_guide/wfo/overview.md new file mode 100644 index 0000000000000000000000000000000000000000..d8af9f500a4fc8f6d57d8aba173fc2c67ed1b01b --- /dev/null +++ b/docs/admin_guide/wfo/overview.md @@ -0,0 +1,56 @@ +# Diagram + +``` mermaid +classDiagram + Site <|-- Router :belong + + class Site{ + +UUId name + +String phoneNumber + +String emailAddress + } + + class Router{ + +int studentNumber + +int averageMark + +isEligibleToEnrol() + +getSeminarsTaken() + } +``` + +## Node deployment + +A node consists of one or more routers, a switch, and a terminal server. +In general -- as laid out more extensively +<a href="https://wiki.geant.org/display/NETENG/001+-+Topology+and+physical+layout" target="_blank">here</a> +(behind login) -- a PoP consists of: + +* One or two routers +* One switch +* One terminal server + +Globally, the workflow for a new site is as follows: + +1. Deploy terminal server: + 1. Generate base configuration from GitLab + 2. Ship the device to its location + 3. Verify reachability and insert in LibreNMS +2. Deploy PoP router in a 'core' fashion + 1. Rack it up and configure the hardware + 2. Connect the router to the terminal server via both a console connection, and FXP + 3. Deploy base configuration using GAP +3. Deploy PoP switch + 1. Rack it up and configure the hardware + 2. Connect the switch to the terminal server via both a console connection, and FXP + 3. Deploy base configuration using GAP +4. Deploy the PoP interconnect between router and switch + 1. Set up a physical connection between router and switch + 2. Deploy configuration using GAP +5. Deploy IP trunks to connect the router to the rest of the network + 1. Set up a physical connection + 2. Deploy configuration using GAP +6. Update the iBGP mesh to include the new router, promoting it to an edge router + 1. Deploy configuration using GAP + 2. Using GAP, insert the devices in LibreNMS + +In the context of the automation platform, the PoP interconnects mentioned are modeled as separate objects. diff --git a/docs/admin_guide/wfo/routers.md b/docs/admin_guide/wfo/routers.md new file mode 100644 index 0000000000000000000000000000000000000000..cb9133e9a3743f5c3d6b75517c3105aba21bd46e --- /dev/null +++ b/docs/admin_guide/wfo/routers.md @@ -0,0 +1,47 @@ +# Routers + +Routers are the packet-layer devices that form the backbone of the GÉANT +network. They only require an active site subscription to be available, +which is the location one is hosted at. Virtually all services depend on an +active router subscription. As a result, this is one of the most fundamental +subscription instances in GSO. + +From a bird's-eye view, the process of deploying a new router in the network is as follows: + +1. Manually configure the router such that it is reachable from out-of-band (OOB). +2. Upgrade the router to the most recent OS. +3. Deploy base configuration. +4. Configure trunks to connect the router to the network. +5. Update the protocol meshes (such as iBGP). +6. Promote the router to the production environment. + + + +*WFO provisions a new router by following the steps shown here.* + +## Modelling and attributes + +The attributes of a router are as follows: + +| Attribute name | Attribute type | Description | +|--------------------------|----------------|---------------------------------------------------------------------------------------------------------| +| `router_fqdn` | `str` | The FQDN of a router | +| `router_ts_port` | `PortNumber` | The port of the terminal server that this router is connected to.<br/>Used to offer out of band access. | +| `router_access_via_ts` | `bool` | Whether this router should be accessed through the terminal server, or through its loopback address. | +| `router_lo_ipv4_address` | `IPv4Address` | The IPv4 loopback address of a router. | +| `router_lo_ipv6_address` | `IPv6Address` | The IPv6 loopback address of a router. | +| `router_lo_iso_address` | `str` | The ISO address of the router, used for ISIS support. | +| `router_role` | `RouterRole` | The role of the router, which can be P, PE, or AMT. | +| `router_site` | `SiteBlock` | The site that this router is located at. | +| `vendor` | `RouterVendor` | The vendor of a router, either Juniper or Nokia. | + +## Deployment + +For the deployment of a router, two workflows are required to be run. The +first is creation of the router subscription itself, and preparing it for +insertion into the network. After completing this workflow, it needs to get +added to the iBGP mesh of existing routers in the network. + +!!! tip + The creation of a new router also requires an active site subscription, + ensure that this is already in place before continuing. diff --git a/docs/admin_guide/wfo/sites.md b/docs/admin_guide/wfo/sites.md new file mode 100644 index 0000000000000000000000000000000000000000..644822ed8010566da96791687a1c536db3e7a37f --- /dev/null +++ b/docs/admin_guide/wfo/sites.md @@ -0,0 +1,24 @@ +# Sites + +Sites are an abstract construction to model information that is shared across +all services deployed at one physical location. They only contain information +relevant to the services that rely on it. As a result, external BSS and OSS +systems are still in place for other accounting and bookkeeping purposes. +However, these lie outside the scope of GAP. + +## Modelling and attributes + +A Site object contains the following attributes: + +| Attribute name | Attribute type | Description | +|--------------------------------------------------|-----------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| `site_name` | `str` | The name of the site, that will dictate part of the FQDN of routers that are hosted at this site.<br/>For example: `router.X.Y.geant.net`, where X denotes the name of the site. | +| `site_city` | `str` | The city at which the site is located. | +| `site_country` | `str` | The country in which the site is located. | +| `site_country_code` | `str` | The code of the corresponding country. This is also used for the FQDN,<br/>following the example for the site name, the country code goes in the Y position. | +| `site_latitude` | `LatitudeCoordinate` | The latitude of the site, used for SNMP. | +| `site_longitude` | `LongitudeCoordinate` | The longitude of the site, again for SNMP. | +| `site_internal_id` | `int` | The internal ID used within GÉANT for a site. | +| `site_bgp_community_id` | `int` | The BGP community ID of a site, used to advertise routes learned at this site. | +| `site_tier` | `SiteTier` | The tier of a site, which corresponds to installed equipment. | +| `site_ts_address` | `IPv4Address` | The address of the terminal server hosted at this site.<br/>It is used for out of band access to any equipment hosted here. | diff --git a/docs/architecture/components/ansible/index.md b/docs/architecture/components/ansible/index.md new file mode 100644 index 0000000000000000000000000000000000000000..95d1d7073dc6d7a164f78f0f50b8a0db3870af35 --- /dev/null +++ b/docs/architecture/components/ansible/index.md @@ -0,0 +1,12 @@ +# Ansible + +Ansible is responsible for: + +- Compiling, deploying, and deleting configuration on targeted devices +- Gathering operational information from the targeted devices + +The Ansible subsystem is composed of three main functional parts: + +- A plugin that is responsible for exposing the Ansible engine to the Workflow Orchestrator via APIs +- A set of Ansible roles and playbooks that interacts with network elements +- A set of global variables stored in a Git repository that build the Ansible Inventory diff --git a/docs/architecture/components/index.md b/docs/architecture/components/index.md new file mode 100644 index 0000000000000000000000000000000000000000..bf0790f34cf09df7efab943a2437df16579319d0 --- /dev/null +++ b/docs/architecture/components/index.md @@ -0,0 +1,27 @@ +# Components of GAP + +As stated before, GAP is a platform and not a monolithic piece of software. GAP interacts with different OSS/BSS +systems already present in GÉANT and these are tightly integrated with the automation platform. + +From a high level point of view, GAP can be seen as the sum of the following parts: + +- __A service database__ called CoreDB that stores the models of the service instances, called _subscriptions_. +Subscriptions are abstract objects that represent functional configuration constructs: the attributes that characterize +these objects are defined in the _domain models_. + +- __An orchestration engine__ called Workflow Orchestrator that is capable of executing lists of steps called workflows. + +- __A web interface__ for operators, called Orchestrator GUI to intuitively launch and inspect workflows. + +- __An automation engine__, Ansible, capable of interacting with network devices to configure them or to gather +operational information. + +- __A set of authoritative systems to manage resources__: + - IP addresses and DNS names (Infoblox) + - Physical interfaces (Netbox) + +To interact with these external systems, specific plugins or wrappers are in place. + +An overview of how these components interact is depicted in the following diagram: + +{width=300} diff --git a/docs/architecture/components/lso/index.md b/docs/architecture/components/lso/index.md new file mode 100644 index 0000000000000000000000000000000000000000..a1e1e0d44c7c791b08441e7931bb61ea9137532a --- /dev/null +++ b/docs/architecture/components/lso/index.md @@ -0,0 +1,171 @@ +# Lightweight service orchestrator + +This page describes the inner workings of the Lightweight Service Orchestrator +(LSO), that handles the interaction between GSO and Ansible. + +## Motivation + +For the deployment of new services in the GÉANT network, Ansible playbooks are +used to deploy configuration statements onto remote devices. To make this +interaction possible, LSO exposes an API that allows for the remote execution +of playbooks. + +The need to externalise this interaction comes from the fact that the Python +library used to execute playbooks, introduces a potential situation where +dependency versions could be conflicting. To prevent this from happening, GSO +and LSO each are their own Python package, with each their own, independent +library dependencies. + +## Inner workings + +LSO uses <a href="https://ansible.readthedocs.io/projects/runner/en/latest/" +target="_blank">`ansible-runner`</a> for the execution of Ansible playbooks. +This package fully dictates the way in which GAP interacts with Ansible itself. +LSO only introduces an API with a single REST endpoint that exposes its +functionality. + +In the case of GAP, all Ansible playbooks operate without an inventory that +contains all relevant `group_vars` and `host_vars`. The inventory is passed to +the API endpoint for executing a playbook, which contains all required +`host_vars`. For the other information relevant to the playbook, this is passed +through the API by making use of `extra_vars`. In virtually all cases, the +`extra_vars` will at least consist of the subscription object that is being +deployed, and assisting variables, such as 'verb' used to express an operation. + +As an example, the following object is passed to the Ansible playbook for the +deployment of a new router in the network. + +``` json +extra_vars = { + "subscription": { + "product": { + "product_id": "27c9dc35-f0fa-4901-bda4-65df5bb7499d", + "name": "Router", + "description": "A Router", + "product_type": "Router", + "tag": "RTR", + "status": "active", + "created_at": "2024-01-24T15:47:13+00:00", + "end_date": None, + }, + "customer_id": "8f0df561-ce9d-4d9c-89a8-7953d3ffc961", + "subscription_id": "b57cbbc8-e8d1-47f8-add6-7923ecd7e3d5", + "description": "Router SrzptDtKBIFGijnHrglQ.flores.bb.geant.net", + "status": "provisioning", + "insync": False, + "start_date": None, + "end_date": None, + "note": None, + "router": { + "name": "RouterBlock", + "subscription_instance_id": "09d6bea9-8c79-4e75-9a69-ef249bb9de5e", + "owner_subscription_id": "b57cbbc8-e8d1-47f8-add6-7923ecd7e3d5", + "label": None, + "router_fqdn": "SrzptDtKBIFGijnHrglQ.flores.bb.geant.net", + "router_ts_port": 4223, + "router_access_via_ts": True, + "router_lo_ipv4_address": "74.95.57.63", + "router_lo_ipv6_address": "ac6f:7008:40d3:d431:bcc4:2eac:b443:f6b8", + "router_lo_iso_address": "49.51e5.0001.0740.9505.7063.00", + "router_role": "amt", + "router_site": { + "name": "SiteBlock", + "subscription_instance_id": "874ffb0b-cf55-49ea-810f-7268c02891fa", + "owner_subscription_id": "324239ea-555b-464d-bfde-54666470d71d", + "label": None, + "site_name": "flores", + "site_city": "Whitemouth", + "site_country": "Zimbabwe", + "site_country_code": "BB", + "site_latitude": "45.39258", + "site_longitude": "137.727838", + "site_internal_id": 9881, + "site_bgp_community_id": 8738, + "site_tier": "1", + "site_ts_address": "137.105.143.190", + }, + "vendor": "nokia", + }, + }, + "dry_run": True, + "verb": "deploy", + "commit_comment": "GSO_PROCESS_ID: 549aae60-0574-4c5a-a736-00c83fdb446a - + TT_NUMBER: TT#1987043028032905 - Deploy base config" +} +``` + +In this example, four top-level keys are included: `subscription`, `dry_run`, +`verb`, and `commit_comment`. In order, these are used for the following. + +The `subscription` key includes a dictionary representation of the subscription +that is being provisioned. In the case of a router, `router` contains +information about the subscription object, with its child key `router_site` that +contains information about the site at which this router is deployed. +Information about this router site comes from the related site subscription +which is already 'deployed' in GSO. + +For the distinction between practice runs, and actual deployments, the variable +`dry_run` is included. The difference between an execution which is a dry run +and one that is not, is the commitment of configuration. With a dry run, +configuration is only checked, and not committed to the remote machine. When +`dry_run` is set to `False`, the configuration is checked and then committed. + +To distinguish between different actions that can be taken with service +deployments, 'verbs' are introduced. In the example, the verb is set to 'deploy' +to provision a new service. Other examples of verbs can include 'deactivate', +'modify', or 'terminate'. + +The `commit_comment` is used for bookkeeping purposes on the remote machines. +This can be used for debugging or accounting purposes, among others. It always +includes the process ID of the workflow that is related to an operation, and the +associated trouble ticket number. + +### The full API request + +From the previous section, `extra_vars` is only one piece of the puzzle. For a +full-fledged API request to LSO, an example call is given. + +``` json +{ + "playbook_name": "deploy_a_service.yaml", + "callback": "https://orchestrator.gap.geant.org/api/processes/(…)/callback/(…)", + "inventory": { + "all": { + "hosts": { + "edge1-host": { + "example-var": "A value", + "another-var": "Totally optional, and can differ per host" + }, + "edge2-host": null // Note that the `null` is a mandatory YAML-restriction + } + }, + "extra_vars": { + …as shown above + } + } +} +``` + +## Code documentation + +Code documentation for LSO can be found +<a href="https://workfloworchestrator.org/lso" target="_blank">here</a>. + +## Deployment within GÉANT + +For the deployment in GÉANT, LSO runs inside a Docker container. The Dockerfile +used to build this container is available <a href= +"https://gitlab.software.geant.org/goat/gap/lso/-/blob/develop/Dockerfile" +target="_blank">here</a>. + +When building the Docker image, some Ansible roles and collections are installed +that are required for interacting with Juniper and Nokia equipment. For another +organisation that would want to use LSO in their deployment, it is highly +recommended to use this Dockerfile as a starting point. From this another Docker +image can be built with custom Ansible requirements pre-installed. + +It also opens up the possibility to include an Ansible inventory, if so desired. +Do note however, that this introduces a requirement to re-build LSO every time +the inventory is updated, or to have it included as a volume mount inside the +running container. Including a dynamic inventory with every API call is +therefore the recommended way to go. diff --git a/docs/architecture/components/netbox/index.md b/docs/architecture/components/netbox/index.md new file mode 100644 index 0000000000000000000000000000000000000000..2f5160b94778c92c6662f0985720b8208fec2775 --- /dev/null +++ b/docs/architecture/components/netbox/index.md @@ -0,0 +1,23 @@ +# Netbox + +Netbox is a DCIM capable of managing inventory of Sites, Racks, Devices, Ports, etc. + +GAP makes use of Netbox to store information about which physical interfaces are in use. + +There are some strong assumptions that are made about GAP: + +- All the nodes have fixed configuration that does not change often over time +- The only point where operators can assign interfaces is GAP +- The legacy Juniper network is not managed by GAP + +## Network hardware + +The new routers have a static hardware configuration which depends on the tier of the site at which it is installed. +The following table summarizes the possible configurations: + +| Tier | Chassis | Control plane | Switching fabric | Linecard | +|------|---------|---------------|------------------|----------------------------------| +| 1 | SR7s | 2x CPM2-s | 4x SFM7-s | 2x XCM2 - 2x XMA2-s (36p QSFPDD) | +| 2 | SR7s | 2x CPM2-s | 4x SFM7-s | 2x XCM2 - 2x XMA2-s (36p QSFPDD) | +| 3 | TBD | TBD | TBD | TBD | +| 4 | TBD | TBD | TBD | TBD | diff --git a/docs/architecture/components/wfo/index.md b/docs/architecture/components/wfo/index.md new file mode 100644 index 0000000000000000000000000000000000000000..a0da86ebcd0f0db0e3b3bb4a94d34aa5fc92c995 --- /dev/null +++ b/docs/architecture/components/wfo/index.md @@ -0,0 +1,9 @@ +# Workflow Orchestrator + +In this page, a description is given of the mechanisms that govern: + +- Workflow Orchestrator +- CoreDB +- The framework for the integration of plugins + +(TBA) diff --git a/docs/architecture/config_decomposition/index.md b/docs/architecture/config_decomposition/index.md new file mode 100644 index 0000000000000000000000000000000000000000..e7c7790448330a0db9662978c32deccc7ea7c2c1 --- /dev/null +++ b/docs/architecture/config_decomposition/index.md @@ -0,0 +1,74 @@ +# Configuration decomposition + +## Functional decomposition + +Every configuration statement expresses a particular function, this taxonomy decomposes the various types of +configuration: + +{ width='300' } + +### Base configuration + +It is present on all nodes, it performs exactly the same functionality, and is adapted to particular values or +characteristics of the node itself. + +Examples are: + +- SNMP communities: are the same for all the routers, including the client list +- AAA (local user and radius authentication): the same on all the routers, but the source address of Radius requests is +the loopback of the specific device + +Once the router has been configured with the base configuration, it is ready for the installation of one or more IP +trunks. Doing so will connect it to the rest of the network. + +At this point, the router's loopback is reachable via IGP and the new device can be inserted in the network configuring +iBGP mesh and adding it to tooling. + +✨ Now the router is in service, ready to deliver services. ✨ + +### Service prerequisites + +L3VPNs must exist on the router before customer facing services can be configured. There might also be specific +communities or routing policies that are generic and are considered as prerequisite for customer connections. +This functional block is responsible for this. + + +### Service + +This block represents a service on the edge: a L2 circuit or a BGP peer. This block is itself decomposed in other parts, +according to the functional parts needed by configuration. In general, a meta-service called a demarcation point is +used to identify the physical interface on which the service should be delivered: + +{ width='400' } + +A service is always delivered on a VLAN (that can be native VLAN in some particular cases, for example an IP trunk). +The VLAN is called a _Service Delivery Point_. + +## Separation of data and configuration + +Configuration can be seen as the composition of some abstract data structure that represent the business logic, and a +template that match the router's specific configuration dialect. In the following example DNS servers on a Juniper and +a Nokia router are configured: + +DNS servers (abstract data): + +```yaml +system_name_servers: + - 192.168.1.1 + - 192.168.1.254 +``` + +Junos template: +```jinja +system { + replace: name-server { + {%- for name_server in system_name_servers %} + {{ name_server }}; + {%- endfor %} + } +} +``` +Nokia template: +``` +To be added... +``` \ No newline at end of file diff --git a/docs/architecture/dtap/acceptance.md b/docs/architecture/dtap/acceptance.md new file mode 100644 index 0000000000000000000000000000000000000000..c36f607092942912b1449b2bc980893aee01f9cf --- /dev/null +++ b/docs/architecture/dtap/acceptance.md @@ -0,0 +1,20 @@ +# Acceptance environment + +Once GAP components have been tested successfully in the test environment, they +are advanced to the UAT environment. In this environment, stakeholders from +other teams such as Network Engineering and Operations are able to perform their +own tests on the system. + +In the UAT environment, only full releases are deployed. This means that +development builds are not included in this environment. Devices targeted by GAP +are physical routers in the lab, to increase accuracy of integration testing. + +The UAT environment has been designed to mimic the ultimate production +environment as close as possible. To achieve this, all VMs are managed in the +same manner using Puppet, and external resources are configured identically. The +external service database is hosted on a distributed Postgres cluster, which is +provided by the DevOps team. The Redis instance is also a cluster, which again +comes from the DevOps team. + +Once testing has been completed, components are ready to move to the production +environment. diff --git a/docs/architecture/dtap/development.md b/docs/architecture/dtap/development.md new file mode 100644 index 0000000000000000000000000000000000000000..5bb94999b0a5512bf3f651c726d80075638237c0 --- /dev/null +++ b/docs/architecture/dtap/development.md @@ -0,0 +1,10 @@ +# Development environments + +For the development of different components of GAP, an environment is needed for +integration testing. This is done by making use of a Proxmox cluster in the +GÉANT lab environment, that facilitates different VMs for each developer. + +Inside a development VM, containerlab is used to emulate virtual routers of both +Juniper and Nokia. Port forwarding then enables the developer to run +applications such as GSO and LSO on their local machine, to help speed up the +development cycle. diff --git a/docs/architecture/dtap/index.md b/docs/architecture/dtap/index.md new file mode 100644 index 0000000000000000000000000000000000000000..6b21526b902d9e1e1d6ab703330f50b0b91fc0d6 --- /dev/null +++ b/docs/architecture/dtap/index.md @@ -0,0 +1,28 @@ +# DTAP process + +To stage the different environments used for testing all components of GAP, the +DTAP process ensures that software in the production environment is well-tested +and understood by all parties involved. + +For the deployment of GAP, a set of Ansible playbooks is used to prepare VMs, +install required dependencies, and set up the different components of GAP. There +are four different environments, with their major differences listed in the +table below. + +| Environment | Router topology | Component versioning | Used by | +|-------------|-----------------|----------------------|---------------------| +| Development | containerlab | - | GAP developers | +| Test | EVE-NG | 1.6dev135 | GAP developers | +| UAT | lab devices | 1.5 | Network Engineering | +| Production | production | 1.2 | Operations & OC | + +The development environment runs on a local machine of a developer, and is +therefore highly volatile and unstable. The test environment is less volatile, +but still contains the newest package versions that are merged into `develop`. +The UAT environment is more stable, and only contains released packages. This is +where integration testing with physical devices takes place. + +Once a combination of specific version numbers is deemed compatible and fully +functional, it is deployed as a whole in production. Production could therefore +be multiple releases behind UAT, if this combination of newer versions has not +been tested yet. diff --git a/docs/architecture/dtap/production.md b/docs/architecture/dtap/production.md new file mode 100644 index 0000000000000000000000000000000000000000..fc6662c9fd738dc899af7b8ea65f6565cb3857ee --- /dev/null +++ b/docs/architecture/dtap/production.md @@ -0,0 +1,11 @@ +# Production environment + +The production environment contains final, well-tested versions of GAP +components. + +This environment has been designed to be resilient and as stable as reasonably +possible. The used Postgres and Redis services are hosted in distributed +clusters, and GAP is deployed in three different VMs. These VMs share a virtual +IP address, where a specific VM is selected using `keepalived`. If one of the +components of GAP were to go down in one of the VMs, another VM will take over +without the end user experiencing any system downtime. diff --git a/docs/architecture/dtap/test.md b/docs/architecture/dtap/test.md new file mode 100644 index 0000000000000000000000000000000000000000..88f17e82c8dd4d401b051af1e5bb20111913f45d --- /dev/null +++ b/docs/architecture/dtap/test.md @@ -0,0 +1,18 @@ +# Test environment + +Once development has taken place, and rudimentary unit and system testing was +successful, a merge request is opened in the relevant Git repository. Once this +merge request is approved and included in upstream, it will be on the `develop` +branch. + +The test environment is automatically re-deployed every hour on a VM +infrastructure in the GÉANT lab environment. This ensures that the test +environment always contains the newest versions of all components of GAP. + +The test environment is meant for the GOAT to test new functionality and +the stability of GAP. The routers that are targeted, are virtual routers managed +by an EVE-NG instance. Once testing in the test environment has been concluded +successfully, GAP components are ready to advance to the UAT environment. + +The test environment contains all development builds of components, following +semantic versioning principles. diff --git a/docs/architecture/index.md b/docs/architecture/index.md new file mode 100644 index 0000000000000000000000000000000000000000..d6c1fc37dbe38efe8974a2015175b66a4a99e8dd --- /dev/null +++ b/docs/architecture/index.md @@ -0,0 +1,72 @@ +# Architecture + +An overview of the architecture of GAP is depicted in the following picture: + + + +The diagram visualises how GAP positions itself as a single point of access, not only for the interaction with a +specific technical domain. In our case with the IP/MPLS network, it also models the interaction with OSS/BSS systems +that are authoritative for certain types of resources. + +GAP is responsible not only for allocation and release of these resources, but also for verification whether all systems +are in sync over time. + +In other words, operators are no longer responsible for preparation of resources before performing changes (for example +allocating IP networks or addresses, and configuring DNS accordingly). The GAP component responsible for the interaction +with that particular system will take care of allocating and configuring the necessary resources. + +Included in the orchestration layer there is a service database that stores all instances of the services in accordance +to their respective domain models. More details are available in the section +[GAP components](./components/index.md) + +## OSS/BSS systems currently in scope + +### Infoblox + +Infoblox is the GÉANT DDI (DHCP/DNS/IPAM) platform responsible for managing the allocation of IP networks and +addresses (both IPv4 and IPv6). It also assigns domain names in the zones that GÉANT is authoritative over. + +Currently, GAP supports: + +- Allocation and deletion of an IP (v4/v6) Network within an existing network container +- Allocation and deletion of a host and relative IPv4 and IPv6 addresses including `A`, `AAAA`, and `PTR` records + +More detailed information about this integration is available in the +[IPAM integration module](../admin_guide/oss_bss/ipam.md). + +### Netbox + +Netbox is responsible for managing physical resources such as nodes and interfaces. More specifically, it contains all +the routers and their interfaces, and provides to WFO which of these interfaces are available for use. + +An interface can be in 3 different states: + +- __free__: available to be used by a workflow to deploy a service +- __reserved__: currently in use by a workflow that is still running +- __in use__: holding a service currently active + +More detailed information about this integration is available in the +[Physical resources integration module](../admin_guide/oss_bss/netbox.md) + +### LibreNMS + +LibreNMS is a general purpose monitoring system in use at GÉANT to gather relevant metrics, checks, and facts. +LibreNMS is also the inventory for Oxidized: a network configuration backup system. It is used to have versioned +configuration backups of routers, switches, and any other network devices that are supported. + +More detailed information about this integration is available in the +[LibreNMS integration module](../admin_guide/oss_bss/librenms.md). + +### Kentik (planned) + +Kentik is a Network Observability tool which collects various data points from deployed PE routers. +For this reason it is not in scope for PHASE1. + +### Inventory provider (planned) + +At the time of writing, the Inventory Provider gets the list of routers from the network engineering SOT servers. +This will change and Inventory Provider is then able to directly query CoreDB. + +## Interaction with a technical domain: IP/MPLS + +TBA diff --git a/docs/assets/images/Architecture-WFO_Geant_specific.drawio.png b/docs/assets/images/Architecture-WFO_Geant_specific.drawio.png new file mode 100644 index 0000000000000000000000000000000000000000..fe04e2e470d5689eb9ab3d26bbce9f9dbc160249 Binary files /dev/null and b/docs/assets/images/Architecture-WFO_Geant_specific.drawio.png differ diff --git a/docs/assets/images/Legacy_GAP_diagrams.overview.drawio.png b/docs/assets/images/Legacy_GAP_diagrams.overview.drawio.png new file mode 100644 index 0000000000000000000000000000000000000000..2c6297b07eafe8cd25de8891927b11ac65b367c6 Binary files /dev/null and b/docs/assets/images/Legacy_GAP_diagrams.overview.drawio.png differ diff --git a/docs/assets/images/TNC23_diagrams-AutomationTeam.drawio.png b/docs/assets/images/TNC23_diagrams-AutomationTeam.drawio.png new file mode 100644 index 0000000000000000000000000000000000000000..4711a94924117d7dbbb14c82ef44c32dab4f1d1b Binary files /dev/null and b/docs/assets/images/TNC23_diagrams-AutomationTeam.drawio.png differ diff --git a/docs/assets/images/TNC23_diagrams-ConfigSlicing.drawio.png b/docs/assets/images/TNC23_diagrams-ConfigSlicing.drawio.png new file mode 100644 index 0000000000000000000000000000000000000000..bd0caee9485443c8a44c898f9cbeecb2295b273b Binary files /dev/null and b/docs/assets/images/TNC23_diagrams-ConfigSlicing.drawio.png differ diff --git a/docs/assets/images/TNC23_diagrams-Current platform.drawio.png b/docs/assets/images/TNC23_diagrams-Current platform.drawio.png new file mode 100644 index 0000000000000000000000000000000000000000..8de842d5fe8ed4854d3cb2a918ca7ce935fde6eb Binary files /dev/null and b/docs/assets/images/TNC23_diagrams-Current platform.drawio.png differ diff --git a/docs/assets/images/TNC23_diagrams-Separate Teams.drawio.png b/docs/assets/images/TNC23_diagrams-Separate Teams.drawio.png new file mode 100644 index 0000000000000000000000000000000000000000..bac680fbf60529f6a2691284835b628be85b026c Binary files /dev/null and b/docs/assets/images/TNC23_diagrams-Separate Teams.drawio.png differ diff --git a/docs/assets/images/TNC23_diagrams-Service_stitching.drawio.png b/docs/assets/images/TNC23_diagrams-Service_stitching.drawio.png new file mode 100644 index 0000000000000000000000000000000000000000..2c4c73ca00f9156b2ffad7e124999e977540920a Binary files /dev/null and b/docs/assets/images/TNC23_diagrams-Service_stitching.drawio.png differ diff --git a/docs/assets/images/TNC23_diagrams-WFO-LSO_interaction.drawio.png b/docs/assets/images/TNC23_diagrams-WFO-LSO_interaction.drawio.png new file mode 100644 index 0000000000000000000000000000000000000000..936045129a05f3b9b2c32321d2c97e0c0e8ff7e9 Binary files /dev/null and b/docs/assets/images/TNC23_diagrams-WFO-LSO_interaction.drawio.png differ diff --git a/docs/assets/images/TNC23_diagrams-WFO_GAP.drawio.png b/docs/assets/images/TNC23_diagrams-WFO_GAP.drawio.png new file mode 100644 index 0000000000000000000000000000000000000000..d002bfc0e439d53d24e4982a1834891f0f9be3b6 Binary files /dev/null and b/docs/assets/images/TNC23_diagrams-WFO_GAP.drawio.png differ diff --git a/docs/assets/images/WFO_deploy_router.png b/docs/assets/images/WFO_deploy_router.png new file mode 100644 index 0000000000000000000000000000000000000000..6aeb39b0414aacba70243d7a12d8f16253bba728 Binary files /dev/null and b/docs/assets/images/WFO_deploy_router.png differ diff --git a/docs/assets/images/access_port_diagram.png b/docs/assets/images/access_port_diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..a7372b3011c4b3afdf678c5a73f4bde65af46ee7 Binary files /dev/null and b/docs/assets/images/access_port_diagram.png differ diff --git a/docs/assets/images/gap_architecture_diagram.png b/docs/assets/images/gap_architecture_diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..52fde05a9a37b0bfc06fcfd4bad98417ce8ac81b Binary files /dev/null and b/docs/assets/images/gap_architecture_diagram.png differ diff --git a/docs/assets/images/geant_ip_ports_diagram.png b/docs/assets/images/geant_ip_ports_diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..5e72025208d9a219a648a0507242dd29a68dd3ad Binary files /dev/null and b/docs/assets/images/geant_ip_ports_diagram.png differ diff --git a/docs/assets/images/geant_logo_white.png b/docs/assets/images/geant_logo_white.png new file mode 100644 index 0000000000000000000000000000000000000000..94ae220221e037ea7fbdd2ea825623cd8cd573d0 Binary files /dev/null and b/docs/assets/images/geant_logo_white.png differ diff --git a/docs/assets/images/geant_logo_white.svg b/docs/assets/images/geant_logo_white.svg new file mode 100644 index 0000000000000000000000000000000000000000..31bfead62b052812096b5a9c79cf782ce330a87c --- /dev/null +++ b/docs/assets/images/geant_logo_white.svg @@ -0,0 +1,16 @@ +<svg width="79" height="35" viewBox="0 0 79 35" fill="none" xmlns="http://www.w3.org/2000/svg"> +<g clip-path="url(#clip0_101_15)"> +<path d="M15.9 17.8C16.5 17.3 17 17.1 17.4 17.1C18.4 17.1 18.7 17.8 18.7 18.2C18.5 18.3 14.2 19.7 14 19.8C13.9 19.7 13.9 19.6 13.8 19.6C14 19.4 15.9 17.8 15.9 17.8Z" fill="white" fill-opacity="0.85"/> +<path d="M0 27C0 31.8 2.1 34.3 6.3 34.3C9.1 34.3 10.8 33.1 10.8 33L10.9 32.9V26.2H5.2V28.1C5.2 28.1 8.1 28.1 8.6 28.1C8.6 28.6 8.6 31.6 8.6 31.9C8.3 32.1 7.4 32.4 6.2 32.4C3.7 32.4 2.5 30.6 2.5 27C2.5 24.9 3.1 22.4 5.9 22.4C7.8 22.4 8.5 23.5 8.5 24.5V24.8H11.1V24.5C11.1 22.1 9 20.5 5.9 20.5C2.2 20.5 0 22.9 0 27Z" fill="white" fill-opacity="0.85"/> +<path d="M20.2 20.7H12.6V34.1H20.7V32.2C20.7 32.2 15.5 32.2 14.9 32.2C14.9 31.7 14.9 28.5 14.9 28C15.5 28 20.2 28 20.2 28V26.1C20.2 26.1 15.5 26.1 14.9 26.1C14.9 25.6 14.9 23 14.9 22.5C15.5 22.5 20.5 22.5 20.5 22.5V20.6H20.2V20.7Z" fill="white" fill-opacity="0.85"/> +<path d="M54.5 20.7H42.9C42.9 20.7 42.9 28.7 42.9 30.6C42 29 37.2 20.7 37.2 20.7H34.5V34.1H36.8C36.8 34.1 36.8 26.1 36.8 24.2C37.7 25.8 42.5 34.1 42.5 34.1H45.2C45.2 34.1 45.2 23.2 45.2 22.6C45.7 22.6 48.4 22.6 48.9 22.6C48.9 23.2 48.9 34.1 48.9 34.1H51.3C51.3 34.1 51.3 23.2 51.3 22.6C51.8 22.6 54.9 22.6 54.9 22.6V20.7H54.5V20.7Z" fill="white" fill-opacity="0.85"/> +<path d="M28.9 20.7H28.7H26.4L21.4 34.1H23.8C23.8 34.1 25.1 30.6 25.3 30.2C25.7 30.2 29.8 30.2 30.2 30.2C30.3 30.6 31.7 34.1 31.7 34.1H34L28.9 20.7ZM25.9 28.3C26.1 27.6 27.3 24.4 27.7 23.3C28.1 24.4 29.2 27.6 29.5 28.3C28.7 28.3 26.6 28.3 25.9 28.3Z" fill="white" fill-opacity="0.85"/> +<path d="M77 8C68.2 -2.9 32.6 12.5 23 16.5C22.3 16.8 21.4 16.7 20.9 15.7C21.3 16.7 22.1 17.1 23.1 16.7C35.8 11.6 66.5 0.600002 74.2 10.7C77.7 15.3 76.7 20.9 72.9 28.8C72.7 29.1 72.6 29.4 72.6 29.4C72.6 29.4 72.6 29.4 72.6 29.5C72.6 29.5 72.6 29.5 72.6 29.6C72.3 30.1 71.9 30.3 71.6 30.4C72 30.4 72.5 30.2 72.9 29.6C73 29.5 73.1 29.3 73.3 29C78.7 19.5 80.7 12.5 77 8Z" fill="white" fill-opacity="0.85"/> +<path d="M70.3 29.9C70.2 29.8 68.6 28.4 67 26.9C58.7 19 33.4 -5.3 22.4 1.1C19.3 2.9 18.8 8.2 20.7 15.2C20.7 15.3 20.8 15.4 20.8 15.5C21 16.2 21.5 16.7 22.2 16.7C21.7 16.6 21.3 16.2 21.1 15.7C21.1 15.6 21 15.5 21 15.5C21 15.4 20.9 15.3 20.9 15.1C20.9 15 20.9 14.9 20.8 14.9C19.8 9 21 5.1 23.4 3.5C32.3 -2.5 53.5 15.8 64.2 25C66.6 27.1 69.4 29.5 70.2 30.1C71.4 31 72.4 30 72.7 29.5C72.3 30.1 71.3 30.7 70.3 29.9Z" fill="white" fill-opacity="0.85"/> +</g> +<defs> +<clipPath id="clip0_101_15"> +<rect width="78.9" height="34.3" fill="white"/> +</clipPath> +</defs> +</svg> diff --git a/docs/assets/images/image_sources/Architecture.drawio b/docs/assets/images/image_sources/Architecture.drawio new file mode 100644 index 0000000000000000000000000000000000000000..e9b5036fe28f960e27bb6c4e2bf8f7190862c287 --- /dev/null +++ b/docs/assets/images/image_sources/Architecture.drawio @@ -0,0 +1,388 @@ +<mxfile host="Electron" modified="2023-08-28T13:52:32.490Z" agent="Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/21.2.1 Chrome/112.0.5615.87 Electron/24.1.2 Safari/537.36" etag="hKNO4S5IgK634bX5jO2K" version="21.2.1" type="device" pages="4"> + <diagram name="Overview" id="5LPZLXcoEl9-ho0UlVSG"> + <mxGraphModel dx="1663" dy="775" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0"> + <root> + <mxCell id="0" /> + <mxCell id="1" parent="0" /> + <mxCell id="BRG2872ae9NKHgnPV-JH-18" value="" style="rounded=0;whiteSpace=wrap;html=1;fontFamily=Tahoma;fillColor=#dae8fc;strokeColor=#6c8ebf;" parent="1" vertex="1"> + <mxGeometry x="190" y="290" width="410" height="280" as="geometry" /> + </mxCell> + <mxCell id="BRG2872ae9NKHgnPV-JH-1" value="Workflow Engine" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#075683;strokeColor=none;fontFamily=Tahoma;fontColor=#FFFFFF;fontSize=13;" parent="1" vertex="1"> + <mxGeometry x="335" y="400" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="BRG2872ae9NKHgnPV-JH-2" value="HW inventory" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#e83f4b;strokeColor=none;fontFamily=Tahoma;" parent="1" vertex="1"> + <mxGeometry x="120" y="270" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="BRG2872ae9NKHgnPV-JH-3" value="IPAM/DNS" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#e83f4b;strokeColor=none;fontFamily=Tahoma;" parent="1" vertex="1"> + <mxGeometry x="120" y="338" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="BRG2872ae9NKHgnPV-JH-4" value="Monitoring" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#e83f4b;strokeColor=none;fontFamily=Tahoma;" parent="1" vertex="1"> + <mxGeometry x="120" y="407" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="BRG2872ae9NKHgnPV-JH-6" value="User interface" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f8a10c;strokeColor=none;fontFamily=Tahoma;" parent="1" vertex="1"> + <mxGeometry x="570" y="273" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="BRG2872ae9NKHgnPV-JH-7" value="Messaging/Emails" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f8a10c;strokeColor=none;fontFamily=Tahoma;" parent="1" vertex="1"> + <mxGeometry x="570" y="343" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="BRG2872ae9NKHgnPV-JH-8" value="Ticketing" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f8a10c;strokeColor=none;fontFamily=Tahoma;" parent="1" vertex="1"> + <mxGeometry x="570" y="413" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="BRG2872ae9NKHgnPV-JH-9" value="Technical Domain<br>(ie IP/MPLS)" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#393938;strokeColor=none;fontColor=#FFFFFF;fontFamily=Tahoma;" parent="1" vertex="1"> + <mxGeometry x="180" y="570" width="140" height="130" as="geometry" /> + </mxCell> + <mxCell id="BRG2872ae9NKHgnPV-JH-10" value="Ansible" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#6a6a69;strokeColor=#FFFFFF;fontColor=#FFFFFF;fontFamily=Tahoma;" parent="1" vertex="1"> + <mxGeometry x="190" y="550" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="BRG2872ae9NKHgnPV-JH-11" value="Technical Domain<br>(ie Optical)" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#393938;strokeColor=none;fontColor=#FFFFFF;fontFamily=Tahoma;" parent="1" vertex="1"> + <mxGeometry x="330" y="570" width="140" height="130" as="geometry" /> + </mxCell> + <mxCell id="BRG2872ae9NKHgnPV-JH-12" value="Domain Specific Automation" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#6a6a69;strokeColor=#FFFFFF;fontColor=#FFFFFF;fontFamily=Tahoma;" parent="1" vertex="1"> + <mxGeometry x="340" y="550" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="BRG2872ae9NKHgnPV-JH-13" value="Technical Domain<br>(ie Datacenter)" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#393938;strokeColor=none;fontColor=#FFFFFF;fontFamily=Tahoma;" parent="1" vertex="1"> + <mxGeometry x="480" y="570" width="140" height="130" as="geometry" /> + </mxCell> + <mxCell id="BRG2872ae9NKHgnPV-JH-14" value="Domain Specific Automation" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#6a6a69;strokeColor=#FFFFFF;fontColor=#FFFFFF;fontFamily=Tahoma;" parent="1" vertex="1"> + <mxGeometry x="490" y="550" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="BRG2872ae9NKHgnPV-JH-16" value="" style="rounded=1;whiteSpace=wrap;html=1;fillColor=none;dashed=1;fontFamily=Tahoma;" parent="1" vertex="1"> + <mxGeometry x="560" y="253" width="140" height="240" as="geometry" /> + </mxCell> + <mxCell id="BRG2872ae9NKHgnPV-JH-19" value="Service database" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#075683;strokeColor=none;fontFamily=Tahoma;fontColor=#FFFFFF;fontSize=13;" parent="1" vertex="1"> + <mxGeometry x="335" y="300" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="BRG2872ae9NKHgnPV-JH-20" value="Orchestration Layer" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontFamily=Tahoma;" parent="1" vertex="1"> + <mxGeometry x="365" y="490" width="60" height="30" as="geometry" /> + </mxCell> + <mxCell id="BRG2872ae9NKHgnPV-JH-21" value="Workflow Orchestrator" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontSize=17;fontFamily=Tahoma;" parent="1" vertex="1"> + <mxGeometry x="305" y="253" width="175" height="30" as="geometry" /> + </mxCell> + <mxCell id="BRG2872ae9NKHgnPV-JH-22" value="Internal<br>OSS/BSS systems" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontFamily=Tahoma;" parent="1" vertex="1"> + <mxGeometry x="100" y="210" width="150" height="30" as="geometry" /> + </mxCell> + <mxCell id="BRG2872ae9NKHgnPV-JH-23" value="User Facing<br>OSS/BSS systems" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontFamily=Tahoma;" parent="1" vertex="1"> + <mxGeometry x="555" y="210" width="150" height="30" as="geometry" /> + </mxCell> + <mxCell id="BRG2872ae9NKHgnPV-JH-24" value="Operators" style="shape=umlActor;verticalLabelPosition=bottom;verticalAlign=top;html=1;outlineConnect=0;" parent="1" vertex="1"> + <mxGeometry x="720" y="260" width="30" height="60" as="geometry" /> + </mxCell> + <mxCell id="BRG2872ae9NKHgnPV-JH-25" value="Users" style="shape=umlActor;verticalLabelPosition=bottom;verticalAlign=top;html=1;outlineConnect=0;" parent="1" vertex="1"> + <mxGeometry x="720" y="370" width="30" height="60" as="geometry" /> + </mxCell> + <mxCell id="BRG2872ae9NKHgnPV-JH-30" value="More..." style="rounded=1;whiteSpace=wrap;html=1;fillColor=#e83f4b;strokeColor=none;fontFamily=Tahoma;" parent="1" vertex="1"> + <mxGeometry x="120" y="475" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="BRG2872ae9NKHgnPV-JH-15" value="" style="rounded=1;whiteSpace=wrap;html=1;fillColor=none;dashed=1;fontFamily=Tahoma;" parent="1" vertex="1"> + <mxGeometry x="110" y="250" width="140" height="290" as="geometry" /> + </mxCell> + </root> + </mxGraphModel> + </diagram> + <diagram id="OxvVKvg4RBchy1Ke26Vi" name="Lifecycle"> + <mxGraphModel dx="1663" dy="775" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0"> + <root> + <mxCell id="0" /> + <mxCell id="1" parent="0" /> + <mxCell id="9i9uzR1bp89Chr804UXO-1" value="INITIAL" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;fontStyle=1" parent="1" vertex="1"> + <mxGeometry x="120" y="280" width="100" height="100" as="geometry" /> + </mxCell> + <mxCell id="9i9uzR1bp89Chr804UXO-2" value="PROVISIONING" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;fontStyle=1" parent="1" vertex="1"> + <mxGeometry x="280" y="160" width="100" height="100" as="geometry" /> + </mxCell> + <mxCell id="9i9uzR1bp89Chr804UXO-3" value="ACTIVE" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;fontStyle=1" parent="1" vertex="1"> + <mxGeometry x="440" y="280" width="100" height="100" as="geometry" /> + </mxCell> + <mxCell id="9i9uzR1bp89Chr804UXO-4" value="MIGRATING" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;fontStyle=1" parent="1" vertex="1"> + <mxGeometry x="440" y="450" width="100" height="100" as="geometry" /> + </mxCell> + <mxCell id="9i9uzR1bp89Chr804UXO-5" value="TERMINATED" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;fontStyle=1" parent="1" vertex="1"> + <mxGeometry x="150" y="430" width="100" height="100" as="geometry" /> + </mxCell> + <mxCell id="9i9uzR1bp89Chr804UXO-12" value="<div style="text-align: justify;"><span style="background-color: initial;">Attributes are collected from authoritative systems and from the operator/user</span></div>" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1"> + <mxGeometry x="100" y="220" width="160" height="30" as="geometry" /> + </mxCell> + <mxCell id="9i9uzR1bp89Chr804UXO-13" value="<div style="text-align: justify;">Domain-Specific Automation provisions the subscription on the network</div>" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1"> + <mxGeometry x="260" y="285" width="160" height="30" as="geometry" /> + </mxCell> + <mxCell id="9i9uzR1bp89Chr804UXO-14" value="<div style="text-align: justify;">Attributes are manipulated to adapt to new needs<br></div>" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1"> + <mxGeometry x="590" y="210" width="160" height="30" as="geometry" /> + </mxCell> + <mxCell id="9i9uzR1bp89Chr804UXO-16" value="Modify" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1"> + <mxGeometry x="530" y="240" width="60" height="30" as="geometry" /> + </mxCell> + <mxCell id="9i9uzR1bp89Chr804UXO-17" value="" style="endArrow=classic;html=1;rounded=0;entryX=0.08;entryY=0.77;entryDx=0;entryDy=0;entryPerimeter=0;exitX=1;exitY=0;exitDx=0;exitDy=0;" parent="1" source="9i9uzR1bp89Chr804UXO-1" target="9i9uzR1bp89Chr804UXO-2" edge="1"> + <mxGeometry width="50" height="50" relative="1" as="geometry"> + <mxPoint x="-10" y="480" as="sourcePoint" /> + <mxPoint x="40" y="430" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="9i9uzR1bp89Chr804UXO-18" value="" style="endArrow=classic;html=1;rounded=0;exitX=1;exitY=1;exitDx=0;exitDy=0;entryX=0;entryY=0;entryDx=0;entryDy=0;" parent="1" source="9i9uzR1bp89Chr804UXO-2" target="9i9uzR1bp89Chr804UXO-3" edge="1"> + <mxGeometry width="50" height="50" relative="1" as="geometry"> + <mxPoint x="340" y="380" as="sourcePoint" /> + <mxPoint x="390" y="330" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="9i9uzR1bp89Chr804UXO-19" value="" style="endArrow=classic;html=1;rounded=0;exitX=0;exitY=0.5;exitDx=0;exitDy=0;" parent="1" source="9i9uzR1bp89Chr804UXO-3" target="9i9uzR1bp89Chr804UXO-5" edge="1"> + <mxGeometry width="50" height="50" relative="1" as="geometry"> + <mxPoint x="280" y="430" as="sourcePoint" /> + <mxPoint x="330" y="380" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="9i9uzR1bp89Chr804UXO-20" value="" style="endArrow=classic;html=1;rounded=0;exitX=0;exitY=0;exitDx=0;exitDy=0;entryX=0;entryY=1;entryDx=0;entryDy=0;" parent="1" source="9i9uzR1bp89Chr804UXO-4" target="9i9uzR1bp89Chr804UXO-3" edge="1"> + <mxGeometry width="50" height="50" relative="1" as="geometry"> + <mxPoint x="250" y="380" as="sourcePoint" /> + <mxPoint x="300" y="330" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="9i9uzR1bp89Chr804UXO-22" value="" style="endArrow=classic;html=1;rounded=0;exitX=1;exitY=1;exitDx=0;exitDy=0;entryX=1;entryY=0;entryDx=0;entryDy=0;" parent="1" source="9i9uzR1bp89Chr804UXO-3" target="9i9uzR1bp89Chr804UXO-4" edge="1"> + <mxGeometry width="50" height="50" relative="1" as="geometry"> + <mxPoint x="630" y="470" as="sourcePoint" /> + <mxPoint x="680" y="420" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="9i9uzR1bp89Chr804UXO-23" value="" style="curved=1;endArrow=classic;html=1;rounded=0;exitX=1;exitY=0;exitDx=0;exitDy=0;entryX=1;entryY=0;entryDx=0;entryDy=0;" parent="1" source="9i9uzR1bp89Chr804UXO-3" target="9i9uzR1bp89Chr804UXO-3" edge="1"> + <mxGeometry width="50" height="50" relative="1" as="geometry"> + <mxPoint x="610" y="270" as="sourcePoint" /> + <mxPoint x="660" y="220" as="targetPoint" /> + <Array as="points"> + <mxPoint x="580" y="280" /> + <mxPoint x="660" y="270" /> + <mxPoint x="550" y="220" /> + <mxPoint x="520" y="240" /> + </Array> + </mxGeometry> + </mxCell> + <mxCell id="9i9uzR1bp89Chr804UXO-24" value="" style="curved=1;endArrow=classic;html=1;rounded=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;" parent="1" target="9i9uzR1bp89Chr804UXO-3" edge="1"> + <mxGeometry width="50" height="50" relative="1" as="geometry"> + <mxPoint x="540" y="330" as="sourcePoint" /> + <mxPoint x="595" y="385" as="targetPoint" /> + <Array as="points"> + <mxPoint x="650" y="370" /> + <mxPoint x="660" y="310" /> + <mxPoint x="620" y="310" /> + <mxPoint x="580" y="310" /> + </Array> + </mxGeometry> + </mxCell> + <mxCell id="9i9uzR1bp89Chr804UXO-25" value="Validate" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1"> + <mxGeometry x="580" y="315" width="60" height="30" as="geometry" /> + </mxCell> + <mxCell id="9i9uzR1bp89Chr804UXO-26" value="<div style="text-align: justify;">Subscription is checked to verify all is in sync</div>" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1"> + <mxGeometry x="660" y="315" width="160" height="30" as="geometry" /> + </mxCell> + <mxCell id="9i9uzR1bp89Chr804UXO-27" value="<div style="text-align: justify;">The subscription might be migrated to new hardware or substrate</div>" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1"> + <mxGeometry x="540" y="400" width="160" height="30" as="geometry" /> + </mxCell> + <mxCell id="9i9uzR1bp89Chr804UXO-28" value="<div style="text-align: justify;">The subscription is terminated, removed from the network, all the systems gets updated.&nbsp;</div>" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1"> + <mxGeometry x="284" y="450" width="130" height="30" as="geometry" /> + </mxCell> + </root> + </mxGraphModel> + </diagram> + <diagram id="I4smcoPWwe3PN79ySEkT" name="WFO_Geant_specific"> + <mxGraphModel dx="2490" dy="775" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0"> + <root> + <mxCell id="0" /> + <mxCell id="1" parent="0" /> + <mxCell id="fU0Jv1-IXl80mrmCQJBs-10" value="" style="rounded=1;whiteSpace=wrap;html=1;fillColor=none;dashed=1;" parent="1" vertex="1"> + <mxGeometry x="800" y="370.5" width="90" height="239.5" as="geometry" /> + </mxCell> + <mxCell id="xgwRl2r8zASo9SITuRbb-6" value="" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#bac8d3;fontColor=#ffffff;strokeColor=none;" parent="1" vertex="1"> + <mxGeometry x="-20" y="525" width="670" height="60" as="geometry" /> + </mxCell> + <mxCell id="xgwRl2r8zASo9SITuRbb-1" value="Authentication and&nbsp;&nbsp;<br>Authorization Infrastructure" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=none;" parent="1" vertex="1"> + <mxGeometry x="60" y="420" width="180" height="90" as="geometry" /> + </mxCell> + <mxCell id="xgwRl2r8zASo9SITuRbb-2" value="Orchestrator GUI" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#e1d5e7;strokeColor=#9673a6;" parent="1" vertex="1"> + <mxGeometry x="400" y="420" width="130" height="90" as="geometry" /> + </mxCell> + <mxCell id="xgwRl2r8zASo9SITuRbb-5" value="" style="group" parent="1" vertex="1" connectable="0"> + <mxGeometry x="425" y="310" width="80" height="80" as="geometry" /> + </mxCell> + <mxCell id="xgwRl2r8zASo9SITuRbb-3" value="" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;fillColor=#000000;" parent="xgwRl2r8zASo9SITuRbb-5" vertex="1"> + <mxGeometry width="80" height="80" as="geometry" /> + </mxCell> + <mxCell id="xgwRl2r8zASo9SITuRbb-4" value="" style="shape=umlActor;verticalLabelPosition=bottom;verticalAlign=top;html=1;outlineConnect=0;strokeColor=#FFFFFF;" parent="xgwRl2r8zASo9SITuRbb-5" vertex="1"> + <mxGeometry x="25" y="10" width="30" height="60" as="geometry" /> + </mxCell> + <mxCell id="FV0cLB4CSSY3hVsMsGnb-11" value="" style="endArrow=none;html=1;rounded=0;exitX=0.5;exitY=0;exitDx=0;exitDy=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;strokeWidth=2;" parent="1" source="xgwRl2r8zASo9SITuRbb-2" target="xgwRl2r8zASo9SITuRbb-3" edge="1"> + <mxGeometry width="50" height="50" relative="1" as="geometry"> + <mxPoint x="310" y="380" as="sourcePoint" /> + <mxPoint x="460" y="390" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="FV0cLB4CSSY3hVsMsGnb-12" value="Operators" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1"> + <mxGeometry x="435" y="280" width="60" height="30" as="geometry" /> + </mxCell> + <mxCell id="FV0cLB4CSSY3hVsMsGnb-14" value="" style="group" parent="1" vertex="1" connectable="0"> + <mxGeometry x="275" y="310" width="80" height="80" as="geometry" /> + </mxCell> + <mxCell id="FV0cLB4CSSY3hVsMsGnb-15" value="" style="ellipse;whiteSpace=wrap;html=1;aspect=fixed;fillColor=#000000;" parent="FV0cLB4CSSY3hVsMsGnb-14" vertex="1"> + <mxGeometry width="80" height="80" as="geometry" /> + </mxCell> + <mxCell id="FV0cLB4CSSY3hVsMsGnb-16" value="" style="shape=umlActor;verticalLabelPosition=bottom;verticalAlign=top;html=1;outlineConnect=0;strokeColor=#FFFFFF;" parent="FV0cLB4CSSY3hVsMsGnb-14" vertex="1"> + <mxGeometry x="25" y="10" width="30" height="60" as="geometry" /> + </mxCell> + <mxCell id="FV0cLB4CSSY3hVsMsGnb-17" value="" style="endArrow=none;html=1;rounded=0;exitX=0.432;exitY=0.009;exitDx=0;exitDy=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;exitPerimeter=0;strokeWidth=2;" parent="1" source="xgwRl2r8zASo9SITuRbb-6" target="FV0cLB4CSSY3hVsMsGnb-15" edge="1"> + <mxGeometry width="50" height="50" relative="1" as="geometry"> + <mxPoint x="350" y="420" as="sourcePoint" /> + <mxPoint x="345" y="390" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="FV0cLB4CSSY3hVsMsGnb-18" value="Customers" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1"> + <mxGeometry x="287" y="280" width="60" height="30" as="geometry" /> + </mxCell> + <mxCell id="FV0cLB4CSSY3hVsMsGnb-19" value="Self service<br>portal API" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;" parent="1" vertex="1"> + <mxGeometry x="250" y="470" width="140" height="40" as="geometry" /> + </mxCell> + <mxCell id="FV0cLB4CSSY3hVsMsGnb-13" value="Self service<br>portal" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;" parent="1" vertex="1"> + <mxGeometry x="250" y="420" width="140" height="40" as="geometry" /> + </mxCell> + <mxCell id="FV0cLB4CSSY3hVsMsGnb-20" value="" style="endArrow=none;html=1;rounded=1;entryX=0.736;entryY=0.944;entryDx=0;entryDy=0;exitX=0.75;exitY=0;exitDx=0;exitDy=0;entryPerimeter=0;strokeWidth=2;" parent="1" source="FV0cLB4CSSY3hVsMsGnb-19" target="FV0cLB4CSSY3hVsMsGnb-15" edge="1"> + <mxGeometry width="50" height="50" relative="1" as="geometry"> + <mxPoint x="325" y="440" as="sourcePoint" /> + <mxPoint x="375" y="390" as="targetPoint" /> + <Array as="points"> + <mxPoint x="355" y="400" /> + </Array> + </mxGeometry> + </mxCell> + <mxCell id="PUE3jFu-1MjbAkVMeXG0-1" value="IP/MPLS<br>Junos/Nokia" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#393938;strokeColor=none;fontColor=#FFFFFF;fontFamily=Tahoma;" parent="1" vertex="1"> + <mxGeometry x="65" y="630" width="140" height="130" as="geometry" /> + </mxCell> + <mxCell id="PUE3jFu-1MjbAkVMeXG0-2" value="Ansible" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#6a6a69;strokeColor=#FFFFFF;fontColor=#FFFFFF;fontFamily=Tahoma;" parent="1" vertex="1"> + <mxGeometry x="75" y="610" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="PUE3jFu-1MjbAkVMeXG0-3" value="Technical Domain<br>(ie Optical)" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#393938;strokeColor=none;fontColor=#FFFFFF;fontFamily=Tahoma;" parent="1" vertex="1"> + <mxGeometry x="215" y="630" width="140" height="130" as="geometry" /> + </mxCell> + <mxCell id="PUE3jFu-1MjbAkVMeXG0-4" value="Domain Specific Automation" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#6a6a69;strokeColor=#FFFFFF;fontColor=#FFFFFF;fontFamily=Tahoma;" parent="1" vertex="1"> + <mxGeometry x="225" y="610" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="PUE3jFu-1MjbAkVMeXG0-5" value="Technical Domain<br>(ie Datacenter)" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#393938;strokeColor=none;fontColor=#FFFFFF;fontFamily=Tahoma;" parent="1" vertex="1"> + <mxGeometry x="365" y="630" width="140" height="130" as="geometry" /> + </mxCell> + <mxCell id="PUE3jFu-1MjbAkVMeXG0-6" value="Domain Specific Automation" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#6a6a69;strokeColor=#FFFFFF;fontColor=#FFFFFF;fontFamily=Tahoma;" parent="1" vertex="1"> + <mxGeometry x="375" y="610" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="PUE3jFu-1MjbAkVMeXG0-7" value="Other <br>Technical Domain" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#393938;strokeColor=none;fontColor=#FFFFFF;fontFamily=Tahoma;" parent="1" vertex="1"> + <mxGeometry x="510" y="630" width="140" height="130" as="geometry" /> + </mxCell> + <mxCell id="PUE3jFu-1MjbAkVMeXG0-8" value="Domain Specific Automation" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#6a6a69;strokeColor=#FFFFFF;fontColor=#FFFFFF;fontFamily=Tahoma;" parent="1" vertex="1"> + <mxGeometry x="520" y="610" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="PUE3jFu-1MjbAkVMeXG0-10" value="Infoblox" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;" parent="1" vertex="1"> + <mxGeometry x="810" y="395" width="70" height="40" as="geometry" /> + </mxCell> + <mxCell id="PUE3jFu-1MjbAkVMeXG0-11" value="" style="endArrow=none;html=1;rounded=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;exitX=1;exitY=0.125;exitDx=0;exitDy=0;exitPerimeter=0;strokeWidth=2;" parent="1" source="xgwRl2r8zASo9SITuRbb-7" target="PUE3jFu-1MjbAkVMeXG0-10" edge="1"> + <mxGeometry width="50" height="50" relative="1" as="geometry"> + <mxPoint x="710" y="530" as="sourcePoint" /> + <mxPoint x="760" y="480" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="PUE3jFu-1MjbAkVMeXG0-9" value="ipam" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;" parent="1" vertex="1"> + <mxGeometry x="670" y="395" width="110" height="40" as="geometry" /> + </mxCell> + <mxCell id="PUE3jFu-1MjbAkVMeXG0-12" value="Netbox" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;" parent="1" vertex="1"> + <mxGeometry x="810" y="445" width="70" height="40" as="geometry" /> + </mxCell> + <mxCell id="PUE3jFu-1MjbAkVMeXG0-13" value="" style="endArrow=none;html=1;rounded=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;exitX=1.009;exitY=0.379;exitDx=0;exitDy=0;exitPerimeter=0;strokeWidth=2;" parent="1" source="xgwRl2r8zASo9SITuRbb-7" target="PUE3jFu-1MjbAkVMeXG0-12" edge="1"> + <mxGeometry width="50" height="50" relative="1" as="geometry"> + <mxPoint x="650" y="490" as="sourcePoint" /> + <mxPoint x="760" y="530" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="PUE3jFu-1MjbAkVMeXG0-14" value="resource_manager" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;" parent="1" vertex="1"> + <mxGeometry x="670" y="445" width="110" height="40" as="geometry" /> + </mxCell> + <mxCell id="PUE3jFu-1MjbAkVMeXG0-15" value="LibreNMS" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;" parent="1" vertex="1"> + <mxGeometry x="810" y="495" width="70" height="40" as="geometry" /> + </mxCell> + <mxCell id="PUE3jFu-1MjbAkVMeXG0-16" value="" style="endArrow=none;html=1;rounded=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;strokeWidth=2;exitX=1.027;exitY=0.647;exitDx=0;exitDy=0;exitPerimeter=0;" parent="1" source="xgwRl2r8zASo9SITuRbb-7" target="PUE3jFu-1MjbAkVMeXG0-15" edge="1"> + <mxGeometry width="50" height="50" relative="1" as="geometry"> + <mxPoint x="660" y="540" as="sourcePoint" /> + <mxPoint x="760" y="580" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="PUE3jFu-1MjbAkVMeXG0-17" value="monitoring" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;" parent="1" vertex="1"> + <mxGeometry x="670" y="495" width="110" height="40" as="geometry" /> + </mxCell> + <mxCell id="PUE3jFu-1MjbAkVMeXG0-18" value="" style="endArrow=none;html=1;rounded=0;exitX=0.5;exitY=0;exitDx=0;exitDy=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;strokeWidth=2;" parent="1" source="PUE3jFu-1MjbAkVMeXG0-2" target="fU0Jv1-IXl80mrmCQJBs-2" edge="1"> + <mxGeometry width="50" height="50" relative="1" as="geometry"> + <mxPoint y="860" as="sourcePoint" /> + <mxPoint x="130" y="590" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="PUE3jFu-1MjbAkVMeXG0-19" value="" style="endArrow=none;html=1;rounded=0;exitX=0.5;exitY=0;exitDx=0;exitDy=0;entryX=0.127;entryY=0.982;entryDx=0;entryDy=0;entryPerimeter=0;strokeWidth=2;" parent="1" edge="1"> + <mxGeometry width="50" height="50" relative="1" as="geometry"> + <mxPoint x="284.77" y="611" as="sourcePoint" /> + <mxPoint x="284.77" y="585" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="PUE3jFu-1MjbAkVMeXG0-20" value="" style="endArrow=none;html=1;rounded=0;exitX=0.5;exitY=0;exitDx=0;exitDy=0;entryX=0.127;entryY=0.982;entryDx=0;entryDy=0;entryPerimeter=0;strokeWidth=2;" parent="1" edge="1"> + <mxGeometry width="50" height="50" relative="1" as="geometry"> + <mxPoint x="435" y="610" as="sourcePoint" /> + <mxPoint x="435" y="584" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="PUE3jFu-1MjbAkVMeXG0-21" value="" style="endArrow=none;html=1;rounded=0;exitX=0.5;exitY=0;exitDx=0;exitDy=0;entryX=0.127;entryY=0.982;entryDx=0;entryDy=0;entryPerimeter=0;strokeWidth=2;" parent="1" edge="1"> + <mxGeometry width="50" height="50" relative="1" as="geometry"> + <mxPoint x="579.77" y="611" as="sourcePoint" /> + <mxPoint x="579.77" y="585" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="xgwRl2r8zASo9SITuRbb-8" value="Orchestration Layer" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontColor=#000000;" parent="1" vertex="1"> + <mxGeometry x="320" y="540" width="146" height="30" as="geometry" /> + </mxCell> + <mxCell id="fU0Jv1-IXl80mrmCQJBs-4" value="" style="rounded=1;whiteSpace=wrap;html=1;strokeColor=none;opacity=80;" parent="1" vertex="1"> + <mxGeometry x="58" y="280" width="340" height="241" as="geometry" /> + </mxCell> + <mxCell id="fU0Jv1-IXl80mrmCQJBs-5" value="" style="rounded=1;whiteSpace=wrap;html=1;strokeColor=none;opacity=80;" parent="1" vertex="1"> + <mxGeometry x="210" y="600" width="460" height="180" as="geometry" /> + </mxCell> + <mxCell id="fU0Jv1-IXl80mrmCQJBs-6" value="Kentik" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;" parent="1" vertex="1"> + <mxGeometry x="810" y="545" width="70" height="40" as="geometry" /> + </mxCell> + <mxCell id="fU0Jv1-IXl80mrmCQJBs-7" value="" style="endArrow=none;html=1;rounded=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;exitX=0.985;exitY=0.667;exitDx=0;exitDy=0;exitPerimeter=0;strokeWidth=2;" parent="1" source="xgwRl2r8zASo9SITuRbb-6" target="fU0Jv1-IXl80mrmCQJBs-6" edge="1"> + <mxGeometry width="50" height="50" relative="1" as="geometry"> + <mxPoint x="650" y="590" as="sourcePoint" /> + <mxPoint x="760" y="630" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="fU0Jv1-IXl80mrmCQJBs-8" value="monitoring" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;" parent="1" vertex="1"> + <mxGeometry x="670" y="545" width="110" height="40" as="geometry" /> + </mxCell> + <mxCell id="xgwRl2r8zASo9SITuRbb-7" value="" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#BAC8D3;fontColor=#ffffff;strokeColor=none;" parent="1" vertex="1"> + <mxGeometry x="540" y="390" width="110" height="190" as="geometry" /> + </mxCell> + <mxCell id="fU0Jv1-IXl80mrmCQJBs-2" value="LSO<br>Lightweight Service Orchestrator" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#fff2cc;strokeColor=#d6b656;fontFamily=Tahoma;" parent="1" vertex="1"> + <mxGeometry x="12.5" y="550" width="245" height="40" as="geometry" /> + </mxCell> + <mxCell id="fU0Jv1-IXl80mrmCQJBs-11" value="OSS/BSS Already in use in GÉANT" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1"> + <mxGeometry x="900" y="450" width="70" height="70" as="geometry" /> + </mxCell> + <mxCell id="fU0Jv1-IXl80mrmCQJBs-12" value="" style="rounded=1;whiteSpace=wrap;html=1;fillColor=none;dashed=1;" parent="1" vertex="1"> + <mxGeometry x="660" y="370.5" width="130" height="239.5" as="geometry" /> + </mxCell> + <mxCell id="fU0Jv1-IXl80mrmCQJBs-13" value="Integration modules<br>internally developed" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1"> + <mxGeometry x="670" y="610" width="110" height="30" as="geometry" /> + </mxCell> + <mxCell id="fU0Jv1-IXl80mrmCQJBs-14" value="" style="rounded=1;whiteSpace=wrap;html=1;fillColor=none;dashed=1;" parent="1" vertex="1"> + <mxGeometry y="545" width="270" height="55" as="geometry" /> + </mxCell> + <mxCell id="fU0Jv1-IXl80mrmCQJBs-15" value="Integration module internally developed" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1"> + <mxGeometry x="-60" y="600" width="110" height="30" as="geometry" /> + </mxCell> + </root> + </mxGraphModel> + </diagram> + <diagram id="QxhRZFN0ACoc4i0gpn6R" name="Page-4"> + <mxGraphModel dx="1663" dy="775" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0"> + <root> + <mxCell id="0" /> + <mxCell id="1" parent="0" /> + </root> + </mxGraphModel> + </diagram> +</mxfile> diff --git a/docs/assets/images/image_sources/Legacy_GAP_diagrams.drawio b/docs/assets/images/image_sources/Legacy_GAP_diagrams.drawio new file mode 100644 index 0000000000000000000000000000000000000000..c854f965fb689379cf856ccd26ba11c2426b2d1c --- /dev/null +++ b/docs/assets/images/image_sources/Legacy_GAP_diagrams.drawio @@ -0,0 +1,109 @@ +<mxfile host="Electron" modified="2023-08-04T07:44:54.540Z" agent="Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/21.2.1 Chrome/112.0.5615.87 Electron/24.1.2 Safari/537.36" etag="f_znjEoEsjO5Cs6O7TO9" version="21.2.1" type="device"> + <diagram name="Overview" id="k83DaNArxDXSbVKD7Knm"> + <mxGraphModel dx="2490" dy="1944" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0"> + <root> + <mxCell id="0" /> + <mxCell id="1" parent="0" /> + <mxCell id="tLlyI6g2dAklqoHCJuop-1" value="" style="rounded=1;whiteSpace=wrap;html=1;fontColor=#000000;" vertex="1" parent="1"> + <mxGeometry x="200" y="-60" width="310" height="230" as="geometry" /> + </mxCell> + <mxCell id="tLlyI6g2dAklqoHCJuop-2" value="<font color="#FFFFFF">Jenkins</font>" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#003C56;fontSize=18;strokeColor=none;" vertex="1" parent="1"> + <mxGeometry x="-160" y="-110" width="160" height="40" as="geometry" /> + </mxCell> + <mxCell id="tLlyI6g2dAklqoHCJuop-3" value="<font color="#FFFFFF">Ansible</font>" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#003C56;fontSize=18;strokeColor=none;" vertex="1" parent="1"> + <mxGeometry x="-160" y="20" width="160" height="60" as="geometry" /> + </mxCell> + <mxCell id="tLlyI6g2dAklqoHCJuop-4" value="" style="group" vertex="1" connectable="0" parent="1"> + <mxGeometry x="210" y="33" width="310" height="133" as="geometry" /> + </mxCell> + <mxCell id="tLlyI6g2dAklqoHCJuop-5" value="" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#1084B9;fontSize=18;strokeColor=none;fontColor=#FFFFFF;" vertex="1" parent="tLlyI6g2dAklqoHCJuop-4"> + <mxGeometry y="33" width="290" height="60" as="geometry" /> + </mxCell> + <mxCell id="tLlyI6g2dAklqoHCJuop-6" value="<h1 style="font-size: 20px;"><font style="font-size: 20px;">Config Templates<br></font></h1>" style="text;whiteSpace=wrap;html=1;fontColor=#FFFFFF;" vertex="1" parent="tLlyI6g2dAklqoHCJuop-4"> + <mxGeometry x="58" y="30" width="270" height="80" as="geometry" /> + </mxCell> + <mxCell id="tLlyI6g2dAklqoHCJuop-15" value="Vendor specific implementation" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontColor=#000000;" vertex="1" parent="tLlyI6g2dAklqoHCJuop-4"> + <mxGeometry x="30" y="93" width="230" height="40" as="geometry" /> + </mxCell> + <mxCell id="tLlyI6g2dAklqoHCJuop-7" value="" style="ellipse;shape=cloud;whiteSpace=wrap;html=1;fontColor=#FFFFFF;" vertex="1" parent="1"> + <mxGeometry x="-286" y="190" width="330" height="200" as="geometry" /> + </mxCell> + <mxCell id="tLlyI6g2dAklqoHCJuop-8" value="<h1 align="center"><font color="#000000">Geant<br></font></h1><h1 align="center"><font color="#000000">IP/MPLS Network</font><br></h1>" style="text;whiteSpace=wrap;html=1;fontColor=#FFFFFF;" vertex="1" parent="1"> + <mxGeometry x="-211" y="230" width="205" height="70" as="geometry" /> + </mxCell> + <mxCell id="tLlyI6g2dAklqoHCJuop-9" value="" style="shape=flexArrow;endArrow=classic;html=1;rounded=0;fontColor=#FFFFFF;entryX=1;entryY=0.75;entryDx=0;entryDy=0;exitX=0;exitY=0.5;exitDx=0;exitDy=0;edgeStyle=orthogonalEdgeStyle;fillColor=default;" edge="1" parent="1" source="tLlyI6g2dAklqoHCJuop-5" target="tLlyI6g2dAklqoHCJuop-3"> + <mxGeometry width="50" height="50" relative="1" as="geometry"> + <mxPoint x="170" y="160" as="sourcePoint" /> + <mxPoint x="220" y="110" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="tLlyI6g2dAklqoHCJuop-10" value="" style="shape=flexArrow;endArrow=classic;html=1;rounded=0;fontColor=#FFFFFF;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.625;entryY=0.2;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="1" source="tLlyI6g2dAklqoHCJuop-3" target="tLlyI6g2dAklqoHCJuop-7"> + <mxGeometry width="50" height="50" relative="1" as="geometry"> + <mxPoint x="140" y="190" as="sourcePoint" /> + <mxPoint x="190" y="140" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="tLlyI6g2dAklqoHCJuop-11" value="" style="shape=flexArrow;endArrow=classic;startArrow=classic;html=1;rounded=0;fontColor=#FFFFFF;entryX=0.5;entryY=1;entryDx=0;entryDy=0;exitX=0.5;exitY=0;exitDx=0;exitDy=0;" edge="1" parent="1" source="tLlyI6g2dAklqoHCJuop-3" target="tLlyI6g2dAklqoHCJuop-2"> + <mxGeometry width="100" height="100" relative="1" as="geometry"> + <mxPoint x="-320" y="20" as="sourcePoint" /> + <mxPoint x="-220" y="-80" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="tLlyI6g2dAklqoHCJuop-12" value="" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#1084B9;fontSize=18;strokeColor=none;fontColor=#FFFFFF;" vertex="1" parent="1"> + <mxGeometry x="210" y="-30" width="290" height="60" as="geometry" /> + </mxCell> + <mxCell id="tLlyI6g2dAklqoHCJuop-13" value="<h1 style="font-size: 20px;"><font style="font-size: 20px;">Inventory<br></font></h1>" style="text;whiteSpace=wrap;html=1;fontColor=#FFFFFF;" vertex="1" parent="1"> + <mxGeometry x="268" y="-33" width="270" height="80" as="geometry" /> + </mxCell> + <mxCell id="tLlyI6g2dAklqoHCJuop-14" value="" style="shape=flexArrow;endArrow=classic;html=1;rounded=0;fontColor=#000000;exitX=0;exitY=0.5;exitDx=0;exitDy=0;entryX=1;entryY=0.25;entryDx=0;entryDy=0;edgeStyle=orthogonalEdgeStyle;fillColor=default;" edge="1" parent="1" source="tLlyI6g2dAklqoHCJuop-12" target="tLlyI6g2dAklqoHCJuop-3"> + <mxGeometry width="50" height="50" relative="1" as="geometry"> + <mxPoint x="90" as="sourcePoint" /> + <mxPoint x="140" y="-50" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="tLlyI6g2dAklqoHCJuop-16" value="Global variables + Services" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontColor=#000000;" vertex="1" parent="1"> + <mxGeometry x="310" y="-62" width="200" height="40" as="geometry" /> + </mxCell> + <mxCell id="tLlyI6g2dAklqoHCJuop-17" value="" style="shape=flexArrow;endArrow=classic;html=1;rounded=0;fontColor=#000000;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0.004;entryY=0.113;entryDx=0;entryDy=0;edgeStyle=orthogonalEdgeStyle;fillColor=default;entryPerimeter=0;" edge="1" parent="1" source="tLlyI6g2dAklqoHCJuop-2" target="tLlyI6g2dAklqoHCJuop-13"> + <mxGeometry width="50" height="50" relative="1" as="geometry"> + <mxPoint x="220" y="-20" as="sourcePoint" /> + <mxPoint x="282.5" y="-60" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="tLlyI6g2dAklqoHCJuop-18" value="<font style="font-size: 15px;">Netconf</font>" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontColor=#000000;" vertex="1" parent="1"> + <mxGeometry x="-120" y="140" width="150" height="40" as="geometry" /> + </mxCell> + <mxCell id="tLlyI6g2dAklqoHCJuop-19" value="Updates via python scripts" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1"> + <mxGeometry x="44" y="-120" width="186" height="30" as="geometry" /> + </mxCell> + <mxCell id="tLlyI6g2dAklqoHCJuop-20" value="Sync every minute &amp; on demand" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1"> + <mxGeometry y="-33" width="186" height="30" as="geometry" /> + </mxCell> + <mxCell id="tLlyI6g2dAklqoHCJuop-22" value="" style="shape=actor;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="342" y="-290" width="40" height="60" as="geometry" /> + </mxCell> + <mxCell id="tLlyI6g2dAklqoHCJuop-23" value="" style="shape=flexArrow;endArrow=classic;startArrow=classic;html=1;rounded=0;exitX=0.25;exitY=0;exitDx=0;exitDy=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;" edge="1" parent="1" source="tLlyI6g2dAklqoHCJuop-16" target="tLlyI6g2dAklqoHCJuop-22"> + <mxGeometry width="100" height="100" relative="1" as="geometry"> + <mxPoint x="430" y="-150" as="sourcePoint" /> + <mxPoint x="530" y="-250" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="tLlyI6g2dAklqoHCJuop-24" value="" style="shape=flexArrow;endArrow=classic;startArrow=classic;html=1;rounded=0;exitX=0.5;exitY=0;exitDx=0;exitDy=0;entryX=0;entryY=0.75;entryDx=0;entryDy=0;" edge="1" parent="1" source="tLlyI6g2dAklqoHCJuop-2" target="tLlyI6g2dAklqoHCJuop-22"> + <mxGeometry width="100" height="100" relative="1" as="geometry"> + <mxPoint x="-170" y="-190" as="sourcePoint" /> + <mxPoint x="-70" y="-290" as="targetPoint" /> + <Array as="points"> + <mxPoint x="-80" y="-245" /> + </Array> + </mxGeometry> + </mxCell> + <mxCell id="tLlyI6g2dAklqoHCJuop-25" value="<h1><span style="background-color: initial;"><font style="font-size: 18px;">Changes to intended configuration via MR</font></span></h1><h1 style="line-height: 50%;"><span style="font-size: 12px; font-weight: 400;">We use Merge Requests to incorporate changes to the intended configuration or mechanics.&nbsp;</span></h1>" style="text;html=1;strokeColor=none;fillColor=none;spacing=5;spacingTop=-20;whiteSpace=wrap;overflow=hidden;rounded=0;" vertex="1" parent="1"> + <mxGeometry x="390" y="-220" width="410" height="150" as="geometry" /> + </mxCell> + <mxCell id="tLlyI6g2dAklqoHCJuop-26" value="<h1><span style="background-color: initial;"><font style="font-size: 18px;">Apply changes to the live network</font></span></h1><h1 style="line-height: 50%;"><span style="font-size: 12px; font-weight: 400;">Jenkins web interface is used to run changes in an ordered manner, leveraging pipelines.&nbsp;</span></h1>" style="text;html=1;strokeColor=none;fillColor=none;spacing=5;spacingTop=-20;whiteSpace=wrap;overflow=hidden;rounded=0;" vertex="1" parent="1"> + <mxGeometry x="-68" y="-240" width="410" height="150" as="geometry" /> + </mxCell> + </root> + </mxGraphModel> + </diagram> +</mxfile> diff --git a/docs/assets/images/image_sources/tnc_diags.drawio b/docs/assets/images/image_sources/tnc_diags.drawio new file mode 100644 index 0000000000000000000000000000000000000000..7e83102721cd79028422185e8073d09402aef0d2 --- /dev/null +++ b/docs/assets/images/image_sources/tnc_diags.drawio @@ -0,0 +1,315 @@ +<mxfile host="Electron" modified="2023-05-24T07:57:03.747Z" agent="Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/21.2.1 Chrome/112.0.5615.87 Electron/24.1.2 Safari/537.36" etag="Wqxuv_WkUwJ5SEU76gDj" version="21.2.1" type="device" pages="8"> + <diagram name="ConfigSlicing" id="-v2HClgEn8oXKU-_8mU5"> + <mxGraphModel dx="1531" dy="775" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0"> + <root> + <mxCell id="0" /> + <mxCell id="1" parent="0" /> + <mxCell id="ux3ZYKxkQu5kj8UU2eCA-11" value="<font color="#ffffff" style="font-size: 17px;">Base config</font>" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#393938;strokeColor=#ffffff;fontFamily=Tahoma;fontSize=15;verticalAlign=top;strokeWidth=3;" parent="1" vertex="1"> + <mxGeometry x="-680" y="510" width="330" height="180" as="geometry" /> + </mxCell> + <mxCell id="ux3ZYKxkQu5kj8UU2eCA-12" value="Service&nbsp;" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#075683;strokeColor=#ffffff;fontColor=#ffffff;fontSize=14;strokeWidth=3;" parent="1" vertex="1"> + <mxGeometry x="-680" y="330" width="110" height="60" as="geometry" /> + </mxCell> + <mxCell id="ux3ZYKxkQu5kj8UU2eCA-13" value="Service <br>PREREQ" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#e83f4b;strokeColor=#ffffff;fontColor=#ffffff;fontSize=14;strokeWidth=3;" parent="1" vertex="1"> + <mxGeometry x="-680" y="390" width="110" height="60" as="geometry" /> + </mxCell> + <mxCell id="ux3ZYKxkQu5kj8UU2eCA-14" value="<font style="font-size: 17px;">Network insertion PREREQ</font>" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f8a10c;strokeColor=#ffffff;fontColor=#ffffff;fontSize=14;strokeWidth=3;" parent="1" vertex="1"> + <mxGeometry x="-680" y="450" width="330" height="60" as="geometry" /> + </mxCell> + <mxCell id="ux3ZYKxkQu5kj8UU2eCA-15" value="SNMP/Syslog" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#6a6a69;strokeColor=#ffffff;fontColor=#ffffff;fontSize=14;rotation=90;strokeWidth=3;" parent="1" vertex="1"> + <mxGeometry x="-695" y="590" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="iOF17kAZhzwTpk88auO2-1" value="AAA" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#6a6a69;strokeColor=#ffffff;fontColor=#ffffff;fontSize=14;rotation=90;strokeWidth=3;" parent="1" vertex="1"> + <mxGeometry x="-635" y="590" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="iOF17kAZhzwTpk88auO2-2" value="Chassis" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#6a6a69;strokeColor=#ffffff;fontColor=#ffffff;fontSize=14;rotation=90;strokeWidth=3;" parent="1" vertex="1"> + <mxGeometry x="-575" y="590" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="iOF17kAZhzwTpk88auO2-3" value="..." style="rounded=1;whiteSpace=wrap;html=1;fillColor=#6a6a69;strokeColor=#ffffff;fontColor=#ffffff;fontSize=14;rotation=90;strokeWidth=3;" parent="1" vertex="1"> + <mxGeometry x="-515" y="590" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="iOF17kAZhzwTpk88auO2-4" value="IGP" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#6a6a69;strokeColor=#ffffff;fontColor=#ffffff;fontSize=14;rotation=90;strokeWidth=3;" parent="1" vertex="1"> + <mxGeometry x="-455" y="590" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="iOF17kAZhzwTpk88auO2-8" value="Service&nbsp;" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#075683;strokeColor=#ffffff;fontColor=#ffffff;fontSize=14;strokeWidth=3;" parent="1" vertex="1"> + <mxGeometry x="-570" y="330" width="110" height="60" as="geometry" /> + </mxCell> + <mxCell id="iOF17kAZhzwTpk88auO2-9" value="Service <br>PREREQ" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#e83f4b;strokeColor=#ffffff;fontColor=#ffffff;fontSize=14;strokeWidth=3;" parent="1" vertex="1"> + <mxGeometry x="-570" y="390" width="110" height="60" as="geometry" /> + </mxCell> + <mxCell id="iOF17kAZhzwTpk88auO2-10" value="Service&nbsp;" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#075683;strokeColor=#ffffff;fontColor=#ffffff;fontSize=14;strokeWidth=3;" parent="1" vertex="1"> + <mxGeometry x="-460" y="390" width="110" height="60" as="geometry" /> + </mxCell> + </root> + </mxGraphModel> + </diagram> + <diagram id="5i0rD19VF7rTkfrN9PTo" name="Service_stitching"> + <mxGraphModel dx="1531" dy="896" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0"> + <root> + <mxCell id="0" /> + <mxCell id="1" parent="0" /> + <mxCell id="yIGBiBvBH6CWbod5C-wM-1" value="<font color="#ffffff" style="font-size: 17px;">Demarcation Point</font>" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#393938;strokeColor=none;fontFamily=Tahoma;fontSize=15;verticalAlign=top;" parent="1" vertex="1"> + <mxGeometry x="-545" y="300" width="185" height="180" as="geometry" /> + </mxCell> + <mxCell id="yIGBiBvBH6CWbod5C-wM-3" value="L3 Service" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#e83f4b;strokeColor=none;fontColor=#ffffff;fontSize=14;" parent="1" vertex="1"> + <mxGeometry x="-700" y="310" width="110" height="60" as="geometry" /> + </mxCell> + <mxCell id="yIGBiBvBH6CWbod5C-wM-4" value="Service Delivery point" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f8a10c;strokeColor=#ffffff;fontColor=#ffffff;fontSize=14;strokeWidth=3;" parent="1" vertex="1"> + <mxGeometry x="-620" y="350" width="165" height="40" as="geometry" /> + </mxCell> + <mxCell id="yIGBiBvBH6CWbod5C-wM-5" value="Physical interface" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#6a6a69;strokeColor=#ffffff;fontColor=#ffffff;fontSize=14;rotation=0;strokeWidth=3;" parent="1" vertex="1"> + <mxGeometry x="-420" y="340" width="130" height="60" as="geometry" /> + </mxCell> + <mxCell id="yIGBiBvBH6CWbod5C-wM-12" value="L2 service" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#075683;strokeColor=none;fontColor=#ffffff;fontSize=14;" parent="1" vertex="1"> + <mxGeometry x="-700" y="420" width="110" height="60" as="geometry" /> + </mxCell> + <mxCell id="yIGBiBvBH6CWbod5C-wM-13" value="Physical interface" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#6a6a69;strokeColor=#ffffff;fontColor=#ffffff;fontSize=14;rotation=0;strokeWidth=3;" parent="1" vertex="1"> + <mxGeometry x="-420" y="400" width="130" height="60" as="geometry" /> + </mxCell> + <mxCell id="yIGBiBvBH6CWbod5C-wM-14" value="Service Delivery point" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f8a10c;strokeColor=#ffffff;fontColor=#ffffff;fontSize=14;strokeWidth=3;" parent="1" vertex="1"> + <mxGeometry x="-620" y="400" width="165" height="40" as="geometry" /> + </mxCell> + </root> + </mxGraphModel> + </diagram> + <diagram id="4GGy6K8-__1y2JSz8z5D" name="Current platform"> + <mxGraphModel dx="704" dy="775" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0"> + <root> + <mxCell id="0" /> + <mxCell id="1" parent="0" /> + <mxCell id="ZYyvOGO_DOKAqn3Hz9u7-5" value="" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#6a6a69;strokeColor=none;" parent="1" vertex="1"> + <mxGeometry x="120" y="180" width="140" height="170" as="geometry" /> + </mxCell> + <mxCell id="ZYyvOGO_DOKAqn3Hz9u7-1" value="Ansible Inventory" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#e83f4b;strokeColor=none;fontColor=#ffffff;" parent="1" vertex="1"> + <mxGeometry x="130" y="190" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="ZYyvOGO_DOKAqn3Hz9u7-2" value="Ansible playbooks/roles" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f8a10c;strokeColor=none;fontColor=#ffffff;" parent="1" vertex="1"> + <mxGeometry x="130" y="260" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="ZYyvOGO_DOKAqn3Hz9u7-3" value="Jenkins" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#075683;strokeColor=none;fontColor=#ffffff;" parent="1" vertex="1"> + <mxGeometry x="294" y="100" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="ZYyvOGO_DOKAqn3Hz9u7-4" value="Ansible" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#393938;strokeColor=none;fontColor=#ffffff;" parent="1" vertex="1"> + <mxGeometry x="294" y="220" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="ZYyvOGO_DOKAqn3Hz9u7-6" value="<font color="#ffffff">Git</font>" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" parent="1" vertex="1"> + <mxGeometry x="160" y="320" width="60" height="30" as="geometry" /> + </mxCell> + <mxCell id="ZYyvOGO_DOKAqn3Hz9u7-8" value="" style="endArrow=classic;startArrow=classic;html=1;rounded=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;exitX=0.5;exitY=0;exitDx=0;exitDy=0;edgeStyle=orthogonalEdgeStyle;" parent="1" source="ZYyvOGO_DOKAqn3Hz9u7-1" target="ZYyvOGO_DOKAqn3Hz9u7-3" edge="1"> + <mxGeometry width="50" height="50" relative="1" as="geometry"> + <mxPoint x="140" y="130" as="sourcePoint" /> + <mxPoint x="190" y="80" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="ZYyvOGO_DOKAqn3Hz9u7-9" value="" style="endArrow=classic;html=1;rounded=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;" parent="1" source="ZYyvOGO_DOKAqn3Hz9u7-3" target="ZYyvOGO_DOKAqn3Hz9u7-4" edge="1"> + <mxGeometry width="50" height="50" relative="1" as="geometry"> + <mxPoint x="360" y="440" as="sourcePoint" /> + <mxPoint x="410" y="390" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="ZYyvOGO_DOKAqn3Hz9u7-10" value="Geant network" style="ellipse;shape=cloud;whiteSpace=wrap;html=1;" parent="1" vertex="1"> + <mxGeometry x="235" y="350" width="190" height="100" as="geometry" /> + </mxCell> + <mxCell id="ZYyvOGO_DOKAqn3Hz9u7-11" value="" style="endArrow=classic;html=1;rounded=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.625;entryY=0.2;entryDx=0;entryDy=0;entryPerimeter=0;" parent="1" source="ZYyvOGO_DOKAqn3Hz9u7-4" target="ZYyvOGO_DOKAqn3Hz9u7-10" edge="1"> + <mxGeometry width="50" height="50" relative="1" as="geometry"> + <mxPoint x="330" y="390" as="sourcePoint" /> + <mxPoint x="380" y="340" as="targetPoint" /> + </mxGeometry> + </mxCell> + </root> + </mxGraphModel> + </diagram> + <diagram id="7bl7mi0SMid7X8VnnjYW" name="Separate Teams"> + <mxGraphModel dx="704" dy="775" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0"> + <root> + <mxCell id="0" /> + <mxCell id="1" parent="0" /> + <mxCell id="z-Ykx7HdOqv-8QVXLixa-1" value="Network Engineering" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#075683;strokeColor=none;fontColor=#FFFFFF;" parent="1" vertex="1"> + <mxGeometry x="80" y="220" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="z-Ykx7HdOqv-8QVXLixa-2" value="Operations" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f8a10c;strokeColor=none;fontColor=#FFFFFF;" parent="1" vertex="1"> + <mxGeometry x="80" y="310" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="z-Ykx7HdOqv-8QVXLixa-3" value="Service Management" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#e83f4b;strokeColor=none;fontColor=#FFFFFF;" parent="1" vertex="1"> + <mxGeometry x="80" y="400" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="z-Ykx7HdOqv-8QVXLixa-4" value="Lab network" style="ellipse;shape=cloud;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;" parent="1" vertex="1"> + <mxGeometry x="366" y="206" width="120" height="80" as="geometry" /> + </mxCell> + <mxCell id="z-Ykx7HdOqv-8QVXLixa-5" value="Production&nbsp;<br>Network" style="ellipse;shape=cloud;whiteSpace=wrap;html=1;fillColor=#f8cecc;strokeColor=#b85450;" parent="1" vertex="1"> + <mxGeometry x="369" y="386" width="120" height="80" as="geometry" /> + </mxCell> + <mxCell id="z-Ykx7HdOqv-8QVXLixa-6" value="" style="shape=flexArrow;endArrow=classic;startArrow=classic;html=1;rounded=0;entryX=0.16;entryY=0.55;entryDx=0;entryDy=0;entryPerimeter=0;exitX=1;exitY=0.5;exitDx=0;exitDy=0;fillColor=default;" parent="1" source="z-Ykx7HdOqv-8QVXLixa-1" target="z-Ykx7HdOqv-8QVXLixa-4" edge="1"> + <mxGeometry width="100" height="100" relative="1" as="geometry"> + <mxPoint x="200" y="540" as="sourcePoint" /> + <mxPoint x="300" y="440" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="z-Ykx7HdOqv-8QVXLixa-7" value="" style="shape=flexArrow;endArrow=classic;startArrow=classic;html=1;rounded=0;entryX=0.16;entryY=0.55;entryDx=0;entryDy=0;entryPerimeter=0;edgeStyle=orthogonalEdgeStyle;fillColor=default;" parent="1" source="z-Ykx7HdOqv-8QVXLixa-3" target="z-Ykx7HdOqv-8QVXLixa-5" edge="1"> + <mxGeometry width="100" height="100" relative="1" as="geometry"> + <mxPoint x="250" y="570" as="sourcePoint" /> + <mxPoint x="350" y="470" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="z-Ykx7HdOqv-8QVXLixa-8" value="" style="shape=flexArrow;endArrow=classic;startArrow=classic;html=1;rounded=0;exitX=1;exitY=0.5;exitDx=0;exitDy=0;edgeStyle=orthogonalEdgeStyle;entryX=0.625;entryY=0.2;entryDx=0;entryDy=0;entryPerimeter=0;fillColor=default;" parent="1" source="z-Ykx7HdOqv-8QVXLixa-2" target="z-Ykx7HdOqv-8QVXLixa-5" edge="1"> + <mxGeometry width="100" height="100" relative="1" as="geometry"> + <mxPoint x="210" y="437" as="sourcePoint" /> + <mxPoint x="470" y="380" as="targetPoint" /> + </mxGeometry> + </mxCell> + </root> + </mxGraphModel> + </diagram> + <diagram name="AutomationTeam" id="NopwVUf4hRq528Z1hWJH"> + <mxGraphModel dx="704" dy="775" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0"> + <root> + <mxCell id="bTUQS3OS1buqlsLdCb6S-0" /> + <mxCell id="bTUQS3OS1buqlsLdCb6S-1" parent="bTUQS3OS1buqlsLdCb6S-0" /> + <mxCell id="bTUQS3OS1buqlsLdCb6S-2" value="Network Engineering" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#075683;strokeColor=none;fontColor=#FFFFFF;" parent="bTUQS3OS1buqlsLdCb6S-1" vertex="1"> + <mxGeometry x="80" y="220" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="bTUQS3OS1buqlsLdCb6S-3" value="Operations" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f8a10c;strokeColor=none;fontColor=#FFFFFF;" parent="bTUQS3OS1buqlsLdCb6S-1" vertex="1"> + <mxGeometry x="80" y="310" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="bTUQS3OS1buqlsLdCb6S-4" value="Service Management" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#e83f4b;strokeColor=none;fontColor=#FFFFFF;" parent="bTUQS3OS1buqlsLdCb6S-1" vertex="1"> + <mxGeometry x="80" y="400" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="bTUQS3OS1buqlsLdCb6S-5" value="Lab network" style="ellipse;shape=cloud;whiteSpace=wrap;html=1;fillColor=#d5e8d4;strokeColor=#82b366;" parent="bTUQS3OS1buqlsLdCb6S-1" vertex="1"> + <mxGeometry x="500" y="234" width="120" height="80" as="geometry" /> + </mxCell> + <mxCell id="bTUQS3OS1buqlsLdCb6S-6" value="Production&nbsp;<br>Network" style="ellipse;shape=cloud;whiteSpace=wrap;html=1;fillColor=#f8cecc;strokeColor=#b85450;" parent="bTUQS3OS1buqlsLdCb6S-1" vertex="1"> + <mxGeometry x="500" y="359" width="120" height="80" as="geometry" /> + </mxCell> + <mxCell id="bTUQS3OS1buqlsLdCb6S-7" value="" style="shape=flexArrow;endArrow=classic;startArrow=classic;html=1;rounded=0;exitX=1;exitY=0.5;exitDx=0;exitDy=0;fillColor=default;entryX=0;entryY=0.25;entryDx=0;entryDy=0;" parent="bTUQS3OS1buqlsLdCb6S-1" source="bTUQS3OS1buqlsLdCb6S-2" target="5UbXd5yXoWZJe1HoEqGD-0" edge="1"> + <mxGeometry width="100" height="100" relative="1" as="geometry"> + <mxPoint x="200" y="540" as="sourcePoint" /> + <mxPoint x="360" y="250" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="bTUQS3OS1buqlsLdCb6S-8" value="" style="shape=flexArrow;endArrow=classic;startArrow=classic;html=1;rounded=0;fillColor=default;entryX=0;entryY=0.75;entryDx=0;entryDy=0;" parent="bTUQS3OS1buqlsLdCb6S-1" source="bTUQS3OS1buqlsLdCb6S-4" target="5UbXd5yXoWZJe1HoEqGD-0" edge="1"> + <mxGeometry width="100" height="100" relative="1" as="geometry"> + <mxPoint x="250" y="570" as="sourcePoint" /> + <mxPoint x="400" y="440" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="bTUQS3OS1buqlsLdCb6S-9" value="" style="shape=flexArrow;endArrow=classic;startArrow=classic;html=1;rounded=0;exitX=1;exitY=0.5;exitDx=0;exitDy=0;fillColor=default;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" parent="bTUQS3OS1buqlsLdCb6S-1" target="5UbXd5yXoWZJe1HoEqGD-0" edge="1"> + <mxGeometry width="100" height="100" relative="1" as="geometry"> + <mxPoint x="200" y="341" as="sourcePoint" /> + <mxPoint x="440" y="341" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="5UbXd5yXoWZJe1HoEqGD-0" value="<font color="#ffffff">Orchestration and Automation platform</font>" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#6a6a69;strokeColor=none;" parent="bTUQS3OS1buqlsLdCb6S-1" vertex="1"> + <mxGeometry x="330" y="215" width="120" height="250" as="geometry" /> + </mxCell> + <mxCell id="5UbXd5yXoWZJe1HoEqGD-1" value="" style="shape=flexArrow;endArrow=classic;startArrow=classic;html=1;rounded=0;exitX=1;exitY=0.25;exitDx=0;exitDy=0;fillColor=default;entryX=0.16;entryY=0.55;entryDx=0;entryDy=0;entryPerimeter=0;" parent="bTUQS3OS1buqlsLdCb6S-1" source="5UbXd5yXoWZJe1HoEqGD-0" target="bTUQS3OS1buqlsLdCb6S-5" edge="1"> + <mxGeometry width="100" height="100" relative="1" as="geometry"> + <mxPoint x="210" y="260" as="sourcePoint" /> + <mxPoint x="340" y="288" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="5UbXd5yXoWZJe1HoEqGD-2" value="" style="shape=flexArrow;endArrow=classic;startArrow=classic;html=1;rounded=0;exitX=1;exitY=0.75;exitDx=0;exitDy=0;fillColor=default;entryX=0.16;entryY=0.55;entryDx=0;entryDy=0;entryPerimeter=0;" parent="bTUQS3OS1buqlsLdCb6S-1" source="5UbXd5yXoWZJe1HoEqGD-0" target="bTUQS3OS1buqlsLdCb6S-6" edge="1"> + <mxGeometry width="100" height="100" relative="1" as="geometry"> + <mxPoint x="460" y="288" as="sourcePoint" /> + <mxPoint x="520" y="289" as="targetPoint" /> + </mxGeometry> + </mxCell> + </root> + </mxGraphModel> + </diagram> + <diagram id="Inwgj1F5eMqlbokPXu0Z" name="WFO_GAP"> + <mxGraphModel dx="1262" dy="699" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0"> + <root> + <mxCell id="0" /> + <mxCell id="1" parent="0" /> + <mxCell id="ihhsytwJvdjq6a-tvqrz-26" value="" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#b1ddf0;strokeColor=none;movable=1;resizable=1;rotatable=1;deletable=1;editable=1;locked=0;connectable=1;" vertex="1" parent="1"> + <mxGeometry x="200" y="110" width="260" height="310" as="geometry" /> + </mxCell> + <mxCell id="uXsOA7PlX-3xU6F4Pw0F-1" value="Infoblox<br style="font-size: 15px;">(IPAM+DNS)" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#008a00;strokeColor=#005700;fontColor=#ffffff;fontSize=15;" parent="1" vertex="1"> + <mxGeometry x="110" y="120" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="uXsOA7PlX-3xU6F4Pw0F-2" value="LibreNMS" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#008a00;strokeColor=#005700;fontColor=#ffffff;fontSize=15;" parent="1" vertex="1"> + <mxGeometry x="110" y="190" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="uXsOA7PlX-3xU6F4Pw0F-3" value="Kentik" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#008a00;strokeColor=#005700;fontColor=#ffffff;fontSize=15;" parent="1" vertex="1"> + <mxGeometry x="110" y="260" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="uXsOA7PlX-3xU6F4Pw0F-5" value="CoreDB" style="shape=cylinder3;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;size=15;" parent="1" vertex="1"> + <mxGeometry x="389" y="160" width="60" height="80" as="geometry" /> + </mxCell> + <mxCell id="uXsOA7PlX-3xU6F4Pw0F-6" value="<meta charset="utf-8"><span style="color: rgb(255, 255, 255); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: center; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(251, 251, 251); text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial; float: none; display: inline !important;">Ansible</span>" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#6a6a69;strokeColor=none;" parent="1" vertex="1"> + <mxGeometry x="250" y="380" width="170" height="100" as="geometry" /> + </mxCell> + <mxCell id="ihhsytwJvdjq6a-tvqrz-4" value="<font style="font-size: 14px;">Workflow Orchestrator</font>" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#075683;strokeColor=none;fontColor=#ffffff;" vertex="1" parent="1"> + <mxGeometry x="269" y="170" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="ihhsytwJvdjq6a-tvqrz-9" value="Geant network" style="ellipse;shape=cloud;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="240" y="560" width="190" height="100" as="geometry" /> + </mxCell> + <mxCell id="ihhsytwJvdjq6a-tvqrz-10" value="" style="endArrow=classic;html=1;rounded=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.625;entryY=0.2;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="1" source="uXsOA7PlX-3xU6F4Pw0F-6"> + <mxGeometry width="50" height="50" relative="1" as="geometry"> + <mxPoint x="156" y="590" as="sourcePoint" /> + <mxPoint x="334.75" y="570" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="ihhsytwJvdjq6a-tvqrz-21" value="Ansible" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#393938;strokeColor=none;fontColor=#ffffff;fontSize=14;" vertex="1" parent="1"> + <mxGeometry x="275" y="410" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="ihhsytwJvdjq6a-tvqrz-23" value="Resource Manager" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#008a00;strokeColor=#005700;fontColor=#ffffff;fontSize=15;" vertex="1" parent="1"> + <mxGeometry x="110" y="330" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="ihhsytwJvdjq6a-tvqrz-25" value="LSO" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontSize=14;fontColor=#ffffff;" vertex="1" parent="1"> + <mxGeometry x="305" y="380" width="60" height="30" as="geometry" /> + </mxCell> + <mxCell id="ihhsytwJvdjq6a-tvqrz-27" value="<font style="font-size: 14px;">Orchestrator GUI</font>" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#075683;strokeColor=none;fontColor=#ffffff;" vertex="1" parent="1"> + <mxGeometry x="270" y="70" width="120" height="60" as="geometry" /> + </mxCell> + </root> + </mxGraphModel> + </diagram> + <diagram id="3LhLVZ4yy8G3-mkMf7gk" name="WFO-LSO_interaction"> + <mxGraphModel dx="783" dy="350" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0"> + <root> + <mxCell id="0" /> + <mxCell id="1" parent="0" /> + <mxCell id="dgXSPGCTYltXm8iRpV1s-1" value="Workflow step" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#075683;strokeColor=none;fontSize=14;fontColor=#FFFFFF;verticalAlign=middle;" vertex="1" parent="1"> + <mxGeometry x="80" y="210" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="dgXSPGCTYltXm8iRpV1s-2" value="Provisioning Proxy&nbsp;" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#075683;strokeColor=none;fontSize=14;fontColor=#FFFFFF;verticalAlign=middle;" vertex="1" parent="1"> + <mxGeometry x="283" y="210" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="dgXSPGCTYltXm8iRpV1s-3" value="LSO" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#075683;strokeColor=none;fontSize=14;fontColor=#FFFFFF;verticalAlign=middle;" vertex="1" parent="1"> + <mxGeometry x="487" y="210" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="dgXSPGCTYltXm8iRpV1s-4" value="AnsibleRunner" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#075683;strokeColor=none;fontSize=14;fontColor=#FFFFFF;verticalAlign=middle;" vertex="1" parent="1"> + <mxGeometry x="690" y="210" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="v4EpgOqexIXFn1ROid0U-1" value="" style="shape=flexArrow;endArrow=classic;startArrow=classic;html=1;rounded=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" target="dgXSPGCTYltXm8iRpV1s-2"> + <mxGeometry width="100" height="100" relative="1" as="geometry"> + <mxPoint x="200" y="239.5" as="sourcePoint" /> + <mxPoint x="270" y="239.5" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="v4EpgOqexIXFn1ROid0U-2" value="" style="shape=flexArrow;endArrow=classic;startArrow=classic;html=1;rounded=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1"> + <mxGeometry width="100" height="100" relative="1" as="geometry"> + <mxPoint x="403" y="239.75" as="sourcePoint" /> + <mxPoint x="486" y="240.25" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="v4EpgOqexIXFn1ROid0U-3" value="" style="shape=flexArrow;endArrow=classic;startArrow=classic;html=1;rounded=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1"> + <mxGeometry width="100" height="100" relative="1" as="geometry"> + <mxPoint x="607" y="239.75" as="sourcePoint" /> + <mxPoint x="690" y="240.25" as="targetPoint" /> + </mxGeometry> + </mxCell> + </root> + </mxGraphModel> + </diagram> + <diagram id="wTfjSK5rcfUPPVArNN4H" name="Page-8"> + <mxGraphModel dx="327" dy="360" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0"> + <root> + <mxCell id="0" /> + <mxCell id="1" parent="0" /> + </root> + </mxGraphModel> + </diagram> +</mxfile> diff --git a/docs/assets/images/logo.png b/docs/assets/images/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..31df6a86d9495a4e816b5c3cd502235ed0250822 Binary files /dev/null and b/docs/assets/images/logo.png differ diff --git a/docs/assets/stylesheets/extra.css b/docs/assets/stylesheets/extra.css new file mode 100644 index 0000000000000000000000000000000000000000..ef4becafafa90fe1e723d401d4c260003a2902eb --- /dev/null +++ b/docs/assets/stylesheets/extra.css @@ -0,0 +1,43 @@ +[data-md-color-scheme="geant"] { + --md-primary-fg-color: #003F5F; + --md-default-fg-color--light: #4D798F; + --md-default-fg-color--dark: #002B41; + --md-primary-fg-color--light: #4D798F; + --md-primary-fg-color--dark: #003F5F; + --md-typeset-a-color: #ED1556; + --md-code-hl-string-color: #E24301; + --md-code-hl-function-color: #6D2077; + --md-code-hl-number-color: #ED1556; + --md-code-hl-special-color: #CC007B; + --md-code-hl-constant-color: #6D2077; + --md-footer-logo-dark-mode: none; + --md-footer-logo-light-mode: block; +} + +[data-md-color-scheme="slate"] { + --md-primary-fg-color: #6D2077; + --md-typeset-a-color: #F05B89; + --md-default-fg-color--light: #D4DADA; + --md-default-fg-color--dark: #511259; + --md-primary-fg-color--light: #9D6AA2; + --md-primary-fg-color--dark: #6D2077; + --md-code-hl-string-color: #EA7E66; + --md-code-hl-function-color: #9D6AA2; + --md-code-hl-number-color: #F05B89; + --md-code-hl-special-color: #D85EA3; + --md-code-hl-constant-color: #9D6AA2; + --md-footer-logo-dark-mode: block; + --md-footer-logo-light-mode: none; +} + +#logo_light_mode { + display: var(--md-footer-logo-light-mode); + width: 45px; + height: auto; +} + +#logo_dark_mode { + display: var(--md-footer-logo-dark-mode); + width: 45px; + height: auto; +} diff --git a/docs/index.md b/docs/index.md new file mode 100644 index 0000000000000000000000000000000000000000..900c5ed22904aa3bba0996881938e62432a7c571 --- /dev/null +++ b/docs/index.md @@ -0,0 +1,50 @@ +# GÉANT Automation Platform (GAP) + +Welcome to the documentation of the GÉANT Automation Platform, or GAP for short. +The focus of this platform is configuration management and service orchestration for the GÉANT IP/MPLS network. + +## What is GAP + +GAP represents the vision of GÉANT in terms of Network Automation and Orchestration. It summarises a few years of +experimenting and initiatives in this field, with the aim of fulfilling the following objectives: + +- To have a simple interface for managing the network service lifecycle (provisioning, termination, modification) +that ensures that the correct configuration is pushed onto the network +- To have a platform - not a single product - that is capable of adapting and evolving, according to GÉANT needs +- To have certainty that OSS/BSS systems are in sync with the actual configuration deployed in the network +- To introduce a different way of working that avoids fragmentation and silos + +GAP is part based on Open Source Software, and part internally developed. GAP integrates with most of the tooling +already in use in GÉANT. + +!!! abstract "Credits" + + The OSS components that GAP uses are mainly: + + - Workflow Orchestrator [https://workfloworchestrator.org/](https://workfloworchestrator.org/) + - Ansible [https://www.ansible.com/](https://www.ansible.com/) + +More information about the GAP architecture is available in the [Architecture](architecture/index.md) section. + +## About this documentation portal + +!!! info + This documentation does not cover the design of network services, just the + modelling and the mechanics related to automation. + +This site is organized in 4 main sections: + +- [Architecture](architecture/index.md): covers the architecture of GAP + including all the components and the interactions between them +- [Admin guide](admin_guide/index.md): provides detailed information of + the domain models in WFO and all the Ansible mechanics +- [Workflows](workflow/index.md): provides operational guides of the + Workflow Orchestrator based GAP + +The documentation provided in this portal is final and reviewed. For information +about the ongoing work please refer to the [internal wiki page](https://wiki. +geant.org/display/NNAT/GOAT+-+Geant+Orchestration+and+Automation+Team). + +!!! Tip + + For any info or clarification you can refer to `goat`@`geant.org`. diff --git a/docs/workflow/activate_iptrunk.md b/docs/workflow/activate_iptrunk.md new file mode 100644 index 0000000000000000000000000000000000000000..903e03562a08d8f87c7528b00562aa568f206cc3 --- /dev/null +++ b/docs/workflow/activate_iptrunk.md @@ -0,0 +1,5 @@ +# Activate IP trunk + +When the SharePoint checklist of a trunk is completed, this workflow is run to +take the subscription from `PROVISIONING` to `ACTIVE`. The operator is asked +to give a URL to the completed checklist. diff --git a/docs/workflow/activate_router.md b/docs/workflow/activate_router.md new file mode 100644 index 0000000000000000000000000000000000000000..01ab3626dbbf53c0cd8cd17f8ae1bd90a2462b78 --- /dev/null +++ b/docs/workflow/activate_router.md @@ -0,0 +1,5 @@ +# Activate Router + +When the SharePoint checklist of a router is completed, this workflow is run to +take the subscription from `PROVISIONING` to `ACTIVE`. The operator is asked +to give a URL to the completed checklist. diff --git a/docs/workflow/create_iptrunk.md b/docs/workflow/create_iptrunk.md new file mode 100644 index 0000000000000000000000000000000000000000..59b951fed9064545fe5f9135305370889df760e3 --- /dev/null +++ b/docs/workflow/create_iptrunk.md @@ -0,0 +1,30 @@ +# Create IP trunk + +This the workflow that brings the subscription from `INACTIVE` to `PROVISIONING`. +The deployment of a new IPtrunk consist in the following steps: + +- Fill the form with the necessary fields: + - SID + - Type + - Speed + - Nodes + - LAG interfaces with description + - LAG members with description +- WFO will query IPAM to retrieve the IPv4/IPv6 Networks necessary for the +trunk. The container to use is specified in `oss-params.json` +- The configuration necessary to deploy the LAG is generated and applied to the +destination nodes using the Ansible playbook `iptrunks.yaml` This is done first +in a dry mode (without committing) and then in a real mode committing the +configuration. The commit message has the `subscription_id` and the +`process_id`. Included in this, is the configuration necessary to enable LLDP on +the physical interfaces. +- Once the LAG interface is deployed, another Ansible playbook is called to +verify that IP traffic can actually flow over the trunk ( `iptrunk_checks.yaml`) +- Once the check is passed, the ISIS configuration will take place using the +same `iptrunks.yaml`. Also in this case first there is a dry run and then a +commit. +- After this step the ISIS adjacency gets checked using again +`iptrunks_checks.yaml` + +The trunk is deployed with an initial ISIS metric of 90.000 to prevent traffic +to pass. diff --git a/docs/workflow/create_router.md b/docs/workflow/create_router.md new file mode 100644 index 0000000000000000000000000000000000000000..5b54151d0149dbc34aed8bb886e21f77aa3c1da7 --- /dev/null +++ b/docs/workflow/create_router.md @@ -0,0 +1,50 @@ +# Create Router + +To add a new router to the GÉANT network, the `create_router` workflow must +be executed first. The intake form for this workflow requires the following +fields to be filled in: + +* Trouble ticket number +* Router vendor +* Router site +* Hostname +* Terminal server port +* Router role + +The hostname is validated, by checking that the resulting FQDN is not +already taken in IPAM. + +!!! warning + The validation only checks whether the FQDN is already taken in IPAM, + **not** whether it is registered somewhere on the internet. + +When the workflow is started, a subscription object is first instantiated in +the service database, containing all the information that was provided in +the input form at the beginning. Then, the loopback addresses are allocated +in IPAM, which results in both the IPv4 and IPv6 addresses in the product model. + +Once allocated, the first dry run of deploying router configuration takes place. +An Ansible playbook is run, with all the attributes of the new router. This +is where GSO communicates with LSO, and the router configuration is checked, +but not committed to the machine. + +After the dry run, the operator is presented with a view of the outcome of +this playbook. This is their opportunity to verify successful execution of +the Ansible playbook, and whether the difference in configuration is as +expected. If not, this is their chance to abort the workflow, and no harm is +done to the router. + +When the operator confirms the outcome of this playbook execution, the +playbook runs once again, but it will also commit the configuration after +checking. With the new router configured, the IPAM resources are verified to +ensure this external system is configured correctly. + +If the new router is a Nokia, all its interfaces are added to Netbox. This +is done to keep track of interface reservations and bookkeeping. For Juniper +routers, this does not need to take place. These existing devices are not +migrated into Netbox. + +Finally, an Ansible playbook is run to verify that the connectivity and +optical power levels of the router are in order. Once this is completed, a +checklist item is created in SharePoint and the router is taken into the +`PROVISIONING` state. diff --git a/docs/workflow/create_site.md b/docs/workflow/create_site.md new file mode 100644 index 0000000000000000000000000000000000000000..456e61f9130cddbf250495ea2b08a8e94d632307 --- /dev/null +++ b/docs/workflow/create_site.md @@ -0,0 +1,5 @@ +# Create Site + +The `create_site` workflow creates a new site object in the service database, +and sets the subscription lifecycle to `ACTIVE`. The attributes that are input +using the intake form of the workflow are stored, and nothing else happens. diff --git a/docs/workflow/deploy_twamp.md b/docs/workflow/deploy_twamp.md new file mode 100644 index 0000000000000000000000000000000000000000..f70845bce1777dc77f786b52419424e318751a64 --- /dev/null +++ b/docs/workflow/deploy_twamp.md @@ -0,0 +1,4 @@ +# Deploy TWAMP + +Takes a trunk that is either `PROVISIONING` or `ACTIVE` and deploy configuration +for TWAMP. The trunk will not change state after running this workflow. diff --git a/docs/workflow/index.md b/docs/workflow/index.md new file mode 100644 index 0000000000000000000000000000000000000000..11095f245cffc0ed170b2a8fdf47d7f6842254be --- /dev/null +++ b/docs/workflow/index.md @@ -0,0 +1,3 @@ +# Workflows + +This section contains an overview of all documented workflows in GAP. diff --git a/docs/workflow/migrate_iptrunk.md b/docs/workflow/migrate_iptrunk.md new file mode 100644 index 0000000000000000000000000000000000000000..afad60a72a8c1c93568dfa61062adcaaca38f6d3 --- /dev/null +++ b/docs/workflow/migrate_iptrunk.md @@ -0,0 +1,4 @@ +# Migrate IP trunk + +Migrate one side of an IP trunk from one router to another. In the input form, +the operator selects a new router where this trunk should terminate on. diff --git a/docs/workflow/modify_connection_strategy.md b/docs/workflow/modify_connection_strategy.md new file mode 100644 index 0000000000000000000000000000000000000000..32bfb8396e0e79df4556ec45551ae67c4a27e45d --- /dev/null +++ b/docs/workflow/modify_connection_strategy.md @@ -0,0 +1,4 @@ +# Modify connection strategy + +Run this workflow to change the way Ansible playbooks connect to a router. +Either via OOB access, or directly to the loopback interface. diff --git a/docs/workflow/modify_isis_metric.md b/docs/workflow/modify_isis_metric.md new file mode 100644 index 0000000000000000000000000000000000000000..0fda396ad52c3ad4267762cd59783dc48700e321 --- /dev/null +++ b/docs/workflow/modify_isis_metric.md @@ -0,0 +1,7 @@ +# Modify ISIS metric + +This workflow modifies the ISIS metric of a trunk. + +The strategy is to re-apply the necessary template to the configuration +construct: using a "replace" strategy only the necessary modifications will be +applied. diff --git a/docs/workflow/modify_router_kentik_license.md b/docs/workflow/modify_router_kentik_license.md new file mode 100644 index 0000000000000000000000000000000000000000..195bf928fa71452519b5e025977ed1f28c850481 --- /dev/null +++ b/docs/workflow/modify_router_kentik_license.md @@ -0,0 +1,5 @@ +# Modify Router Kentik license + +Change the license of a router in Kentik. The operator can select the license +from a list of all available plans in Kentik, and it will show the utilisation +of each license. diff --git a/docs/workflow/modify_site.md b/docs/workflow/modify_site.md new file mode 100644 index 0000000000000000000000000000000000000000..ecea90374a2e1f39e9175b88fe655c3627c8228e --- /dev/null +++ b/docs/workflow/modify_site.md @@ -0,0 +1,12 @@ +# Modify Site + +Attributes of an existing site can be modified using the `modify_site` workflow. +As a result, other subscriptions that rely on this site will have referenced +attributes updated as well. + +!!! warning + + Be aware that although this *does* update attributes in the services + database, it does **not** update any active subscription instances that are + already deployed. You will need to run additional workflows to update + subscriptions that depend on this change diff --git a/docs/workflow/modify_trunk_interface.md b/docs/workflow/modify_trunk_interface.md new file mode 100644 index 0000000000000000000000000000000000000000..242c8571b32942346440abb6898c2e52c40a6e80 --- /dev/null +++ b/docs/workflow/modify_trunk_interface.md @@ -0,0 +1,8 @@ +# Modify IP trunk interface + +Modifies LAG interfaces and members. This is used to increase capacity or to +change SID/interface descriptions. + +The strategy is to re-apply the necessary template to the configuration +construct: using a "replace" strategy only the necessary modifications will be +applied. diff --git a/docs/workflow/promote_p_to_pe.md b/docs/workflow/promote_p_to_pe.md new file mode 100644 index 0000000000000000000000000000000000000000..79980bdaaceb747b2a7c6d52afa5b54414347310 --- /dev/null +++ b/docs/workflow/promote_p_to_pe.md @@ -0,0 +1,3 @@ +# Promote P to PE + +Promote a router from the P role to a PE role. diff --git a/docs/workflow/redeploy_base_config.md b/docs/workflow/redeploy_base_config.md new file mode 100644 index 0000000000000000000000000000000000000000..aea7a73b9081fa1f645f3b5e83559f4ba4fc5a7b --- /dev/null +++ b/docs/workflow/redeploy_base_config.md @@ -0,0 +1,12 @@ +# Redeploy base configuration + +When a new router is deployed, it is loaded with the current version of +configuration that contain the bare necessities. For various reasons, this +template may change, and the resulting configuration follows from this. To +update a router 'in the wild' where this change should be reflected, the +workflow `redeploy_base_config` is used. + +This workflow only takes a trouble ticket number as initial input, and +deploys the base configuration, first as a dry run. After confirmation by an +operator, the configuration is committed to the machine, and this completes +the workflow. diff --git a/docs/workflow/terminate_iptrunk.md b/docs/workflow/terminate_iptrunk.md new file mode 100644 index 0000000000000000000000000000000000000000..af3c0799047e323ebcb3098529af0a19cfa9b197 --- /dev/null +++ b/docs/workflow/terminate_iptrunk.md @@ -0,0 +1,13 @@ +# Terminate IP trunk + +This workflow deletes all the configuration related with an IPtrunk from the +network and brings the subscription from `ACTIVE` to `TERMINATED`. The steps +are the following: + +- Modify the ISIS metric of the trunks so to evacuate traffic - and await +confirmation from an operator. +- Delete all the configuration (first dry then actual deletion): + - LAG and members of the LAG + - reference in LLDP protocol (if Juniper) + - reference in ISIS protocol +- Delete the IPv4/IPv6 networks from IPAM diff --git a/docs/workflow/terminate_router.md b/docs/workflow/terminate_router.md new file mode 100644 index 0000000000000000000000000000000000000000..93a21c3076810517771959644f97238d9ce05f22 --- /dev/null +++ b/docs/workflow/terminate_router.md @@ -0,0 +1,17 @@ +# Terminate Router + +To terminate a router, the workflow `terminate_router` is used. The operator +is presented with an input form that requires once again a trouble ticket +number. On top of this, there is also the option whether this workflow should +remove all configuration on the router, and whether IPAM entries related to +this device should be removed. + +The workflow consists of the following steps: + +- Deprovision IPAM resources (if selected). +- Try to remove configuration form the router (if selected). +- Commit removal of configuration (if selected). +- For Nokia devices: remove interfaces from Netbox. +- Remove the device from LibreNMS. +- For PE routers: apply the archiving license in Kentik. +- Set the subscription status to `TERMINATED`. diff --git a/docs/workflow/terminate_site.md b/docs/workflow/terminate_site.md new file mode 100644 index 0000000000000000000000000000000000000000..461b833881e6984d9c5e3ae21da0862f4595e602 --- /dev/null +++ b/docs/workflow/terminate_site.md @@ -0,0 +1,7 @@ +# Terminate Site + +The `terminate_site` workflow will take an existing and active site +subscription from an `ACTIVE` to a `TERMINATED` state. This requires all +dependant subscription instances to already be terminated. If this is not +the case, the workflow will be unavailable for an operator to run, accompanied +by an error message explaining this fact. diff --git a/docs/workflow/update_ibgp_mesh.md b/docs/workflow/update_ibgp_mesh.md new file mode 100644 index 0000000000000000000000000000000000000000..7f9543e0cc7addfc6703c843eb8597f8f13701de --- /dev/null +++ b/docs/workflow/update_ibgp_mesh.md @@ -0,0 +1,22 @@ +# Update iBGP mesh + +Once a new router is added to the network, it must become reachable by all +other devices. To achieve this, the `update_ibgp_mesh` workflow must be +executed. This workflow will add the new P router to all PE routers in the +network, and add all existing PE routers to the new P router. The only input +this workflow takes, is a trouble ticket number. All other required +information is already in the service database. + +The workflow will run 5 Ansible playbooks: + +1. Check: add P router to all PE routers +2. Deploy: add P router to all PE routers +3. Check: add all PE routers to P router +4. Deploy: add all PE routers to P router +5. Verify: check that the iBGP has come up + +Once these playbooks have been run successfully, the new P router is added +to LibreNMS. Finally, the subscription model of the router is updated such that +`router_access_via_ts` is set to `False`. This is because the router is now +reachable by other machines by its loopback address. Using out of band access is +therefore not needed anymore. diff --git a/docs/vale/.vale.ini b/vale/.vale.ini similarity index 100% rename from docs/vale/.vale.ini rename to vale/.vale.ini diff --git a/docs/vale/styles/config/vocabularies/Sphinx/accept.txt b/vale/styles/config/vocabularies/Sphinx/accept.txt similarity index 100% rename from docs/vale/styles/config/vocabularies/Sphinx/accept.txt rename to vale/styles/config/vocabularies/Sphinx/accept.txt diff --git a/docs/vale/styles/config/vocabularies/geant-jargon/accept.txt b/vale/styles/config/vocabularies/geant-jargon/accept.txt similarity index 100% rename from docs/vale/styles/config/vocabularies/geant-jargon/accept.txt rename to vale/styles/config/vocabularies/geant-jargon/accept.txt diff --git a/docs/vale/styles/custom/Contractions.yml b/vale/styles/custom/Contractions.yml similarity index 100% rename from docs/vale/styles/custom/Contractions.yml rename to vale/styles/custom/Contractions.yml