예제 #1
0
    def test_build_network_definition(self):
        ndef = RsnOmsUtil.build_network_definition(self._rsn_oms)

        if log.isEnabledFor(logging.TRACE):
            # serialize object to string
            serialization = NetworkUtil.serialize_network_definition(ndef)
            log.trace("NetworkDefinition serialization:\n%s", serialization)

        if not isinstance(self._rsn_oms, CIOMSSimulator):
            # OK, no more tests if we are not using the embedded simulator
            return

        # Else: do some verifications against network.yml (the spec used by
        # the simulator):

        self.assertTrue("UPS" in ndef.platform_types)

        pnode = ndef.root

        self.assertEqual(pnode.platform_id, "ShoreStation")
        self.assertIn("ShoreStation_attr_1|0", pnode.attrs)
        self.assertIn("ShoreStation_port_1", pnode.ports)

        sub_pnodes = pnode.subplatforms
        self.assertIn("L3-UPS1",       sub_pnodes)
        self.assertIn("Node1A",        sub_pnodes)
        self.assertIn("input_voltage|0", sub_pnodes["Node1A"].attrs)
        self.assertIn("Node1A_port_1", sub_pnodes["Node1A"].ports)
예제 #2
0
    def setUp(self):
        self.DVR_CONFIG = {
            'oms_uri': self._dispatch_simulator('launchsimulator'),
            'attributes': {},
            'ports': {}
        }
        log.debug("DVR_CONFIG['oms_uri'] = %s", self.DVR_CONFIG['oms_uri'])

        yaml_filename = 'ion/agents/platform/rsn/simulator/network.yml'
        log.debug("retrieving network definition from %s", yaml_filename)
        network_definition = NetworkUtil.deserialize_network_definition(
            file(yaml_filename))

        if log.isEnabledFor(logging.DEBUG):
            network_definition_ser = NetworkUtil.serialize_network_definition(
                network_definition)
            log.debug("NetworkDefinition serialization:\n%s",
                      network_definition_ser)

        platform_id = self.PLATFORM_ID
        pnode = network_definition.pnodes[platform_id]

        def evt_recv(driver_event):
            log.debug('GOT driver_event=%s', str(driver_event))

        self._plat_driver = RSNPlatformDriver(pnode, evt_recv, Mock(), Mock())
        res_state = self._plat_driver.get_resource_state()
        self.assertEqual(res_state, RSNPlatformDriverState.UNCONFIGURED)
    def setUp(self):
        self._start_container()

        self.container.start_rel_from_url('res/deploy/r2deploy.yml')

        self.RR   = ResourceRegistryServiceClient(node=self.container.node)
        self.IMS  = InstrumentManagementServiceClient(node=self.container.node)
        self.DAMS = DataAcquisitionManagementServiceClient(node=self.container.node)
        self.DP   = DataProductManagementServiceClient(node=self.container.node)
        self.PSC  = PubsubManagementServiceClient(node=self.container.node)
        self.PDC  = ProcessDispatcherServiceClient(node=self.container.node)
        self.DSC  = DatasetManagementServiceClient()
        self.IDS  = IdentityManagementServiceClient(node=self.container.node)
        self.RR2  = EnhancedResourceRegistryClient(self.RR)


        # Use the network definition provided by RSN OMS directly.
        rsn_oms = CIOMSClientFactory.create_instance(DVR_CONFIG['oms_uri'])
        self._network_definition = RsnOmsUtil.build_network_definition(rsn_oms)
        # get serialized version for the configuration:
        self._network_definition_ser = NetworkUtil.serialize_network_definition(self._network_definition)
        if log.isEnabledFor(logging.TRACE):
            log.trace("NetworkDefinition serialization:\n%s", self._network_definition_ser)


        self._async_data_result = AsyncResult()
        self._data_subscribers = []
        self._samples_received = []
        self.addCleanup(self._stop_data_subscribers)

        self._async_event_result = AsyncResult()
        self._event_subscribers = []
        self._events_received = []
        self.addCleanup(self._stop_event_subscribers)
        self._start_event_subscriber()
    def setUp(self):
        self.DVR_CONFIG = {
            'oms_uri':    self._dispatch_simulator('launchsimulator'),
            'attributes': {},
            'ports':      {}
        }
        log.debug("DVR_CONFIG['oms_uri'] = %s", self.DVR_CONFIG['oms_uri'])

        yaml_filename = 'ion/agents/platform/rsn/simulator/network.yml'
        log.debug("retrieving network definition from %s", yaml_filename)
        network_definition = NetworkUtil.deserialize_network_definition(file(yaml_filename))

        if log.isEnabledFor(logging.DEBUG):
            network_definition_ser = NetworkUtil.serialize_network_definition(network_definition)
            log.debug("NetworkDefinition serialization:\n%s", network_definition_ser)

        platform_id = self.PLATFORM_ID
        pnode = network_definition.pnodes[platform_id]

        def evt_recv(driver_event):
            log.debug('GOT driver_event=%s', str(driver_event))

        self._plat_driver = RSNPlatformDriver(pnode, evt_recv, Mock(), Mock())
        res_state = self._plat_driver.get_resource_state()
        self.assertEqual(res_state, RSNPlatformDriverState.UNCONFIGURED)
