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 3 of 4] CP-1548: select network bridge or vswitch backe

To: xen-api@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-API] [PATCH 3 of 4] CP-1548: select network bridge or vswitch backend at runtime
From: Ian Campbell <ian.campbell@xxxxxxxxxx>
Date: Tue, 15 Dec 2009 12:33:08 +0000
Cc: Ian Campbell <ian.campbell@xxxxxxxxxx>
Delivery-date: Tue, 15 Dec 2009 04:33:39 -0800
Envelope-to: www-data@xxxxxxxxxxxxxxxxxxx
In-reply-to: <patchbomb.1260880385@xxxxxxxxxxxxxxxxxxxxxx>
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
Select Netdev.Bridge or Netdev.Vswitch based on contents of
/etc/xensource/network.conf

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

diff -r 475dd68da5f8 -r 8f62d72f7fad ocaml/netdev/netdev.ml
--- a/ocaml/netdev/netdev.ml    Tue Dec 15 12:30:48 2009 +0000
+++ b/ocaml/netdev/netdev.ml    Tue Dec 15 12:30:48 2009 +0000
@@ -13,6 +13,38 @@
  *)
 open Stringext
 open Forkhelpers
+
+type kind = Bridge | Vswitch
+
+type network_ops = { 
+  kind: kind;
+  add: string -> unit;
+  del: string -> unit;
+  list: unit -> string list;
+
+  exists: string -> bool;
+
+  intf_add: string -> string -> unit;
+  intf_del: string -> string -> unit;
+  intf_list: string -> string list;
+
+  get_bridge: string -> string;
+  is_on_bridge: string -> bool;
+
+  set_forward_delay: string -> int -> unit;
+}
+
+exception Unknown_network_backend of string
+exception Invalid_network_backend_operation of string * kind
+
+let string_of_kind kind = match kind with
+  | Bridge -> "bridge"
+  | Vswitch -> "vswitch"
+
+let kind_of_string s = match s with
+  | "bridge" -> Bridge
+  | "vswitch" -> Vswitch
+  | _ -> raise (Unknown_network_backend s)
 
 module Internal = struct
 
@@ -158,6 +190,25 @@
 
 let get_bridge name = Filename.basename (Unix.readlink ((getpath name 
"brport") ^ "/bridge"))
 
+let ops = {
+  kind = Bridge;
+
+  add = add;
+  del = del;
+  list = list;
+
+  exists = exists;
+
+  intf_add = intf_add;
+  intf_del = intf_del;
+  intf_list = intf_list;
+
+  get_bridge = get_bridge;
+  is_on_bridge = is_on_bridge;
+
+  set_forward_delay = set_forward_delay;
+}
+
 end
 
 module Vswitch = struct
