Beispiel #1
0
def launch(topo, ip, servers):
    """
    Launch Hedera Controller

    topo is in format toponame,arg1,arg2,...
    """
    # Boot up ARP Responder
    from proto.arp_responder import launch as arp_launch
    arp_launch(eat_packets=False, **{str(ip): True})
    import logging
    logging.getLogger("proto.arp_responder").setLevel(logging.WARN)

    # Instantiate a topo object from the passed-in file.
    if not topo:
        raise Exception("please specify topo and args on cmd line")
    else:
        t = buildTopo(topo, topos)
        r = getRouting('hashed', t)
        servers = servers.replace(",", " ").split()
        servers = [IPAddr(x) for x in servers]
        ip = IPAddr(ip)
    log.info("Load Balancer Ready.")
    core.registerNew(HederaController, t, r, IPAddr(ip), servers)

    log.info("Hedera running with topo=%s." % topo)
Beispiel #2
0
def launch(ip, servers):
    servers = servers.replace(",", " ").split()
    servers = [IPAddr(x) for x in servers]
    ip = IPAddr(ip)

    # Boot up ARP Responder
    from proto.arp_responder import launch as arp_launch
    arp_launch(eat_packets=False, **{str(ip): True})
    import logging
    logging.getLogger("proto.arp_responder").setLevel(logging.WARN)

    def _handle_ConnectionUp(event):
        global _dpid
        if _dpid is None:
            log.info("IP Load Balancer Ready.")
            core.registerNew(iplb, event.connection, IPAddr(ip), servers)
            _dpid = event.dpid

        if _dpid != event.dpid:
            log.warn("Ignoring switch %s", event.connection)
        else:
            log.info("Load Balancing on %s", event.connection)

            # Gross hack
            core.iplb.con = event.connection
            event.connection.addListeners(core.iplb)

    core.openflow.addListenerByName("ConnectionUp", _handle_ConnectionUp)
def launch(ip, servers):
    servers = servers.replace(",", " ").split()
    servers = [IPAddr(x) for x in servers]
    ip = IPAddr(ip)

    # Boot up ARP Responder
    from proto.arp_responder import launch as arp_launch

    arp_launch(eat_packets=False, **{str(ip): True})
    import logging

    logging.getLogger("proto.arp_responder").setLevel(logging.WARN)

    def _handle_ConnectionUp(event):
        global _dpid
        if _dpid is None:
            log.info("IP Load Balancer Ready.")
            core.registerNew(iplb, event.connection, IPAddr(ip), servers)
            _dpid = event.dpid

        if _dpid != event.dpid:
            log.warn("Ignoring switch %s", event.connection)
        else:
            log.info("Load Balancing on %s", event.connection)

            # Gross hack
            core.iplb.con = event.connection
            event.connection.addListeners(core.iplb)

    core.openflow.addListenerByName("ConnectionUp", _handle_ConnectionUp)
def launch(ip, servers, dpid=None):

    disable_flood = False

    global all_ports
    if disable_flood:
        all_ports = of.OFPP_ALL

    #core.openflow.addListenerByName("PacketIn", _handle_PacketIn)

    log.info("Pair-Learning switch running.")
    global _dpid
    if dpid is not None:
        _dpid = str_to_dpid(dpid)

    servers = servers.replace(",", " ").split()
    servers = [IPAddr(x) for x in servers]
    ip = IPAddr(ip)

    # We only want to enable ARP Responder *only* on the load balancer switch,
    # so we do some disgusting hackery and then boot it up.
    from proto.arp_responder import ARPResponder
    old_pi = ARPResponder._handle_PacketIn

    def new_pi(self, event):
        if event.dpid == _dpid:
            # Yes, the packet-in is on the right switch
            return old_pi(self, event)

    ARPResponder._handle_PacketIn = new_pi

    # Hackery done.  Now start it.
    from proto.arp_responder import launch as arp_launch
    arp_launch(eat_packets=False, **{str(ip): True})
    import logging
    logging.getLogger("proto.arp_responder").setLevel(logging.WARN)

    def _handle_ConnectionUp(event):
        global _dpid
        if _dpid is None:
            _dpid = event.dpid

        if _dpid != event.dpid:
            log.warn("Ignoring switch %s", event.connection)
        else:
            if not core.hasComponent('iplb'):
                # Need to initialize first...
                core.registerNew(iplb, event.connection, IPAddr(ip), servers)
                log.info("IP Load Balancer Ready.")
            log.info("Load Balancing on %s", event.connection)

            # Gross hack
            core.iplb.con = event.connection
            event.connection.addListeners(core.iplb)

    core.openflow.addListenerByName("ConnectionUp", _handle_ConnectionUp)