예제 #5
0
    def test_build_network_definition(self):
        ndef = RsnOmsUtil.build_network_definition(self._rsn_oms)

        if log.isEnabledFor(logging.TRACE):
            # serialize object to string
            serialization = NetworkUtil.serialize_network_definition(ndef)
            log.trace("NetworkDefinition serialization:\n%s", serialization)

        if not isinstance(self._rsn_oms, CIOMSSimulator):
            # OK, no more tests if we are not using the embedded simulator
            return

        # Else: do some verifications against network.yml (the spec used by
        # the simulator):

        self.assertTrue("UPS" in ndef.platform_types)

        pnode = ndef.root

        self.assertEqual(pnode.platform_id, "ShoreStation")
        self.assertTrue("ShoreStation_attr_1" in pnode.attrs)
        self.assertTrue("ShoreStation_port_1" in pnode.ports)

        sub_pnodes = pnode.subplatforms
        self.assertTrue("L3-UPS1" in sub_pnodes)
        self.assertTrue("Node1A" in sub_pnodes)
        self.assertTrue("input_voltage" in sub_pnodes["Node1A"].attrs)
        self.assertTrue("Node1A_port_1" in sub_pnodes["Node1A"].ports)
    def setUp(self):
        self._start_container()

        self.container.start_rel_from_url('res/deploy/r2deploy.yml')

        self.RR   = ResourceRegistryServiceClient(node=self.container.node)
        self.IMS  = InstrumentManagementServiceClient(node=self.container.node)
        self.DAMS = DataAcquisitionManagementServiceClient(node=self.container.node)
        self.DP   = DataProductManagementServiceClient(node=self.container.node)
        self.PSC  = PubsubManagementServiceClient(node=self.container.node)
        self.PDC  = ProcessDispatcherServiceClient(node=self.container.node)
        self.DSC  = DatasetManagementServiceClient()
        self.IDS  = IdentityManagementServiceClient(node=self.container.node)
        self.RR2  = EnhancedResourceRegistryClient(self.RR)

        self.org_id = self.RR2.create(any_old(RT.Org))
        log.debug("Org created: %s", self.org_id)

        # Use the network definition provided by RSN OMS directly.
        rsn_oms = CIOMSClientFactory.create_instance(DVR_CONFIG['oms_uri'])
        self._network_definition = RsnOmsUtil.build_network_definition(rsn_oms)
        CIOMSClientFactory.destroy_instance(rsn_oms)

        # get serialized version for the configuration:
        self._network_definition_ser = NetworkUtil.serialize_network_definition(self._network_definition)
        log.trace("NetworkDefinition serialization:\n%s", self._network_definition_ser)

        # set attributes for the platforms:
        self._platform_attributes = {}
        for platform_id in self._network_definition.pnodes:
            pnode = self._network_definition.pnodes[platform_id]
            dic = dict((attr.attr_id, attr.defn) for attr in pnode.attrs.itervalues())
            self._platform_attributes[platform_id] = dic
        log.trace("_platform_attributes: %s", self._platform_attributes)

        # set ports for the platforms:
        self._platform_ports = {}
        for platform_id in self._network_definition.pnodes:
            pnode = self._network_definition.pnodes[platform_id]
            dic = {}
            for port_id, port in pnode.ports.iteritems():
                dic[port_id] = dict(port_id=port_id,
                                    network=port.network)
            self._platform_ports[platform_id] = dic
        log.trace("_platform_ports: %s", self._platform_attributes)

        self._async_data_result = AsyncResult()
        self._data_subscribers = []
        self._samples_received = []
        self.addCleanup(self._stop_data_subscribers)

        self._async_event_result = AsyncResult()
        self._event_subscribers = []
        self._events_received = []
        self.addCleanup(self._stop_event_subscribers)
        self._start_event_subscriber()
예제 #7
0
    def test_serialization_deserialization(self):
        # create NetworkDefinition object by de-serializing the simulated network:
        ndef = NetworkUtil.deserialize_network_definition(
                file('ion/agents/platform/rsn/simulator/network.yml'))

        # serialize object to string
        serialization = NetworkUtil.serialize_network_definition(ndef)

        # recreate object by de-serializing the string:
        ndef2 = NetworkUtil.deserialize_network_definition(serialization)

        # verify the objects are equal:
        self.assertEquals(ndef.diff(ndef2), None)
예제 #8
0
    def test_serialization_deserialization(self):
        # create NetworkDefinition object by de-serializing the simulated network:
        ndef = NetworkUtil.deserialize_network_definition(
                file('ion/agents/platform/rsn/simulator/network.yml'))

        # serialize object to string
        serialization = NetworkUtil.serialize_network_definition(ndef)

        # recreate object by de-serializing the string:
        ndef2 = NetworkUtil.deserialize_network_definition(serialization)

        # verify the objects are equal:
        self.assertEquals(ndef.diff(ndef2), None)
예제 #9
0
    def setUp(self):

        # Use the network definition provided by RSN OMS directly.
        rsn_oms = CIOMSClientFactory.create_instance(DVR_CONFIG['oms_uri'])
        network_definition = RsnOmsUtil.build_network_definition(rsn_oms)

        if log.isEnabledFor(logging.DEBUG):
            network_definition_ser = NetworkUtil.serialize_network_definition(network_definition)
            log.debug("NetworkDefinition serialization:\n%s", network_definition_ser)

        platform_id = self.PLATFORM_ID
        pnode = network_definition.pnodes[platform_id]
        self._plat_driver = RSNPlatformDriver(pnode, self.evt_recv)
예제 #10
0
    def test_serialization_deserialization(self):
        # create NetworkDefinition object by de-serializing the simulated network:
        ndef = NetworkUtil.deserialize_network_definition(file("ion/agents/platform/rsn/simulator/network.yml"))

        # serialize object to string
        serialization = NetworkUtil.serialize_network_definition(ndef)

        # recreate object by de-serializing the string:
        ndef2 = NetworkUtil.deserialize_network_definition(serialization)

        # verify the objects are equal:
        diff = ndef.diff(ndef2)
        self.assertIsNone(diff, "deserialized version must be equal to original." " DIFF=\n%s" % diff)
    def setUp(self):

        # Use the network definition provided by RSN OMS directly.
        rsn_oms = CIOMSClientFactory.create_instance(DVR_CONFIG['oms_uri'])
        network_definition = RsnOmsUtil.build_network_definition(rsn_oms)

        if log.isEnabledFor(logging.DEBUG):
            network_definition_ser = NetworkUtil.serialize_network_definition(network_definition)
            log.debug("NetworkDefinition serialization:\n%s", network_definition_ser)

        platform_id = self.PLATFORM_ID
        pnode = network_definition.pnodes[platform_id]
        self._plat_driver = RSNPlatformDriver(pnode, self.evt_recv)
