Skip to content
Snippets Groups Projects
Commit a87e2441 authored by Ruud Overeem's avatar Ruud Overeem
Browse files

Bug 1000: Added ClaimManagerTask for communicating with the ClaimManager of PVSS.

This communication is async so we have to create a seperate task to handle the IO.
The test dir contains a program that demonstrates how to use the CMtask.

Not fully implemented and tested yet!.
parent f5a0a42b
No related branches found
No related tags found
No related merge requests found
......@@ -410,6 +410,7 @@ MAC/APL/RTDBCommon/configure.in -text
MAC/APL/RTDBCommon/include/APL/RTDBCommon/Makefile.am -text
MAC/APL/RTDBCommon/include/APL/RTDBCommon/RTDButilities.h -text
MAC/APL/RTDBCommon/include/Makefile.am -text
MAC/APL/RTDBCommon/src/CM_Protocol.prot -text
MAC/APL/RTDBCommon/src/Makefile.am -text
MAC/APL/RTDBCommon/src/RTDButilities.cc -text
MAC/APL/RTDBCommon/test/Makefile.am -text
......
//# CM_Protocol.prot: Protocol definition for the ClaimManager results
//#
//# Copyright (C) 2008
//# ASTRON (Netherlands Foundation for Research in Astronomy)
//# P.O.Box 2, 7990 AA Dwingeloo, The Netherlands, seg@astron.nl
//#
//# This program is free software; you can redistribute it and/or modify
//# it under the terms of the GNU General Public License as published by
//# the Free Software Foundation; either version 2 of the License, or
//# (at your option) any later version.
//#
//# This program is distributed in the hope that it will be useful,
//# but WITHOUT ANY WARRANTY; without even the implied warranty of
//# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
//# GNU General Public License for more details.
//#
//# You should have received a copy of the GNU General Public License
//# along with this program; if not, write to the Free Software
//# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
//#
//# $Id: CM_Protocol.prot 11023 2008-03-18 08:07:14Z overeem $
autogen definitions protocol;
description = "Protocol for the Claim Manager results";
prefix = "CM"; // for the signal names
id = "(LOFAR::MACIO::F_GCF_PROTOCOL + 4)";
// specify extra include files
// include = '<someFile.h>';
prelude = << PRELUDE_END
// The following messages are defined in the servicebroker protocol
//
// CLAIM_RESULT (uint16 seqnr, string servicename);
//
PRELUDE_END;
//
// Define the errors
//
error = {
id = NO;
msg = "No errors";
};
error = {
id = NO_CONNECTION;
msg = "No connection with the ClaimManager in PVSS";
};
error = {
id = UNKNOWN_TYPE;
msg = "ObjectType unknown";
};
//
// An "event" has a "signal" and a "dir" (direction)
// and zero or more "param"s.
// "dir" can be one of "IN" or "OUT".
// A "param" has a "name" and a "type".
//
event = {
signal = CLAIM_RESULT;
dir = IN;
param = {
name = "result";
type = "uint32";
};
param = {
name = "typeName";
type = "string";
};
param = {
name = "nameInAppl";
type = "string";
};
param = {
name = "DPname";
type = "string";
};
param = {
name = "claimDate";
type = "string";
};
};
//# ClaimMgrTask.cc: Task for communicating with the ClaimManager in PVSS.
//#
//# Copyright (C) 2008
//# ASTRON (Netherlands Foundation for Research in Astronomy)
//# P.O.Box 2, 7990 AA Dwingeloo, The Netherlands, seg@astron.nl
//#
//# This program is free software; you can redistribute it and/or modify
//# it under the terms of the GNU General Public License as published by
//# the Free Software Foundation; either version 2 of the License, or
//# (at your option) any later version.
//#
//# This program is distributed in the hope that it will be useful,
//# but WITHOUT ANY WARRANTY; without even the implied warranty of
//# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
//# GNU General Public License for more details.
//#
//# You should have received a copy of the GNU General Public License
//# along with this program; if not, write to the Free Software
//# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
//#
//# $Id$
#include <lofar_config.h>
#include <Common/LofarLogger.h>
#include <Common/SystemUtil.h>
#include <GCF/PVSS/GCF_PVString.h>
#include <GCF/RTDB/DP_Protocol.ph>
#include "CM_Protocol.ph"
#include "ClaimMgrTask.h"
namespace LOFAR {
using namespace GCF::TM;
using namespace GCF::PVSS;
using namespace GCF::RTDB;
namespace APL {
namespace RTDBCommon {
//
// Initialize static elements
CMHandler* CMHandler::itsInstance = 0;
//
// CMHandler()
//
CMHandler::CMHandler()
{
}
// --------------- Construction and destruction -----------
//
// ClaimMgrTask()
//
ClaimMgrTask::ClaimMgrTask() :
GCFTask((State)&ClaimMgrTask::operational, "ClaimManager"),
itsReplyPort (0),
itsTimerPort (new GCFTimerPort(*this, "timerPort")),
itsClaimMgrPS (0),
itsResolveState(RO_UNDEFINED)
{
registerProtocol(DP_PROTOCOL, DP_PROTOCOL_STRINGS);
}
//
// ~ClaimMgrTask()
//
ClaimMgrTask::~ClaimMgrTask()
{
}
// -------------------- static functions --------------------
//
// instance(temp)
//
ClaimMgrTask* ClaimMgrTask::instance(bool temporary)
{
// if there is not taskHandler yet start one up.
if (!CMHandler::itsInstance) {
CMHandler::itsInstance = new CMHandler();
// note: the CMHandler constructor also created an instance of theCMTask.
ASSERT(!CMHandler::itsInstance->mayDeleted());
CMHandler::itsInstance->itsCMTask.start();
}
if (!temporary) {
CMHandler::itsInstance->use();
}
return (&CMHandler::itsInstance->itsCMTask);
}
//
// release()
//
void ClaimMgrTask::release()
{
ASSERT(CMHandler::itsInstance);
ASSERT(!CMHandler::itsInstance->mayDeleted());
// disconnect handler from the GCF engine.
CMHandler::itsInstance->leave();
if (CMHandler::itsInstance->mayDeleted()) {
delete CMHandler::itsInstance;
ASSERT(!CMHandler::itsInstance);
}
}
// -------------------- USER FUNCTIONS --------------------
//
// claimObject(objectype, nameInAppl)
//
void ClaimMgrTask::claimObject(const string& objectType,
const string& nameInAppl,
GCFPortInterface& replyPort) // ???
{
ASSERTSTR(itsClaimMgrPS, "There is no propertyset to access the claimManager");
// save info
itsObjectType = objectType;
itsNameInAppl = nameInAppl;
itsReplyPort = &replyPort;
if (itsResolveState == RO_READY) {
itsTimerPort->setTimer(0.1); // wake up FSM
}
// else: some other time must be ative.
}
// -------------------- INTERNAL FUNCTIONS --------------------
//
// operational(event, port)
//
GCFEvent::TResult ClaimMgrTask::operational(GCFEvent& event, GCFPortInterface& port)
{
LOG_DEBUG_STR ("ClaimMgrTask:" << eventName(event) << "@" << port.getName());
GCFEvent::TResult status = GCFEvent::HANDLED;
switch (event.signal) {
case F_ENTRY:
itsResolveState = RO_UNDEFINED;
break;
case F_INIT: {
LOG_DEBUG("Create propertySet for accessing the ClaimManaher");
itsResolveState = RO_CREATING;
itsClaimMgrPS = new RTDBPropertySet("ClaimManager", "ClaimManager", PSAT_RW, this);
itsTimerPort->setTimer(5.0);
}
break;
case DP_CREATED: {
DPCreatedEvent dpEvent(event);
LOG_DEBUG_STR("Result of creating '" << dpEvent.DPname << "' = " << dpEvent.result);
itsResolveState = RO_CREATED;
itsTimerPort->cancelAllTimers();
itsTimerPort->setTimer(0.5); // give RTDB time to get the original value.
}
break;
// Note: we finish each resolve state with a timer setting so each state always ends here.
// This way we only have to implement 1 statemachine in stead of 7.
case F_TIMER: {
LOG_DEBUG_STR("itsResolveState=" << itsResolveState);
switch (itsResolveState) {
case RO_CREATED:
itsResolveState = RO_READY;
itsTimerPort->setTimer(0.1);
break;
case RO_READY:
if (itsObjectType.empty() || itsNameInAppl.empty()) {
LOG_DEBUG_STR("Nothing to claim");
break;
}
// request a DPname
itsClaimMgrPS->setValue("Request.TypeName",
GCFPVString(itsObjectType), 0.0, false);
itsClaimMgrPS->setValue("Request.NewObjectName",
GCFPVString(itsNameInAppl), 0.0, false);
itsClaimMgrPS->flush();
itsResolveState = RO_ASKED;
// clear result fields
itsFieldsReceived = 0;
itsResultDPname.clear();
itsTimerPort->setTimer(3.0); // don't wait forever.
break;
case RO_ASKED:
LOG_ERROR_STR("No response from ClaimManager in 3 seconds");
// ???
break;
}
}
break;
case DP_CHANGED: {
// NOTE: we are called here for every field!
// CS001:ClaimManager.Request.NewObjectName
// CS001:ClaimManager.Request.TypeName
DPChangedEvent dpEvent(event);
LOG_DEBUG_STR("DP " << dpEvent.DPname << " changed");
if (dpEvent.DPname.find("Response.NewObjectName") != string::npos) {
string fldContents(((GCFPVString*)(dpEvent.value._pValue))->getValue());
ASSERTSTR(fldContents == itsNameInAppl, "CM returned answer for request '"
<< fldContents <<"' iso " << itsNameInAppl);
itsFieldsReceived++;
}
else if (dpEvent.DPname.find("Response.TypeName") != string::npos) {
string fldContents(((GCFPVString*)(dpEvent.value._pValue))->getValue());
ASSERTSTR(fldContents == itsObjectType, "CM returned answer for type '"
<< fldContents <<"' iso " << itsObjectType);
itsFieldsReceived++;
}
else if (dpEvent.DPname.find("Response.DPName") != string::npos) {
itsResultDPname = ((GCFPVString*)(dpEvent.value._pValue))->getValue();
itsFieldsReceived++;
}
if (itsFieldsReceived >= 3) {
LOG_DEBUG_STR("@@@@@ NewObjectName = " << itsResultDPname);
// ... BACK TO USER
itsObjectType.clear();
itsNameInAppl.clear();
itsResultDPname.clear();
itsResolveState = RO_READY;
itsTimerPort->cancelAllTimers();
}
}
break;
default:
LOG_DEBUG_STR ("claimManager: default");
status = GCFEvent::NOT_HANDLED;
break;
}
return (status);
}
} // namespace RTDBCommon
} // namespace APL
} // namespace LOFAR
//# ClaimMgrTask.h: singleton class; bridge between controller application
//# and Property Agent
//#
//# Copyright (C) 2002-2003
//# ASTRON (Netherlands Foundation for Research in Astronomy)
//# P.O.Box 2, 7990 AA Dwingeloo, The Netherlands, seg@astron.nl
//#
//# This program is free software; you can redistribute it and/or modify
//# it under the terms of the GNU General Public License as published by
//# the Free Software Foundation; either version 2 of the License, or
//# (at your option) any later version.
//#
//# This program is distributed in the hope that it will be useful,
//# but WITHOUT ANY WARRANTY; without even the implied warranty of
//# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
//# GNU General Public License for more details.
//#
//# You should have received a copy of the GNU General Public License
//# along with this program; if not, write to the Free Software
//# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
//#
//# $Id$
#ifndef GTM_SERVICEBROKER_H
#define GTM_SERVICEBROKER_H
#include <Common/lofar_map.h>
#include <Common/lofar_list.h>
#include <MACIO/GCF_Event.h>
#include <GCF/TM/GCF_Control.h>
#include <GCF/RTDB/RTDB_PropertySet.h>
namespace LOFAR {
using GCF::TM::GCFTask;
using GCF::TM::GCFTCPPort;
using GCF::TM::GCFPortInterface;
using GCF::TM::GCFHandler;
using GCF::RTDB::RTDBPropertySet;
namespace APL {
namespace RTDBCommon {
/**
*/
class CMHandler;
class ClaimMgrTask : public GCFTask
{
public:
~ClaimMgrTask ();
static ClaimMgrTask* instance(bool temporary = false);
static void release();
// member functions
void claimObject(const string& objectType,
const string& nameInAppl,
GCFPortInterface& replyPort);
private:
enum {
RO_UNDEFINED = 0,
RO_CREATING,
RO_CREATED,
RO_ASKED,
RO_READY
};
friend class CMHandler;
ClaimMgrTask (); // only allowed by CMHandler
// state methods
GCFEvent::TResult operational (GCFEvent& e, GCFPortInterface& p);
// data members
GCFPortInterface* itsReplyPort; // Port to send the result to
GCFTimerPort* itsTimerPort; // for reconnecting to brokers
RTDBPropertySet* itsClaimMgrPS; // for accessing the ClaimManager
string itsObjectType; // Objecttype of object in claim
string itsNameInAppl; // Name user likes to use
uint32 itsResolveState; // Where we are in claiming the object.
// result fields
uint32 itsFieldsReceived;
string itsResultDPname;
};
class CMHandler : public GCFHandler
{
public:
~CMHandler() { itsInstance = 0; }
void workProc() {}
void stop () {}
private:
friend class ClaimMgrTask;
CMHandler();
static CMHandler* itsInstance;
ClaimMgrTask itsCMTask;
};
} // namespace SB
} // namespace GCF
} // namespace LOFAR
#endif
DOCHDRS = RTDButilities.h
BUILT_SOURCES =
AUTOGEN = autogen
SUFFIXES = .ph
%.ph: %.prot
$(AUTOGEN) --writable -L $(datadir)/MACIO $<
cp $*.ph $(top_builddir)/include/APL/RTDBCommon
EXTRA_DIST = $(sysconf_DATA)
%.cc: %.prot
$(AUTOGEN) --writable -L $(datadir)/MACIO $<
clean-local:
rm -f *.ph
bin_PROGRAMS = versionrtdbcommon
INSTHDRS = CM_Protocol.ph ClaimMgrTask.h
NOINSTHDRS =
BUILT_SOURCES = CM_Protocol.cc \
CM_Protocol.ph
pkgincludedir = $(includedir)/APL/RTDBCommon
pkginclude_HEADERS = $(BUILT_SOURCES)
pkginclude_HEADERS = $(NOINSTHDRS) $(INSTHDRS)
DOCHDRS = $(pkginclude_HEADERS) $(BUILT_SOURCES)
EXTRA_DIST = $(sysconf_DATA)
# libraries
lib_LTLIBRARIES = librtdbcommon.la
librtdbcommon_la_SOURCES = Package__Version.cc $(BUILT_SOURCES) \
RTDButilities.cc
bin_PROGRAMS = versionrtdbcommon
librtdbcommon_la_SOURCES = Package__Version.cc \
$(BUILT_SOURCES) \
RTDButilities.cc \
ClaimMgrTask.cc
# version stuff
versionrtdbcommon_SOURCES = versionrtdbcommon.cc
versionrtdbcommon_LDADD = librtdbcommon.la
versionrtdbcommon_DEPENDENCIES = librtdbcommon.la $(LOFAR_DEPEND)
......
......@@ -25,11 +25,13 @@
//# Includes
#include <Common/LofarLogger.h>
#include <GCF/TM/GCF_Control.h>
#include <GCF/RTDB/DPservice.h>
#include <GCF/PVSS/GCF_PVTypes.h>
#include <APL/RTDBCommon/RTDButilities.h>
namespace LOFAR {
using namespace GCF::TM;
using namespace GCF::PVSS;
using namespace GCF::RTDB;
namespace APL {
......@@ -41,13 +43,13 @@ typedef struct RTDBObjState {
} RTDBobjState_t;
RTDBobjState_t objStateTable[] = {
{ 0, "Off" },
{ 10, "Operational" },
{ 20, "Maintenance" },
{ 30, "Test" },
{ 46, "Suspicious" },
{ 56, "Broken" },
{ 60, "Not available" }
{ 0, "'Off'" },
{ 10, "'Operational'" },
{ 20, "'Maintenance'" },
{ 30, "'Test'" },
{ 46, "'Suspicious'" },
{ 56, "'Broken'" },
{ 60, "'Not available'" }
};
// Every softwaremodule or hardwarecomponent has a color on the Navigator screens
......
check_PROGRAMS = tRTDButilities
check_PROGRAMS = tRTDButilities tClaimManager
TESTS =
......@@ -6,6 +6,10 @@ tRTDButilities_SOURCES = $(BUILT_SOURCES) tRTDButilities.cc
tRTDButilities_LDADD = ../src/librtdbcommon.la $(LOFAR_DEPEND)
tRTDButilities_DEPENDENCIES = ../src/librtdbcommon.la $(LOFAR_DEPEND)
tClaimManager_SOURCES = $(BUILT_SOURCES) tClaimManager.cc
tClaimManager_LDADD = ../src/librtdbcommon.la $(LOFAR_DEPEND)
tClaimManager_DEPENDENCIES = ../src/librtdbcommon.la $(LOFAR_DEPEND)
include $(top_srcdir)/Makefile.common
......
//
// tClaimManager.cc: Test program to test the resolve Observation mechanism
//
// Copyright (C) 2008
// ASTRON (Netherlands Foundation for Research in Astronomy)
// P.O.Box 2, 7990 AA Dwingeloo, The Netherlands, seg@astron.nl
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
//
// $Id$
#include <lofar_config.h>
#include <Common/LofarLogger.h>
#include <APL/RTDBCommon/CM_Protocol.ph>
#include <APL/RTDBCommon/ClaimMgrTask.h>
#include "tClaimManager.h"
namespace LOFAR {
using namespace GCF;
using namespace GCF::TM;
namespace APL {
namespace RTDBCommon {
int gTestNr = 0;
MgrTest::MgrTest(const string& name) :
GCFTask((State)&MgrTest::doTest, name),
itsTimerPort(0)
{
LOG_DEBUG_STR("=@=@= MgrTest(" << name << ")");
itsTimerPort = new GCFTimerPort(*this, "timerPort");
ASSERTSTR(itsTimerPort, "=@=@= Can't allocate GCFTimerPort");
registerProtocol(F_FSM_PROTOCOL, F_FSM_PROTOCOL_STRINGS);
registerProtocol(CM_PROTOCOL, CM_PROTOCOL_STRINGS);
}
//
// destructor
//
MgrTest::~MgrTest()
{
LOG_DEBUG("=@=@= Deleting MgrTest");
}
//
// doTest (event, port)
//
GCFEvent::TResult MgrTest::doTest(GCFEvent& event, GCFPortInterface& port)
{
LOG_DEBUG_STR ("=@=@= doTest:" << eventName(event) << "@" << port.getName());
GCFEvent::TResult status = GCFEvent::HANDLED;
switch (event.signal) {
case F_INIT:
LOG_DEBUG_STR("=@=@= Creating a ClaimManager");
itsClaimMgrTask = ClaimMgrTask::instance();
ASSERTSTR(itsClaimMgrTask, "Can't construct a claimMgrTask");
LOG_DEBUG_STR("=@=@= Calling claimManager for 'Observation5'");
itsClaimMgrTask->claimObject("Observation", "LOFAR_ObsSW_Observation5", *itsTimerPort);
itsTimerPort->setTimer(10.0);
break;
case F_ENTRY:
break;
case CM_CLAIM_RESULT: {
CMClaimResultEvent cmEvent(event);
LOG_DEBUG_STR("=@=@= ObjectType: " << cmEvent.typeName);
LOG_DEBUG_STR("=@=@= NameInAppl: " << cmEvent.nameInAppl);
LOG_DEBUG_STR("=@=@= DBaseName : " << cmEvent.DPname);
}
break;
case F_TIMER:
stop();
break;
default:
status = GCFEvent::NOT_HANDLED;
break;
}
return status;
}
} // namepsace RTDBCommon
} // namspace APL
} // namespace LOFAR
using namespace LOFAR;
using namespace LOFAR::GCF;
using namespace LOFAR::APL::RTDBCommon;
int main(int argc, char* argv[])
{
TM::GCFTask::init(argc, argv);
MgrTest test_task("UtilTest");
test_task.start(); // make initial transition
TM::GCFTask::run();
return 0;
}
// tClaimManager.h: Definition of the DPservice task class.
//
// Copyright (C) 2008
// ASTRON (Netherlands Foundation for Research in Astronomy)
// P.O.Box 2, 7990 AA Dwingeloo, The Netherlands, seg@astron.nl
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
//
// $Id$
//
#ifndef _RTDBCOMMON_TCLAIMMANAGER_H
#define _RTDBCOMMON_TCLAIMMANAGER_H
#include <GCF/TM/GCF_Control.h>
namespace LOFAR {
namespace APL {
namespace RTDBCommon {
class MgrTest : public GCFTask
{
public:
MgrTest (const string& name);
virtual ~MgrTest();
GCFEvent::TResult doTest (GCFEvent& e, GCFPortInterface& p);
private:
GCFTimerPort* itsTimerPort;
ClaimMgrTask* itsClaimMgrTask;
};
} // namespace RTDBCommon
} // namespace APL
} // namespace LOFAR
#endif
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment