# HG changeset patch # User Rob Hoes CP-1632: Add restrictions option for Heterogeneous Pools feature Plus some cleanup of the restrictions file. Signed-off-by: Rob Hoes diff -r 93602fe9a6ba ocaml/license/restrictions.ml --- a/ocaml/license/restrictions.ml Fri Feb 05 09:53:59 2010 +0000 +++ b/ocaml/license/restrictions.ml Fri Feb 05 10:00:20 2010 +0000 @@ -1,5 +1,5 @@ (* - * Copyright (C) 2006-2009 Citrix Systems Inc. + * Copyright (C) 2006-2010 Citrix Systems Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published @@ -55,6 +55,7 @@ enable_dmc : bool; enable_checkpoint : bool; enable_vswitch_controller : bool; + enable_cpu_masking : bool; restrict_connection : bool; platform_filter : bool; regular_nag_dialog : bool; @@ -76,8 +77,9 @@ "WLB" , x.enable_wlb ; "RBAC" , x.enable_rbac ; "DMC" , x.enable_dmc ; + "chpt" , x.enable_checkpoint ; "DVSC" , x.enable_vswitch_controller; - "chpt" , x.enable_checkpoint ; + "Mask" , x.enable_cpu_masking; "Cnx" , not x.restrict_connection ; "Plat" , not x.platform_filter ; "nag" , x.regular_nag_dialog ; @@ -103,6 +105,7 @@ enable_dmc = true; enable_checkpoint = true; enable_vswitch_controller = true; + enable_cpu_masking = true; restrict_connection = false; platform_filter = false; regular_nag_dialog = false; @@ -126,6 +129,7 @@ enable_dmc = a.enable_dmc && b.enable_dmc; enable_checkpoint = a.enable_checkpoint && b.enable_checkpoint; enable_vswitch_controller = a.enable_vswitch_controller && b.enable_vswitch_controller; + enable_cpu_masking = a.enable_cpu_masking && b.enable_cpu_masking; restrict_connection = a.restrict_connection || b.restrict_connection; platform_filter = a.platform_filter || b.platform_filter; regular_nag_dialog = a.regular_nag_dialog || b.regular_nag_dialog; @@ -135,10 +139,10 @@ (* Returns true if the pool SKUs are 'floodgate free' (ie if any are express *) let pool_is_floodgate_free_of_list (license_params: ((string * string) list) list) = - (* Some of the license_params might be malformed due to initial startup glitches *) - let valid = List.filter (fun license_params -> try ignore(License.of_assoc_list license_params); true with _ -> false) license_params in - let licenses = List.map License.of_assoc_list license_params in - List.fold_left (||) false (List.map (fun x -> is_floodgate_free (sku_of_string x.License.sku)) licenses) + (* Some of the license_params might be malformed due to initial startup glitches *) + let valid = List.filter (fun license_params -> try ignore(License.of_assoc_list license_params); true with _ -> false) license_params in + let licenses = List.map License.of_assoc_list license_params in + List.fold_left (||) false (List.map (fun x -> is_floodgate_free (sku_of_string x.License.sku)) licenses) let _restrict_connection = "restrict_connection" let _restrict_pooling = "restrict_pooling" @@ -157,103 +161,108 @@ let _restrict_dmc = "restrict_dmc" let _restrict_checkpoint = "restrict_checkpoint" let _restrict_vswitch_controller = "restrict_vswitch_controller" +let _restrict_cpu_masking = "restrict_cpu_masking" let _regular_nag_dialog = "regular_nag_dialog" let to_assoc_list (x: restrictions) = - [ (_restrict_connection,string_of_bool x.restrict_connection); - (_restrict_pooling,string_of_bool (not x.enable_pooling)); - (_restrict_qos,string_of_bool (not x.enable_qos)); - (_restrict_pool_attached_storage,string_of_bool (not x.enable_shared_storage)); - (_restrict_netapp, string_of_bool (not x.enable_netapp)); - (_restrict_equalogic, string_of_bool (not x.enable_equalogic)); - (_restrict_vlan,string_of_bool (not x.enable_vlans)); - (_enable_xha, string_of_bool (x.enable_xha)); - (_restrict_marathon, string_of_bool (not x.enable_mtc_pci)); - (_platform_filter, string_of_bool x.platform_filter); - (_restrict_email_alerting, string_of_bool (not x.enable_email)); - (_restrict_historical_performance, string_of_bool (not x.enable_performance)); - (_restrict_wlb, string_of_bool (not x.enable_wlb)); - (_restrict_rbac, string_of_bool (not x.enable_rbac)); - (_restrict_dmc, string_of_bool (not x.enable_dmc )); - (_restrict_checkpoint, string_of_bool (not x.enable_checkpoint )); - (_restrict_vswitch_controller, string_of_bool (not x.enable_vswitch_controller )); - (_regular_nag_dialog, string_of_bool x.regular_nag_dialog); - ] + [ (_restrict_connection,string_of_bool x.restrict_connection); + (_restrict_pooling,string_of_bool (not x.enable_pooling)); + (_restrict_qos,string_of_bool (not x.enable_qos)); + (_restrict_pool_attached_storage,string_of_bool (not x.enable_shared_storage)); + (_restrict_netapp, string_of_bool (not x.enable_netapp)); + (_restrict_equalogic, string_of_bool (not x.enable_equalogic)); + (_restrict_vlan,string_of_bool (not x.enable_vlans)); + (_enable_xha, string_of_bool (x.enable_xha)); + (_restrict_marathon, string_of_bool (not x.enable_mtc_pci)); + (_platform_filter, string_of_bool x.platform_filter); + (_restrict_email_alerting, string_of_bool (not x.enable_email)); + (_restrict_historical_performance, string_of_bool (not x.enable_performance)); + (_restrict_wlb, string_of_bool (not x.enable_wlb)); + (_restrict_rbac, string_of_bool (not x.enable_rbac)); + (_restrict_dmc, string_of_bool (not x.enable_dmc )); + (_restrict_checkpoint, string_of_bool (not x.enable_checkpoint )); + (_restrict_vswitch_controller, string_of_bool (not x.enable_vswitch_controller )); + (_restrict_cpu_masking, string_of_bool (not x.enable_cpu_masking )); + (_regular_nag_dialog, string_of_bool x.regular_nag_dialog); + ] (* Read an association list possibly generated by a slave running a previous version and hence possibly missing some values. In the case where a value is missing we default to the most_permissive. *) let of_assoc_list x = - let find fn key = if List.mem_assoc key x then Some (fn (List.assoc key x)) else None in - { - enable_vlans = Opt.default most_permissive.enable_vlans (Opt.map not (find bool_of_string _restrict_vlan)); - enable_qos = Opt.default most_permissive.enable_qos (Opt.map not (find bool_of_string _restrict_qos)); - enable_shared_storage = Opt.default most_permissive.enable_shared_storage (Opt.map not (find bool_of_string _restrict_pool_attached_storage)); - enable_netapp = Opt.default most_permissive.enable_netapp (Opt.map not (find bool_of_string _restrict_netapp)); - enable_equalogic = Opt.default most_permissive.enable_equalogic (Opt.map not (find bool_of_string _restrict_equalogic)); - enable_pooling = Opt.default most_permissive.enable_pooling (Opt.map not (find bool_of_string _restrict_pooling)); - enable_xha = Opt.default most_permissive.enable_xha (find bool_of_string _enable_xha); - enable_mtc_pci = Opt.default most_permissive.enable_mtc_pci (Opt.map not (find bool_of_string _restrict_marathon)); - restrict_connection = Opt.default most_permissive.restrict_connection (find bool_of_string _restrict_connection); - platform_filter = Opt.default most_permissive.platform_filter (find bool_of_string _platform_filter); - enable_email = Opt.default most_permissive.enable_email (Opt.map not (find bool_of_string _restrict_email_alerting)); - enable_performance = Opt.default most_permissive.enable_performance (Opt.map not (find bool_of_string _restrict_historical_performance)); - enable_wlb = Opt.default most_permissive.enable_wlb (Opt.map not (find bool_of_string _restrict_wlb)); - enable_rbac = Opt.default most_permissive.enable_rbac (Opt.map not (find bool_of_string _restrict_rbac)); - enable_dmc = Opt.default most_permissive.enable_dmc (Opt.map not (find bool_of_string _restrict_dmc)); - enable_checkpoint = Opt.default most_permissive.enable_checkpoint (Opt.map not (find bool_of_string _restrict_dmc)); - enable_vswitch_controller = Opt.default most_permissive.enable_dmc (Opt.map not (find bool_of_string _restrict_vswitch_controller)); - regular_nag_dialog = Opt.default most_permissive.regular_nag_dialog (find bool_of_string _regular_nag_dialog); - } + let find fn key = if List.mem_assoc key x then Some (fn (List.assoc key x)) else None in + { + enable_vlans = Opt.default most_permissive.enable_vlans (Opt.map not (find bool_of_string _restrict_vlan)); + enable_qos = Opt.default most_permissive.enable_qos (Opt.map not (find bool_of_string _restrict_qos)); + enable_shared_storage = Opt.default most_permissive.enable_shared_storage (Opt.map not (find bool_of_string _restrict_pool_attached_storage)); + enable_netapp = Opt.default most_permissive.enable_netapp (Opt.map not (find bool_of_string _restrict_netapp)); + enable_equalogic = Opt.default most_permissive.enable_equalogic (Opt.map not (find bool_of_string _restrict_equalogic)); + enable_pooling = Opt.default most_permissive.enable_pooling (Opt.map not (find bool_of_string _restrict_pooling)); + enable_xha = Opt.default most_permissive.enable_xha (find bool_of_string _enable_xha); + enable_mtc_pci = Opt.default most_permissive.enable_mtc_pci (Opt.map not (find bool_of_string _restrict_marathon)); + restrict_connection = Opt.default most_permissive.restrict_connection (find bool_of_string _restrict_connection); + platform_filter = Opt.default most_permissive.platform_filter (find bool_of_string _platform_filter); + enable_email = Opt.default most_permissive.enable_email (Opt.map not (find bool_of_string _restrict_email_alerting)); + enable_performance = Opt.default most_permissive.enable_performance (Opt.map not (find bool_of_string _restrict_historical_performance)); + enable_wlb = Opt.default most_permissive.enable_wlb (Opt.map not (find bool_of_string _restrict_wlb)); + enable_rbac = Opt.default most_permissive.enable_rbac (Opt.map not (find bool_of_string _restrict_rbac)); + enable_dmc = Opt.default most_permissive.enable_dmc (Opt.map not (find bool_of_string _restrict_dmc)); + enable_checkpoint = Opt.default most_permissive.enable_checkpoint (Opt.map not (find bool_of_string _restrict_dmc)); + enable_vswitch_controller = Opt.default most_permissive.enable_vswitch_controller (Opt.map not (find bool_of_string _restrict_vswitch_controller)); + enable_cpu_masking = Opt.default most_permissive.enable_cpu_masking (Opt.map not (find bool_of_string _restrict_cpu_masking)); + regular_nag_dialog = Opt.default most_permissive.regular_nag_dialog (find bool_of_string _regular_nag_dialog); + } (* Encodes the minimum set of restrictions available in all SKUs (ie FG-Free and FG-PaidFor) *) let common_to_all_skus = - { - enable_vlans = true; - enable_qos = true; - enable_shared_storage = true; - enable_netapp = false; - enable_equalogic = false; - enable_pooling = true; - enable_xha = false; - enable_mtc_pci = true; - restrict_connection = false; - platform_filter = true; - enable_email = false; - enable_performance = false; - enable_wlb = false; - enable_rbac = false; - enable_dmc = false; - enable_checkpoint = false; - enable_vswitch_controller = false; - regular_nag_dialog = true; - } + { + enable_vlans = true; + enable_qos = true; + enable_shared_storage = true; + enable_netapp = false; + enable_equalogic = false; + enable_pooling = true; + enable_xha = false; + enable_mtc_pci = true; + restrict_connection = false; + platform_filter = true; + enable_email = false; + enable_performance = false; + enable_wlb = false; + enable_rbac = false; + enable_dmc = false; + enable_checkpoint = false; + enable_vswitch_controller = false; + enable_cpu_masking = false; + regular_nag_dialog = true; + } let get_sku () = sku_of_string !License.license.License.sku let get_sku_from_license l = sku_of_string l.sku let rec restrictions_of_sku = function -| Express -> common_to_all_skus -| Enterprise -> - { - common_to_all_skus with - enable_xha = true; - platform_filter = false; - enable_netapp = true; - enable_equalogic = true; - enable_email = true; - enable_performance = true; - enable_wlb = true; - enable_rbac = true; - enable_dmc = true; - enable_checkpoint = true; - enable_vswitch_controller = true; - regular_nag_dialog = false; - } + | Express -> common_to_all_skus + | Enterprise -> + { + common_to_all_skus with + enable_xha = true; + platform_filter = false; + enable_netapp = true; + enable_equalogic = true; + enable_email = true; + enable_performance = true; + enable_wlb = true; + enable_rbac = true; + enable_dmc = true; + enable_checkpoint = true; + enable_vswitch_controller = true; + enable_cpu_masking = true; + regular_nag_dialog = false; + } let get () = - restrictions_of_sku (get_sku ()) + restrictions_of_sku (get_sku ()) (* Cache of pool restrictions, always updated at least once when the master reads its license *) let pool_restrictions = ref most_permissive @@ -262,30 +271,33 @@ let get_pool () = Mutex.execute pool_restrictions_m (fun () -> !pool_restrictions) let update_pool_restrictions ~__context = - Mutex.execute pool_restrictions_m - (fun () -> - let hosts = List.map (fun (_, host_r) -> host_r.API.host_license_params) (Db.Host.get_all_records ~__context) in - let new_restrictions = pool_restrictions_of_list (List.map of_assoc_list hosts) in - if new_restrictions <> !pool_restrictions then begin - info "Old pool restrictions: %s" (to_compact_string !pool_restrictions); - info "New pool restrictions: %s" (to_compact_string new_restrictions); - pool_restrictions := new_restrictions - end; - let pool = List.hd (Db.Pool.get_all ~__context) in - Db.Pool.set_restrictions ~__context ~self:pool ~value:(to_assoc_list new_restrictions) - ) + Mutex.execute pool_restrictions_m (fun () -> + let hosts = List.map (fun (_, host_r) -> host_r.API.host_license_params) (Db.Host.get_all_records ~__context) in + let new_restrictions = pool_restrictions_of_list (List.map of_assoc_list hosts) in + if new_restrictions <> !pool_restrictions then begin + info "Old pool restrictions: %s" (to_compact_string !pool_restrictions); + info "New pool restrictions: %s" (to_compact_string new_restrictions); + pool_restrictions := new_restrictions + end; + let pool = List.hd (Db.Pool.get_all ~__context) in + Db.Pool.set_restrictions ~__context ~self:pool ~value:(to_assoc_list new_restrictions) + ) let license_ok_for_wlb ~__context = - (get_pool()).enable_wlb + (get_pool()).enable_wlb let license_ok_for_rbac ~__context = - (get_pool()).enable_rbac - + (get_pool()).enable_rbac + let context_ok_for_dmc ~__context = - (get_pool()).enable_dmc + (get_pool()).enable_dmc let ok_for_checkpoint () = (get_pool()).enable_checkpoint -let license_ok_for_vswitch_controller ~__context = - (get_pool()).enable_vswitch_controller +let ok_for_vswitch_controller () = + (get_pool()).enable_vswitch_controller + +let ok_for_cpu_masking () = + (get_pool()).enable_cpu_masking + diff -r 93602fe9a6ba ocaml/license/restrictions.mli --- a/ocaml/license/restrictions.mli Fri Feb 05 09:53:59 2010 +0000 +++ b/ocaml/license/restrictions.mli Fri Feb 05 10:00:20 2010 +0000 @@ -48,6 +48,7 @@ enable_dmc : bool; (** enable Dynamic Memory Control (DMC) *) enable_checkpoint : bool; (** enable Checkpoint *) enable_vswitch_controller : bool; (** enable use of a Distributed VSwitch (DVS) Controller *) + enable_cpu_masking : bool; (** enable masking of CPU features *) restrict_connection : bool; (** not used anymore; perhaps XenCenter does? *) platform_filter : bool; (** filter platform data on domain create? *) regular_nag_dialog : bool; (** used by XenCenter *) @@ -91,3 +92,10 @@ (** Checks whether we are entitled to enable checkpoint *) val ok_for_checkpoint : unit -> bool + +(** Checks whether we are entitled to use a VSwitch Controller *) +val ok_for_vswitch_controller : unit -> bool + +(** Checks whether we are entitled to mask CPU features *) +val ok_for_cpu_masking : unit -> bool +