예제 #12
0
    def setUp(self):
        self._start_container()

        self.container.start_rel_from_url('res/deploy/r2deploy.yml')

        self.rrclient = ResourceRegistryServiceClient(node=self.container.node)
        self.omsclient = ObservatoryManagementServiceClient(
            node=self.container.node)
        self.imsclient = InstrumentManagementServiceClient(
            node=self.container.node)
        self.damsclient = DataAcquisitionManagementServiceClient(
            node=self.container.node)
        self.dpclient = DataProductManagementServiceClient(
            node=self.container.node)
        self.pubsubcli = PubsubManagementServiceClient(
            node=self.container.node)
        self.processdispatchclient = ProcessDispatcherServiceClient(
            node=self.container.node)
        self.dataprocessclient = DataProcessManagementServiceClient(
            node=self.container.node)
        self.dataset_management = DatasetManagementServiceClient()

        # Use the network definition provided by RSN OMS directly.
        rsn_oms = CIOMSClientFactory.create_instance(DVR_CONFIG['oms_uri'])
        self._network_definition = RsnOmsUtil.build_network_definition(rsn_oms)
        # get serialized version for the configuration:
        self._network_definition_ser = NetworkUtil.serialize_network_definition(
            self._network_definition)
        if log.isEnabledFor(logging.DEBUG):
            log.debug("NetworkDefinition serialization:\n%s",
                      self._network_definition_ser)

        self.platformModel_id = None

        self.all_platforms = {}
        self.agent_streamconfig_map = {}

        self._async_data_result = AsyncResult()
        self._data_subscribers = []
        self._samples_received = []
        self.addCleanup(self._stop_data_subscribers)

        self._async_event_result = AsyncResult()
        self._event_subscribers = []
        self._events_received = []
        self.addCleanup(self._stop_event_subscribers)
        self._start_event_subscriber()

        self._set_up_DataProduct_obj()
        self._set_up_PlatformModel_obj()
예제 #13
0
    def test_serialization_deserialization(self):
        # create NetworkDefinition object by de-serializing the simulated network:
        ndef = NetworkUtil.deserialize_network_definition(
            file('ion/agents/platform/rsn/simulator/network.yml'))

        # serialize object to string
        serialization = NetworkUtil.serialize_network_definition(ndef)

        # recreate object by de-serializing the string:
        ndef2 = NetworkUtil.deserialize_network_definition(serialization)

        # verify the objects are equal:
        diff = ndef.diff(ndef2)
        self.assertIsNone(
            diff, "deserialized version must be equal to original."
            " DIFF=\n%s" % diff)
    def setUp(self):

        DVR_CONFIG['oms_uri'] = self._dispatch_simulator(oms_uri)
        log.debug("DVR_CONFIG['oms_uri'] = %s", DVR_CONFIG['oms_uri'])

        yaml_filename = 'ion/agents/platform/rsn/simulator/network.yml'
        log.debug("retrieving network definition from %s", yaml_filename)
        network_definition = NetworkUtil.deserialize_network_definition(file(yaml_filename))

        if log.isEnabledFor(logging.DEBUG):
            network_definition_ser = NetworkUtil.serialize_network_definition(network_definition)
            log.debug("NetworkDefinition serialization:\n%s", network_definition_ser)

        platform_id = self.PLATFORM_ID
        pnode = network_definition.pnodes[platform_id]
        self._plat_driver = RSNPlatformDriver(pnode, self.evt_recv)
    def setUpClass(cls):
        HelperTestMixin.setUpClass()

        # Use the network definition provided by RSN OMS directly.
        rsn_oms = CIOMSClientFactory.create_instance(DVR_CONFIG["oms_uri"])
        network_definition = RsnOmsUtil.build_network_definition(rsn_oms)
        network_definition_ser = NetworkUtil.serialize_network_definition(network_definition)
        if log.isEnabledFor(logging.DEBUG):
            log.debug("NetworkDefinition serialization:\n%s", network_definition_ser)

        cls.PLATFORM_CONFIG = {
            "platform_id": cls.PLATFORM_ID,
            "driver_config": DVR_CONFIG,
            "network_definition": network_definition_ser,
        }

        NetworkUtil._gen_open_diagram(network_definition.pnodes[cls.PLATFORM_ID])
예제 #16
0
    def __init__(self, def_file, events_file, host, port, inactivity_period):
        """
        Creates a SimpleXMLRPCServer and starts a Thread where serve_forever
        is called on the server.

        @param def_file      Platform network definition file
        @param events_file   File with events to be published
        @param host   Hostname for the service
        @param port   Port for the service
        """
        log.info("Definition file: %s", def_file)
        log.info("Events file:     %s", events_file)

        self._running = True
        self._sim = CIOMSSimulatorWithExit(self, def_file, events_file)

        if log.isEnabledFor(logging.DEBUG):
            ser = NetworkUtil.serialize_network_definition(self._sim._ndef)
            log.debug("network serialization:\n   %s" %
                      ser.replace('\n', '\n   '))

        self._server = SimpleXMLRPCServer((host, port), allow_none=True)

        actual_port = self._server.socket.getsockname()[1]
        uri = "http://%s:%s/" % (host, actual_port)

        # write the URI to a file for launching process to see it:
        with open("logs/rsn_oms_simulator.yml", 'w') as f:
            f.write("rsn_oms_simulator_uri=%s\n" % uri)

        self._server.register_introspection_functions()
        self._server.register_instance(self._sim, allow_dotted_names=True)

        log.info("Methods: %s", self._server.system_listMethods())

        self._check_pyon()

        runnable = Thread(target=self._server.serve_forever)
        runnable.setDaemon(True)
        runnable.start()

        log.info("OMS simulator xmlrpc server listening on %s" % uri)

        if inactivity_period:
            self._sim.x_exit_inactivity(inactivity_period)
예제 #17
0
    def setUp(self):
        self._start_container()

        self.container.start_rel_from_url('res/deploy/r2deploy.yml')

        self.rrclient = ResourceRegistryServiceClient(node=self.container.node)
        self.omsclient = ObservatoryManagementServiceClient(node=self.container.node)
        self.imsclient = InstrumentManagementServiceClient(node=self.container.node)
        self.damsclient = DataAcquisitionManagementServiceClient(node=self.container.node)
        self.dpclient = DataProductManagementServiceClient(node=self.container.node)
        self.pubsubcli = PubsubManagementServiceClient(node=self.container.node)
        self.processdispatchclient = ProcessDispatcherServiceClient(node=self.container.node)
        self.dataprocessclient = DataProcessManagementServiceClient(node=self.container.node)
        self.dataset_management = DatasetManagementServiceClient()


        # Use the network definition provided by RSN OMS directly.
        rsn_oms = CIOMSClientFactory.create_instance(DVR_CONFIG['oms_uri'])
        self._network_definition = RsnOmsUtil.build_network_definition(rsn_oms)
        # get serialized version for the configuration:
        self._network_definition_ser = NetworkUtil.serialize_network_definition(self._network_definition)
        if log.isEnabledFor(logging.DEBUG):
            log.debug("NetworkDefinition serialization:\n%s", self._network_definition_ser)



        self.platformModel_id = None

        self.all_platforms = {}
        self.agent_streamconfig_map = {}

        self._async_data_result = AsyncResult()
        self._data_subscribers = []
        self._samples_received = []
        self.addCleanup(self._stop_data_subscribers)

        self._async_event_result = AsyncResult()
        self._event_subscribers = []
        self._events_received = []
        self.addCleanup(self._stop_event_subscribers)
        self._start_event_subscriber()

        self._set_up_DataProduct_obj()
        self._set_up_PlatformModel_obj()
