Skip to content

Commit e1126c1

Browse files
committed
Fixup: restruct some functions in networkd
- combine sorting on first boot and non first boot in one function - reduce the use of device_already_renamed and make it clear that interface_order is None when device_already_renamed Signed-off-by: Changlei Li <[email protected]>
1 parent 41d4372 commit e1126c1

File tree

3 files changed

+72
-77
lines changed

3 files changed

+72
-77
lines changed

ocaml/networkd/bin/network_server.ml

Lines changed: 59 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -35,74 +35,62 @@ let write_config () =
3535
try Network_config.write_config !config
3636
with Network_config.Write_error -> ()
3737

38-
let sort_and_update () =
39-
if Network_utils.device_already_renamed then
40-
()
41-
else
42-
let last_config = !config in
43-
let last_interface_order =
44-
Option.value ~default:[] last_config.interface_order
45-
in
46-
match Network_device_order.sort last_interface_order with
47-
| Ok (new_order, changed_interfaces) ->
48-
let update_name name =
49-
List.assoc_opt name changed_interfaces |> Option.value ~default:name
50-
in
51-
let update_port (port, port_conf) =
52-
( update_name port
53-
, {
54-
port_conf with
55-
interfaces= List.map update_name port_conf.interfaces
56-
}
57-
)
58-
in
59-
let bridge_config =
60-
List.map
61-
(fun (bridge, bridge_conf) ->
62-
( bridge
63-
, {bridge_conf with ports= List.map update_port bridge_conf.ports}
64-
)
65-
)
66-
last_config.bridge_config
67-
in
68-
let interface_config =
69-
List.map
70-
(fun (name, conf) -> (update_name name, conf))
71-
last_config.interface_config
72-
in
73-
config :=
74-
{
75-
last_config with
76-
interface_config
77-
; bridge_config
78-
; interface_order= Some new_order
79-
}
80-
| Error err ->
81-
error "Failed to sort interface order [%s]"
82-
(Network_device_order.string_of_error err)
83-
84-
let sort_on_first_boot () =
85-
if Network_utils.device_already_renamed then
86-
None
87-
else
88-
match Network_device_order.sort [] with
89-
| Ok (sorted, _) ->
90-
Some sorted
38+
let sort last_order =
39+
match last_order with
40+
| Some last_order -> (
41+
match Network_device_order.sort last_order with
42+
| Ok (interface_order, changes) ->
43+
(Some interface_order, changes)
9144
| Error err ->
9245
error "Failed to sort interface order [%s]"
9346
(Network_device_order.string_of_error err) ;
94-
Some []
47+
(Some last_order, [])
48+
)
49+
| None ->
50+
(None, [])
9551

