...
- Below is the list of solvers used in OOF and its usage. The Route Optimiser Optimizer package will be used for the MDONS use case as well.
- Policy is not going to be involved to list the constraints for now.
- Once config policies are defined for MDONS use case , OOF wil will fetch these policies to get certain other constraints and apply them while running the algorithm.
- If two links between two controllers have the same specification then minizinc automatically chooses one. The implementation for Guilin release is based out of this logic.
Existing Solvers and Usage
license optimizerLicense Optimizer | VNF license optimization |
pci optimizerPCI Optimizer | Pci optimization |
placement optimizerPlacement Optimizer | VNF placement optimization |
slice optimiserSlice Optimizer | Slice selection and instantiation |
optimisationroute optimizerRoute Optimizer | Perform the route calculations and return the vpn-bindings for CCVPN use case |
Jira Legacy |
---|
server | System Jira |
---|
columns | key,summary,type,created,updated,due,assignee,reporter,priority,status,resolution |
---|
serverId | 4733707d-2057-3a0f-ae5e-4fd8aff50176 |
---|
key | OPTFRA-753 |
---|
|
Jira Legacy |
---|
server | System Jira |
---|
columns | key,summary,type,created,updated,due,assignee,reporter,priority,status,resolution |
---|
serverId | 4733707d-2057-3a0f-ae5e-4fd8aff50176 |
---|
key | OPTFRA-820 |
---|
|
Sequence Diagram
...
Image Added
Request from SO or SDNC
Code Block |
---|
title | IDL request |
---|
collapse | true |
---|
|
API: POST /api/oof/mdons/route/v1
BODY:
{
"requestInfo":{
"transactionId":"xxx-xxx-xxxxxxx",
"requestId":"yyy-yyy-yyyyyyy",
"callbackUrl":"",
"callbackHeader": "",
"sourceId":"SDNC",
"requestType":"create",
"numSolutions":1,
"optimizers":[
"route"
],
"timeout":600
},
"routeInfo":{
"routeRequest":{
"srcDetails":{
"interfaceId":"interface-id-1int19",
"nodeId":"node-1pnf1",
"controllerId":"Virtuora-TAPI1Controller1"
},
"dstDetails":{
"interfaceId":"interface-id-2int20",
"nodeId":"node-2pnf4",
"controllerId":"Virtuora-TAPI2Controller3"
},
"serviceRate":"ODU2"
}
}
}
|
Note: "Callbackurl" field will be empty . Has been added to just follow the request format standard in OOF. When SDNC sends this request the field will be empty.
Response To
...
SDNC
Response Example
Code Block |
---|
language | text |
---|
title | Route Selection Response |
---|
collapse | true |
---|
|
{
"transactionIdrequestId":"xxx-xxx-xxxx"xxx,
"requestId "transactionId":"yyy-yyy-yyyyyyy",
"requestStatus "statusMessage":"completedSUCCESS",
"statusMessage "requestStatus":"successaccepted",
"solution "solutions":{
"routeInfo":{
"serviceRoute":[
{
"srcInterfaceId":"int19",
"dstInterfaceId":"int1",
"controllerId":"Controller1"
},
{
"srcInterfaceId":"int3",
"dstInterfaceId":"int4",
"controllerId":"Controller2"
},
{
"srcInterfaceId":"int5",
"destInterfaceId "dstInterfaceId":"int20",
"controllerId":"Controller3"
}
],
"linkList":[
"link1",
"link2"
]
}
}
}
|
State Diagram
View file |
---|
name | OOF_StateDiagram.gliffy |
---|
height | 400 |
---|
|
Image Added
OOF Impacts
- A new api should be defined in the osdfapp.py class in the optf-osdf repository for the mdons MDONS route selection.
- Under the Route Optimizer section a new class has to be added to handle the mdons MDONS route selection.
- The standard minizinc template which gives the shortest path in a graph datastructure data structure will be used for this use case, same as the ccvpn CCVPN use case.
Algorithm Details
- Identify if the A and Z are from the same domain controller, if yes, linkName is set to null.
- If not from the same domain, retrieve all the interdomain inter domain links across both the controllers from AAI.
- The links will have information such as admin-state and rate. (Note: For now we are considering only these two fields to select the appropriate inter-domain-link).
- Based on the bandwidth required and available bandwidth and the status of the links (of the end points, NNIs), the appropriate link is chosen.
- The link name along with the names of NNI 1 and NN2 are sent to SDNC and SDNC/DG send the details request for service-creation to the domain controller(s).
Minizinc Template
Here is the Minizinc Module used in IDL Path Optimizer.
Code Block |
---|
language | text |
---|
title | Finding the shortest path - Minizinc |
---|
collapse | true |
---|
|
% Number of nodes
int: N;
% Start node
1..N: Start;
% End node
1..N: End;
% Number of edges (directed arcs)
int: M;
% The actual edges
set of int: Edges = 1..M;
% Edge lengths
array[Edges] of int: L;
% Edge start node
array[Edges] of 1..N: Edge_Start;
array[Edges] of 1..N: Edge_End;
% Variable indicating if edge is used
array[Edges] of var 0..1: x;
constraint
forall( i in 1..N ) (
if i = Start then
% outgoing flow
sum(e in Edges where Edge_Start[e] = i)(x[e]) -
% incoming flow
sum(e in Edges where Edge_End[e] = i)(x[e])
= 1
elseif i = End then
sum(e in Edges where Edge_Start[e] = i)(x[e]) -
sum(e in Edges where Edge_End[e] = i)(x[e])
= -1
else
sum(e in Edges where Edge_Start[e] = i)(x[e]) -
sum(e in Edges where Edge_End[e] = i)(x[e])
= 0
endif
);
solve minimize sum(e in Edges)( L[e] * x[e] );
output ["Length: ", show(sum(e in Edges)(L[e] * x[e])), "\n"] ++
["Start : ", show(Start), "\n"] ++
["End : ", show(End), "\n\n"] ++
["Edges in shortest path:\n"] ++
[ if fix(x[e]) = 1
then show(Edge_Start[e]) ++ " -> " ++ show(Edge_End[e]) ++ "\n"
else ""
endif | e in Edges
];
|
Example Inter Domain Paths
Non Multiplexing Between the Domains
Image Added
- Route optimizer receives the service route request from SDNC with the source and destination interface ids.
- The controllers of both the points are found using the AAI queries.
- Then optimizer queries AAI to fetch all the possible Controllers in the inventory to send it to minizinc. It fetches all the inter-domain links from the inventory and filters it based on the "rate" mentioned in the request and the operational status "up".
- Since minizinc expects the data in a certain way, optimizer wil encode all the data retrieved using the sckit module in python and send it to minizinc.
- The pymzn module is used to interface python with the minizinc language.
- Once minizinc chooses the optimized path, the optimizer will again decode the data and find the chosen links from the source to the destination.
- The optimizer then would fetch the interface details from the link and form a proper service route list that would be sent back to SDNC along with the list of logical links.
- SDNC in turn will fetch the end points from the service routes list object from the response and create as many domain services as present in the service route list.
- The logical links in the response will be used to form the relationship with the access service which will be done by SDNC.
- For the above example if a route has to be found between the "id20" of Controller1 "id21" of Controller5 following request will be sent to OOF by SDNC defined above.
- After running the algorithm OOF wil return the following response defined above.
Multiplexing Between the Domains
TBD
AAI API Dependency
Query to retrieve the interdomain links for a given Controller:
Code Block |
---|
title | Controller Inter-Domain-Link Query |
---|
collapse | true |
---|
|
API: PUT /aai/v19/query?format=resource
BODY:
{
"start" : ["external-system"],
"query" : "query/getInterDomainLink?linktype=inter-domain&controller=Virtuora-TAPI1"
}
RESPONSE EXAMPLE:
{
"results": [{
"logical-link": {
"link-name": "IDLLink1",
"in-maint": false,
"link-type": "inter-domain",
"resource-version": "1588952379221",
"operational-status": "available",
"relationship-list": {
"relationship": [{
"related-to": "p-interface",
"relationship-label": "tosca.relationships.network.LinksTo",
"related-link": "/aai/v16/network/pnfs/pnf/f17ae566-6cb9-3907-9bb1-00d04ca5e9d9/p-interfaces/p-interface/641bb3d1-0817-3783-aba2-aa2129dfe1b1",
"relationship-data": [{
"relationship-key": "pnf.pnf-name",
"relationship-value": "f17ae566-6cb9-3907-9bb1-00d04ca5e9d9"
}, {
"relationship-key": "p-interface.interface-name",
"relationship-value": "641bb3d1-0817-3783-aba2-aa2129dfe1b1"
}],
"related-to-property": [{
"property-key": "p-interface.prov-status"
}]
}, {
"related-to": "p-interface",
"relationship-label": "tosca.relationships.network.LinksTo",
"related-link": "/aai/v16/network/pnfs/pnf/36bfbd31-e715-3312-9dd1-5a9e46d4b4d5/p-interfaces/p-interface/3cfaf6b4-7923-3258-bb72-e2a62c40fe5e",
"relationship-data": [{
"relationship-key": "pnf.pnf-name",
"relationship-value": "36bfbd31-e715-3312-9dd1-5a9e46d4b4d5"
}, {
"relationship-key": "p-interface.interface-name",
"relationship-value": "3cfaf6b4-7923-3258-bb72-e2a62c40fe5e"
}],
"related-to-property": [{
"property-key": "p-interface.prov-status"
}]
}]
}
}
}]
}
|
Query to find the esr controller given a p-interface id:
Code Block |
---|
title | P-interface Query |
---|
collapse | true |
---|
|
API: /aai/v19/query?format=resource
BODY:
{
"start" : ["external-system"],
"query" : "query/getDomainController?portid=49b3fb2a-6868-3a23-a833-79a3aa1dd24f"
}
RESPONSE EXAMPLE:
{
"results": [{
"esr-thirdparty-sdnc": {
"thirdparty-sdnc-id": "Virtuora-TAPI2",
"location": "Core",
"product-name": "VirtuoraNetworkController",
"resource-version": "1588951277460",
"esr-system-info-list": {
"esr-system-info": [{
"esr-system-info-id": "Virtuora-TAPI2",
"system-name": "Virtuora-TAPI2",
"type": "TAPI",
"vendor": "Fujitsu",
"version": "V2",
"service-url": "https://167.254.204.66:9443",
"user-name": "admin",
"password": "admin",
"system-type": "Controller",
"protocol": "RESTAPI",
"ssl-cacert": "example-ssl-cacert-val-20589",
"ssl-insecure": true,
"ip-address": "167.254.204.66",
"port": "9443",
"cloud-domain": "example-cloud-domain-val-76077",
"default-tenant": "example-default-tenant-val-71148",
"passive": true,
"remote-path": "example-remotepath-val-5833",
"system-status": "example-system-status-val-23435",
"resource-version": "1588951277460"
}]
},
"relationship-list": {
"relationship": [{
"related-to": "network-resource",
"relationship-label": "org.onap.relationships.inventory.BelongsTo",
"related-link": "/aai/v16/network/network-resources/network-resource/Virtuora-TAPI2-TAPI-754a91dc-dcd1-3530-8e95-a4880c298a1f",
"relationship-data": [{
"relationship-key": "network-resource.network-id",
"relationship-value": "Virtuora-TAPI2-TAPI-754a91dc-dcd1-3530-8e95-a4880c298a1f"
}],
"related-to-property": [{
"property-key": "network-resource.network-id",
"property-value": "Virtuora-TAPI2-TAPI-754a91dc-dcd1-3530-8e95-a4880c298a1f"
}]
}]
}
}
}]
}
|
API to retrieve all the inter-domain links:
Code Block |
---|
title | Inter-domain Links retrieval |
---|
collapse | true |
---|
|
API: GET /aai/v19/logical-links?link-type=inter-domain
RESPONSE EXAMPLE:
{
"logical-link": [{
"link-name": "IDLLink1",
"in-maint": false,
"link-type": "inter-domain",
"resource-version": "1588952379221",
"operational-status": "available",
"relationship-list": {
"relationship": [{
"related-to": "p-interface",
"relationship-label": "tosca.relationships.network.LinksTo",
"related-link": "/aai/v16/network/pnfs/pnf/f17ae566-6cb9-3907-9bb1-00d04ca5e9d9/p-interfaces/p-interface/641bb3d1-0817-3783-aba2-aa2129dfe1b1",
"relationship-data": [{
"relationship-key": "pnf.pnf-name",
"relationship-value": "f17ae566-6cb9-3907-9bb1-00d04ca5e9d9"
}, {
"relationship-key": "p-interface.interface-name",
"relationship-value": "641bb3d1-0817-3783-aba2-aa2129dfe1b1"
}],
"related-to-property": [{
"property-key": "p-interface.prov-status"
}]
}, {
"related-to": "p-interface",
"relationship-label": "tosca.relationships.network.LinksTo",
"related-link": "/aai/v16/network/pnfs/pnf/36bfbd31-e715-3312-9dd1-5a9e46d4b4d5/p-interfaces/p-interface/3cfaf6b4-7923-3258-bb72-e2a62c40fe5e",
"relationship-data": [{
"relationship-key": "pnf.pnf-name",
"relationship-value": "36bfbd31-e715-3312-9dd1-5a9e46d4b4d5"
}, {
"relationship-key": "p-interface.interface-name",
"relationship-value": "3cfaf6b4-7923-3258-bb72-e2a62c40fe5e"
}],
"related-to-property": [{
"property-key": "p-interface.prov-status"
}]
}]
}
}]
} |