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

[Xen-API] [PATCH] add a first-class field for a vswitch controller



# HG changeset patch
# User Thomas Gazagnaire <thomas.gazagnaire@xxxxxxxxxx>
# Date 1265237162 0
# Node ID d8aa1b08fa3288a638936a19835a0e7b6aa33dff
# Parent  abcc76c21160383f68ea0ee576bb4ecdf2d0be9a
CP-1158: Add a pool first-class field for the nicera vswitch controller address.

This field is checked by xapi to be consistent on pool-join, and it is cleared 
by the plugin on pool-eject.
To set it: xe pool-set-vswitch-controller address=<IP address>

Seems to work on my limited dev-tests, need to make more tests later.

Signed-off-by: Ian Campbell <ian.campbell@xxxxxxxxxx>

diff -r abcc76c21160 -r d8aa1b08fa32 ocaml/client_records/records.ml
--- a/ocaml/client_records/records.ml   Wed Feb 03 22:43:37 2010 +0000
+++ b/ocaml/client_records/records.ml   Wed Feb 03 22:46:02 2010 +0000
@@ -410,6 +410,7 @@
     ~remove_from_map:(fun k -> Client.Pool.remove_from_gui_config rpc 
session_id pool k)
     ~get_map:(fun () -> (x ()).API.pool_gui_config)
     ~expensive:true ();
+  make_field ~name:"vswitch-controller" ~hidden:true ~get:(fun () -> let r = 
(x ()).API.pool_vswitch_controller in if r = "" then "<not set>" else r) ()
 ]}
 
 let subject_record rpc session_id subject = 
diff -r abcc76c21160 -r d8aa1b08fa32 ocaml/idl/datamodel.ml
--- a/ocaml/idl/datamodel.ml    Wed Feb 03 22:43:37 2010 +0000
+++ b/ocaml/idl/datamodel.ml    Wed Feb 03 22:46:02 2010 +0000
@@ -18,7 +18,7 @@
 (* IMPORTANT: Please bump schema vsn if you change/add/remove a _field_.
               You do not have to bump vsn if you change/add/remove a message *)
 let schema_major_vsn = 5
-let schema_minor_vsn = 59
+let schema_minor_vsn = 60
 
 (* Historical schema versions just in case this is useful later *)
 let rio_schema_major_vsn = 5
@@ -4987,6 +4987,15 @@
        ~allowed_roles:_R_POOL_ADMIN
        ()
 
+let pool_set_vswitch_controller = call
+  ~in_oss_since:None
+  ~in_product_since:rel_midnight_ride
+  ~name:"set_vswitch_controller"
+  ~params:[String, "address", "IP address of the vswitch controller."]
+  ~doc:"Set the IP address of the vswitch controller."
+  ~allowed_roles:_R_POOL_OP
+  ()
+
 (** A pool class *)
 let pool =
        create_obj
@@ -5047,6 +5056,7 @@
                        ; pool_enable_redo_log
                        ; pool_disable_redo_log
                        ; pool_audit_log_append
+                       ; pool_set_vswitch_controller
                        ]
                ~contents:
                        [uid ~in_oss_since:None _pool
@@ -5074,6 +5084,7 @@
                        ; field ~in_product_since:rel_george ~qualifier:RW 
~ty:Bool ~default_value:(Some (VBool false)) "wlb_verify_cert" "true if 
communication with the WLB server should enforce SSL certificate verification."
                        ; field ~in_oss_since:None 
~in_product_since:rel_midnight_ride ~qualifier:DynamicRO ~ty:Bool 
~default_value:(Some (VBool false)) "redo_log_enabled" "true a redo-log is to 
be used other than when HA is enabled, false otherwise"
                        ; field ~in_oss_since:None 
~in_product_since:rel_midnight_ride ~qualifier:DynamicRO ~ty:(Ref _vdi) 
~default_value:(Some (VRef (Ref.string_of Ref.null))) "redo_log_vdi" "indicates 
the VDI to use for the redo-log other than when HA is enabled"
+                       ; field ~in_oss_since:None 
~in_product_since:rel_midnight_ride ~qualifier:DynamicRO ~ty:String 
~default_value:(Some (VString "")) "vswitch_controller" "address of the vswitch 
controller"
                        ]
                ()
 
diff -r abcc76c21160 -r d8aa1b08fa32 ocaml/xapi/cli_frontend.ml
--- a/ocaml/xapi/cli_frontend.ml        Wed Feb 03 22:43:37 2010 +0000
+++ b/ocaml/xapi/cli_frontend.ml        Wed Feb 03 22:46:02 2010 +0000
@@ -387,6 +387,15 @@
       flags=[];
     };
     
