resource-backend: emit resource set events and extend the client API.
authorIsmo Puustinen <ismo.puustinen@intel.com>
Mon, 5 May 2014 10:38:24 +0000 (13:38 +0300)
committerKrisztian Litkey <krisztian.litkey@intel.com>
Wed, 20 Aug 2014 08:31:53 +0000 (11:31 +0300)
src/plugins/resource-native/plugin-resource-native.c
src/resource/attribute.c
src/resource/client-api.h
src/resource/resource-set.c
src/resource/resource-set.h

index 8f51341..bdc30c4 100644 (file)
@@ -53,6 +53,8 @@
 #include <murphy/resource/manager-api.h>
 #include <murphy/resource/protocol.h>
 
+#include <murphy/resource/resource-set.h>
+
 #define ATTRIBUTE_MAX MRP_ATTRIBUTE_MAX
 
 
@@ -1130,6 +1132,16 @@ static void unsubscribe_events(mrp_plugin_t *plugin)
 }
 
 
+static void register_events(mrp_plugin_t *plugin)
+{
+    /* register the events that are sent on the resource state changes */
+
+    mrp_register_event(MURPHY_RESOURCE_EVENT_CREATED);
+    mrp_register_event(MURPHY_RESOURCE_EVENT_ACQUIRE);
+    mrp_register_event(MURPHY_RESOURCE_EVENT_RELEASE);
+    mrp_register_event(MURPHY_RESOURCE_EVENT_DESTROYED);
+}
+
 
 static int resource_init(mrp_plugin_t *plugin)
 {
@@ -1152,6 +1164,7 @@ static int resource_init(mrp_plugin_t *plugin)
 
     plugin->data = data;
 
+    register_events(plugin);
     subscribe_events(plugin);
     initiate_lua_configuration(plugin);
 
index 6ffbf75..2f354ea 100644 (file)
@@ -35,7 +35,7 @@
 #include <murphy/common/log.h>
 
 #include "attribute.h"
-
+#include "client-api.h"
 
 static mrp_attr_value_t *get_attr_value_from_list(mrp_attr_t *, const char *,
                                                   mqi_data_type_t);
@@ -247,6 +247,48 @@ static mrp_attr_value_t *get_attr_value_from_list(mrp_attr_t     *list,
     return NULL;
 }
 
+void mrp_resource_set_free_attribute(mrp_attr_t *attr)
+{
+    if (!attr)
+        return;
+
+    mrp_free(attr);
+}
+
+mrp_attr_t *mrp_resource_set_get_attribute_by_name(
+        mrp_resource_set_t *resource_set, const char *resource_name,
+        const char *attribute_name)
+{
+    mrp_attr_t *attr = NULL, *attrs;
+    uint32_t res_id;
+    mrp_attr_t attr_buf[128];
+    uint32_t attr_idx = 0;
+
+    memset(attr_buf, 0, sizeof(attr_buf));
+
+    res_id = mrp_resource_definition_get_resource_id_by_name(resource_name);
+    attrs = mrp_resource_definition_read_all_attributes(res_id, 128, attr_buf);
+
+    if (!attrs)
+        return NULL;
+
+    while (attrs->name != NULL) {
+        if (strcmp(attrs->name, attribute_name) == 0) {
+
+            mrp_attr_t *buf = mrp_allocz(sizeof(mrp_attr_t));
+            mrp_resource_set_read_attribute(resource_set, resource_name,
+                    attr_idx, buf);
+
+            attr = buf;
+
+            break;
+        }
+        attr_idx++;
+        attrs++;
+    }
+
+    return attr;
+}
 
 /*
  * Local Variables:
index 500619f..5f56dfa 100644 (file)
@@ -119,6 +119,16 @@ const char *mrp_resource_get_name(mrp_resource_t *resource);
 mrp_resource_mask_t mrp_resource_get_mask(mrp_resource_t *resource);
 bool mrp_resource_is_shared(mrp_resource_t *resource);
 
+/* Find a resource set given the resource set id. */
+mrp_resource_set_t *mrp_resource_set_find_by_id(uint32_t id);
+
+/* Get a single attribute object that contains the current value. */
+mrp_attr_t *mrp_resource_set_get_attribute_by_name(
+        mrp_resource_set_t *resource_set, const char *resource_name,
+        const char *attribute_name);
+
+/* Free the object obtained with mrp_resource_set_get_attribute_by_name. */
+void mrp_resource_set_free_attribute(mrp_attr_t *attr);
 
 #endif  /* __MURPHY_RESOURCE_CLIENT_API_H__ */
 
index 4fd5252..9a8779b 100644 (file)
@@ -30,6 +30,8 @@
 #include <stdio.h>
 #include <string.h>
 
+#include <murphy/core/event.h>
+
 #include <murphy/common/mm.h>
 #include <murphy/common/hashtbl.h>
 #include <murphy/common/utils.h>
@@ -66,7 +68,8 @@ static mrp_resource_t *find_resource_by_id(mrp_resource_set_t *, uint32_t);
 
 static uint32_t get_request_stamp(void);
 static const char *state_str(mrp_resource_state_t);
-
+static void send_rset_event(mrp_resource_set_t *rset,
+        mrp_resource_event_t ev);
 
 uint32_t mrp_get_resource_set_count(void)
 {
@@ -96,7 +99,7 @@ mrp_resource_set_t *mrp_resource_set_create(mrp_resource_client_t *client,
 
         rset->dont_wait.current = dont_wait;
         rset->dont_wait.client  = dont_wait;
+
         rset->auto_release.current = auto_release;
         rset->auto_release.client  = auto_release;
 
@@ -119,6 +122,8 @@ mrp_resource_set_t *mrp_resource_set_create(mrp_resource_client_t *client,
 
         add_to_id_hash(rset);
         mrp_resource_lua_register_resource_set(rset);
+
+        send_rset_event(rset, MRP_RESOURCE_EVENT_CREATED);
     }
 
     return rset;
@@ -135,6 +140,8 @@ void mrp_resource_set_destroy(mrp_resource_set_t *rset)
 
         rset->event = NULL; /* make sure nothing is sent any more */
 
+        send_rset_event(rset, MRP_RESOURCE_EVENT_DESTROYED);
+
         mrp_resource_lua_unregister_resource_set(rset);
         remove_from_id_hash(rset);
 
@@ -392,6 +399,40 @@ void mrp_resource_set_updated(mrp_resource_set_t *rset)
     }
 }
 
+static void send_rset_event(mrp_resource_set_t *rset, mrp_resource_event_t ev)
+{
+    uint id;
+
+    MRP_ASSERT(rset, "invalid argument");
+
+    /* The resource set id is enough information, because the full resource
+     * set can be found by making a query with the id. */
+
+    uint16_t tag = MRP_RESOURCE_TAG_RSET_ID;
+
+    switch (ev) {
+        case MRP_RESOURCE_EVENT_CREATED:
+            id = mrp_get_event_id(MURPHY_RESOURCE_EVENT_CREATED, 0);
+            mrp_log_info("emit event %d for rset %u", id, rset->id);
+            mrp_emit_event(id, MRP_MSG_TAG_UINT32(tag, rset->id), MRP_MSG_END);
+            break;
+        case MRP_RESOURCE_EVENT_ACQUIRE:
+            id = mrp_get_event_id(MURPHY_RESOURCE_EVENT_ACQUIRE, 0);
+            mrp_emit_event(id, MRP_MSG_TAG_UINT32(tag, rset->id), MRP_MSG_END);
+            break;
+        case MRP_RESOURCE_EVENT_RELEASE:
+            id = mrp_get_event_id(MURPHY_RESOURCE_EVENT_RELEASE, 0);
+            mrp_emit_event(id, MRP_MSG_TAG_UINT32(tag, rset->id), MRP_MSG_END);
+            break;
+        case MRP_RESOURCE_EVENT_DESTROYED:
+            id = mrp_get_event_id(MURPHY_RESOURCE_EVENT_DESTROYED, 0);
+            mrp_emit_event(id, MRP_MSG_TAG_UINT32(tag, rset->id), MRP_MSG_END);
+            break;
+        default:
+            break;
+    }
+}
+
 void mrp_resource_set_notify(mrp_resource_set_t *rset, mrp_resource_event_t ev)
 {
     mrp_resource_t *res;
@@ -399,6 +440,8 @@ void mrp_resource_set_notify(mrp_resource_set_t *rset, mrp_resource_event_t ev)
 
     MRP_ASSERT(rset, "invalid argument");
 
+    send_rset_event(rset, ev);
+
     while ((res = mrp_resource_set_iterate_resources(rset, &cursor)))
         mrp_resource_notify(res, rset, ev);
 }
index 43d677f..b2780c7 100644 (file)
 
 #include "data-types.h"
 
+/* event protocol */
+
+#define MURPHY_RESOURCE_EVENT_CREATED   "resource_set_created"
+#define MURPHY_RESOURCE_EVENT_ACQUIRE   "resource_set_acquire"
+#define MURPHY_RESOURCE_EVENT_RELEASE   "resource_set_release"
+#define MURPHY_RESOURCE_EVENT_DESTROYED "resource_set_destroyed"
+
+#define MRP_RESOURCE_TAG_RSET_ID ((uint16_t) 1)
 
 struct mrp_resource_set_s {
     mrp_list_hook_t                 list;