Beispiel #5
0
def launch (ip, servers, dpid = None):
  global _dpid
  if dpid is not None:
    _dpid = str_to_dpid(dpid)

  servers = servers.replace(","," ").split()
  servers = [IPAddr(x) for x in servers]
  ip = IPAddr(ip)
  

  from proto.arp_responder import ARPResponder
  old_pi = ARPResponder._handle_PacketIn
  def new_pi (self, event):
    if event.dpid == _dpid:
      # Yes, the packet-in is on the right switch
      return old_pi(self, event)
  ARPResponder._handle_PacketIn = new_pi

  # Hackery done.  Now start it.
  from proto.arp_responder import launch as arp_launch
  arp_launch(eat_packets=False,**{str(ip):True})
  import logging
  logging.getLogger("proto.arp_responder").setLevel(logging.WARN)


  def _handle_ConnectionUp (event):
    global _dpid
    if _dpid is None:
      _dpid = event.dpid

    if _dpid != event.dpid:
      log.warn("Ignoring switch %s", event.connection)
      LearningSwitch(event.connection, False)
    else:
      if not core.hasComponent('iplb'):
        # Need to initialize first...
        core.registerNew(iplb, event.connection, IPAddr(ip), servers)
	#log.info("DPID:", _dpid)
        log.info("IP Load Balancer Ready.")
      log.info("Load Balancing on %s", event.connection)

      # Gross hack
      core.iplb.con = event.connection
      event.connection.addListeners(core.iplb)


  core.openflow.addListenerByName("ConnectionUp", _handle_ConnectionUp)
Beispiel #6
0
def launch (ip, servers, dpid = None):
  global _dpid
  if dpid is not None:
    _dpid = str_to_dpid(dpid)

  servers = servers.replace(","," ").split()
  servers = [IPAddr(x) for x in servers]
  ip = IPAddr(ip)


  # We only want to enable ARP Responder *only* on the load balancer switch,
  # so we do some disgusting hackery and then boot it up.
  from proto.arp_responder import ARPResponder
  old_pi = ARPResponder._handle_PacketIn
  def new_pi (self, event):
    if event.dpid == _dpid:
      # Yes, the packet-in is on the right switch
      return old_pi(self, event)
  ARPResponder._handle_PacketIn = new_pi

  # Hackery done.  Now start it.
  from proto.arp_responder import launch as arp_launch
  arp_launch(eat_packets=False,**{str(ip):True})
  import logging
  logging.getLogger("proto.arp_responder").setLevel(logging.WARN)


  def _handle_ConnectionUp (event):
    global _dpid
    if _dpid is None:
      _dpid = event.dpid

    if _dpid != event.dpid:
      log.warn("Ignoring switch %s", event.connection)
    else:
      if not core.hasComponent('iplb'):
        # Need to initialize first...
        core.registerNew(iplb, event.connection, IPAddr(ip), servers)
        log.info("IP Load Balancer Ready.")
      log.info("Load Balancing on %s", event.connection)

      # Gross hack
      core.iplb.con = event.connection
      event.connection.addListeners(core.iplb)


  core.openflow.addListenerByName("ConnectionUp", _handle_ConnectionUp)
Beispiel #7
0
def launchLB(service_ip, service_servers, sw_dpid):
    try:
        # service_servers = service_servers.replace(","," ").split()
        # servers = [IPAddr(x) for x in service_servers]
        ip = IPAddr(service_ip)
        _dpid = sw_dpid

        objname = "arp_resp_" + _dpid
        arp_launch(eat_packets=False, objname=objname, **{str(ip): True})
        logging.getLogger("proto.arp_responder").setLevel(logging.WARN)

        # log.info("IP Load Balancer Ready for Switch %s", _dpid)
        # core.registerNew(iplb, event.connection, IPAddr(ip), servers)
        # log.info("Load Balancing on %s", _dpid)

    except Exception as ex:
        print ex
Beispiel #8
0
def launch(ip, servers, lb_dpid, weights=None):
    global _dpid, LBinitDone
    try:

        servers = servers.replace(",", " ").split()
        servers = [IPAddr(x) for x in servers]
        if weights is not None:
            weights = weights.replace(",", " ").split()
            weights = [int(x) for x in weights]
        ip = IPAddr(ip)
        _dpid = str_to_dpid(lb_dpid)

        # Boot up ARP Responder
        from proto.arp_responder import launch as arp_launch
        arp_launch(eat_packets=False, **{str(ip): True})
        import logging
        logging.getLogger("proto.arp_responder").setLevel(logging.WARN)

        def _handle_ConnectionUp(event):
            global _dpid, LBinitDone

            # if event.dpid is not same as provided LB's dpid, start learning switch
            if _dpid != event.dpid:
                log.warn("NOT LB switch %s. Will run learning mode",
                         event.connection)
                LearningSwitch(event.connection, False)
            else:
                # this is LB's switch. init if not done already
                if (LBinitDone != 1):
                    log.info("IP Load Balancer Ready.")
                    core.registerNew(iplb, event.connection, IPAddr(ip),
                                     servers, weights)
                    LBinitDone = 1

                log.info("Load Balancing on %s", event.connection)

                # Gross hack
                core.iplb.con = event.connection
                event.connection.addListeners(core.iplb)

    except Exception as ex:
        print ex

    core.openflow.addListenerByName("ConnectionUp", _handle_ConnectionUp)
Beispiel #9
0
def launch (ip, servers, dpid = None):
  global _dpid
  if dpid is not None:
    _dpid = str_to_dpid(dpid)

  servers = servers.replace(","," ").split()
  servers = [IPAddr(x) for x in servers]
  ip = IPAddr(ip)


  # We only want to enable ARP Responder *only* on the load balancer switch,
  # so we do some disgusting hackery and then boot it up.
  from proto.arp_responder import ARPResponder
  old_pi = ARPResponder._handle_PacketIn
  def new_pi (self, event):

   if event.dpid == _dpid:
      # Yes, the packet-in is on the right switch
      return old_pi(self, event)
  ARPResponder._handle_PacketIn = new_pi

  # Hackery done.  Now start it.
  from proto.arp_responder import launch as arp_launch
  arp_launch(eat_packets=False,**{str(ip):True})
  import logging
  logging.getLogger("proto.arp_responder").setLevel(logging.WARN)


  def _handle_ConnectionUp (event):
    global _dpid
    if _dpid is None:
      _dpid = event.dpid

    if _dpid != event.dpid:
      log.warn("Ignoring switch %s", event.connection)
   else:
