/******************************************************************************* * E.S.O. - ACS project * * "@(#) $Id: acsServices80Test.cpp,v 1.11 2012/05/15 09:06:34 msekoran Exp $" * * who when what * -------- ---------- ---------------------------------------------- */ /** @file acsServices80Test.cpp * acsServices80Test is used to test ACS 8.0 Services Deamon. * @htmlonly *

* @endhtmlonly */ #include #include #include #include #include #include #include #include #include #define DAEMONHOST ACSPorts::getIP() static struct option long_options[] = { {"help", no_argument, 0, 'h'}, {"instance", required_argument, 0, 'i'}, {"host", required_argument, 0, 'H'}, {"daemon", required_argument, 0, 'd'}, {0, 0, 0, '\0'}}; void usage(const char *argv) { ACE_OS::printf ("\n\tusage: %s {-h}", argv); ACE_OS::printf ("\t -h, --help show this help message\n"); ACE_OS::printf ("\t -i, --instance ACS instance to use\n"); ACE_OS::printf ("\t -H, --host Host where to stop the daemon\n"); ACE_OS::printf ("\t -d, --daemon Daemon reference\n"); } class TestDaemonSequenceCallback : public POA_acsdaemon::DaemonSequenceCallback { bool startup, complete; ::acsdaemon::DaemonSequenceCallback_var cobj; public: acsdaemon::ServicesDaemon_var daemon; char *services_definition; TestDaemonSequenceCallback() : startup(true), complete(false), cobj(NULL), services_definition(NULL) {} ~TestDaemonSequenceCallback() { ACS_SHORT_LOG((LM_DEBUG, "DESTROYING TestDaemonSequenceCallback!")); if (services_definition != NULL) { free(services_definition); } } ::acsdaemon::DaemonSequenceCallback_ptr ptr() { if (cobj == NULL) cobj = this->_this(); return cobj.in(); } bool isComplete() { return complete; } void done (const ::ACSErr::Completion & comp) { if (startup) { ACS_SHORT_LOG((LM_INFO, "DONE STARTING UP SERVICES.")); ACE_CString managerRef = ACE_CString("corbaloc::") + ACSPorts::getIP() + ":" + ACSPorts::getManagerPort(1).c_str() + "/Manager"; ACE_CString nsRef = ACE_CString("corbaloc::") + ACSPorts::getIP() + ":" + ACSPorts::getNamingServicePort(1).c_str() + "/NameService"; // daemon->set_manager_reference(1, managerRef.c_str()); ::acsdaemon::ServiceInfoSeq infos; infos.length(2); ::acsdaemon::ServiceInfo info; info.service_type = CORBA::string_dup("manager"); info.service_name = CORBA::string_dup(""); info.service_reference = CORBA::string_dup(managerRef.c_str()); infos[0] = info; info.service_type = CORBA::string_dup("naming_service"); info.service_name = CORBA::string_dup(""); info.service_reference = CORBA::string_dup(nsRef.c_str()); infos[1] = info; daemon->set_configuration_reference(1, infos); // printf("Please, press a key to start shutting down the services!"); // getchar(); ACE_OS::sleep(5); ACS_SHORT_LOG((LM_INFO, "SHUTTING DOWN THE SERVICES.")); daemon->stop_services(services_definition, ptr()); startup = false; } else { ACS_SHORT_LOG((LM_INFO, "DONE SHUTTING DOWN SERVICES.")); PortableServer::POA_var poa = this->_default_POA(); PortableServer::ObjectId_var oid = poa->servant_to_id(this); poa->deactivate_object(oid.in()); complete = true; } } void working (const char * service, const char * host, ::CORBA::Short instance_number, const ::ACSErr::Completion & comp) { ACSErr::CompletionImpl compi = comp; if (compi.isErrorFree()) { ACS_SHORT_LOG((LM_INFO, "Successfully %s service '%s' on host '%s' (instance: %d).", startup ? "started" : "stopped", service, host, instance_number)); } else { compi.log(); ACS_SHORT_LOG((LM_INFO, "Failed to %s service '%s' on host '%s' (instance: %d).", startup ? "start" : "stop", service, host, instance_number)); } } }; /*class TestDaemonSequenceCallback2 : public POA_acsdaemon::DaemonSequenceCallback { public: TestDaemonSequenceCallback2() {} ~TestDaemonSequenceCallback2() { ACS_SHORT_LOG((LM_DEBUG, "DESTROYING TestDaemonSequenceCallback2!")); } void done (const ::ACSErr::Completion & comp) { } void working (const char * service, const char * host, ::CORBA::Short instance_number, const ::ACSErr::Completion & comp) { } }; */ int main (int argc, char *argv[]) { /* { TestDaemonSequenceCallback2 *cb = new TestDaemonSequenceCallback2(); // refcount = 1 acsdaemon::DaemonSequenceCallback_ptr cbp = cb->_this(); // refcount++ // acsdaemon::DaemonSequenceCallback_var cbv1 = cbp; // acsdaemon::DaemonSequenceCallback_var cbv2 = acsdaemon::DaemonSequenceCallback::_duplicate(cbp); // acsdaemon::DaemonSequenceCallback_var cbv3 = cbp; printf("a0\n"); PortableServer::POA_var poa = cb->_default_POA(); PortableServer::ObjectId_var oid = poa->servant_to_id(cb); poa->deactivate_object(oid.in()); // refcount-- printf("a1\n"); cb->_remove_ref(); // refcount-- printf("endblock\n"); CORBA::release(cbp); } printf("a2\n"); exit(0); */ int c; ACE_CString daemonRef; ACE_CString hostName; for(;;) { int option_index = 0; c = getopt_long (argc, argv, "hd:H:", long_options, &option_index); if (c==-1) break; switch(c) { case 'h': usage(argv[0]); return 0; case 'd': daemonRef = optarg; break; case 'H': hostName = optarg; break; } } LoggingProxy * logger = new LoggingProxy(0, 0, 31); if (logger) { LoggingProxy::init(logger); LoggingProxy::ProcessName(argv[0]); LoggingProxy::ThreadName("main"); } else ACS_SHORT_LOG((LM_INFO, "Failed to initialize logging.")); try { // Initialize the ORB. CORBA::ORB_var orb = CORBA::ORB_init (argc,argv,"TAO"); /// ENABLE CALLBACKS /////////////////////////////////////////////////////// TestDaemonSequenceCallback cb; // get a reference to the RootPOA CORBA::Object_var pobj = orb->resolve_initial_references("RootPOA"); PortableServer::POA_var root_poa = PortableServer::POA::_narrow(pobj.in()); PortableServer::POAManager_var poa_manager = root_poa->the_POAManager(); // create policies CORBA::PolicyList policy_list; policy_list.length(5); policy_list[0] = root_poa->create_request_processing_policy(PortableServer::USE_DEFAULT_SERVANT); policy_list[1] = root_poa->create_id_uniqueness_policy(PortableServer::MULTIPLE_ID); policy_list[2] = root_poa->create_id_assignment_policy(PortableServer::USER_ID); policy_list[3] = root_poa->create_servant_retention_policy(PortableServer::NON_RETAIN); policy_list[4] = root_poa->create_lifespan_policy(PortableServer::PERSISTENT); // create a ACSDaemon POA with policies PortableServer::POA_var poa = root_poa->create_POA("DaemonSequenceCallback", poa_manager.in(), policy_list); // destroy policies for (CORBA::ULong i = 0; i < policy_list.length(); ++i) { CORBA::Policy_ptr policy = policy_list[i]; policy->destroy(); } // set as default servant poa->set_servant(&cb); // create reference PortableServer::ObjectId_var oid = PortableServer::string_to_ObjectId("DaemonSequenceCallback"); pobj = poa->create_reference_with_id (oid.in(), cb._interface_repository_id()); CORBA::String_var m_ior = orb->object_to_string(pobj.in()); // bind to IOR table CORBA::Object_var table_object = orb->resolve_initial_references("IORTable"); IORTable::Table_var adapter = IORTable::Table::_narrow(table_object.in()); if (CORBA::is_nil(adapter.in())) { ACS_SHORT_LOG ((LM_ERROR, "Nil IORTable")); return -1; } else { adapter->bind("DaemonSequenceCallback", m_ior.in()); } // activate POA poa_manager->activate(); ACS_SHORT_LOG((LM_INFO, "%s is waiting for incoming requests.", "DaemonSeqeuenceCallback")); ////////////////////////////////////////////////////////// // construct default one if (daemonRef.length() == 0) { if(hostName.length() == 0) { hostName = ACSPorts::getIP(); } daemonRef = "corbaloc::"; daemonRef = daemonRef + hostName + ":" + ACSPorts::getServicesDaemonPort().c_str() + "/" + ::acsdaemon::servicesDaemonServiceName; ACS_SHORT_LOG((LM_INFO, "Using local Services Daemon reference: '%s'", daemonRef.c_str())); } else { ACS_SHORT_LOG((LM_INFO, "Services Daemon reference obtained via command line: '%s'", daemonRef.c_str())); } CORBA::Object_var obj = orb->string_to_object(daemonRef.c_str()); if (CORBA::is_nil(obj.in())) { ACS_SHORT_LOG((LM_ERROR, "Failed to resolve reference '%s'.", daemonRef.c_str())); return -1; } acsdaemon::ServicesDaemon_var daemon = acsdaemon::ServicesDaemon::_narrow(obj.in()); if (CORBA::is_nil(daemon.in())) { ACS_SHORT_LOG((LM_ERROR, "Failed to narrow reference '%s'.", daemonRef.c_str())); return -1; } ACS_SHORT_LOG((LM_INFO, "BUILDING SERVICE DEFINITION.")); acsdaemon::ServiceDefinitionBuilder *sdb = daemon->create_service_definition_builder(1); sdb->add_naming_service(DAEMONHOST); sdb->add_interface_repository(DAEMONHOST, false, false); sdb->add_notification_service("NotifyEventChannelFactory", DAEMONHOST); sdb->add_notification_service("LoggingNotifyEventChannelFactory", DAEMONHOST); sdb->add_notification_service("AlarmNotifyEventChannelFactory", DAEMONHOST); sdb->add_notification_service("ArchiveNotifyEventChannelFactory", DAEMONHOST); sdb->add_logging_service(DAEMONHOST, "Log"); sdb->add_acs_log(DAEMONHOST); sdb->add_xml_cdb(DAEMONHOST, true, getenv("ACS_CDB")); sdb->add_alarm_service(DAEMONHOST); sdb->add_manager(DAEMONHOST, "", true); printf("SERVICE DEFINITION XML:\n%s\n", sdb->get_services_definition()); cb.daemon = daemon; cb.services_definition = sdb->get_services_definition(); ACS_SHORT_LOG((LM_INFO, "STARTING UP THE SERVICES.")); daemon->start_services(cb.services_definition, true, cb.ptr()); sdb->close(); while (!cb.isComplete()) { sleep(1); if (orb->work_pending()) orb->perform_work(); }; ACS_SHORT_LOG((LM_INFO, "TEST COMPLETE.")); } catch( maciErrType::NoPermissionEx &ex ) { ACS_SHORT_LOG((LM_WARNING, "Daemon is running in protected mode and cannot be shut down remotely!\n")); return -1; } catch( CORBA::Exception &ex ) { ACS_SHORT_LOG((LM_ERROR, "Failed.")); ex._tao_print_exception("Caught unexpected exception:"); return -1; } return 0; }