]> git.uio.no Git - u/mrichter/AliRoot.git/blame - MONITOR/alistoragemanager/AliStorageAdministratorPanel.cxx
Merge remote-tracking branch 'origin/flatdev' into mergeFlat2Master
[u/mrichter/AliRoot.git] / MONITOR / alistoragemanager / AliStorageAdministratorPanel.cxx
CommitLineData
5eb34a26 1#include "AliStorageAdministratorPanel.h"
2#include "AliStorageAdministratorPanelMarkEvent.h"
3#include "AliStorageAdministratorPanelListEvents.h"
4#include "AliStorageAdministratorPanelSetStorageParams.h"
5#include "AliESDEvent.h"
6
5eb34a26 7#include <fstream>
164d3d29 8#include <iostream>
5eb34a26 9
10#include <TGMenu.h>
11
12using namespace std;
5eb34a26 13
14ClassImp(AliStorageAdministratorPanel);
15
16#define WINDOWS_WIDTH 500
17#define WINDOWS_HEIGHT 350
18
19enum TOOLBUTTON{
20 TOOLBUTTON_START=1,
21 TOOLBUTTON_STOP,
22 TOOLBUTTON_PREFERENCES,
23 TOOLBUTTON_EXIT
24};
25
26enum MENUBAR{
27 MENUBAR_CLIENT_SET_PARAMS=1,
28 MENUBAR_SERVER_LIST_EVENTS,
29 MENUBAR_SERVER_MARK_EVENT,
30 MENUBAR_SERVER_GET_EVENT,
31 MENUBAR_SERVER_GET_NEXT_EVENT,
32 MENUBAR_SERVER_GET_LAST_EVENT
33};
34
35enum FRAME{
36 CLIENT_FRAME=1,
37 SERVER_FRAME
38};
39
40AliStorageAdministratorPanel::AliStorageAdministratorPanel() :
41 TGMainFrame(gClient->GetRoot(), 400, 400),
42 fPanelQuited(false),
43 fConnectionLabel(0),
44 fDataLabel(0),
45 fSavingLabel(0),
46 fCurrentSizeLabel(0),
47 fMaxSizeLabel(0),
48 fMaxOccupationLabel(0),
49 fRemoveEventsLabel(0),
50 fEventsInChunkLabel(0),
51 fMaxStorageSize(0),
52 fMaxOccupation(0),
53 fRemoveEvents(0),
54 fEventsInChunk(0),
55 fCommunicationThread(0),
164d3d29 56 fCommunicationSocket(CLIENT_COMMUNICATION_REQ),
57 fServerSocket(SERVER_COMMUNICATION_REQ),
5eb34a26 58 fEventManager(0)
59{
60 InitWindow();
5eb34a26 61
62 //create event manager
164d3d29 63 fEventManager = AliStorageEventManager::GetEventManagerInstance();
64 fEventManager->CreateSocket(fServerSocket);
65 fEventManager->CreateSocket(fCommunicationSocket);
5eb34a26 66
164d3d29 67 // start communication with client thread
5eb34a26 68 fCommunicationThread = new TThread("fCommunicationThread",
164d3d29 69 Dispatch,(void*)this);
5eb34a26 70 fCommunicationThread->Run();
5eb34a26 71}
72
73AliStorageAdministratorPanel::~AliStorageAdministratorPanel()
74{
75 cout<<"ADMIN -- AliStorageAdministratorPanel descructor called";
76 cout<<" --- OK"<<endl;
77}
78
164d3d29 79void AliStorageAdministratorPanel::CheckStateHandle()//ask client about its state
5eb34a26 80{
164d3d29 81 while(!fPanelQuited)
5eb34a26 82 {
164d3d29 83 CheckClientState(REQUEST_CONNECTION);
5eb34a26 84 sleep(1);
164d3d29 85 CheckClientState(REQUEST_RECEIVING);
5eb34a26 86 sleep(1);
164d3d29 87 CheckClientState(REQUEST_SAVING);
5eb34a26 88 sleep(1);
164d3d29 89 CheckClientState(REQUEST_CURRENT_SIZE);
5eb34a26 90 sleep(1);
164d3d29 91 CheckClientState(REQUEST_GET_PARAMS);
5eb34a26 92 sleep(1);
93 }
5eb34a26 94}
95
96void AliStorageAdministratorPanel::CheckClientState(int option)
97{
5eb34a26 98 struct clientRequestStruct *request = new struct clientRequestStruct;
99 request->messageType = option;
164d3d29 100 if(!fEventManager->Send(request,fCommunicationSocket,10000))
5eb34a26 101 {
102 SetLabel(fConnectionLabel,STATUS_DOWN);
103 SetLabel(fDataLabel,STATUS_DOWN);
104 SetLabel(fSavingLabel,STATUS_DOWN);
105 cout<<"ADMIN -- CLIENT IS DOWN"<<endl;
164d3d29 106 return;
5eb34a26 107 }
108
5eb34a26 109 long response = -1;
5eb34a26 110 struct clientRequestStruct *responseParams = NULL;
164d3d29 111
5eb34a26 112 if(option == REQUEST_GET_PARAMS)
113 {
164d3d29 114 responseParams = fEventManager->GetClientStruct(fCommunicationSocket);
5eb34a26 115 }
116 else
117 {
164d3d29 118 response = fEventManager->GetLong(fCommunicationSocket);
5eb34a26 119 }
120 switch(option)
121 {
122 case REQUEST_CONNECTION:
123 SetLabel(fConnectionLabel,response);
124 break;
125 case REQUEST_RECEIVING:
126 SetLabel(fDataLabel,response);
127 break;
128 case REQUEST_SAVING:
129 SetLabel(fSavingLabel,response);
130 break;
131 case REQUEST_CURRENT_SIZE:
132 SetLabelValue(fCurrentSizeLabel,response,1);
133 break;
134 case REQUEST_GET_PARAMS:
135 fMaxStorageSize = responseParams->maxStorageSize;
136 fMaxOccupation = responseParams->maxOccupation;
137 fRemoveEvents = responseParams->removeEvents;
138 fEventsInChunk = responseParams->eventsInChunk;
139
140 SetLabelValue(fMaxSizeLabel,fMaxStorageSize,1);
141 SetLabelValue(fMaxOccupationLabel,fMaxOccupation,2);
142 SetLabelValue(fRemoveEventsLabel,fRemoveEvents,2);
143 SetLabelValue(fEventsInChunkLabel,fEventsInChunk,3);
144 break;
145 default:break;
146 }
a410aca4 147 if(request){delete request;}
5eb34a26 148}
149
150void AliStorageAdministratorPanel::InitWindow()
151{
152 SetCleanup(kDeepCleanup);
153 // add main manubar on top of the window
154 SetupFixedMenuBar();
155 AddFrame(new TGHorizontal3DLine(this),
156 new TGLayoutHints(kLHintsNormal | kLHintsExpandX));
157 // add toolbar with pictured buttons
158 /*SetupToolbar();
159 AddFrame(new TGHorizontal3DLine(this),
160 new TGLayoutHints(kLHintsNormal | kLHintsExpandX));
161 // add dockable toolbar
162 SetupDockableMenuBar();
163 AddFrame(new TGHorizontal3DLine(this),
164 new TGLayoutHints(kLHintsNormal | kLHintsExpandX));
165 */
166
167 // add frame with two segments for client and server
168 SetupThreadsFrame();
169 SetWindowName("ALICE Storage Manager");
170 MapSubwindows();
171 Resize(WINDOWS_WIDTH,WINDOWS_HEIGHT);
172 MapWindow();
173}
174
175void AliStorageAdministratorPanel::SetupThreadsFrame()
176{
177 // create frame for both client and server
178 TGHorizontalFrame *threadsFrame = new TGHorizontalFrame(this);
179
180 //create client frame and add components to it
181 TGCompositeFrame *clientThreadFrame = new TGCompositeFrame(threadsFrame,CLIENT_FRAME);
182 fConnectionLabel = new TGLabel(clientThreadFrame,"======Waiting======");
183 fDataLabel = new TGLabel(clientThreadFrame,"======Waiting======");
184 fSavingLabel = new TGLabel(clientThreadFrame,"======Waiting======");
185 fCurrentSizeLabel = new TGLabel(clientThreadFrame,"=========Waiting=========");
186 fMaxSizeLabel = new TGLabel(clientThreadFrame,"==========Waiting=========");
187 fMaxOccupationLabel = new TGLabel(clientThreadFrame,"==========Waiting=========");
188 fRemoveEventsLabel = new TGLabel(clientThreadFrame,"==========Waiting=========");
189 fEventsInChunkLabel = new TGLabel(clientThreadFrame,"==========Waiting=========");
190
191 clientThreadFrame->AddFrame(new TGLabel(clientThreadFrame,
192 "ALICE Storage Client"),
193 new TGLayoutHints(kLHintsCenterX));
194
195 //connection label
196 clientThreadFrame->AddFrame(new TGLabel(clientThreadFrame,
197 "Connection:"),
198 new TGLayoutHints(kLHintsCenterX));
199 clientThreadFrame->AddFrame(fConnectionLabel,
200 new TGLayoutHints(kLHintsCenterX));
201
202 //data receiving label
203 clientThreadFrame->AddFrame(new TGLabel(clientThreadFrame,
204 "Receiving data:"),
205 new TGLayoutHints(kLHintsCenterX));
206 clientThreadFrame->AddFrame(fDataLabel,
207 new TGLayoutHints(kLHintsCenterX));
208
209 //saving label
210 clientThreadFrame->AddFrame(new TGLabel(clientThreadFrame,
211 "Saving:"),
212 new TGLayoutHints(kLHintsCenterX));
213 clientThreadFrame->AddFrame(fSavingLabel,
214 new TGLayoutHints(kLHintsCenterX));
215
216 //current size label
217 clientThreadFrame->AddFrame(new TGLabel(clientThreadFrame,
218 "Current storage size:"),
219 new TGLayoutHints(kLHintsCenterX));
220 clientThreadFrame->AddFrame(fCurrentSizeLabel,
221 new TGLayoutHints(kLHintsCenterX));
222
223 //max size label
224 clientThreadFrame->AddFrame(new TGLabel(clientThreadFrame,
225 "Max storage size:"),
226 new TGLayoutHints(kLHintsCenterX));
227 clientThreadFrame->AddFrame(fMaxSizeLabel,
228 new TGLayoutHints(kLHintsCenterX));
229
230 //max occupation label
231 clientThreadFrame->AddFrame(new TGLabel(clientThreadFrame,
232 "Max occupation percent:"),
233 new TGLayoutHints(kLHintsCenterX));
234 clientThreadFrame->AddFrame(fMaxOccupationLabel,
235 new TGLayoutHints(kLHintsCenterX));
236
237 //remove events label
238 clientThreadFrame->AddFrame(new TGLabel(clientThreadFrame,
239 "Remove events percentage:"),
240 new TGLayoutHints(kLHintsCenterX));
241 clientThreadFrame->AddFrame(fRemoveEventsLabel,
242 new TGLayoutHints(kLHintsCenterX));
243
244 //events in chunk label
245 clientThreadFrame->AddFrame(new TGLabel(clientThreadFrame,
246 "Number of events in chunk:"),
247 new TGLayoutHints(kLHintsCenterX));
248 clientThreadFrame->AddFrame(fEventsInChunkLabel,
249 new TGLayoutHints(kLHintsCenterX));
250
251 //create server frame and add components to it
252 TGCompositeFrame *serverThreadFrame = new TGCompositeFrame(threadsFrame,SERVER_FRAME);
253 serverThreadFrame->AddFrame(new TGLabel(serverThreadFrame,
254 "ALICE Storage Server"),
255 new TGLayoutHints(kLHintsCenterX));
256
257 //add client and server frames to threads frame
258 threadsFrame->AddFrame(clientThreadFrame,
259 new TGLayoutHints(kLHintsLeft | kLHintsExpandX));
260 threadsFrame->AddFrame(new TGVertical3DLine(threadsFrame),
261 new TGLayoutHints(kLHintsNormal | kLHintsExpandY));
262 threadsFrame->AddFrame(serverThreadFrame,
263 new TGLayoutHints(kLHintsRight | kLHintsExpandX));
264
265 //add threads frame to main window
266 AddFrame(threadsFrame,new TGLayoutHints(kLHintsExpandX | kLHintsExpandY));
267}
268
269void AliStorageAdministratorPanel::SetupFixedMenuBar()
270{
271 //create popup menu for client
272 TGPopupMenu *clientPopup = new TGPopupMenu(fClient->GetRoot());
273 clientPopup->AddEntry("&Set storage params",MENUBAR_CLIENT_SET_PARAMS);
274 clientPopup->Associate(this);
275
276 //create popup menu for server
277 TGPopupMenu *serverPopup = new TGPopupMenu(fClient->GetRoot());
278 serverPopup->AddEntry("&Get Events List",MENUBAR_SERVER_LIST_EVENTS);
279 serverPopup->AddEntry("&Mark Event",MENUBAR_SERVER_MARK_EVENT);
280 serverPopup->AddEntry("&Get Event (test)",MENUBAR_SERVER_GET_EVENT);
281 serverPopup->AddEntry("&Get Next Event (test)",MENUBAR_SERVER_GET_NEXT_EVENT);
282 serverPopup->AddEntry("&Get Last Event (test)",MENUBAR_SERVER_GET_LAST_EVENT);
283 serverPopup->Associate(this);
284
285 //create menubar
286 TGMenuBar *menuBar = new TGMenuBar(this,1,1,kHorizontalFrame);
287 menuBar->AddPopup("&Client",clientPopup,
288 new TGLayoutHints(kLHintsTop | kLHintsLeft, 0, 4, 0, 0));
289 menuBar->AddPopup("&Server", serverPopup,
290 new TGLayoutHints(kLHintsTop | kLHintsLeft, 0, 4, 0, 0));
291
292 AddFrame(menuBar,new TGLayoutHints(kLHintsTop | kLHintsExpandX));
293}
294
295//handle GUI actions
296Bool_t AliStorageAdministratorPanel::ProcessMessage(Long_t msg, Long_t parm1, Long_t)
297{
298 switch (GET_MSG(msg))
299 {
300
301 case kC_COMMAND:
302 switch (GET_SUBMSG(msg))
303 {
304 case kCM_BUTTON://when button is pressed
305 break;
306 case kCM_MENUSELECT://when mouse is over menu entry
307 break;
308 case kCM_MENU://when menu entry was clicked
309 switch (parm1)
310 {
311 case MENUBAR_CLIENT_SET_PARAMS:onClientSetParams();break;
312 case MENUBAR_SERVER_LIST_EVENTS:onServerListEvents();break;
313 case MENUBAR_SERVER_MARK_EVENT:onServerMarkEvent();break;
314 case MENUBAR_SERVER_GET_EVENT:onServerGetEvent();break;
315 case MENUBAR_SERVER_GET_NEXT_EVENT:onServerGetNextEvent();break;
316 case MENUBAR_SERVER_GET_LAST_EVENT:onServerGetLastEvent();break;
317 default:break;
318 }
319 break;
320 default:break;
321 }
322 break;
323 default:break;
324 }
325
326 return false;
327}
328
329void AliStorageAdministratorPanel::onServerListEvents()
330{
331 AliStorageAdministratorPanelListEvents *listEventsWindow =
332 AliStorageAdministratorPanelListEvents::GetInstance();
164d3d29 333 if(listEventsWindow){cout<<"List events window created"<<endl;}
5eb34a26 334}
335
336void AliStorageAdministratorPanel::onServerMarkEvent()
337{
338 AliStorageAdministratorPanelMarkEvent *markEventWindow =
339 AliStorageAdministratorPanelMarkEvent::GetInstance();
164d3d29 340 if(markEventWindow){cout<<"Mark event window created"<<endl;}
5eb34a26 341}
342
343void AliStorageAdministratorPanel::onClientSetParams()
344{
345 AliStorageAdministratorPanelSetStorageParams *setParamsWindow =
346 AliStorageAdministratorPanelSetStorageParams::GetInstance();
347
348 setParamsWindow->Setup(fCommunicationSocket,
349 fMaxStorageSize/1000000,
350 fMaxOccupation,
351 fRemoveEvents,
352 fEventsInChunk);
353}
354
355void AliStorageAdministratorPanel::onServerGetEvent()
356{
357 //this method is just for tests
358 int runNumber=197669;
359 int eventNumber=168;
360
361 struct serverRequestStruct *requestMessage = new struct serverRequestStruct;
362 struct eventStruct mark;
363 mark.runNumber = runNumber;
364 mark.eventNumber = eventNumber;
365 requestMessage->messageType = REQUEST_GET_EVENT;
366 requestMessage->event = mark;
367
368 fEventManager->Send(requestMessage,fServerSocket);
369 AliESDEvent *resultEvent = fEventManager->GetEvent(fServerSocket);
370
371 if(resultEvent)
372 {
373 cout<<"ADMIN -- received event. Run no:"<<resultEvent->GetRunNumber()<<"\tEvent no in file:"<<resultEvent->GetEventNumberInFile()<<endl;
374 }
375 else
376 {
377 cout<<"ADMIN -- received no event"<<endl;
378 }
379}
380
381
382void AliStorageAdministratorPanel::onServerGetNextEvent()
383{
384 //this method is just for tests
385 int runNumber=197669;
386 int eventNumber=33;
387
388 struct serverRequestStruct *requestMessage = new struct serverRequestStruct;
389 struct eventStruct mark;
390 mark.runNumber = runNumber;
391 mark.eventNumber = eventNumber;
392 requestMessage->messageType = REQUEST_GET_NEXT_EVENT;
393 requestMessage->event = mark;
394
395 fEventManager->Send(requestMessage,fServerSocket);
396 AliESDEvent* resultEvent= fEventManager->GetEvent(fServerSocket);
397 if(resultEvent)
398 {
399 cout<<"ADMIN -- received event. Run no:"<<resultEvent->GetRunNumber()<<"\tEvent no in file:"<<resultEvent->GetEventNumberInFile()<<endl;
400 }
401 else
402 {
403 cout<<"ADMIN -- received no event"<<endl;
404 }
405}
406
407
408void AliStorageAdministratorPanel::onServerGetLastEvent()
409{
410 struct serverRequestStruct *requestMessage = new struct serverRequestStruct;
411 requestMessage->messageType = REQUEST_GET_LAST_EVENT;
412
413 fEventManager->Send(requestMessage,fServerSocket);
414 AliESDEvent* resultEvent= fEventManager->GetEvent(fServerSocket);
415
416 if(resultEvent)
417 {
418 cout<<"ADMIN -- received event. Run no:"<<resultEvent->GetRunNumber()<<"\tEvent no in file:"<<resultEvent->GetEventNumberInFile()<<endl;
419 }
420 else
421 {
422 cout<<"ADMIN -- received no event"<<endl;
423 }
424}
425
426void AliStorageAdministratorPanel::onExit()
427{
428 cout<<"ADMIN -- Quiting ALICE Storage Admin Panel"<<endl;
429 fPanelQuited=true;
430 gSystem->ExitLoop();
431}
432
433void AliStorageAdministratorPanel::CloseWindow(){onExit();}
434
435
436//methods to change labels:
437void AliStorageAdministratorPanel::SetLabel(TGLabel *label, int option)
438{
439 switch(option)
440 {
441 case STATUS_WAITING:
442 label->SetText("Waiting");
443 label->SetTextColor(kBlack);
444 break;
445 case STATUS_OK:
446 label->SetText("OK");
447 label->SetTextColor(kBlack);
448 break;
449 case STATUS_ERROR:
450 label->SetText("ERROR");
451 label->SetTextColor(kBlack);
452 break;
453 case STATUS_DOWN:
454 label->SetText("CLIENT IS DOWN");
455 label->SetTextColor(kRed);
456 break;
457 default:break;
458 }
459 gClient->HandleInput();
460}
461
462void AliStorageAdministratorPanel::SetLabelValue(TGLabel *label, long value,int option)
463{
464 // options:
465 // 1 - MB
466 // 2 - percentage
467 // 3 - number
468
469 switch(option)
470 {
471 case 1:
472 label->SetText(Form("%lu B (%.2f MB)",value,(float)value/(1000.*1000.)));
473 break;
474 case 2:
475 label->SetText(Form("%d %%",(int)value));
476 break;
477 case 3:
478 label->SetText(Form("%d",(int)value));
479 break;
480 default:break;
481 }
482 label->SetTextColor(kBlack);
483 gClient->HandleInput();
484}
485//other methods that can be useful later
486
487/*
488void AliStorageAdministratorPanel::SetupToolbar()
489{
490 TGToolBar* toolBar = new TGToolBar(this);
491 toolBar->AddButton(this,new TGPictureButton(toolBar,
492 Form("%s/MONITOR/icons/start.png",
493 gSystem->Getenv("ALICE_ROOT")),
494 TOOLBUTTON_START ) );
495 toolBar->AddButton(this, new TGPictureButton(toolBar,
496 Form("%s/MONITOR/icons/stop.png",
497 gSystem->Getenv("ALICE_ROOT")),
498 TOOLBUTTON_STOP) );
499
500 AddFrame(toolBar, new TGLayoutHints(kLHintsNormal | kLHintsExpandX));
501}
502
503void AliStorageAdministratorPanel::SetupDockableMenuBar()
504{
505 TGDockableFrame *menuDock = new TGDockableFrame(this);
506 AddFrame(menuDock,new TGLayoutHints(kLHintsExpandX,0,0,1,0));
507 menuDock->SetWindowName("ALICE Storage Dockable MenuBar");
508 menuDock->EnableUndock(kTRUE);
509 menuDock->EnableHide(kTRUE);
510
511 TGPopupMenu *popup1 = new TGPopupMenu(fClient->GetRoot());
512 popup1->AddEntry("&Check client state",MENUBAR_1_OPTION_1);
513 popup1->AddSeparator();
514 popup1->AddEntry("&BBB",MENUBAR_1_OPTION_2);
515 popup1->AddEntry("&CCC",MENUBAR_1_OPTION_3);
516
517 popup1->DisableEntry(MENUBAR_1_OPTION_2);
518 popup1->Associate(this);
519
520
521 TGMenuBar *menuBar = new TGMenuBar(menuDock,1,1,kHorizontalFrame);
522 menuBar->AddPopup("&File",
523 popup1,
524 new TGLayoutHints(kLHintsTop | kLHintsLeft, 0, 4, 0, 0));
525
526 menuDock->AddFrame(menuBar,
527 new TGLayoutHints(kLHintsTop | kLHintsExpandX));
528 }*/