WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-api

[Xen-API] [PATCH 14 of 21] CP-1846: add new api call vmpp.create_alert

To: xen-api <xen-api@xxxxxxxxxxxxxxxxxxx>
Subject: [Xen-API] [PATCH 14 of 21] CP-1846: add new api call vmpp.create_alert
From: Marcus Granado <marcus.granado@xxxxxxxxxx>
Date: Fri, 20 Aug 2010 17:52:33 +0100
Delivery-date: Fri, 20 Aug 2010 10:43:36 -0700
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
In-reply-to: <patchbomb.1282323139@localhost>
List-help: <mailto:xen-api-request@lists.xensource.com?subject=help>
List-id: Discussion of API issues surrounding Xen <xen-api.lists.xensource.com>
List-post: <mailto:xen-api@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/mailman/listinfo/xen-api>, <mailto:xen-api-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/mailman/listinfo/xen-api>, <mailto:xen-api-request@lists.xensource.com?subject=unsubscribe>
References: <patchbomb.1282323139@localhost>
Sender: xen-api-bounces@xxxxxxxxxxxxxxxxxxx
User-agent: Mercurial-patchbomb/1.4.3
 ocaml/idl/datamodel.ml                |  16 +++++++-
 ocaml/idl/ocaml_backend/rbac_audit.ml |   1 +
 ocaml/xapi/xapi_vmpp.ml               |  73 +++++++++++++++++++++++++++-------
 3 files changed, 74 insertions(+), 16 deletions(-)


# HG changeset patch
# User Marcus Granado <marcus.granado@xxxxxxxxxx>
# Date 1282322886 -3600
# Node ID c1fbbbc4f64defb66c6e6bdfafd734daf295b8ee
# Parent  69e3ee3fb691d14532504fa5014451a9fad58be6
CP-1846: add new api call vmpp.create_alert

Signed-off-by: Marcus Granado <marcus.granado@xxxxxxxxxxxxx>

diff -r 69e3ee3fb691 -r c1fbbbc4f64d ocaml/idl/datamodel.ml
--- a/ocaml/idl/datamodel.ml
+++ b/ocaml/idl/datamodel.ml
@@ -5875,12 +5875,25 @@
   ~allowed_roles:_R_VM_POWER_ADMIN
   ~result:(String, "An XMLRPC result")
   ()
+let vmpp_create_alert = call ~flags:[`Session]
+  ~name:"create_alert"
+  ~in_oss_since:None
+  ~in_product_since:rel_cowley
+  ~params:[Ref _vmpp, "vmpp", "The protection policy where the alert should be 
created";
+     String, "name", "The name of the message";
+          Int, "priority", "The priority of the message";
+          String, "body", "The body of the message";
+  ]
+  ~doc:"This call creates an alert for some protection policy"
+  ~allowed_roles:_R_LOCAL_ROOT_ONLY
+  ~hide_from_docs:true
+  ()
 let vmpp_get_alerts = call ~flags:[`Session]
   ~name:"get_alerts"
   ~in_oss_since:None
   ~in_product_since:rel_cowley
   ~params:[Ref _vmpp, "vmpp", "The protection policy";
-    DateTime, "since", "oldest record to fetch";
+    Int, "hours_from_now", "how many hours in the past the oldest record to 
fetch is";
   ]
   ~doc:"This call fetches a history of alerts for a given protection policy"
   ~allowed_roles:_R_POOL_OP
@@ -6116,6 +6129,7 @@
     ~messages:[
       vmpp_protect_now;
       vmpp_archive_now;
+      vmpp_create_alert;
       vmpp_get_alerts;
       vmpp_set_is_backup_running;
       vmpp_set_is_archive_running;
diff -r 69e3ee3fb691 -r c1fbbbc4f64d ocaml/idl/ocaml_backend/rbac_audit.ml
--- a/ocaml/idl/ocaml_backend/rbac_audit.ml
+++ b/ocaml/idl/ocaml_backend/rbac_audit.ml
@@ -199,6 +199,7 @@
                ("subject.create.other_config",["subject-name"]);
     (* used for VMPP alert logs *)
     ("message.create",["name";"body"]);
+    ("VMPP.create_alert",["name";"body"]);
        ]
 
 (* manual ref getters *)
diff -r 69e3ee3fb691 -r c1fbbbc4f64d ocaml/xapi/xapi_vmpp.ml
--- a/ocaml/xapi/xapi_vmpp.ml
+++ b/ocaml/xapi/xapi_vmpp.ml
@@ -35,15 +35,68 @@
     "archive_now"
     args
 
