Version: 9.15.0
YACS::ENGINE::SalomeContainerToolsBase Class Referenceabstract

#include <SalomeContainerTools.hxx>

Inheritance diagram for YACS::ENGINE::SalomeContainerToolsBase:

Public Member Functions

virtual ~SalomeContainerToolsBase ()
 
virtual std::string getProperty (const std::string &name) const =0
 
virtual void setProperty (const std::string &name, const std::string &value)=0
 
virtual const std::map< std::string, std::string > & getProperties () const =0
 
virtual std::map< std::string, std::string > getResourceProperties (const std::string &name) const =0
 
virtual void clearProperties ()=0
 
virtual void addToComponentList (const std::string &name)=0
 
virtual void addToResourceList (const std::string &name)=0
 
virtual Engines::ContainerParameters getParameters () const =0
 
virtual void setContainerName (const std::string &name)=0
 
virtual std::string getHostName () const =0
 
virtual std::string getNotNullContainerName (const Container *contPtr, const Task *askingNode, bool &isEmpty) const =0
 
virtual std::string getContainerName () const =0
 
virtual int getNumberOfCoresPerWorker () const =0
 

Static Public Member Functions

static void SetContainerNameOf (Engines::ContainerParameters &params, const std::string &name)
 
static void Start (const std::vector< std::string > &compoNames, SalomeContainerHelper *schelp, SalomeContainerToolsBase &sct, int &shutdownLevel, const Container *cont, const Task *askingNode)
 
static CORBA::Object_ptr LoadComponent (SalomeContainerHelper *launchModeType, Container *cont, Task *askingNode)
 
static CORBA::Object_ptr CreateComponentInstance (Container *cont, Engines::Container_ptr contPtr, const ComponentInstance *inst)
 
static std::string GetPlacementId (const SalomeContainerHelper *launchModeType, const Container *cont, const Task *askingNode)
 
static std::string GetFullPlacementId (const SalomeContainerHelper *launchModeType, const Container *cont, const Task *askingNode)
 

Detailed Description

Definition at line 39 of file SalomeContainerTools.hxx.

Constructor & Destructor Documentation

◆ ~SalomeContainerToolsBase()

virtual YACS::ENGINE::SalomeContainerToolsBase::~SalomeContainerToolsBase ( )
inlinevirtual

Definition at line 42 of file SalomeContainerTools.hxx.

42 { }

Member Function Documentation

◆ addToComponentList()

virtual void YACS::ENGINE::SalomeContainerToolsBase::addToComponentList ( const std::string &  name)
pure virtual

◆ addToResourceList()

virtual void YACS::ENGINE::SalomeContainerToolsBase::addToResourceList ( const std::string &  name)
pure virtual

◆ clearProperties()

virtual void YACS::ENGINE::SalomeContainerToolsBase::clearProperties ( )
pure virtual

◆ CreateComponentInstance()

CORBA::Object_ptr SalomeContainerToolsBase::CreateComponentInstance ( Container cont,
Engines::Container_ptr  contPtr,
const ComponentInstance inst 
)
static

Definition at line 475 of file SalomeContainerTools.cxx.

476 {
477  if(!inst)
478  throw Exception("SalomeContainerToolsBase::CreateComponentInstance : no instance of component in the task requesting for a load of its component !");
479  char *reason(0);
480  std::string compoName(inst->getCompoName());
481  CORBA::Object_ptr objComponent=CORBA::Object::_nil();
482  Proc* p(cont->getProc());
483  // prepare component instance properties
484  Engines::FieldsDict_var env(new Engines::FieldsDict);
485  std::map<std::string, std::string> properties(inst->getProperties());
486  if(p)
487  {
488  std::map<std::string,std::string> procMap=p->getProperties();
489  properties.insert(procMap.begin(),procMap.end());
490  }
491 
492  std::map<std::string, std::string>::const_iterator itm;
493  env->length(properties.size());
494  int item=0;
495  for(itm = properties.begin(); itm != properties.end(); ++itm, item++)
496  {
497  DEBUG_YACSTRACE("envname="<<itm->first<<" envvalue="<< itm->second);
498  env[item].key= CORBA::string_dup(itm->first.c_str());
499  env[item].value <<= itm->second.c_str();
500  }
501 
502  objComponent=contPtr->create_component_instance_env(compoName.c_str(), env, reason);
503  if(CORBA::is_nil(objComponent))
504  {
505  std::string text="Error while trying to create a new component: component '"+ compoName;
506  text=text+"' is not installed or it's a wrong name";
507  text += '\n';
508  text += reason;
509  CORBA::string_free(reason);
510  throw Exception(text);
511  }
512  return objComponent;
513 }
#define DEBUG_YACSTRACE(msg)
Definition: YacsTrace.hxx:53
const std::string & getCompoName() const
std::map< std::string, std::string > getProperties()
Definition: Node.cxx:509
Base class for all schema objects.
Definition: Proc.hxx:44
std::map< std::string, std::string > getProperties() const
Proc * p
Definition: driver.cxx:216

