1 martin 1.8 //%LICENSE////////////////////////////////////////////////////////////////
2 //
3 // 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 //
10 // 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 //
17 // The above copyright notice and this permission notice shall be included
18 // in all copies or substantial portions of the Software.
19 //
20 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
21 // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
22 martin 1.8 // 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 //
28 //////////////////////////////////////////////////////////////////////////
|
29 j.alex 1.2 //
30 //%/////////////////////////////////////////////////////////////////////////////
31
32 #include <iostream>
33 #include <Pegasus/getoopt/getoopt.h>
34 #include <Clients/cliutils/CommandException.h>
35 #include "StressTestController.h"
36 #include <Pegasus/Common/TimeValue.h>
37 #include <Pegasus/Common/FileSystem.h>
38
39 //#define DEBUG
40 #include <time.h>
41
42 //
43 // For Windows
44 //
45 #ifdef PEGASUS_OS_TYPE_WINDOWS
46 // for DWORD etc.
|
47 kumpf 1.5 # include <windows.h>
|
48 j.alex 1.2 // getpid() and others
49 typedef DWORD pid_t;
|
50 kumpf 1.5 # include <process.h>
|
51 ouyang.jian 1.4 #else
|
52 kumpf 1.5 # include <unistd.h>
|
53 j.alex 1.2 #endif
54
55
56 /**
57 Signal handler set up SIGALARM.
58 */
59 static Boolean useDefaults = false;
60
61
62 /**
63 Message resource name
64 */
65
66 static const char ERR_OPTION_NOT_SUPPORTED [] =
|
67 kumpf 1.7 "Invalid option. Use '--help' to obtain command syntax.";
|
68 j.alex 1.2
69 static const char ERR_USAGE [] =
|
70 kumpf 1.7 "Incorrect usage. Use '--help' to obtain command syntax.";
|
71 j.alex 1.2
72
73 //
74 // exclude main from the Pegasus Namespace
75 //
76 PEGASUS_USING_PEGASUS;
77 PEGASUS_USING_STD;
78
79
80 int main (int argc, char* argv [])
81 {
82 char strTime[256];
83 struct tm tmTime;
84 int rc;
|
85 kumpf 1.6 String fileName;
|
86 j.alex 1.2 ofstream log_file;
87
88
89 tmTime = getCurrentActualTime();
90 strftime(strTime,256,"%d%m%Y%H%M%S.",&tmTime);
91
|
92 kumpf 1.3 StressTestControllerCommand command;
|
93 j.alex 1.2
94 //
95 // Generate log files and PID files
96 //
97 if (!command.generateRequiredFileNames(strTime))
98 {
99 cout<<StressTestControllerCommand::COMMAND_NAME\
100 <<"::Failed to generate required files for tests. "<<endl;
101 command.removeUnusedFiles();
|
102 kumpf 1.6 return Command::RC_ERROR;
|
103 j.alex 1.2 }
104
105 //
106 // open the log file
107 //
108 OpenAppend(log_file,command.getStressTestLogFile());
109
110 if (!log_file)
111 {
112 log_file.close();
113 cout<<"Cannot get file "<<command.getStressTestLogFile()<<endl;
114 command.removeUnusedFiles();
|
115 kumpf 1.6 return Command::RC_ERROR;
|
116 j.alex 1.2 }
117 strftime(strTime,256,"%d/%m/%Y at %H:%M:%S\n",&tmTime);
118 log_file<<StressTestControllerCommand::COMMAND_NAME\
119 <<"::Initiated on "<<strTime<<endl;
120 log_file<<StressTestControllerCommand::COMMAND_NAME\
121 <<"::Process ID: "<<getpid()<<endl;
122
123 try
124 {
125 log_file<<StressTestControllerCommand::COMMAND_NAME;
126 log_file<<"::Geting Command Options."<<endl;
127 if(verboseEnabled)
128 {
129 cout<<StressTestControllerCommand::COMMAND_NAME;
130 cout<<"::Getting Command options."<<endl;
131 }
132 //
133 // validate and set command arguments
134 //
135 command.setCommand (argc, argv);
136 }
137 j.alex 1.2 catch (const CommandFormatException& cfe)
138 {
139 String msg(cfe.getMessage());
140
141 log_file<< StressTestControllerCommand::COMMAND_NAME << "::" \
142 << msg << endl;
143 cerr<< StressTestControllerCommand::COMMAND_NAME << "::"\
144 << msg << endl;
145
146 if (msg.find(String("Unknown flag")) != PEG_NOT_FOUND)
147 {
148
149 cerr<< StressTestControllerCommand::COMMAND_NAME <<
150 "::" << ERR_OPTION_NOT_SUPPORTED << endl;
151 log_file<< StressTestControllerCommand::COMMAND_NAME <<
152 "::" << ERR_OPTION_NOT_SUPPORTED << endl;
153 }
154 else
155 {
156 cerr<< StressTestControllerCommand::COMMAND_NAME <<
157 "::" << ERR_USAGE << endl;
158 j.alex 1.2 log_file<< StressTestControllerCommand::COMMAND_NAME <<
159 "::" << ERR_USAGE << endl;
160 }
161
162 log_file.close();
163 command.removeUnusedFiles();
|
164 kumpf 1.6 return Command::RC_ERROR;
|
165 j.alex 1.2 }
166 catch (...)
167 {
168 log_file<<StressTestControllerCommand::COMMAND_NAME<<
169 "::Unknown exception caught when setting commands."<<endl;
170 cerr<<StressTestControllerCommand::COMMAND_NAME<<
171 "::Unknown exception caught when setting commands."<<endl;
172 log_file.close();
173 command.removeUnusedFiles();
|
174 kumpf 1.6 return Command::RC_ERROR;
|
175 j.alex 1.2 }
176
177 //
178 // For help or version options execute usage/version and
179 // exit
180 //
181 if ((command.getOperationType() == OPERATION_TYPE_HELP)
182 ||(command.getOperationType() == OPERATION_TYPE_VERSION))
183 {
184 rc = command.execute (cout, cerr);
185 log_file.close();
186 //
187 // Log file not required when help or verbose is opted.
188 //
189 FileSystem::removeFile(command.getStressTestLogFile());
|
190 kumpf 1.6 return rc;
|
191 j.alex 1.2 }
192
193 String filename;
194
195 //
196 // If a configuration file is specified then:
197 // Check if it exists as indicated, if not
198 // also look for it in the default config dir.
199 //
200 if (command.IsConfigFilePathSpecified())
201 {
202 filename = command.getConfigFilePath();
203 FileSystem::translateSlashes(filename);
204 //
205 // Check whether the file exists or not
206 //
207 if (!FileSystem::exists(filename))
208 {
209 //
210 // Check for file in default directory as well
211 //
|
212 kumpf 1.6 fileName = StressTestControllerCommand::DEFAULT_CFGDIR;
|
213 j.alex 1.2 fileName.append(filename);
214
215 if (!FileSystem::exists(fileName))
216 {
217 cerr << StressTestControllerCommand::COMMAND_NAME ;
218 cerr << "::Specified Configuration file \""<<filename;
219 cerr << "\" does not exist."<<endl;
220 log_file.close();
221 command.removeUnusedFiles();
|
222 kumpf 1.6 return Command::RC_ERROR;
|
223 j.alex 1.2 }
224 log_file<<StressTestControllerCommand::COMMAND_NAME<<
225 "::Using config file: "<<fileName<<endl;
226 }
227 else
|
228 kumpf 1.6 {
|
229 j.alex 1.2 fileName = filename;
230 }
231
232 log_file<<StressTestControllerCommand::COMMAND_NAME<<
233 "::Using config file: "<<fileName<<endl;
234 cout<<StressTestControllerCommand::COMMAND_NAME<<
235 "::Using config file: "<<fileName<<endl;
236 }
237 else
238 {
239 //
240 // Use default file in default dir.
241 //
|
242 kumpf 1.6 fileName = StressTestControllerCommand::DEFAULT_CFGDIR;
|
243 j.alex 1.2 fileName.append(StressTestControllerCommand::FILENAME);
244 //
245 // Use hard coded default configuration values if default conf. file
246 // was not found.
247 if (!FileSystem::exists(fileName))
248 {
249 //
250 // Use Hard-coded default values
251 //
252 useDefaults = true;
253 }
254 else
255 {
256 log_file << StressTestControllerCommand::COMMAND_NAME <<
257 "::Using default file: " << fileName<<endl;
258 cout << StressTestControllerCommand::COMMAND_NAME <<
259 "::Using default file: " << fileName<<endl;
260 }
261 }
262
263 //
264 j.alex 1.2 // Read the contents of the file
265 //
266 try
267 {
268 //
269 // Use Hard-coded default values
270 //
271 if (useDefaults)
272 {
273 log_file<<StressTestControllerCommand::COMMAND_NAME<<
274 "::Using hard coded default config values."<<endl;
275 cout<<StressTestControllerCommand::COMMAND_NAME<<
276 "::Using hard coded default config values."<<endl;
277 command.getDefaultClients(log_file);
278 }
279 else
280 {
281 log_file << StressTestControllerCommand::COMMAND_NAME <<
282 "::Reading config file: " << fileName<<endl;
283 if (verboseEnabled)
284 {
285 j.alex 1.2 cout<< StressTestControllerCommand::COMMAND_NAME <<
286 "::Reading config file: " << fileName<<endl;
287 }
288 command.getFileContent(fileName,log_file);
289 }
290 }
291 catch (NoSuchFile& e)
292 {
293 String msg(e.getMessage());
294
295 log_file << StressTestControllerCommand::COMMAND_NAME <<
296 ": " << msg << endl;
297 cerr << StressTestControllerCommand::COMMAND_NAME <<
298 ": " << msg << endl;
299 log_file.close();
300 command.removeUnusedFiles();
|
301 kumpf 1.6 return Command::RC_ERROR;
|
302 j.alex 1.2 }
303 catch (Exception& e )
304 {
305 String msg(e.getMessage());
306 log_file << StressTestControllerCommand::COMMAND_NAME <<
307 "::" << msg << endl;
308 cerr << StressTestControllerCommand::COMMAND_NAME <<
309 "::Invalid Configuration ";
310 cerr << "in File: " << fileName << endl;
311 cerr << msg << endl;
312 log_file.close();
313 command.removeUnusedFiles();
|
314 kumpf 1.6 return Command::RC_ERROR;
|
315 j.alex 1.2 }
316 catch (...)
317 {
318 log_file<<StressTestControllerCommand::COMMAND_NAME<<
319 "::Unknown exception caught when acquiring configuration."<<endl;
320 cerr<<StressTestControllerCommand::COMMAND_NAME<<
321 "::Unknown exception caught when acquiring configuration."<<endl;
322 log_file.close();
323 command.removeUnusedFiles();
|
324 kumpf 1.6 return Command::RC_ERROR;
|
325 j.alex 1.2 }
326
327 log_file << StressTestControllerCommand::COMMAND_NAME <<
328 "::Generating Client Commands"<< endl;
329 if(verboseEnabled)
330 {
331 cout << StressTestControllerCommand::COMMAND_NAME <<
332 "::Generating Client Commands"<< endl;
333 }
334
335 //
336 // TimeStamp
337 //
338 log_file<<StressTestControllerCommand::COMMAND_NAME<<
339 "::Initiated on "<<strTime<<endl;
340 log_file<<StressTestControllerCommand::COMMAND_NAME<<
341 "::Process ID: "<<getpid()<<endl;
342 cout<<StressTestControllerCommand::COMMAND_NAME<<
343 "::Initiated on "<<strTime<<endl;
344 cout<<StressTestControllerCommand::COMMAND_NAME<<
345 "::Process ID: "<<getpid()<<endl;
346 j.alex 1.2
347 if(!command.generateClientCommands(log_file))
348 {
349 cerr << StressTestControllerCommand::COMMAND_NAME <<
350 "::Failed to Generate Client Commands."<< endl;
351 log_file << StressTestControllerCommand::COMMAND_NAME <<
352 "::Failed to Generate Client Commands."<< endl;
353 log_file.close();
354 command.removeUnusedFiles();
|
355 kumpf 1.6 return Command::RC_ERROR;
|
356 j.alex 1.2 }
357
358 //
359 // Getting current time
360 //
361 tmTime = getCurrentActualTime();
362 strftime(strTime,256,"%d/%m/%Y at %H:%M:%S\n",&tmTime);
363 log_file << StressTestControllerCommand::COMMAND_NAME <<endl;
364 log_file << " Preparing to execute Clients on "<<strTime<<endl;
365
366 //
367 // Begin to run stress Tests
368 //
369 rc = command.execute (cout, cerr);
370
371 //
372 // Getting current time after stress Tests are completed
373 //
374 tmTime = getCurrentActualTime();
375
376 strftime(strTime,256,"%d/%m/%Y at %H:%M:%S\n",&tmTime);
377 j.alex 1.2
378 //
379 // Check overall status of tests
380 //
381 if(rc)
382 {
383 log_file << StressTestControllerCommand::COMMAND_NAME;
384 log_file << "::execution interrupted on "<<strTime<<endl;
385 cout << StressTestControllerCommand::COMMAND_NAME;
386 cout << "::execution interrupted on "<<strTime<<endl;
387 } else {
388 log_file << StressTestControllerCommand::COMMAND_NAME;
389 log_file << "::successfully completed on "<<strTime<<endl;
390 cout << StressTestControllerCommand::COMMAND_NAME;
391 cout << "::successfully completed on "<<strTime<<endl;
392 }
393 cout <<"IMPORTANT: ";
394 cout <<"Please check the Controller log file for additional info and the"
395 << endl;
396 cout <<" Client log file for individual errors which may or may "
397 <<"not have "<< endl;
398 j.alex 1.2 cout <<" caused a stress test failure. "<< endl;
399 cout <<" Log Directory:"<<endl;
400 cout <<" "<<
401 FileSystem::extractFilePath(command.getStressTestLogFile())<<endl;
402 cout <<"\n Controller log: "<<
403 FileSystem::extractFileName(command.getStressTestLogFile())<<endl;
404 cout <<" Client log: "<<
405 FileSystem::extractFileName(command.getStressClientLogFile())<<endl;
406 log_file.close();
407 return rc;
408 } /* main */
|