예제 #18
0
    def __init__(self, def_file, events_file, host, port, inactivity_period):
        """
        Creates a SimpleXMLRPCServer and starts a Thread where serve_forever
        is called on the server.

        @param def_file      Platform network definition file
        @param events_file   File with events to be published
        @param host   Hostname for the service
        @param port   Port for the service
        """
        log.info("Definition file: %s", def_file)
        log.info("Events file:     %s", events_file)

        self._running = True
        self._sim = CIOMSSimulatorWithExit(self, def_file, events_file)

        if log.isEnabledFor(logging.DEBUG):
            ser = NetworkUtil.serialize_network_definition(self._sim._ndef)
            log.debug("network serialization:\n   %s" % ser.replace('\n', '\n   '))

        self._server = SimpleXMLRPCServer((host, port), allow_none=True)

        actual_port = self._server.socket.getsockname()[1]
        uri = "http://%s:%s/" % (host, actual_port)

        # write the URI to a file for launching process to see it:
        with open("logs/rsn_oms_simulator.yml", 'w') as f:
            f.write("rsn_oms_simulator_uri=%s\n" % uri)

        self._server.register_introspection_functions()
        self._server.register_instance(self._sim, allow_dotted_names=True)

        log.info("Methods: %s", self._server.system_listMethods())

        self._check_pyon()

        runnable = Thread(target=self._server.serve_forever)
        runnable.setDaemon(True)
        runnable.start()

        log.info("OMS simulator xmlrpc server listening on %s" % uri)

        if inactivity_period:
            self._sim.x_exit_inactivity(inactivity_period)
    def setUp(self):

        DVR_CONFIG['oms_uri'] = self._dispatch_simulator(oms_uri)
        log.debug("DVR_CONFIG['oms_uri'] = %s", DVR_CONFIG['oms_uri'])

        yaml_filename = 'ion/agents/platform/rsn/simulator/network.yml'
        log.debug("retrieving network definition from %s", yaml_filename)
        network_definition = NetworkUtil.deserialize_network_definition(
            file(yaml_filename))

        if log.isEnabledFor(logging.DEBUG):
            network_definition_ser = NetworkUtil.serialize_network_definition(
                network_definition)
            log.debug("NetworkDefinition serialization:\n%s",
                      network_definition_ser)

        platform_id = self.PLATFORM_ID
        pnode = network_definition.pnodes[platform_id]
        self._plat_driver = RSNPlatformDriver(pnode, self.evt_recv)
    def setUpClass(cls):
        HelperTestMixin.setUpClass()

        # Use the network definition provided by RSN OMS directly.
        rsn_oms = CIOMSClientFactory.create_instance(DVR_CONFIG['oms_uri'])
        network_definition = RsnOmsUtil.build_network_definition(rsn_oms)
        network_definition_ser = NetworkUtil.serialize_network_definition(
            network_definition)
        if log.isEnabledFor(logging.DEBUG):
            log.debug("NetworkDefinition serialization:\n%s",
                      network_definition_ser)

        cls.PLATFORM_CONFIG = {
            'platform_id': cls.PLATFORM_ID,
            'driver_config': DVR_CONFIG,
            'network_definition': network_definition_ser
        }

        NetworkUtil._gen_open_diagram(
            network_definition.pnodes[cls.PLATFORM_ID])
예제 #21
0
    def setUp(self):
        self._start_container()

        self.container.start_rel_from_url('res/deploy/r2deploy.yml')

        self.RR = ResourceRegistryServiceClient(node=self.container.node)
        self.IMS = InstrumentManagementServiceClient(node=self.container.node)
        self.DAMS = DataAcquisitionManagementServiceClient(
            node=self.container.node)
        self.DP = DataProductManagementServiceClient(node=self.container.node)
        self.PSC = PubsubManagementServiceClient(node=self.container.node)
        self.PDC = ProcessDispatcherServiceClient(node=self.container.node)
        self.DSC = DatasetManagementServiceClient()
        self.IDS = IdentityManagementServiceClient(node=self.container.node)
        self.RR2 = EnhancedResourceRegistryClient(self.RR)

        # Use the network definition provided by RSN OMS directly.
        rsn_oms = CIOMSClientFactory.create_instance(DVR_CONFIG['oms_uri'])
        self._network_definition = RsnOmsUtil.build_network_definition(rsn_oms)
        # get serialized version for the configuration:
        self._network_definition_ser = NetworkUtil.serialize_network_definition(
            self._network_definition)
        if log.isEnabledFor(logging.TRACE):
            log.trace("NetworkDefinition serialization:\n%s",
                      self._network_definition_ser)

        self._async_data_result = AsyncResult()
        self._data_subscribers = []
        self._samples_received = []
        self.addCleanup(self._stop_data_subscribers)

        self._async_event_result = AsyncResult()
        self._event_subscribers = []
        self._events_received = []
        self.addCleanup(self._stop_event_subscribers)
        self._start_event_subscriber()
    def setUp(self):
        self._start_container()

        self.container.start_rel_from_url('res/deploy/r2deploy.yml')

        self.RR   = ResourceRegistryServiceClient(node=self.container.node)
        self.IMS  = InstrumentManagementServiceClient(node=self.container.node)
        self.DAMS = DataAcquisitionManagementServiceClient(node=self.container.node)
        self.DP   = DataProductManagementServiceClient(node=self.container.node)
        self.PSC  = PubsubManagementServiceClient(node=self.container.node)
        self.PDC  = ProcessDispatcherServiceClient(node=self.container.node)
        self.DSC  = DatasetManagementServiceClient()
        self.IDS  = IdentityManagementServiceClient(node=self.container.node)
        self.RR2  = EnhancedResourceRegistryClient(self.RR)

        self.org_id = self.RR2.create(any_old(RT.Org))
        log.debug("Org created: %s", self.org_id)

        # Create InstrumentModel
        # TODO create multiple models as needed; for the moment assuming all
        # used instruments are the same model here.
        instModel_obj = IonObject(RT.InstrumentModel,
                                  name='SBE37IMModel',
                                  description="SBE37IMModel")
        self.instModel_id = self.IMS.create_instrument_model(instModel_obj)
        log.debug('new InstrumentModel id = %s ', self.instModel_id)

        # Use the network definition provided by RSN OMS directly.
        rsn_oms = CIOMSClientFactory.create_instance(DVR_CONFIG['oms_uri'])
        self._network_definition = RsnOmsUtil.build_network_definition(rsn_oms)
        CIOMSClientFactory.destroy_instance(rsn_oms)

        if log.isEnabledFor(logging.TRACE):
            # show serialized version for the network definition:
            network_definition_ser = NetworkUtil.serialize_network_definition(self._network_definition)
            log.trace("NetworkDefinition serialization:\n%s", network_definition_ser)

        # set attributes for the platforms:
        self._platform_attributes = {}
        for platform_id in self._network_definition.pnodes:
            pnode = self._network_definition.pnodes[platform_id]
            dic = dict((attr.attr_id, attr.defn) for attr in pnode.attrs.itervalues())
            self._platform_attributes[platform_id] = dic
        log.trace("_platform_attributes: %s", self._platform_attributes)

        # set ports for the platforms:
        self._platform_ports = {}
        for platform_id in self._network_definition.pnodes:
            pnode = self._network_definition.pnodes[platform_id]
            dic = {}
            for port_id, port in pnode.ports.iteritems():
                dic[port_id] = dict(port_id=port_id,
                                    network=port.network)
            self._platform_ports[platform_id] = dic
        log.trace("_platform_ports: %s", self._platform_attributes)

        self._async_data_result = AsyncResult()
        self._data_subscribers = []
        self._samples_received = []
        self.addCleanup(self._stop_data_subscribers)

        self._async_event_result = AsyncResult()
        self._event_subscribers = []
        self._events_received = []
        self.addCleanup(self._stop_event_subscribers)
        self._start_event_subscriber(sub_type="platform_event")

        # instruments that have been set up: instr_key: i_obj
        self._setup_instruments = {}