References DEBUG_YACSTRACE, YACS::ENGINE::ComponentInstance::getCompoName(), YACS::ENGINE::Container::getProc(), YACS::ENGINE::Node::getProperties(), YACS::ENGINE::PropertyInterface::getProperties(), and p.

Referenced by LoadComponent(), and YACS::ENGINE::SalomeContainerTmpForHP::loadComponent().

◆ getContainerName()

virtual std::string YACS::ENGINE::SalomeContainerToolsBase::getContainerName ( ) const
pure virtual

◆ GetFullPlacementId()

std::string SalomeContainerToolsBase::GetFullPlacementId ( const SalomeContainerHelper launchModeType,
const Container cont,
const Task askingNode 
)
static

Definition at line 535 of file SalomeContainerTools.cxx.

536 {
537  if(cont->isAlreadyStarted(askingNode))
538  {
539  Engines::Container_var container(launchModeType->getContainer(askingNode));
540  try
541  {
542  CORBA::String_var corbaStr(container->name());
543  std::string ret(corbaStr);
544  return ret;
545  }
546  catch(...)
547  {
548  return "Unknown_placement";
549  }
550  }
551  else
552  return "Not_placed_yet";
553 }
virtual bool isAlreadyStarted(const Task *askingNode) const =0
virtual Engines::Container_var getContainer(const Task *askingNode) const =0

References YACS::ENGINE::SalomeContainerHelper::getContainer(), and YACS::ENGINE::Container::isAlreadyStarted().

Referenced by YACS::ENGINE::SalomeContainer::getFullPlacementId(), and YACS::ENGINE::SalomeHPContainer::getFullPlacementId().

◆ getHostName()

virtual std::string YACS::ENGINE::SalomeContainerToolsBase::getHostName ( ) const
pure virtual

◆ getNotNullContainerName()

virtual std::string YACS::ENGINE::SalomeContainerToolsBase::getNotNullContainerName ( const Container contPtr,
const Task askingNode,
bool &  isEmpty 
) const
pure virtual

◆ getNumberOfCoresPerWorker()

virtual int YACS::ENGINE::SalomeContainerToolsBase::getNumberOfCoresPerWorker ( ) const
pure virtual

◆ getParameters()

virtual Engines::ContainerParameters YACS::ENGINE::SalomeContainerToolsBase::getParameters ( ) const
pure virtual

◆ GetPlacementId()

std::string SalomeContainerToolsBase::GetPlacementId ( const SalomeContainerHelper launchModeType,
const Container cont,
const Task askingNode 
)
static

Definition at line 515 of file SalomeContainerTools.cxx.

516 {
517  if(cont->isAlreadyStarted(askingNode))
518  {
519  Engines::Container_var container(launchModeType->getContainer(askingNode));
520  const char *what="/";
521  CORBA::String_var corbaStr(container->name());
522  std::string ret(corbaStr);
523 
524  //Salome FOREVER ...
525  std::string::size_type i=ret.find_first_of(what,0);
526  i=ret.find_first_of(what, i==std::string::npos ? i:i+1);
527  if(i!=std::string::npos)
528  return ret.substr(i+1);
529  return ret;
530  }
531  else
532  return "Not placed yet !!!";
533 }

References YACS::ENGINE::SalomeContainerHelper::getContainer(), yacsorb.CORBAEngineTest::i, and YACS::ENGINE::Container::isAlreadyStarted().

Referenced by YACS::ENGINE::SalomeContainer::getPlacementId(), and YACS::ENGINE::SalomeHPContainer::getPlacementId().

◆ getProperties()

virtual const std::map<std::string,std::string>& YACS::ENGINE::SalomeContainerToolsBase::getProperties ( ) const
pure virtual

◆ getProperty()

virtual std::string YACS::ENGINE::SalomeContainerToolsBase::getProperty ( const std::string &  name) const
pure virtual

◆ getResourceProperties()

virtual std::map<std::string,std::string> YACS::ENGINE::SalomeContainerToolsBase::getResourceProperties ( const std::string &  name) const
pure virtual

◆ LoadComponent()

CORBA::Object_ptr SalomeContainerToolsBase::LoadComponent ( SalomeContainerHelper launchModeType,
Container cont,
Task askingNode 
)
static

Definition at line 450 of file SalomeContainerTools.cxx.