96-
let build_config () =
52+
let update_changes last_config changed_interfaces =
53+
let update_name name =
54+
let new_name =
55+
List.assoc_opt name changed_interfaces |> Option.value ~default:name
56+
in
57+
if name <> new_name then
58+
debug "Renaming %s to %s" name new_name ;
59+
new_name
60+
in
61+
let update_port (port, port_conf) =
62+
( update_name port
63+
, {port_conf with interfaces= List.map update_name port_conf.interfaces}
64+
)
65+
in
66+
let bridge_config =
67+
List.map
68+
(fun (bridge, bridge_conf) ->
69+
( bridge
70+
, {bridge_conf with ports= List.map update_port bridge_conf.ports}
71+
)
72+
)
73+
last_config.bridge_config
74+
in
75+
let interface_config =
76+
List.map
77+
(fun (name, conf) -> (update_name name, conf))
78+
last_config.interface_config
79+
in
80+
(bridge_config, interface_config)
81+
82+
let read_config () =
9783
try
9884
config := Network_config.read_config () ;
9985
debug "Read configuration from networkd.db file." ;
100-
sort_and_update ()
86+
let interface_order, changes = sort !config.interface_order in
87+
let bridge_config, interface_config = update_changes !config changes in
88+
config := {!config with bridge_config; interface_config; interface_order}
10189
with Network_config.Read_error -> (
10290
try
10391
(* No configuration file found. Try to get the initial network setup from
10492
* the first-boot data written by the host installer. *)
105-
let interface_order = sort_on_first_boot () in
93+
let interface_order, _ = sort Network_config.initial_interface_order in
10694
config := Network_config.read_management_conf interface_order ;
10795
debug "Read configuration from management.conf file."
10896
with Network_config.Read_error ->
@@ -148,7 +136,7 @@ let sync_state () =
148136
write_config ()
149137

150138
let reset_state () =
151-
let interface_order = sort_on_first_boot () in
139+
let interface_order, _ = sort Network_config.initial_interface_order in
152140
config := Network_config.read_management_conf interface_order
153141

154142
let set_gateway_interface _dbg name =
@@ -352,16 +340,18 @@ module Interface = struct
352340
let get_interface_positions dbg () =
353341
Debug.with_thread_associated dbg
354342
(fun () ->
355-
if Network_utils.device_already_renamed then
356-
sort_based_on_ethx ()
357-
else
358-
Option.value ~default:[] !config.interface_order
359-
|> List.filter_map (fun dev ->
360-
if dev.present then
361-
Some (dev.name, dev.position)
362-
else
363-
None
364-
)
343+
match !config.interface_order with
344+
| Some order ->
345+
List.filter_map
346+
(fun dev ->
347+
if dev.present then
348+
Some (dev.name, dev.position)
349+
else
350+
None
351+
)
352+
order
353+
| None ->
354+
sort_based_on_ethx ()
365355
)
366356
()
367357

@@ -1667,7 +1657,7 @@ let on_startup () =
16671657
in
16681658
try
16691659
(* the following is best-effort *)
1670-
build_config () ;
1660+
read_config () ;
16711661
remove_centos_config () ;
16721662
if !backend_kind = Openvswitch then
16731663
Ovs.set_max_idle 5000 ;

ocaml/networkd/lib/network_config.ml

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,18 @@ exception Read_error
2222

2323
exception Write_error
2424

25-
let empty_config = default_config
25+
(* If the interface-rename script dir exists, the devices are already renamed
26+
to eth<N>, the <N> indicates device order *)
27+
let device_already_renamed =
28+
let dir = "/etc/sysconfig/network-scripts/interface-rename-data" in
29+
Sys.file_exists dir && Sys.is_directory dir
30+
31+
(* If devices have already been renamed, then interface_order is None,
32+
since the order is now reflected in their names. *)
33+
let initial_interface_order = if device_already_renamed then None else Some []
34+
35+
let empty_config =
36+
{default_config with interface_order= initial_interface_order}
2637

2738
let config_file_path = "/var/lib/xcp/networkd.db"
2839

@@ -148,7 +159,7 @@ let read_management_conf interface_order =
148159
temp_vlan
149160
in
150161
debug "No management bridge in inventory file... using %s" bridge ;
151-
if not Network_utils.device_already_renamed then
162+
if not device_already_renamed then
152163
write_manage_iface_to_inventory bridge ;
153164
bridge
154165
| Some bridge ->

ocaml/networkd/lib/network_utils.ml

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -147,12 +147,6 @@ let fork_script ?on_error ?log script args =
147147
in
148148
check_n_run ?on_error ?log fork_script_internal script args
149149

150-
(* If the interface-rename script dir exists, the devices are already renamed
151-
to eth<N>, the <N> indicates device order *)
152-
let device_already_renamed =
153-
let dir = "/etc/sysconfig/network-scripts/interface-rename-data" in
154-
Sys.file_exists dir && Sys.is_directory dir
155-
156150
module Sysfs = struct
157151
let list_pci_drivers () =
158152
try Array.to_list (Sys.readdir "/sys/bus/pci/drivers")

0 commit comments

Comments
 (0)