[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-API] [PATCH] Add CPUID features whitelisting foor Pool.join.


  • To: xen-api <xen-api@xxxxxxxxxxxxxxxxxxx>
  • From: Rob Hoes <rob.hoes@xxxxxxxxxx>
  • Date: Fri, 19 Mar 2010 10:09:46 +0000
  • Delivery-date: Fri, 19 Mar 2010 03:09:49 -0700
  • List-id: Discussion of API issues surrounding Xen <xen-api.lists.xensource.com>

# HG changeset patch
# User Rob Hoes <rob.hoes@xxxxxxxxxx>
Add CPUID features whitelisting foor Pool.join.

This allows the user to exclude CPUID features from the Pool.join checks by 
setting a mask in Pool.other_config:cpuid_feature_mask. When comparing the 
CPUID features of the pool and the joining host for equality, this mask is 
applied before the comparison. The format is the same as the format of the 
feature field in Host.cpu_info. The default is 
"ffffff7f-ffffffff-ffffffff-ffffffff", which defines the EST feature, bit 7 of 
the base ecx flags, as "don't care".

Signed-off-by: Rob Hoes <rob.hoes@xxxxxxxxxx>

diff -r e7fc4836cce5 ocaml/xapi/dbsync_master.ml
--- a/ocaml/xapi/dbsync_master.ml       Wed Mar 17 11:07:36 2010 +0000
+++ b/ocaml/xapi/dbsync_master.ml       Fri Mar 19 09:59:15 2010 +0000
@@ -59,6 +59,15 @@
 let set_master_pool_reference ~__context =
   let pool = List.hd (Db.Pool.get_all ~__context) in
     Db.Pool.set_master ~__context ~self:pool ~value:(Helpers.get_localhost 
~__context) 
+    
+let set_pool_defaults ~__context =
+       (* If Pool.other_config has no cpuid_feature_mask_key yet, fill in the 
default. *)
+       let pool = List.hd (Db.Pool.get_all ~__context) in
+       let other_config = Db.Pool.get_other_config ~__context ~self:pool in
+       if not (List.mem_assoc Xapi_globs.cpuid_feature_mask_key other_config) 
then
+               Db.Pool.add_to_other_config ~__context ~self:pool
+                       ~key:Xapi_globs.cpuid_feature_mask_key
+                       ~value:Xapi_globs.cpuid_default_feature_mask
 
 (** Look at all running VMs, examine their consoles and regenerate the console 
URLs.
     This catches the case where the IP address changes but the URLs still 
point to the wrong
@@ -223,6 +232,7 @@
   set_master_pool_reference ~__context;
   set_master_ip ~__context;
   set_master_live ~__context;
+  set_pool_defaults ~__context;
 
   (* CA-15449: when we restore from backup we end up with Hosts being 
forgotten and VMs
      marked as running with dangling resident_on references. We delete the 
control domains
diff -r e7fc4836cce5 ocaml/xapi/xapi_globs.ml
--- a/ocaml/xapi/xapi_globs.ml  Wed Mar 17 11:07:36 2010 +0000
+++ b/ocaml/xapi/xapi_globs.ml  Fri Mar 19 09:59:15 2010 +0000
@@ -603,3 +603,12 @@
 
 let permanent_master_failure_retry_timeout = 5. *. 60. (* 5 minutes *)
 
+(** {2 CPUID feature masking} *)
+
+(** Pool.other_config key to hold the user-defined feature mask, used to
+ *  override the feature equality checks at a Pool.join. *)
+let cpuid_feature_mask_key = "cpuid_feature_mask"
+
+(** Default feature mask: EST (base_ecx.7) is ignored. *)
+let cpuid_default_feature_mask = "ffffff7f-ffffffff-ffffffff-ffffffff"
+
diff -r e7fc4836cce5 ocaml/xapi/xapi_pool.ml
--- a/ocaml/xapi/xapi_pool.ml   Wed Mar 17 11:07:36 2010 +0000
+++ b/ocaml/xapi/xapi_pool.ml   Fri Mar 19 09:59:15 2010 +0000
@@ -37,7 +37,7 @@
 let get_master ~rpc ~session_id =
        let pool = List.hd (Client.Pool.get_all rpc session_id) in
        Client.Pool.get_master rpc session_id pool
-
+       
 (* Pre-join asserts *)
 let pre_join_checks ~__context ~rpc ~session_id ~force =
        (* I cannot join a Pool if I have HA already enabled on me *)
@@ -178,9 +178,6 @@
                
                let my_software_compare = get_software_version_fields 
my_software_version in
                let master_software_compare = get_software_version_fields 
master_software_version in
-               
-               if my_software_compare <> master_software_compare then
-                       raise 
(Api_errors.Server_error(Api_errors.pool_hosts_not_homogeneous,["software 
version differs"]));
 
                debug "Pool pre-join Software homogeneity check:";
                debug "Slave software:";
@@ -188,25 +185,51 @@
                debug "Master software:";
                print_software_version master_software_compare;
                
+               if my_software_compare <> master_software_compare then
+                       raise 
(Api_errors.Server_error(Api_errors.pool_hosts_not_homogeneous,["software 
version differs"]));
+               
                (* Check CPUs *)
                
                let master_cpu_info = master.API.host_cpu_info in
                let my_cpu_info = Db.Host.get_cpu_info ~__context ~self:me in
-               
+               let pool_other_config = 
+                       let pool = List.hd (Client.Pool.get_all rpc session_id) 
in
+                       Client.Pool.get_other_config rpc session_id pool
+               in
+               let mask =
+                       try
+                               let features = List.assoc 
Xapi_globs.cpuid_feature_mask_key pool_other_config in
+                               Some (Cpuid.string_to_features features)
+                       with _ -> None
+               in
                let get_comparable_fields cpu_info =
-                       List.assoc "vendor" cpu_info, List.assoc "features" 
cpu_info in
+                       List.assoc "vendor" cpu_info,
+                       let features = List.assoc "features" cpu_info in
+                       match mask with
+                       | None -> features
+                       | Some mask ->
+                               let features = Cpuid.string_to_features 
features in
+                               let relevant_features = Cpuid.mask_features 
features mask in
+                               Cpuid.features_to_string relevant_features
+               in
                let my_cpus_compare = get_comparable_fields my_cpu_info in
                let master_cpus_compare = get_comparable_fields master_cpu_info 
in
 
-               let print_cpu (vendor, features) = debug "%s, %s" vendor 
features in
+               let print_cpu cpu = debug "%s, %s"
+                       (List.assoc "vendor" cpu) (List.assoc "features" cpu) in
                debug "Pool pre-join CPU homogeneity check:";
-               debug "Slave cpus:";
-               print_cpu my_cpus_compare;
-               debug "Master cpus:";
-               print_cpu master_cpus_compare;
+               debug "Slave CPUs:";
+               print_cpu my_cpu_info;
+               debug "Master CPUs:";
+               print_cpu master_cpu_info;
+               begin match mask with
+               | Some mask ->
+                       debug "User-defined feature mask on pool: %s" 
(Cpuid.features_to_string mask)
+               | None -> ()
+               end;
 
                if my_cpus_compare <> master_cpus_compare then
-                       raise 
(Api_errors.Server_error(Api_errors.pool_hosts_not_homogeneous,["cpus 
differ"])) in
+                       raise 
(Api_errors.Server_error(Api_errors.pool_hosts_not_homogeneous,["CPUs 
differ"])) in
 
        let assert_not_joining_myself () =
                let master = get_master rpc session_id in

Attachment: pool-join-whitelist
Description: Text document

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

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.