451 {
452  DEBUG_YACSTRACE("SalomeContainer::loadComponent ");
453  const ComponentInstance *inst(askingNode?askingNode->getComponent():0);
454  {
455  YACS::BASES::AutoLocker<Container> alck(cont);//To be sure
456  if(!cont->isAlreadyStarted(askingNode))
457  cont->start(askingNode);
458  }
459  if(!inst)
460  throw Exception("SalomeContainerToolsBase::LoadComponent : no instance of component in the task requesting for a load of its component !");
461  CORBA::Object_ptr objComponent=CORBA::Object::_nil();
462  {
463  YACS::BASES::AutoLocker<Container> alck(cont);//To be sure
464  std::string compoName(inst->getCompoName());
465  Engines::Container_var container(launchModeType->getContainer(askingNode));
466 
467  char *reason;
468  bool isLoadable(container->load_component_Library(compoName.c_str(), reason));
469  if(isLoadable)
470  objComponent=CreateComponentInstance(cont,container,inst);
471  }
472  return objComponent;
473 }
Base class for all component instances.
virtual void start(const Task *askingNode)=0
static CORBA::Object_ptr CreateComponentInstance(Container *cont, Engines::Container_ptr contPtr, const ComponentInstance *inst)
virtual ComponentInstance * getComponent()=0

References CreateComponentInstance(), DEBUG_YACSTRACE, YACS::ENGINE::ComponentInstance::getCompoName(), YACS::ENGINE::Task::getComponent(), YACS::ENGINE::SalomeContainerHelper::getContainer(), YACS::ENGINE::Container::isAlreadyStarted(), and YACS::ENGINE::Container::start().

Referenced by YACS::ENGINE::SalomeContainer::loadComponent().

◆ setContainerName()

virtual void YACS::ENGINE::SalomeContainerToolsBase::setContainerName ( const std::string &  name)
pure virtual

◆ SetContainerNameOf()

void SalomeContainerToolsBase::SetContainerNameOf ( Engines::ContainerParameters &  params,
const std::string &  name 
)
static

Definition at line 272 of file SalomeContainerTools.cxx.

273 {
274  params.container_name=CORBA::string_dup(name.c_str());
275 }

Referenced by YACS::ENGINE::SalomeContainerTools::setContainerName(), and Start().

◆ setProperty()

virtual void YACS::ENGINE::SalomeContainerToolsBase::setProperty ( const std::string &  name,
const std::string &  value 
)
pure virtual

◆ Start()

void SalomeContainerToolsBase::Start ( const std::vector< std::string > &  compoNames,
SalomeContainerHelper schelp,
SalomeContainerToolsBase sct,
int &  shutdownLevel,
const Container cont,
const Task askingNode 
)
static
Parameters
[in]compoNames
[in,out]shutdownLevel

Definition at line 321 of file SalomeContainerTools.cxx.

