(file) Return to StressTestController.cpp CVS log (file) (dir) Up to [Pegasus] / pegasus / test / StressTestController

   1 martin 1.12 //%LICENSE////////////////////////////////////////////////////////////////
   2 martin 1.13 //
   3 martin 1.12 // Licensed to The Open Group (TOG) under one or more contributor license
   4             // agreements.  Refer to the OpenPegasusNOTICE.txt file distributed with
   5             // this work for additional information regarding copyright ownership.
   6             // Each contributor licenses this file to you under the OpenPegasus Open
   7             // Source License; you may not use this file except in compliance with the
   8             // License.
   9 martin 1.13 //
  10 martin 1.12 // Permission is hereby granted, free of charge, to any person obtaining a
  11             // copy of this software and associated documentation files (the "Software"),
  12             // to deal in the Software without restriction, including without limitation
  13             // the rights to use, copy, modify, merge, publish, distribute, sublicense,
  14             // and/or sell copies of the Software, and to permit persons to whom the
  15             // Software is furnished to do so, subject to the following conditions:
  16 martin 1.13 //
  17 martin 1.12 // The above copyright notice and this permission notice shall be included
  18             // in all copies or substantial portions of the Software.
  19 martin 1.13 //
  20 martin 1.12 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
  21 martin 1.13 // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  22 martin 1.12 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
  23             // IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
  24             // CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
  25             // TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
  26             // SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  27 martin 1.13 //
  28 martin 1.12 //////////////////////////////////////////////////////////////////////////
  29 j.alex 1.2  //
  30             //%/////////////////////////////////////////////////////////////////////////////
  31             
  32             #include <iostream>
  33             #include <Pegasus/Common/Config.h>
  34             #include <Pegasus/Common/Constants.h>
  35             #include <Pegasus/Common/System.h>
  36             #include <Pegasus/Common/PegasusVersion.h>
  37             #include <Pegasus/Common/SSLContext.h>
  38             #include <Pegasus/getoopt/getoopt.h>
  39             #include <Pegasus/Common/String.h>
  40             #include <Pegasus/Client/CIMClient.h>
  41             #include <Pegasus/Common/FileSystem.h>
  42             #include <Pegasus/Common/TimeValue.h>
  43             #include <time.h>
  44             #include <signal.h>
  45             #include "StressTestController.h"
  46             #include "StressTestControllerException.h"
  47             //
  48             //Windows
  49             //
  50 j.alex 1.2  #ifdef PEGASUS_OS_TYPE_WINDOWS
  51              // for DWORD etc.
  52 kumpf  1.7  # include <windows.h>
  53 kamal.locahana 1.5   // getpid() and others
  54                      typedef DWORD pid_t;
  55 kumpf          1.7  # include <process.h>
  56 ouyang.jian    1.6  #else
  57 kumpf          1.7  # include <unistd.h>
  58 j.alex         1.2  #endif
  59                     
  60 j.alex         1.3  //#define STRESSTEST_DEBUG
  61 j.alex         1.2  
  62                     #define SIXTYSECONDS 60
  63                     #define MILLISECONDS 1000
  64                     #define CHECKUP_INTERVAL 1
  65 kamal.locahana 1.5  #define STOP_DELAY 1
  66                     #define SHUTDOWN_DELAY 5
  67                     #define RUN_DELAY 1
  68 j.alex         1.2  #define DEFAULT_INSTANCE "5"
  69                     
  70                     #define convertmin2millisecs(x) (x * SIXTYSECONDS * MILLISECONDS)
  71                     #define getToleranceInPercent(x,y) (100 - (((y-x)/y) * 100))
  72                     
  73                     
  74                     
  75                     static void endAllTests(int signum);
  76                     
  77                     static void cleanupProcess();
  78                     
  79                     static String convertUint64toString(Uint64 x);
  80                     
  81                     
  82                     PEGASUS_NAMESPACE_BEGIN
  83                     PEGASUS_USING_PEGASUS;
  84                     PEGASUS_USING_STD;
  85                     
  86                     
  87                     
  88                     /**
  89 j.alex         1.2    Log file descripter
  90                     */
  91                     
  92                     /**
  93 kamal.locahana 1.5     variable for Signal handler
  94 j.alex         1.2  */
  95                     static Boolean Quit = false;
  96                     
  97                     /**
  98                         The command name.
  99                      */
 100 kamal.locahana 1.5  const char StressTestControllerCommand::COMMAND_NAME [] =
 101 j.alex         1.2                "TestStressTestController";
 102                     
 103                     
 104                     /**
 105 kamal.locahana 1.5     StressTest Configuration file details
 106 j.alex         1.2  */
 107                     char StressTestControllerCommand::FILENAME[] = "default_stresstest.conf";
 108                     char StressTestControllerCommand::TESTDIR[] = "/test/";
 109                     char StressTestControllerCommand::STRESSTESTDIR[] = "StressTestController/";
 110                     char StressTestControllerCommand::LOGDIR[] = "log/";
 111                     char StressTestControllerCommand::BINDIR[] = "/bin/";
 112 kamal.locahana 1.5  char StressTestControllerCommand::DEFAULT_CFGDIR[] =
 113 j.alex         1.2        STRESSTEST_DEFAULTCFGDIR;
 114                     char StressTestControllerCommand::DEFAULT_LOGDIR[] =
 115                              "/test/StressTestController/log/";
 116                     char StressTestControllerCommand::DEFAULT_TMPDIR[] =
 117                              "/test/StressTestController/tmp/";
 118                     
 119                     String DEFAULT_BINDIR = String::EMPTY;
 120                     
 121                     static Uint32 DEFAULT_CLIENTS = 2;
 122                     static Uint32 Total_Clients = DEFAULT_CLIENTS;
 123                     static Uint32 NEW_CLIENTS = 5;
 124                     
 125                     static char MODELWALK_CLIENT[] = "TestModelWalkStressClient";
 126                     static char WRAPPER_CLIENT[] = "TestWrapperStressClient";
 127                     
 128                     /**
 129                       StressTest Client Status types
 130                     */
 131                     enum CStatus{
 132                         VALID_RESPONSE,
 133                         INVALID_RESPONSE,
 134 j.alex         1.2      NO_RESPONSE};
 135                     
 136                     
 137                     /**
 138                       Temporary arrays to store client information
 139                     */
 140                     
 141                     /**
 142                       Client PID's
 143                     */
 144                     static pid_t *clientPIDs;
 145                     
 146                     /**
 147                       Client Status
 148                     */
 149                     static int *clientStatus;
 150                     
 151                     
 152                     /**
 153                       Client Status
 154                     */
 155 j.alex         1.2  static int *prev_clientStatus;
 156                     
 157                     /**
 158                       Client Instance
 159                     */
 160 kumpf          1.11 static Uint32* clientInstance;
 161 j.alex         1.2  
 162                     /**
 163                       Indicates if client is Active
 164                     */
 165                     static Boolean *clientActive;
 166                     
 167                     /**
 168 kamal.locahana 1.5    Client status time stamp
 169 j.alex         1.2  */
 170                     static Uint64 *clientTimeStamp;
 171                     
 172                     /**
 173 kamal.locahana 1.5    Previous client status time stamp
 174 j.alex         1.2  */
 175                     static Uint64 *prev_clientTimeStamp;
 176                     
 177                     /**
 178                         DEFAULT VALUES:
 179                     */
 180                     
 181                     /**
 182                         Default duration for the stress tests
 183                     */
 184                     double StressTestControllerCommand::_duration = 180;
 185                     
 186                     /**
 187                         Label for the usage string for this command.
 188                      */
 189                     const char StressTestControllerCommand::_USAGE [] = "Usage: ";
 190                     
 191                     /**
 192                         The option character used to specify the hostname.
 193                      */
 194                     const char StressTestControllerCommand::_OPTION_HOSTNAME = 'h';
 195 j.alex         1.2  
 196                     /**
 197                         The option character used to specify the port number.
 198                      */
 199                     const char StressTestControllerCommand::_OPTION_PORTNUMBER = 'p';
 200                     
 201                     /**
 202                         The option character used to specify SSL usage.
 203                      */
 204                     const char StressTestControllerCommand::_OPTION_SSL = 's';
 205                     
 206                     /**
 207                         The option character used to specify the username.
 208                      */
 209                     const char StressTestControllerCommand::_OPTION_USERNAME = 'u';
 210                     
 211                     /**
 212                         The option character used to specify the password.
 213                      */
 214                     const char StressTestControllerCommand::_OPTION_PASSWORD = 'w';
 215                     
 216 j.alex         1.2  /**
 217                         The minimum valid portnumber.
 218                      */
 219                     const Uint32 StressTestControllerCommand::_MIN_PORTNUMBER = 0;
 220                     
 221                     /**
 222                         The maximum valid portnumber.
 223                      */
 224                     const Uint32 StressTestControllerCommand::_MAX_PORTNUMBER = 65535;
 225                     
 226                     /**
 227                         The minimum Duration.
 228                      */
 229                     const Uint32 StressTestControllerCommand::_MIN_DURATION = 0;
 230                     
 231                     /**
 232                         The minimum valid Tolerance Level.
 233                      */
 234                     const Uint32 StressTestControllerCommand::_MIN_TOLERANCE = 0;
 235                     
 236                     /**
 237 j.alex         1.2      The maximum valid Tolerance Level.
 238                      */
 239                     const Uint32 StressTestControllerCommand::_MAX_TOLERANCE = 100;
 240                     
 241                     /**
 242                         The variable used to specify the hostname.
 243                      */
 244                     static const char HOSTNAME[] = "hostname";
 245                     
 246                     /**
 247                         The variable used to specify the port number.
 248                      */
 249                     static const char PORTNUMBER[] = "port";
 250                     
 251                     /**
 252                         The variable used to specify SSL usage.
 253                      */
 254                     static const char SSL [] = "ssl";
 255                     
 256                     /**
 257                         The variable used to specify the username.
 258 j.alex         1.2   */
 259                     static const char USERNAME[] = "username";
 260                     
 261                     /**
 262                         The variable used to specify the password.
 263                      */
 264                     static const char PASSWORD[] = "password";
 265                     
 266                     /**
 267                         The variable used to specify the duration of the tests.
 268                      */
 269                     static const char DURATION[] = "duration";
 270                     
 271                     /**
 272                         The variable used to specify the duration of the Client tests.
 273                      */
 274                     static const char CLIENTDURATION[] = "ClientDuration";
 275                     
 276                     /**
 277                         The variable used to specify the ToleranceLevel for the tests.
 278                      */
 279 j.alex         1.2  static const char TOLERANCELEVEL[] = "TOLERANCELEVEL";
 280                     
 281                     /**
 282                         The variable used to specify the NameSpace for the tests.
 283                      */
 284                     static const char NAMESPACE[] = "namespace";
 285                     
 286                     /**
 287                         The variable used to specify the ClassName for the tests.
 288                      */
 289                     static const char CLASSNAME[] = "classname";
 290                     
 291                     /**
 292                         The variable used to specify the Name for the tests.
 293                      */
 294                     static const char NAME[] = "NAME";
 295                     
 296                     /**
 297                         The variable used to specify the Clientname for the tests.
 298                      */
 299                     static const char CLIENTNAME[] = "clientname";
 300 j.alex         1.2  
 301                     /**
 302                         The variable used to specify the Clientname for the tests.
 303                      */
 304                     static const char OPTIONS[] = "options";
 305                     
 306                     /**
 307                         The variable used to specify the Clientname for the tests.
 308                      */
 309                     static const char INSTANCE[] = "INSTANCE";
 310                     
 311                     /**
 312                         The variable used to specify the Clientname for the tests.
 313                      */
 314                     static const char CLIENTWAIT[] = "CLIENTWAIT";
 315                     
 316                     
 317                     
 318                     /**
 319                      * Message resource name
 320                      */
 321 j.alex         1.2  static const char LONG_HELP[] = "help";
 322                     static const char LONG_VERSION[] = "version";
 323                     static const char LONG_VERBOSE[] = "verbose";
 324                     
 325                     static Boolean IsAClient = false;
 326                     
 327                     static Boolean IsClientOptions = false;
 328                     
 329                     static Boolean IgnoreLine = false;
 330                     
 331                     /**
 332                     
 333                         Constructs a StressTestControllerCommand and initializes instance variables.
 334                     
 335                      */
 336                     StressTestControllerCommand::StressTestControllerCommand ()
 337                     {
 338                     
 339                         _hostName = String ();
 340                         _hostNameSpecified = false;
 341                         _portNumber = WBEM_DEFAULT_HTTP_PORT;
 342 j.alex         1.2      _portNumberSpecified = false;
 343                     
 344                         char buffer[32];
 345                         sprintf(buffer, "%lu", (unsigned long) _portNumber);
 346                     
 347                         _portNumberStr = buffer;
 348                     
 349                         _timeout = DEFAULT_TIMEOUT_MILLISECONDS;
 350                         _userName = String ();
 351                         _userNameSpecified = false;
 352                         _password = String ();
 353                         _passwordSpecified = false;
 354                         _useSSL = false;
 355                     
 356                         //
 357                         // initialize
 358                         //
 359                         _clientCount = 0;
 360                         _currClientCount = 0;
 361 kamal.locahana 1.5  
 362 j.alex         1.2      //
 363                         // Set up tables for client properties.
 364                         //
 365 kumpf          1.4      _clientTable.reset(new Table[Total_Clients]);
 366 j.alex         1.2  
 367                         //
 368                         // Get environment variables:
 369                         //
 370                         pegasusHome = getenv("PEGASUS_HOME");
 371                     
 372                         DEFAULT_BINDIR = String(pegasusHome);
 373                         DEFAULT_BINDIR.append(BINDIR);
 374                     
 375                         _stressTestLogFile = String::EMPTY;
 376                     
 377                         _stressTestClientPIDFile = String::EMPTY;
 378                     
 379                         _stressTestClientLogFile = String::EMPTY;
 380                     
 381                         _tmpStressTestClientPIDFile = String::EMPTY;
 382                     
 383                     
 384                     
 385                         _usage = String (_USAGE);
 386                     
 387 j.alex         1.2      _usage.append (COMMAND_NAME);
 388                     #ifndef DISABLE_SUPPORT_FOR_REMOTE_CONNECTIONS
 389                         _usage.append (" [ -");
 390                         _usage.append (_OPTION_SSL);
 391                         _usage.append (" ] [ -");
 392                         _usage.append (_OPTION_HOSTNAME);
 393                         _usage.append (" hostname ] [ -");
 394                         _usage.append (_OPTION_PORTNUMBER);
 395                         _usage.append (" portnumber ]\n                            [ -");
 396                         _usage.append (_OPTION_USERNAME);
 397                         _usage.append (" username ] [ -");
 398                         _usage.append (_OPTION_PASSWORD);
 399                         _usage.append (" password ]");
 400                     #endif
 401                         _usage.append (" [ --");
 402                         _usage.append (LONG_HELP);
 403                         _usage.append(" ]\n");
 404                         _usage.append("                            ");
 405                         _usage.append("[ --").append(LONG_VERSION).append(" ]");
 406                         _usage.append(" [ --").append(LONG_VERBOSE).append(" ]").append(\
 407                             " [<config_filename>] \n");
 408 j.alex         1.2  
 409                         _usage.append("Options : \n");
 410                         _usage.append("    -h         - Connect to CIM Server on specified ");
 411                         _usage.append("hostname. \n");
 412                         _usage.append("    --help     - Display this help message.\n");
 413                         _usage.append("    -p         - Connect to CIM Server on specified ");
 414                         _usage.append("portnumber.\n");
 415                         _usage.append("    -s         - Use SSL protocol between Stress Test ");
 416                         _usage.append("Client\n");
 417                         _usage.append("                 and the CIM Server\n");
 418                         _usage.append("    -u         - Connect to CIM Server using the specified");
 419                         _usage.append(" username\n");
 420                         _usage.append("    --version  - Display CIM Server version number\n");
 421                         _usage.append("    --verbose  - Display verbose information\n");
 422                         _usage.append("    -w         - Connect to CIM Server using the specified");
 423                         _usage.append(" password\n");
 424                         _usage.append("\nOperands : \n");
 425                         _usage.append("   <config_filename>\n");
 426                         _usage.append("               - Specifies the name of the configuration ");
 427                         _usage.append("file that is to be used \n");
 428                         _usage.append("                 for the tests.\n");
 429 j.alex         1.2  
 430                         setUsage(_usage);
 431                     
 432                     } /* StressTestControllerCommand  */
 433                     
 434                     /**
 435                     
 436                         Parses the command line, validates the options, and sets instance
 437                         variables based on the option arguments.
 438                     
 439                         @param   argc  the number of command line arguments
 440                         @param   argv  the string vector of command line arguments
 441                     
 442                         @exception  CommandFormatException  if an error is encountered in parsing
 443                                                             the command line
 444                     
 445                      */
 446                     void StressTestControllerCommand::setCommand (Uint32 argc, char* argv [])
 447                     {
 448                         Uint32 i = 0;
 449                         Uint32 c = 0;
 450 j.alex         1.2      String GetOptString = String ();
 451                         getoopt getOpts;
 452                         _toleranceLevel = 0;
 453                         _configFilePath = String ();
 454                         _configFilePathSpecified = false;
 455                     
 456                         _operationType = OPERATION_TYPE_UNINITIALIZED;
 457                     
 458                     
 459                         ofstream log_file;
 460                     
 461                         //
 462                         // opens  the log file
 463                         //
 464                         OpenAppend(log_file,_stressTestLogFile);
 465                     
 466                         if (!log_file)
 467                         {
 468                             if(verboseEnabled)
 469                             {
 470                                 cout<<StressTestControllerCommand::COMMAND_NAME<<
 471 j.alex         1.2                  "::Cannot get file "<<_stressTestLogFile<<endl;
 472                             }
 473 kamal.locahana 1.5  
 474 j.alex         1.2      }
 475                         log_file<<StressTestControllerCommand::COMMAND_NAME<<
 476                             ":: Preparing to set up parameters: "<<endl;
 477                     
 478                         //
 479                         //  Construct GetOptString
 480                         //
 481                         GetOptString.append (_OPTION_HOSTNAME);
 482                         GetOptString.append (getoopt::GETOPT_ARGUMENT_DESIGNATOR);
 483                         GetOptString.append (_OPTION_PORTNUMBER);
 484                         GetOptString.append (getoopt::GETOPT_ARGUMENT_DESIGNATOR);
 485                         GetOptString.append (_OPTION_SSL);
 486                         GetOptString.append (_OPTION_USERNAME);
 487                         GetOptString.append (getoopt::GETOPT_ARGUMENT_DESIGNATOR);
 488                         GetOptString.append (_OPTION_PASSWORD);
 489                         GetOptString.append (getoopt::GETOPT_ARGUMENT_DESIGNATOR);
 490                     
 491                         //
 492                         //  Initialize and parse getOpts
 493                         //
 494                         getOpts = getoopt ();
 495 j.alex         1.2      getOpts.addFlagspec (GetOptString);
 496                     
 497                         //
 498                         // per PEP#167
 499                         //
 500                         getOpts.addLongFlagspec(LONG_HELP,getoopt::NOARG);
 501                         getOpts.addLongFlagspec(LONG_VERSION,getoopt::NOARG);
 502                         getOpts.addLongFlagspec(LONG_VERBOSE,getoopt::NOARG);
 503                     
 504                         getOpts.parse (argc, argv);
 505                     
 506                         if (getOpts.hasErrors ())
 507                         {
 508                             log_file.close();
 509                             CommandFormatException e(getOpts.getErrorStrings () [0]);
 510                             throw e;
 511                         }
 512                     
 513                         //
 514                         //  Get options and arguments from the command line
 515                         //
 516 j.alex         1.2      for (i = getOpts.first(); i <  getOpts.last (); i++)
 517                         {
 518                             if (getOpts[i].getType() == Optarg::LONGFLAG)
 519                             {
 520                                 if (getOpts[i].getopt() == LONG_HELP)
 521                                 {
 522                                    _operationType = OPERATION_TYPE_HELP;
 523                                 }
 524                                 else if (getOpts[i].getopt() == LONG_VERSION)
 525                                 {
 526                                     _operationType = OPERATION_TYPE_VERSION;
 527                                 }
 528                                 if (getOpts[i].getopt() == LONG_VERBOSE)
 529                                 {
 530                                     verboseEnabled = true;
 531                                 }
 532                             }
 533                             else if (getOpts [i].getType() == Optarg::REGULAR)
 534                             {
 535                                 //
 536                                 // _configFilePath is the only non-option argument
 537 j.alex         1.2              //
 538                                 if (_configFilePathSpecified)
 539                                 {
 540                                     //
 541                                     // more than one _configFilePath argument was found
 542                                     //
 543                                     log_file<<StressTestControllerCommand::COMMAND_NAME<<
 544                                         "::More than one arguement was found "<<endl;
 545                                     log_file.close();
 546                                     UnexpectedArgumentException e(getOpts[i].Value());
 547                                     throw e;
 548                                 }
 549                                 _configFilePath = getOpts[i].Value();
 550                                 _configFilePathSpecified = true;
 551                             }
 552                             else /* getOpts[i].getType() == FLAG */
 553                             {
 554                                 c = getOpts[i].getopt()[0];
 555                                 switch(c)
 556                                 {
 557                                     case _OPTION_HOSTNAME:
 558 j.alex         1.2                  {
 559                                         if (getOpts.isSet(_OPTION_HOSTNAME) > 1)
 560                                         {
 561                                             //
 562                                             // More than one hostname option was found
 563                                             //
 564                                             log_file.close();
 565                                             DuplicateOptionException e(_OPTION_HOSTNAME);
 566                                             throw e;
 567                                         }
 568                                         _hostName = getOpts [i].Value ();
 569                                         _hostNameSpecified = true;
 570 kumpf          1.4                      if (!_propertyTable.insert("hostname", _hostName))
 571 j.alex         1.2                      {
 572                                              // shouldn't get here
 573                                              if(verboseEnabled)
 574                                              {
 575                                                  cout<<StressTestControllerCommand::COMMAND_NAME;
 576                                                  cout<<"::Property Name name already saved: "<<
 577                                                      "hostname"<<endl;
 578                                              }
 579                                         }
 580                                         break;
 581                                     }
 582                                     case _OPTION_PORTNUMBER:
 583                                     {
 584                                         if (getOpts.isSet(_OPTION_PORTNUMBER) > 1)
 585                                         {
 586                                             //
 587                                             // More than one portNumber option was found
 588                                             //
 589                                             log_file.close();
 590                                             DuplicateOptionException e(_OPTION_PORTNUMBER);
 591                                             throw e;
 592 j.alex         1.2                      }
 593                                         _portNumberStr = getOpts [i].Value ();
 594                                         try
 595                                         {
 596                                             getOpts[i].Value(_portNumber);
 597                                         }
 598                                         catch (const TypeMismatchException&)
 599                                         {
 600                                             log_file.close();
 601                                             InvalidOptionArgumentException e(
 602                                                 _portNumberStr,
 603                                                 _OPTION_PORTNUMBER);
 604                                             throw e;
 605                                         }
 606                                         _portNumberSpecified = true;
 607 kumpf          1.4                      if (!_propertyTable.insert("port", _portNumberStr))
 608 j.alex         1.2                      {
 609                                             if(verboseEnabled)
 610                                             {
 611                                                cout<<StressTestControllerCommand::COMMAND_NAME;
 612                                                cout<<"::Property Name:duplicate name already saved:"
 613                                                    <<"port"<<endl;
 614                                             }
 615                                         }
 616                                         break;
 617                                     }
 618                                     case _OPTION_SSL:
 619                                     {
 620                                         //
 621                                         // Use port 5989 as the default port for SSL
 622                                         //
 623                                         _useSSL = true;
 624                                         if (!_portNumberSpecified)
 625                                         {
 626                                            _portNumber = 5989;
 627                                            _portNumberStr = "5989";
 628 kumpf          1.4                         if (!_propertyTable.insert("port", _portNumberStr))
 629 j.alex         1.2                         {
 630 kamal.locahana 1.5                             if(verboseEnabled)
 631 j.alex         1.2                             {
 632                                                   cout<<StressTestControllerCommand::COMMAND_NAME;
 633                                                   cout<<"::Property Name already saved: "<<"port"<<
 634                                                       endl;
 635                                                }
 636                                            }
 637                                         }
 638 kumpf          1.4                      if (!_propertyTable.insert("ssl", ""))
 639 j.alex         1.2                      {
 640                                             if(verboseEnabled)
 641                                             {
 642                                                 cout<<StressTestControllerCommand::COMMAND_NAME;
 643                                                 cout<<"::Property Name already saved: "<<"ssl"<<
 644                                                     endl;
 645                                             }
 646                                         }
 647                                         break;
 648                                     }
 649                                     case _OPTION_USERNAME:
 650                                     {
 651                                         if (getOpts.isSet(_OPTION_USERNAME) > 1)
 652                                         {
 653                                             //
 654                                             // More than one username option was found
 655                                             //
 656                                             log_file.close();
 657                                             DuplicateOptionException e(_OPTION_USERNAME);
 658                                             throw e;
 659                                         }
 660 j.alex         1.2                      _userName = getOpts[i].Value();
 661                                         _userNameSpecified = true;
 662 kumpf          1.4                      if (!_propertyTable.insert("username", _userName))
 663 j.alex         1.2                      {
 664                                             if(verboseEnabled)
 665                                             {
 666                                                 cout<<StressTestControllerCommand::COMMAND_NAME;
 667                                                 cout<< "::Property Name already saved: "<<
 668                                                     "username"<<endl;
 669                                             }
 670                                         }
 671                                         break;
 672                                     }
 673                                     case _OPTION_PASSWORD:
 674                                     {
 675                                         if (getOpts.isSet(_OPTION_PASSWORD) > 1)
 676                                         {
 677                                             //
 678                                             // More than one password option was found
 679                                             //
 680                                             log_file.close();
 681                                             DuplicateOptionException e(_OPTION_PASSWORD);
 682                                             throw e;
 683                                         }
 684 j.alex         1.2                      _password = getOpts[i].Value();
 685                                         _passwordSpecified = true;
 686 kumpf          1.4                      if (!_propertyTable.insert("password", _password))
 687 j.alex         1.2                      {
 688                                             if(verboseEnabled)
 689                                             {
 690                                                 cout<<StressTestControllerCommand::COMMAND_NAME;
 691                                                 cout<<"::Property Name already saved: "<<
 692                                                     "password"<<endl;
 693                                             }
 694                                         }
 695                                         break;
 696                                     }
 697                     
 698                                     default:
 699                                     {
 700                                         //
 701                                         //  This path should not be hit
 702                                         //  PEP#167 unless an empty '-' is specified
 703                                         //
 704                                         log_file.close();
 705 kamal.locahana 1.5                      String ErrReport =
 706 j.alex         1.2                          String(StressTestControllerCommand::COMMAND_NAME);
 707                                         ErrReport.append("::Invalid or unknown option specified");
 708                                         throw StressTestControllerException(ErrReport);
 709                     
 710                                         break;
 711                                    }
 712                                 }
 713                             }
 714                         }
 715                         //
 716                         //  More validation:
 717                         //    No portNumber specified
 718                         //    Default to WBEM_DEFAULT_PORT
 719                         //    Already done in constructor
 720                         //
 721                         if (getOpts.isSet(_OPTION_PORTNUMBER) == 1)
 722                         {
 723                             if (_portNumber > _MAX_PORTNUMBER)
 724                             {
 725                                 //
 726                                 //  Portnumber out of valid range
 727 j.alex         1.2              //
 728                                 log_file.close();
 729                                 InvalidOptionArgumentException e(_portNumberStr,
 730                                     _OPTION_PORTNUMBER);
 731                                 throw e;
 732                             }
 733                         }
 734                         log_file.close();
 735                     } /* setCommand  */
 736                     
 737                     /**
 738                     
 739 kamal.locahana 1.5      Generates commands and its options for each of the clients.
 740 j.alex         1.2      The client table is traversed to generate each of the client commands.
 741                         The Commands, Duration and Delays for each client are saved in
 742                         the following array's respectively:
 743 kamal.locahana 1.5         _clientCommands
 744 j.alex         1.2         _clientDurations
 745 kamal.locahana 1.5         _clientDelays
 746                     
 747                         @param   log_file           The log file.
 748 j.alex         1.2  
 749                         @return  0                  if the command is successfully generated
 750                                  1                  if the command cannot be generated.
 751                      */
 752                     Boolean StressTestControllerCommand::generateClientCommands(ostream& log_file)
 753                     {
 754                     
 755                         String client_command = String::EMPTY;
 756                         double duration = _duration;
 757                         double delay = 0;
 758                     
 759 kamal.locahana 1.5      //
 760 j.alex         1.2      // Array's to store client specific information
 761                         //
 762 kumpf          1.4      _clientCommands.reset(new String[_clientCount]);
 763                         _clientDurations.reset(new Uint64[_clientCount]);
 764                         _clientDelays.reset(new Uint64[_clientCount]);
 765 j.alex         1.2  
 766                         //
 767                         // Retrieve all the client options from the client table
 768 kamal.locahana 1.5      // and build commands for respective clients.
 769                         // Add appropriate options to command string  as required
 770 j.alex         1.2      //
 771                         for (Uint32 j=0; j< _clientCount; j++)
 772                         {
 773                             delay = 0;
 774                             String clientName = String::EMPTY;
 775                             String clientInst = String::EMPTY;
 776 kamal.locahana 1.5          //
 777                             //  Stress Client Name must exist for each client/client table
 778 j.alex         1.2          //
 779 kumpf          1.4          if (!_clientTable.get()[j].lookup(NAME, clientName))
 780 j.alex         1.2          {
 781                                 log_file<<StressTestControllerCommand::COMMAND_NAME<<
 782                                      "::Required property NAME not found."<<endl;
 783                                 return false;
 784                             }
 785                             //
 786                             // Start the command string with the client name.
 787                             //
 788                             client_command = clientName;
 789                     
 790 kamal.locahana 1.5          //
 791 j.alex         1.2          // Generate the commands for each client from each client table.
 792                             //
 793 kumpf          1.4          for (Table::Iterator i = _clientTable.get()[j].start(); i; i++)
 794 j.alex         1.2          {
 795                                 if (String::equalNoCase(i.key(),HOSTNAME))
 796                                 {
 797                                     client_command.append(" -hostname ");
 798                                     if (_hostNameSpecified)
 799                                     {
 800                                         client_command.append(_hostName);
 801                                     }
 802                                     else
 803 kamal.locahana 1.5                  {
 804 j.alex         1.2                      client_command.append(i.value());
 805                                     }
 806 kamal.locahana 1.5              }
 807 j.alex         1.2              else if (String::equalNoCase(i.key(),NAME))
 808                                 {
 809                                     //
 810                                     // should be ignored - already saved using clientName
 811                                     //
 812 kamal.locahana 1.5              }
 813 j.alex         1.2              else if (String::equalNoCase(i.key(),PORTNUMBER))
 814                                 {
 815                                     client_command.append(" -");
 816                                     client_command.append(PORTNUMBER);
 817                                     client_command.append(" ");
 818                                     if (_portNumberSpecified)
 819                                     {
 820                                         client_command.append(_portNumberStr);
 821 kamal.locahana 1.5                  }
 822 j.alex         1.2                  else
 823 kamal.locahana 1.5                  {
 824 j.alex         1.2                      client_command.append(i.value());
 825                                     }
 826                                 }
 827                                 else if (String::equalNoCase(i.key(),SSL))
 828                                 {
 829                                     client_command.append(" -");
 830                                     client_command.append(SSL);
 831 kamal.locahana 1.5              }
 832 j.alex         1.2              else if (String::equalNoCase(i.key(),USERNAME))
 833                                 {
 834                                     client_command.append(" -");
 835                                     client_command.append(USERNAME);
 836                                     client_command.append(" ");
 837                                     client_command.append(i.value());
 838 kamal.locahana 1.5              }
 839 j.alex         1.2              else if (String::equalNoCase(i.key(),PASSWORD))
 840                                 {
 841                                     client_command.append(" -");
 842                                     client_command.append(PASSWORD);
 843                                     client_command.append(" ");
 844                                     client_command.append(i.value());
 845                                 }
 846                                 else if (String::equalNoCase(i.key(),CLIENTNAME))
 847                                 {
 848                                     client_command.append(" -");
 849                                     client_command.append(CLIENTNAME);
 850                                     client_command.append(" ");
 851                                     client_command.append(i.value());
 852                                 }
 853                                 else if (String::equalNoCase(i.key(),OPTIONS))
 854                                 {
 855                                     client_command.append(" -");
 856                                     client_command.append(OPTIONS);
 857                                     client_command.append(" ");
 858                                     client_command.append(i.value());
 859                                 }
 860 j.alex         1.2              else if (String::equalNoCase(i.key(),NAMESPACE))
 861                                 {
 862                                     client_command.append(" -");
 863                                     client_command.append(NAMESPACE);
 864                                     client_command.append(" ");
 865                                     client_command.append(i.value());
 866 kamal.locahana 1.5              }
 867 j.alex         1.2              else if (String::equalNoCase(i.key(),CLASSNAME))
 868                                 {
 869                                     client_command.append(" -");
 870                                     client_command.append(CLASSNAME);
 871                                     client_command.append(" ");
 872                                     client_command.append(i.value());
 873 kamal.locahana 1.5              }
 874 j.alex         1.2              else if ((String::equalNoCase(i.key(),INSTANCE))
 875                                           ||(String::equalNoCase(i.key(),CLIENTWAIT))
 876                                           ||(String::equalNoCase(i.key(),CLIENTDURATION)))
 877                                 {
 878                                     //
 879 kamal.locahana 1.5                  // do nothing here
 880 j.alex         1.2                  //   will be utilized to run the clients later.
 881                                     //
 882 kamal.locahana 1.5              }
 883                                 else
 884                                 {
 885 j.alex         1.2                  //
 886                                     // Save all other options for the commands
 887                                     //
 888                                     client_command.append(" -");
 889                                     client_command.append(i.key());
 890                                     client_command.append(" ");
 891                                     client_command.append(i.value());
 892                                 }
 893                             }
 894                             //
 895                             // Include verbose if enabled to clients
 896                             //
 897                             if (verboseEnabled)
 898                             {
 899                                 client_command.append(" -verbose ");
 900                             }
 901                     
 902                             //
 903 kamal.locahana 1.5          // Acquire all the common properties listed in the property table
 904                             // from config file and include it as part of the client command
 905 j.alex         1.2          // as required.
 906                             //
 907 kumpf          1.4          for (Table::Iterator k = _propertyTable.start(); k; k++)
 908 j.alex         1.2          {
 909                                 String propertyValue = String::EMPTY;
 910                                 //
 911                                 // Only include the common properties that are not already
 912                                 // listed for the clients.
 913                                 //
 914 kumpf          1.4              if (!_clientTable.get()[j].lookup(k.key(), propertyValue))
 915 j.alex         1.2              {
 916                                     //
 917                                     // Include options other than ToleranceLevel
 918                                     // clientDuration,clientwait and Duration
 919 kamal.locahana 1.5                  // in the command string for the clients.
 920 j.alex         1.2                  //
 921                                     if ((!String::equalNoCase(k.key(),TOLERANCELEVEL))
 922                                          && (!String::equalNoCase(k.key(),CLIENTDURATION))
 923                                          && (!String::equalNoCase(k.key(),CLIENTWAIT))
 924                                          && (!String::equalNoCase(k.key(),DURATION)))
 925                                     {
 926                                         client_command.append(" -");
 927                                         client_command.append(k.key());
 928 kamal.locahana 1.5                      //
 929 j.alex         1.2                      // No values required for SSL
 930 kamal.locahana 1.5                      //
 931 j.alex         1.2                      if (!String::equalNoCase(k.key(),SSL))
 932                                         {
 933                                             client_command.append(" ");
 934                                             client_command.append(k.value());
 935                                         }
 936                                     }
 937                                 }
 938                                 //
 939                                 // Use default duration if one was not specified in the Config file.
 940                                 //
 941                                 if (String::equalNoCase(k.key(),DURATION))
 942                                 {
 943                                     duration = atof(k.value().getCString());
 944 kamal.locahana 1.5              }
 945                                 else
 946 j.alex         1.2              {
 947                                     duration = _duration;
 948                                 }
 949 kumpf          1.4          } /* for (Table::Iterator k = _propertyTable.start(); k; k++) */
 950 j.alex         1.2  
 951                             //
 952                             // Looking up table while ignoring cases for Client Duration/Wait.
 953                             //
 954 kumpf          1.4          for (Table::Iterator k = _clientTable.get()[j].start(); k; k++)
 955 j.alex         1.2          {
 956                                 //
 957                                 // Overwrite duration if client duration set
 958                                 //
 959                                 if (String::equalNoCase(k.key(),CLIENTDURATION))
 960                                 {
 961                                     duration = atof(k.value().getCString());
 962                                 }
 963                                 if (String::equalNoCase(k.key(),CLIENTWAIT))
 964                                 {
 965                                     delay = atof(k.value().getCString());
 966                                 }
 967                             }
 968                     
 969                             //
 970 kamal.locahana 1.5          // Save the generated command to corresponding element in the
 971 j.alex         1.2          // clientCommand array.
 972                             //
 973 kumpf          1.4          _clientCommands.get()[j] = client_command;
 974 j.alex         1.2  
 975                             //
 976                             // Converting minutes to milliseconds
 977                             //
 978 kumpf          1.4          _clientDurations.get()[j] = (Uint64)convertmin2millisecs(duration);
 979                             _clientDelays.get()[j] = (Uint64)convertmin2millisecs(delay);
 980 kamal.locahana 1.5  
 981 j.alex         1.2          //
 982                             // Saving logs
 983                             //
 984 kumpf          1.4          log_file << StressTestControllerCommand::COMMAND_NAME <<
 985                                 "::Client Command[" << j << "]" << endl;
 986                             log_file << "  " << _clientCommands.get()[j] << endl;
 987                             log_file << "   Client Duration: " <<
 988                                 convertUint64toString(_clientDurations.get()[j]) << endl;
 989                             log_file << "   Client Delay: " <<
 990                                 convertUint64toString(_clientDelays.get()[j]) << endl;
 991 j.alex         1.2  
 992                             //
 993 kamal.locahana 1.5          // Verbose
 994 j.alex         1.2          //
 995                             if (verboseEnabled)
 996                             {
 997 kumpf          1.4              cout << StressTestControllerCommand::COMMAND_NAME <<
 998                                     "::Client Command[" << j << "]" << endl;
 999                                 cout << "  " << _clientCommands.get()[j] << endl;
1000                                 cout << "   Client Duration: " <<
1001                                     convertUint64toString(_clientDurations.get()[j]) << endl;
1002                                 cout << "   Client Delay: " <<
1003                                     convertUint64toString(_clientDelays.get()[j]) << endl;
1004 j.alex         1.2          }
1005                         } /* for(Uint32 j=0; j< _clientCount; j++) */
1006                         return true;
1007                     } /* generateClientCommands */
1008                     
1009                     /*
1010                         Executes the command and writes the results to the PrintWriters.
1011                         This method is where the clients are intiated.
1012                         The clients are kept running until its duration is met
1013                         or the controller is interrupted by a SIGINT or SIGABRT signal
1014                         or if the controller failed to acquire the clientPIDs when needed.
1015                     
1016 kamal.locahana 1.5      Clients with clientWait,  will be stopped when its duration is met and
1017                         then restarted after its wait period is completed. This will continue
1018                         until the end of the overall duration.
1019 j.alex         1.2      When the overall duration has ended or the controller is interupted then
1020 kamal.locahana 1.5      the controller will read the PID file to update its clients PID and
1021 j.alex         1.2      request all the clients to end its processes.
1022                     
1023                         @param   outPrintWriter     the ostream to which output should be
1024                                                     written
1025                         @param   errPrintWriter     the ostream to which error output should be
1026                                                     written
1027                     
1028                         @return  0                  if the command is successful
1029                                  1                  if an error occurs in executing the command
1030                     
1031                      */
1032                     Uint32 StressTestControllerCommand::execute (
1033                         ostream& outPrintWriter,
1034                         ostream& errPrintWriter)
1035                     {
1036                         int actual_client = 0;
1037                         Uint64 startMilliseconds = 0;
1038                         Uint64 nowMilliseconds = 0;
1039                         Uint64 stopMilliseconds = 0;
1040                         Uint64 timeoutMilliseconds = 0;
1041 kumpf          1.4      AutoArrayPtr<Uint64> clientStartMilliseconds;
1042                         AutoArrayPtr<Uint64> clientStopMilliseconds;
1043                         AutoArrayPtr<Uint64> clientDelayMilliseconds;
1044                         AutoArrayPtr<Boolean> clientStopped;
1045                         AutoArrayPtr<Boolean> clientDelayed;
1046                         String act_command;
1047 j.alex         1.2      Boolean TestFailed = false;
1048                         char str[15];
1049                         char strTime[256];
1050                         struct tm tmTime;
1051                     
1052                         //
1053                         // log file
1054 kamal.locahana 1.5      //
1055 j.alex         1.2      ofstream log_file;
1056                     
1057 kamal.locahana 1.5      //
1058 j.alex         1.2      // open the file
1059 kamal.locahana 1.5      //
1060 j.alex         1.2      OpenAppend(log_file,_stressTestLogFile);
1061                     
1062 kamal.locahana 1.5      //
1063 j.alex         1.2      // Failed to read log file.
1064                         //
1065                         if (!log_file)
1066                         {
1067                             log_file.close();
1068                             if (verboseEnabled)
1069                             {
1070                                 outPrintWriter<<StressTestControllerCommand::COMMAND_NAME;
1071                                 outPrintWriter<<"Cannot read file "<<_stressTestLogFile<<endl;
1072                             }
1073                             return RC_ERROR;
1074                         }
1075                     
1076 kamal.locahana 1.5      //
1077 j.alex         1.2      // Display usage message if help was specified
1078                         //
1079                         if ( _operationType == OPERATION_TYPE_HELP )
1080                         {
1081                             outPrintWriter << _usage << endl;
1082                             log_file<<StressTestControllerCommand::COMMAND_NAME<<
1083                                 "::Listing usage information "<<endl;
1084                             log_file.close();
1085                             //
1086                             //  No need for the client pid and log file.
1087                             //
1088                             FileSystem::removeFile(_stressTestClientPIDFile);
1089                             FileSystem::removeFile(_stressTestClientLogFile);
1090                             return (RC_SUCCESS);
1091                         }
1092 kamal.locahana 1.5      //
1093 j.alex         1.2      // Display PEGASUS version if version was specified
1094                         //
1095                         else if ( _operationType == OPERATION_TYPE_VERSION )
1096                         {
1097                             outPrintWriter << "Version " << PEGASUS_PRODUCT_VERSION << endl;
1098                             log_file<<StressTestControllerCommand::COMMAND_NAME<<
1099                                 "::Listing version information "<<endl;
1100                             log_file<<"Version " << PEGASUS_PRODUCT_VERSION << endl;
1101                             log_file.close();
1102                             //
1103                             //  No need for the client pid and log file.
1104                             //
1105                             FileSystem::removeFile(_stressTestClientPIDFile);
1106                             FileSystem::removeFile(_stressTestClientLogFile);
1107                             return (RC_SUCCESS);
1108                         }
1109                     
1110                         //
1111                         // gracefully shutdown when interrupted
1112                         //
1113                         signal(SIGABRT, endAllTests);
1114 j.alex         1.2      signal(SIGINT, endAllTests);
1115                     
1116 kamal.locahana 1.5      //
1117                         // Allocate variables necessary to run clients.
1118 j.alex         1.2      //
1119                         if(_clientCount > 0)
1120                         {
1121 kumpf          1.11         clientInstance = new Uint32[_clientCount];
1122 kumpf          1.4          clientStartMilliseconds.reset(new Uint64[_clientCount]);
1123                             clientStopMilliseconds.reset(new Uint64[_clientCount]);
1124                             clientDelayMilliseconds.reset(new Uint64[_clientCount]);
1125                             clientStopped.reset(new Boolean[_clientCount]);
1126                             clientDelayed.reset(new Boolean[_clientCount]);
1127 kamal.locahana 1.5      }
1128                         else
1129                         {
1130 j.alex         1.2          errPrintWriter << "Stress Tests must have at least one Client." << endl;
1131                             log_file<<StressTestControllerCommand::COMMAND_NAME<<
1132                                 "::Stress Tests must have at least one Client."<<endl;
1133                             log_file.close();
1134                             return (RC_ERROR);
1135                         }
1136 kamal.locahana 1.5  
1137 j.alex         1.2      try
1138                         {
1139                             //
1140                             // Initializing the Boolean array's to false.
1141                             //
1142                             for (Uint32 i=0;i<_clientCount;i++)
1143                             {
1144 kumpf          1.4              clientStopped.get()[i] = false;
1145                                 clientDelayed.get()[i] = false;
1146 j.alex         1.2          }
1147                             //
1148                             // Set up duration of the tests
1149                             //
1150                             startMilliseconds   = TimeValue::getCurrentTime().toMilliseconds();
1151                             nowMilliseconds     = startMilliseconds;
1152                             timeoutMilliseconds = (Uint64)convertmin2millisecs(_duration);
1153                             stopMilliseconds    = nowMilliseconds + timeoutMilliseconds;
1154 kamal.locahana 1.5  
1155 j.alex         1.2          log_file<<StressTestControllerCommand::COMMAND_NAME<<
1156                                 ":: Test Duration information "<<endl;
1157                             log_file<<"  Start Time in milliseconds: "<<
1158                                 convertUint64toString(startMilliseconds)<<endl;
1159                             log_file<<"  Total duration in milliseconds: "<<
1160                                 convertUint64toString(timeoutMilliseconds)<<endl;
1161                             log_file<<"  Actual Stop Time in milliseconds: "<<
1162                                 convertUint64toString(stopMilliseconds)<<endl;
1163 kamal.locahana 1.5          //
1164                             //  Verbose details for Stress Test duration
1165 j.alex         1.2          //
1166                             if (verboseEnabled)
1167                             {
1168                                 outPrintWriter<<StressTestControllerCommand::COMMAND_NAME<<
1169                                     ":: Test Duration information "<<endl;
1170                                 outPrintWriter<<"  Start Time in milliseconds: "<<
1171                                     convertUint64toString(startMilliseconds)<<endl;
1172                                 outPrintWriter<<"  Total duration in milliseconds: "<<
1173                                     convertUint64toString(timeoutMilliseconds)<<endl;
1174                                 outPrintWriter<<
1175                                     "  Actual Stop Time in milliseconds: "<<
1176                                     convertUint64toString(stopMilliseconds)<<endl;
1177                             }
1178                     
1179                             //
1180 kamal.locahana 1.5          //  First Tolerance check up interval is set up to be twice
1181 j.alex         1.2          //  the CHECKUP_INTERVAL. This should give the clients enough time
1182                             //  to update its PID, status  etc.
1183 kamal.locahana 1.5          //
1184                             Uint64 nextCheckupInMillisecs =
1185 j.alex         1.2             (Uint64)convertmin2millisecs(2 * CHECKUP_INTERVAL) + nowMilliseconds;
1186                             //
1187 kamal.locahana 1.5          //  Main "while" loop where the clients are initiated.
1188 j.alex         1.2          //
1189                             while(stopMilliseconds > nowMilliseconds)
1190 kamal.locahana 1.5          {
1191 j.alex         1.2  
1192 kamal.locahana 1.5              //
1193                                 // Small delay in the while loop seemed to reduce the CPU usage
1194 j.alex         1.2              // considerably  in Windows. (From 80% to 1%)
1195                                 //
1196                     #ifndef PEGASUS_OS_TYPE_WINDOWS
1197 kamal.locahana 1.5              sleep(RUN_DELAY);
1198 j.alex         1.2  #else
1199                                 Sleep(RUN_DELAY * 1000);
1200                     #endif
1201                     
1202                                 //
1203                                 // Quit if SIGINT, SIGABRT is caught
1204                                 // So the clients can be gracefully shutdown.
1205                                 //
1206                                 if(Quit)
1207                                 {
1208                                     log_file<<
1209 kamal.locahana 1.5                      "Test interrupted by either SIGINT or SIGABORT."<<endl;
1210 j.alex         1.2                  TestFailed = true;
1211                                     break;
1212                                 }
1213                                 //
1214                                 // The following block will be where clients are executed initially.
1215                                 //
1216                                 if(!actual_client)
1217                                 {
1218                                     log_file<<StressTestControllerCommand::COMMAND_NAME<<
1219                                         "::Running the following tests: "<<endl;
1220                                     outPrintWriter<<StressTestControllerCommand::COMMAND_NAME<<
1221                                         "::Running the following tests: "<<endl;
1222                                     for (Uint32 j=0; j< _clientCount; j++)
1223                                     {
1224                                         String clientInst = String::EMPTY;
1225                                         //
1226                                         // Acquire the client Instance for each clients
1227                                         //
1228 kumpf          1.4                      if (!_clientTable.get()[j].lookup(INSTANCE, clientInst))
1229 j.alex         1.2                      {
1230                                             String ErrReport = String("Invalid Property Value: ");
1231                                             ErrReport.append(INSTANCE);
1232                                             ErrReport.append("=");
1233                                             ErrReport.append(clientInst);
1234                                             throw StressTestControllerException(ErrReport);
1235                                         }
1236 kumpf          1.11                     clientInstance[j] = (Uint32)atoi(clientInst.getCString());
1237 j.alex         1.2  
1238                                         //
1239                                         // Acquire and set client specific duration
1240                                         //
1241 kamal.locahana 1.5                      clientStartMilliseconds.get()[j] =
1242 j.alex         1.2                          TimeValue::getCurrentTime().toMilliseconds();
1243 kamal.locahana 1.5                      clientStopMilliseconds.get()[j] =
1244 kumpf          1.4                          clientStartMilliseconds.get()[j] +
1245                                                 _clientDurations.get()[j];
1246 j.alex         1.2  
1247 kamal.locahana 1.5                      //
1248 j.alex         1.2                      // for verbose only
1249                                         //
1250                                         if (verboseEnabled)
1251                                         {
1252 kumpf          1.4                          outPrintWriter << "Client:" << "[" << j<< "]" << endl;
1253                                             log_file << "Client:" << "[" << j << "]" << endl;
1254                                             outPrintWriter << "ClientStart:" <<
1255                                                 convertUint64toString(
1256                                                     clientStartMilliseconds.get()[j]) <<
1257                                                 endl;
1258                                             outPrintWriter << "ClientStop:" <<
1259                                                 convertUint64toString(
1260                                                     clientStopMilliseconds.get()[j]) <<
1261 j.alex         1.2                              endl;
1262 kumpf          1.4                          outPrintWriter << "ClientDuration:" <<
1263                                                 convertUint64toString(_clientDurations.get()[j]) <<
1264 j.alex         1.2                              endl;
1265 kumpf          1.4                          log_file << "ClientStart:" <<
1266                                                 convertUint64toString(
1267                                                     clientStartMilliseconds.get()[j]) <<
1268 j.alex         1.2                              endl;
1269 kumpf          1.4                          log_file << "ClientStop:" <<
1270                                                 convertUint64toString(
1271                                                     clientStopMilliseconds.get()[j]) <<
1272                                                 endl;
1273                                             log_file << "ClientDuration:" <<
1274                                                 convertUint64toString(_clientDurations.get()[j]) <<
1275 j.alex         1.2                              endl;
1276                                         }
1277                                         log_file<<
1278                                             "Number of instances of this client: "<<
1279                                             clientInstance[j]<<endl;
1280                                         if(verboseEnabled)
1281                                         {
1282                                             outPrintWriter<<
1283                                                 "Number of instances of this client:"<<
1284                                                 clientInstance[j]<<endl;
1285                                         }
1286 kamal.locahana 1.5                      //
1287 j.alex         1.2                      // Execute each instance of the client.
1288 kamal.locahana 1.5                      //   - Additional required parameters are added to the
1289 j.alex         1.2                      //     commands.
1290                                         //     like, -clientid, -pidfile, -clientlog
1291                                         //
1292 kumpf          1.9                      for (Uint32 instanceID = 0; instanceID<clientInstance[j];
1293 j.alex         1.2                           instanceID++)
1294                                         {
1295                                             outPrintWriter<<
1296                                                 "Running Client("<<actual_client<<")"<<endl;
1297                                             log_file<<
1298                                                 "Running Client("<<actual_client<<")"<<endl;
1299                                             act_command=String::EMPTY;
1300                     #ifdef PEGASUS_OS_TYPE_WINDOWS
1301                                             act_command.append("start ");
1302                     #endif
1303                                             //
1304                                             // Adding all the required parameters for the command.
1305                                             //
1306 kumpf          1.4                          act_command.append(_clientCommands.get()[j]);
1307 j.alex         1.2                          act_command.append(" -clientid ");
1308 kamal.locahana 1.5                          sprintf(str,"%d",actual_client);
1309 j.alex         1.2                          act_command.append(str);
1310                                             act_command.append(" -pidfile ");
1311                                             act_command.append(" \"");
1312                                             act_command.append(_stressTestClientPIDFile);
1313                                             act_command.append("\"");
1314                                             act_command.append(" -clientlog");
1315                                             act_command.append(" \"");
1316                                             act_command.append(_stressTestClientLogFile);
1317                                             act_command.append("\"");
1318                                             act_command.append("&");
1319                                             if (verboseEnabled)
1320                                             {
1321                                                 outPrintWriter<<"  "<<act_command<<endl;
1322                                                 tmTime = getCurrentActualTime();
1323                                                 strftime(
1324                                                     strTime,
1325                                                     256,
1326                                                     "%d/%m/%Y at %H:%M:%S\n",
1327                                                     &tmTime);
1328                                                 log_file<<
1329                                                     StressTestControllerCommand::COMMAND_NAME<<
1330 j.alex         1.2                                  "::Running following command on "<<
1331                                                     strTime<<endl;
1332                                                 log_file<<"     ("<<actual_client<<") \n"<<
1333                                                     act_command<<endl;
1334                                             }
1335                     
1336                                             //
1337                                             // Executing the Client
1338                                             //
1339 kumpf          1.10                         int commandRc = system(act_command.getCString());
1340 j.alex         1.2                          //
1341                                             // Continue even if the client failed to Execute
1342                                             // This failure is validated with Tolerance level later
1343 kamal.locahana 1.5                          //
1344 kumpf          1.10                         if (commandRc)
1345 j.alex         1.2                          {
1346                                                 log_file<<"Command failed to Execute."<<endl;
1347                                                 if (verboseEnabled)
1348                                                 {
1349                                                     outPrintWriter<<
1350                                                         "Command failed to Execute."<<endl;
1351                                                 }
1352                                             }
1353                                             //
1354                                             // Increment the actual number of clients
1355                                             //
1356                                             ++actual_client;
1357                                         } /* for(int instanceID =0;instanceID<clientInstance[j]...*/
1358 kamal.locahana 1.5  
1359 j.alex         1.2                  }/* for(Uint32 j=0; j< _clientCount; j++) */
1360                     
1361                                     //
1362                                     //retrieve all PIDs and status;
1363                                     //
1364 kamal.locahana 1.5                  clientPIDs = new pid_t[actual_client];
1365                                     clientStatus = new int[actual_client];
1366                                     prev_clientStatus = new int[actual_client];
1367                                     clientTimeStamp = new Uint64[actual_client];
1368                                     prev_clientTimeStamp = new Uint64[actual_client];
1369                                     clientActive = new Boolean[actual_client];
1370 j.alex         1.2                  nowMilliseconds = TimeValue::getCurrentTime().toMilliseconds();
1371                                     for (int i=0;i<actual_client;i++)
1372                                     {
1373                                         clientPIDs[i] = 9999999;
1374                                         clientStatus[i] = NO_RESPONSE;
1375                                         clientActive[i] = true;
1376                                         clientTimeStamp[i] = nowMilliseconds;
1377                                         prev_clientTimeStamp[i] = nowMilliseconds;
1378                                     }
1379                                     log_file<<StressTestControllerCommand::COMMAND_NAME<<
1380                                         "::Getting client PID's and status. "<<endl;
1381                                     if (verboseEnabled)
1382                                     {
1383                                         outPrintWriter<<StressTestControllerCommand::COMMAND_NAME<<
1384                                             "::Getting client PID's and status. "<<endl;
1385                                     }
1386 kumpf          1.10                 int getClientPidRc = _getClientPIDs(actual_client,log_file);
1387                                     if (!getClientPidRc)
1388 j.alex         1.2                  {
1389                                         outPrintWriter<<
1390                                             "Failed to communicate with clients."<<endl;
1391                                         log_file<<StressTestControllerCommand::COMMAND_NAME<<
1392                                             "::Failed to communicate with clients. "<<endl;
1393                                         log_file<<
1394                                         "                    ::Failed to get client PID & status. "
1395                                             <<endl;
1396                                         TestFailed = true;
1397                                         break;
1398                                     }
1399 kamal.locahana 1.5              }/* if (!actual_client) */
1400                                 else
1401                                 {
1402 j.alex         1.2                  /**
1403                                      Every CHECKUP_INTERVAL minutes check to see if tests are
1404                                      within tolerance. Tests will cease to run if they
1405                                      are not within tolerance. The controller will stop
1406                                      all the clients and then exit.
1407                                     */
1408 kamal.locahana 1.5  
1409 j.alex         1.2                  //
1410                                     // Retreive all the client PIDs
1411                                     //
1412 kumpf          1.10                 int getClientPidRc = _getClientPIDs(actual_client,log_file);
1413 kamal.locahana 1.5  
1414 j.alex         1.2                  //
1415                                     // Get Current Time
1416                                     //
1417                                     nowMilliseconds = TimeValue::getCurrentTime().toMilliseconds();
1418                     
1419                                     //
1420                                     // Check tolerance level if its time
1421                                     //
1422                                     if (nowMilliseconds >= nextCheckupInMillisecs)
1423                                     {
1424                                         //
1425                                         //  Set up the next tolerance time
1426                                         //
1427 kamal.locahana 1.5                      nextCheckupInMillisecs =
1428 j.alex         1.2                             (Uint64)convertmin2millisecs(CHECKUP_INTERVAL) +
1429 kamal.locahana 1.5                             nowMilliseconds;
1430                                         //
1431                                         //  End tests when failed to acquire the Client PID  or
1432 j.alex         1.2                      //  status.
1433                                         //
1434 kumpf          1.10                     if (!getClientPidRc)
1435 j.alex         1.2                      {
1436                                             outPrintWriter<<
1437                                                 "Failed to communicate with clients."<<endl;
1438                                             log_file<<StressTestControllerCommand::COMMAND_NAME<<
1439                                                 "::Failed to communicate with clients. "<<endl;
1440                                             log_file<<StressTestControllerCommand::COMMAND_NAME<<
1441                                                 "::Get Client PID FAILED. "<<endl;
1442                                             TestFailed = true;
1443                                             break;
1444                                         }
1445                                         log_file<<StressTestControllerCommand::COMMAND_NAME<<
1446                                             "::Checking current tolerance level. "<<endl;
1447                                         //
1448                                         // Output Client info if verbose is enabled.
1449                                         //
1450                                         if (verboseEnabled)
1451                                         {
1452                                             outPrintWriter<<
1453                                                 StressTestControllerCommand::COMMAND_NAME<<
1454                                                 "::Checking current tolerance level. "<<endl;
1455                                             for (int i=0;i< actual_client; i++)
1456 j.alex         1.2                          {
1457                                                 outPrintWriter <<" Client: "<<i;
1458                                                 outPrintWriter <<" PID: "<<clientPIDs[i]<<", ";
1459                                                 outPrintWriter <<" Status: "<<clientStatus[i]<<endl;
1460                                                 log_file <<" Client: "<<i;
1461                                                 log_file <<" PID: "<<clientPIDs[i]<<", ";
1462                                                 log_file <<" Status: "<<clientStatus[i]<<", ";
1463                                                 log_file<<"   TimeStamp: "<<
1464                                                     convertUint64toString(clientTimeStamp[i])<<
1465                                                     endl;
1466                                             }
1467                                         }
1468 kamal.locahana 1.5                      //
1469 j.alex         1.2                      // Check the actual tolerance level
1470                                         //
1471                                         Boolean withinTolerance = _checkToleranceLevel(
1472                                                                       actual_client,
1473                                                                       nowMilliseconds,
1474                                                                       log_file);
1475 kamal.locahana 1.5                      //
1476 j.alex         1.2                      //  End tests if not within tolerance
1477                                         //
1478                                         if (!withinTolerance)
1479                                         {
1480                                             log_file<<"FAILED::Tests NOT within tolerance."<<endl;
1481                                             errPrintWriter<<"FAILED::Tests NOT within tolerance."
1482                                                           <<endl;
1483                                             TestFailed = true;
1484                                             break;
1485                                         }
1486 kamal.locahana 1.5                      //
1487                                         //  Within Tolerance - Continue tests.
1488 j.alex         1.2                      //
1489                                         log_file<<"********Tests are within tolerance.********* "<<
1490 kamal.locahana 1.5                              endl;
1491 j.alex         1.2                      if (verboseEnabled)
1492                                         {
1493                                             outPrintWriter<<
1494                                                " ********Tests are within tolerance.**********"<<
1495                                                endl;
1496                                         }
1497                                     } /* if (nowMilliseconds >= nextCheckupInMillisecs)*/
1498                                     //
1499 kamal.locahana 1.5                  // Stop clients with delay
1500 j.alex         1.2                  //
1501                                     for (Uint32 clientID=0; clientID < _clientCount; clientID++)
1502 kamal.locahana 1.5                  {
1503 j.alex         1.2                      //
1504                                         // Get Current time
1505                                         //
1506 kamal.locahana 1.5                      nowMilliseconds =
1507 j.alex         1.2                          TimeValue::getCurrentTime().toMilliseconds();
1508                     
1509 kamal.locahana 1.5                      //
1510 j.alex         1.2                      // Stop only running clients as required.
1511                                         //
1512 kumpf          1.4                      if (!clientStopped.get()[clientID])
1513 j.alex         1.2                      {
1514 kamal.locahana 1.5                          //
1515 j.alex         1.2                          // If Client's duration is up
1516                                             //
1517 kumpf          1.4                          if (clientStopMilliseconds.get()[clientID] <=
1518                                                     nowMilliseconds)
1519 j.alex         1.2                          {
1520 kamal.locahana 1.5                              //
1521 j.alex         1.2                              // Stop all the instances of this client
1522                                                 //
1523 kumpf          1.9                              for (Uint32 instanceID = 0;
1524 j.alex         1.2                                   instanceID<clientInstance[clientID];
1525                                                      instanceID++)
1526                                                 {
1527                                                     log_file<<"Stopping client:("<<
1528                                                         clientID+instanceID<<")"<<endl;
1529                                                     log_file<<"  with PID = "<<
1530                                                         clientPIDs[clientID+instanceID]<<endl;
1531                                                     outPrintWriter<<"Stopping client:("<<
1532                                                         clientID+instanceID<<")"<<endl;
1533                                                     outPrintWriter<<"  with PID = "<<
1534                                                         clientPIDs[clientID+instanceID]<<endl;
1535                                                     if (verboseEnabled)
1536                                                     {
1537                                                         tmTime = getCurrentActualTime();
1538                                                         strftime(
1539                                                             strTime,
1540                                                             256,
1541                                                             "%d/%m/%Y at %H:%M:%S\n",
1542                                                             &tmTime);
1543                                                         log_file<<"    Stopped on "<<strTime<<endl;
1544                                                     }
1545 kamal.locahana 1.5                                  String stopClientFile = String::EMPTY;
1546 j.alex         1.2                                  stopClientFile.append(pegasusHome);
1547                                                     stopClientFile.append(DEFAULT_TMPDIR);
1548                                                     stopClientFile.append("STOP_");
1549                                                     sprintf(
1550                                                         str,
1551                                                         "%d",
1552 kamal.locahana 1.5                                      clientPIDs[clientID+instanceID]);
1553 j.alex         1.2                                  stopClientFile.append(str);
1554                                                     //
1555                                                     // Required for Windows
1556                                                     //
1557                                                     ofstream stop_file(
1558                                                         stopClientFile.getCString(),
1559                                                         ios::out);
1560                                                     stop_file << "Stop Client PID : "<<
1561                                                               clientPIDs[clientID + instanceID]<<
1562                                                               endl;
1563                                                     stop_file.close();
1564                     #ifndef PEGASUS_OS_TYPE_WINDOWS
1565                                                     // one more way to stop the clients.
1566 kumpf          1.10                                 int killRc =
1567 j.alex         1.2                                    kill(clientPIDs[clientID+instanceID], SIGINT);
1568 kumpf          1.10                                 if (killRc)
1569 j.alex         1.2                                  {
1570                                                         outPrintWriter<<"FAILED to stop client:("<<
1571                                                             clientID+instanceID<<")"<<endl;
1572                                                         log_file<<"FAILED to stop client:("<<
1573                                                             clientID + instanceID<<")"<<endl;
1574                                                     }
1575                     #endif
1576                                                     //
1577                                                     // Set the client as inactive.
1578                                                     //
1579                                                     clientActive[clientID + instanceID] = false;
1580                                                 }/* for (int instanceID =0;instanceID<clientInst..*/
1581                                                 //
1582 kamal.locahana 1.5                              // indicate that the client was stopped.
1583 j.alex         1.2                              //
1584 kumpf          1.4                              clientStopped.get()[clientID] = true;
1585 kamal.locahana 1.5                              //
1586 j.alex         1.2                              // If the Client has a Wait time
1587                                                 //
1588 kumpf          1.4                              if (_clientDelays.get()[clientID] !=0)
1589 j.alex         1.2                              {
1590 kamal.locahana 1.5                                  clientDelayMilliseconds.get()[clientID] =
1591 kumpf          1.4                                      nowMilliseconds +
1592                                                             _clientDelays.get()[clientID];
1593                                                     clientDelayed.get()[clientID] = true;
1594 j.alex         1.2                              }
1595                                             } /* if (clientStopMilliseconds[clientID]<= nowMilli..*/
1596 kumpf          1.4                      }  /*  if (!clientStopped.get()[clientID]) */
1597 kamal.locahana 1.5                      else
1598 j.alex         1.2                      {
1599                                             //
1600                                             // Only restart clients that are waiting.
1601                                             //
1602 kumpf          1.4                          if (clientDelayed.get()[clientID])
1603 j.alex         1.2                          {
1604                                                 //
1605                                                 // When waiting period is consumed.
1606                                                 //
1607 kumpf          1.4                              if (clientDelayMilliseconds.get()[clientID] <=
1608 j.alex         1.2                                  nowMilliseconds)
1609                                                 {
1610                                                     //
1611                                                     //  Restart all the instances of the client.
1612                                                     //
1613 kumpf          1.9                                  for (Uint32 instanceID = 0;
1614 j.alex         1.2                                      instanceID<clientInstance[clientID];
1615                                                         instanceID++)
1616                                                     {
1617                                                         act_command=String::EMPTY;
1618                     #ifdef PEGASUS_OS_TYPE_WINDOWS
1619                                                         act_command.append("start ");
1620                     #endif
1621                                                         act_command.append(
1622 kumpf          1.4                                          _clientCommands.get()[clientID]);
1623 j.alex         1.2                                      act_command.append(" -clientid ");
1624 kumpf          1.9                                      sprintf(str,"%u",clientID+instanceID);
1625 j.alex         1.2                                      act_command.append(str);
1626                                                         act_command.append(" -pidfile ");
1627                                                         act_command.append(" \"");
1628 kumpf          1.4                                      act_command.append(
1629                                                             _stressTestClientPIDFile);
1630 j.alex         1.2                                      act_command.append("\"");
1631                                                         act_command.append(" -clientlog");
1632                                                         act_command.append(" \"");
1633 kumpf          1.4                                      act_command.append(
1634                                                             _stressTestClientLogFile);
1635 j.alex         1.2                                      act_command.append("\"");
1636                                                         act_command.append("&");
1637                                                         log_file<<"Restarting client:("<<
1638                                                             clientID+instanceID<<")"<<endl;
1639                                                         outPrintWriter<<"Restarting client:("<<
1640                                                             clientID+instanceID<<")"<<endl;
1641                                                         if (verboseEnabled)
1642                                                         {
1643                                                             outPrintWriter<<"  "<<act_command<<endl;
1644                                                             log_file<<"     ("<<
1645                                                                 clientID+instanceID<<
1646                                                                 ") \n"<<act_command<<endl;
1647                                                             tmTime = getCurrentActualTime();
1648                                                             strftime(
1649                                                                 strTime,
1650                                                                 256,
1651                                                                 "%d/%m/%Y at %H:%M:%S\n",
1652                                                                 &tmTime);
1653                                                             log_file<<"   Restarted on "<<
1654                                                                 strTime<<endl;
1655                                                         }
1656 kumpf          1.10                                     int commandRc =
1657                                                             system(act_command.getCString());
1658                                                         if (commandRc)
1659 kamal.locahana 1.5                                      {
1660 j.alex         1.2                                          log_file<<"Command failed to Execute."<<
1661                                                                 endl;
1662                                                             if (verboseEnabled)
1663                                                             {
1664 kamal.locahana 1.5                                              outPrintWriter<<act_command<<
1665 j.alex         1.2                                                  "Command failed to Execute."<<
1666                                                                     endl;
1667                                                             }
1668                                                         }
1669                                                         clientActive[clientID+instanceID] = true;
1670 kumpf          1.9                                  } /* for (Uint32 instanceID =0;instanceID .. */
1671 kamal.locahana 1.5                                  clientStopMilliseconds.get()[clientID] =
1672                                                         nowMilliseconds +
1673 kumpf          1.4                                          _clientDurations.get()[clientID];
1674                                                     clientStopped.get()[clientID] = false;
1675                                                     clientDelayed.get()[clientID] = false;
1676 j.alex         1.2                              }/* if(clientDelayMilliseconds[clientID]<=nowMi.. */
1677 kumpf          1.4                          } /* if(clientDelayed.get()[clientID]) */
1678 j.alex         1.2                      } /* else ..*/
1679                                     } /* for(Uint32 clientID=0;clientID < _clientCount;clientID++)*/
1680                                 } /* else for if(!actual_client) */
1681                                 //
1682                                 // Get Current time
1683                                 //
1684                                 nowMilliseconds = TimeValue::getCurrentTime().toMilliseconds();
1685                     
1686                             } /* while(stopMilliseconds > nowMilliseconds) */
1687 kamal.locahana 1.5  
1688 j.alex         1.2      }//try
1689 kamal.locahana 1.5  
1690 j.alex         1.2      catch (const StressTestControllerException& e)
1691                         {
1692 kamal.locahana 1.5          errPrintWriter << StressTestControllerCommand::COMMAND_NAME <<
1693 j.alex         1.2              ": " << e.getMessage () << endl;
1694                             return (RC_ERROR);
1695                         }
1696                     
1697 kamal.locahana 1.5      //
1698 j.alex         1.2      //  Stress Tests should be stopped.
1699                         //
1700                         outPrintWriter<<"Ending tests::Preparing to stop all the clients."<<endl;
1701                         log_file<<"Ending tests::Preparing to stop all the clients."<<endl;
1702                     
1703 kamal.locahana 1.5      // Waiting to allow any clients that might have been re-started
1704                         // just before the tests were ended to add
1705 j.alex         1.2      // its pid to the pid file.
1706                     
1707                     #ifndef PEGASUS_OS_TYPE_WINDOWS
1708 kamal.locahana 1.5      sleep(STOP_DELAY);
1709 j.alex         1.2  #else
1710                         Sleep(STOP_DELAY * 1000);
1711                     #endif
1712                     
1713                         //
1714                         // get all the clientPIDs before it is stopped.
1715                         //
1716 kumpf          1.10     int getClientPidRc = _getClientPIDs(actual_client,log_file);
1717                         if (!getClientPidRc)
1718 j.alex         1.2      {
1719                             outPrintWriter<<"Failed to communicate with clients."<<endl;
1720                             log_file<<StressTestControllerCommand::COMMAND_NAME<<
1721                                 "::Failed to communicate with clients. "<<endl;
1722                             log_file<<"                    ::Failed to get client PID & status. "<<
1723                                 endl;
1724                             TestFailed = true;
1725                         }
1726                         tmTime = getCurrentActualTime();
1727                         strftime(strTime,256,"%d/%m/%Y at %H:%M:%S\n",&tmTime);
1728                         log_file<<"Ending tests:: Stopping all the clients on "<<strTime <<endl;
1729                         for (int i=0;i<actual_client;i++)
1730                         {
1731                             if(verboseEnabled)
1732                             {
1733                                 outPrintWriter<<"Stopping Client("<<i<<") with PID:"<<
1734                                     clientPIDs[i]<<endl;
1735                             }
1736                             log_file<<"Stopping Client("<<i<<") with PID:"<<clientPIDs[i]<<endl;
1737                             //
1738                             // Required for Windows
1739 j.alex         1.2          //
1740 kamal.locahana 1.5          String stopClientFile = String::EMPTY;
1741 j.alex         1.2          stopClientFile.append(pegasusHome);
1742                             stopClientFile.append(DEFAULT_TMPDIR);
1743                             stopClientFile.append("STOP_");
1744 kamal.locahana 1.5          sprintf(str,"%d",clientPIDs[i]);
1745 j.alex         1.2          stopClientFile.append(str);
1746                             ofstream stop_file(stopClientFile.getCString(),ios::out);
1747                             stop_file << "Stop Client PID : "<<clientPIDs[i]<<endl;
1748                             stop_file.close();
1749                     #ifndef PEGASUS_OS_TYPE_WINDOWS
1750                             // Another way to stop the client
1751 kumpf          1.10         int killRc = kill(clientPIDs[i], SIGINT);
1752                             if (killRc)
1753 j.alex         1.2          {
1754                                if (verboseEnabled)
1755                                {
1756                                    outPrintWriter<<"Failed to stop client:("<<i<<")"<<endl;
1757                                }
1758                                log_file<<"Failed to stop client:("<<i<<")"<<endl;
1759                             }
1760                     #endif
1761                         }
1762                         if (verboseEnabled)
1763                         {
1764                           outPrintWriter<<"Cleaning all resources"<<endl;
1765                         }
1766                         log_file<<"Cleaning all resources."<<endl;
1767                         cleanupProcess();
1768 kamal.locahana 1.5  
1769 j.alex         1.2      //
1770 kamal.locahana 1.5      // Waiting to allow clients to shutdown
1771 j.alex         1.2      //
1772                     #ifndef PEGASUS_OS_TYPE_WINDOWS
1773 kamal.locahana 1.5      sleep(SHUTDOWN_DELAY);
1774 j.alex         1.2  #else
1775                         Sleep(SHUTDOWN_DELAY * 1000);
1776                     #endif
1777 kamal.locahana 1.5      //
1778 j.alex         1.2      // If the test did not run to completition
1779                         //
1780                         if (TestFailed)
1781                             return(RC_ERROR);
1782                     
1783                         return (RC_SUCCESS);
1784                     } /* execute */
1785                     
1786                     
1787                     /*
1788 kamal.locahana 1.5      Retrieves the contents of the config file if specified or uses default
1789 j.alex         1.2      values from either the default config file
1790                     
1791                         @param   fileName           The specified or default config file for the
1792 kamal.locahana 1.5                                  tests.
1793 j.alex         1.2      @param   log_file           The log file.
1794                     
1795                         @return  true               if the file was read successfully
1796                                  false              if file was not read successfully.
1797                     
1798                      */
1799                     Boolean StressTestControllerCommand::getFileContent(
1800                         String fileName,
1801                         ostream& log_file)
1802                     {
1803                         String configData = String::EMPTY;
1804                         String line;
1805                         int lineNumber = 0;
1806                         Boolean isSuccess = true;
1807                         String name = String::EMPTY;
1808                         String value = String::EMPTY;
1809                         String ErrReports = String::EMPTY;
1810                     
1811                         ifstream ifs;
1812                     
1813                         //
1814 j.alex         1.2      // Open the config file and read the stress test configuration data
1815                         //
1816                         Open(ifs,fileName);
1817                         if (!ifs)
1818                         {
1819                             log_file<<StressTestControllerCommand::COMMAND_NAME<<
1820                                 "::Cannot read config file: "<<fileName<<endl;
1821                             throw NoSuchFile(fileName);
1822                         }
1823                     
1824                         log_file<<StressTestControllerCommand::COMMAND_NAME <<
1825                             "::Storing client details. "<<endl;
1826                         if (verboseEnabled)
1827                         {
1828                             cout<<StressTestControllerCommand::COMMAND_NAME<<
1829                                 "::Storing config details. "<<endl;
1830                         }
1831                         //
1832                         // Get each line of the file.
1833                         //
1834                         while (GetLine(ifs, line))
1835 j.alex         1.2      {
1836                             ++lineNumber;
1837                             IsAClient = false;
1838                             name = String::EMPTY;
1839                             value = String::EMPTY;
1840 kamal.locahana 1.5          try
1841 j.alex         1.2          {
1842                                 //
1843                                 // Parse each line of Config file
1844                                 //
1845                                 _parseLine(line,lineNumber,name,value,log_file);
1846 kamal.locahana 1.5          }
1847 j.alex         1.2          //
1848                             // catch all the exceptions if any thrown from parseLine
1849 kamal.locahana 1.5          //   - Accumulate all the errors from the config file
1850                             //   - Report all errors if found when complete.
1851 j.alex         1.2          //
1852                             catch (Exception& e)
1853                             {
1854                                 char line_num[10];
1855                                 sprintf(line_num, "%d", lineNumber);
1856                                 String msg(e.getMessage());
1857                                 ErrReports.append("\n    ");
1858                                 ErrReports.append("line#");
1859                                 ErrReports.append(line_num);
1860                                 ErrReports.append(":: ");
1861                                 ErrReports.append(msg.getCString());
1862                                 log_file<<StressTestControllerCommand::COMMAND_NAME<<"::"
1863                                     <<msg<<endl;
1864                                 isSuccess = false;
1865                             }
1866                             catch(...)
1867                             {
1868                                 char line_num[10];
1869                                 sprintf(line_num, "%d", lineNumber);
1870                                 ErrReports.append("\n    ");
1871                                 ErrReports.append("line#");
1872 j.alex         1.2              ErrReports.append(line_num);
1873                                 ErrReports.append(":: ");
1874                                 ErrReports.append("Unknown exception caught.");
1875                                 log_file<<StressTestControllerCommand::COMMAND_NAME<<
1876                                     ":Unknown exception caught when parsing line."<<endl;
1877                                 cerr<<StressTestControllerCommand::COMMAND_NAME <<
1878                                    ":Unknown exception caught when parsing line."<<endl;
1879 kamal.locahana 1.5              return false;
1880 j.alex         1.2          }
1881                     
1882                             if ((IsClientOptions)||(IgnoreLine))
1883                             {
1884                                 IsClientOptions = false;
1885                                 IgnoreLine = false;
1886                                 continue;
1887                             }
1888                             //
1889                             // If its a client Update the table
1890                             //
1891                             if (IsAClient)
1892                             {
1893                                 _currClient=name;
1894                                 _currClientCount=_clientCount;
1895                                 //
1896                                 // save the client details in a table
1897                                 //
1898                                 if (!_storeClientDetails(name,value))
1899                                 {
1900                                     log_file<<StressTestControllerCommand::COMMAND_NAME<<
1901 j.alex         1.2                      "::Syntax error found in line#"<<lineNumber<<
1902                                         " of config file: "<<fileName<<endl;
1903                                     isSuccess = false;
1904                                 }
1905 kamal.locahana 1.5          }
1906                             else
1907                             {
1908 j.alex         1.2              //
1909                                 // Common properties are updated only if they are valid.
1910                                 //
1911                                 if (isSuccess)
1912 kamal.locahana 1.5              {
1913 j.alex         1.2                  //
1914                                     // Store the property name and value in the table
1915                                     //
1916                                     if (verboseEnabled)
1917                                     {
1918                                         cout<<"     "<<name<<"\t= "<<value<<endl;
1919                                     }
1920 kumpf          1.4                  if (!_propertyTable.insert(name, value))
1921 j.alex         1.2                  {
1922                                         //
1923                                         // Duplicate property, ignore the new property value.
1924                                         //
1925 j.alex         1.3  #ifdef STRESSTEST_DEBUG
1926 j.alex         1.2                      cout<< "Property Name:duplicate name already saved: "<<
1927                                             name<<endl;
1928                     #endif
1929                                         log_file<<StressTestControllerCommand::COMMAND_NAME<<
1930                                             "::Duplicate property name "<<name<<" already saved."<<
1931                                             endl;
1932                                     }
1933                                 }
1934                             }
1935                     
1936                         }
1937                         ifs.close();
1938                         //
1939 kamal.locahana 1.5      // If a client is not read from the config file
1940 j.alex         1.2      //
1941                         if ((lineNumber==0)||(!_clientCount))
1942                         {
1943                             ErrReports.append("\n    ");
1944                             ErrReports.append(StressTestControllerCommand::COMMAND_NAME);
1945                             ErrReports.append("::No clients found.");
1946                             log_file<<StressTestControllerCommand::COMMAND_NAME <<
1947                                 "::No clients found in"<<" config file: "<<fileName<<endl;
1948                             isSuccess = false;
1949                         }
1950                         //
1951                         // Error was found.
1952                         //
1953                         if (!isSuccess)
1954                         {
1955 kamal.locahana 1.5         //
1956 j.alex         1.2         // cleanup allocated memory
1957                            //
1958                            cleanupProcess();
1959 kamal.locahana 1.5         throw StressTestControllerException(ErrReports);
1960 j.alex         1.2      }
1961                     
1962                         log_file<<StressTestControllerCommand::COMMAND_NAME<<
1963                             "::Common Properties:"<<endl;
1964                         if (verboseEnabled)
1965                         {
1966                             cout<<StressTestControllerCommand::COMMAND_NAME<<
1967                                 "::Common Properties:"<<endl;
1968                         }
1969 kumpf          1.4      for (Table::Iterator i = _propertyTable.start(); i; i++)
1970 j.alex         1.2      {
1971                             log_file<<"      "<<i.key()<<"\t= "<<i.value()<<endl;
1972                             if (verboseEnabled)
1973                             {
1974                                 cout<<"      "<<i.key()<<"\t= "<<i.value()<<endl;
1975                             }
1976                         }
1977                         if (verboseEnabled)
1978                         {
1979                             cout<<"Total clients found:"<<_clientCount<<endl;
1980                             cout<<"CLIENT TABLE CONTENTS:"<<endl;
1981                         }
1982                         log_file<<StressTestControllerCommand::COMMAND_NAME<<
1983                             "::Client Properties:"<<endl;
1984                         for (Uint32 j = 0; j < _clientCount; j++)
1985                         {
1986                             log_file<<"Client information #"<<j+1<<" from config file:"<<endl;
1987                             if (verboseEnabled)
1988                             {
1989                                 cout<<"Client("<<j<<")"<<endl;
1990                             }
1991 kumpf          1.4          for (Table::Iterator i = _clientTable.get()[j].start(); i; i++)
1992 j.alex         1.2          {
1993                                 log_file<<"    "<<i.key()<<"    = "<<i.value()<<endl;
1994                                 if (verboseEnabled)
1995                                 {
1996                                     cout<<"   "<< i.key() << "=" << i.value() << endl;
1997                                 }
1998                             }
1999                         }
2000 kamal.locahana 1.5  
2001                     
2002 j.alex         1.2      if (isSuccess)
2003                         {
2004                            log_file<<StressTestControllerCommand::COMMAND_NAME<<
2005                                "::Successfully retreived config values from" <<
2006                                " config file: "<<fileName<<endl;
2007                         }
2008                         return isSuccess;
2009                     }/* getFileContent */
2010                     
2011 kamal.locahana 1.5  
2012 j.alex         1.2  /*
2013 kamal.locahana 1.5      Validates the configuration data found in the specified config file or
2014 j.alex         1.2      the default config file.
2015                         Will validate known common/client specific properties in configuration.
2016 kamal.locahana 1.5      Will validate valid client names.
2017 j.alex         1.2        (Clients are excepted to  exist in the $PEGASUS_HOME/bin directory)
2018                     
2019                         @param   vars               The property name to be validated
2020                         @param   value              The property value associated to the above name
2021                     
2022                         @return  true               if the property was validated successfully
2023                                  false              if the property failed validation.
2024                     
2025                      */
2026                     
2027                     
2028                     Boolean StressTestControllerCommand::_validateConfiguration(
2029                         String & vars,
2030                         const String & value,
2031                         ostream& log_file)
2032                     {
2033                         Boolean IsValid = false;
2034                     
2035 kamal.locahana 1.5  
2036 j.alex         1.2      if (String::equalNoCase(vars,HOSTNAME))
2037                         {
2038                             vars=String::EMPTY;
2039                             vars.append(HOSTNAME);
2040                             if(!IsAClient)
2041                             {
2042                                 if (!_hostNameSpecified)
2043                                 {
2044                                     _hostName = value;
2045                                 }
2046 kamal.locahana 1.5          }
2047 j.alex         1.2          else
2048                             {
2049 kamal.locahana 1.5  
2050 j.alex         1.2              if(_hostName != String::EMPTY)
2051                                 {
2052                                     if (!String::equalNoCase(value,_hostName))
2053                                     {
2054                                         log_file<<StressTestControllerCommand::COMMAND_NAME<<
2055                                             "::Multiple hostnames were found. "<<endl;
2056                                         if (verboseEnabled)
2057                                         {
2058                                             cout<<StressTestControllerCommand::COMMAND_NAME <<
2059                                                 "::Multiple hostnames were found. "<<endl;
2060                                         }
2061                                         return false;
2062                                     }
2063                                 }
2064                                 else
2065 kamal.locahana 1.5              {
2066 j.alex         1.2                  _hostName = value;
2067                                 }
2068                             }
2069                         }
2070                         else if (String::equalNoCase(vars,PORTNUMBER))
2071                         {
2072                             vars=String::EMPTY;
2073                             vars.append(PORTNUMBER);
2074                             Uint32 vPortNumber = atoi(value.getCString());
2075 kamal.locahana 1.5  
2076 j.alex         1.2          log_file<<StressTestControllerCommand::COMMAND_NAME <<
2077                                 "::Portnumber  specified in config = "<<vPortNumber<<endl;
2078                             if (verboseEnabled)
2079                             {
2080                                 cout<<StressTestControllerCommand::COMMAND_NAME <<
2081                                     "::Portnumber  specified in config = "<<vPortNumber<<endl;
2082                             }
2083                             if (vPortNumber > _MAX_PORTNUMBER)
2084                             {
2085                                 //
2086                                 //  Portnumber out of valid range
2087                                 //
2088                                 if (verboseEnabled)
2089                                 {
2090                                     cout<<StressTestControllerCommand::COMMAND_NAME <<
2091                                         "::Invalid portnumber  was found. "<<endl;
2092                                 }
2093                                 log_file<<StressTestControllerCommand::COMMAND_NAME<<
2094                                     "::Invalid portnumber  was found. "<<endl;
2095                                 return false;
2096                             }
2097 j.alex         1.2          if (!_portNumberSpecified)
2098                             {
2099                                 _portNumber = atoi(value.getCString());
2100                             }
2101                     
2102                         }/* else if (String::equalNoCase ... */
2103                         else if (String::equalNoCase(vars,SSL))
2104                         {
2105                             log_file<<StressTestControllerCommand::COMMAND_NAME<<
2106                                 "::SSL enabled in config. "<<endl;
2107                             if (!_useSSL)
2108                             {
2109                                 _useSSL = true;
2110                             }
2111                         }
2112                         else if (String::equalNoCase(vars,USERNAME))
2113                         {
2114                             vars=String::EMPTY;
2115                             vars.append(USERNAME);
2116                             log_file<<StressTestControllerCommand::COMMAND_NAME<<
2117                                 "::UserName  specified in config = "<<value<<endl;
2118 j.alex         1.2          if (!_userNameSpecified)
2119                             {
2120                                _userName = value;
2121                             }
2122                         }
2123                         else if (String::equalNoCase(vars,PASSWORD))
2124                         {
2125                             vars=String::EMPTY;
2126                             vars.append(PASSWORD);
2127                             if(!_passwordSpecified)
2128                             {
2129                                 _password = value;
2130                             }
2131                             log_file<<StressTestControllerCommand::COMMAND_NAME<<
2132                                 "::Password  specified in config = "<<value<<endl;
2133                         }
2134                         else if (String::equalNoCase(vars,DURATION))
2135                         {
2136                             vars=String::EMPTY;
2137                             vars.append(DURATION);
2138                             //
2139 j.alex         1.2          // converting to a double
2140                             //
2141                             if (!IsAClient)
2142                             {
2143                                 _duration = atof(value.getCString());
2144                                 if (_duration > _MIN_DURATION)
2145                                 {
2146                                     log_file<<StressTestControllerCommand::COMMAND_NAME<<
2147                                         "::Duration  specified in config = "<<value<<endl;
2148 kamal.locahana 1.5              }
2149 j.alex         1.2              else
2150                                 {
2151                                     log_file<<StressTestControllerCommand::COMMAND_NAME<<
2152                                         "::Invalid Duration  was specified. "<<endl;
2153                                     return false;
2154                                 }
2155                             }
2156                         }
2157                         else if (String::equalNoCase(vars,TOLERANCELEVEL))
2158                         {
2159                             _toleranceLevel =  atoi(value.getCString());
2160                             log_file<<StressTestControllerCommand::COMMAND_NAME<<
2161                                 "::ToleranceLevel  specified in config = "<<value<<endl;
2162 kamal.locahana 1.5          if (_toleranceLevel > _MAX_TOLERANCE)
2163 j.alex         1.2          {
2164                                 if(verboseEnabled)
2165                                 {
2166                                     cout<<StressTestControllerCommand::COMMAND_NAME <<
2167                                         "::Invalid Tolerance level  was specified. "<<endl;
2168                                 }
2169                                 log_file<<StressTestControllerCommand::COMMAND_NAME<<
2170                                     "::Invalid Tolerance level  was specified. "<<endl;
2171                     
2172                                 return false;
2173                             }
2174                         }
2175                         else if (String::equalNoCase(vars,NAMESPACE))
2176                         {
2177                             _nameSpace = value;
2178                             log_file<<StressTestControllerCommand::COMMAND_NAME <<
2179                                 "::NameSpace  specified in config = "<<value<<endl;
2180                         }
2181                         else if (String::equalNoCase(vars,CLASSNAME))
2182                         {
2183                             _className = value;
2184 j.alex         1.2          log_file<<StressTestControllerCommand::COMMAND_NAME<<
2185                                 "::Class name  specified in config = "<<value<<endl;
2186                         }
2187                         else
2188 kamal.locahana 1.5      {
2189 j.alex         1.2         if (!IsAClient)
2190                            {
2191                                IsAClient=true;
2192                                int instance = atoi(value.getCString());
2193                                //
2194                                // Check if the instances are set correctly
2195 kamal.locahana 1.5             // Must be greater than 0
2196 j.alex         1.2             //
2197                                if (instance <=0)
2198                                {
2199                                   //
2200 kamal.locahana 1.5                // Invalid Instance value
2201 j.alex         1.2                //
2202                                   return false;
2203                                }
2204                                //
2205                                // Check if client exists or is valid.
2206                                // Clients are expected to be in the $PEGASUS_HOME/bin directory
2207                                //
2208                                String clientName = String(DEFAULT_BINDIR);
2209                                clientName.append(vars.getCString());
2210 john.eisenbraun 1.13.2.1 #if defined(PEGASUS_OS_TYPE_WINDOWS) || defined(PEGASUS_OS_VMS)
2211 j.alex          1.2                 clientName.append(".exe");
2212                          #endif
2213                                     if (!FileSystem::exists(clientName))
2214                                     {
2215                                         String testString = String::EMPTY;
2216                                         testString.append("Test");
2217                                         Uint32 Index = vars.find(testString);
2218                                         if (Index != 0)
2219                                         {
2220                                             clientName = String(DEFAULT_BINDIR);
2221                                             testString.append(vars.getCString());
2222                                             clientName.append(testString.getCString());
2223 john.eisenbraun 1.13.2.1 #if defined(PEGASUS_OS_TYPE_WINDOWS) || defined(PEGASUS_OS_VMS)
2224 j.alex          1.2                         clientName.append(".exe");
2225                          #endif
2226                                             if (!FileSystem::exists(clientName))
2227                                             {
2228                                                 //
2229                                                 // Invalid client name
2230                                                 //
2231 kamal.locahana  1.5                             IsValid = false;
2232 j.alex          1.2                         }
2233 kamal.locahana  1.5                         else
2234 j.alex          1.2                         {
2235 kamal.locahana  1.5                             IsValid = true;
2236 j.alex          1.2                             vars=String::EMPTY;
2237                                                 vars.append(testString.getCString());
2238                                             }
2239                                         }
2240                                         else
2241                                         {
2242 kamal.locahana  1.5      
2243 j.alex          1.2                         //
2244                                             // Invalid client name
2245                                             //
2246                                             IsValid = false;
2247 kamal.locahana  1.5                     }
2248                                     }
2249                                     else
2250 j.alex          1.2                 {
2251                                         IsValid = true;
2252                                     }
2253                                     if (!IsValid)
2254                                     {
2255                                        if (verboseEnabled)
2256                                        {
2257                                            cout<<StressTestControllerCommand::COMMAND_NAME <<
2258                                                "::Invalid Client Name = "<<vars<<endl;
2259                                        }
2260                                        String ErrReport = String("Invalid Client Name:");
2261                                        ErrReport.append(vars.getCString());
2262 kamal.locahana  1.5                    throw StressTestControllerException(ErrReport);
2263 j.alex          1.2                 }
2264                                     return IsValid;
2265                                 }
2266                                  log_file<<StressTestControllerCommand::COMMAND_NAME<<"::"<<vars<<
2267                                      " = "<<value<<endl;
2268                                 //
2269                                 // otherwise accept the properties listed with the clients.
2270                                 //
2271                              }
2272                              return true;
2273                          
2274                          } /* _validateConfiguration */
2275                          
2276                          /*
2277                              Retrieves the client specific options from the config file.
2278                              Will check for syntax errors with the client options.
2279                              - Will retrieve all the client options in the line until ']'
2280 kamal.locahana  1.5          - Client options/properties in Config file are
2281 j.alex          1.2            represented as follows:
2282 kamal.locahana  1.5               -   "[" indicates start of client options.
2283                                   -   "]" indicates end of client options.
2284 j.alex          1.2               -   Client properties and values are seperated by commas.
2285                                   Example:
2286 kamal.locahana  1.5                    [clientName=cimcli,Options=niall]
2287 j.alex          1.2          - This method will throw appropriate exceptions.
2288                          
2289                              @param   p               The pointer to the char in the concerned line
2290                          
2291                          
2292                           */
2293                          void StressTestControllerCommand::_getClientOptions(
2294                              const Char16* p,
2295                              ostream& log_file)
2296                          {
2297                              //
2298                              // Get the property name
2299                              //
2300                              String name = String::EMPTY;
2301                              String value = String::EMPTY;
2302                          
2303                              while (*p != ']')
2304 kamal.locahana  1.5          {
2305 j.alex          1.2              //
2306                                  // Skip whitespace after property name
2307                                  //
2308                                  while (*p && isspace(*p))
2309                                  {
2310                                      p++;
2311                                  }
2312                                  if (!(isalpha(*p) || *p == '_'))
2313                                  {
2314 kumpf           1.4                  throw StressTestControllerException(
2315 kamal.locahana  1.5                      StressTestControllerException::INVALID_OPTION);
2316 j.alex          1.2              }
2317                          
2318                                  name.append(*p++);
2319                          
2320                          
2321                                  while (isalnum(*p) || *p == '_')
2322                                  {
2323                                      name.append(*p++);
2324                                  }
2325                          
2326                                  //
2327                                  // Skip whitespace after property name
2328                                  //
2329                                  while (*p && isspace(*p))
2330                                  {
2331                                      p++;
2332                                  }
2333 kamal.locahana  1.5      
2334 j.alex          1.2              //
2335                                  // Expect an equal sign
2336                                  //
2337                                  if (*p != '=')
2338                                  {
2339 kumpf           1.4                  throw StressTestControllerException(
2340 kamal.locahana  1.5                      StressTestControllerException::INVALID_OPERATOR);
2341 j.alex          1.2              }
2342                          
2343                                  p++;
2344                          
2345                                  //
2346                                  // Skip whitespace after equal sign
2347                                  //
2348                                  while (*p && isspace(*p))
2349                                  {
2350                                      p++;
2351                                  }
2352                          
2353                                  //
2354                                  // Get the value
2355                                  //
2356                          
2357                                  while (*p && *p != ']' && *p != ',')
2358                                  {
2359                                      value.append(*p++);
2360                                  }
2361                                  //
2362 kamal.locahana  1.5              // Skip whitespace after value
2363 j.alex          1.2              //
2364                                  while (*p && isspace(*p))
2365                                  {
2366                                      cout << "got space after value\n";
2367                                      p++;
2368                                  }
2369                          
2370                                  if(*p !=']' && *p != ',')
2371                                  {
2372 kumpf           1.4                  throw StressTestControllerException(
2373 kamal.locahana  1.5                      StressTestControllerException::MISSING_BRACE);
2374 j.alex          1.2              }
2375                                  if(value == String::EMPTY)
2376                                  {
2377 kumpf           1.4                  throw StressTestControllerException(
2378 kamal.locahana  1.5                      StressTestControllerException::MISSING_VALUE);
2379 j.alex          1.2              }
2380 kamal.locahana  1.5      
2381 j.alex          1.3      #ifdef STRESSTEST_DEBUG
2382 j.alex          1.2              cout<<"name="<<name<<endl;
2383                                  cout<<"Before validate config: value="<<value<<endl;
2384                          #endif
2385                                  //
2386                                  // validate client property
2387 kamal.locahana  1.5              //
2388 j.alex          1.2              Boolean IsValid=_validateConfiguration(name,value,log_file);
2389                                  if(!IsValid)
2390                                  {
2391                                      String ErrReport = String("Invalid Client property value: ");
2392                                      ErrReport.append(name);
2393                                      ErrReport.append("=");
2394                                      ErrReport.append(value);
2395 kamal.locahana  1.5                  throw StressTestControllerException(ErrReport);
2396 j.alex          1.2              }
2397                                  //
2398                                  // Save client property in client table if valid.
2399                                  //
2400 kumpf           1.4              if (!_clientTable.get()[_currClientCount].insert(name,value))
2401 j.alex          1.2              {
2402                                      //
2403                                      // Duplicate property, ignore the new property value.
2404                                      // Log this message in a log file.
2405                                      //
2406                                     log_file<< "duplicate name already saved: "<<name<<endl;
2407                                     if (verboseEnabled)
2408                                     {
2409                                        cout<< "duplicate name already saved: "<<name<<endl;
2410                                     }
2411                                  }
2412                                  if (*p ==',')
2413                                  {
2414                                      name = String::EMPTY;
2415                                      value = String::EMPTY;
2416                                      p++;
2417                                      continue;
2418                                  }
2419                              }
2420 kamal.locahana  1.5      
2421 j.alex          1.2          if ((name == String::EMPTY)||(value == String::EMPTY))
2422 kamal.locahana  1.5          {
2423 j.alex          1.2              String ErrReport = String("Missing Name & Value for client option:");
2424 kamal.locahana  1.5              throw StressTestControllerException(ErrReport);
2425 j.alex          1.2          }
2426                          } /* _getClientOptions */
2427                          
2428                          
2429                          /*
2430 kamal.locahana  1.5          Retrieves the Client PIDs and the corresponding status of the
2431                              clients started by the Controller from the PID file.
2432 j.alex          1.2          Each line in the PID file if not a comment is expected to
2433                              have the following format:
2434                                 <clientid>::<client_pid>::<client_status>::<timeStampInMillisec>
2435                              Example:
2436                                   1::7582::0::4119329327
2437                          
2438                              Client PID, status and Time Stamp from the PID file will be saved
2439 kamal.locahana  1.5          in the following global array's for each client.
2440 j.alex          1.2            clientPIDs
2441                                clientStatus
2442                                clientTimeStamp
2443 kamal.locahana  1.5      
2444                          
2445                              @param   actual_clients  The actual number of clients executed by the
2446 j.alex          1.2                                   Controller.
2447                              @param   log_file        The log file.
2448                          
2449                              @return  true            if the status and PIDs were read successfully
2450                                       false           Failed to read the status & PIDs of clients.
2451                          
2452                           */
2453                          Boolean StressTestControllerCommand::_getClientPIDs(
2454                              int actual_clients,
2455                              ostream& log_file)
2456                          {
2457                          
2458                              ifstream ifs;
2459                          
2460                              //
2461                              // Make a temp copy of the file
2462                              //
2463                              Boolean cTempFile = FileSystem::copyFile(
2464                                  _stressTestClientPIDFile,
2465                                  _tmpStressTestClientPIDFile);
2466                          
2467 j.alex          1.2          if(!cTempFile)
2468                              {
2469                                  cout<<"Cannot copy file "<<_stressTestClientPIDFile<<endl;
2470                                  log_file<<StressTestControllerCommand::COMMAND_NAME<<
2471                                      "::Cannot copy PID file: "<<_stressTestClientPIDFile<<endl;
2472                                  return (false);
2473                              }
2474                              //
2475                              // Open the temp PID file and retreive all the client PIDs and status
2476                              //
2477                              Open(ifs,_tmpStressTestClientPIDFile);
2478                          
2479                              String line;
2480                          
2481                              const Char16* p;
2482                              int lineNumber= 0;
2483                              Boolean isSuccess=false;
2484                              //
2485                              // get each line until end of file.
2486                              //
2487                              while (GetLine(ifs, line))
2488 j.alex          1.2          {
2489                                  ++lineNumber;
2490 j.alex          1.3      #ifdef STRESSTEST_DEBUG
2491 j.alex          1.2              log_file<<" Line number:"<<lineNumber<<endl;
2492                                  log_file<<"      "<<line<<endl;
2493                          #endif
2494                                  p = line.getChar16Data();
2495                          
2496                                  while (*p && isspace(*p))
2497                                  {
2498                                      p++;
2499                                  }
2500                          
2501                                  //
2502                                  // Skip comment lines
2503                                  //
2504                                  if ((!*p)||(*p == '#'))
2505                                  {
2506                                      continue;
2507                                  }
2508                          
2509                                  //
2510                                  // Get the client ID
2511                                  //
2512 j.alex          1.2              String client = String::EMPTY;
2513                                  while (isalnum(*p) || *p == '_')
2514                                  {
2515                                      client.append(*p++);
2516                                  }
2517                          
2518                                  //
2519                                  // Skip whitespace after property name
2520                                  //
2521                                  while (*p && isspace(*p))
2522                                  {
2523                                      p++;
2524                                  }
2525                          
2526                                  //
2527 kamal.locahana  1.5              // Expecting a colon
2528 j.alex          1.2              //
2529                                  if (*p != ':')
2530                                  {
2531                                      ifs.close();
2532                                      log_file<<StressTestControllerCommand::COMMAND_NAME<<
2533                                          "::Syntax Error in PID file line number:"<<lineNumber<<endl;
2534                                      FileSystem::removeFile(_tmpStressTestClientPIDFile);
2535                                      return(isSuccess = false);
2536                                  }
2537                          
2538                                  //
2539                                  // point to next character in line.
2540                                  //
2541                                  p++;
2542                          
2543                                  //
2544 kamal.locahana  1.5              // Expecting a colon
2545 j.alex          1.2              //
2546                                  if (*p != ':')
2547                                  {
2548                                      ifs.close();
2549                                      log_file<<StressTestControllerCommand::COMMAND_NAME<<
2550                                          "::Syntax Error in PID file line number:"<<lineNumber<<endl;
2551                                      FileSystem::removeFile(_tmpStressTestClientPIDFile);
2552                                      return(isSuccess = false);
2553                                  }
2554 kamal.locahana  1.5      
2555 j.alex          1.2              //
2556                                  // point to next character in line.
2557                                  //
2558                                  p++;
2559                          
2560                                  //
2561 kamal.locahana  1.5              // Skip whitespace after colon
2562 j.alex          1.2              //
2563                                  while (*p && isspace(*p))
2564                                  {
2565                                      p++;
2566                                  }
2567                          
2568                                  //
2569 kamal.locahana  1.5              // Get the client PID
2570 j.alex          1.2              //
2571                                  String clntPID = String::EMPTY;
2572                                  while (isalnum(*p) || *p == '_')
2573                                  {
2574                                      clntPID.append(*p++);
2575                                  }
2576 kamal.locahana  1.5      
2577 j.alex          1.2              //
2578                                  // Skip whitespace after property name
2579                                  //
2580                                  while (*p && isspace(*p))
2581                                  {
2582                                      p++;
2583                                  }
2584                          
2585                                  //
2586 kamal.locahana  1.5              // Expecting a colon
2587 j.alex          1.2              //
2588                                  if (*p != ':')
2589                                  {
2590                                      ifs.close();
2591                                      log_file<<StressTestControllerCommand::COMMAND_NAME <<
2592                                          "::Syntax Error in PID file line number:"<<lineNumber<<endl;
2593                                      FileSystem::removeFile(_tmpStressTestClientPIDFile);
2594                                      return(isSuccess = false);
2595                                  }
2596                          
2597                                  //
2598                                  // point to next character in line.
2599                                  //
2600                                  p++;
2601                          
2602                                  //
2603 kamal.locahana  1.5              // Expecting a colon
2604 j.alex          1.2              //
2605                                  if (*p != ':')
2606                                  {
2607                                      ifs.close();
2608                                      log_file<<StressTestControllerCommand::COMMAND_NAME <<
2609                                          "::Syntax Error in PID file line number:"<<lineNumber<<endl;
2610                                      FileSystem::removeFile(_tmpStressTestClientPIDFile);
2611                                      return(isSuccess = false);
2612                                  }
2613                                  p++;
2614                          
2615                                  //
2616 kamal.locahana  1.5              // Skip whitespace after the colon if any
2617 j.alex          1.2              //
2618                                  while (*p && isspace(*p))
2619 kamal.locahana  1.5              {
2620 j.alex          1.2                  p++;
2621                                  }
2622                          
2623                                  String clntStatus = String::EMPTY;
2624                                  while (isalnum(*p) || *p == '_')
2625                                  {
2626                                      clntStatus.append(*p++);
2627                                  }
2628                          
2629                                  //
2630                                  // Skip whitespace after property name
2631                                  //
2632                                  while (*p && isspace(*p))
2633                                  {
2634                                      p++;
2635                                  }
2636                          
2637                                  //
2638 kamal.locahana  1.5              // Expecting a colon
2639 j.alex          1.2              //
2640                                  if (*p != ':')
2641                                  {
2642                                      ifs.close();
2643                                      log_file<<StressTestControllerCommand::COMMAND_NAME <<
2644                                          "::Syntax Error in PID file line number:"<<lineNumber<<endl;
2645                                      FileSystem::removeFile(_tmpStressTestClientPIDFile);
2646                                      return(isSuccess = false);
2647                                  }
2648                          
2649                                  //
2650                                  // next character in line.
2651                                  //
2652                                  p++;
2653                          
2654                                  if (*p != ':')
2655                                  {
2656                                      ifs.close();
2657                                      log_file<<StressTestControllerCommand::COMMAND_NAME<<
2658                                          "::Syntax Error in PID file line number:"<<lineNumber<<endl;
2659                                      FileSystem::removeFile(_tmpStressTestClientPIDFile);
2660 j.alex          1.2                  return(isSuccess = false);
2661                                  }
2662                                  //
2663                                  // next character in line.
2664                                  //
2665                                  p++;
2666                                  //
2667 kamal.locahana  1.5              // Skip whitespace after the colon if any
2668 j.alex          1.2              //
2669                                  while (*p && isspace(*p))
2670                                  {
2671                                      p++;
2672                                  }
2673                          
2674                                  //
2675 kamal.locahana  1.5              // Get the client timestamp
2676 j.alex          1.2              //
2677                                  String clntTmStmp = String::EMPTY;
2678                                  while (isalnum(*p))
2679                                  {
2680                                      clntTmStmp.append(*p++);
2681                                  }
2682                          
2683                                  //
2684 kamal.locahana  1.5              // Store the PID, Status and TimeStamp for each client
2685 j.alex          1.2              //
2686                                  if(atoi(client.getCString()) <= actual_clients)
2687                                  {
2688 kamal.locahana  1.5                  clientPIDs[atoi(client.getCString())] =
2689 j.alex          1.2                      (pid_t)atoi(clntPID.getCString());
2690 kamal.locahana  1.5                  clientStatus[atoi(client.getCString())] =
2691 j.alex          1.2                      (pid_t)atoi(clntStatus.getCString());
2692                                      sscanf(
2693                                          (const char*)clntTmStmp.getCString(),
2694                                          "%" PEGASUS_64BIT_CONVERSION_WIDTH "u",
2695                                          &clientTimeStamp[atoi(client.getCString())]);
2696                                  }
2697                                  else
2698                                  {
2699                                      if (verboseEnabled)
2700                                      {
2701                                          log_file<<StressTestControllerCommand::COMMAND_NAME<<
2702                                              "::Unknown client PID for client#"<<
2703                                              atoi(client.getCString())<<
2704                                              " read at line number:"<<lineNumber<<endl;
2705                                          cout<<"Unknown Client PID recieved"<<endl;
2706                                      }
2707 kamal.locahana  1.5              }
2708 j.alex          1.2          }
2709                              //
2710                              // remove the temporary file.
2711                              //
2712                              FileSystem::removeFile(_tmpStressTestClientPIDFile);
2713                              return(isSuccess = true);
2714                          }/* _getClientPIDs */
2715                          
2716                          /*
2717 kamal.locahana  1.5         Parses specified line to retrieve valid config data for the stress tests.
2718 j.alex          1.2         - Identifies client specific properties from common properties in config file
2719                             - Saves all the client specific data from the config file into appropriate
2720                               client tables.
2721                             - Saves all the common properties in the property table
2722                             - This method will throw appropriate exceptions.
2723                             Config File Format:
2724                               - All comments begin with "#"
2725                               - Properties in Config file are represented as follows:
2726                                    <property> = <property value>
2727 kamal.locahana  1.5           - Client options/properties in Config file are
2728 j.alex          1.2             represented as follows:
2729 kamal.locahana  1.5               -   "[" indicates start of client options.
2730 j.alex          1.2               -   Client properties and values are seperated by commas.
2731                                   Example:
2732 kamal.locahana  1.5                    [clientName=cimcli,Options=niall]
2733 j.alex          1.2      
2734                              @param   line            The line that will be parsed.
2735                              @parm    lineNumber      The line number of the line.
2736                              @parm    name            The property name that will be retrieved.
2737                              @parm    value           The property value of the name.
2738 kamal.locahana  1.5          @parm    log_file        The log file.
2739 j.alex          1.2      
2740                              @return  true            Succesfully parsed the line.
2741 kamal.locahana  1.5                   false           Failed to parse the lines successfully.
2742 j.alex          1.2       */
2743                          Boolean StressTestControllerCommand::_parseLine(
2744                              const String & line,
2745                              int lineNumber,
2746                              String &name,
2747                              String &value,
2748                              ostream& log_file)
2749                          {
2750                          
2751                              const Char16* p;
2752                              p = line.getChar16Data();
2753                          
2754                              //
2755                              // Skip whitespace
2756                              //
2757                              while (*p && isspace(*p))
2758                              {
2759                                 p++;
2760                              }
2761                          
2762 kamal.locahana  1.5          //
2763 j.alex          1.2          //  Ignore empty lines
2764                              //
2765                              if (!*p)
2766                              {
2767                                 IgnoreLine = true;
2768                                 return IgnoreLine;
2769                              }
2770                          
2771                              //
2772                              // Skip comment lines
2773                              //
2774                              if (*p == '#')
2775                              {
2776                                 IgnoreLine = true;
2777                                 return IgnoreLine;
2778                              }
2779                          
2780                              //
2781 kamal.locahana  1.5          // Retreive all the Client Options
2782 j.alex          1.2          //   "[" indicates start of client options.
2783                              //
2784                              if (*p == '[')
2785                              {
2786                                 IsAClient = true;
2787                                 IsClientOptions = true;
2788                                 p++;
2789 kamal.locahana  1.5             //
2790 j.alex          1.2             // Ignore spaces before client property
2791                                 //
2792                                 while (*p && isspace(*p))
2793                                 {
2794                                   p++;
2795                                 }
2796                                 //
2797                                 // Invalid Client property name
2798                                 //
2799                                 if (!(isalpha(*p) || *p == '_'))
2800                                 {
2801                                      String ErrReport = String("Syntax Error with client options:");
2802                                      ErrReport.append(line.getCString());
2803 kamal.locahana  1.5                  throw StressTestControllerException(ErrReport);
2804 j.alex          1.2             }
2805 kamal.locahana  1.5             //
2806 j.alex          1.2             // Retrieve client options
2807                                 //
2808                                 try
2809                                 {
2810                                     //
2811 kamal.locahana  1.5                 //  get and validate client options
2812 j.alex          1.2                 //
2813                                     _getClientOptions(p,log_file);
2814                                 }
2815                                 catch (Exception& e)
2816                                 {
2817                                     String msg(e.getMessage());
2818                                     if ((name == String::EMPTY)
2819                                        ||(value == String::EMPTY))
2820                                     {
2821                                         msg.append(" in ");
2822                                         msg.append(line.getCString());
2823                                     }
2824 kamal.locahana  1.5                 throw StressTestControllerException(msg);
2825 j.alex          1.2             }
2826                                 catch (...)
2827                                 {
2828                                     String msg = String(
2829                                         "Unknown exception caught when geting client options.");
2830                                     log_file<<StressTestControllerCommand::COMMAND_NAME <<
2831                                         ":Unknown exception caught when geting client options."<<endl;
2832                                     cerr<<StressTestControllerCommand::COMMAND_NAME <<
2833                                         ":Unknown exception caught when geting client options."<<endl;
2834 kamal.locahana  1.5                 throw StressTestControllerException(msg);
2835 j.alex          1.2              }
2836                          
2837                                  //
2838                                  // Successfully retrieved all the client options.
2839                                  //
2840                                  return true;
2841                              }
2842                          
2843                              //
2844 kamal.locahana  1.5          // Get Common Properties
2845 j.alex          1.2          //
2846                              name = String::EMPTY;
2847                          
2848                              //
2849                              // Invalid Common Property name
2850                              //
2851                              if (!(isalpha(*p) || *p == '_'))
2852                              {
2853                                 String ErrReport = String("Invalid Property Value: ");
2854                                 ErrReport.append(name);
2855                                 ErrReport.append("=");
2856                                 ErrReport.append(value);
2857                                 throw StressTestControllerException(ErrReport);
2858                              }
2859                          
2860                              //
2861                              // Save the property Name
2862                              //
2863                              name.append(*p++);
2864                              while (isalnum(*p) || *p == '_')
2865                              {
2866 j.alex          1.2              name.append(*p++);
2867                              }
2868                          
2869                              //
2870                              // Skip whitespace after property name
2871                              //
2872                              while (*p && isspace(*p))
2873                              {
2874                                  p++;
2875                              }
2876                          
2877                              //
2878                              // Expect an equal sign
2879                              //
2880                              if (*p != '=')
2881                              {
2882                                 String ErrReport = String("Invalid Property Value: ");
2883                                 ErrReport.append(name);
2884                                 ErrReport.append("=");
2885                                 ErrReport.append(value);
2886                                 throw StressTestControllerException(ErrReport);
2887 j.alex          1.2          }
2888                          
2889                              //
2890                              // go to next
2891 kamal.locahana  1.5          //
2892 j.alex          1.2          p++;
2893                          
2894                              //
2895 kamal.locahana  1.5          // Retrive the property value
2896 j.alex          1.2          //   Skip whitespace after equal sign
2897                              //
2898                              while (*p && isspace(*p))
2899                              {
2900                                  p++;
2901                              }
2902                          
2903                              //
2904                              // Get the value
2905                              //
2906                              value = String::EMPTY;
2907                              while (*p)
2908                              {
2909                                  value.append(*p++);
2910                              }
2911 j.alex          1.3      #ifdef STRESSTEST_DEBUG
2912 j.alex          1.2          cout<<"name="<<name<<endl;
2913                              cout<<"value="<<value<<endl;
2914                          #endif
2915                              IsAClient = false;
2916                              Boolean IsValid = false;
2917 kamal.locahana  1.5          //
2918 j.alex          1.2          // Validate property and its value
2919                              //
2920                              try
2921                              {
2922                                  IsValid=_validateConfiguration(name,value,log_file);
2923                              }
2924                              catch (Exception& e)
2925                              {
2926                                  String msg(e.getMessage());
2927 kamal.locahana  1.5              throw StressTestControllerException(msg);
2928 j.alex          1.2          }
2929                              if (!IsValid)
2930                              {
2931                                 String ErrReport = String("Invalid Property Value: ");
2932                                 ErrReport.append(name);
2933                                 ErrReport.append("=");
2934                                 ErrReport.append(value);
2935                                 throw StressTestControllerException(ErrReport);
2936                              }
2937                              return true;
2938                          } /* _parseLine */
2939                          
2940                          /*
2941                              Storing client details in a table.
2942 kamal.locahana  1.5          - Stores the Client name  and instance for specific clients in their
2943 j.alex          1.2            respective client table for later use.
2944                          
2945                              @parm    name            The client name that will be stored.
2946                              @parm    value           The number of instances of the client.
2947                          
2948                              @return  true            Succesfully stored the name or instance.
2949                                       false           Failed to store the name or instance.
2950                           */
2951                          Boolean StressTestControllerCommand::_storeClientDetails(
2952                              String name,
2953                              String value)
2954                          {
2955 kamal.locahana  1.5      
2956                              //
2957 j.alex          1.2          // Expand the client table as required.
2958                              //
2959                              if (_clientCount >= Total_Clients)
2960                              {
2961                                  Total_Clients += NEW_CLIENTS;
2962 kamal.locahana  1.5              Table* tempClientTable = new Table[Total_Clients];
2963 kumpf           1.4              for (Uint32 i = 0; i < _clientCount; i++)
2964 j.alex          1.2              {
2965 kumpf           1.4                  tempClientTable[i] = _clientTable.get()[i];
2966 j.alex          1.2              }
2967 kumpf           1.4              _clientTable.reset(tempClientTable);
2968                              }
2969 j.alex          1.2      
2970 kamal.locahana  1.5          //
2971 j.alex          1.2          // Store the client Name in the table
2972 kamal.locahana  1.5          //
2973 kumpf           1.4          if (!_clientTable.get()[_clientCount].insert(NAME, name))
2974 j.alex          1.2          {
2975                                  //
2976                                  // Duplicate property, ignore the new property value.
2977                                  //
2978                                  if (verboseEnabled)
2979                                  {
2980                                      cout<< "Duplicate Client already saved: "<<endl;
2981                                  }
2982                                  return false;
2983                              }
2984                          
2985 kamal.locahana  1.5          //
2986 j.alex          1.2          // Store the number of instances for the client in the table
2987 kamal.locahana  1.5          //
2988 kumpf           1.4          if (!_clientTable.get()[_clientCount].insert(INSTANCE, value))
2989 j.alex          1.2          {
2990                          
2991                                 //
2992                                 // Duplicate property, ignore the new property value.
2993                                 //
2994                                 if(verboseEnabled)
2995                                 {
2996                                    cout<< "Duplicate Instance already saved: "<<endl;
2997                                 }
2998                                 return false;
2999                              }
3000                              ++_clientCount;
3001                              return true;
3002                          } /* _storeClientDetails */
3003                          
3004                          /*
3005                              Will check the current tolerance level of the running clients with
3006                              respect to the expected tolerance level.
3007 kamal.locahana  1.5          @parm    actual_client     The total number of executed clients.
3008 j.alex          1.2          @parm    nowMilliseconds   The current time in milliseconds.
3009                              @parm    log_file          The log_file.
3010                          
3011                              @return  true            Clients with tolerance.
3012                                       false           Clients failed tolerance.
3013                           */
3014                          Boolean StressTestControllerCommand::_checkToleranceLevel(
3015                              int actual_client,
3016                              Uint64 nowMilliseconds,
3017 kamal.locahana  1.5          ostream& log_file)
3018 j.alex          1.2      {
3019                              int count = 0;
3020                              int failed_count = 0;
3021 kamal.locahana  1.5          Uint64 lastUpdateinMilliSec =0;
3022 j.alex          1.2          Boolean withinTolerance = false;
3023                          
3024                              for (int i=0;i<actual_client;i++)
3025                              {
3026 kamal.locahana  1.5              //
3027 j.alex          1.2              //Observe only the status of running clients
3028                                  //
3029                                  if (clientActive[i])
3030                                  {
3031                                      ++count;
3032                                      //
3033                                      //  Validate the timestamps:
3034 kamal.locahana  1.5                  //  The timestamps on the status is compared to the previous
3035                                      //  timestamp to ensure that the status has been updated within
3036 j.alex          1.2                  //  the previous 2 updates.
3037                                      //
3038                                      if(clientStatus[i]== VALID_RESPONSE)
3039                                      {
3040                                          //
3041                                          //check with the last timestamp
3042                                          //
3043                                          lastUpdateinMilliSec = nowMilliseconds - clientTimeStamp[i];
3044                                          //
3045                                          // Assume failure if status update is
3046 kamal.locahana  1.5                      // longer than 2 * checkup interval
3047 j.alex          1.2                      //
3048                                          if ((clientTimeStamp[i] == prev_clientTimeStamp[i])
3049                                             && (lastUpdateinMilliSec >=
3050                                             (2 * (Uint64)convertmin2millisecs(CHECKUP_INTERVAL))))
3051 kamal.locahana  1.5                      {
3052 j.alex          1.2                          if (verboseEnabled)
3053                                              {
3054                                                  log_file <<" Status not updated for client (" <<i<<
3055                                                      ")pid :"<<clientPIDs[i]<<endl;
3056 kamal.locahana  1.5                              log_file << "        for the past " <<
3057 j.alex          1.2                                  2*(CHECKUP_INTERVAL) << " minutes." << endl;
3058                                                  cout<<" Status not updated for client ("<<i<<")pid :"<<
3059                                                      clientPIDs[i]<<endl;
3060                                                  cout<<"        for the past " << 2*(CHECKUP_INTERVAL)<<
3061                                                      " minutes." << endl;
3062                                              }
3063 kamal.locahana  1.5                          ++failed_count;
3064 j.alex          1.2                      }
3065                                      }
3066                                      //
3067                                      // If unknown status - server or client may be hung.
3068                                      // Two consective failures on the same client will be counted
3069 kamal.locahana  1.5                  // as a failed client.
3070 j.alex          1.2                  //
3071                                      if (((clientStatus[i]== NO_RESPONSE)
3072                                         ||(clientStatus[i]== INVALID_RESPONSE))
3073                                         &&((prev_clientStatus[i]== NO_RESPONSE)
3074                                           ||(prev_clientStatus[i]== INVALID_RESPONSE)))
3075                                      {
3076                                          if (verboseEnabled)
3077                                          {
3078                                              if (clientStatus[i]== INVALID_RESPONSE)
3079                                              {
3080                                                  log_file<<
3081                                                      "Recieved an Invalid response Status from client("<<
3082                                                      i <<") pid :"<<clientPIDs[i]<<endl;
3083                                              }
3084                                              else
3085 kamal.locahana  1.5                          {
3086 j.alex          1.2                              log_file<<"Recieved a no response Status from client("<<
3087                                                      i <<") pid :"<<clientPIDs[i]<<endl;
3088                                              }
3089                                          }
3090 kamal.locahana  1.5                      ++failed_count;
3091 j.alex          1.2                  } /* if (((clientStatus[i]== NO_RESPONSE) ... */
3092                                      //
3093                                      // Save previous time stamp of client
3094                                      //
3095                                      prev_clientTimeStamp[i] = clientTimeStamp[i];
3096                                      prev_clientStatus[i] = clientStatus[i];
3097                                  } /* if (clientActive[i]) */
3098                              }
3099                              //
3100                              // check actual tolerance
3101                              //
3102                              if(count > 0)
3103                              {
3104                                  double curr_tolerancePercent = getToleranceInPercent(
3105                                                                     failed_count,
3106                                                                     (double)count);
3107                                  if (verboseEnabled)
3108                                  {
3109                                      cout<<" total running clients ="<<count<<endl;
3110                                      cout<<" failed clients ="<<failed_count<<endl;
3111                                      cout<<"Actual Tolerance % ="<<curr_tolerancePercent<<endl;
3112 j.alex          1.2                  cout<<"Expected Tolerance % ="<<_toleranceLevel<<endl;
3113                                      log_file<<"Total Running clients:"<<count<<endl;
3114                                      log_file<<"Actual Failed clients:"<<failed_count<<endl;
3115                                      log_file<<"::Expected Tolerance:"<<_toleranceLevel<<endl;
3116                                      log_file<<"::Actual Tolerance:"<<curr_tolerancePercent<<endl;
3117                                  }
3118                                  if ((double)_toleranceLevel >= curr_tolerancePercent)
3119                                  {
3120                                      withinTolerance = true;
3121                                  }
3122                                  return(withinTolerance);
3123                              }
3124                              //
3125                              // All process are stopped.
3126                              //
3127                              return(withinTolerance = true);
3128                          } /* _checkToleranceLevel */
3129                          
3130                          
3131                          /*
3132                              This will populate the client table with the hard coded
3133 j.alex          1.2          values for the stress tests.
3134 kamal.locahana  1.5          This method is only used if the default configuration
3135 j.alex          1.2          file does not exist.
3136 kamal.locahana  1.5          Default clients are 5 instances of
3137 j.alex          1.2          "TestWrapperStressClient" and "TestModelWalkStressClient".
3138                          
3139 kamal.locahana  1.5          @parm    log_file      The log_file.
3140                          
3141 j.alex          1.2       */
3142                          void StressTestControllerCommand::getDefaultClients(ostream& log_file)
3143                          {
3144                              //
3145                              // Setting the client count to default client value
3146                              //
3147 kamal.locahana  1.5          _clientCount = DEFAULT_CLIENTS;
3148 j.alex          1.2      
3149 kamal.locahana  1.5          log_file << "Populating default configuration for stress Tests." << endl;
3150 j.alex          1.2          if (verboseEnabled)
3151                              {
3152 kamal.locahana  1.5              cout << "Populating default configuration for stress Tests." << endl;
3153 j.alex          1.2          }
3154                              //
3155                              // Populating default client attributes
3156                              //
3157                              for (Uint32 i=0;i<_clientCount; i++)
3158                              {
3159                                  //
3160                                  // Adding the default instance value to each client table
3161                                  //
3162 kumpf           1.4              if (!_clientTable.get()[i].insert(INSTANCE, DEFAULT_INSTANCE))
3163 j.alex          1.2              {
3164                                      log_file <<  "Duplicate name already saved: "<<INSTANCE<<endl;
3165                                      if (verboseEnabled)
3166                                      {
3167                                          cout<< "duplicate name already saved: "<<INSTANCE<<endl;
3168                                      }
3169                                  }
3170                                  switch(i)
3171 kamal.locahana  1.5              {
3172 j.alex          1.2                  case 0:
3173                                      {
3174 kumpf           1.4                      if (!_clientTable.get()[i].insert(NAME, MODELWALK_CLIENT))
3175 j.alex          1.2                      {
3176                                              log_file <<  "Duplicate name already saved: "<<NAME<<endl;
3177                                              if (verboseEnabled)
3178                                              {
3179                                                  cout<< "Duplicate name already saved: "<<NAME<<endl;
3180                                              }
3181                                          }
3182 kumpf           1.4                      log_file << "Stress Test Client Name:" << MODELWALK_CLIENT <<
3183                                              endl;
3184 j.alex          1.2                      if (verboseEnabled)
3185                                          {
3186 kamal.locahana  1.5                          cout<< "Stress Test Client Name:"<<MODELWALK_CLIENT<< endl;
3187 j.alex          1.2                      }
3188                          
3189                                          break;
3190                                      }
3191                                      case 1:
3192                                      {
3193 kumpf           1.4                      if (!_clientTable.get()[i].insert(NAME, WRAPPER_CLIENT))
3194 j.alex          1.2                      {
3195                                              log_file <<  "Duplicate name already saved: "<<NAME<<endl;
3196                                              if (verboseEnabled)
3197                                              {
3198                                                  cout<< "Duplicate name already saved: "<<NAME<<endl;
3199                                              }
3200                                          }
3201 kamal.locahana  1.5                      log_file << "Stress Test Client Name:" <<WRAPPER_CLIENT<< endl;
3202 j.alex          1.2                      if (verboseEnabled)
3203                                          {
3204 kamal.locahana  1.5                          cout << "Stress Test Client Name:" <<WRAPPER_CLIENT<< endl;
3205 j.alex          1.2                      }
3206 kamal.locahana  1.5                      if (!_clientTable.get()[i].insert(CLIENTNAME, "cimcli"))
3207 j.alex          1.2                      {
3208                                              log_file<< "Duplicate name already saved: "<<
3209                                                  CLIENTNAME<<endl;
3210 kamal.locahana  1.5                          if (verboseEnabled)
3211                                              {
3212 j.alex          1.2                              cout<< "Duplicate name already saved: "<<
3213                                                      CLIENTNAME<<endl;
3214                                              }
3215                                          }
3216 kumpf           1.4                      if (!_clientTable.get()[i].insert(OPTIONS, "niall"))
3217 j.alex          1.2                      {
3218                                              log_file<< "Duplicate name already saved: "<<OPTIONS<<endl;
3219                                              if (verboseEnabled)
3220                                              {
3221                                                  cout<< "Duplicate name already saved: "<<OPTIONS<<endl;
3222 kamal.locahana  1.5                          }
3223 j.alex          1.2                      }
3224 kumpf           1.7                      log_file <<
3225                                              "            Client Command &  options: cimcli niall" <<
3226 kamal.locahana  1.5                          endl;
3227 j.alex          1.2                      if (verboseEnabled)
3228                                          {
3229 kumpf           1.7                          cout <<
3230                                                  "            Client Command &  options: cimcli niall" <<
3231                                                  endl;
3232 j.alex          1.2                      }
3233                                          break;
3234                                      } /* case 1: */
3235                                  } /* switch(i) */
3236                              } /* for(Uint32 i=0;i<_clientCount; i++) */
3237                          
3238                          } /* getDefaultClients */
3239                          
3240                          
3241                          
3242                          
3243                          /**
3244                              Will generate or create all the required files for the tests.
3245 kamal.locahana  1.5          - Required log files, pid files, client log file are created here.
3246 j.alex          1.2      
3247 kamal.locahana  1.5          @parm    strTime         The time stamp for the tests.
3248 j.alex          1.2                                   This is used in the naming of the log file.
3249                          
3250                              @return  true            The files were successfully created.
3251                                       false           Failed to create one or more of the required
3252                                                       files.
3253                          
3254                           */
3255                          Boolean StressTestControllerCommand::generateRequiredFileNames(char *strTime)
3256                          {
3257                              char pid_str[15];
3258                              ofstream log_file;
3259                              ofstream pid_file;
3260                              ofstream clntlog_file;
3261                          
3262                              sprintf(pid_str, "%d", getpid());
3263 kamal.locahana  1.5      
3264 j.alex          1.2          //
3265                              // Stress Controller Log file
3266                              //
3267                              _stressTestLogFile.append(pegasusHome);
3268                              _stressTestLogFile.append(TESTDIR);
3269                              FileSystem::makeDirectory(_stressTestLogFile);
3270                              _stressTestLogFile.append(STRESSTESTDIR);
3271                              FileSystem::makeDirectory(_stressTestLogFile);
3272                              _stressTestLogFile.append(LOGDIR);
3273                              FileSystem::makeDirectory(_stressTestLogFile);
3274                              _stressTestLogFile.append(pid_str);
3275                              _stressTestLogFile.append("_stressTest_");
3276                              _stressTestLogFile.append(strTime);
3277                              _stressTestLogFile.append("log");
3278                          
3279                              //
3280                              // StressClient PID  file
3281                              //
3282                              _stressTestClientPIDFile.append(pegasusHome);
3283                              _stressTestClientPIDFile.append(DEFAULT_TMPDIR);
3284                              FileSystem::makeDirectory(_stressTestClientPIDFile);
3285 j.alex          1.2          _stressTestClientPIDFile.append(pid_str);
3286                              _stressTestClientPIDFile.append("_StressTestClients");
3287                              _stressTestClientPIDFile.append(strTime);
3288                              _stressTestClientPIDFile.append("pid");
3289                          
3290                              //
3291                              // StressClient Log  file
3292                              //
3293                              _stressTestClientLogFile.append(pegasusHome);
3294                              _stressTestClientLogFile.append(DEFAULT_LOGDIR);
3295                              _stressTestClientLogFile.append(pid_str);
3296                              _stressTestClientLogFile.append("_StressTestClients");
3297                              _stressTestClientLogFile.append(".log");
3298 kamal.locahana  1.5      
3299 j.alex          1.2          //
3300                              // Temporary StressClient PID/status  file
3301                              //
3302                              _tmpStressTestClientPIDFile.append(pegasusHome);
3303                              _tmpStressTestClientPIDFile.append(DEFAULT_TMPDIR);
3304                              _tmpStressTestClientPIDFile.append(pid_str);
3305                              _tmpStressTestClientPIDFile.append("TEMP");
3306                              _tmpStressTestClientPIDFile.append("_Clients");
3307                              _tmpStressTestClientPIDFile.append(".pid");
3308                          
3309                              //
3310                              // Translate slashed for appropriate OS
3311                              //
3312                              FileSystem::translateSlashes(_stressTestClientPIDFile);
3313                              FileSystem::translateSlashes(_stressTestClientLogFile);
3314                              FileSystem::translateSlashes(_stressTestLogFile);
3315                              FileSystem::translateSlashes(_tmpStressTestClientPIDFile);
3316                          
3317                              //
3318                              // open the file
3319                              //
3320 j.alex          1.2          OpenAppend(log_file,_stressTestLogFile);
3321                              Open(pid_file,_stressTestClientPIDFile);
3322                              Open(clntlog_file,_stressTestClientLogFile);
3323                          
3324                              //
3325                              //  Failed to open the log file
3326                              //
3327                              if (!log_file)
3328                              {
3329                                 log_file.close();
3330                                 pid_file.close();
3331                                 clntlog_file.close();
3332                                 cout<<"Cannot get file "<<_stressTestLogFile<<endl;
3333                                 return false;
3334                          
3335                              }
3336                              //
3337                              //  Failed to open the pid file
3338                              //
3339                              if (!pid_file)
3340                              {
3341 j.alex          1.2             cout<<"Cannot get file "<<_stressTestClientPIDFile<<endl;
3342                                 log_file<<StressTestControllerCommand::COMMAND_NAME<<
3343                                     "Cannot read file "<<_stressTestClientPIDFile<<endl;
3344                                 log_file.close();
3345                                 clntlog_file.close();
3346                                 return false;
3347                              }
3348                              //
3349                              //  Failed to open the clntlog file
3350                              //
3351                              if (!clntlog_file)
3352                              {
3353                                 log_file<<StressTestControllerCommand::COMMAND_NAME<<
3354                                     "Cannot read file "<<_stressTestClientLogFile<<endl;
3355                                 log_file.close();
3356                                 pid_file.close();
3357                                 return false;
3358                              }
3359                          
3360                              //
3361                              // Successfully opened all the files.
3362 j.alex          1.2          //
3363                              pid_file<<"#"<<StressTestControllerCommand::COMMAND_NAME<<
3364                                  " has the following clients:: \n";
3365                              clntlog_file<<"#"<<StressTestControllerCommand::COMMAND_NAME<<
3366                                  "::Process ID:"<<getpid()<<endl;
3367                              clntlog_file.close();
3368                              pid_file.close();
3369                              return true;
3370                          
3371                          } /* generateRequiredFileNames */
3372                          
3373                          /**
3374                              Will remove all the unused files for the tests.
3375 kamal.locahana  1.5          - Unused log files & pid files are removed here.
3376 j.alex          1.2      
3377                           */
3378                          void StressTestControllerCommand::removeUnusedFiles()
3379                          {
3380                              FileSystem::removeFile(_stressTestClientPIDFile);
3381                              FileSystem::removeFile(_stressTestClientLogFile);
3382                          }
3383                          
3384                          PEGASUS_NAMESPACE_END
3385                          
3386                          /**
3387                              Cleanup function for stressTestController to free allocated
3388                              memory used to execute clients.
3389                           */
3390                          void cleanupProcess()
3391                          {
3392                          
3393                              delete [] clientPIDs;
3394                              delete [] clientStatus;
3395                              delete [] clientInstance;
3396                              delete [] clientActive;
3397 j.alex          1.2          delete [] clientTimeStamp;
3398                              delete [] prev_clientTimeStamp;
3399                              delete [] prev_clientStatus;
3400                          }
3401                          
3402                          /*
3403                              This will generate the current time.
3404                           */
3405                          struct tm getCurrentActualTime()
3406                          {
3407                              struct tm tmTime;
3408                              time_t inTime=time(NULL);
3409                          #ifdef PEGASUS_OS_TYPE_WINDOWS
3410                              tmTime=*localtime(&inTime);
3411                          #else
3412                              localtime_r(&inTime,&tmTime);
3413                          #endif
3414                              return tmTime;
3415                          }
3416                          
3417                          /**
3418 j.alex          1.2          Signal handler for SIGINT, SIGABRT.
3419                          
3420                              @param   signum  the signal identifier
3421                          */
3422                          void endAllTests(int signum)
3423                          {
3424                              if (verboseEnabled)
3425                              {
3426                                  switch(signum)
3427                                  {
3428                                      case SIGINT:
3429                                      {
3430                                          cout<<StressTestControllerCommand::COMMAND_NAME<<
3431                                              "::Recieved interupt signal SIGINT!"<<endl;
3432                                          break;
3433                                      }
3434                                      case SIGABRT:
3435                                      {
3436                                          cout<<StressTestControllerCommand::COMMAND_NAME<<
3437                                              "::Recieved signal SIGABRT!"<<endl;
3438                                          break;
3439 j.alex          1.2                  }
3440                                      default:
3441                                      {
3442                                          cout<<StressTestControllerCommand::COMMAND_NAME<<
3443                                              "::Recieved Signal ( "<<signum<<"!" <<endl;
3444                                          break;
3445                                      }
3446                                  }
3447                              }
3448                              //
3449                              // Sets the variable that will interupt stress tests
3450                              //
3451                              Quit = true;
3452                          } /* endAllTests */
3453                          
3454                          /**
3455                              This function will convert a Uint64
3456                              to a string.
3457                          
3458                              @param   x       The Uint64 integer
3459                          
3460 j.alex          1.2          @return  String  Returns the converted string.
3461                          */
3462                          String convertUint64toString(Uint64 x)
3463                          {
3464                              char buffer[32];
3465                              sprintf(buffer, "%" PEGASUS_64BIT_CONVERSION_WIDTH "u", x);
3466                              return(String(buffer));
3467                          }/* convertUint64toString(..) */

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2