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/WFO/iptrunks.md b/docs/admin_guide/WFO/iptrunks.md new file mode 100644 index 0000000000000000000000000000000000000000..616b7a91623c30c63345a93623c257d9990be105 --- /dev/null +++ b/docs/admin_guide/WFO/iptrunks.md @@ -0,0 +1,80 @@ +# IP trunks + +IPtrunks are core links between two GÈANT routers. +IPtrunk 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 IPtrunk we do not use the canonical decomposition that leverages demarcation point. + +## Modelling and attributes + +The relevant attributes for an IPTrunk are the following| + +| Attribute name | Attribute type | Description | +| -------------- | -------------- | ----------- | +| geant_s_sid| String | 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 # FIXME| should be of PhyPortCapacity typeThe 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| ipaddress.IPv4Network|The IPv4 network used for this trunk.| +|iptrunk_ipv6_network| ipaddress.IPv6Network|The IPv6 network used for this trunk.| +|iptrunk_sideA_node| DeviceBlock|The router that hosts the A side of the trunk.| +|iptrunk_sideA_ae_iface| str|The name of the interface on which the trunk connects.| +|iptrunk_sideA_ae_geant_a_sid| str|The service ID of the interface.| +|iptrunk_sideA_ae_members| list[str] = Field(default_factory=list)|A list of interface members that make up the aggregated Ethernet interface.| +|iptrunk_sideA_ae_members_description| list[str] = Field(default_factory=list)|The list of descriptions that describe the list of interface members.| +|iptrunk_sideB_node| DeviceBlock|The router that hosts the B side of the trunk. It possesses the same attributes as the A-side, including the interfaces and its descriptions.| +|iptrunk_sideB_ae_iface| str | Same as iptrunk_sideA_ae_iface but for B side| +|iptrunk_sideB_ae_geant_a_sid| str | Same as iptrunk_sideA_ae_geant_a_sid but for B side | +|iptrunk_sideB_ae_members| list[str] = Field(default_factory=list) | Same as iptrunk_sideA_ae_members but for B side| +|iptrunk_sideB_ae_members_description| list[str] = Field(default_factory=list) | Same as iptrunk_sideA_ae_members_description but for B side| + + +## Workflows + +### Deployment + +This the workflow that brings the subscription from INACTIVE to PROVISIONING and finally to ACTIVE. +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 contains the subscription_id and the process_id. Included in this there is also 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 9000 to prevent traffic to pass. + + +### Undeployment + +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 evaquate traffic - and wait confirmation from an operator. +- Delete all the configuration (first dry then actual deletion): + - LAG anf members of the LAG + - reference in LLDP protocol (if juniper) + - reference in ISIS protocol +- Delete the IPv4/IPv6 networks from IPAM + + +### Modification + +To modify IPtrunks we have 2 different workflows: +- Modify ISIS metric - modifies protocols/isis/interface +- Modify Trunk interface - modifies lag interfaces and members. This is used to increase capacity or to change SID/Iface descriptions. + +In both cases, the strategy is to re-apply the necessary template to the configuration construct: using a "replace" strategy only the necessary modifications will be applied. + +At the time of writing, the deletion of members from an existing IPtrunk is not supported. + + +### Migration + diff --git a/docs/admin_guide/WFO/overview.md b/docs/admin_guide/WFO/overview.md new file mode 100644 index 0000000000000000000000000000000000000000..e415752b406c760658f1d598ee409c14d71bc7ef --- /dev/null +++ b/docs/admin_guide/WFO/overview.md @@ -0,0 +1,19 @@ +# Diagram + +``` mermaid +classDiagram + Site <|-- Router :belong + + class Site{ + +UUId name + +String phoneNumber + +String emailAddress + } + + class Router{ + +int studentNumber + +int averageMark + +isEligibleToEnrol() + +getSeminarsTaken() + } +``` \ No newline at end of file diff --git a/docs/admin_guide/WFO/routers.md b/docs/admin_guide/WFO/routers.md new file mode 100644 index 0000000000000000000000000000000000000000..932021c8fdcb60695d5c2472a69442f5a135040b --- /dev/null +++ b/docs/admin_guide/WFO/routers.md @@ -0,0 +1 @@ +# Routers diff --git a/docs/admin_guide/WFO/sites.md b/docs/admin_guide/WFO/sites.md new file mode 100644 index 0000000000000000000000000000000000000000..9b6c5094171b3a31d6db1c18e1982f65aed1f504 --- /dev/null +++ b/docs/admin_guide/WFO/sites.md @@ -0,0 +1 @@ +# Sites \ No newline at end of file diff --git a/docs/admin_guide/WFO/wfo.md b/docs/admin_guide/WFO/wfo.md new file mode 100644 index 0000000000000000000000000000000000000000..07e91122565aa6e984a3f030d2f060d24538eca9 --- /dev/null +++ b/docs/admin_guide/WFO/wfo.md @@ -0,0 +1,12 @@ +# Workflow Orchestrator + +## Modelling and workflows + +### [Sites](./sites.md) +### [Routers](./routers.md) +### [IPtrunks](./iptrunks.md) + +## Maintainance + +## Troubleshooting + diff --git a/docs/architecture/components/ansible/index.md b/docs/architecture/components/ansible/index.md new file mode 100644 index 0000000000000000000000000000000000000000..ab8b4fd1aa946678f6a95889ebf44900b2a94e38 --- /dev/null +++ b/docs/architecture/components/ansible/index.md @@ -0,0 +1 @@ +# Ansible \ No newline at end of file diff --git a/docs/architecture/components/netbox/index.md b/docs/architecture/components/netbox/index.md new file mode 100644 index 0000000000000000000000000000000000000000..da7a2fe04455216aec9381c3016d825f6a952f3b --- /dev/null +++ b/docs/architecture/components/netbox/index.md @@ -0,0 +1 @@ +# Netbox \ No newline at end of file diff --git a/docs/architecture/components/wfo/index.md b/docs/architecture/components/wfo/index.md new file mode 100644 index 0000000000000000000000000000000000000000..548ff3090099fd10c67b6cbe90aa14df73a32493 --- /dev/null +++ b/docs/architecture/components/wfo/index.md @@ -0,0 +1 @@ +# Workflow Orchestrator \ 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..1544872e1e6daa124451d49abe7aa3267e95f97f --- /dev/null +++ b/docs/architecture/dtap/acceptance.md @@ -0,0 +1 @@ +# Acceptance environment \ No newline at end of file diff --git a/docs/architecture/dtap/index.md b/docs/architecture/dtap/index.md new file mode 100644 index 0000000000000000000000000000000000000000..b4f2c951df712b244cfc9e3f6d135b01200a3cbb --- /dev/null +++ b/docs/architecture/dtap/index.md @@ -0,0 +1 @@ +# DTAP Process \ No newline at end of file diff --git a/docs/architecture/dtap/production.md b/docs/architecture/dtap/production.md new file mode 100644 index 0000000000000000000000000000000000000000..24ee30015f73dbf168b5a63aa274840d72e190ef --- /dev/null +++ b/docs/architecture/dtap/production.md @@ -0,0 +1 @@ +# Production environment \ No newline at end of file diff --git a/docs/architecture/dtap/test.md b/docs/architecture/dtap/test.md new file mode 100644 index 0000000000000000000000000000000000000000..3880e9486fbe3b01c5259153f1e423af49d22b6c --- /dev/null +++ b/docs/architecture/dtap/test.md @@ -0,0 +1 @@ +# Test environment diff --git a/docs/architecture/modeling/index.md b/docs/architecture/modeling/index.md deleted file mode 100644 index 815bf2641291dcdeb5ecd1b0ef1f5632a275b942..0000000000000000000000000000000000000000 --- a/docs/architecture/modeling/index.md +++ /dev/null @@ -1,24 +0,0 @@ -# Data models - -To be able to model network objects, a data model must exist for every configuration item in the network. This allows -for describing the network, and the services as a composition of abstract objects. - -## Decomposition of objects - -Every object -- both services and access ports -- is composed of the following building blocks: - -* Administrative metadata - * Object ID - * Status - * Owner -* Configuration data that depends on the specific service, some examples: - * Access port - * Access port type - * Physical interfaces - * IP trunk - * IPv4 network - * IPv6 network - * IS-IS metric -* Placement metadata - * Access node - * Service delivery point diff --git a/docs/architecture/modeling/ports.md b/docs/architecture/modeling/ports.md deleted file mode 100644 index 6be81fe452ff6bd2d70b95c14d3cbf1ee792acd7..0000000000000000000000000000000000000000 --- a/docs/architecture/modeling/ports.md +++ /dev/null @@ -1,34 +0,0 @@ -# Services and ports - -While a port shouldn't be configured in case there is no service insisting on it, it could happen that more than one -service is insisting on one port. For this reason, the following entities exist: - -SDP -: Service Delivery Point: the logical interface where a service is delivered - -GA -: Access Port: an access point into the GÉANT network - -GP -: Physical Port: the physical boundary for the GA - -GAN -: Access Node: the node where a service is delivered - -These concepts apply to both CFSes and IFSes. - - - -*A visualisation of how services insist on ports.* - -## Peer-to-peer and multipoint services - -There is a distinction between services -- as mentioned in [configuration (de)composition](#configuration-decomposition) --- between peer-to-peer and multipoint services. In both cases, SDP is the delivery point of a service. -However, for multipoint services customers are supposed to be dual-homed in at least two different GANs. - -To give some examples, the figure below shows a decomposition of a GeantIP service for an NREN. - - - -*A visualisation of an instance of a GeantIP service that consists of different configuration objects.* 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/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/image_sources/TNC23_diagrams.drawio b/docs/assets/images/image_sources/TNC23_diagrams.drawio new file mode 100644 index 0000000000000000000000000000000000000000..7e83102721cd79028422185e8073d09402aef0d2 --- /dev/null +++ b/docs/assets/images/image_sources/TNC23_diagrams.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/index.md b/docs/index.md index 5fbebdff0c259ae960a6116f4d29228626384515..7d9c90dab992e909070c1104db3e496e2d33c9b0 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,4 +1,32 @@ # GÉANT Automation Platform (GAP) -Welcome to the documentation of the GÉANT Automation Platform, or GAP for short. \ +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 and it summarise few years of experiments and initiatives in this field with the aim of fulfilling the following objectives: + +- to have a simple interface for managing network service lifecycle (provisioning, deprovisioning, modification) that ensures that the correct configuration is pushed on the network +- to have a platform - not a single product - that is capable of adapt and evolve according to GÉANT needs +- to have certainty that OSS/BSS systems are in sync with the actual configuration running in the network +- to introduce a different way of working that avoids fragmentation and silos. + +GAP is partially based on Open Source Software and partially internally developed and integrates with most of the tooling already in use in GÉANT. +More information about the GAP architecture is available in the [Architecture](./architecture/index.md) section. + + +## About this documentation portal + +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 +- [Legacy GAP](./legacy_platform/overview.md): provides operational guides of the legacy GAP platform based on Ansible and Jenkins +- [Admin guide](./admin_guide/index.md): covers the detail information of the domain models in WFO, the description of the workflows and all the ansible mechanics +- [User guide](./user_guide/index.md): provides operational guides of the Worflow Orchestrator based GAP + +The documentation provided in this portal is final and reviewed. For information about the ongoing work please refer to the wiki [GOAT Wiki](https://wiki.geant.org/display/NNAT/GOAT+-+Geant+Orchestration+and+Automation+Team) + +Also this documentation does not cover the design of network services, just the modelling and the mechanics related with automation. + + diff --git a/docs/overview/index.md b/docs/overview/index.md deleted file mode 100644 index c8d6d9d5c0a8bd04a9429b3f426855503893e32b..0000000000000000000000000000000000000000 --- a/docs/overview/index.md +++ /dev/null @@ -1,23 +0,0 @@ -# Overview - -Configuration management is the process that maintains consistency and integrity of the network and of the services -built on top of it. It ensures that the network meets requirements in terms of functionalities, performance, and -security. - -In the context of the IP/MPLS layer and particularly the backbone routers, different teams manage configuration -in different ways. To deploy new nodes and to operate the network, they use various tools en methods. These tools check -compliance and quality afterward: this approach requires much manual work, and it's inherently error-prone. - -This project aims to standardize the configuration and the configuration deployment process. By using Open Source tools -and DevOps strategies there is one single framework to deploy and to operate. Considering the network configuration as -code and managing it under a version control system (GitLab) will enable better visibility and control of changes and -will help standardize the way of working. - -The goal is to reduce configuration drifts and exceptions, MTTR in case of fault, and possibly the -number and the severity of incidents. To verify configuration compliance before it gets deployed, several policies are -in place. Multiple non-production environments are used to automatically run regression and acceptance tests, in order -to ensure the highest quality and to detect problems early. - -Automated configuration management must be considered as the foundation of further work in network automation, towards -service orchestration trough different technology domains (Optical, IP/MPLS, Applications) and intent-based -networking. diff --git a/mkdocs.yml b/mkdocs.yml index a9df1a59cd6ee64c426b5d302d07b7fb306d604c..d20f4167f1728ab199f8b0c5d374294b28853142 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -20,7 +20,7 @@ theme: - navigation.instant - navigation.tracking - navigation.sections - - navigation.expand + - toc.integrate - navigation.path - navigation.indexes - content.code.copy @@ -43,12 +43,17 @@ extra_css: # Page tree nav: - Home: index.md - - Overview: overview/index.md - Architecture: - architecture/index.md - - Modeling: - - architecture/modeling/index.md - - Ports: architecture/modeling/ports.md + - DTAP: + - architecture/dtap/index.md + - Test: architecture/dtap/test.md + - Acceptance: architecture/dtap/acceptance.md + - Production: architecture/dtap/production.md + - Components: + - Ansible: architecture/components/ansible/index.md + - WorkflowOrchestrator: architecture/components/wfo/index.md + - Netbox: architecture/components/netbox/index.md - User Guide: - user_guide/index.md - Sites: @@ -58,7 +63,15 @@ nav: - user_guide/routers/index.md - user_guide/routers/deploy_router.md - IP Trunks: user_guide/iptrunks/index.md - - Admin Guide: admin_guide/index.md + - Admin Guide: + - admin_guide/index.md + - Ansible: + - admin_guide/Ansible/ansible.md + - WFO: + - Diagram: admin_guide/WFO/overview.md + - Sites: admin_guide/WFO/sites.md + - Routers: admin_guide/WFO/routers.md + - Iptrunks: admin_guide/WFO/iptrunks.md - Legacy Platform: - Overview: legacy_platform/overview.md - New Router Deployment: legacy_platform/new_router_deployment.md @@ -76,4 +89,8 @@ markdown_extensions: pygments_lang_class: true - pymdownx.inlinehilite - pymdownx.snippets - - pymdownx.superfences + - pymdownx.superfences: + custom_fences: + - name: mermaid + class: mermaid + format: !!python/name:pymdownx.superfences.fence_code_format