Skip to content

Commit d369991

Browse files
authored
xapi_guest_agent: Update xenstore keys for Windows PV drivers versions (xapi-project#6432)
Windows PV drivers do not store their version information into `drivers/{xeneventchn,xenvbd,xennet}` xenstore keys since 2015, see: * PV drivers commit `784af16810d705ba2bc02bab6ac93b24119f886c (Publish distribution information to xenstore)` https://xenbits.xen.org/gitweb/?p=pvdrivers/win/xenbus.git;a=commit;h=784af16810d705ba2bc02bab6ac93b24119f886c * Xen commit `71e64e163b2dae7d08f7d77ee942749663f484d5 (docs: Introduce xenstore paths for PV driver information)` https://xenbits.xen.org/gitweb/?p=xen.git;a=commit;h=71e64e163b2dae7d08f7d77ee942749663f484d5 Instead it is stored like this: ``` drivers/0 = "XenServer XENBUS 9.1.9.105 " drivers/1 = "XenServer XENVBD 9.1.8.79 " drivers/2 = "XenServer XENVIF 9.1.12.101 " drivers/3 = "XenServer XENIFACE 9.1.10.87 " drivers/4 = "XenServer XENNET 9.1.7.65 " ``` Modify `xapi_guest_agent` to list such entries under `drivers/` and present version information for each driver.
2 parents 99ee18b + c5803e2 commit d369991

File tree

2 files changed

+67
-7
lines changed

2 files changed

+67
-7
lines changed

ocaml/tests/test_guest_agent.ml

+28
Original file line numberDiff line numberDiff line change
@@ -285,6 +285,7 @@ module Initial_guest_metrics = Generic.MakeStateless (struct
285285
Xapi_guest_agent.get_initial_guest_metrics (lookup tree) (list tree)
286286
in
287287
guest_metrics.Xapi_guest_agent.networks
288+
@ guest_metrics.Xapi_guest_agent.pv_drivers_version
288289

289290
let tests =
290291
`QuickAndAutoDocumented
@@ -465,6 +466,33 @@ module Initial_guest_metrics = Generic.MakeStateless (struct
465466
]
466467
, []
467468
)
469+
; (* windows pv driver versions parsing *)
470+
( [
471+
("drivers/0", "XenServer XENBUS 9.1.9.105 ")
472+
; ("drivers/1", "XenServer XENVBD 9.1.8.79 ")
473+
; ("drivers/2", "XenServer XENVIF 9.1.12.101 ")
474+
; ("drivers/3", "XenServer XENIFACE 9.1.10.87 ")
475+
; ("drivers/4", "XenServer XENNET 9.1.7.65 ")
476+
]
477+
, [
478+
("micro", "-1")
479+
; ("xennet", "XenServer 9.1.7.65 ")
480+
; ("xeniface", "XenServer 9.1.10.87 ")
481+
; ("xenvif", "XenServer 9.1.12.101 ")
482+
; ("xenvbd", "XenServer 9.1.8.79 ")
483+
; ("xenbus", "XenServer 9.1.9.105 ")
484+
]
485+
)
486+
; ( [
487+
("drivers/0", "XenServer XENBUS 9.1.9.105 (DEBUG) (MOREDEBUG)")
488+
; ("drivers/2", "XCP_ng XENVIF 9.1.12.101 ")
489+
]
490+
, [
491+
("micro", "-1")
492+
; ("xenvif", "XCP_ng 9.1.12.101 ")
493+
; ("xenbus", "XenServer 9.1.9.105 (DEBUG) (MOREDEBUG)")
494+
]
495+
)
468496
]
469497
end)
470498

ocaml/xapi/xapi_guest_agent.ml

+39-7
Original file line numberDiff line numberDiff line change
@@ -33,12 +33,6 @@ end)
3333
NB each key is annotated with whether it appears in windows and/or linux *)
3434
let pv_drivers_version =
3535
[
36-
("drivers/xenevtchn", "xenevtchn")
37-
; (* windows *)
38-
("drivers/xenvbd", "xenvbd")
39-
; (* windows *)
40-
("drivers/xennet", "xennet")
41-
; (* windows *)
4236
("attr/PVAddons/MajorVersion", "major")
4337
; (* linux + windows *)
4438
("attr/PVAddons/MinorVersion", "minor")
@@ -294,7 +288,45 @@ let get_initial_guest_metrics (lookup : string -> string option)
294288
| None ->
295289
[]
296290
in
297-
let pv_drivers_version = to_map pv_drivers_version
291+
(* enumerate all driver versions from xenstore, which are stored like
292+
drivers/0 = "XenServer XENBUS 9.1.9.105 "
293+
drivers/1 = "XenServer XENVBD 9.1.8.79 "
294+
drivers/2 = "XenServer XENVIF 9.1.12.101 "
295+
drivers/3 = "XenServer XENIFACE 9.1.10.87 "
296+
drivers/4 = "XenServer XENNET 9.1.7.65 "
297+
298+
(see the format specified in xenstore-paths)
299+
*)
300+
let get_windows_driver_versions () =
301+
(* Only look into directories that are numbers (indices) *)
302+
let filter_dirs subdirs =
303+
List.filter_map
304+
(fun x ->
305+
match int_of_string_opt x with
306+
| Some _ ->
307+
Some ("drivers/" ^ x, x)
308+
| None ->
309+
None
310+
)
311+
subdirs
312+
in
313+
let versions = list "drivers" |> filter_dirs |> to_map in
314+
List.filter_map
315+
(fun (_, version_string) ->
316+
try
317+
Scanf.sscanf version_string "%s@ %s@ %s@ %s@\n"
318+
(fun vendor driver_name version attr ->
319+
Some
320+
( String.lowercase_ascii driver_name
321+
, String.concat " " [vendor; version; attr]
322+
)
323+
)
324+
with _ -> None
325+
)
326+
versions
327+
in
328+
let pv_drivers_version =
329+
to_map pv_drivers_version @ get_windows_driver_versions ()
298330
and os_version = to_map os_version
299331
and netbios_name =
300332
match to_map dns_domain with

0 commit comments

Comments
 (0)