def __init__(self,
                 start_cmd="",
                 address="127.0.0.1",
                 port=None,
                 additional_ports={},
                 cwd=None,
                 sync=None,
                 controller_type=None,
                 label=None,
                 config_file=None,
                 config_template=None,
                 try_new_ports=False,
                 kill_cmd="",
                 restart_cmd="",
                 get_address_cmd="",
                 launch_in_network_namespace=False,
                 snapshot_address=""):
        '''
    Store metadata for the controller.
      - start_cmd: command that starts a controller or a set of controllers,
          followed by a list of command line tokens as arguments. You may make
          use of two macros: __address__ expands to some available IP address
          for the controller, and __port__ expands to some available (OpenFlow) port.
      - kill_cmd: command that kills a controller or a set of controllers,
          followed by a list of command line tokens as arguments
      - address, port: controller socket info for listening to OpenFlow
        connections from switches. address may be specified as "auto" to automatically find a
        non-localhost IP address in the range 192.168.1.0/24, or "__address__" to use
        get_address_cmd to choose an address.
      - get_address_cmd: an optional bash command that returns an address for
        the controller to bind to.
      - controller_type: controller type, specified by the corresponding Controller
          class itself, or a string chosen from one of the keys in controller_type_map
      - snapshot_address: path to unix domain socket where (if configured)
        controller will be listening for snapshot commands
    '''
        if start_cmd == "":
            raise RuntimeError("Must specify boot parameters.")
        self.start_cmd = start_cmd
        self.kill_cmd = kill_cmd
        self.restart_cmd = restart_cmd
        self.launch_in_network_namespace = launch_in_network_namespace
        self.snapshot_address = snapshot_address
        if launch_in_network_namespace and (address == "127.0.0.1"
                                            or address == "localhost"):
            raise ValueError(
                """Must set a non-localhost address for namespace controller.\n"""
                """Specify `auto` to automatically find an available IP.""")

        # Set label
        if label is None:
            label = "c%s" % str(self._controller_count_gen.next())
        if label in self._controller_labels:
            raise ValueError("Label %s already registered!" % label)
        self._controller_labels.add(label)
        self.label = label

        # Set index, for assigning IP addresses in the case of multiple controllers
        match = re.search("c(\d+)", self.label)
        if match:
            self.index = int(match.groups()[0])
        else:
            self.index = None

        # Set address.
        if address == "__address__":
            address = self.get_address(get_address_cmd, cwd)
        elif address == "auto":
            # TODO(cs): need to add support for auto to the sync uri.
            address = IPAddressSpace.find_unclaimed_address()
        self.address = address
        IPAddressSpace.register_address(address)

        if address_is_ip(address) or address == "localhost":
            # Normal TCP socket
            if not port:
                port = self._port_gen[address].next()
            if try_new_ports:
                port = find_port(xrange(port, port + 2000))
            self.port = port
            self._server_info = (self.address, port)
        else:
            # Unix domain socket
            self.port = None
            self._server_info = address

        self.controller_type = controller_type
        if controller_type is None:
            for t in controller_type_map.keys():
                if t in self.start_cmd:
                    self.controller_class = controller_type_map[t]
                    break
            else:
                # Default to Base Controller class
                self.controller_class = Controller
        else:
            if controller_type not in controller_type_map.keys():
                raise RuntimeError("Unknown controller type: %s" %
                                   controller_type)
            self.controller_class = controller_type_map[controller_type]

        self.cwd = cwd
        if not cwd:
            sys.stderr.write("""
        =======================================================================
        WARN - no working directory defined for controller with command line
        %s
        The controller is run in the STS base directory. This may result
        in unintended consequences (i.e. controller not logging correctly).
        =======================================================================
        \n""" % (self.start_cmd))

        self.sync = sync

        self.config_file = config_file
        self.config_template = config_template
        self.additional_ports = additional_ports
