add policy does nothing when received policy is equal to stored one
This commit is contained in:
parent
296b7a9b01
commit
7b8f2cf802
|
@ -70,6 +70,20 @@ type bridge = [
|
||||||
| `External of string * Ipaddr.V4.t * Ipaddr.V4.t * Ipaddr.V4.t * int
|
| `External of string * Ipaddr.V4.t * Ipaddr.V4.t * Ipaddr.V4.t * int
|
||||||
]
|
]
|
||||||
|
|
||||||
|
let eq_int (a : int) (b : int) = a = b
|
||||||
|
|
||||||
|
let eq_bridge b1 b2 = match b1, b2 with
|
||||||
|
| `Internal a, `Internal a' -> String.equal a a'
|
||||||
|
| `External (name, ip_start, ip_end, ip_gw, netmask),
|
||||||
|
`External (name', ip_start', ip_end', ip_gw', netmask') ->
|
||||||
|
let eq_ip a b = Ipaddr.V4.compare a b = 0 in
|
||||||
|
String.equal name name' &&
|
||||||
|
eq_ip ip_start ip_start' &&
|
||||||
|
eq_ip ip_end ip_end' &&
|
||||||
|
eq_ip ip_gw ip_gw' &&
|
||||||
|
eq_int netmask netmask'
|
||||||
|
| _ -> false
|
||||||
|
|
||||||
let pp_bridge ppf = function
|
let pp_bridge ppf = function
|
||||||
| `Internal name -> Fmt.pf ppf "%s (internal)" name
|
| `Internal name -> Fmt.pf ppf "%s (internal)" name
|
||||||
| `External (name, l, h, gw, nm) ->
|
| `External (name, l, h, gw, nm) ->
|
||||||
|
@ -84,6 +98,18 @@ type policy = {
|
||||||
bridges : bridge String.Map.t ;
|
bridges : bridge String.Map.t ;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let eq_policy p1 p2 =
|
||||||
|
let eq_opt a b = match a, b with
|
||||||
|
| None, None -> true
|
||||||
|
| Some a, Some b -> eq_int a b
|
||||||
|
| _ -> false
|
||||||
|
in
|
||||||
|
eq_int p1.vms p2.vms &&
|
||||||
|
IS.equal p1.cpuids p2.cpuids &&
|
||||||
|
eq_int p1.memory p2.memory &&
|
||||||
|
eq_opt p1.block p2.block &&
|
||||||
|
String.Map.equal eq_bridge p1.bridges p2.bridges
|
||||||
|
|
||||||
let pp_policy ppf res =
|
let pp_policy ppf res =
|
||||||
Fmt.pf ppf "policy: %d vms %a cpus %d MB memory %a MB block bridges: %a"
|
Fmt.pf ppf "policy: %d vms %a cpus %d MB memory %a MB block bridges: %a"
|
||||||
res.vms pp_is res.cpuids res.memory
|
res.vms pp_is res.cpuids res.memory
|
||||||
|
|
|
@ -30,6 +30,9 @@ val pp_id : id Fmt.t
|
||||||
type bridge =
|
type bridge =
|
||||||
[ `External of string * Ipaddr.V4.t * Ipaddr.V4.t * Ipaddr.V4.t * int
|
[ `External of string * Ipaddr.V4.t * Ipaddr.V4.t * Ipaddr.V4.t * int
|
||||||
| `Internal of string ]
|
| `Internal of string ]
|
||||||
|
|
||||||
|
val eq_bridge : bridge -> bridge -> bool
|
||||||
|
|
||||||
val pp_bridge : bridge Fmt.t
|
val pp_bridge : bridge Fmt.t
|
||||||
|
|
||||||
type policy = {
|
type policy = {
|
||||||
|
@ -39,6 +42,9 @@ type policy = {
|
||||||
block : int option;
|
block : int option;
|
||||||
bridges : bridge Astring.String.Map.t;
|
bridges : bridge Astring.String.Map.t;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
val eq_policy : policy -> policy -> bool
|
||||||
|
|
||||||
val pp_policy : policy Fmt.t
|
val pp_policy : policy Fmt.t
|
||||||
|
|
||||||
val sub_bridges : bridge Astring.String.map -> bridge Astring.String.map -> bool
|
val sub_bridges : bridge Astring.String.map -> bridge Astring.String.map -> bool
|
||||||
|
|
|
@ -58,6 +58,10 @@ let find_vm t name = match Vmm_trie.find name t with
|
||||||
| Some (Vm vm) -> Some vm
|
| Some (Vm vm) -> Some vm
|
||||||
| _ -> None
|
| _ -> None
|
||||||
|
|
||||||
|
let find_policy t name = match Vmm_trie.find name t with
|
||||||
|
| Some (Policy p) -> Some p
|
||||||
|
| _ -> None
|
||||||
|
|
||||||
let check_vm_policy t name vm =
|
let check_vm_policy t name vm =
|
||||||
let dom = domain name in
|
let dom = domain name in
|
||||||
let res = resource_usage t dom in
|
let res = resource_usage t dom in
|
||||||
|
|
|
@ -20,6 +20,9 @@ val empty : t
|
||||||
(** [find_vm t id] is either [Some vm] or [None]. *)
|
(** [find_vm t id] is either [Some vm] or [None]. *)
|
||||||
val find_vm : t -> Vmm_core.id -> Vmm_core.vm option
|
val find_vm : t -> Vmm_core.id -> Vmm_core.vm option
|
||||||
|
|
||||||
|
(** [find_policy t id] is either [Some policy] or [None]. *)
|
||||||
|
val find_policy : t -> Vmm_core.id -> Vmm_core.policy option
|
||||||
|
|
||||||
(** [check_vm_policy t vm] checks whether [vm] under [id] in [t] would be
|
(** [check_vm_policy t vm] checks whether [vm] under [id] in [t] would be
|
||||||
allowed under the current policies. *)
|
allowed under the current policies. *)
|
||||||
val check_vm_policy : t -> Vmm_core.id -> Vmm_core.vm_config -> bool
|
val check_vm_policy : t -> Vmm_core.id -> Vmm_core.vm_config -> bool
|
||||||
|
|
|
@ -107,8 +107,15 @@ let handle_command t (header, payload) =
|
||||||
Ok ({ t with resources }, [ reply (`String "removed policy") ], `End)
|
Ok ({ t with resources }, [ reply (`String "removed policy") ], `End)
|
||||||
| `Policy_add policy ->
|
| `Policy_add policy ->
|
||||||
Logs.debug (fun m -> m "insert policy %a" pp_id id) ;
|
Logs.debug (fun m -> m "insert policy %a" pp_id id) ;
|
||||||
Vmm_resources.insert_policy t.resources id policy >>= fun resources ->
|
let same_policy = match Vmm_resources.find_policy t.resources id with
|
||||||
Ok ({ t with resources }, [ reply (`String "added policy") ], `End)
|
| None -> false
|
||||||
|
| Some p' -> eq_policy policy p'
|
||||||
|
in
|
||||||
|
if same_policy then
|
||||||
|
Ok (t, [ reply (`String "no modification of policy") ], `End)
|
||||||
|
else
|
||||||
|
Vmm_resources.insert_policy t.resources id policy >>= fun resources ->
|
||||||
|
Ok ({ t with resources }, [ reply (`String "added policy") ], `End)
|
||||||
| `Policy_info ->
|
| `Policy_info ->
|
||||||
begin
|
begin
|
||||||
Logs.debug (fun m -> m "policy %a" pp_id id) ;
|
Logs.debug (fun m -> m "policy %a" pp_id id) ;
|
||||||
|
|
Loading…
Reference in a new issue