def launch(ip, servers, weights_val=[], dpid=None, algorithm='random'):
    global _dpid
    global _algorithm

    if dpid is not None:
        _dpid = str_to_dpid(dpid)

    if algorithm not in ALGORITHM_LIST:
        log.error("Algorithm %s is not allowed, allowed algorithms: %s",
                  algorithm, ALGORITHM_LIST.keys())
        exit(1)

    # Getting the servers IP.
    servers = servers.replace(",", " ").split()
    servers = [IPAddr(x) for x in servers]

    # Parsing the weights for each server.
    weights = {}
    if len(weights_val) is 0:
        weights_val = ""
        for x in servers:
            weights_val += "1,"

    weights_val = weights_val.replace(",", " ").split()

    if len(weights_val) is not len(servers):
        log.error("Weights array is not the same length than servers array")
        exit(1)

    for i in range(len(servers)):
        weights[servers[i]] = int(weights_val[i])

    # Getting the controller IP.
    ip = IPAddr(ip)

    # We only want to enable ARP Responder *only* on the load balancer switch,
    # so we do some disgusting hackery and then boot it up.
    from proto.arp_responder import ARPResponder
    old_pi = ARPResponder._handle_PacketIn

    def new_pi(self, event):
        if event.dpid == _dpid:
            # Yes, the packet-in is on the right switch
            return old_pi(self, event)

    ARPResponder._handle_PacketIn = new_pi

    # Hackery done.  Now start it.
    from proto.arp_responder import launch as arp_launch
    arp_launch(eat_packets=False, **{str(ip): True})

    import logging
    logging.getLogger("proto.arp_responder").setLevel(logging.WARN)

    def _handle_ConnectionUp(event):
        global _dpid
        if _dpid is None:
            _dpid = event.dpid

        if _dpid != event.dpid:
            log.warn("Ignoring switch %s", event.connection)
        else:
            if not core.hasComponent('iplb'):
                # Need to initialize first...

                core.registerNew(iplb, event.connection, algorithm, IPAddr(ip),
                                 weights, servers)

                log.info("IP Load Balancer Ready.")
            log.info("Load Balancing on %s", event.connection)

            # Gross hack
            core.iplb.con = event.connection
            event.connection.addListeners(core.iplb)

    def _handle_FlowStatsReceived(event):
        for f in event.stats:
            ip_dst = f.match.nw_dst
            ip_src = f.match.nw_src

            if ip_dst != None and IPAddr(ip_dst) in core.iplb.servers:
                core.iplb.data_transferred[IPAddr(ip_dst)] += f.byte_count

            if ip_src != None and IPAddr(ip_src) in core.iplb.servers:
                core.iplb.data_transferred[IPAddr(ip_src)] += f.byte_count

    core.openflow.addListenerByName("FlowStatsReceived",
                                    _handle_FlowStatsReceived)
    core.openflow.addListenerByName("ConnectionUp", _handle_ConnectionUp)

    from pox.lib.recoco import Timer

    # Send the flow stats to all the switches connected to the controller.
    def _timer_func():
        for connection in core.openflow._connections.values():
            connection.send(
                of.ofp_stats_request(body=of.ofp_flow_stats_request()))

    # Request flow stats every FLOW_IDLE_TIMEOUT second.
    Timer(FLOW_IDLE_TIMEOUT, _timer_func, recurring=True)
def launch(ip, servers, strategy=RANDON, dpid=None):
    global _dpid, strategy_choosed, server_order, len_server_order
    if dpid is not None:
        _dpid = str_to_dpid(dpid)

    if strategy is not None:
        strategy_choosed = strategy

    if strategy_choosed != RANDON and strategy_choosed != ROUND_ROBIN and strategy_choosed != ROUND_ROBIN_WEIGHT:
        strategy_choosed = RANDON
        log.warning(
            'The strategy {} is not a validy stratery. Random strategy was put in place.'
            .format(strategy))

    log.info('Strategy {} used.'.format(strategy_choosed))

    if strategy_choosed == ROUND_ROBIN_WEIGHT:
        s = servers.replace(",", " ").split()
        servers = []

        for i, server in enumerate(s):
            server = server.split(':')
            servers.append(IPAddr(server[0]))

            if len(server) == 1:
                server_order.append(i)
            else:
                for k in range(0, int(server[1])):
                    server_order.append(i)

        len_server_order = len(server_order)
        log.info('Server ordering {}'.format(server_order))

    else:
        servers = servers.replace(",", " ").split()
        servers = [IPAddr(x) for x in servers]
        ip = IPAddr(ip)

    # We only want to enable ARP Responder *only* on the load balancer switch,
    # so we do some disgusting hackery and then boot it up.
    from proto.arp_responder import ARPResponder
    old_pi = ARPResponder._handle_PacketIn

    def new_pi(self, event):
        if event.dpid == _dpid:
            # Yes, the packet-in is on the right switch
            return old_pi(self, event)

    ARPResponder._handle_PacketIn = new_pi

    # Hackery done.  Now start it.
    from proto.arp_responder import launch as arp_launch
    arp_launch(eat_packets=False, **{str(ip): True})
    import logging
    logging.getLogger("proto.arp_responder").setLevel(logging.WARN)

    def _handle_ConnectionUp(event):
        global _dpid
        if _dpid is None:
            _dpid = event.dpid

        if _dpid != event.dpid:
            log.warn("Ignoring switch %s", event.connection)
        else:
            if not core.hasComponent('iplb'):
                # Need to initialize first...
                core.registerNew(iplb, event.connection, IPAddr(ip), servers)
                log.info("IP Load Balancer Ready.")
            log.info("Load Balancing on %s", event.connection)

            # Gross hack
            core.iplb.con = event.connection
            event.connection.addListeners(core.iplb)

    core.openflow.addListenerByName("ConnectionUp", _handle_ConnectionUp)