Skip to content

Commit

Permalink
Merge pull request #64 from Echtzeitsysteme/hotfix/model-affected-paths
Browse files Browse the repository at this point in the history
Adds tests for affected paths + adds repair/update functionality to all VNE algorithms that operate with paths
  • Loading branch information
maxkratz committed Apr 12, 2024
2 parents 18a6ca1 + 358fc44 commit 37013ac
Show file tree
Hide file tree
Showing 19 changed files with 729 additions and 0 deletions.
262 changes: 262 additions & 0 deletions test.suite/resources/triggerPathResidualBwBug.xmi

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
package test.algorithms.generic;

import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertNull;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.junit.jupiter.api.Assertions.assertTrue;

import java.util.Set;

import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

import model.SubstrateNetwork;
import model.VirtualNetwork;

/**
* Abstract test class for a VNE algorithm implementation to trigger the minimum
* path/link bandwidth bug. This test is based on a scenario created by Marco
* Volle in his master's thesis.
*
* @author Maximilian Kratz {@literal <maximilian.kratz@es.tu-darmstadt.de>}
*/
public abstract class AVneAlgorithmPathBandwidthBugTest extends AAlgorithmTest {

/**
* Substrate network.
*/
SubstrateNetwork sNet;

/**
* Virtual network.
*/
VirtualNetwork vNet;

@Override
public abstract void initAlgo(final SubstrateNetwork sNet, final Set<VirtualNetwork> vNets);

@AfterEach
public abstract void resetAlgo();

@BeforeEach
public void reset() {
facade.resetAll();
}

//
// Tests
//

@Test
public void testScenario34() {
// Load the model file
facade.loadModel("resources/triggerPathResidualBwBug.xmi");
assertNotNull(facade.getNetworkById("sub"));
assertFalse(facade.getAllPathsOfNetwork("sub").isEmpty());

assertThrows(InternalError.class, () -> {
facade.validateModel();
});

facade.updateAllPathsResidualBandwidth("sub");

// validation must not fail before the embedding
facade.validateModel();

sNet = (SubstrateNetwork) facade.getNetworkById("sub");
vNet = (VirtualNetwork) facade.getNetworkById("v4");

// Sanity check
assertNotNull(sNet);
assertNotNull(vNet);
assertNull(vNet.getHost());

initAlgo(sNet, Set.of(vNet));
assertTrue(algo.execute());

// validation must not fail
facade.validateModel();
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package test.algorithms.gips;

import java.util.Set;

import org.junit.jupiter.api.AfterEach;

import algorithms.AlgorithmConfig;
import algorithms.AlgorithmConfig.Objective;
import algorithms.gips.VneGipsAlgorithm;
import model.SubstrateNetwork;
import model.VirtualNetwork;
import test.algorithms.generic.AVneAlgorithmPathBandwidthBugTest;

/**
* Test class for the VNE GIPS algorithm implementation to trigger the minimum
* path/link bandwidth bug.
*
* @author Maximilian Kratz {@literal <maximilian.kratz@es.tu-darmstadt.de>}
*/
public class VneGipsAlgorithmPathBandwidthBugTest extends AVneAlgorithmPathBandwidthBugTest {

@Override
public void initAlgo(final SubstrateNetwork sNet, final Set<VirtualNetwork> vNets) {
// The algorithm is only able to use the total communication objective C because
// it is hard-coded in GIPSL
AlgorithmConfig.obj = Objective.TOTAL_COMMUNICATION_OBJECTIVE_C;
algo = VneGipsAlgorithm.prepare(sNet, vNets);
}

@AfterEach
public void resetAlgo() {
facade.resetAll();
if (algo != null) {
((VneGipsAlgorithm) algo).dispose();
}
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package test.algorithms.gips.migration;

import java.util.Set;

import org.junit.jupiter.api.AfterEach;

import algorithms.AlgorithmConfig;
import algorithms.AlgorithmConfig.Objective;
import algorithms.gips.VneGipsMigrationAlgorithm;
import model.SubstrateNetwork;
import model.VirtualNetwork;
import test.algorithms.generic.AVneAlgorithmPathBandwidthBugTest;

/**
* Test class for the VNE GIPS migration algorithm implementation to trigger the
* minimum path/link bandwidth bug.
*
* @author Maximilian Kratz {@literal <maximilian.kratz@es.tu-darmstadt.de>}
*/
public class VneGipsMigrationAlgorithmPathBandwidthBugTest extends AVneAlgorithmPathBandwidthBugTest {

@Override
public void initAlgo(final SubstrateNetwork sNet, final Set<VirtualNetwork> vNets) {
// The algorithm is only able to use the total communication objective C because
// it is hard-coded in GIPSL
AlgorithmConfig.obj = Objective.TOTAL_COMMUNICATION_OBJECTIVE_C;
algo = VneGipsMigrationAlgorithm.prepare(sNet, vNets);
}

@AfterEach
public void resetAlgo() {
facade.resetAll();
if (algo != null) {
((VneGipsMigrationAlgorithm) algo).dispose();
}
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package test.algorithms.gips.seq;

import java.util.Set;

import org.junit.jupiter.api.AfterEach;

import algorithms.AlgorithmConfig;
import algorithms.AlgorithmConfig.Objective;
import algorithms.gips.VneGipsSeqAlgorithm;
import model.SubstrateNetwork;
import model.VirtualNetwork;
import test.algorithms.generic.AVneAlgorithmPathBandwidthBugTest;

/**
* Test class for the VNE GIPS sequence algorithm implementation to trigger the
* minimum path/link bandwidth bug.
*
* @author Maximilian Kratz {@literal <maximilian.kratz@es.tu-darmstadt.de>}
*/
public class VneGipsSeqAlgorithmPathBandwidthBugTest extends AVneAlgorithmPathBandwidthBugTest {

@Override
public void initAlgo(final SubstrateNetwork sNet, final Set<VirtualNetwork> vNets) {
// The algorithm is only able to use the total communication objective C because
// it is hard-coded in GIPSL
AlgorithmConfig.obj = Objective.TOTAL_COMMUNICATION_OBJECTIVE_C;
algo = VneGipsSeqAlgorithm.prepare(sNet, vNets);
}

@AfterEach
public void resetAlgo() {
facade.resetAll();
if (algo != null) {
((VneGipsSeqAlgorithm) algo).dispose();
}
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package test.algorithms.pm;

import java.util.Set;

import org.junit.jupiter.api.AfterEach;

import algorithms.AlgorithmConfig;
import algorithms.AlgorithmConfig.Objective;
import algorithms.pm.VnePmMdvneAlgorithm;
import model.SubstrateNetwork;
import model.VirtualNetwork;
import test.algorithms.generic.AVneAlgorithmPathBandwidthBugTest;

/**
* Test class to trigger the minimum path/link bandwidth bug.
*
* @author Maximilian Kratz {@literal <maximilian.kratz@es.tu-darmstadt.de>}
*/
public class VnePmMdvneAlgorithmPathBandwidthBugTest extends AVneAlgorithmPathBandwidthBugTest {

@Override
public void initAlgo(final SubstrateNetwork sNet, final Set<VirtualNetwork> vNets) {
// The algorithm is only able to use the total communication objective C because
// it is hard-coded in GIPSL
AlgorithmConfig.obj = Objective.TOTAL_COMMUNICATION_OBJECTIVE_C;
algo = VnePmMdvneAlgorithm.prepare(sNet, vNets);
}

@AfterEach
public void resetAlgo() {
facade.resetAll();
if (algo != null) {
((VnePmMdvneAlgorithm) algo).dispose();
}
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package test.algorithms.pm.migration;

import java.util.Set;

import org.junit.jupiter.api.AfterEach;

import algorithms.AlgorithmConfig;
import algorithms.AlgorithmConfig.Objective;
import algorithms.pm.VnePmMdvneAlgorithmMigration;
import model.SubstrateNetwork;
import model.VirtualNetwork;
import test.algorithms.generic.AVneAlgorithmPathBandwidthBugTest;

/**
* Test class to trigger the minimum path/link bandwidth bug.
*
* @author Maximilian Kratz {@literal <maximilian.kratz@es.tu-darmstadt.de>}
*/
public class VnePmMdvneAlgorithmMigrationPathBandwidthBugTest extends AVneAlgorithmPathBandwidthBugTest {

@Override
public void initAlgo(final SubstrateNetwork sNet, final Set<VirtualNetwork> vNets) {
// The algorithm is only able to use the total communication objective C because
// it is hard-coded in GIPSL
AlgorithmConfig.obj = Objective.TOTAL_COMMUNICATION_OBJECTIVE_C;
algo = VnePmMdvneAlgorithmMigration.prepare(sNet, vNets);
}

@AfterEach
public void resetAlgo() {
facade.resetAll();
if (algo != null) {
((VnePmMdvneAlgorithmMigration) algo).dispose();
}
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package test.algorithms.pm.pipeline;

import java.util.Set;

import org.junit.jupiter.api.AfterEach;

import algorithms.pm.VnePmMdvneAlgorithmPipelineThreeStagesA;
import model.SubstrateNetwork;
import model.VirtualNetwork;
import test.algorithms.generic.AVneAlgorithmPathBandwidthBugTest;

/**
* Test class to trigger the minimum path/link bandwidth bug.
*
* @author Maximilian Kratz {@literal <maximilian.kratz@es.tu-darmstadt.de>}
*/
//@Disabled
public class VnePmMdvneAlgorithmPipelineThreeStagesAPathBandwidthBugTest extends AVneAlgorithmPathBandwidthBugTest {

@Override
public void initAlgo(final SubstrateNetwork sNet, final Set<VirtualNetwork> vNets) {
algo = VnePmMdvneAlgorithmPipelineThreeStagesA.prepare(sNet, vNets);
}

@AfterEach
public void resetAlgo() {
facade.resetAll();
if (algo != null) {
((VnePmMdvneAlgorithmPipelineThreeStagesA) algo).dispose();
}
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package test.algorithms.pm.pipeline;

import java.util.Set;

import org.junit.jupiter.api.AfterEach;

import algorithms.pm.VnePmMdvneAlgorithmPipelineThreeStagesB;
import model.SubstrateNetwork;
import model.VirtualNetwork;
import test.algorithms.generic.AVneAlgorithmPathBandwidthBugTest;

/**
* Test class to trigger the minimum path/link bandwidth bug.
*
* @author Maximilian Kratz {@literal <maximilian.kratz@es.tu-darmstadt.de>}
*/
//@Disabled
public class VnePmMdvneAlgorithmPipelineThreeStagesBPathBandwidthBugTest extends AVneAlgorithmPathBandwidthBugTest {

@Override
public void initAlgo(final SubstrateNetwork sNet, final Set<VirtualNetwork> vNets) {
algo = VnePmMdvneAlgorithmPipelineThreeStagesB.prepare(sNet, vNets);
}

@AfterEach
public void resetAlgo() {
facade.resetAll();
if (algo != null) {
((VnePmMdvneAlgorithmPipelineThreeStagesB) algo).dispose();
}
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package test.algorithms.pm.pipeline;

import java.util.Set;

import org.junit.jupiter.api.AfterEach;

import algorithms.pm.VnePmMdvneAlgorithmPipelineTwoStagesRackA;
import model.SubstrateNetwork;
import model.VirtualNetwork;
import test.algorithms.generic.AVneAlgorithmPathBandwidthBugTest;

/**
* Test class to trigger the minimum path/link bandwidth bug.
*
* @author Maximilian Kratz {@literal <maximilian.kratz@es.tu-darmstadt.de>}
*/
//@Disabled
public class VnePmMdvneAlgorithmPipelineTwoStagesRackAPathBandwidthBugTest extends AVneAlgorithmPathBandwidthBugTest {

@Override
public void initAlgo(final SubstrateNetwork sNet, final Set<VirtualNetwork> vNets) {
algo = VnePmMdvneAlgorithmPipelineTwoStagesRackA.prepare(sNet, vNets);
}

@AfterEach
public void resetAlgo() {
facade.resetAll();
if (algo != null) {
((VnePmMdvneAlgorithmPipelineTwoStagesRackA) algo).dispose();
}
}

}

0 comments on commit 37013ac

Please sign in to comment.