# HG changeset patch # User Rob Hoes # Date 1279116492 -3600 # Node ID 5e1ae12e5f4531a3fdc1de93535dece93be62456 # Parent 6e38ba9d62d64a0067865d5fc754fff3f86e90fd Update code to change edition to use new modules Signed-off-by: Rob Hoes diff -r 6e38ba9d62d6 -r 5e1ae12e5f45 ocaml/license/fakev6.ml --- a/ocaml/license/fakev6.ml +++ b/ocaml/license/fakev6.ml @@ -16,10 +16,6 @@ open D let initialise address port edition = - (* check edition *) - if not (List.mem edition ["STD"; "ADV"; "ENT"; "XD"; "PLT"]) then - failwith "unknown edition"; - ("real", Int32.of_int (-1)) let shutdown () = diff -r 6e38ba9d62d6 -r 5e1ae12e5f45 ocaml/license/license_init.ml --- a/ocaml/license/license_init.ml +++ b/ocaml/license/license_init.ml @@ -32,75 +32,60 @@ let existing_license_params = Db.Host.get_license_params ~__context ~self:host in let existing_edition = Db.Host.get_edition ~__context ~self:host in let default = default () in - let new_license = try - let existing_license = of_assoc_list existing_license_params in - match existing_edition with - | "free" -> - (* old Floodgate-free behaviour *) - begin try - License_file.do_parse_and_validate !License_file.filename; - info "Existing free license with expiry date %s still in effect." (Date.to_string (Date.of_float !license.expiry)); - !license (* do_parse_and_validate already sets !license *) - with - | License_file.License_expired l -> l (* keep expired license *) - | _ -> - (* activation file does not exist or is invalid *) - if existing_license.expiry < default.expiry then begin - info "Existing free license with expiry date %s still in effect." (Date.to_string (Date.of_float existing_license.expiry)); - {default with expiry = existing_license.expiry} - end else begin - info "Generating new free license, which needs to be activated in 30 days."; - default + let free = Edition.to_string Edition.Free in + let new_license = + try + let existing_license = of_assoc_list existing_license_params in + try match Edition.of_string existing_edition with + | Edition.Free -> + (* old Floodgate-free behaviour *) + begin try + License_file.do_parse_and_validate !License_file.filename; + info "Existing free license with expiry date %s still in effect." (Date.to_string (Date.of_float !license.expiry)); + !license (* do_parse_and_validate already sets !license *) + with + | License_file.License_expired l -> l (* keep expired license *) + | _ -> + (* activation file does not exist or is invalid *) + if existing_license.expiry < default.expiry then begin + info "Existing free license with expiry date %s still in effect." (Date.to_string (Date.of_float existing_license.expiry)); + {default with expiry = existing_license.expiry} + end else begin + info "Generating new free license, which needs to be activated in 30 days."; + default + end end - end - | "enterprise" | "platinum" | "enterprise-xd" -> - (* existing license is a v6 Essentials license -> try to check one out again *) - begin try - V6client.get_v6_license ~__context ~host ~edition:existing_edition; - with _ -> error "The license-server connection details (address or port) were missing or incomplete." end; - begin match !V6client.licensed with - | None -> - let upgrade_grace = read_grace_from_file () > Unix.time () in - if upgrade_grace then begin - info "No %s license is available, but we are still in the upgrade grace period." existing_edition; - {existing_license with grace = "upgrade grace"} - end else begin - info "No %s license is available. Essentials features have been disabled." existing_edition; - {existing_license with expiry = 0.} (* expiry date 0 means 01-01-1970, so always expired *) + | edition -> + (* existing license is a v6 Essentials license -> try to check one out again *) + begin try + V6client.get_v6_license ~__context ~host ~edition; + with _ -> error "The license-server connection details (address or port) were missing or incomplete." end; + begin match !V6client.licensed with + | None -> + let upgrade_grace = read_grace_from_file () > Unix.time () in + if upgrade_grace then begin + info "No %s license is available, but we are still in the upgrade grace period." existing_edition; + {existing_license with grace = "upgrade grace"} + end else begin + info "No %s license is available. Essentials features have been disabled." existing_edition; + {existing_license with expiry = 0.} (* expiry date 0 means 01-01-1970, so always expired *) + end + | Some license -> + info "Successfully checked out %s license." existing_edition; + (* delete upgrade-grace file, if it exists *) + Unixext.unlink_safe Xapi_globs.upgrade_grace_file; + if !V6client.grace then begin + Grace_retry.retry_periodically host existing_edition; + {existing_license with grace = "regular grace"; expiry = !V6client.expires} + end else + {existing_license with grace = "no"; expiry = !V6client.expires} end - | Some license -> - info "Successfully checked out %s license." existing_edition; - (* delete upgrade-grace file, if it exists *) - Unixext.unlink_safe Xapi_globs.upgrade_grace_file; - if !V6client.grace then begin - Grace_retry.retry_periodically host existing_edition; - {existing_license with grace = "regular grace"; expiry = !V6client.expires} - end else - {existing_license with grace = "no"; expiry = !V6client.expires} - end - | "" -> - (* upgrade from pre-MNR *) - if existing_license.sku = "XE Express" then begin - info "Upgrade from free: set to free edition."; - (* all existing license_params are kept; only fill in edition field *) - Db.Host.set_edition ~__context ~self:host ~value:"free"; - {default with sku = "free"; expiry = existing_license.expiry} - end else begin - info "Upgrade from Essentials: transition to enterprise edition (30-day grace license)."; - Db.Host.set_edition ~__context ~self:host ~value:"enterprise"; - let expiry = upgrade_grace_expiry () in - write_grace_to_file expiry; - Unixext.unlink_safe !License_file.filename; - V6alert.send_v6_upgrade_grace_license (); - let name = Edition.to_marketing_name Edition.Enterprise in - {default with sku = "enterprise"; expiry = expiry; grace = "upgrade grace"; sku_marketing_name = name} - end - | _ -> - warn "Edition field corrupted; generating a new free license, which needs to be activated in 30 days."; - default - with _ -> + with Edition.Undefined_edition _ -> + warn "Edition field corrupted; generating a new free license, which needs to be activated in 30 days."; + default + with License.Missing_license_param _ -> (* no license_params -> first boot *) - Db.Host.set_edition ~__context ~self:host ~value:"free"; + Db.Host.set_edition ~__context ~self:host ~value:free; begin try License_file.do_parse_and_validate !License_file.filename; info "Found a free-license activation key with expiry date %s." (Date.to_string (Date.of_float !license.expiry)); diff -r 6e38ba9d62d6 -r 5e1ae12e5f45 ocaml/license/v6client.ml --- a/ocaml/license/v6client.ml +++ b/ocaml/license/v6client.ml @@ -34,7 +34,7 @@ let v6rpc xml = Xmlrpcclient.do_xml_rpc_unix ~version:"1.0" ~filename:socket ~path:"/" xml (* conversion to v6 edition codes *) -let editions = ["enterprise", "ENT"; "platinum", "PLT"; "enterprise-xd", "XD"] +let editions = [Edition.Free, "FREE"] (* reset to not-licensed state *) let reset_state () = @@ -57,8 +57,8 @@ if success then begin match !licensed with | None -> () - | Some l -> - info "Checked %s license back in to license server." l; + | Some edition -> + info "Checked %s license back in to license server." (Edition.to_string edition); reset_state () end | _ -> @@ -123,11 +123,11 @@ end; (* check return status *) if license = "real" then begin - info "Checked out %s license from license server." edition; + info "Checked out %s license from license server." (Edition.to_string edition); licensed := Some edition; grace := false end else if license = "grace" then begin - info "Obtained %s grace license." edition; + info "Obtained %s grace license." (Edition.to_string edition); licensed := Some edition; grace := true; if Xapi_fist.reduce_grace_period () then @@ -153,7 +153,7 @@ let ls = Db.Host.get_license_server ~__context ~self:host in let address = List.assoc "address" ls in let port = int_of_string (List.assoc "port" ls) in - debug "obtaining %s v6 license; license server address: %s; port: %d" edition address port; + debug "obtaining %s v6 license; license server address: %s; port: %d" (Edition.to_string edition) address port; (* obtain v6 license *) connect_and_get_license edition address port with diff -r 6e38ba9d62d6 -r 5e1ae12e5f45 ocaml/license/v6client.mli --- a/ocaml/license/v6client.mli +++ b/ocaml/license/v6client.mli @@ -18,7 +18,7 @@ (** {2 State variables} *) -val licensed : string option ref +val licensed : Edition.edition option ref (** Equal to the edition string, if a license has been checked out, * or None otherwise *) val expires : float ref @@ -29,7 +29,7 @@ (** {2 Obtaining and Releasing a License} *) -val get_v6_license : __context:Context.t -> host:[`host] Ref.t -> edition:string -> unit +val get_v6_license : __context:Context.t -> host:[`host] Ref.t -> edition:Edition.edition -> unit (** Obtain a v6 license via the licensing daemon. The edition parameter is * either "enterprise" or "platinum". Uses the contact details in host.license_server. *) val release_v6_license : unit -> unit diff -r 6e38ba9d62d6 -r 5e1ae12e5f45 ocaml/xapi/xapi_host.ml --- a/ocaml/xapi/xapi_host.ml +++ b/ocaml/xapi/xapi_host.ml @@ -1214,53 +1214,54 @@ let current_edition = Db.Host.get_edition ~__context ~self:host in let current_license = !License.license in let default = License.default () in - let new_license = match edition with - | "free" -> - if current_edition = "free" then begin - info "The host's edition is already 'free'. No change."; - current_license - end else begin - info "Downgrading from %s to free edition." current_edition; - (* CA-27011: if HA is enabled block the application from downgrading to free *) - let pool = List.hd (Db.Pool.get_all ~__context) in - if Db.Pool.get_ha_enabled ~__context ~self:pool then - raise (Api_errors.Server_error (Api_errors.ha_is_enabled, [])) - else begin + let new_license = + try match Edition.of_string edition with + | Edition.Free -> + if Edition.of_string current_edition = Edition.Free then begin + info "The host's edition is already 'free'. No change."; + current_license + end else begin + info "Downgrading from %s to free edition." current_edition; + (* CA-27011: if HA is enabled block the application from downgrading to free *) + let pool = List.hd (Db.Pool.get_all ~__context) in + if Db.Pool.get_ha_enabled ~__context ~self:pool then + raise (Api_errors.Server_error (Api_errors.ha_is_enabled, [])) + else begin + V6client.release_v6_license (); + Unixext.unlink_safe !License_file.filename; (* delete activation key, if it exists *) + default (* default is free edition with 30 day grace validity *) + end + end + | e -> + (* Try to get the a v6 license; if one has already been checked out, + * it will be automatically checked back in. *) + if Edition.of_string current_edition = Edition.Free then + info "Upgrading from free to %s edition..." edition + else + info "(Re)applying %s license..." edition; + + begin try + V6client.get_v6_license ~__context ~host ~edition:e + with _ -> raise (Api_errors.Server_error (Api_errors.missing_connection_details, [])) end; + + begin match !V6client.licensed with + | None -> + error "License could not be checked out. Edition is not changed."; V6client.release_v6_license (); - Unixext.unlink_safe !License_file.filename; (* delete activation key, if it exists *) - default (* default is free edition with 30 day grace validity *) + raise (Api_errors.Server_error (Api_errors.license_checkout_error, [edition])) + | Some license -> + let name = Edition.to_marketing_name (Edition.of_string edition) in + let basic = {default with License.sku = edition; License.sku_marketing_name = name; + License.expiry = !V6client.expires} in + if !V6client.grace then begin + Grace_retry.retry_periodically host edition; + {basic with License.grace = "regular grace"} + end else + basic end - end - | "enterprise" | "platinum" | "enterprise-xd" -> - (* Try to get the a v6 license; if one has already been checked out, - * it will be automatically checked back in. *) - if current_edition = "free" then - info "Upgrading from free to %s edition..." edition - else - info "(Re)applying %s license..." edition; - - begin try - V6client.get_v6_license ~__context ~host ~edition - with _ -> raise (Api_errors.Server_error (Api_errors.missing_connection_details, [])) end; - - begin match !V6client.licensed with - | None -> - error "License could not be checked out. Edition is not changed."; - V6client.release_v6_license (); - raise (Api_errors.Server_error (Api_errors.license_checkout_error, [edition])) - | Some license -> - let name = Edition.to_marketing_name (Edition.of_string edition) in - let basic = {default with License.sku = edition; License.sku_marketing_name = name; - License.expiry = !V6client.expires} in - if !V6client.grace then begin - Grace_retry.retry_periodically host edition; - {basic with License.grace = "regular grace"} - end else - basic - end - | _ -> - error "Invalid edition ('%s')!" edition; - raise (Api_errors.Server_error (Api_errors.invalid_edition, [edition])) + with Edition.Undefined_edition e -> + error "Invalid edition ('%s')!" e; + raise (Api_errors.Server_error (Api_errors.invalid_edition, [e])) in License.license := new_license; Db.Host.set_edition ~__context ~self:host ~value:edition;