您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

process_tenant_plugin_autoupgrade_check_task.py 6.7KB

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