예제 #23
0
    def test_create_network_definition_from_ci_config(self):

        CFG = DotDict(
            {
                "device_type": "PlatformDevice",
                "platform_config": {"platform_id": "Node1D"},
                "driver_config": {
                    "attributes": {
                        "MVPC_pressure_1": {
                            "attr_id": "MVPC_pressure_1",
                            "group": "pressure",
                            "max_val": 33.8,
                            "min_val": -3.8,
                            "monitor_cycle_seconds": 10,
                            "precision": 0.04,
                            "read_write": "read",
                            "type": "float",
                            "units": "PSI",
                        },
                        "MVPC_temperature": {
                            "attr_id": "MVPC_temperature",
                            "group": "temperature",
                            "max_val": 58.5,
                            "min_val": -1.5,
                            "monitor_cycle_seconds": 10,
                            "precision": 0.06,
                            "read_write": "read",
                            "type": "float",
                            "units": "Degrees C",
                        },
                        "input_bus_current": {
                            "attr_id": "input_bus_current",
                            "group": "power",
                            "max_val": 50,
                            "min_val": -50,
                            "monitor_cycle_seconds": 5,
                            "precision": 0.1,
                            "read_write": "write",
                            "type": "float",
                            "units": "Amps",
                        },
                        "input_voltage": {
                            "attr_id": "input_voltage",
                            "group": "power",
                            "max_val": 500,
                            "min_val": -500,
                            "monitor_cycle_seconds": 5,
                            "precision": 1,
                            "read_write": "read",
                            "type": "float",
                            "units": "Volts",
                        },
                    },
                    "dvr_cls": "RSNPlatformDriver",
                    "dvr_mod": "ion.agents.platform.rsn.rsn_platform_driver",
                    "oms_uri": "embsimulator",
                    "ports": {
                        "Node1D_port_1": {"port_id": "Node1D_port_1"},
                        "Node1D_port_2": {"port_id": "Node1D_port_2"},
                    },
                },
                "children": {
                    "d7877d832cf94c388089b141043d60de": {
                        "agent": {"resource_id": "d7877d832cf94c388089b141043d60de"},
                        "device_type": "PlatformDevice",
                        "platform_config": {"platform_id": "MJ01C"},
                        "driver_config": {
                            "attributes": {
                                "MJ01C_attr_1": {
                                    "attr_id": "MJ01C_attr_1",
                                    "group": "power",
                                    "max_val": 10,
                                    "min_val": -2,
                                    "monitor_cycle_seconds": 5,
                                    "read_write": "read",
                                    "type": "int",
                                    "units": "xyz",
                                },
                                "MJ01C_attr_2": {
                                    "attr_id": "MJ01C_attr_2",
                                    "group": "power",
                                    "max_val": 10,
                                    "min_val": -2,
                                    "monitor_cycle_seconds": 5,
                                    "read_write": "write",
                                    "type": "int",
                                    "units": "xyz",
                                },
                            },
                            "dvr_cls": "RSNPlatformDriver",
                            "dvr_mod": "ion.agents.platform.rsn.rsn_platform_driver",
                            "oms_uri": "embsimulator",
                            "ports": {
                                "MJ01C_port_1": {"port_id": "MJ01C_port_1"},
                                "MJ01C_port_2": {"port_id": "MJ01C_port_2"},
                            },
                        },
                        "children": {
                            "d0203cb9eb844727b7a8eea77db78e89": {
                                "agent": {"resource_id": "d0203cb9eb844727b7a8eea77db78e89"},
                                "platform_config": {"platform_id": "LJ01D"},
                                "device_type": "PlatformDevice",
                                "driver_config": {
                                    "attributes": {
                                        "MVPC_pressure_1": {
                                            "attr_id": "MVPC_pressure_1",
                                            "group": "pressure",
                                            "max_val": 33.8,
                                            "min_val": -3.8,
                                            "monitor_cycle_seconds": 10,
                                            "precision": 0.04,
                                            "read_write": "read",
                                            "type": "float",
                                            "units": "PSI",
                                        },
                                        "MVPC_temperature": {
                                            "attr_id": "MVPC_temperature",
                                            "group": "temperature",
                                            "max_val": 58.5,
                                            "min_val": -1.5,
                                            "monitor_cycle_seconds": 10,
                                            "precision": 0.06,
                                            "read_write": "read",
                                            "type": "float",
                                            "units": "Degrees C",
                                        },
                                        "input_bus_current": {
                                            "attr_id": "input_bus_current",
                                            "group": "power",
                                            "max_val": 50,
                                            "min_val": -50,
                                            "monitor_cycle_seconds": 5,
                                            "precision": 0.1,
                                            "read_write": "write",
                                            "type": "float",
                                            "units": "Amps",
                                        },
                                        "input_voltage": {
                                            "attr_id": "input_voltage",
                                            "group": "power",
                                            "max_val": 500,
                                            "min_val": -500,
                                            "monitor_cycle_seconds": 5,
                                            "precision": 1,
                                            "read_write": "read",
                                            "type": "float",
                                            "units": "Volts",
                                        },
                                    },
                                    "dvr_cls": "RSNPlatformDriver",
                                    "dvr_mod": "ion.agents.platform.rsn.rsn_platform_driver",
                                    "oms_uri": "embsimulator",
                                    "ports": {"LJ01D_port_1": {"port_id": "1"}, "LJ01D_port_2": {"port_id": "2"}},
                                },
                                "children": {},
                            }
                        },
                    }
                },
            }
        )

        ndef = NetworkUtil.create_network_definition_from_ci_config(CFG)

        if log.isEnabledFor(logging.TRACE):
            serialization = NetworkUtil.serialize_network_definition(ndef)
            log.trace("serialization = \n%s", serialization)

        self.assertIn("Node1D", ndef.pnodes)
        Node1D = ndef.pnodes["Node1D"]

        common_attr_names = ["MVPC_pressure_1|0", "MVPC_temperature|0", "input_bus_current|0", "input_voltage|0"]

        for attr_name in common_attr_names:
            self.assertIn(attr_name, Node1D.attrs)

        # todo complete the network definition: align ports defintion with internal representation.
        # for port_name in ['Node1D_port_1', 'Node1D_port_2']:
        #    self.assertIn(port_name, Node1D.ports)

        for subplat_name in ["MJ01C"]:
            self.assertIn(subplat_name, Node1D.subplatforms)

        MJ01C = Node1D.subplatforms["MJ01C"]

        for subplat_name in ["LJ01D"]:
            self.assertIn(subplat_name, MJ01C.subplatforms)

        LJ01D = MJ01C.subplatforms["LJ01D"]

        for attr_name in common_attr_names:
            self.assertIn(attr_name, LJ01D.attrs)
