From 87a6e285c54a1ace843c5d259e4dc5f1463db9be Mon Sep 17 00:00:00 2001 From: "Documenter.jl" Date: Wed, 26 Jul 2023 23:32:20 +0000 Subject: [PATCH] build based on aae90e5 --- dev/API/index.html | 70 ++++++++++++++++++++-------------------- dev/index.html | 2 +- dev/roadmap/index.html | 2 +- dev/search/index.html | 2 +- dev/techpaper/index.html | 2 +- dev/usage/index.html | 2 +- 6 files changed, 40 insertions(+), 40 deletions(-) diff --git a/dev/API/index.html b/dev/API/index.html index 4b97b7d..f5b99d0 100644 --- a/dev/API/index.html +++ b/dev/API/index.html @@ -10,7 +10,7 @@ child::Intent, ii::MINDFul.IntentIssuer ) -> Union{Bool, IntentDAGNode{_A, _B, MINDFul.LogState{Unitful.Quantity{Float64, ๐“, Unitful.FreeUnits{(hr,), ๐“, nothing}}, IntentState}} where {_A<:Intent, _B<:MINDFul.IntentIssuer}} -

Add intent as to the DAG as a child to the intent with uuid parent.

source
MINDFul.addchild! โ€” Method
addchild!(
+

Add intent as to the DAG as a child to the intent with uuid parent.

source
MINDFul.addchild! โ€” Method
addchild!(
     idag::MetaGraphsNext.MetaGraph{Int64, Graphs.SimpleGraphs.SimpleDiGraph{Int64}, Base.UUID, IntentDAGNode, Nothing, MINDFul.IntentDAGInfo, MetaGraphsNext.var"#11#13", Float64},
     intent::Intent
 ) -> Union{Bool, IntentDAGNode{_A, MINDFul.MachineGenerated, MINDFul.LogState{Unitful.Quantity{Float64, ๐“, Unitful.FreeUnits{(hr,), ๐“, nothing}}, IntentState}} where _A<:Intent}
@@ -19,19 +19,19 @@
     intent::Intent,
     ii::MINDFul.IntentIssuer
 ) -> Union{Bool, IntentDAGNode{_A, _B, MINDFul.LogState{Unitful.Quantity{Float64, ๐“, Unitful.FreeUnits{(hr,), ๐“, nothing}}, IntentState}} where {_A<:Intent, _B<:MINDFul.IntentIssuer}}
-

Add intent as to the DAG idag as a root.

source
MINDFul.addintent! โ€” Method
addintent!(ibn::IBN, intent::Intent) -> Base.UUID
-

Add intent to ibn as Network Operator. Returns the intent id.