-let add_alert ~__context ~vmpp ~name ~priority ~body =
-  ()
+let add_to_recent_alerts ~__context ~vmpp ~value =
+  let recent_alerts = value ::
+    (Db.VMPP.get_recent_alerts ~__context ~self:vmpp)
+  in
+  (* keep up to 10 elements in the set *)
+  let rec trunc i alerts =
+    if i<1 then []   
+    else match alerts with [] -> []|x::xs -> x::(trunc (i-1) xs)
+  in
+  Db.VMPP.set_recent_alerts ~__context ~self:vmpp
+               ~value:(trunc 10 recent_alerts)
 
-let get_alerts ~__context ~vmpp ~since =
+let inside_data_tag str =
+  let tag_begin="<data>" and tag_end="</data>" in
+  let tag_begin_idx=try List.hd (Stringext.String.find_all tag_begin str) with 
_-> -1 in
+  let tag_end_idx=try List.hd (List.rev (Stringext.String.find_all tag_end 
str)) with _-> -1 in
+  try
+    let start=(tag_begin_idx+(String.length tag_begin)) in
+    let len=tag_end_idx - start in
+    Some (String.sub str start len)
+  with _->None
+
+(*
+let add_alert_to_audit_log ~__context ~vmpp ~name ~priority ~body =
+  let session_id=Context.get_session_id __context in
+  let action="message.create" in
+  let permission=action in
+  let uuid = Db.VMPP.get_uuid ~__context ~self:vmpp in
+  let name_label = Db.VMPP.get_name_label ~__context ~self:vmpp in
+  let s_name = Rbac_audit.get_sexpr_arg "name" name "" "" in
+  let s_obj_uuid = Rbac_audit.get_sexpr_arg "obj_uuid" name_label uuid 
(Ref.string_of vmpp) in
+  let s_body = Rbac_audit.get_sexpr_arg "body" body "" "" in
+  let sexpr_of_args = s_name::s_obj_uuid::s_body::[] in
+  Rbac_audit.allowed_post_fn_ok ~__context ~session_id ~action ~permission 
~sexpr_of_args ()
+*)
+
+let create_alert ~__context ~vmpp ~name ~priority ~body =
+  match inside_data_tag body with
+  | None ->
+               debug "invalid body: %s" body
+  | Some value ->
+  let successful = priority < 5L in
+  if successful
+  then ( (* alert indicates a vmpp success *)
+               add_to_recent_alerts ~__context ~vmpp ~value;
+    (*add_alert_to_audit_log ~__context ~vmpp ~name ~priority ~body*)
+  )
+  else ( (* alert indicates a vmpp failure *)
+    add_to_recent_alerts ~__context ~vmpp ~value;
+    let cls = `VMPP in
+    let obj_uuid = Db.VMPP.get_uuid ~__context ~self:vmpp in
+    Xapi_message.create ~__context ~name ~priority ~cls ~obj_uuid ~body;
+    ()
+  )
+
+let get_alerts ~__context ~vmpp ~hours_from_now =
   let vmpp_uuid = Db.VMPP.get_uuid ~__context ~self:vmpp in
-  let filter=["unix-RPC|message.create";vmpr_username;vmpp_uuid] in
+  let filter=["unix-RPC|VMPP.create_alert";vmpr_username;vmpp_uuid] in
   let tmp_filename = Filename.temp_file "vmpp-alerts-" ".dat" in
   let fd = Unix.openfile tmp_filename [Unix.O_RDWR] 0o600 in
-  let since = Date.to_string since in
+  let now = (Unix.time ()) in
+  let since = Date.to_string (Date.of_float (now -. ( (Int64.to_float 
hours_from_now) *. 3600.0))) in
   let messages=Audit_log.transfer_all_audit_files fd ~filter since in
   let cout = Unix.out_channel_of_descr fd in
   flush cout;
@@ -85,16 +138,6 @@
        ) lines
   in
   let alerts = List.fold_right (fun a acc->match a with None->acc|Some 
a->a::acc) alerts [] in
-  let inside_data_tag str =
-    let tag_begin="<data>" and tag_end="</data>" in
-    let tag_begin_idx=try List.hd (Stringext.String.find_all tag_begin str) 
with _-> -1 in
-    let tag_end_idx=try List.hd (List.rev (Stringext.String.find_all tag_end 
str)) with _-> -1 in
-    try
-      let start=(tag_begin_idx+(String.length tag_begin)) in
-      let len=tag_end_idx - start in
-      Some (String.sub str start len)
-    with _->None
-  in
   let alerts = List.fold_right (fun a acc->if List.mem_assoc "body" a then 
(let data=inside_data_tag(List.assoc "body" a) in match data with 
None->acc|Some data->data::acc) else acc) alerts [] in
   alerts
 

Attachment: xen-api.hg-14.patch
Description: Text Data

_______________________________________________
xen-api mailing list
xen-api@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/mailman/listinfo/xen-api