예제 #24
0
    def test_create_network_definition_from_ci_config(self):

        CFG = DotDict({
            'device_type' : "PlatformDevice",

            'platform_config': {
                'platform_id': 'Node1D'
            },

            'driver_config': {'attributes': {'MVPC_pressure_1': {'attr_id': 'MVPC_pressure_1',
                                                                 'group': 'pressure',
                                                                 'max_val': 33.8,
                                                                 'min_val': -3.8,
                                                                 'monitor_cycle_seconds': 10,
                                                                 'precision': 0.04,
                                                                 'read_write': 'read',
                                                                 'type': 'float',
                                                                 'units': 'PSI'},
                                             'MVPC_temperature': {'attr_id': 'MVPC_temperature',
                                                                  'group': 'temperature',
                                                                  'max_val': 58.5,
                                                                  'min_val': -1.5,
                                                                  'monitor_cycle_seconds': 10,
                                                                  'precision': 0.06,
                                                                  'read_write': 'read',
                                                                  'type': 'float',
                                                                  'units': 'Degrees C'},
                                             'input_bus_current': {'attr_id': 'input_bus_current',
                                                                   'group': 'power',
                                                                   'max_val': 50,
                                                                   'min_val': -50,
                                                                   'monitor_cycle_seconds': 5,
                                                                   'precision': 0.1,
                                                                   'read_write': 'write',
                                                                   'type': 'float',
                                                                   'units': 'Amps'},
                                             'input_voltage': {'attr_id': 'input_voltage',
                                                               'group': 'power',
                                                               'max_val': 500,
                                                               'min_val': -500,
                                                               'monitor_cycle_seconds': 5,
                                                               'precision': 1,
                                                               'read_write': 'read',
                                                               'type': 'float',
                                                               'units': 'Volts'}},
                              'dvr_cls': 'RSNPlatformDriver',
                              'dvr_mod': 'ion.agents.platform.rsn.rsn_platform_driver',
                              'oms_uri': 'embsimulator',
                              'ports': {'Node1D_port_1': {'port_id': 'Node1D_port_1'},
                                        'Node1D_port_2': {'port_id': 'Node1D_port_2'}},
                              },


            'children': {'d7877d832cf94c388089b141043d60de': {'agent': {'resource_id': 'd7877d832cf94c388089b141043d60de'},
                                                              'device_type': 'PlatformDevice',
                                                              'platform_config': {'platform_id': 'MJ01C'},
                                                              'driver_config': {'attributes': {'MJ01C_attr_1': {'attr_id': 'MJ01C_attr_1',
                                                                                                                'group': 'power',
                                                                                                                'max_val': 10,
                                                                                                                'min_val': -2,
                                                                                                                'monitor_cycle_seconds': 5,
                                                                                                                'read_write': 'read',
                                                                                                                'type': 'int',
                                                                                                                'units': 'xyz'},
                                                                                               'MJ01C_attr_2': {'attr_id': 'MJ01C_attr_2',
                                                                                                                'group': 'power',
                                                                                                                'max_val': 10,
                                                                                                                'min_val': -2,
                                                                                                                'monitor_cycle_seconds': 5,
                                                                                                                'read_write': 'write',
                                                                                                                'type': 'int',
                                                                                                                'units': 'xyz'}},
                                                                                'dvr_cls': 'RSNPlatformDriver',
                                                                                'dvr_mod': 'ion.agents.platform.rsn.rsn_platform_driver',
                                                                                'oms_uri': 'embsimulator',
                                                                                'ports': {'MJ01C_port_1': {'port_id': 'MJ01C_port_1'},
                                                                                          'MJ01C_port_2': {'port_id': 'MJ01C_port_2'}}},

                                                              'children': {'d0203cb9eb844727b7a8eea77db78e89': {'agent': {'resource_id': 'd0203cb9eb844727b7a8eea77db78e89'},
                                                                                                                'platform_config': {'platform_id': 'LJ01D'},
                                                                                                                'device_type': 'PlatformDevice',
                                                                                                                'driver_config': {'attributes': {'MVPC_pressure_1': {'attr_id': 'MVPC_pressure_1',
                                                                                                                                                                     'group': 'pressure',
                                                                                                                                                                     'max_val': 33.8,
                                                                                                                                                                     'min_val': -3.8,
                                                                                                                                                                     'monitor_cycle_seconds': 10,
                                                                                                                                                                     'precision': 0.04,
                                                                                                                                                                     'read_write': 'read',
                                                                                                                                                                     'type': 'float',
                                                                                                                                                                     'units': 'PSI'},
                                                                                                                                                 'MVPC_temperature': {'attr_id': 'MVPC_temperature',
                                                                                                                                                                      'group': 'temperature',
                                                                                                                                                                      'max_val': 58.5,
                                                                                                                                                                      'min_val': -1.5,
                                                                                                                                                                      'monitor_cycle_seconds': 10,
                                                                                                                                                                      'precision': 0.06,
                                                                                                                                                                      'read_write': 'read',
                                                                                                                                                                      'type': 'float',
                                                                                                                                                                      'units': 'Degrees C'},
                                                                                                                                                 'input_bus_current': {'attr_id': 'input_bus_current',
                                                                                                                                                                       'group': 'power',
                                                                                                                                                                       'max_val': 50,
                                                                                                                                                                       'min_val': -50,
                                                                                                                                                                       'monitor_cycle_seconds': 5,
                                                                                                                                                                       'precision': 0.1,
                                                                                                                                                                       'read_write': 'write',
                                                                                                                                                                       'type': 'float',
                                                                                                                                                                       'units': 'Amps'},
                                                                                                                                                 'input_voltage': {'attr_id': 'input_voltage',
                                                                                                                                                                   'group': 'power',
                                                                                                                                                                   'max_val': 500,
                                                                                                                                                                   'min_val': -500,
                                                                                                                                                                   'monitor_cycle_seconds': 5,
                                                                                                                                                                   'precision': 1,
                                                                                                                                                                   'read_write': 'read',
                                                                                                                                                                   'type': 'float',
                                                                                                                                                                   'units': 'Volts'}},
                                                                                                                                  'dvr_cls': 'RSNPlatformDriver',
                                                                                                                                  'dvr_mod': 'ion.agents.platform.rsn.rsn_platform_driver',
                                                                                                                                  'oms_uri': 'embsimulator',
                                                                                                                                  'ports': {'LJ01D_port_1': {'port_id': '1'},
                                                                                                                                            'LJ01D_port_2': {'port_id': '2'}}},
                                                                                                                'children': {},
                                                                                                                }
                                                              }
                                                             }
            }
        })

        ndef = NetworkUtil.create_network_definition_from_ci_config(CFG)

        if log.isEnabledFor(logging.TRACE):
            serialization = NetworkUtil.serialize_network_definition(ndef)
            log.trace("serialization = \n%s", serialization)

        self.assertIn('Node1D', ndef.pnodes)
        Node1D = ndef.pnodes['Node1D']

        common_attr_names = ['MVPC_pressure_1', 'MVPC_temperature',
                             'input_bus_current', 'input_voltage' ]

        for attr_name in common_attr_names:
            self.assertIn(attr_name, Node1D.attrs)

        #todo complete the network definition: align ports defintion with internal representation.
        #for port_name in ['Node1D_port_1', 'Node1D_port_2']:
        #    self.assertIn(port_name, Node1D.ports)

        for subplat_name in ['MJ01C', ]:
            self.assertIn(subplat_name, Node1D.subplatforms)

        MJ01C = Node1D.subplatforms['MJ01C']

        for subplat_name in ['LJ01D', ]:
            self.assertIn(subplat_name, MJ01C.subplatforms)

        LJ01D = MJ01C.subplatforms['LJ01D']

        for attr_name in common_attr_names:
            self.assertIn(attr_name, LJ01D.attrs)