source
MINDFul.addintent! โ€” Method
addintent!(
+

Add intent as to the DAG idag as a root.

source
MINDFul.addintent! โ€” Method
addintent!(ibn::IBN, intent::Intent) -> Base.UUID
+

Add intent to ibn as Network Operator. Returns the intent id.

source
MINDFul.addintent! โ€” Method
addintent!(
     ibnissuer::MINDFul.IBNIssuer,
     ibnp::IBN,
     intent::Intent
 ) -> Base.UUID
-

The IBN client ibnc asks to add intent intent to provider ibnp

source
MINDFul.anyreservations โ€” Method
anyreservations(ibn) -> Bool
-

Checks if ibn has reserved something due to an intent or not

source
MINDFul.bordernodes โ€” Method
bordernodes(ibn::IBN; subnetwork_view) -> Any
-

Return the border nodes, i.e. the nodes belonging to a different domain, of the IBN. If subnetwork_view = true the nodes are returned as a Vector{Tuple{Int,Int}} identifying (CONTROLLER_INDEX, NODE_ID). If subnetwork_view = false the nodes are returned as Vector{Int} with each element being the index of the node in ibn.

source
MINDFul.connectIBNs! โ€” Method
connectIBNs!(
+

The IBN client ibnc asks to add intent intent to provider ibnp

source
MINDFul.anyreservations โ€” Method
anyreservations(ibn) -> Bool
+

Checks if ibn has reserved something due to an intent or not

source
MINDFul.bordernodes โ€” Method
bordernodes(ibn::IBN; subnetwork_view) -> Any
+

Return the border nodes, i.e. the nodes belonging to a different domain, of the IBN. If subnetwork_view = true the nodes are returned as a Vector{Tuple{Int,Int}} identifying (CONTROLLER_INDEX, NODE_ID). If subnetwork_view = false the nodes are returned as Vector{Int} with each element being the index of the node in ibn.

source
MINDFul.connectIBNs! โ€” Method
connectIBNs!(
     ibn::Vector{IBN},
     cedges::Vector{NestedGraphs.NestedEdge}
 )
-

Connect the ibn domains ibn using the global indexed Edges cedges.

source
MINDFul.connectIBNs! โ€” Method
connectIBNs!(
+

Connect the ibn domains ibn using the global indexed Edges cedges.

source
MINDFul.connectIBNs! โ€” Method
connectIBNs!(
     ibn1::IBN,
     ibn2::IBN,
     cedges::Array{NestedGraphs.NestedEdge{T}, 1}
@@ -42,7 +42,7 @@
     cedges::Array{NestedGraphs.NestedEdge{T}, 1},
     dprops::Union{Nothing, Array{Dict{Symbol, R}, 1}}
 ) -> Bool
-

Connect ibn1 and ibn2 with the edges cedges with properties dprops.

source
MINDFul.deploy! โ€” Method

Assume intent is root of DAG

source
MINDFul.deploy! โ€” Method

"

deploy!(
+

Connect ibn1 and ibn2 with the edges cedges with properties dprops.

source
MINDFul.deploy! โ€” Method

Assume intent is root of DAG

source
MINDFul.deploy! โ€” Method

"

deploy!(
     ibnc::IBN,
     ibns::IBN,
     idagn::IntentDAGNode,
@@ -52,89 +52,89 @@
     time,
     algargs...
 )
-

The IBN customer ibnc accesses the intent state machine of IBN server ibns and commands the IntentTransition itra for the intent DAG node idagn following the state-machine strategy IBNModus and the transition methodology algmethod.

source
MINDFul.deploy! โ€” Method

No algmethod provided

source
MINDFul.deploy! โ€” Method

Assume intent comes from Network Operator

source
MINDFul.descendants โ€” Method
descendants(
+

The IBN customer ibnc accesses the intent state machine of IBN server ibns and commands the IntentTransition itra for the intent DAG node idagn following the state-machine strategy IBNModus and the transition methodology algmethod.

source
MINDFul.deploy! โ€” Method

No algmethod provided

source
MINDFul.deploy! โ€” Method

Assume intent comes from Network Operator

source
MINDFul.descendants โ€” Method
descendants(
     dag::MetaGraphsNext.MetaGraph{Int64, Graphs.SimpleGraphs.SimpleDiGraph{Int64}, Base.UUID, IntentDAGNode, Nothing, MINDFul.IntentDAGInfo, MetaGraphsNext.var"#11#13", Float64},
     idn::IntentDAGNode;
     exclusive
 ) -> Vector{IntentDAGNode}
-

Get all descendants of DAG dag starting from node idn Set exclusive=true to get nodes that have idn as the only ancestor

source
MINDFul.edgeify โ€” Method

Converts a node path to a sequence of edges

source
MINDFul.getdistance โ€” Method
getdistance(
+

Get all descendants of DAG dag starting from node idn Set exclusive=true to get nodes that have idn as the only ancestor

source
MINDFul.edgeify โ€” Method

Converts a node path to a sequence of edges

source
MINDFul.getdistance โ€” Method
getdistance(
     fv::FiberView
 ) -> Unitful.Quantity{Float64, ๐‹, Unitful.FreeUnits{(km,), ๐‹, nothing}}
-

Get length of the fiber fv

source
MINDFul.getdistance โ€” Method
getdistance(ibn::IBN, path) -> Any
-

Get total distance of path in ibn

source
MINDFul.getintent โ€” Method
getintent(ibn::IBN, uuid::Base.UUID) -> Intent
-
source
MINDFul.getintentidxsfromissuer โ€” Method
getintentidxsfromissuer(
+

Get length of the fiber fv

source
MINDFul.getdistance โ€” Method
getdistance(ibn::IBN, path) -> Any
+

Get total distance of path in ibn

source
MINDFul.getintent โ€” Method
getintent(ibn::IBN, uuid::Base.UUID) -> Intent
+
source
MINDFul.getintentidxsfromissuer โ€” Method
getintentidxsfromissuer(
     ibn::IBN,
     ibnid::Int64,
     dagid::Int64
 )
-

Get all intent indices from ibn to which the issuer is the IBN with id ibnid and delegated intent dagid.

source
MINDFul.getintentidxsfromissuer โ€” Method
getintentidxsfromissuer(ibn::IBN, ibnid::Int64)
-

Get all intent indices from ibn to which the issuer is the IBN with id ibnid.

source
MINDFul.getintentissuer โ€” Method
getintentissuer(ibn::IBN, uuid::Int64)
-

Get the issuer of the intent with id intid in ibn

source
MINDFul.getintentnode โ€” Method
getintentnode(ibn::IBN, uuid::Base.UUID) -> IntentDAGNode
-
source
MINDFul.getnode โ€” Method
getnode(i::MINDFul.NodeRouterPortIntent) -> Any
-

Get all intents from the intent DAG dag

source
MINDFul.getremoteintentsid โ€” Method
getremoteintentsid(
+

Get all intent indices from ibn to which the issuer is the IBN with id ibnid and delegated intent dagid.

source
MINDFul.getintentidxsfromissuer โ€” Method
getintentidxsfromissuer(ibn::IBN, ibnid::Int64)
+

Get all intent indices from ibn to which the issuer is the IBN with id ibnid.

source
MINDFul.getintentissuer โ€” Method
getintentissuer(ibn::IBN, uuid::Int64)
+

Get the issuer of the intent with id intid in ibn

source
MINDFul.getintentnode โ€” Method
getintentnode(ibn::IBN, uuid::Base.UUID) -> IntentDAGNode
+
source
MINDFul.getnode โ€” Method
getnode(i::MINDFul.NodeRouterPortIntent) -> Any
+

Get all intents from the intent DAG dag

source
MINDFul.getremoteintentsid โ€” Method
getremoteintentsid(
     ibn::IBN,
     idn::IntentDAGNode
 ) -> Vector{Tuple{Int64, Base.UUID}}
-

Get all RemoteIntents of dag of ibn

source
MINDFul.globalnode โ€” Method
globalnode(ibn::IBN, node::Int64) -> Tuple{Int64, Int64}
-

Return the global indexing of the node Tuple{Int,Int}, i.e., (IBN_ID, NODE_ID)

source
MINDFul.issatisfied โ€” Method

onlylogic is WIP

source
MINDFul.issatisfied โ€” Method
issatisfied(
+

Get all RemoteIntents of dag of ibn

source
MINDFul.globalnode โ€” Method
globalnode(ibn::IBN, node::Int64) -> Tuple{Int64, Int64}
+

Return the global indexing of the node Tuple{Int,Int}, i.e., (IBN_ID, NODE_ID)

source
MINDFul.issatisfied โ€” Method

onlylogic is WIP

source
MINDFul.issatisfied โ€” Method
issatisfied(
     ibn::IBN,
     idagn::IntentDAGNode{I<:Intent};
     exactly
 ) -> Bool
-

Check if intent of ibn,idagn is satisfied. It checks whether the implementation of the intent makes sense and if all constraints are satisfied. Internally it retrieves all low-level intents, assembles them, and decides whether or not they satisfy the intent.

This function assumes global knowledge to reach a verdict. For this reason it is clearly a function used for simulation purposes.

source
MINDFul.issatisfied โ€” Method
issatisfied(
+

Check if intent of ibn,idagn is satisfied. It checks whether the implementation of the intent makes sense and if all constraints are satisfied. Internally it retrieves all low-level intents, assembles them, and decides whether or not they satisfy the intent.

This function assumes global knowledge to reach a verdict. For this reason it is clearly a function used for simulation purposes.

source
MINDFul.issatisfied โ€” Method
issatisfied(
     globalIBNnllis::Vector{MINDFul.IBNnIntentGLLI},
     vcs::Array{K<:Union{Missing, MINDFul.ConnectionState}, 1},
     cc::CapacityConstraint
 ) -> Bool
-

Check whether the gloval low-level intents globalIBNnllis and their logical states vcs satisfy the capacity constraints cc. Low Level Intents are assumed to be installed now.

source
MINDFul.issatisfied โ€” Method
issatisfied(
+

Check whether the gloval low-level intents globalIBNnllis and their logical states vcs satisfy the capacity constraints cc. Low Level Intents are assumed to be installed now.

source
MINDFul.issatisfied โ€” Method
issatisfied(
     globalIBNnllis::Vector{MINDFul.IBNnIntentGLLI},
     vcs::Array{K<:Union{Missing, MINDFul.ConnectionState}, 1},
     cc::DelayConstraint
 ) -> Bool
-

Check whether the gloval low-level intents globalIBNnllis and their logical states vcs satisfy the constraints cc. Low Level Intents are assumed to be installed now.

source
MINDFul.issatisfied โ€” Method
issatisfied(
+

Check whether the gloval low-level intents globalIBNnllis and their logical states vcs satisfy the constraints cc. Low Level Intents are assumed to be installed now.

source
MINDFul.issatisfied โ€” Method
issatisfied(
     globalIBNnllis::Vector{MINDFul.IBNnIntentGLLI},
     vcs::Array{K<:Union{Missing, MINDFul.ConnectionState}, 1},
     cc::GoThroughConstraint
 ) -> Bool
-
source
MINDFul.issatisfied โ€” Method
issatisfied(
+
source
MINDFul.issatisfied โ€” Method
issatisfied(
     globalIBNnllis::Vector{MINDFul.IBNnIntentGLLI},
     vcs::Array{K<:Union{Missing, MINDFul.ConnectionState}, 1},
     cc::MINDFul.BorderInitiateConstraint
 ) -> Bool
-
source
MINDFul.issatisfied โ€” Method
issatisfied(
+
source
MINDFul.issatisfied โ€” Method
issatisfied(
     globalIBNnllis::Vector{MINDFul.IBNnIntentGLLI},
     vcs::Array{K<:Union{Missing, MINDFul.ConnectionState}, 1},
     cc::MINDFul.ReverseConstraint
 ) -> Bool
-
source
MINDFul.issatisfied โ€” Method
issatisfied(
+
source
MINDFul.issatisfied โ€” Method
issatisfied(
     ibn::IBN,
     nri::IntentDAGNode{R<:MINDFul.NodeRouterPortIntent}
 ) -> Bool
-

Check if the NodeRouterIntent nri of is satisfied in ibn.

source
MINDFul.issatisfied โ€” Method
issatisfied(
+

Check if the NodeRouterIntent nri of is satisfied in ibn.

source
MINDFul.issatisfied โ€” Method
issatisfied(
     ibn::IBN,
     nsi::IntentDAGNode{R<:MINDFul.NodeSpectrumIntent}
 ) -> Bool
-

Check if the NodeSpectrumIntent nsi is satisfied in ibn.

source
MINDFul.issatisfied โ€” Method
issatisfied(
+

Check if the NodeSpectrumIntent nsi is satisfied in ibn.

source
MINDFul.issatisfied โ€” Method
issatisfied(
     ibn::IBN,
     nri::IntentDAGNode{R<:MINDFul.NodeTransmoduleIntent}
 ) -> Bool
-

Check if the NodeRouterIntent nri of is satisfied in ibn.

source
MINDFul.nestedGraph2IBNs! โ€” Method
nestedGraph2IBNs!(
+

Check if the NodeRouterIntent nri of is satisfied in ibn.

source
MINDFul.nestedGraph2IBNs! โ€” Method
nestedGraph2IBNs!(
     globalnet::NestedGraphs.NestedGraph
 ) -> Vector{IBN{SDNdummy{Int64}}}
-

Convert globalnet to a NestedGraph using IBN framework instances and SDN controllers.

source
MINDFul.remintent! โ€” Method
remintent!(ibn::IBN, uuid::Base.UUID) -> Bool
-

Remove intent with id idi from ibn. Returns true if successful.

source
MINDFul.remintent! โ€” Method
remintent!(
+

Convert globalnet to a NestedGraph using IBN framework instances and SDN controllers.

source
MINDFul.remintent! โ€” Method
remintent!(ibn::IBN, uuid::Base.UUID) -> Bool
+

Remove intent with id idi from ibn. Returns true if successful.

source
MINDFul.remintent! โ€” Method
remintent!(
     ibnc::MINDFul.IBNIssuer,
     ibns::IBN,
     uuid::Base.UUID
 ) -> Bool
-

The IBN client ibnc asks to remove intent with id intentid to provider ibnp

source
MINDFul.set_operation_status! โ€” Method
set_operation_status!(
+

The IBN client ibnc asks to remove intent with id intentid to provider ibnp

source
MINDFul.set_operation_status! โ€” Method
set_operation_status!(
     ibn::IBN,
     device::FiberView,
     status::Bool;
     time,
     forcelog
 )
-

Set fiber device of ibn at status status in time time. Use forcelog to force or not a logging.

source
MINDFul.simgraph โ€” Method
simgraph(
+

Set fiber device of ibn at status status in time time. Use forcelog to force or not a logging.

source
MINDFul.simgraph โ€” Method
simgraph(
     ng::NestedGraphs.NestedGraph;
     router_lcpool,
     router_lccpool,
@@ -142,7 +142,7 @@
     transponderset,
     distance_method
 )
-

Builds a nested graph from ng able to simulate.

source
MINDFul.simgraph โ€” Method
simgraph(
+

Builds a nested graph from ng able to simulate.

source
MINDFul.simgraph โ€” Method
simgraph(
     mgr::MetaGraphs.MetaDiGraph;
     router_lcpool,
     router_lccpool,
@@ -150,4 +150,4 @@
     transponderset,
     distance_method
 )
-

Builds a graph from mgr able to simulate. Pass in mgr having:

  • :routerports as integer in every node
  • :xcoord as integer in every node
  • :ycoord as integer in every node
  • :oxc as boolean in every node
  • :fiberslots as int in every link

Get as an output a MetaGraph having:

  • :xcoord as integer in every node
  • :ycoord as integer in every node
  • :router as RouterView in every node
  • :link as FiberView in every edge
source
MINDFul.ConnectivityIntent โ€” Type
struct ConnectivityIntent{C, R} <: Intent
  • src::Tuple{Int64, Int64}: Source node as (IBN.id, node-id)

  • dst::Tuple{Int64, Int64}: Destination node as (IBN.id, node-id)

  • rate::Float64: Rate in Gbps

  • constraints::Any: Intents constraints

  • conditions::Any: Intents conditions

Intent for connecting 2 nodes

source
MINDFul.IBN โ€” Type
struct IBN{T<:SDN}
  • id::Int64: id of IBN

  • intents::MetaGraphsNext.MetaGraph{Int64, Graphs.SimpleGraphs.SimpleDiGraph{Int64}, Base.UUID, IntentDAGNode, Nothing, MINDFul.IntentDAGInfo, MetaGraphsNext.var"#11#13", Float64}: The intent collection of the IBN Framework

  • controllers::Array{Union{IBN, T}, 1} where T<:SDN: The collection of SDNs controlled from this IBN Framework and interacting IBNs (future should be IBN-NBIs)

  • ngr::NestedGraphs.NestedMetaGraph{Int64, MetaGraphs.MetaDiGraph{Int64, Float64}, MetaGraphs.MetaDiGraph{Int64, Float64}}: Nested Graph consisting of the several SDNs ngr is a shallow copy of the sdn graphs, meaning all PHY information is available in the IBN

  • interprops::Dict{Int64, MINDFul.IBNInterProps}: InterIBN interoperability with key being the IBN id

The Intent Framework The intent id is the vector index controllers must have same length with ngr.grv

source
MINDFul.IBN โ€” Method

Empty constructor

source
MINDFul.IntentDAGNode โ€” Type
mutable struct IntentDAGNode{T<:Intent, I<:MINDFul.IntentIssuer, L<:MINDFul.LogState}
  • intent::Intent

  • state::IntentState

  • id::Base.UUID

  • issuer::MINDFul.IntentIssuer

  • logstate::MINDFul.LogState

source
MINDFul.LightpathIntent โ€” Type
struct LightpathIntent{T, C} <: Intent
  • path::Vector{Int64}: Flow path

  • rate::Float64: Rate in Gbps

  • transmodl::Any

  • constraints::Any

source
MINDFul.SDNdummy โ€” Type

A dummy SDN controller to use for research and experiment purposes. This SDN controller is directly connected with the simulated physical layer network resources SimNetResou.jl

  • gr::MetaGraphs.MetaDiGraph{T} where T: network of SDN

  • interprops::Dict{NestedGraphs.NestedEdge, Dict{Symbol, Any}}: inter domain equipment(e.g. links)

source

Index

+

Builds a graph from mgr able to simulate. Pass in mgr having:

Get as an output a MetaGraph having:

source
MINDFul.ConnectivityIntent โ€” Type
struct ConnectivityIntent{C, R} <: Intent
  • src::Tuple{Int64, Int64}: Source node as (IBN.id, node-id)

  • dst::Tuple{Int64, Int64}: Destination node as (IBN.id, node-id)

  • rate::Float64: Rate in Gbps

  • constraints::Any: Intents constraints

  • conditions::Any: Intents conditions

Intent for connecting 2 nodes

source
MINDFul.IBN โ€” Type
struct IBN{T<:SDN}
  • id::Int64: id of IBN

  • intents::MetaGraphsNext.MetaGraph{Int64, Graphs.SimpleGraphs.SimpleDiGraph{Int64}, Base.UUID, IntentDAGNode, Nothing, MINDFul.IntentDAGInfo, MetaGraphsNext.var"#11#13", Float64}: The intent collection of the IBN Framework

  • controllers::Array{Union{IBN, T}, 1} where T<:SDN: The collection of SDNs controlled from this IBN Framework and interacting IBNs (future should be IBN-NBIs)

  • ngr::NestedGraphs.NestedMetaGraph{Int64, MetaGraphs.MetaDiGraph{Int64, Float64}, MetaGraphs.MetaDiGraph{Int64, Float64}}: Nested Graph consisting of the several SDNs ngr is a shallow copy of the sdn graphs, meaning all PHY information is available in the IBN

  • interprops::Dict{Int64, MINDFul.IBNInterProps}: InterIBN interoperability with key being the IBN id

The Intent Framework The intent id is the vector index controllers must have same length with ngr.grv

source
MINDFul.IBN โ€” Method

Empty constructor

source
MINDFul.IntentDAGNode โ€” Type
mutable struct IntentDAGNode{T<:Intent, I<:MINDFul.IntentIssuer, L<:MINDFul.LogState}
  • intent::Intent

  • state::IntentState

  • id::Base.UUID

  • issuer::MINDFul.IntentIssuer

  • logstate::MINDFul.LogState

source
MINDFul.LightpathIntent โ€” Type
struct LightpathIntent{T, C} <: Intent
  • path::Vector{Int64}: Flow path

  • rate::Float64: Rate in Gbps

  • transmodl::Any

  • constraints::Any

source
MINDFul.SDNdummy โ€” Type

A dummy SDN controller to use for research and experiment purposes. This SDN controller is directly connected with the simulated physical layer network resources SimNetResou.jl

  • gr::MetaGraphs.MetaDiGraph{T} where T: network of SDN

  • interprops::Dict{NestedGraphs.NestedEdge, Dict{Symbol, Any}}: inter domain equipment(e.g. links)

source

Index

diff --git a/dev/index.html b/dev/index.html index 53414ed..b81f62d 100644 --- a/dev/index.html +++ b/dev/index.html @@ -1,2 +1,2 @@ -Introduction ยท MINDFul.jl

MINDFul.jl

MINDFul.jl is a Framework for Intent-driven Multi-Domain Networks coordination. It provides the means for algorithmic research in the field of IP-Optical networking. It includes a stateful representation of common networking equipment and facilitates event-based simulations.

Companion repos

Companion repositories:

For example, have a look in a notebook related to our latest work on using intent DAGs in multi-domain IP-optical networks.

Introduction to intent-driven networking

Intent-driven Networking, or Intent-based Networking (IBN), is a paradigm that enables network operators to manage their network by expressing high-level desires (or intentions). Contrary to traditional rule-based or policy-based networking, in IBN, the network operator only needs to express WHAT needs to be done and not HOW. That means there is a shift towards a more declarative way of thinking.

Intents

The building blocks of operating an intent-driven network are the intents, which, as described before, are the desires. The intents specify in an abstract way what needs to be done and under what requirements. From this point on, it is the task of the intent framework and not the network operator to process these intents and successfully produce an appropriate network configuration.

Each intent, once entered the network, is described by a state, the most common of which are:

  • uncompiled: intent is just registered in the system and nothing more
  • compiled: there is an implementation of an intent
  • compiledfailed: compilation of the intent failed (e.g., due to scarce resources)
  • uninstalled: intent is compiled but still not active in the network
  • installed: intent is compiled and installed in the appropriate network elements
  • installfailed: installation of the intent failed (e.g., due to network fault)

To compile an intent, MINDful.jl follows a novel technique where system-generated intents are produced and compiled, forming an intent tree. The more down we traverse the tree, the less abstract the intents become. The leaves of the tree are called low-level intents and are device-level intents.

IBN can be applied anywhere in the OSI layers. However, MINDFul.jl is focused on the IP-Optical layers. An example of such an intent would be a connectivity intent between 2 nodes with specific QoS requirements.

Software-Defined Networking (SDN)

IBN is commonly placed on top of an SDN controller. SDN separates the control and the data plane in a network. In other words, and as the name might suggest, SDN provides programmable reconfigurable networks. This is commonly achieved by having a centralized controller with global network knowledge and the ability to control and monitor the network elements.

IBN over SDN architecture

MINDFul.jl follows the common architecture of placing the IBN framework on top of the SDN controller. The IBN framework contains all the logic and the intent system, and the SDN controller is the mediator that talks to the network devices. The SDN controller is necessary the same way a driver is for a computer. We might even have a stack of IBN framework instances before we end up with the driver being the SDN controller. This might be common for centralized multi-domain control.

Multi-Domain (MD) networking

MD networking is a rather broad term and can span across different scenarios, such as:

  • centralized-controlled domains with global knowledge
  • decentralized-controlled domains with global knowledge
  • decentralized-controlled domains with partial knowledge

The last scenario can be applied to domains belonging to different organizations, which is what the current package targets at best.

Role of MINDFul.jl

MINDFul.jl is a tool to facilitate research on state-of-the-art algorithms in decentralized multi-domain intent-driven networking. It provides interfaces to investigate various coordination and intent provision mechanisms.

+Introduction ยท MINDFul.jl

MINDFul.jl

MINDFul.jl is a Framework for Intent-driven Multi-Domain Networks coordination. It provides the means for algorithmic research in the field of IP-Optical networking. It includes a stateful representation of common networking equipment and facilitates event-based simulations.

Companion repos

Companion repositories:

For example, have a look in a notebook related to our latest work on using intent DAGs in multi-domain IP-optical networks.

Introduction to intent-driven networking

Intent-driven Networking, or Intent-based Networking (IBN), is a paradigm that enables network operators to manage their network by expressing high-level desires (or intentions). Contrary to traditional rule-based or policy-based networking, in IBN, the network operator only needs to express WHAT needs to be done and not HOW. That means there is a shift towards a more declarative way of thinking.

Intents

The building blocks of operating an intent-driven network are the intents, which, as described before, are the desires. The intents specify in an abstract way what needs to be done and under what requirements. From this point on, it is the task of the intent framework and not the network operator to process these intents and successfully produce an appropriate network configuration.

Each intent, once entered the network, is described by a state, the most common of which are:

  • uncompiled: intent is just registered in the system and nothing more
  • compiled: there is an implementation of an intent
  • compiledfailed: compilation of the intent failed (e.g., due to scarce resources)
  • uninstalled: intent is compiled but still not active in the network
  • installed: intent is compiled and installed in the appropriate network elements
  • installfailed: installation of the intent failed (e.g., due to network fault)

To compile an intent, MINDful.jl follows a novel technique where system-generated intents are produced and compiled, forming an intent tree. The more down we traverse the tree, the less abstract the intents become. The leaves of the tree are called low-level intents and are device-level intents.

IBN can be applied anywhere in the OSI layers. However, MINDFul.jl is focused on the IP-Optical layers. An example of such an intent would be a connectivity intent between 2 nodes with specific QoS requirements.

Software-Defined Networking (SDN)

IBN is commonly placed on top of an SDN controller. SDN separates the control and the data plane in a network. In other words, and as the name might suggest, SDN provides programmable reconfigurable networks. This is commonly achieved by having a centralized controller with global network knowledge and the ability to control and monitor the network elements.

IBN over SDN architecture

MINDFul.jl follows the common architecture of placing the IBN framework on top of the SDN controller. The IBN framework contains all the logic and the intent system, and the SDN controller is the mediator that talks to the network devices. The SDN controller is necessary the same way a driver is for a computer. We might even have a stack of IBN framework instances before we end up with the driver being the SDN controller. This might be common for centralized multi-domain control.

Multi-Domain (MD) networking

MD networking is a rather broad term and can span across different scenarios, such as:

  • centralized-controlled domains with global knowledge
  • decentralized-controlled domains with global knowledge
  • decentralized-controlled domains with partial knowledge

The last scenario can be applied to domains belonging to different organizations, which is what the current package targets at best.

Role of MINDFul.jl

MINDFul.jl is a tool to facilitate research on state-of-the-art algorithms in decentralized multi-domain intent-driven networking. It provides interfaces to investigate various coordination and intent provision mechanisms.

diff --git a/dev/roadmap/index.html b/dev/roadmap/index.html index bcf9990..1eaba0b 100644 --- a/dev/roadmap/index.html +++ b/dev/roadmap/index.html @@ -1,2 +1,2 @@ -Roadmap ยท MINDFul.jl

Roadmap

MINDFul.jl is an effort meant to help parties interested in the reasearch of intent-driven network coordination. Future additions are going to be determined by our research directions. However the following consitute a list of plans that are irrelevant to research purposes

  • complete substitution of MetaGraphs by MetaGraphsNext
  • integration of Term.jl for more beautifl command-line operation
  • definition of line rate units with Unitful.jl
  • more user-friendly interfaces and improved docs

Although much of similar software is commonly proprietary, there has been some development for open-source SDN controllers, among which the ones used for serious deployment are ONOS and OpenDaylight (ODL), written in Java. These frameworks adapted to the IBN paradigm by gradually enhancing their architecture, resulting in an unclear separation between SDN and IBN. While MINDFul.jl cannot be compared with ONOS or ODL, to our knowledge, it is unique in that it offers a clear distinction between IBN and SDN, where the focus indisputably resides on the IBN side. However, future aspirations include binding MINDFul.jl with real-life SDN controllers. Due to the clear decoupling in MINDFul.jl this is possible, but we need to accept that it will require a serious amount of developer time. Another obstacle is the unstandardized IBN Southbound-Interface (SBI), which leaves a customized binding with the chosen SDN controller as the only option. Instead, for now, MINDFul.jl only provides a dummy SDN Controller, which supports only simulations.

+Roadmap ยท MINDFul.jl

Roadmap

MINDFul.jl is an effort meant to help parties interested in the reasearch of intent-driven network coordination. Future additions are going to be determined by our research directions. However the following consitute a list of plans that are irrelevant to research purposes

  • complete substitution of MetaGraphs by MetaGraphsNext
  • integration of Term.jl for more beautifl command-line operation
  • definition of line rate units with Unitful.jl
  • more user-friendly interfaces and improved docs

Although much of similar software is commonly proprietary, there has been some development for open-source SDN controllers, among which the ones used for serious deployment are ONOS and OpenDaylight (ODL), written in Java. These frameworks adapted to the IBN paradigm by gradually enhancing their architecture, resulting in an unclear separation between SDN and IBN. While MINDFul.jl cannot be compared with ONOS or ODL, to our knowledge, it is unique in that it offers a clear distinction between IBN and SDN, where the focus indisputably resides on the IBN side. However, future aspirations include binding MINDFul.jl with real-life SDN controllers. Due to the clear decoupling in MINDFul.jl this is possible, but we need to accept that it will require a serious amount of developer time. Another obstacle is the unstandardized IBN Southbound-Interface (SBI), which leaves a customized binding with the chosen SDN controller as the only option. Instead, for now, MINDFul.jl only provides a dummy SDN Controller, which supports only simulations.

diff --git a/dev/search/index.html b/dev/search/index.html index aefe346..28d5494 100644 --- a/dev/search/index.html +++ b/dev/search/index.html @@ -1,2 +1,2 @@ -Search ยท MINDFul.jl

Loading search...

    +Search ยท MINDFul.jl

    Loading search...

      diff --git a/dev/techpaper/index.html b/dev/techpaper/index.html index 408ce02..f943915 100644 --- a/dev/techpaper/index.html +++ b/dev/techpaper/index.html @@ -1,4 +1,4 @@ Technical Report Paper ยท MINDFul.jl
      + diff --git a/dev/usage/index.html b/dev/usage/index.html index 2f77392..656832b 100644 --- a/dev/usage/index.html +++ b/dev/usage/index.html @@ -1,2 +1,2 @@ -Usage and Examples ยท MINDFul.jl

      Usage and Examples

      To see all functionalities head to the API documentation. You can find some example notebooks in this repository.

      Indexing nodes, edges, intents, and domains

      As we deal with multi-domain scenarios with partial knowledge, it becomes obvious that there cannot be a single way to identify a node or edge since some nodes are not visible from outside a domain. However, an internal node might be needed to be addressed by external parties due to an intent statement. This leads to different indexing schemes that must be directed for intra-domain and inter-domain usage.

      In MINDFul.jl, we follow the example of Graphs.jl and we index nodes as a sequence of Integers.

      Intra-domain indexing

      The indexing of nodes for intra-domain usage is done just by a sequence of NODE_ID::Integer numbers. This means that the edges are defined as Edge(src::Integer, dst::Integer).

      Controller-level indexing

      Intra-domain might not be so "intra". With the term intra-domain network, we refer to a network that has centralized control and belongs to one entity, i.e., network operator. However, this does not stop the network operator from logically separating the network. This could be done by having different SDN controllers responsible for different areas. Since the SDN controllers have partial knowledge of the network, a different indexing scheme is needed. So the same node, indexed before with a single Integer number, can now also be indexed with a Tuple{::Integer, ::Integer}. The first element of the Tuple is the id of the controller responsible for this node, and the second element is the local indexing of this node in the controller. In other words, a node can also be addressed as (CONTROLLER_ID, NODE_ID_IN_CONTROLLER). The CONTROLLER_ID might not always belong to an SDN controller as we might either have a stack of IBN framework instances, or the referenced node is a border node, i.e., belongs to a different domain, and then the IBN framework instance of the neighbor domain must be referenced.

      To express this structure programmatically, we make use of the NestedGraphs.jl package, where nodes are defined with a Tuple and edges with a NestedEdge where src and dst are Tuple{::Integer, Integer}.

      Inter-domain indexing

      Scaling up the previous idea, a domain node might also be globally referenced with a Tuple {::Integer, ::Integer}. This time the first element is the IBN domain id, and the second element is the node id inside the network as in Intra-domain indexing. In other words, a node can be addressed as (DOMAIN_ID, NODE_ID). The higher stacked IBN framework instance id is used to identify the domain. An edge can also be addressed globally with a NestedEdge.

      Intents indexing

      An intent can be globally indexed with a Tuple{::Integer, ::UUID}, i.e., (DOMAIN_ID, INTENT_ID). All (compiled) intents in a IBN domain are part of a DAG (Directed Acyclic Graph). You can access the DAG of an ibn::IBN with the ibn.intents field.

      +Usage and Examples ยท MINDFul.jl

      Usage and Examples

      To see all functionalities head to the API documentation. You can find some example notebooks in this repository.

      Indexing nodes, edges, intents, and domains

      As we deal with multi-domain scenarios with partial knowledge, it becomes obvious that there cannot be a single way to identify a node or edge since some nodes are not visible from outside a domain. However, an internal node might be needed to be addressed by external parties due to an intent statement. This leads to different indexing schemes that must be directed for intra-domain and inter-domain usage.

      In MINDFul.jl, we follow the example of Graphs.jl and we index nodes as a sequence of Integers.

      Intra-domain indexing

      The indexing of nodes for intra-domain usage is done just by a sequence of NODE_ID::Integer numbers. This means that the edges are defined as Edge(src::Integer, dst::Integer).

      Controller-level indexing

      Intra-domain might not be so "intra". With the term intra-domain network, we refer to a network that has centralized control and belongs to one entity, i.e., network operator. However, this does not stop the network operator from logically separating the network. This could be done by having different SDN controllers responsible for different areas. Since the SDN controllers have partial knowledge of the network, a different indexing scheme is needed. So the same node, indexed before with a single Integer number, can now also be indexed with a Tuple{::Integer, ::Integer}. The first element of the Tuple is the id of the controller responsible for this node, and the second element is the local indexing of this node in the controller. In other words, a node can also be addressed as (CONTROLLER_ID, NODE_ID_IN_CONTROLLER). The CONTROLLER_ID might not always belong to an SDN controller as we might either have a stack of IBN framework instances, or the referenced node is a border node, i.e., belongs to a different domain, and then the IBN framework instance of the neighbor domain must be referenced.

      To express this structure programmatically, we make use of the NestedGraphs.jl package, where nodes are defined with a Tuple and edges with a NestedEdge where src and dst are Tuple{::Integer, Integer}.

      Inter-domain indexing

      Scaling up the previous idea, a domain node might also be globally referenced with a Tuple {::Integer, ::Integer}. This time the first element is the IBN domain id, and the second element is the node id inside the network as in Intra-domain indexing. In other words, a node can be addressed as (DOMAIN_ID, NODE_ID). The higher stacked IBN framework instance id is used to identify the domain. An edge can also be addressed globally with a NestedEdge.

      Intents indexing

      An intent can be globally indexed with a Tuple{::Integer, ::UUID}, i.e., (DOMAIN_ID, INTENT_ID). All (compiled) intents in a IBN domain are part of a DAG (Directed Acyclic Graph). You can access the DAG of an ibn::IBN with the ibn.intents field.