summaryrefslogtreecommitdiff
path: root/Planner_Manager/Component/Planner_Manager_exec.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Planner_Manager/Component/Planner_Manager_exec.cpp')
-rw-r--r--Planner_Manager/Component/Planner_Manager_exec.cpp611
1 files changed, 611 insertions, 0 deletions
diff --git a/Planner_Manager/Component/Planner_Manager_exec.cpp b/Planner_Manager/Component/Planner_Manager_exec.cpp
new file mode 100644
index 00000000000..e4f18e77b39
--- /dev/null
+++ b/Planner_Manager/Component/Planner_Manager_exec.cpp
@@ -0,0 +1,611 @@
+// $Id$
+//
+// **** Code generated by the ****
+// **** Component Integrated ACE ORB (CIAO) CIDL Compiler ****
+// CIAO has been developed by:
+// Center for Distributed Object Computing
+// Washington University
+// St. Louis, MO
+// USA
+// http://www.cs.wustl.edu/~schmidt/doc-center.html
+// CIDL Compiler has been developed by:
+// Institute for Software Integrated Systems
+// Vanderbilt University
+// Nashville, TN
+// USA
+// http://www.isis.vanderbilt.edu/
+//
+// Information about CIAO is available at:
+// http://www.dre.vanderbilt.edu/CIAO
+
+#include "Planner_Manager_exec.h"
+#include "ciao/CIAO_common.h"
+#include "common/RACE_Log_Msg.h"
+
+#define cpu_resource_prop_name "LoadAverage"
+
+namespace CIAO
+{
+ namespace RACE
+ {
+ namespace CIDL_Planner_Manager_Impl
+ {
+ //==================================================================
+ // Facet Executor Implementation Class: Planner_Manager_I_exec_i
+ //==================================================================
+
+ Planner_Manager_I_exec_i::Planner_Manager_I_exec_i (Planner_Manager_exec_i &comp)
+ : comp_ (comp)
+ {
+ }
+
+ Planner_Manager_I_exec_i::~Planner_Manager_I_exec_i (void)
+ {
+ }
+
+
+ // emit log messages for all components being deployed...
+ void
+ LogComponentDeploy( const ::CIAO::RACE::Plan_Actions& plan_seq )
+ {
+
+ for ( CORBA::ULong k=0; k<plan_seq.length(); k++ )
+ {
+ const ::Deployment::DeploymentPlan& plan = plan_seq[k].plan;
+
+ for ( CORBA::ULong i=0; i < plan.instance.length(); ++i )
+ {
+ // Get the monolithic implementation that corresponds to
+ // this instance....
+ CORBA::ULong pos = plan.instance[i].implementationRef;
+ const ::Deployment::MonolithicDeploymentDescription &mono =
+ plan.implementation[pos];
+
+ for ( CORBA::ULong j=0; j < mono.execParameter.length(); ++j )
+ {
+ if (ACE_OS::strcmp (mono.execParameter[j].name.in (),
+ cpu_resource_prop_name) == 0)
+ {
+ CORBA::Long value;
+ mono.execParameter[j].value >>= value;
+
+ RACE_DEPLOYMENT_STATUS(
+ plan_seq[k].command, Log::EventMark::COMPONENT_DEPLOY,
+ plan.UUID.in(), 0,
+ Log::Status::SUCCESS,
+ plan.instance[i].name.in(),
+ value,
+ plan.instance[i].node.in()
+ );
+
+ break;
+ }
+ }
+ }
+ }
+ return;
+ }
+
+ // Operations from ::CIAO::RACE::Planner_Manager_I
+
+ void
+ Planner_Manager_I_exec_i::execute_planners
+ (const ::CIAO::RACE::Plan_Actions & plan_seq,
+ const ::CIAO::RACE::PlannerFlow & flow
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+ {
+ RACE_DEPLOYMENT_STATUS(
+ plan_seq[0].command, Log::EventMark::BEGIN_PLAN,
+ plan_seq[0].plan.UUID.in (), 0,
+ Log::Status::SUCCESS,
+ Log::find_importance( plan_seq[0].package ),
+ "Success" );
+
+ bool planner_found = false;
+ try
+ {
+ ACE_DEBUG ((LM_DEBUG, "Entering execute planners...\n"));
+
+ ACE_DEBUG ((LM_DEBUG, "Copying plan_actions...\n"));
+ ::CIAO::RACE::Plan_Actions result (plan_seq);
+
+ // ::Deployment::DeploymentPlan result (plan);
+
+ ACE_DEBUG ((LM_DEBUG, "Getting planner connections.\n"));
+ ::CIAO::RACE::Planner_Manager::plannersConnections_var planners
+ = this->comp_.context_->get_connections_planners ();
+
+ ACE_DEBUG ((LM_DEBUG, "%i planners found \n",
+ planners->length ()));
+
+ // @@todo: I should cache this list in a hash map to speed lookups....
+ for (CORBA::ULong i = 0;
+ i < flow.length ();
+ ++i)
+ {
+ ACE_DEBUG ((LM_DEBUG, "Searching for planner %s\n",
+ flow[i].planner.in ()));
+
+ for (CORBA::ULong j = 0;
+ j < planners->length ();
+ ++j)
+ {
+ ACE_DEBUG ((LM_DEBUG, "Examining %s\n",
+ planners[j].objref->name ()));
+
+ if (ACE_OS::strcmp (flow[i].planner.in (),
+ planners[j].objref->name ()) == 0)
+ {
+ ACE_DEBUG ((LM_DEBUG, "RACE::Allocation::Planner_Manager - Found match for %s, running planner\n",
+ flow[i].planner.in ()));
+ planner_found = true;
+
+ bool ret_val = true;
+ ACE_CString error;
+ try
+ {
+ ret_val = planners[j].objref->process_plan (result);
+
+ // error string , to be used in case plan fails ...
+ error = "PlannerFailure: Allocation Failed...Resource Exhaustion.";
+ }
+ catch (PlannerFailure &ex)
+ {
+ ret_val = false;
+ error = ex.name.in();
+ error += ": ";
+ error += ex.reason.in ();
+ }
+ catch (...)
+ {
+ ret_val = false;
+ error = "Unknown exception";
+ }
+ if (!ret_val) // must have been an error ...
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ "Planner %s has reported failure, bailing out....\n%s\n\n",
+ flow[i].planner.in (), error.c_str() ));
+
+ RACE_DEPLOYMENT_STATUS(
+ plan_seq[0].command, Log::EventMark::END_PLAN,
+ plan_seq[0].plan.UUID.in (), 0,
+ Log::Status::FAILURE,
+ Log::find_importance( plan_seq[0].package ),
+ error.c_str ());
+ return;
+ }
+ }
+ }
+ if (!planner_found) // must have been an error ...
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ "Requested planner %s was not foind, bailing out....\n\n",
+ flow[i].planner.in ()));
+ return;
+
+ }
+ }
+
+ /// Call the output adapters only if the plan_action sequence
+ /// returned by the planner contains one of more plan_actions.
+
+ ACE_DEBUG ((LM_DEBUG, "Planner_Manager: current deployment has %i actions\n",
+ result.length ()));
+
+ LogComponentDeploy( result );
+
+ RACE_DEPLOYMENT_STATUS(
+ plan_seq[0].command, Log::EventMark::END_PLAN,
+ plan_seq[0].plan.UUID.in (), 0,
+ Log::Status::SUCCESS,
+ Log::find_importance (plan_seq[0].package),
+ "" );
+
+ if (result.length () > 0)
+ {
+
+ ::CIAO::RACE::Planner_Manager::outputsConnections_var conns
+ = this->comp_.context_->get_connections_outputs ();
+
+ for (CORBA::ULong i = 0; i < conns->length (); ++i)
+ {
+ conns[i].objref->output_plan (result);
+ }
+ }
+ return;
+ }
+ catch (CORBA::Exception &ex)
+ {
+ ex._tao_print_exception ("");
+ }
+ catch (...)
+ {
+ ACE_ERROR ((LM_ERROR, "Unknown exception caught\n"));
+ }
+
+
+ }
+
+ void
+ Planner_Manager_I_exec_i::process_domain_change (
+ ::CIAO::Domain_Changed_Event * ev
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((::CORBA::SystemException))
+ {
+ ACE_DEBUG ((LM_DEBUG, "PlannerMgr::DomainChange - Entering.\n"));
+
+ Plan_Actions_var plan_actions = new Plan_Actions;
+
+ ::CIAO::RACE::Planner_Manager::plannersConnections_var planners;
+
+ RACE_DEPLOYMENT_STATUS(
+ Log::EventType::AUTO_PLAN, Log::SubType::PLANNING_BEGIN,
+ "UNK-Multiple-Possible", 0,
+ Log::Status::SUCCESS,
+ -1, "Auto Plan for Domain Change"
+ );
+
+ try
+ {
+ planners = this->comp_.context_->get_connections_planners ();
+ }
+ catch (CORBA::Exception & ex)
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ "PlannerMgr::DomainChange - CORBA Error in get_connections_planners\n"));
+
+ RACE_DEPLOYMENT_STATUS(
+ Log::EventType::AUTO_PLAN, Log::SubType::PLANNING_END,
+ "UNK-Multiple-Possible", 0,
+ Log::Status::FAILURE,
+ -1, "Domain Change Failed with CORBA Exception on call to get_connections_planners"
+ );
+
+ return;
+ }
+
+ CIAO::RACE::Planner_I::Domain_Changes changes;
+
+ changes.length (ev->changes ().node.length ());
+
+ for (CORBA::ULong i = 0;i < ev->changes ().node.length ();i++)
+ {
+ changes[i].hostname =
+ CORBA::string_dup ( ev->changes ().node[i].name.in ());
+
+ if (ev->change_kind () == ::Deployment::Delete)
+ changes[i].change = CIAO::RACE::Planner_I::NODE_FAILED;
+ else if (ev->change_kind () == ::Deployment::Add)
+ changes[i].change = CIAO::RACE::Planner_I::NODE_JOINED;
+ else
+ {
+ changes[i].change = CIAO::RACE::Planner_I::NODE_FAILED;
+ ACE_DEBUG ((LM_DEBUG,
+ "PlannerMgr::DomainChange - Erro: Invalid change kind on Domain Change.\n"));
+ }
+ }
+
+ for ( CORBA::ULong i=0; i<planners->length() ;i++ )
+ {
+ //make a call to the planners to change domain
+ bool ret_val = 0;
+ Plan_Actions_var temp_plan_actions;
+
+ try
+ {
+ ACE_DEBUG ((LM_DEBUG, "PlannerMgr::DomainChange - Making a call on the Planner = [%s]\n",
+ planners[i].objref->name ()));
+
+ ret_val = planners[i].objref->
+ process_domain_change (changes,
+ temp_plan_actions.out ());
+
+ // Add the plan actions ...
+ CORBA::ULong prev_size = plan_actions->length ();
+
+ if (temp_plan_actions)
+ {
+
+ plan_actions->length (prev_size + temp_plan_actions->length ());
+
+ // here append the plans ..
+ for (CORBA::ULong i = 0;
+ i < temp_plan_actions->length ();
+ i++)
+ {
+ plan_actions[prev_size + i] =
+ temp_plan_actions[i];
+ }
+ }
+ }
+ catch (CORBA::Exception &ex)
+ {
+ ex._tao_print_exception ("");
+
+ RACE_DEPLOYMENT_STATUS(
+ Log::EventType::AUTO_PLAN, Log::SubType::PLANNING_END,
+ "UNK-Multiple-Possible", 0,
+ Log::Status::FAILURE,
+ -1, "Domain Change Failed with CORBA Exception on call to Planner"
+ );
+
+ return;
+ }
+ catch (...)
+ {
+ ACE_ERROR ((LM_ERROR,
+ "Planner_Manager::Unknown exception caught\n"));
+
+ RACE_DEPLOYMENT_STATUS(
+ Log::EventType::AUTO_PLAN, Log::SubType::PLANNING_END,
+ "UNK-Multiple-Possible", 0,
+ Log::Status::FAILURE,
+ -1, "Domain Change Failed with Unknown Exception on call to Planner"
+ );
+
+ return;
+ }
+
+ if (!ret_val) // must have been an error ...
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ "PlannerMgr::DomainChange - Planner has reported failure \n"));
+ /*
+ RACE_DEPLOYMENT_STATUS(
+ Log::EventType::AUTO_PLAN, Log::SubType::PLANNING_END,
+ "UNK-Multiple-Possible", 0,
+ Log::Status::FAILURE,
+ -1, "Domain Change Failed with Planner Error"
+ );
+
+ return;
+ */
+ }
+
+ }
+
+ ACE_DEBUG ((LM_DEBUG, "Planner_Manager::DomainChange: \
+ [%d] plans to be redeployed\n",
+ plan_actions->length ()));
+
+ if (plan_actions->length () > 0)
+ {
+ ::CIAO::RACE::Planner_Manager::outputsConnections_var conns
+ = this->comp_.context_->get_connections_outputs ();
+
+ for (CORBA::ULong i = 0; i < conns->length (); ++i)
+ {
+ try
+ {
+ conns[i].objref->output_plan (plan_actions);
+ }
+ catch (CORBA::Exception &ex)
+ {
+ ex._tao_print_exception ("");
+
+ RACE_DEPLOYMENT_STATUS(
+ Log::EventType::AUTO_PLAN, Log::SubType::PLANNING_END,
+ "UNK-Multiple-Possible", 0,
+ Log::Status::FAILURE,
+ -1, "Domain Change Failed with CORBA Exception on call to Output Adapter"
+ );
+ return;
+ }
+ catch (...)
+ {
+ ACE_ERROR ((LM_ERROR, "PlannerMgr::DomainChange - Unknown exception caught\n"));
+
+ RACE_DEPLOYMENT_STATUS(
+ Log::EventType::AUTO_PLAN, Log::SubType::PLANNING_END,
+ "UNK-Multiple-Possible", 0,
+ Log::Status::FAILURE,
+ -1, "Domain Change Failed with Unknown Exception on call to Output Adapter"
+ );
+ return;
+ }
+ }
+ LogComponentDeploy( plan_actions );
+ }
+ else
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ "Planner_manager::DomainChange - No plans were affected\n"));
+ }
+
+ RACE_DEPLOYMENT_STATUS(
+ Log::EventType::AUTO_PLAN, Log::SubType::PLANNING_END,
+ "UNK-Multiple-Possible", 0,
+ Log::Status::SUCCESS,
+ -1, "Successful Auto Plan for Domain Change"
+ );
+
+ return;
+ }
+
+
+ void
+ Planner_Manager_exec_i::push_domain_changed (
+ ::CIAO::Domain_Changed_Event * ev
+ ACE_ENV_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC (( ::CORBA::SystemException))
+ {
+ ACE_DEBUG ((LM_DEBUG,
+ "Planner_Manager_exec_i::push_domain_change - Enter.\n"));
+
+ if (exec_ptr_)
+ this->exec_ptr_->process_domain_change (ev);
+ else
+ ACE_DEBUG ((LM_DEBUG, "Planner_Manager_exec_i::push_domain_change - Executor still not active\n"));
+
+ }
+
+ //==================================================================
+ // Component Executor Implementation Class: Planner_Manager_exec_i
+ //==================================================================
+
+ Planner_Manager_exec_i::Planner_Manager_exec_i (void)
+ :exec_ptr_ (0)
+ {
+ }
+
+ Planner_Manager_exec_i::~Planner_Manager_exec_i (void)
+ {
+ }
+
+ // Supported or inherited operations.
+
+ // Attribute operations.
+
+ ::CIAO::RACE::RACE_Classifications *
+ Planner_Manager_exec_i::classes (
+ ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+ {
+ // Your code here.
+ RACE_Classifications_var retval (new RACE_Classifications (0));
+ retval->length (0);
+ return retval._retn ();
+ }
+
+ // Port operations.
+
+ ::CIAO::RACE::CCM_Planner_Manager_I_ptr
+ Planner_Manager_exec_i::get_planner_manager_i (
+ ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((CORBA::SystemException))
+ {
+ exec_ptr_ = new Planner_Manager_I_exec_i (*this);
+ return exec_ptr_;
+ }
+
+ // Operations from Components::SessionComponent
+
+ void
+ Planner_Manager_exec_i::set_session_context (
+ ::Components::SessionContext_ptr ctx
+ ACE_ENV_ARG_DECL)
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException,
+ ::Components::CCMException))
+ {
+ this->context_ =
+ Planner_Manager_Context::_narrow (
+ ctx
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK;
+
+ if (this->context_ == 0)
+ {
+ ACE_THROW (CORBA::INTERNAL ());
+ }
+ }
+
+ void
+ Planner_Manager_exec_i::ciao_preactivate (
+ ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException,
+ ::Components::CCMException))
+ {
+ // Your code here.
+ }
+
+ void
+ Planner_Manager_exec_i::ciao_postactivate (
+ ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException,
+ ::Components::CCMException))
+ {
+ // Your code here.
+ }
+
+ void
+ Planner_Manager_exec_i::ccm_activate (
+ ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException,
+ ::Components::CCMException))
+ {
+ // Your code here.
+ }
+
+ void
+ Planner_Manager_exec_i::ccm_passivate (
+ ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException,
+ ::Components::CCMException))
+ {
+ // Your code here.
+ }
+
+ void
+ Planner_Manager_exec_i::ccm_remove (
+ ACE_ENV_SINGLE_ARG_DECL_NOT_USED)
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException,
+ ::Components::CCMException))
+ {
+ // Your code here.
+ }
+
+ //==================================================================
+ // Home Executor Implementation Class: Planner_Manager_Home_exec_i
+ //==================================================================
+
+ Planner_Manager_Home_exec_i::Planner_Manager_Home_exec_i (void)
+ {
+ }
+
+ Planner_Manager_Home_exec_i::~Planner_Manager_Home_exec_i (void)
+ {
+ }
+
+ // Supported or inherited operations.
+
+ // Home operations.
+
+ // Factory and finder operations.
+
+ // Attribute operations.
+
+ // Implicit operations.
+
+ ::Components::EnterpriseComponent_ptr
+ Planner_Manager_Home_exec_i::create (
+ ACE_ENV_SINGLE_ARG_DECL)
+ ACE_THROW_SPEC ((
+ ::CORBA::SystemException,
+ ::Components::CCMException))
+ {
+ ::Components::EnterpriseComponent_ptr retval =
+ ::Components::EnterpriseComponent::_nil ();
+
+ ACE_NEW_THROW_EX (
+ retval,
+ Planner_Manager_exec_i,
+ CORBA::NO_MEMORY ());
+ ACE_CHECK_RETURN (::Components::EnterpriseComponent::_nil ());
+
+ return retval;
+ }
+
+ extern "C" PLANNER_MANAGER_EXEC_Export ::Components::HomeExecutorBase_ptr
+ create_CIAO_RACE_Planner_Manager_Home_Impl (void)
+ {
+ ::Components::HomeExecutorBase_ptr retval =
+ ::Components::HomeExecutorBase::_nil ();
+
+ ACE_NEW_RETURN (
+ retval,
+ Planner_Manager_Home_exec_i,
+ ::Components::HomeExecutorBase::_nil ());
+
+ return retval;
+ }
+ }
+ }
+}