-
Notifications
You must be signed in to change notification settings - Fork 0
/
DVNFPOnline.java
296 lines (241 loc) · 11.3 KB
/
DVNFPOnline.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
import com.ctc.wstx.evt.WNotationDeclaration;
import com.net2plan.interfaces.networkDesign.IAlgorithm;
import com.net2plan.interfaces.networkDesign.NetPlan;
import com.net2plan.research.niw.networkModel.ImportMetroNetwork;
import com.net2plan.research.niw.networkModel.OpticalSpectrumManager;
import com.net2plan.research.niw.networkModel.WAbstractNetworkElement;
import com.net2plan.research.niw.networkModel.WFiber;
import com.net2plan.research.niw.networkModel.WIpLink;
import com.net2plan.research.niw.networkModel.WLightpathRequest;
import com.net2plan.research.niw.networkModel.WLightpathUnregenerated;
import com.net2plan.research.niw.networkModel.WNet;
import com.net2plan.research.niw.networkModel.WNode;
import com.net2plan.research.niw.networkModel.WServiceChain;
import com.net2plan.research.niw.networkModel.WServiceChainRequest;
import com.net2plan.research.niw.networkModel.WVnfInstance;
import com.net2plan.research.niw.networkModel.WVnfType;
import com.net2plan.utils.InputParameter;
import com.net2plan.utils.Pair;
import com.net2plan.utils.Triple;
import java.io.File;
import java.util.*;
public class DVNFPOnline implements IAlgorithm
{
/*
Input parameters that we will need:
- Linerate per lightpath (in Gbps) -> double (default 40)
- Occupied slots per lightpath -> int (default 4)
- Number of shortest paths to compute (K) -> int (defualt 3)
- Selection of time slot to use -> String (default #select# Morning Afternoon Evening)
*/
private InputParameter linerate_Gbps = new InputParameter("linerate_Gbps", 40.0, "Linerate (in Gbps) per ligthpath", 1.0, true, 1000.0, true);
private InputParameter slotsPerLightpath = new InputParameter("slotsPerLightpath", 4, "Number of occupied slots per lightpath", 1, 320);
private InputParameter K = new InputParameter("K", 3, "Number of candidate shortest paths to compute per LP/SC", 1, 100);
private InputParameter trafficIntensityTimeSlot = new InputParameter("trafficIntensityTimeSlot", "#select# Morning Afternoon Evening Night", "Traffic intensity per time slot (as defined in the design/spreadsheet");
private InputParameter debug = new InputParameter("debug",true, "Debug");
private InputParameter excelFile = new InputParameter("excelFile","#file#","Selection of excel spreadsheet");
public String executeAlgorithm(NetPlan netPlan, Map<String, String> algorithmParameters, Map<String, String> net2planParameters)
{
//throw new Net2PlanException ("this is a test");
//First of all, initialize all parameters
InputParameter.initializeAllInputParameterFieldsOfObject(this, algorithmParameters);
File excelPath= new File(excelFile.getString());
WNet wNet= ImportMetroNetwork.importFromExcelFile(excelPath);
netPlan.copyFrom(wNet.getNetPlan());
wNet= new WNet(netPlan);
List <WFiber> SCPath= new ArrayList<WFiber>();
List<WVnfType>VNFTypeSC = new ArrayList <WVnfType>();
List <WNode> VNFnodes= new ArrayList <WNode>();
WNode LastNode = null;
WNode Src=null,CandidateNode=null;
int minLengthSrc,minLengthDst, minLength,minnum;
minLengthSrc=minLengthDst=minnum=minLength=Integer.MAX_VALUE;
int nodeindex=-1;
List <WNode> ShortestVNFnodesSrc= new ArrayList <WNode>();
List <WNode> ShortestVNFnodesDst= new ArrayList <WNode>();
List <WNode> ShortestVNFnodes= new ArrayList <WNode>();
List <WNode> MinVNFnodes=new ArrayList <WNode>();
int round=0;
/* Remove ALL lightpaths */
for(WLightpathRequest lpr: wNet.getLightpathRequests())
lpr.remove();
/* Remove ALL VNF instances */
for(WVnfInstance vnf: wNet.getVnfInstances())
vnf.remove();
/* Remove ALL Service Chains */
for(WServiceChain sc: wNet.getServiceChains())
sc.remove();
/*Any WDM operation must involve the Optical Spectrum Manager, so instantiating the object*/
OpticalSpectrumManager opt= OpticalSpectrumManager.createFromRegularLps(wNet);
for(WNode node: wNet.getNodes()){
for(WNode node2: wNet.getNodes()) {
if(!node.equals(node2)) {
WLightpathRequest lpr = wNet.addLightpathRequest(node, node2, linerate_Gbps.getDouble(), false);
}
}
}
for(WLightpathRequest lpreq: wNet.getLightpathRequests()) {
List <List<WFiber>> kpath= wNet.getKShortestWdmPath(K.getInt(), lpreq.getA(),lpreq.getB(), Optional.empty());
for(List<WFiber>candidpath: kpath) {
/* for each path you need to find an available wavelength */
Optional <SortedSet<Integer>> wl=opt.spectrumAssignment_firstFit(candidpath, slotsPerLightpath.getInt(), Optional.empty());
if(wl.isPresent()) {
WLightpathUnregenerated lp= lpreq.addLightpathUnregenerated(candidpath, wl.get(), false);
opt.allocateOccupation(lp, candidpath, wl.get());
//add ip link and couple it
Pair <WIpLink,WIpLink> iplink= wNet.addIpLink(lpreq.getA(), lpreq.getB(), linerate_Gbps.getDouble(), false);
lpreq.coupleToIpLink(iplink.getFirst());
break;
}
}
}
/*to instantiate VNFs on each node. If we do not use them we can remove them later! */
for (WNode node: wNet.getNodes()) {
for(WVnfType vnf:wNet.getVnfTypes() )
{
if(vnf.getValidMetroNodesForInstantiation().contains(node.getName()))
{
wNet.addVnfInstance(node, vnf.getVnfTypeName(), vnf);
}
}
}
//to deploy Service Chains: IP links and VNFs */
for (WServiceChainRequest sc: wNet.getServiceChainRequests())
{
boolean isAllocated=false;
//reset VNFTypeSC and VNFnodes
VNFTypeSC.clear();
VNFnodes.clear();
System.out.println("The id of service chain requrest is:"+sc.getId());
for (WNode nodesrc :sc.getPotentiallyValidOrigins() ) {
for (WNode nodedst :sc.getPotentiallyValidDestinations() ) {
//find VNF types of SC one by one
//main cycle for each SC
for (int i=0; i<sc.getNumberVnfsToTraverse();i++)
{
for (WVnfType VNFSC : wNet.getVnfTypes()) {
String VNFname=sc.getSequenceVnfTypes().get(i);
if(VNFSC.getVnfTypeName().equals(VNFname)) {
if(!VNFTypeSC.contains(VNFSC))
VNFTypeSC.add(VNFSC);
}
}//end of for VNFs of SC
}//end of for:get VNF types in the network
//for each vnf type, find the nodes that have these VNFs
for( int i=0;i<VNFTypeSC.size();i++)
{
for (WVnfInstance vnfints : wNet.getVnfInstances()) {
if(VNFTypeSC.get(i).getVnfTypeName().equals(vnfints.getName())) {
if(!VNFnodes.contains(vnfints))
VNFnodes.add(vnfints.getHostingNode());
}
}
//if it is the first VNF src is the src of request otherwise it will be replaced with the previous node on SCpath
if(i!=0)
Src=LastNode;
else
Src=nodesrc;
//there is already an instance of VNF active in the network
if(VNFnodes.size()!=0) {
System.out.println("Size of VNFnodes is: "+VNFnodes.size());
//choose the node with enough capacity and less length of shortest path value
for(int j=0;j<VNFnodes.size();j++)
{
if(VNFnodes.get(j).getTotalNumCpus()-VNFnodes.get(j).getOccupiedCpus()>=VNFTypeSC.get(i).getOccupCpu())
{
//calculate shortest path between src and this node
//find nodes closer to the src
List <List<WFiber>> ShortestPathSrc= wNet.getKShortestWdmPath(1, Src, VNFnodes.get(j), Optional.empty());
if( ShortestPathSrc.size() <= minLengthSrc) {
minLengthSrc=ShortestPathSrc.size();
ShortestVNFnodesSrc.add(VNFnodes.get(j));
}
//find nodes closer to dst
List <List<WFiber>> ShortestPathDst= wNet.getKShortestWdmPath(1,VNFnodes.get(j), nodedst, Optional.empty());
if( ShortestPathDst.size() <= minLengthDst) {
minLengthDst=ShortestPathDst.size();
ShortestVNFnodesDst.add(VNFnodes.get(j));
}
if( ShortestPathDst.size()+ShortestPathSrc.size()<minLength)
{
minLength=ShortestPathDst.size()+ShortestPathSrc.size();
ShortestVNFnodes.add(VNFnodes.get(j));
}
}
}
//out of nodes with less length of shortest path choose one with less # of VNFs
for(int j=0;j<ShortestVNFnodes.size();j++)
{
if(ShortestVNFnodes.get(j).getAllVnfInstances().size()<=minnum) {
minnum=ShortestVNFnodes.get(j).getAllVnfInstances().size();
MinVNFnodes.add(ShortestVNFnodes.get(j));
}
}
//depending on the type of SC choose nodes closer to the src or dst of sc
if(MinVNFnodes.size()>1&&sc.getUserServiceName()=="Video" && MinVNFnodes.contains(ShortestVNFnodesDst.get(0) ))
CandidateNode=ShortestVNFnodesDst.get(0);
else
if(MinVNFnodes.size()>1 && MinVNFnodes.contains(ShortestVNFnodesSrc.get(0)))
CandidateNode=ShortestVNFnodesSrc.get(0);
else
CandidateNode=MinVNFnodes.get(0);
}//end of if VNFnodes is not empty
else
//there is no already active VNF instance on the network-to be deployed
{
System.out.println("The VNFnodes is empty: ");
}
//function for provisioning vnfs one by one
List<String> test=new ArrayList<String>();
test.add(VNFTypeSC.get(i).getVnfTypeName());
List<List< WAbstractNetworkElement>> list = wNet.getKShortestServiceChainInIpLayer(K.getInt(),
Src, CandidateNode,test, Optional.empty(), Optional.empty());
if(list.isEmpty()) {
System.out.println("it didn't work for this service chain"+sc.getId());
continue;
}
//Add resource
sc.addServiceChain(list.get(0), sc.getTrafficIntensityInfo(trafficIntensityTimeSlot.getString()).get());
//update the lastnode
LastNode=CandidateNode;
//check if all the VNFs of SC mapped
if(i==VNFTypeSC.size())
isAllocated=true;
}
if(isAllocated)
break;
}
//changing processing time
for(WVnfInstance vnfinstance: wNet.getVnfInstances())
{
double utilization= vnfinstance.getOccupiedCapacityInGbps()/ vnfinstance.getCurrentCapacityInGbps();
if(utilization>1) utilization=1;
System.out.println("utilization"+utilization);
double newProcessingTime= vnfinstance.getProcessingTimeInMs()+ 10*utilization;
vnfinstance.setProcessingTimeInMs(newProcessingTime);
}
/* Dimension the VNF instances, consuming the resources CPU, HD, RAM */
for(WVnfInstance vnfs: wNet.getVnfInstances())
vnfs.scaleVnfCapacityAndConsumptionToBaseInstanceMultiple();
}//end of for cycle VNF of sc
/*remove VNFs not used*/
for(WVnfInstance vnfs: wNet.getVnfInstances()) {
if(vnfs.getOccupiedCapacityInGbps()==0)
vnfs.remove();
}
System.out.println("Provisioned a Service Chain with index"+ round);
round++;
}
return "Ok";
}
@Override
public String getDescription()
{
return "An algorithm to perform dynamic VNF placement developed by Leila Askari";
}
@Override
public List<Triple<String, String, String>> getParameters()
{
return InputParameter.getInformationAllInputParameterFieldsOfObject(this);
}
}