@@ -191,6 +242,25 @@
   | l::[] -> true
   | [] -> false
   | _ -> failwith ("ovs-vsctl port-to-br: returned an unexpected number of 
results for port " ^ name)
+
+let ops = {
+  kind = Vswitch;
+
+  add = add;
+  del = del;
+  list = list;
+
+  exists = exists;
+
+  intf_add = intf_add;
+  intf_del = intf_del;
+  intf_list = intf_list;
+
+  get_bridge = get_bridge;
+  is_on_bridge = is_on_bridge;
+
+  set_forward_delay = fun name v -> raise (Invalid_network_backend_operation 
("set_forward_delay", Vswitch))
+}
 
 end
 
@@ -317,3 +387,17 @@
 
 (** Indicates whether the given interface is a physical interface *)
 let is_physical name = try Unix.access (getpath name "device") [ Unix.F_OK ]; 
true with _ -> false
+
+(* Dispatch network backend operations. *)
+
+let network_config_file = "/etc/xensource/network.conf"
+let network_backend = 
+  try 
+    kind_of_string (String.strip String.isspace 
(Unixext.read_whole_file_to_string network_config_file))
+  with
+  | Unix.Unix_error(Unix.ENOENT, "open", _) -> Bridge
+  | Unix.Unix_error(err, op, path) -> failwith (Printf.sprintf "Unix error: %s 
(%s,%s)\n" (Unix.error_message err) op path)
+
+let network = match network_backend with
+  | Bridge -> Bridge.ops
+  | Vswitch -> Vswitch.ops
diff -r 475dd68da5f8 -r 8f62d72f7fad ocaml/xapi/quicktest.ml
--- a/ocaml/xapi/quicktest.ml   Tue Dec 15 12:30:48 2009 +0000
+++ b/ocaml/xapi/quicktest.ml   Tue Dec 15 12:30:48 2009 +0000
@@ -338,7 +338,7 @@
        let network = Client.VIF.get_network !rpc session_id vif in
        let bridge = Client.Network.get_bridge !rpc session_id network in
        let device = Printf.sprintf "vif%Ld.%s" (Client.VM.get_domid !rpc 
session_id vm) (Client.VIF.get_device !rpc session_id vif) in
-       let devices = Netdev.Bridge.intf_list bridge in
+       let devices = Netdev.network.Netdev.intf_list bridge in
        if not(List.mem device devices) 
        then failed test (Printf.sprintf "Failed to find device %s on bridge %s 
(found [ %s ])" device bridge (String.concat ", " devices))
        else debug test (Printf.sprintf "Device %s is on bridge %s" device 
bridge);
diff -r 475dd68da5f8 -r 8f62d72f7fad ocaml/xapi/vmops.ml
--- a/ocaml/xapi/vmops.ml       Tue Dec 15 12:30:48 2009 +0000
+++ b/ocaml/xapi/vmops.ml       Tue Dec 15 12:30:48 2009 +0000
@@ -90,7 +90,8 @@
 
   Xapi_xenops_errors.handle_xenops_error
     (fun () ->
-       let (_: Device_common.device) = Device.Vif.add ~xs 
~devid:vif_device.Vm_config.devid ~netty:(Netman.Bridge 
vif_device.Vm_config.bridge) 
+       let netty = Netman.netty_of_bridge vif_device.Vm_config.bridge in
+       let (_: Device_common.device) = Device.Vif.add ~xs 
~devid:vif_device.Vm_config.devid ~netty 
         ~mac:vif_device.Vm_config.mac ~mtu:vif_device.Vm_config.mtu 
~rate:vif_device.Vm_config.rate ~protocol:vif_device.Vm_config.protocol 
         ~other_config:vif_device.Vm_config.other_config ~extra_private_keys
         vif_device.Vm_config.domid in
diff -r 475dd68da5f8 -r 8f62d72f7fad ocaml/xapi/xapi_network.ml
--- a/ocaml/xapi/xapi_network.ml        Tue Dec 15 12:30:48 2009 +0000
+++ b/ocaml/xapi/xapi_network.ml        Tue Dec 15 12:30:48 2009 +0000
@@ -25,8 +25,8 @@
 *)
 
 let create_internal_bridge ~bridge =
-  let current = Netdev.Bridge.list () in
-  if not(List.mem bridge current) then Netdev.Bridge.add bridge;
+  let current = Netdev.network.Netdev.list () in
+  if not(List.mem bridge current) then Netdev.network.Netdev.add bridge;
   if not(Netdev.Link.is_up bridge) then Netdev.Link.up bridge
 
 let attach_internal ?(management_interface=false) ~__context ~self () =
@@ -66,14 +66,14 @@
 
 let detach bridge_name = 
   Xapi_network_real.maybe_shutdown_guest_installer_network bridge_name;
-  if Netdev.Bridge.exists bridge_name then begin
+  if Netdev.network.Netdev.exists bridge_name then begin
     List.iter (fun iface ->
                 D.warn "Untracked interface %s exists on bridge %s: deleting" 
iface bridge_name;
                 Netdev.Link.down iface;
-                Netdev.Bridge.intf_del bridge_name iface
-             ) (Netdev.Bridge.intf_list bridge_name);
+                Netdev.network.Netdev.intf_del bridge_name iface
+             ) (Netdev.network.Netdev.intf_list bridge_name);
     Netdev.Link.down bridge_name;
-    Netdev.Bridge.del bridge_name
+    Netdev.network.Netdev.del bridge_name
   end
 
 let attach ~__context ~network ~host = attach_internal ~__context 
~self:network ()
@@ -85,7 +85,7 @@
 let do_bridge_gc rpc session_id =
   let all_networks = Client.Network.get_all_records_where ~rpc ~session_id 
~expr:"true" in
   let db_bridge_names = List.map (fun r->r.API.network_bridge) (List.map snd 
all_networks) in
-  let my_bridges = Netdev.Bridge.list () in
+  let my_bridges = Netdev.network.Netdev.list () in
     List.iter
       (fun mybridge -> if not (List.mem mybridge db_bridge_names) then detach 
mybridge)
       my_bridges
diff -r 475dd68da5f8 -r 8f62d72f7fad ocaml/xapi/xapi_pif.ml
--- a/ocaml/xapi/xapi_pif.ml    Tue Dec 15 12:30:48 2009 +0000
+++ b/ocaml/xapi/xapi_pif.ml    Tue Dec 15 12:30:48 2009 +0000
@@ -442,7 +442,8 @@
   )
     (Db.PIF.get_all_records ~__context)
 
-let start_of_day_best_effort_bring_up() =
+let start_of_day_best_effort_bring_up() = begin
+  debug "Configured network backend: %s" (Netdev.string_of_kind 
Netdev.network.Netdev.kind);
   Server_helpers.exec_with_new_task "Bringing up physical PIFs"
     (fun __context ->
        List.iter
@@ -452,4 +453,4 @@
                 plug ~__context ~self:pif) pif) 
         (calculate_pifs_required_at_start_of_day ~__context)
     )
