# Copyright(c) 2015-2023 ACCESS CO., LTD. All rights reserved.
use Croma
defmodule AntikytheraCore.Version.Core do
alias Antikythera.{Time, Env, VersionStr, ContextId}
alias AntikytheraCore.{Version, GearManager, GearModule, GearLog}
alias AntikytheraCore.Version.{Artifact, History}
require AntikytheraCore.Logger, as: L
defunp current_antikythera_instance_version!() :: VersionStr.t() do
Version.current_version(Env.antikythera_instance_name()) ||
raise "antikythera instance version is not found!"
end
defun upgrade_to_next_version() :: :ok do
current_version = current_antikythera_instance_version!()
case History.next_upgradable_version(Env.antikythera_instance_name(), current_version) do
nil ->
L.info("skip upgrade of antikythera instance: already the latest (#{current_version})")
next_version ->
upgrade(next_version)
end
end
defunp upgrade(version :: v[VersionStr.t()]) :: :ok do
L.info("start to upgrade core to #{version}")
Artifact.copy_core_release_tgz(version)
with {:ok, version_charlist} <-
:release_handler.unpack_release('#{version}/#{Env.antikythera_instance_name()}'),
{:ok, _, _} <- :release_handler.check_install_release(version_charlist, [:purge]),
{:ok, _, _} <- :release_handler.install_release(version_charlist) do
# :release_handler.install_release/1 resets envs of Applications to the default ones.
# Therefore, Logger loses its translators which are added by Logger.add_translator/1.
# We need to add them again.
AntikytheraCore.add_translator_to_logger()
emit_success_message_to_all_log_files(version)
else
{:error, reason} -> L.error("failed to upgrade antikythera instance: #{inspect(reason)}")
end
end
defunp emit_success_message_to_all_log_files(version :: v[VersionStr.t()]) :: :ok do
message = "successfully upgraded core to #{version}"
L.info(message)
GearManager.running_gear_names()
|> Enum.each(fn gear_name ->
GearLog.Writer.info(
GearModule.logger(gear_name),
Time.now(),
ContextId.system_context(),
message
)
end)
end
end