+   "pool-set-vswitch-controller",
+   {
+      reqd=["address"];
+      optn=[];
+      help="Set the IP address of the vswitch controller.";
+      implementation= No_fd Cli_operations.pool_set_vswitch_controller;
+      flags=[Hidden];
+   };
+   
    "host-is-in-emergency-mode",
     {
       reqd=[];
diff -r abcc76c21160 -r d8aa1b08fa32 ocaml/xapi/cli_operations.ml
--- a/ocaml/xapi/cli_operations.ml      Wed Feb 03 22:43:37 2010 +0000
+++ b/ocaml/xapi/cli_operations.ml      Wed Feb 03 22:46:02 2010 +0000
@@ -974,6 +974,10 @@
 let pool_disable_redo_log printer rpc session_id params =
   Client.Pool.disable_redo_log ~rpc ~session_id
        
+let pool_set_vswitch_controller printer rpc session_id params =
+       let address = List.assoc "address" params in
+       Client.Pool.set_vswitch_controller ~rpc ~session_id ~address
+
 let vdi_type_of_string = function
     | "system" -> `system
     | "user" -> `user
diff -r abcc76c21160 -r d8aa1b08fa32 ocaml/xapi/dbsync_master.ml
--- a/ocaml/xapi/dbsync_master.ml       Wed Feb 03 22:43:37 2010 +0000
+++ b/ocaml/xapi/dbsync_master.ml       Wed Feb 03 22:46:02 2010 +0000
@@ -33,7 +33,7 @@
                        ~ha_enabled:false ~ha_configuration:[] ~ha_statefiles:[]
                        ~ha_host_failures_to_tolerate:0L ~ha_plan_exists_for:0L 
~ha_allow_overcommit:false ~ha_overcommitted:false ~blobs:[] ~tags:[] 
~gui_config:[] 
                        ~wlb_url:"" ~wlb_username:"" ~wlb_password:Ref.null 
~wlb_enabled:false ~wlb_verify_cert:false
-                       ~redo_log_enabled:false ~redo_log_vdi:Ref.null
+                       ~redo_log_enabled:false ~redo_log_vdi:Ref.null 
~vswitch_controller:""
                        ~other_config:[
                                Xapi_globs.memory_ratio_hvm;
                                Xapi_globs.memory_ratio_pv;
diff -r abcc76c21160 -r d8aa1b08fa32 ocaml/xapi/helpers.ml
--- a/ocaml/xapi/helpers.ml     Wed Feb 03 22:43:37 2010 +0000
+++ b/ocaml/xapi/helpers.ml     Wed Feb 03 22:46:02 2010 +0000
@@ -806,6 +806,17 @@
   let keys = Hashtbl.fold (fun k v acc -> k :: acc) table [] in
   List.iter (fun k -> if not (List.mem k valid_keys) then Hashtbl.remove table 
k) keys
 
+let update_vswitch_controller ~__context ~host =
+       try call_api_functions ~__context (fun rpc session_id ->
+               let result = Client.Client.Host.call_plugin ~rpc ~session_id 
~host ~plugin:"vswitch-cfg-update" ~fn:"update" ~args:[] in
+               debug "vswitch-cfg-update(on %s): %s"
+                       (Db.Host.get_name_label ~__context ~self:host)
+                       result)
+       with e ->
+               debug "Got '%s' while trying to update the vswitch 
configuration on host %s"
+                       (Printexc.to_string e)
+                       (Db.Host.get_name_label ~__context ~self:host)
+
 let set_vm_uncooperative ~__context ~self ~value = 
   let current_value = 
        let oc = Db.VM.get_other_config ~__context ~self in
diff -r abcc76c21160 -r d8aa1b08fa32 ocaml/xapi/message_forwarding.ml
--- a/ocaml/xapi/message_forwarding.ml  Wed Feb 03 22:43:37 2010 +0000
+++ b/ocaml/xapi/message_forwarding.ml  Wed Feb 03 22:46:02 2010 +0000
@@ -555,6 +555,9 @@
        info "Pool.disable_redo_log: pool = '%s'" (current_pool_uuid 
~__context);
        Local.Pool.disable_redo_log ~__context
 
+    let set_vswitch_controller ~__context ~address =
+       info "Pool.set_vswitch_controller: pool = '%s'; address = '%s'" 
(current_pool_uuid ~__context) address;
+       Local.Pool.set_vswitch_controller ~__context ~address
   end
 
   module VM = struct
diff -r abcc76c21160 -r d8aa1b08fa32 ocaml/xapi/xapi.ml
--- a/ocaml/xapi/xapi.ml        Wed Feb 03 22:43:37 2010 +0000
+++ b/ocaml/xapi/xapi.ml        Wed Feb 03 22:46:02 2010 +0000
@@ -835,6 +835,7 @@
       "considering executing on-master-start script", [],
         (fun () -> Xapi_pool_transition.run_external_scripts 
(Pool_role.is_master ()));
       "creating networks", [ Startup.OnlyMaster ], 
Create_networks.create_networks_localhost;
+      "updating the vswitch controller", [], (fun () -> 
Helpers.update_vswitch_controller ~__context ~host:(Helpers.get_localhost 
~__context)); 
       (* CA-22417: bring up all non-bond slaves so that the SM backends can 
use storage NIC IP addresses (if the routing
         table happens to be right) *)
       "Best-effort bring up of physical NICs", [ Startup.NoExnRaising ], 
Xapi_pif.start_of_day_best_effort_bring_up;
diff -r abcc76c21160 -r d8aa1b08fa32 ocaml/xapi/xapi_pool.ml
--- a/ocaml/xapi/xapi_pool.ml   Wed Feb 03 22:43:37 2010 +0000
+++ b/ocaml/xapi/xapi_pool.ml   Wed Feb 03 22:46:02 2010 +0000
@@ -224,6 +224,18 @@
                if master_uuid = my_uuid then
                        raise 
(Api_errors.Server_error(Api_errors.operation_not_allowed, ["Host cannot become 
slave of itself"])) in
 
+       let assert_homogeneous_vswitch_configuration () =
+               match Netdev.network.Netdev.kind with
+               | Netdev.Vswitch ->
+                       let my_pool = Helpers.get_pool __context in
+                       let my_controller = Db.Pool.get_vswitch_controller 
~__context ~self:my_pool in
+                       let pool = List.hd (Client.Pool.get_all rpc session_id) 
in
+                       let controller = Client.Pool.get_vswitch_controller 
~rpc ~session_id ~self:pool in
+                       if my_controller <> controller then
+                               raise 
(Api_errors.Server_error(Api_errors.operation_not_allowed, ["vswitch controller 
address differs"]))
+               | _ -> ()
+       in
+
        (* call pre-join asserts *)
        ha_is_not_enable_on_me ();
        ha_is_not_enable_on_the_distant_pool ();
@@ -235,7 +247,8 @@
        assert_no_shared_srs_on_me ();
        assert_management_interface_is_physical ();
        assert_external_auth_matches ();
-       assert_restrictions_match ()
+       assert_restrictions_match ();
+       assert_homogeneous_vswitch_configuration ()
 
 let rec create_or_get_host_on_master __context rpc session_id (host_ref, host) 
: API.ref_host =
        let my_uuid = host.API.host_uuid in
@@ -1336,7 +1349,24 @@
                end;
        end;
        info "The redo log is now disabled"
-       
+
+let assert_is_valid_ip ip_addr =
+       if ip_addr <> "" then
+       try Unix.inet_addr_of_string ip_addr; ()
+       with _ -> raise (Api_errors.Server_error 
(Api_errors.invalid_ip_address_specified, [ "address" ]))
+
+let set_vswitch_controller ~__context ~address =
+       match Netdev.network.Netdev.kind with
+       | Netdev.Vswitch ->
+               let pool = Helpers.get_pool ~__context in
+               let current_address = Db.Pool.get_vswitch_controller ~__context 
~self:pool in
+               if current_address <> address then begin
+                       assert_is_valid_ip address;
+                       Db.Pool.set_vswitch_controller ~__context ~self:pool 
~value:address;
+                       List.iter (fun host -> 
Helpers.update_vswitch_controller ~__context ~host) (Db.Host.get_all ~__context)
+               end
+       | _ -> raise (Api_errors.Server_error(Api_errors.operation_not_allowed, 
["host not configured for vswitch operation"]))
+
 
 (* internal intra-pool call to allow slaves to log http actions on the master 
*)
 let audit_log_append ~__context ~line =
diff -r abcc76c21160 -r d8aa1b08fa32 ocaml/xapi/xapi_pool.mli
--- a/ocaml/xapi/xapi_pool.mli  Wed Feb 03 22:43:37 2010 +0000
+++ b/ocaml/xapi/xapi_pool.mli  Wed Feb 03 22:46:02 2010 +0000
@@ -189,4 +189,6 @@
 (** Disable HA-independent redo log *)
 val disable_redo_log : __context:Context.t -> unit
 
+(** VSwitch Controller *)
+val set_vswitch_controller : __context:Context.t -> address:string -> unit
 val audit_log_append : __context:Context.t -> line:string -> unit
10 files changed, 76 insertions(+), 4 deletions(-)
ocaml/client_records/records.ml  |    1 +
ocaml/idl/datamodel.ml           |   13 ++++++++++++-
ocaml/xapi/cli_frontend.ml       |    9 +++++++++
ocaml/xapi/cli_operations.ml     |    4 ++++
ocaml/xapi/dbsync_master.ml      |    2 +-
ocaml/xapi/helpers.ml            |   11 +++++++++++
ocaml/xapi/message_forwarding.ml |    3 +++
ocaml/xapi/xapi.ml               |    1 +
ocaml/xapi/xapi_pool.ml          |   34 ++++++++++++++++++++++++++++++++--
ocaml/xapi/xapi_pool.mli         |    2 ++


Attachment: vswitch-pool-controller-config.patch
Description: Text Data

_______________________________________________
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®.