Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

process_tenant_plugin_autoupgrade_check_task.py 6.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. import traceback
  2. import typing
  3. import click
  4. from celery import shared_task # type: ignore
  5. from core.helper import marketplace
  6. from core.helper.marketplace import MarketplacePluginDeclaration
  7. from core.plugin.entities.plugin import PluginInstallationSource
  8. from core.plugin.impl.plugin import PluginInstaller
  9. from models.account import TenantPluginAutoUpgradeStrategy
  10. RETRY_TIMES_OF_ONE_PLUGIN_IN_ONE_TENANT = 3
  11. cached_plugin_manifests: dict[str, typing.Union[MarketplacePluginDeclaration, None]] = {}
  12. def marketplace_batch_fetch_plugin_manifests(
  13. plugin_ids_plain_list: list[str],
  14. ) -> list[MarketplacePluginDeclaration]:
  15. global cached_plugin_manifests
  16. # return marketplace.batch_fetch_plugin_manifests(plugin_ids_plain_list)
  17. not_included_plugin_ids = [
  18. plugin_id for plugin_id in plugin_ids_plain_list if plugin_id not in cached_plugin_manifests
  19. ]
  20. if not_included_plugin_ids:
  21. manifests = marketplace.batch_fetch_plugin_manifests_ignore_deserialization_error(not_included_plugin_ids)
  22. for manifest in manifests:
  23. cached_plugin_manifests[manifest.plugin_id] = manifest
  24. if (
  25. len(manifests) == 0
  26. ): # this indicates that the plugin not found in marketplace, should set None in cache to prevent future check
  27. for plugin_id in not_included_plugin_ids:
  28. cached_plugin_manifests[plugin_id] = None
  29. result: list[MarketplacePluginDeclaration] = []
  30. for plugin_id in plugin_ids_plain_list:
  31. final_manifest = cached_plugin_manifests.get(plugin_id)
  32. if final_manifest is not None:
  33. result.append(final_manifest)
  34. return result
  35. @shared_task(queue="plugin")
  36. def process_tenant_plugin_autoupgrade_check_task(
  37. tenant_id: str,
  38. strategy_setting: TenantPluginAutoUpgradeStrategy.StrategySetting,
  39. upgrade_time_of_day: int,
  40. upgrade_mode: TenantPluginAutoUpgradeStrategy.UpgradeMode,
  41. exclude_plugins: list[str],
  42. include_plugins: list[str],
  43. ):
  44. try:
  45. manager = PluginInstaller()
  46. click.echo(
  47. click.style(
  48. "Checking upgradable plugin for tenant: {}".format(tenant_id),
  49. fg="green",
  50. )
  51. )
  52. if strategy_setting == TenantPluginAutoUpgradeStrategy.StrategySetting.DISABLED:
  53. return
  54. # get plugin_ids to check
  55. plugin_ids: list[tuple[str, str, str]] = [] # plugin_id, version, unique_identifier
  56. click.echo(click.style("Upgrade mode: {}".format(upgrade_mode), fg="green"))
  57. if upgrade_mode == TenantPluginAutoUpgradeStrategy.UpgradeMode.PARTIAL and include_plugins:
  58. all_plugins = manager.list_plugins(tenant_id)
  59. for plugin in all_plugins:
  60. if plugin.source == PluginInstallationSource.Marketplace and plugin.plugin_id in include_plugins:
  61. plugin_ids.append(
  62. (
  63. plugin.plugin_id,
  64. plugin.version,
  65. plugin.plugin_unique_identifier,
  66. )
  67. )
  68. elif upgrade_mode == TenantPluginAutoUpgradeStrategy.UpgradeMode.EXCLUDE:
  69. # get all plugins and remove excluded plugins
  70. all_plugins = manager.list_plugins(tenant_id)
  71. plugin_ids = [
  72. (plugin.plugin_id, plugin.version, plugin.plugin_unique_identifier)
  73. for plugin in all_plugins
  74. if plugin.source == PluginInstallationSource.Marketplace and plugin.plugin_id not in exclude_plugins
  75. ]
  76. elif upgrade_mode == TenantPluginAutoUpgradeStrategy.UpgradeMode.ALL:
  77. all_plugins = manager.list_plugins(tenant_id)
  78. plugin_ids = [
  79. (plugin.plugin_id, plugin.version, plugin.plugin_unique_identifier)
  80. for plugin in all_plugins
  81. if plugin.source == PluginInstallationSource.Marketplace
  82. ]
  83. if not plugin_ids:
  84. return
  85. plugin_ids_plain_list = [plugin_id for plugin_id, _, _ in plugin_ids]
  86. manifests = marketplace_batch_fetch_plugin_manifests(plugin_ids_plain_list)
  87. if not manifests:
  88. return
  89. for manifest in manifests:
  90. for plugin_id, version, original_unique_identifier in plugin_ids:
  91. if manifest.plugin_id != plugin_id:
  92. continue
  93. try:
  94. current_version = version
  95. latest_version = manifest.latest_version
  96. def fix_only_checker(latest_version, current_version):
  97. latest_version_tuple = tuple(int(val) for val in latest_version.split("."))
  98. current_version_tuple = tuple(int(val) for val in current_version.split("."))
  99. if (
  100. latest_version_tuple[0] == current_version_tuple[0]
  101. and latest_version_tuple[1] == current_version_tuple[1]
  102. ):
  103. return latest_version_tuple[2] != current_version_tuple[2]
  104. return False
  105. version_checker = {
  106. TenantPluginAutoUpgradeStrategy.StrategySetting.LATEST: lambda latest_version,
  107. current_version: latest_version != current_version,
  108. TenantPluginAutoUpgradeStrategy.StrategySetting.FIX_ONLY: fix_only_checker,
  109. }
  110. if version_checker[strategy_setting](latest_version, current_version):
  111. # execute upgrade
  112. new_unique_identifier = manifest.latest_package_identifier
  113. marketplace.record_install_plugin_event(new_unique_identifier)
  114. click.echo(
  115. click.style(
  116. "Upgrade plugin: {} -> {}".format(original_unique_identifier, new_unique_identifier),
  117. fg="green",
  118. )
  119. )
  120. task_start_resp = manager.upgrade_plugin(
  121. tenant_id,
  122. original_unique_identifier,
  123. new_unique_identifier,
  124. PluginInstallationSource.Marketplace,
  125. {
  126. "plugin_unique_identifier": new_unique_identifier,
  127. },
  128. )
  129. except Exception as e:
  130. click.echo(click.style("Error when upgrading plugin: {}".format(e), fg="red"))
  131. traceback.print_exc()
  132. break
  133. except Exception as e:
  134. click.echo(click.style("Error when checking upgradable plugin: {}".format(e), fg="red"))
  135. traceback.print_exc()
  136. return