---
src/include/matahari/services.h | 10 +-
src/lib/services.c | 72 ++++++++------
src/lib/services_linux.c | 2 +-
src/service/schema.xml | 173 ++++++++++++++++------------------
src/service/service-qmf.cpp | 198 +++++++++++++++++---------------------
5 files changed, 217 insertions(+), 238 deletions(-)
diff --git a/src/include/matahari/services.h b/src/include/matahari/services.h
index 0a48bb8..c79c233 100644
--- a/src/include/matahari/services.h
+++ b/src/include/matahari/services.h
@@ -90,7 +90,7 @@ typedef struct svc_action_s
char *action;
int interval;
- char *rclass;
+ char *standard;
char *provider;
char *agent;
@@ -100,6 +100,8 @@ typedef struct svc_action_s
int rc;
int pid;
int status;
+ int sequence;
+ int expected_rc;
char *stderr_data;
char *stdout_data;
@@ -119,15 +121,15 @@ typedef struct svc_action_s
extern GList *get_directory_list(const char *root, gboolean files);
extern GList *services_list(void);
-extern GList *resources_list_ocf_providers(void);
-extern GList *resources_list_ocf_agents(const char *provider);
+extern GList *resources_list_providers(const char *standard);
+extern GList *resources_list_agents(const char *standard, const char *provider);
extern svc_action_t *services_action_create(
const char *name, const char *action, int interval /* ms */, int timeout /* ms */);
/* After the call, 'params' is owned, and later free'd by the svc_action_t
result */
extern svc_action_t *resources_action_create(
- const char *name, const char *provider, const char *agent,
+ const char *name, const char *standard, const char *provider, const char *agent,
const char *action, int interval /* ms */, int timeout /* ms */, GHashTable
*params);
extern void services_action_free(svc_action_t *op);
diff --git a/src/lib/services.c b/src/lib/services.c
index fc20165..08c88a8 100644
--- a/src/lib/services.c
+++ b/src/lib/services.c
@@ -31,31 +31,19 @@
MH_TRACE_INIT_DATA(mh_services);
+/* TODO: Develop a rollover strategy */
+static int operations = 0;
GHashTable *recurring_actions = NULL;
svc_action_t *services_action_create(
const char *name, const char *action, int interval, int timeout)
{
- svc_action_t *op;
-
- op = calloc(1, sizeof(svc_action_t));
- op->opaque = calloc(1, sizeof(svc_action_private_t));
- op->rsc = strdup(name);
- op->action = strdup(action);
- op->interval = interval;
- op->timeout = timeout;
- op->rclass = strdup("lsb");
- op->agent = strdup(name);
- asprintf(&op->id, "%s_%s_%d", name, action, interval);
-
- services_os_set_exec(op);
-
- return op;
+ return resources_action_create(name, "lsb", NULL, name, action, interval,
timeout, NULL);
}
svc_action_t *resources_action_create(
- const char *name, const char *provider, const char *agent,
+ const char *name, const char *standard, const char *provider, const char *agent,
const char *action, int interval, int timeout, GHashTable *params)
{
svc_action_t *op;
@@ -66,16 +54,29 @@ svc_action_t *resources_action_create(
op->action = strdup(action);
op->interval = interval;
op->timeout = timeout;
- op->rclass = strdup("ocf");
+ op->standard = strdup(standard);
op->agent = strdup(agent);
- op->provider = strdup(provider);
- op->params = params;
+ op->sequence = ++operations;
asprintf(&op->id, "%s_%s_%d", name, action, interval);
- asprintf(&op->opaque->exec, "%s/resource.d/%s/%s", OCF_ROOT,
- provider, agent);
- op->opaque->args[0] = strdup(op->opaque->exec);
- op->opaque->args[1] = strdup(action);
+ if(strcmp(standard, "ocf") == 0) {
+ op->provider = strdup(provider);
+ op->params = params;
+
+ asprintf(&op->opaque->exec, "%s/resource.d/%s/%s", OCF_ROOT,
+ provider, agent);
+ op->opaque->args[0] = strdup(op->opaque->exec);
+ op->opaque->args[1] = strdup(action);
+
+ } else if(strcmp(standard, "lsb") == 0 || strcmp(standard,
"windows") == 0) {
+ services_os_set_exec(op);
+
+ } else {
+ mh_err("Unknown resource standard: %s", standard);
+ services_action_free(op);
+ op = NULL;
+ }
+
return op;
}
@@ -96,7 +97,7 @@ void services_action_free(svc_action_t *op)
free(op->rsc);
free(op->action);
- free(op->rclass);
+ free(op->standard);
free(op->agent);
free(op->provider);
@@ -173,16 +174,27 @@ get_directory_list(const char *root, gboolean files)
GList *services_list(void)
{
- return services_os_list();
+ return resources_list_agents("lsb", NULL);
}
-GList *resources_list_ocf_providers(void)
+GList *resources_list_providers(const char *standard)
{
- return resources_os_list_ocf_providers();
+ if(strcmp(standard, "ocf") == 0) {
+ return resources_os_list_ocf_providers();
+ }
+
+ return NULL;
}
-GList *resources_list_ocf_agents(const char *provider)
+GList *resources_list_agents(const char *standard, const char *provider)
{
- return resources_os_list_ocf_agents(provider);
-}
+ if(strcmp(standard, "ocf") == 0) {
+ return resources_os_list_ocf_agents(provider);
+ } else if(strcmp(standard, "lsb") == 0
+ || strcmp(standard, "windows") == 0) {
+ return services_os_list();
+ }
+
+ return NULL;
+}
diff --git a/src/lib/services_linux.c b/src/lib/services_linux.c
index 3a54386..900d292 100644
--- a/src/lib/services_linux.c
+++ b/src/lib/services_linux.c
@@ -136,7 +136,7 @@ set_ocf_env_with_prefix(gpointer key, gpointer value, gpointer
user_data)
static void
add_OCF_env_vars(svc_action_t *op)
{
- if (strcmp("ocf", op->rclass) != 0) {
+ if (strcmp("ocf", op->standard) != 0) {
return;
}
diff --git a/src/service/schema.xml b/src/service/schema.xml
index feefb91..d21d480 100644
--- a/src/service/schema.xml
+++ b/src/service/schema.xml
@@ -3,27 +3,31 @@
<eventArguments>
<!-- Common -->
- <arg name="timestamp" type="absTime" />
- <arg name="sequence" type="uint32" />
+ <arg name="timestamp" type="absTime" />
+ <arg name="sequence" type="uint32" />
- <arg name="name" type="sstr" />
- <arg name="action" type="sstr" />
- <arg name="interval" type="uint32"/>
+ <arg name="name" type="sstr" />
+ <arg name="standard" type="sstr" />
+ <arg name="provider" type="sstr" />
+ <arg name="type" type="sstr" />
- <arg name="rc" type="uint32" />
+ <arg name="action" type="sstr" />
+ <arg name="interval" type="uint32" />
+ <arg name="rc" type="uint32" />
- <arg name="rsc_type" type="sstr" />
- <arg name="rsc_class" type="sstr" />
- <arg name="rsc_provider" type="sstr" />
+ <arg name="expected-rc" type="uint32" />
+ <arg name="userdata" type="sstr" />
</eventArguments>
- <!-- Services API -->
+ <event
name="resource_op" args="timestamp,sequence,name,standard,provider,type,action,interval,rc,expected-rc,userdata"
/>
- <!-- Is sequence needed? How to tie to the async method call seq? -->
- <!-- Is timestamp needed? Possibly available for all events already -->
- <event
name="service_op" args="name,action,interval,rc,sequence,timestamp"
/>
- <event
name="resource_op" args="name,action,interval,rc,sequence,timestamp,rsc_type,rsc_class,rsc_provider"
/>
+ <!--
+ Services API
+ Simple API for accessing system services
+
+ For more advanced functionality, use the Resources API with
standard="lsb"
+ -->
<class name="Services">
<property name="uuid" type="sstr" access="RO"
desc="Host UUID" />
@@ -41,127 +45,108 @@
<arg name="name" dir="I" type="sstr"
/>
</method>
<method name="start" desc="Start a system service">
- <arg name="name" dir="IO" type="sstr"
/>
+ <arg name="name" dir="I" type="sstr"
/>
<arg name="timeout" dir="I" type="uint32"
/>
<arg name="rc" dir="O" type="uint32"
/>
</method>
<method name="stop" desc="Stop a system service">
- <arg name="name" dir="IO" type="sstr"
/>
+ <arg name="name" dir="I" type="sstr"
/>
<arg name="timeout" dir="I" type="uint32"
/>
<arg name="rc" dir="O" type="uint32"
/>
</method>
<method name="status" desc="Check the health of a system
service">
- <arg name="name" dir="IO" type="sstr"
/>
- <arg name="interval" dir="IO" type="uint32"
/>
+ <arg name="name" dir="I" type="sstr"
/>
<arg name="timeout" dir="I" type="uint32"
/>
<arg name="rc" dir="O" type="uint32"
/>
</method>
- <method name="cancel" desc="Cancel a pending or running
action on a system service">
- <arg name="name" dir="I" type="sstr"
/>
- <arg name="action" dir="I" type="sstr"
/>
- <arg name="interval" dir="I" type="uint32"
/>
- </method>
- <method name="fail" desc="Raise a failure event for a
system service">
- <arg name="name" dir="IO" type="sstr"
/>
- </method>
<method name="describe" desc="Obtain XML description of a
system service">
<arg name="name" dir="I" type="sstr"
/>
<arg name="xml" dir="O" type="sstr"
/>
</method>
</class>
+ <!--
+ Resources API
+
+ Fully featured API for controlling and monitoring services
+ conforming to a standardized specification.
+
+ Currently supported standards: windows, lsb (Linux Standard Base), ocf (Open
Cluster Framework)
+ On Windows, 'lsb' is an alias for 'windows'
+ -->
+
<class name="Resources">
<property name="uuid" type="sstr" access="RO"
desc="Host UUID" />
- <property name="hostname" type="sstr" access="RO"
desc="Hostname" index="y"/>
+ <property name="hostname" type="sstr" access="RO"
desc="Hostname" index="y"/>
- <method name="list_classes" desc="List known resource classes (OCF,
LSB, Upstart, etc)">
- <arg name="classes" dir="O" type="list"
/>
+ <method name="list_standards" desc="List known resource standards
(OCF, LSB, Upstart, etc)">
+ <arg name="standards" dir="O" type="list"
/>
</method>
- <method name="list_ocf_providers" desc="List known OCF providers
(if supported)">
- <arg name="providers" dir="O" type="list"
/>
+ <method name="list_providers" desc="List known providers (if
supported) for a given standard">
+ <arg name="standard" dir="I" type="sstr"
/>
+ <arg name="providers" dir="O" type="list"
/>
</method>
- <method name="list" desc="List known resource types for a
given provider">
+ <method name="list" desc="List known resource types for a
given standard and provider">
+ <arg name="standard" dir="I" type="sstr"
/>
<arg name="provider" dir="I" type="sstr"
/>
<arg name="types" dir="O" type="list"
/>
</method>
- <!-- Something we can add later if necessary
- method name="list_variants" desc="List known implementations of a
given resource type">
- <arg name="type" dir="I" type="sstr"
/>
- <arg name="class" dir="O" type="list"
/>
- <arg name="providers" dir="O" type="list"
/>
- </method-->
<method name="describe" desc="Obtain XML description of a
resource">
- <arg name="class" dir="I" type="sstr"
/>
+ <arg name="standard" dir="I" type="sstr"
/>
<arg name="provider" dir="I" type="sstr"
/>
<arg name="type" dir="I" type="sstr"
/>
<arg name="xml" dir="O" type="sstr"
/>
</method>
- <method name="start" desc="Start a resource">
- <arg name="name" dir="IO" type="sstr"
/>
- <arg name="class" dir="IO" type="sstr"
/>
- <arg name="provider" dir="IO" type="sstr"
/>
- <arg name="type" dir="IO" type="sstr"
/>
- <arg name="parameters" dir="I" type="map"
/>
- <arg name="timeout" dir="I" type="uint32"
/>
- <arg name="rc" dir="O" type="uint32"
/>
- </method>
- <method name="stop" desc="Stop a resource">
- <arg name="name" dir="IO" type="sstr"
/>
- <arg name="class" dir="IO" type="sstr"
/>
- <arg name="provider" dir="IO" type="sstr"
/>
- <arg name="type" dir="IO" type="sstr"
/>
- <arg name="parameters" dir="I" type="map"
/>
- <arg name="timeout" dir="I" type="uint32"
/>
- <arg name="rc" dir="O" type="uint32"
/>
- </method>
- <method name="monitor" desc="Check the health of a
resource">
- <arg name="name" dir="IO" type="sstr"
/>
- <arg name="class" dir="IO" type="sstr"
/>
- <arg name="provider" dir="IO" type="sstr"
/>
- <arg name="type" dir="IO" type="sstr"
/>
- <arg name="interval" dir="IO" type="uint32"
/>
- <arg name="parameters" dir="I" type="map"
/>
- <arg name="timeout" dir="I" type="uint32"
/>
- <arg name="rc" dir="O" type="uint32"
/>
- </method>
<method name="invoke" desc="Perform a custom action on a
resource">
- <arg name="name" dir="IO" type="sstr"
/>
- <arg name="class" dir="IO" type="sstr"
/>
- <arg name="provider" dir="IO" type="sstr"
/>
- <arg name="type" dir="IO" type="sstr"
/>
- <arg name="action" dir="IO" type="sstr"
/>
- <arg name="interval" dir="IO" type="uint32"
/>
- <arg name="parameters" dir="I" type="map"
/>
+ <arg name="name" dir="I" type="sstr"
/>
+ <arg name="standard" dir="I" type="sstr"
/>
+ <arg name="provider" dir="I" type="sstr"
/>
+ <arg name="type" dir="I" type="sstr"
/>
+ <arg name="action" dir="I" type="sstr"
/>
+ <arg name="interval" dir="I" type="uint32"
/>
+ <arg name="parameters" dir="I" type="map"
/>
<arg name="timeout" dir="I" type="uint32"
/>
+ <arg name="expected-rc" dir="I" type="uint32"
/>
<arg name="rc" dir="O" type="uint32"
/>
+ <arg name="sequence" dir="O" type="uint32"
/>
+ <arg name="userdata" dir="IO" type="sstr"
/>
</method>
<method name="cancel" desc="Cancel a pending or running
action on a resource">
- <arg name="name" dir="IO" type="sstr"
/>
- <arg name="class" dir="IO" type="sstr"
/>
- <arg name="provider" dir="IO" type="sstr"
/>
- <arg name="type" dir="IO" type="sstr"
/>
- <arg name="action" dir="IO" type="sstr"
/>
- <arg name="interval" dir="IO" type="uint32"
/>
+ <arg name="name" dir="I" type="sstr"
/>
+ <arg name="action" dir="I" type="sstr"
/>
+ <arg name="interval" dir="I" type="uint32"
/>
<arg name="timeout" dir="I" type="uint32"
/>
</method>
<method name="fail" desc="Indicate a resource has
failed">
- <arg name="name" dir="IO" type="sstr"
/>
- <arg name="class" dir="IO" type="sstr"
/>
- <arg name="provider" dir="IO" type="sstr"
/>
- <arg name="type" dir="IO" type="sstr"
/>
- </method>
- <!-- Something we can add later if necessary
- method name="last" desc="Retrieve the last action for a
resource">
- <arg name="name" dir="IO" type="sstr"
/>
- <arg name="class" dir="IO" type="sstr"
/>
- <arg name="provider" dir="IO" type="sstr"
/>
- <arg name="type" dir="IO" type="sstr"
/>
- <arg name="action" dir="O" type="sstr"
/>
- <arg name="parameters" dir="O" type="map"
/>
+ <arg name="name" dir="I" type="sstr"
/>
+ <arg name="rc" dir="I" type="uint32"
/>
+ </method>
+ <!-- Something functions we can add later if necessary
+ <method name="list_variants" desc="List known implementations of a
given resource type">
+ <arg name="type" dir="I" type="sstr"
/>
+ <arg name="standard" dir="I" type="sstr"
/>
+ <arg name="providers" dir="O" type="list"
/>
+ </method>
+ <method name="last" desc="Retrieve the last action for a
resource">
+ <arg name="name" dir="I" type="sstr"
/>
+ <arg name="standard" dir="O" type="sstr"
/>
+ <arg name="provider" dir="O" type="sstr"
/>
+ <arg name="type" dir="O" type="sstr"
/>
+ <arg name="action" dir="O" type="sstr"
/>
<arg name="interval" dir="O" type="uint32"
/>
+ <arg name="parameters" dir="O" type="map"
/>
<arg name="timeout" dir="O" type="uint32"
/>
- </method-->
+ <arg name="expected-rc" dir="O" type="uint32"
/>
+ <arg name="rc" dir="O" type="uint32"
/>
+ <arg name="sequence" dir="O" type="uint32"
/>
+ <arg name="userdata" dir="O" type="sstr"
/>
+ </method>
+ <method name="history" desc="Retrieve all recorded actions for
a resource">
+ <arg name="name" dir="I" type="sstr"
/>
+ <arg name="operations" dir="O" type="list"
/>
+ </method>
+ -->
</class>
</schema>
diff --git a/src/service/service-qmf.cpp b/src/service/service-qmf.cpp
index 06c670f..b1b9a62 100644
--- a/src/service/service-qmf.cpp
+++ b/src/service/service-qmf.cpp
@@ -54,6 +54,8 @@ class SrvAgent : public MatahariAgent
qmf::Data _resources;
qmf::DataAddr _resources_addr;
+ _qtype::Variant::List standards;
+
gboolean invoke_services(qmf::AgentSession session, qmf::AgentEvent event,
gpointer user_data);
gboolean invoke_resources(qmf::AgentSession session, qmf::AgentEvent event,
gpointer user_data);
@@ -63,7 +65,7 @@ class SrvAgent : public MatahariAgent
virtual int setup(qmf::AgentSession session);
virtual gboolean invoke(qmf::AgentSession session, qmf::AgentEvent event,
gpointer user_data);
- void raiseEvent(svc_action_t *op, enum service_id service);
+ void raiseEvent(svc_action_t *op, enum service_id service, const char
*userdata);
};
/**
@@ -103,20 +105,30 @@ public:
void
AsyncCB::mh_async_callback(svc_action_t *op)
{
+ const char *userdata = NULL;
AsyncCB *cb_data = static_cast<AsyncCB *>(op->cb_data);
mh_trace("Completed: %s = %d\n", op->id, op->rc);
+ qpid::types::Variant::Map& args = cb_data->event.getArguments();
+ if (args.count("userdata") > 0) {
+ userdata = args["userdata"].asString().c_str();
+ }
+
if (cb_data->first_result) {
if (cb_data->has_rc) {
cb_data->event.addReturnArgument("rc", op->rc);
}
+ if (userdata) {
+ cb_data->event.addReturnArgument("userdata", userdata);
+ }
cb_data->session.methodSuccess(cb_data->event);
cb_data->first_result = false;
+
} else if (cb_data->last_rc != op->rc) {
mh_trace("Result changed on recurring action: was '%d', now
'%d'\n",
cb_data->last_rc, op->rc);
- cb_data->agent->raiseEvent(op, cb_data->service);
+ cb_data->agent->raiseEvent(op, cb_data->service, userdata);
}
if (op->interval) { /* recurring action */
@@ -156,7 +168,7 @@ main(int argc, char **argv)
return rc;
}
-void SrvAgent::raiseEvent(svc_action_t *op, enum service_id service)
+void SrvAgent::raiseEvent(svc_action_t *op, enum service_id service, const char
*userdata)
{
uint64_t timestamp = 0L;
qmf::Data event;
@@ -166,7 +178,9 @@ void SrvAgent::raiseEvent(svc_action_t *op, enum service_id service)
#endif
if(service) {
- event = qmf::Data(_package.event_service_op);
+ // event = qmf::Data(_package.event_service_op);
+ return;
+
} else {
event = qmf::Data(_package.event_resource_op);
}
@@ -176,12 +190,17 @@ void SrvAgent::raiseEvent(svc_action_t *op, enum service_id
service)
event.setProperty("interval", op->interval);
event.setProperty("rc", op->rc);
event.setProperty("timestamp", timestamp);
- event.setProperty("sequence", 0);
+ event.setProperty("sequence", op->sequence);
if (service == SRV_RESOURCES) {
- event.setProperty("rsc_type", op->agent);
- event.setProperty("rsc_class", op->rclass);
- event.setProperty("rsc_provider", op->provider);
+ event.setProperty("standard", op->standard);
+ event.setProperty("provider", op->provider);
+ event.setProperty("type", op->agent);
+ event.setProperty("expected-rc", op->expected_rc);
+ }
+
+ if(userdata) {
+ event.setProperty("userdata", userdata);
}
_agent_session.raiseEvent(event);
@@ -190,6 +209,14 @@ void SrvAgent::raiseEvent(svc_action_t *op, enum service_id service)
int
SrvAgent::setup(qmf::AgentSession session)
{
+#ifdef __linux__
+ standards.push_back("ocf");
+#endif
+ standards.push_back("lsb");
+#ifndef WIN32
+ standards.push_back("windows");
+#endif
+
_package.configure(session);
_services = qmf::Data(_package.data_Services);
@@ -243,7 +270,6 @@ SrvAgent::invoke_services(qmf::AgentSession session, qmf::AgentEvent
event, gpoi
}
qpid::types::Variant::Map& args = event.getArguments();
- bool async = false;
if (methodName == "list") {
_qtype::Variant::List s_list;
@@ -256,59 +282,29 @@ SrvAgent::invoke_services(qmf::AgentSession session, qmf::AgentEvent
event, gpoi
event.addReturnArgument("services", s_list);
- } else if (methodName == "enable") {
- svc_action_t * op = services_action_create(
- args["name"].asString().c_str(), "enable", 0,
- default_timeout_ms);
-
- action_async(SRV_SERVICES, session, event, op, false);
- async = true;
-
- } else if (methodName == "disable") {
- svc_action_t * op = services_action_create(
- args["name"].asString().c_str(), "disable", 0,
- default_timeout_ms);
-
- action_async(SRV_SERVICES, session, event, op, false);
- async = true;
-
- } else if (methodName == "start") {
+ } else if (methodName == "enable" || methodName == "disable") {
svc_action_t *op = services_action_create(
- args["name"].asString().c_str(), "start", 0,
args["timeout"]);
+ args["name"].asString().c_str(), methodName.c_str(), 0,
+ default_timeout_ms);
- action_async(SRV_SERVICES, session, event, op, true);
- async = true;
-
- } else if (methodName == "stop") {
- svc_action_t * op = services_action_create(
- args["name"].asString().c_str(), "stop", 0,
args["timeout"]);
-
- action_async(SRV_SERVICES, session, event, op, true);
- async = true;
+ action_async(SRV_SERVICES, session, event, op, false);
+ return TRUE;
- } else if (methodName == "status") {
+ } else if (methodName == "start"
+ || methodName == "stop"
+ || methodName == "status") {
svc_action_t *op = services_action_create(
- args["name"].asString().c_str(), "status",
args["interval"],
- args["timeout"]);
+ args["name"].asString().c_str(), methodName.c_str(), 0,
args["timeout"].asInt32());
action_async(SRV_SERVICES, session, event, op, true);
- async = true;
-
- } else if (methodName == "cancel") {
- services_action_cancel(
- args["name"].asString().c_str(),
- args["action"].asString().c_str(),
- args["interval"]);
+ return TRUE;
} else {
session.raiseException(event, MH_NOT_IMPLEMENTED);
return TRUE;
}
- if (!async) {
- session.methodSuccess(event);
- }
-
+ session.methodSuccess(event);
return TRUE;
}
@@ -321,19 +317,16 @@ SrvAgent::invoke_resources(qmf::AgentSession session,
qmf::AgentEvent event, gpo
}
qpid::types::Variant::Map& args = event.getArguments();
- bool async = false;
- if (methodName == "list_classes") {
- _qtype::Variant::List c_list;
- c_list.push_back("ocf");
- c_list.push_back("lsb");
- event.addReturnArgument("classes", c_list);
+ if (methodName == "list_standards") {
+ event.addReturnArgument("standards", standards);
- } else if (methodName == "list_ocf_providers") {
+ } else if (methodName == "list_providers") {
GList *gIter = NULL;
- GList *providers = resources_list_ocf_providers();
+ GList *providers = NULL;
_qtype::Variant::List p_list;
+ providers = resources_list_providers(args["standard"].asString().c_str());
for(gIter = providers; gIter != NULL; gIter = gIter->next) {
p_list.push_back((const char *)gIter->data);
}
@@ -341,74 +334,61 @@ SrvAgent::invoke_resources(qmf::AgentSession session,
qmf::AgentEvent event, gpo
} else if (methodName == "list") {
GList *gIter = NULL;
- GList *agents = resources_list_ocf_agents(
- args["provider"].asString().c_str());
+ GList *agents = NULL;
_qtype::Variant::List t_list;
+ agents = resources_list_agents(
+ args["standard"].asString().c_str(),
+ args["provider"].asString().c_str());
+
for(gIter = agents; gIter != NULL; gIter = gIter->next) {
t_list.push_back((const char *)gIter->data);
}
event.addReturnArgument("types", t_list);
- } else if (methodName == "start") {
- GHashTable *params = qmf_map_to_hash(args["parameters"].asMap());
- svc_action_t *op = resources_action_create(
- args["name"].asString().c_str(),
- args["provider"].asString().c_str(),
- args["type"].asString().c_str(),
- "start", 0, args["timeout"], params);
-
- action_async(SRV_RESOURCES, session, event, op, true);
- async = true;
-
- } else if (methodName == "stop") {
- GHashTable *params = qmf_map_to_hash(args["parameters"].asMap());
- svc_action_t *op = resources_action_create(
- args["name"].asString().c_str(),
- args["provider"].asString().c_str(),
- args["type"].asString().c_str(),
- "stop", 0, args["timeout"], params);
-
- action_async(SRV_RESOURCES, session, event, op, true);
- async = true;
-
- } else if (methodName == "monitor") {
- GHashTable *params = qmf_map_to_hash(args["parameters"].asMap());
- svc_action_t *op = resources_action_create(
- args["name"].asString().c_str(),
- args["provider"].asString().c_str(),
- args["type"].asString().c_str(),
- "monitor", args["interval"],
args["timeout"], params);
-
- action_async(SRV_RESOURCES, session, event, op, true);
- async = true;
-
} else if (methodName == "invoke") {
- GHashTable *params = qmf_map_to_hash(args["parameters"].asMap());
- svc_action_t *op = resources_action_create(
- args["name"].asString().c_str(),
- args["provider"].asString().c_str(),
- args["type"].asString().c_str(),
- args["action"].asString().c_str(),
- args["interval"], args["timeout"], params);
-
- action_async(SRV_RESOURCES, session, event, op, true);
- async = true;
-
+ svc_action_t *op = NULL;
+ bool valid_standard = false;
+ _qtype::Variant::List::iterator iter;
+ GHashTable *params = qmf_map_to_hash(args["parameters"].asMap());
+
+ for ( iter=standards.begin() ; iter != standards.end(); iter++ ) {
+ if(args["standard"].asString() == (*iter).asString()) {
+ valid_standard = true;
+ break;
+ }
+ }
+
+ if(valid_standard == false) {
+ mh_err("%s is not a known resource standard",
args["standard"].asString().c_str());
+ session.raiseException(event, MH_NOT_IMPLEMENTED);
+ return TRUE;
+ }
+
+ op = resources_action_create(
+ args["name"].asString().c_str(),
+ args["standard"].asString().c_str(),
+ args["provider"].asString().c_str(),
+ args["type"].asString().c_str(),
+ args["action"].asString().c_str(),
+ args["interval"].asInt32(), args["timeout"].asInt32(), params);
+
+ op->expected_rc = args["expected-rc"].asInt32();
+
+ action_async(SRV_RESOURCES, session, event, op, true);
+ return TRUE;
+
} else if (methodName == "cancel") {
services_action_cancel(
args["name"].asString().c_str(),
args["action"].asString().c_str(),
- args["interval"]);
+ args["interval"].asInt32());
} else {
session.raiseException(event, MH_NOT_IMPLEMENTED);
return TRUE;
}
- if (!async) {
- session.methodSuccess(event);
- }
-
+ session.methodSuccess(event);
return TRUE;
}
--
1.7.5.1