Beispiel #1
0
 @SuppressWarnings("unchecked")
 public static Map<VirtualNetwork, Boolean> calculateMappedVnr(NetworkStack stack) {
   VirtualNetwork tempVnr;
   Network tmpN;
   boolean isMapped;
   Map<VirtualNetwork, Boolean> isMappedVnr = new LinkedHashMap<VirtualNetwork, Boolean>();
   for (Iterator<Network<?, ?, ?>> net = stack.iterator(); net.hasNext(); ) {
     tmpN = net.next();
     if (tmpN.getLayer() != 0) {
       tempVnr = (VirtualNetwork) tmpN;
       isMapped = true;
       for (VirtualNode tmpVNode : tempVnr.getVertices()) {
         for (AbstractDemand dem : tmpVNode) {
           if (dem instanceof CpuDemand) {
             if (dem.getMappings().isEmpty()) {
               isMapped = false;
             }
             break;
           }
         }
       }
       isMappedVnr.put(tempVnr, isMapped);
     }
   }
   return isMappedVnr;
 }
  @Override
  public double calculate() {
    HashMap<VirtualLink, Integer> lengths = new HashMap<VirtualLink, Integer>();

    SubstrateNetwork sNetwork = stack.getSubstrate();
    for (SubstrateLink sl : sNetwork.getEdges()) {
      LinkedList<VirtualLink> visited = new LinkedList<VirtualLink>();

      for (AbstractResource r : sl.get()) {
        for (Mapping m : r.getMappings()) {
          AbstractDemand d = m.getDemand();
          NetworkEntity<? extends AbstractConstraint> e = d.getOwner();
          if (e instanceof VirtualLink) {
            VirtualLink vl = (VirtualLink) e;

            if (!visited.contains(vl)) {
              visited.add(vl);

              Integer i = lengths.get(vl);
              if (i == null) {
                i = 1;
              } else {
                i++;
              }
              lengths.put(vl, i);
            }
          }
        }
      }
    }

    int sum = 0;
    for (Integer i : lengths.values()) {
      sum += i;
    }

    int counter = 0;
    for (@SuppressWarnings("rawtypes") Network net : stack) {
      if (net instanceof VirtualNetwork) {
        VirtualNetwork vNet = (VirtualNetwork) net;
        counter += vNet.getEdgeCount();
      }
    }

    return (counter == 0 ? 0.0 : (sum / (double) counter));
  }
  /** Node mapping method implementation */
  @Override
  protected boolean nodeMapping(VirtualNetwork vNet) {
    List<SubstrateNode> unmappedSnodes = super.getUnmappedsNodes();
    List<SubstrateNode> allNodes = new LinkedList<SubstrateNode>(sNet.getVertices());
    SubstrateNode mappedSnode = null;

    VirtualNode currVnode;
    List<SubstrateNode> candidates = new LinkedList<SubstrateNode>();

    // Move through the virtual nodes
    for (Iterator<VirtualNode> itt = vNet.getVertices().iterator(); itt.hasNext(); ) {
      currVnode = itt.next();
      // Find the candidate substrate nodes accomplishing the virtual node
      // demands
      for (AbstractDemand dem : currVnode) {
        if (dem instanceof CpuDemand) {
          if (!nodeOverload) {
            if (!withDist) {
              candidates = findFulfillingNodes(dem, unmappedSnodes);
            } else {
              candidates = findFulfillingNodes(currVnode, dem, unmappedSnodes, distance);
            }
          } else {
            if (!withDist) {
              candidates = findFulfillingNodes(dem, allNodes);
            } else {
              candidates = findFulfillingNodes(currVnode, dem, allNodes, distance);
            }
          }
        }
        // Find the feasible node with greatest available resources
        // The available resources are the H value defined in the
        // "Rethinking virtual network embedding" paper

        mappedSnode = bestAvailableResources(candidates);
        if (mappedSnode != null) {
          // Realize the node mapping
          if (NodeLinkAssignation.vnm(currVnode, mappedSnode)) {
            nodeMapping.put(currVnode, mappedSnode);
          } else {
            // If this exception is thrown, it means that something
            // in the code is wrong. The feasibility of nodes is
            // checked in findFulfillingNodes

            throw new AssertionError("But we checked before!");
          }
        } else {
          // Mapping is not possible, not feasible nodes
          return false;
        }
      }
    }
    return true;
  }
  private static List<VirtualNetwork> createVNDemands() {
    List<VirtualNetwork> vns = new LinkedList<VirtualNetwork>();
    IdDemand idDem;
    CpuDemand cpuDem;
    BandwidthDemand bwDem;

    // Network with Layer (x) MUST be instance before Network Layer (x+1)

    // Virtual network: Layer 1
    VirtualNetwork vn1 = new VirtualNetwork(1);
    vns.add(vn1);

    VirtualNode vC = new VirtualNode(1);
    idDem = new IdDemand(vC);
    idDem.setDemandedId("5");
    assertTrue(vC.add(idDem));
    cpuDem = new CpuDemand(vC);
    cpuDem.setDemandedCycles(25.0);
    assertTrue(vC.add(cpuDem));
    assertTrue(vn1.addVertex(vC));

    VirtualNode vD = new VirtualNode(1);
    idDem = new IdDemand(vD);
    idDem.setDemandedId("2");
    assertTrue(vD.add(idDem));
    cpuDem = new CpuDemand(vD);
    cpuDem.setDemandedCycles(25.0);
    assertTrue(vD.add(cpuDem));
    assertTrue(vn1.addVertex(vD));

    VirtualLink eCD = new VirtualLink(1);
    bwDem = new BandwidthDemand(eCD);
    bwDem.setDemandedBandwidth(10.0);
    assertTrue(eCD.add(bwDem));
    assertTrue(vn1.addEdge(eCD, vC, vD));

    // Virtual network layer 2
    VirtualNetwork vn0 = new VirtualNetwork(2);
    vns.add(vn0);

    VirtualNode vA = new VirtualNode(2);
    idDem = new IdDemand(vA);
    idDem.setDemandedId("1");
    assertTrue(vA.add(idDem));
    cpuDem = new CpuDemand(vA);
    cpuDem.setDemandedCycles(25.0);
    assertTrue(vA.add(cpuDem));
    assertTrue(vn0.addVertex(vA));

    VirtualNode vB = new VirtualNode(2);
    idDem = new IdDemand(vB);
    idDem.setDemandedId("3");
    assertTrue(vB.add(idDem));
    cpuDem = new CpuDemand(vB);
    cpuDem.setDemandedCycles(50.0);
    assertTrue(vB.add(cpuDem));
    assertTrue(vn0.addVertex(vB));

    VirtualNode vE = new VirtualNode(2);
    idDem = new IdDemand(vE);
    idDem.setDemandedId("4");
    assertTrue(vE.add(idDem));
    cpuDem = new CpuDemand(vE);
    cpuDem.setDemandedCycles(10.0);
    assertTrue(vE.add(cpuDem));
    assertTrue(vn0.addVertex(vE));

    VirtualLink eAB = new VirtualLink(2);
    bwDem = new BandwidthDemand(eAB);
    bwDem.setDemandedBandwidth(10.0);
    assertTrue(eAB.add(bwDem));
    assertTrue(vn0.addEdge(eAB, vA, vB));

    VirtualLink eBE = new VirtualLink(2);
    bwDem = new BandwidthDemand(eBE);
    bwDem.setDemandedBandwidth(10.0);
    assertTrue(eBE.add(bwDem));
    assertTrue(vn0.addEdge(eBE, vB, vE));

    return vns;
  }