322 {
323  CORBA::ORB_ptr orb(getSALOMERuntime()->getOrb());
325  try
326  {
327  ns.init_orb(orb);
328  }
329  catch(SALOME_Exception& e)
330  {
331  throw Exception("SalomeContainer::start : Unable to contact the SALOME Naming Service");
332  }
333  CORBA::Object_var obj(ns.Resolve(SALOME_ContainerManager::_ContainerManagerNameInNS));
334  Engines::ContainerManager_var contManager(Engines::ContainerManager::_narrow(obj));
335 
336  bool isEmptyName;
337  std::string str(sct.getNotNullContainerName(cont,askingNode,isEmptyName));
338  DEBUG_YACSTRACE("SalomeContainer::start " << str <<";"<< sct.getHostName() );
339 
340  // Finalize parameters with components found in the container
341 
342  for(std::vector<std::string>::const_iterator iter=compoNames.begin();iter!=compoNames.end();iter++)
343  sct.addToComponentList(*iter);
344 
345  Engines::ContainerParameters myparams(sct.getParameters());
346  {
347  std::string dftLauchMode(schelp->getDftLaunchMode());
348  myparams.mode=CORBA::string_dup(dftLauchMode.c_str());
349  }
350 
351  //If a container_name is given try to find an already existing container in naming service
352  //If not found start a new container with the given parameters
353  if (dynamic_cast<SalomeContainerMonoHelper *>(schelp) && !isEmptyName)
354  {
355  myparams.mode=CORBA::string_dup("getorstart");
356  }
357 
358  if (isEmptyName)
359  {
360  shutdownLevel=1;
361  }
362  //sct.setContainerName(str);
363  SetContainerNameOf(myparams,str);
364  Engines::Container_var trueCont(Engines::Container::_nil());
365  if(!isEmptyName && shutdownLevel==999)
366  {
367  //Make this only the first time start is called (_shutdownLevel==999)
368  //If the container is named, first try to get an existing container
369  //If there is an existing container use it and set the shutdown level to 3
370  //If there is no existing container, try to launch a new one and set the shutdown level to 2
371  myparams.mode="get";
372  try
373  {
374  DEBUG_YACSTRACE("GiveContainer " << str << " mode " << myparams.mode);
375  trueCont=contManager->GiveContainer(myparams);
376  }
377  catch( const SALOME::SALOME_Exception& ex )
378  {
379  std::string msg="SalomeContainer::start : no existing container : ";
380  msg += '\n';
381  msg += ex.details.text.in();
382  DEBUG_YACSTRACE( msg );
383  }
384  catch(...)
385  {
386  }
387 
388  if(!CORBA::is_nil(trueCont))
389  {
390  shutdownLevel=3;
391  DEBUG_YACSTRACE( "container found: " << str << " " << shutdownLevel );
392  }
393  else
394  {
395  shutdownLevel=2;
396  myparams.mode="start";
397  DEBUG_YACSTRACE( "container not found: " << str << " " << shutdownLevel);
398  }
399  }
400 
401  int nbTries=0;
402  while(CORBA::is_nil(trueCont))
403  {
404  try
405  {
406  // --- GiveContainer is used in batch mode to retreive launched containers,
407  // and is equivalent to StartContainer when not in batch.
408  DEBUG_YACSTRACE("GiveContainer " << str << " mode " << myparams.mode);
409  trueCont=contManager->GiveContainer(myparams);
410  }
411  catch( const SALOME::SALOME_Exception& ex )
412  {
413  std::string msg="SalomeContainer::start : Unable to launch container in Salome : ";
414  msg += '\n';
415  msg += ex.details.text.in();
416  throw Exception(msg);
417  }
418  catch(CORBA::COMM_FAILURE&)
419  {
420  //std::cerr << "SalomeContainer::start : CORBA Comm failure detected. Make another try!" << std::endl;
421  DEBUG_YACSTRACE("SalomeContainer::start :" << str << " :CORBA Comm failure detected. Make another try!");
422  nbTries++;
423  if(nbTries > 5)
424  {
425  std::ostringstream oss; oss << "SalomeContainer::start : Unable to launch container " << myparams.container_name << " in Salome : CORBA Comm failure detected";
426  throw Exception( oss.str() );
427  }
428  }
429  catch(CORBA::Exception&)
430  {
431  std::ostringstream oss; oss << "SalomeContainer::start : Unable to launch container " << myparams.container_name << " in Salome : Unexpected CORBA failure detected";
432  throw Exception( oss.str() );
433  }
434  }
435 
436  if(CORBA::is_nil(trueCont))
437  {
438  std::ostringstream oss; oss << "SalomeContainer::start : Unable to launch container " << myparams.container_name << " in Salome. Check your CatalogResources.xml file";
439  throw Exception( oss.str() );
440  }
441 
442  // TODO : thread safety!
443  schelp->setContainer(askingNode,trueCont);
444 
445  CORBA::String_var containerName(trueCont->name()),hostName(trueCont->getHostName());
446  //std::cerr << "SalomeContainer launched : " << containerName << " " << hostName << " " << trueCont->getPID() << std::endl;
447  DEBUG_YACSTRACE("SalomeContainer launched : NS entry : " << containerName << " PID : " << trueCont->getPID() );
448 }
void init_orb(CORBA::ORB_ptr orb=0) override
CORBA::Object_ptr Resolve(const char *Path) override
virtual std::string getDftLaunchMode() const =0
virtual void setContainer(const Task *askingNode, Engines::Container_var cont)=0
virtual Engines::ContainerParameters getParameters() const =0
virtual std::string getHostName() const =0
virtual void addToComponentList(const std::string &name)=0
virtual std::string getNotNullContainerName(const Container *contPtr, const Task *askingNode, bool &isEmpty) const =0
static void SetContainerNameOf(Engines::ContainerParameters &params, const std::string &name)
YACSRUNTIMESALOME_EXPORT RuntimeSALOME * getSALOMERuntime()
CORBA::ORB_ptr orb
Definition: yacsSrv.cxx:39

References addToComponentList(), DEBUG_YACSTRACE, testCppPluginInvokation::ex, YACS::ENGINE::SalomeContainerHelper::getDftLaunchMode(), getHostName(), getNotNullContainerName(), getParameters(), YACS::ENGINE::getSALOMERuntime(), SALOME_NamingService_Wrapper::init_orb(), orb, SALOME_NamingService_Wrapper::Resolve(), YACS::ENGINE::SalomeContainerHelper::setContainer(), and SetContainerNameOf().

Referenced by YACS::ENGINE::SalomeHPContainer::start(), and YACS::ENGINE::SalomeContainer::start().


The documentation for this class was generated from the following files: