Skip to content

Commit ab9f725

Browse files
committed
Add internal host level APIs
Signed-off-by: Ming Lu <ming.lu@cloud.com>
1 parent 030d993 commit ab9f725

File tree

5 files changed

+151
-6
lines changed

5 files changed

+151
-6
lines changed

ocaml/idl/datamodel_host.ml

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1938,6 +1938,72 @@ let refresh_server_certificate =
19381938
~params:[(Ref _host, "host", "The host")]
19391939
~allowed_roles:_R_POOL_ADMIN ()
19401940

1941+
let list_trusted_certificates =
1942+
call ~flags:[`Session] ~pool_internal:true ~hide_from_docs:true
1943+
~name:"list_trusted_certificates"
1944+
~doc:
1945+
"List the file names of all installed TLS trusted certificates on the \
1946+
host."
1947+
~params:
1948+
[
1949+
(Ref _host, "host", "The host.")
1950+
; ( Bool
1951+
, "ca"
1952+
, "The trusted certificates are root CA certificates used to verify \
1953+
chains (true), or leaf certificates used for certificate pinning \
1954+
(false)."
1955+
)
1956+
]
1957+
~result:
1958+
( Set String
1959+
, "All root CA certificates used to verify chains when ca = true, or all \
1960+
leaf certificates used for certificate pinning when ca = false."
1961+
)
1962+
~allowed_roles:_R_LOCAL_ROOT_ONLY ~lifecycle:[] ()
1963+
1964+
let install_trusted_certificate =
1965+
call ~flags:[`Session] ~pool_internal:true ~hide_from_docs:true
1966+
~name:"install_trusted_certificate"
1967+
~doc:"Install a TLS trusted certificate on this host."
1968+
~params:
1969+
[
1970+
(Ref _host, "host", "The host.")
1971+
; ( Bool
1972+
, "ca"
1973+
, "The trusted certificate is a root CA certificate used to verify a \
1974+
chain (true), or a leaf certificate used for certificate pinning \
1975+
(false)."
1976+
)
1977+
; (String, "name", "The file name of the certificate.")
1978+
; (String, "cert", "The certificate in PEM format.")
1979+
; ( Set Datamodel_certificate.certificate_purpose
1980+
, "purpose"
1981+
, "The purpose of the certificate."
1982+
)
1983+
]
1984+
~allowed_roles:_R_LOCAL_ROOT_ONLY ~lifecycle:[] ()
1985+
1986+
let uninstall_trusted_certificate =
1987+
call ~flags:[`Session] ~pool_internal:true ~hide_from_docs:true
1988+
~name:"uninstall_trusted_certificate"
1989+
~doc:"Remove a TLS trusted certificate from this host."
1990+
~params:
1991+
[
1992+
(Ref _host, "host", "The host.")
1993+
; ( Bool
1994+
, "ca"
1995+
, "The trusted certificate is a root CA certificate used to verify a \
1996+
chain (true), or a leaf certificate used for certificate pinning \
1997+
(false)"
1998+
)
1999+
; (String, "name", "The file name of the certificate.")
2000+
; ( Bool
2001+
, "force"
2002+
, "If true, return success even if the file doesn't exist."
2003+
)
2004+
]
2005+
~allowed_roles:_R_LOCAL_ROOT_ONLY ~lifecycle:[] ()
2006+
19412007
let display =
19422008
Enum
19432009
( "host_display"
@@ -2897,6 +2963,9 @@ let t =
28972963
; list_timezones
28982964
; get_ntp_synchronized
28992965
; set_servertime
2966+
; list_trusted_certificates
2967+
; install_trusted_certificate
2968+
; uninstall_trusted_certificate
29002969
]
29012970
~contents:
29022971
([

ocaml/xapi/certificates.ml

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -569,16 +569,15 @@ let sync_certs kind ~__context host =
569569
let ca = if kind = Root_CA then true else false in
570570
sync_certs_crls kind
571571
(fun rpc session_id host ->
572-
[]
573-
(* TODO: Client.Host.list_trusted_certificates ~rpc ~session_id ~host ~ca *)
572+
Client.Host.list_trusted_certificates ~rpc ~session_id ~host ~ca
574573
)
575574
(fun rpc session_id host name purpose cert ->
576-
()
577-
(* TODO: Client.Host.install_trusted_certificate ~rpc ~session_id ~host ~ca ~name ~cert ~purpose *)
575+
Client.Host.install_trusted_certificate ~rpc ~session_id ~host ~ca
576+
~name ~cert ~purpose
578577
)
579578
(fun rpc session_id host name ->
580-
()
581-
(* TODO: Client.Host.uninstall_trusted_certificate ~rpc ~session_id ~host ~ca ~name ~force:false *)
579+
Client.Host.uninstall_trusted_certificate ~rpc ~session_id ~host ~ca
580+
~name ~force:false
582581
)
583582
~__context main_certs host
584583

ocaml/xapi/message_forwarding.ml

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4223,6 +4223,46 @@ functor
42234223
let local_fn = Local.Host.set_servertime ~self ~value in
42244224
let remote_fn = Client.Host.set_servertime ~self ~value in
42254225
do_op_on ~local_fn ~__context ~host:self ~remote_fn
4226+
4227+
let list_trusted_certificates ~__context ~host ~ca =
4228+
info "Host.list_trusted_certificates: host = '%s'; ca = '%b'"
4229+
(host_uuid ~__context host)
4230+
ca ;
4231+
let local_fn = Local.Host.list_trusted_certificates ~host ~ca in
4232+
let remote_fn = Client.Host.list_trusted_certificates ~host ~ca in
4233+
do_op_on ~local_fn ~__context ~host ~remote_fn
4234+
4235+
let install_trusted_certificate ~__context ~host ~ca ~name ~cert ~purpose
4236+
=
4237+
info
4238+
"Host.install_trusted_certificate: host = '%s'; ca = '%b'; name = \
4239+
'%s'; purpose = [%s]"
4240+
(host_uuid ~__context host)
4241+
ca name
4242+
(List.map Record_util.certificate_purpose_to_string purpose
4243+
|> String.concat "; "
4244+
) ;
4245+
let local_fn =
4246+
Local.Host.install_trusted_certificate ~host ~ca ~name ~cert ~purpose
4247+
in
4248+
let remote_fn =
4249+
Client.Host.install_trusted_certificate ~host ~ca ~name ~cert ~purpose
4250+
in
4251+
do_op_on ~local_fn ~__context ~host ~remote_fn
4252+
4253+
let uninstall_trusted_certificate ~__context ~host ~ca ~name ~force =
4254+
info
4255+
"Host.uninstall_trusted_certificate: host = '%s'; ca = '%b'; name = \
4256+
'%s'; force = '%b'"
4257+
(host_uuid ~__context host)
4258+
ca name force ;
4259+
let local_fn =
4260+
Local.Host.uninstall_trusted_certificate ~host ~ca ~name ~force
4261+
in
4262+
let remote_fn =
4263+
Client.Host.uninstall_trusted_certificate ~host ~ca ~name ~force
4264+
in
4265+
do_op_on ~local_fn ~__context ~host ~remote_fn
42264266
end
42274267

42284268
module Host_crashdump = struct

ocaml/xapi/xapi_host.ml

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3618,3 +3618,20 @@ let set_servertime ~__context ~self ~value =
36183618
raise (Invalid_argument "Missing timezone offset in value")
36193619
with e ->
36203620
Helpers.internal_error "%s: %s" __FUNCTION__ (ExnHelper.string_of_exn e)
3621+
3622+
let list_trusted_certificates ~__context ~host:_ ~ca =
3623+
Certificates.local_list (if ca then Root_CA else Leaf_Pinned)
3624+
3625+
let install_trusted_certificate ~__context ~host:_ ~ca ~name ~cert ~purpose =
3626+
Certificates.host_install ~purpose
3627+
(if ca then Root_CA else Leaf_Pinned)
3628+
~name ~cert
3629+
3630+
let uninstall_trusted_certificate ~__context ~host:_ ~ca ~name ~force =
3631+
List.iter
3632+
(fun purpose ->
3633+
Certificates.host_uninstall ~purpose
3634+
(if ca then Root_CA else Leaf_Pinned)
3635+
~name ~force
3636+
)
3637+
([] :: List.map (fun x -> [x]) API.certificate_purpose__all)

ocaml/xapi/xapi_host.mli

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -642,3 +642,23 @@ val get_ntp_synchronized : __context:Context.t -> self:API.ref_host -> bool
642642

643643
val set_servertime :
644644
__context:Context.t -> self:API.ref_host -> value:Clock.Date.t -> unit
645+
646+
val list_trusted_certificates :
647+
__context:Context.t -> host:API.ref_host -> ca:bool -> string list
648+
649+
val install_trusted_certificate :
650+
__context:Context.t
651+
-> host:API.ref_host
652+
-> ca:bool
653+
-> name:string
654+
-> cert:string
655+
-> purpose:API.certificate_purpose list
656+
-> unit
657+
658+
val uninstall_trusted_certificate :
659+
__context:Context.t
660+
-> host:API.ref_host
661+
-> ca:bool
662+
-> name:string
663+
-> force:bool
664+
-> unit

0 commit comments

Comments
 (0)