HA-VNF

HA-VNF is a software to design networks and perform an automatic and reliable placement of Virtual Network Functions.

Requirements

HA-VNF requires:


Instructions

The ZIP file contains the Java GUI to design the network, the Python algorithms to optimize the placement, this README file, and an example of a network that can be opened from our tool.

HA-VNF.jar and the algorithms folder must be placed in the same directory to run the automatic placement:

parent_folder
|  
|---algorithms/  
|---HA-VNF.jar  
|---README.md  
|---network

Run the HA-VNF.jar file to run the tool:
$> java -jar HA-VNF.jar


Optimization algorithms

The optimization algorithms run independently from the Java GUI. We deliver 5 optimization algorithms:

Each heuristic is packed in a single Python file:

To run an algorithm:

$> python -O algorithm_file.pyo input_file.ampl.dat split protection objective output_file.ampl.out

where

Examples:

$> python -O vns_heuristic.pyo input.ampl.dat False True Availability output.out

Run the variable neighborhood search algorithm over a network contained in input.ampl.dat maximizing the availability and saving the results in output.out.

$> python -O greedy_heuristic.pyo input.ampl.dat False False Penalty output.out

Run the greedy algorithm with a best availability policy over a network contained in input.ampl.dat minimizing the penalty, without placing slaves, and saving the results in output.out.


Input format

The input file is a text file in AMPL format containing all the informations about the components of the infrastructure (computing resources, link connections, availabilities, ...).

An input file starts with the declaration of the number of components in the infrastructure:

param REQUESTS := 5;
param SERVERS := 3;
param CLUSTERS := 3;
param RESOURCES := 1;
param FUNCTIONS := 3;
param ACCESS_POINTS := 2;

Where

Then a parameter sets the desired SLA of the infrastructure.
param SLA := 0.999990;
When the objective of the optimization is to minimize the penalty, a penalty is paid for each request that does not met SLA.

The parameter availability_f is the vector of the VNF availabilities, that is the probability that the software implementing a VNF will not crash due to software bugs:

param availability_f{F};  
param availability_f :=
1 0.999990
2 0.999990
3 0.999990
;

Parameter availability_s is the vector of the availabilities of the servers:

param availability_s{S};  
param availability_s :=
1 0.999900
2 0.999500
3 0.999000
;

Parameter availability_c is the probability that a cluster is accessible. In our Java tool each server corresponds to a single cluster, but in general a cluster may contain many servers.

param availability_c{C};  
param availability_c :=
1 0.997505
2 0.998000
3 0.999000
;

Parameter availability_link_cc and availability_link_ac are matrices of links availabilities: the former declares the availabilities of links connecting clusters to clusters, while the latter declares the availabilities of links between access points and clusters:

param availability_link_cc{C,C};  
param availability_link_cc : 1 2 3 :=
1 1.0 0.998708424146 0.999382879775
2 0.998708424146 1.0 0.999030657717
3 0.999382879775 0.999030657717 1.0
;  

param availability_link_ac{A,C};  
param availability_link_ac : 1 2 3 :=
1 0.999075820271 0.99899928098 0.999149014679
2 0.999427250961 0.999251508336 0.998967231901
;

Parameters penalty_r and function_r define the penalty paid when a request does not meet the SLA value and the VNF type required by a request, respectively.

param penalty_r{R};  
param function_r{R};  
param : penalty_r function_r :=
1 10.000000 2
2 10.000000 1
3 100.000000 3
4 30.000000 1
5 1.000000 2
;

Parameter apoints is a matrix having a 1 if a request can use an access point. Each request may use several access points.

param apoints{R,A};
param apoints : 1 2 :=
1 1 1
2 0 1
3 1 0
4 1 0
5 0 1
;

Param d is the demand of computing resources required by each request:

param d{R,K};  
param d : 1 :=
1 5.000000
2 9.000000
3 3.000000
4 10.000000
5 5.000000
;

Param q is the matrix declaring the amount of computing resources of each server:

param q{S,K};
param q : 1 :=
1 122.000000
2 91.000000
3 113.000000
;

Finally, parameter server_cluster associates servers to clusters:

param server_cluster{S};
param server_cluster :=
1 1 
2 2 
3 3 
;