-
+end
diff -r 475dd68da5f8 -r 8f62d72f7fad ocaml/xe-cli/rt/networks.ml
--- a/ocaml/xe-cli/rt/networks.ml       Tue Dec 15 12:30:48 2009 +0000
+++ b/ocaml/xe-cli/rt/networks.ml       Tue Dec 15 12:30:48 2009 +0000
@@ -55,7 +55,7 @@
 let network_create_destroy cli vmid = 
   let list_bridge () = 
     let ifaces = List.filter Netdev.Link.is_up (Netdev.list ()) in
-    List.filter (fun x -> Netdev.Bridge.exists x) ifaces in
+    List.filter (fun x -> Netdev.network.Netdev.exists x) ifaces in
 
   delete_existing_networks cli;
   
diff -r 475dd68da5f8 -r 8f62d72f7fad ocaml/xenops/netman.ml
--- a/ocaml/xenops/netman.ml    Tue Dec 15 12:30:48 2009 +0000
+++ b/ocaml/xenops/netman.ml    Tue Dec 15 12:30:48 2009 +0000
@@ -14,8 +14,12 @@
 module D = Debug.Debugger(struct let name = "netman" end)
 open D
 
+type netty = Bridge of string | Vswitch of string | DriverDomain | Nat
 
-type netty = Bridge of string | Vswitch of string | DriverDomain | Nat
+let netty_of_bridge bridge = 
+  match Netdev.network.Netdev.kind with
+  | Netdev.Bridge -> (Bridge bridge)
+  | Netdev.Vswitch -> (Vswitch bridge)
 
 let online vif netty =
        let setup_bridge_port dev =
@@ -29,8 +33,8 @@
        match netty with
        | Bridge bridgename ->
                let add_to_bridge br dev =
-                       Netdev.Bridge.set_forward_delay br 0;
-                       Netdev.Bridge.intf_add br dev;
+                       Netdev.network.Netdev.set_forward_delay br 0;
+                       Netdev.network.Netdev.intf_add br dev;
                        Netdev.Link.up dev
                        in
                debug "Adding %s to bridge %s" vif bridgename;
@@ -38,7 +42,7 @@
                add_to_bridge bridgename vif
        | Vswitch bridgename ->
                let add_to_bridge br dev =
-                       Netdev.Vswitch.intf_add br dev;
+                       Netdev.network.Netdev.intf_add br dev;
                        Netdev.Link.up dev
                        in
                debug "Adding %s to bridge %s" vif bridgename;
@@ -52,7 +56,7 @@
        | Bridge bridgename ->
                debug "Removing %s from bridge %s" vif bridgename;
                begin try
-                       Netdev.Bridge.intf_del bridgename vif;
+                       Netdev.network.Netdev.intf_del bridgename vif;
                        Netdev.Link.down vif
                with _ ->
                        warn "interface %s already removed from bridge %s" vif 
bridgename;
@@ -60,7 +64,7 @@
        | Vswitch bridgename ->
                debug "Removing %s from bridge %s" vif bridgename;
                begin try
-                       Netdev.Vswitch.intf_del bridgename vif;
+                       Netdev.network.Netdev.intf_del bridgename vif;
                        Netdev.Link.down vif
                with _ ->
                        warn "interface %s already removed from bridge %s" vif 
bridgename;
diff -r 475dd68da5f8 -r 8f62d72f7fad ocaml/xiu/xiu.ml
--- a/ocaml/xiu/xiu.ml  Tue Dec 15 12:30:48 2009 +0000
+++ b/ocaml/xiu/xiu.ml  Tue Dec 15 12:30:48 2009 +0000
@@ -272,9 +272,9 @@
                                if ty = "vif" then (
                                        let device_path = sprintf 
"/xapi/%s/hotplug/vif/%s/vif" domid id in
                                        let device = xs.Xs.read device_path in
-                                       if Netdev.Bridge.is_on_bridge device 
then begin
-                                         let bridge = Netdev.Bridge.get_bridge 
device in
-                                         Netdev.Bridge.intf_del bridge device
+                                       if Netdev.network.Netdev.is_on_bridge 
device then begin
+                                         let bridge = 
Netdev.network.Netdev.get_bridge device in
+                                         Netdev.network.Netdev.intf_del bridge 
device
                                        end;
                                        eprintf "(XIU) Adding device to free 
list: %s\n" device;
                                        vif_free_list := device :: 
!vif_free_list;

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