Separate oam and statistics in event operations
[anna.git] / example / diameter / launcher / Launcher.cpp
index edeaf88..4ec6ea0 100644 (file)
@@ -132,7 +132,11 @@ Launcher::Launcher() : anna::comm::Application("launcher", "DiameterLauncher", "
 
 
 void Launcher::servicesFromXML(const anna::xml::Node* servicesNode, bool eventOperation) throw(anna::RuntimeException) {
-  //<!ATTLIST stack id CDATA #REQUIRED dictionary CDATA #REQUIRED>
+
+  CommandLine& cl(anna::CommandLine::instantiate());
+  bool allLogsDisabled = cl.exists("disableLogs");
+
+    //<!ATTLIST stack id CDATA #REQUIRED dictionary CDATA #REQUIRED>
   const anna::xml::Attribute *id, *dictionary;
 
   // <!ATTLIST node originRealm CDATA #REQUIRED applicationId CDATA #REQUIRED originHost CDATA #IMPLIED cer CDATA #IMPLIED dwr CDATA #IMPLIED allowedInactivityTime CDATA #IMPLIED tcpConnectDelay CDATA #IMPLIED answersTimeout CDATA #IMPLIED ceaTimeout CDATA #IMPLIED watchdogPeriod CDATA #IMPLIED entity CDATA #IMPLIED entityServerSessions CDATA #IMPLIED diameterServer CDATA #IMPLIED diameterServerSessions CDATA #IMPLIED balance (yes | no) #IMPLIED sessionBasedModelsClientSocketSelection (SessionIdLowPart | SessionIdHighPart | SessionIdOptionalPart | RoundRobin) #IMPLIED retries CDATA #IMPLIED log CDATA #IMPLIED splitLog (yes | no) #IMPLIED detailedLog (yes | no) #IMPLIED dumpLog (yes | no) #IMPLIED burstLog (yes | no) #IMPLIED>
@@ -140,7 +144,6 @@ void Launcher::servicesFromXML(const anna::xml::Node* servicesNode, bool eventOp
   *answersTimeout, *ceaTimeout, *watchdogPeriod, *entity, *entityServerSessions,
   *diameterServer, *diameterServerSessions, *balance, *sessionBasedModelsClientSocketSelection,
   *retries, *log, *splitLog, *detailedLog, *dumpLog, *burstLog;
-
   // Never clear services content from here (append new data from xml). At the moment no node removing is implemented in this process
 
   // Stacks
@@ -159,7 +162,6 @@ void Launcher::servicesFromXML(const anna::xml::Node* servicesNode, bool eventOp
   anna::diameter::comm::ApplicationMessageOamModule & appMsgOamModule = anna::diameter::comm::ApplicationMessageOamModule::instantiate();
   appMsgOamModule.enableCounters(); // this special module is disabled by default (the only)
   static int scope_id = 3;
-  bool id_0_registered = false;
   unsigned int id_value;
   std::string codecEngineName;
 
@@ -185,10 +187,7 @@ void Launcher::servicesFromXML(const anna::xml::Node* servicesNode, bool eventOp
         throw ex;
       }
 
-      if (id_value == 0) {
-        id_0_registered = true;
-        bpd = d;
-      }
+      bpd = d; // base protocol dictionary in case of monostack. If multistack, will be calculated later
 
       // Create codec engine and register it in the codec engine manager:
       codecEngineName = anna::functions::asString("CodecEngineForStackId_%llu", id_value);
@@ -236,14 +235,10 @@ void Launcher::servicesFromXML(const anna::xml::Node* servicesNode, bool eventOp
   // Basic checking for multistack:
   bool multistack = (stackEngine.stack_size() > 1);
   if (multistack) {
-    if(!id_0_registered)
+    bpd = stackEngine.getDictionary(0);
+    if(!bpd)
       throw anna::RuntimeException("In multistack applications is mandatory register a stack id = 0 using a dictionary which contains the needed elements to build base protocol messages (CER/A, DWR/A, DPR/A, STR/A, etc.)", ANNA_FILE_LOCATION);
   }
-  else { // monostack
-    if (!bpd)
-      bpd = ce->getDictionary(); // in mono-stack applications, we understand the existing stack as the used
-                                 // for base protocol, regardless if it is registered with stack id 0 or not
-  }
 
   // REALMS:
   for(anna::xml::Node::const_child_iterator it = servicesNode->child_begin(); it != servicesNode->child_end(); it++) {
@@ -356,13 +351,15 @@ void Launcher::servicesFromXML(const anna::xml::Node* servicesNode, bool eventOp
       }
 
       // Logs:
-      std::string realm = commEngine->getRealm();
-      std::string s_log = realm + ".launcher.log"; if (log) s_log = log->getValue();
-      bool b_splitLog = (splitLog ? (splitLog->getValue() == "yes") : false);
-      bool b_detailedLog = (detailedLog ? (detailedLog->getValue() == "yes") : false);
-      bool b_dumpLog = (dumpLog ? (dumpLog->getValue() == "yes") : false);
-      std::string s_burstLog = realm + ".launcher.burst"; if (burstLog) s_burstLog = burstLog->getValue();
-      a_workingNode->setLogs(s_log, b_splitLog, b_detailedLog, b_dumpLog, s_burstLog);
+      if (!allLogsDisabled) {
+        std::string realm = commEngine->getRealm();
+        std::string s_log = realm + ".launcher.log"; if (log) s_log = log->getValue();
+        bool b_splitLog = (splitLog ? (splitLog->getValue() == "yes") : false);
+        bool b_detailedLog = (detailedLog ? (detailedLog->getValue() == "yes") : false);
+        bool b_dumpLog = (dumpLog ? (dumpLog->getValue() == "yes") : false);
+        std::string s_burstLog = realm + ".launcher.burst"; if (burstLog) s_burstLog = burstLog->getValue();
+        a_workingNode->setLogs(s_log, b_splitLog, b_detailedLog, b_dumpLog, s_burstLog);
+      }
 
 
       // Lazy initialization for comm engine:
@@ -975,6 +972,10 @@ std::string Launcher::help() const throw() {
   result += "\n                                      to load new nodes once the ADML is started, regardless if command";
   result += "\n                                      line '--services' parameter was used or not. Those services which";
   result += "\n                                      are not correctly loaded will be ignored to keep the process alive.";
+  result += "\n                                     If you need to load services as deltas, you must firstly load the";
+  result += "\n                                      diameter base dictionary with stack id 0, because all the realms";
+  result += "\n                                      will use this dictionary to encode/decode base protocol messages";
+  result += "\n                                      managed by the communication engine.";
   result += "\n";
   result += "\ndiameterServerSessions|<integer>     Updates the maximum number of accepted connections to diameter";
   result += "\n                                      server socket.";
@@ -988,6 +989,10 @@ std::string Launcher::help() const throw() {
   result += "\n                                     This operation applies over all the registered realm nodes";
   result += "\n                                      except if one specific working node has been set.";
   result += "\nforceCountersRecord                  Forces dump to file the current counters of the process.";
+  result += "\nshow-oam                             Dumps current counters of the process. This is also done at";
+  result += "\n                                      process context dump.";
+  result += "\nshow-stats                           Dumps statistics of the process. This is also done at process";
+  result += "\n                                      context dump.";
   result += "\n";
   result += "\n<visibility action>[|<address>:<port>][|socket id]";
   result += "\n";
@@ -1354,7 +1359,9 @@ std::string Launcher::help() const throw() {
   result += "\n";
   result += "\n   test|clear                    Clears all the programmed test cases and stop testing (if in progress).";
   result += "\n";
-  result += "\n   test|stat                     Global statistics.";
+  result += "\n   test|summary                  Test manager general report (number of test cases, counts by state, global configuration,";
+  result += "\n                                 forced in-progress limitation, reports visibility, etc.). Be careful when you have reports";
+  result += "\n                                 dumps enabled because all the programmed test cases will be dump and that could be heavy.";
   result += "\n";
   result += "\n";
   result += "\nUSING OPERATIONS INTERFACE";
@@ -1436,6 +1443,18 @@ void Launcher::eventOperation(const std::string &operation, std::string &respons
     return;
   }
 
+  // OAM & statistics:
+  if(operation == "show-oam") {
+    anna::xml::Node root("root");
+    response_content = anna::xml::Compiler().apply(oamAsXML(&root));
+    return;
+  }
+  if(operation == "show-stats") {
+    anna::xml::Node root("root");
+    response_content = anna::xml::Compiler().apply(statsAsXML(&root));
+    return;
+  }
+
   ///////////////////////////////////////////////////////////////////
   // Tokenize operation
   Tokenizer params;
@@ -1515,7 +1534,7 @@ void Launcher::eventOperation(const std::string &operation, std::string &respons
     }
     catch(anna::RuntimeException &ex) {
       ex.trace();
-      response_content = anna::functions::asString("Loaded services from file '%s' with some problems (ignored ones)", servicesFile.c_str());
+      response_content = anna::functions::asString("Loaded services from file '%s' with errors", servicesFile.c_str());
       return;
     }
     response_content = anna::functions::asString("Loaded services from file '%s'", servicesFile.c_str());
@@ -1747,6 +1766,8 @@ void Launcher::eventOperation(const std::string &operation, std::string &respons
     // test|interact|amount|id            Makes interactive a specific test case id. The amount is the margin of execution steps ...
     // test|reset|<soft/hard>[|id]        Reset the test case for id provided, all the tests when missing ...
     // test|clear                         Clears all the programmed test cases.
+    // test|summary                       Test manager general report (number of test cases, counts by state ...
+
 
     if(param1 == "ttps") {
       if (numParams > 2)
@@ -1916,6 +1937,10 @@ void Launcher::eventOperation(const std::string &operation, std::string &respons
         opt_response_content = "there are not programmed test cases to be removed";
       }
     }
+    else if(param1 == "summary") {
+      response_content = testManager.asXMLString();
+      return;
+    }
     else {
       int id = atoi(param1.c_str());
       if(id < 0)
@@ -2111,15 +2136,34 @@ throw() {
     it->second->asXML(result);
   }
 
+  // OAM & statistics:
+  oamAsXML(result);
+  statsAsXML(result);
+
+  // Testing: could be heavy if test case reports are enabled
+  TestManager::instantiate().asXML(result);
+
+  return result;
+}
+
+anna::xml::Node* Launcher::oamAsXML(anna::xml::Node* parent) const
+throw() {
+  anna::xml::Node* result = parent->createChild("Oam");
+
   // OAM:
   anna::diameter::comm::OamModule::instantiate().asXML(result);
   anna::diameter::comm::ApplicationMessageOamModule::instantiate().asXML(result);
   anna::diameter::codec::OamModule::instantiate().asXML(result);
+
+  return result;
+}
+
+anna::xml::Node* Launcher::statsAsXML(anna::xml::Node* parent) const
+throw() {
+  anna::xml::Node* result = parent->createChild("Statistics");
+
   // Statistics:
   anna::statistics::Engine::instantiate().asXML(result);
 
-  // Testing: could be heavy if test case reports are enabled
-  //TestManager::instantiate().asXML(result);
-
   return result;
 }