From 503181824b051eed3e5026d685e19a96d81a1224 Mon Sep 17 00:00:00 2001 From: Karel van Klink <karel.vanklink@geant.org> Date: Tue, 4 Apr 2023 10:06:45 +0200 Subject: [PATCH] Add documentation on data models Signed-off-by: Karel van Klink <karel.vanklink@geant.org> --- docs/architecture/index.md | 51 ++---------------- docs/glossary.md | 3 ++ docs/index.md | 9 +++- docs/modeling/index.md | 23 ++++++++ docs/modeling/ports.md | 38 +++++++++++++ docs/static/geant_ip_ports_diagram.png | Bin 0 -> 24056 bytes .../vale/styles/Vocab/geant-jargon/accept.txt | 3 ++ 7 files changed, 80 insertions(+), 47 deletions(-) create mode 100644 docs/modeling/index.md create mode 100644 docs/modeling/ports.md create mode 100644 docs/static/geant_ip_ports_diagram.png diff --git a/docs/architecture/index.md b/docs/architecture/index.md index e37b829..cca0329 100644 --- a/docs/architecture/index.md +++ b/docs/architecture/index.md @@ -8,7 +8,8 @@ versions all configuration, and it's also responsible for managing mechanisms su The stack of tools is kept limited: -* Ansible is the tool that deploys configuration and orchestrates changes. +* Workflow Orchestrator ({term}`WFO`) orchestrates all changes. +* Ansible is the tool that deploys configuration. * If needed, custom Python scripts can support extra functionality. This approach works well for the deployment of 'base configuration'. For service fulfillment, three more components are @@ -18,7 +19,10 @@ introduced: * A service database. * A workflow engine. +All three of these components are deployed as part of {term}`WFO`. More information about {term}`WFO` can be found on +their website <a href="https://workfloworchestrator.org/" target="_blank">here</a>. +(configuration-decomposition)= ## Configuration (de)composition The configuration of a network element can be decomposed in different functional parts: @@ -75,48 +79,3 @@ All services offered can be summarised in the following four categories. Some ex |---------|-------------|------------------| | Layer 2 | VPLS / EVPN | Layer 2 circuits | | Layer 3 | L3VPN | Core links | - -### 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 - - -### Services and ports - -While a port shouldn't be configured in case there is no service insisting on it, it could happen that multiple -services are insisting on the same port. For this reason, we define the following entities: - -{term}`SDP` -: Service Delivery Point: the logical interface where a service is delivered - -{term}`GA` -: Access Port: an access point into the GÉANT network - -{term}`GP` -: Physical Port: the physical boundary for the {term}`GA` - -{term}`GAN` -: Access Node: the node where a service is delivered - -These concepts apply to both {term}`CFS`es and {term}`IFS`es. - -```{figure} ../static/access_port_diagram.png -:alt: Diagram that displays the different entities that make up a GÉANT service. - -A visualisation of how services insist on ports. -``` diff --git a/docs/glossary.md b/docs/glossary.md index 64541eb..232a073 100644 --- a/docs/glossary.md +++ b/docs/glossary.md @@ -34,6 +34,9 @@ MPLS MTTR : Mean Time To Repair +MTU +: Maximum Transmission Unit + OOB : Out-of-band diff --git a/docs/index.md b/docs/index.md index 528a162..b567f7e 100644 --- a/docs/index.md +++ b/docs/index.md @@ -3,7 +3,7 @@ Welcome to the documentation of the GÉANT Automation Platform, or {term}`GAP` for short. \ The focus of this platform is configuration management and service orchestration for the GÉANT IP/{term}`MPLS` network. -This documentation contains the following sections: +This documentation has the following sections: ```{toctree} :caption: Background @@ -12,6 +12,13 @@ overview/index.md architecture/index.md ``` +```{toctree} +:caption: Modeling +:maxdepth: 2 +modeling/index.md +modeling/ports.md +``` + ```{toctree} :caption: Processes :maxdepth: 2 diff --git a/docs/modeling/index.md b/docs/modeling/index.md new file mode 100644 index 0000000..e883929 --- /dev/null +++ b/docs/modeling/index.md @@ -0,0 +1,23 @@ +# 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/modeling/ports.md b/docs/modeling/ports.md new file mode 100644 index 0000000..99e1cb9 --- /dev/null +++ b/docs/modeling/ports.md @@ -0,0 +1,38 @@ +# 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: + +{term}`SDP` +: Service Delivery Point: the logical interface where a service is delivered + +{term}`GA` +: Access Port: an access point into the GÉANT network + +{term}`GP` +: Physical Port: the physical boundary for the {term}`GA` + +{term}`GAN` +: Access Node: the node where a service is delivered + +These concepts apply to both {term}`CFS`es and {term}`IFS`es. + +```{figure} ../static/access_port_diagram.png +:alt: Diagram that displays the different entities that make up a GÉANT service. + +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, {term}`SDP` is the delivery point of a service. +However, for multipoint services customers are supposed to be dual-homed in at least two different {term}`GAN`s. + +To give some examples, the figure below shows a decomposition of a GeantIP service for an NREN. + +```{figure} ../static/geant_ip_ports_diagram.png +:alt: Diagram that displays the different entities that make up a GeantIP service instance. + +A visualisation of an instance of a GeantIP service that consists of different configuration objects. +``` diff --git a/docs/static/geant_ip_ports_diagram.png b/docs/static/geant_ip_ports_diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..5e72025208d9a219a648a0507242dd29a68dd3ad GIT binary patch literal 24056 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 literal 0 HcmV?d00001 diff --git a/docs/vale/styles/Vocab/geant-jargon/accept.txt b/docs/vale/styles/Vocab/geant-jargon/accept.txt index b164bf9..670f894 100644 --- a/docs/vale/styles/Vocab/geant-jargon/accept.txt +++ b/docs/vale/styles/Vocab/geant-jargon/accept.txt @@ -17,3 +17,6 @@ GAP WFO BGP FXP +NREN +MTU +OOB -- GitLab