Example #2
0
 def _new_child_url(self, ip='localhost', port=None):
     # Called within the parent process
     if port is None:
         port = find_port(xrange(3000, 6000))
     return (ip, port)
Example #3
0
 def _new_child_url(self, ip="localhost", port=None):
     # Called within the parent process
     if port is None:
         port = find_port(xrange(3000, 6000))
     return (ip, port)
  def __init__(self, start_cmd="", address="127.0.0.1", port=None, additional_ports={},
               cwd=None, sync=None, controller_type=None, label=None, config_file=None,
               config_template=None, try_new_ports=False, kill_cmd="", restart_cmd="",
               get_address_cmd="", launch_in_network_namespace=False):
    '''
    Store metadata for the controller.
      - start_cmd: command that starts a controller or a set of controllers,
          followed by a list of command line tokens as arguments. You may make
          use of two macros: __address__ expands to some available IP address
          for the controller, and __port__ expands to some available (OpenFlow) port.
      - kill_cmd: command that kills a controller or a set of controllers,
          followed by a list of command line tokens as arguments
      - address, port: controller socket info for listening to OpenFlow
        connections from switches. address may be specified as "auto" to automatically find a
        non-localhost IP address in the range 192.168.1.0/24, or "__address__" to use
        get_address_cmd to choose an address.
      - get_address_cmd: an optional bash command that returns an address for
        the controller to bind to.
      - controller_type: controller type, specified by the corresponding Controller
          class itself, or a string chosen from one of the keys in controller_type_map
    '''
    if start_cmd == "":
      raise RuntimeError("Must specify boot parameters.")
    self.start_cmd = start_cmd
    self.kill_cmd = kill_cmd
    self.restart_cmd = restart_cmd
    self.launch_in_network_namespace = launch_in_network_namespace
    if launch_in_network_namespace and (address == "127.0.0.1" or address == "localhost"):
      raise ValueError("""Must set a non-localhost address for namespace controller.\n"""
                       """Specify `auto` to automatically find an available IP.""")

    # Set label
    if label is None:
      label = "c%s" % str(self._controller_count_gen.next())
    if label in self._controller_labels:
      raise ValueError("Label %s already registered!" % label)
    self._controller_labels.add(label)
    self.label = label

    # Set index, for assigning IP addresses in the case of multiple controllers
    match = re.search("c(\d+)", self.label)
    if match:
      self.index = int(match.groups()[0])
    else:
      self.index = None

    # Set address.
    if address == "__address__":
      address = self.get_address(get_address_cmd, cwd)
    elif address == "auto":
      # TODO(cs): need to add support for auto to the sync uri.
      address = IPAddressSpace.find_unclaimed_address()
    self.address = address
    IPAddressSpace.register_address(address)

    if address_is_ip(address) or address == "localhost":
      # Normal TCP socket
      if not port:
        port = self._port_gen[address].next()
      if try_new_ports:
        port = find_port(xrange(port, port+2000))
      self.port = port
      self._server_info = (self.address, port)
    else:
      # Unix domain socket
      self.port = None
      self._server_info = address

    self.controller_type = controller_type
    if controller_type is None:
      for t in controller_type_map.keys():
        if t in self.start_cmd:
          self.controller_class = controller_type_map[t]
          break
      else:
        # Default to Base Controller class
        self.controller_class = Controller
    else:
      if controller_type not in controller_type_map.keys():
        raise RuntimeError("Unknown controller type: %s" % controller_type)
      self.controller_class = controller_type_map[controller_type]

    self.cwd = cwd
    if not cwd:
        sys.stderr.write("""
        =======================================================================
        WARN - no working directory defined for controller with command line
        %s
        The controller is run in the STS base directory. This may result
        in unintended consequences (i.e. controller not logging correctly).
        =======================================================================
        \n""" % (self.start_cmd) )

    self.sync = sync

    self.config_file = config_file
    self.config_template = config_template
    self.additional_ports = additional_ports