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] add a first-class field for a vswitch controller

To: xen-api@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-API] [PATCH] add a first-class field for a vswitch controller
From: David Scott <dave.scott@xxxxxxxxxxxxx>
Date: Wed, 3 Feb 2010 22:46:55 +0000
Delivery-date: Wed, 03 Feb 2010 14:39:42 -0800
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
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>
Sender: xen-api-bounces@xxxxxxxxxxxxxxxxxxx
# 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
<Prev in Thread] Current Thread [Next in Thread>
  • [Xen-API] [PATCH] add a first-class field for a vswitch controller, David Scott <=