예제 #25
0
                        help="host (default: %s)" % DEFAULT_HOST,
                        default=DEFAULT_HOST)
    parser.add_argument("-P",
                        "--port",
                        help="port (default: %s)" % DEFAULT_PORT,
                        default=DEFAULT_PORT)

    opts = parser.parse_args()

    host = opts.host
    port = int(opts.port)

    oss = CIOMSSimulatorServer(host, port, thread=True)
    sim = oss.oms_simulator

    ser = NetworkUtil.serialize_network_definition(sim._ndef)
    log.info("network serialization:\n   %s" % ser.replace('\n', '\n   '))
    log.info("network.get_map() = %s\n" % sim.config.get_platform_map())

    log.info("Methods:\n\t%s", "\n\t".join(oss.methods))

    log.info("Listening on %s:%s", host, port)
    log.info("Enter ^D to exit")
    try:
        sys.stdin.read()
    except KeyboardInterrupt:
        pass
    except Exception, e:
        # likely not associated with a terminal
        pass
    log.info("\nExiting")
예제 #26
0
    def test_create_network_definition_from_ci_config(self):

        CFG = DotDict({
            'device_type': "PlatformDevice",
            'platform_config': {
                'platform_id': 'Node1D'
            },
            'driver_config': {
                'attributes': {
                    'MVPC_pressure_1': {
                        'attr_id': 'MVPC_pressure_1',
                        'group': 'pressure',
                        'max_val': 33.8,
                        'min_val': -3.8,
                        'monitor_cycle_seconds': 10,
                        'precision': 0.04,
                        'read_write': 'read',
                        'type': 'float',
                        'units': 'PSI'
                    },
                    'MVPC_temperature': {
                        'attr_id': 'MVPC_temperature',
                        'group': 'temperature',
                        'max_val': 58.5,
                        'min_val': -1.5,
                        'monitor_cycle_seconds': 10,
                        'precision': 0.06,
                        'read_write': 'read',
                        'type': 'float',
                        'units': 'Degrees C'
                    },
                    'input_bus_current': {
                        'attr_id': 'input_bus_current',
                        'group': 'power',
                        'max_val': 50,
                        'min_val': -50,
                        'monitor_cycle_seconds': 5,
                        'precision': 0.1,
                        'read_write': 'write',
                        'type': 'float',
                        'units': 'Amps'
                    },
                    'input_voltage': {
                        'attr_id': 'input_voltage',
                        'group': 'power',
                        'max_val': 500,
                        'min_val': -500,
                        'monitor_cycle_seconds': 5,
                        'precision': 1,
                        'read_write': 'read',
                        'type': 'float',
                        'units': 'Volts'
                    }
                },
                'dvr_cls': 'RSNPlatformDriver',
                'dvr_mod': 'ion.agents.platform.rsn.rsn_platform_driver',
                'oms_uri': 'embsimulator',
                'ports': {
                    'Node1D_port_1': {
                        'port_id': 'Node1D_port_1'
                    },
                    'Node1D_port_2': {
                        'port_id': 'Node1D_port_2'
                    }
                },
            },
            'children': {
                'd7877d832cf94c388089b141043d60de': {
                    'agent': {
                        'resource_id': 'd7877d832cf94c388089b141043d60de'
                    },
                    'device_type': 'PlatformDevice',
                    'platform_config': {
                        'platform_id': 'MJ01C'
                    },
                    'driver_config': {
                        'attributes': {
                            'MJ01C_attr_1': {
                                'attr_id': 'MJ01C_attr_1',
                                'group': 'power',
                                'max_val': 10,
                                'min_val': -2,
                                'monitor_cycle_seconds': 5,
                                'read_write': 'read',
                                'type': 'int',
                                'units': 'xyz'
                            },
                            'MJ01C_attr_2': {
                                'attr_id': 'MJ01C_attr_2',
                                'group': 'power',
                                'max_val': 10,
                                'min_val': -2,
                                'monitor_cycle_seconds': 5,
                                'read_write': 'write',
                                'type': 'int',
                                'units': 'xyz'
                            }
                        },
                        'dvr_cls': 'RSNPlatformDriver',
                        'dvr_mod':
                        'ion.agents.platform.rsn.rsn_platform_driver',
                        'oms_uri': 'embsimulator',
                        'ports': {
                            'MJ01C_port_1': {
                                'port_id': 'MJ01C_port_1'
                            },
                            'MJ01C_port_2': {
                                'port_id': 'MJ01C_port_2'
                            }
                        }
                    },
                    'children': {
                        'd0203cb9eb844727b7a8eea77db78e89': {
                            'agent': {
                                'resource_id':
                                'd0203cb9eb844727b7a8eea77db78e89'
                            },
                            'platform_config': {
                                'platform_id': 'LJ01D'
                            },
                            'device_type': 'PlatformDevice',
                            'driver_config': {
                                'attributes': {
                                    'MVPC_pressure_1': {
                                        'attr_id': 'MVPC_pressure_1',
                                        'group': 'pressure',
                                        'max_val': 33.8,
                                        'min_val': -3.8,
                                        'monitor_cycle_seconds': 10,
                                        'precision': 0.04,
                                        'read_write': 'read',
                                        'type': 'float',
                                        'units': 'PSI'
                                    },
                                    'MVPC_temperature': {
                                        'attr_id': 'MVPC_temperature',
                                        'group': 'temperature',
                                        'max_val': 58.5,
                                        'min_val': -1.5,
                                        'monitor_cycle_seconds': 10,
                                        'precision': 0.06,
                                        'read_write': 'read',
                                        'type': 'float',
                                        'units': 'Degrees C'
                                    },
                                    'input_bus_current': {
                                        'attr_id': 'input_bus_current',
                                        'group': 'power',
                                        'max_val': 50,
                                        'min_val': -50,
                                        'monitor_cycle_seconds': 5,
                                        'precision': 0.1,
                                        'read_write': 'write',
                                        'type': 'float',
                                        'units': 'Amps'
                                    },
                                    'input_voltage': {
                                        'attr_id': 'input_voltage',
                                        'group': 'power',
                                        'max_val': 500,
                                        'min_val': -500,
                                        'monitor_cycle_seconds': 5,
                                        'precision': 1,
                                        'read_write': 'read',
                                        'type': 'float',
                                        'units': 'Volts'
                                    }
                                },
                                'dvr_cls': 'RSNPlatformDriver',
                                'dvr_mod':
                                'ion.agents.platform.rsn.rsn_platform_driver',
                                'oms_uri': 'embsimulator',
                                'ports': {
                                    'LJ01D_port_1': {
                                        'port_id': '1'
                                    },
                                    'LJ01D_port_2': {
                                        'port_id': '2'
                                    }
                                }
                            },
                            'children': {},
                        }
                    }
                }
            }
        })

        ndef = NetworkUtil.create_network_definition_from_ci_config(CFG)

        if log.isEnabledFor(logging.TRACE):
            serialization = NetworkUtil.serialize_network_definition(ndef)
            log.trace("serialization = \n%s", serialization)

        self.assertIn('Node1D', ndef.pnodes)
        Node1D = ndef.pnodes['Node1D']

        common_attr_names = [
            'MVPC_pressure_1|0',
            'MVPC_temperature|0',
            'input_bus_current|0',
            'input_voltage|0',
        ]

        for attr_name in common_attr_names:
            self.assertIn(attr_name, Node1D.attrs)

        #todo complete the network definition: align ports defintion with internal representation.
        #for port_name in ['Node1D_port_1', 'Node1D_port_2']:
        #    self.assertIn(port_name, Node1D.ports)

        for subplat_name in [
                'MJ01C',
        ]:
            self.assertIn(subplat_name, Node1D.subplatforms)

        MJ01C = Node1D.subplatforms['MJ01C']

        for subplat_name in [
                'LJ01D',
        ]:
            self.assertIn(subplat_name, MJ01C.subplatforms)

        LJ01D = MJ01C.subplatforms['LJ01D']

        for attr_name in common_attr_names:
            self.assertIn(attr_name, LJ01D.attrs)
    parser.add_argument("-H", "--host",
                        help="host (default: %s)" % DEFAULT_HOST,
                        default=DEFAULT_HOST)
    parser.add_argument("-P", "--port",
                        help="port (default: %s)" % DEFAULT_PORT,
                        default=DEFAULT_PORT)

    opts = parser.parse_args()

    host = opts.host
    port = int(opts.port)

    oss = CIOMSSimulatorServer(host, port, thread=True)
    sim = oss.oms_simulator

    ser = NetworkUtil.serialize_network_definition(sim._ndef)
    log.info("network serialization:\n   %s" % ser.replace('\n', '\n   '))
    log.info("network.get_map() = %s\n" % sim.config.get_platform_map())

    log.info("Methods:\n\t%s", "\n\t".join(oss.methods))

    log.info("Listening on %s:%s", host, port)
    log.info("Enter ^D to exit")
    try:
        sys.stdin.read()
    except KeyboardInterrupt:
        pass
    except Exception, e:
        # likely not associated with a terminal
        pass
    log.info("\nExiting")