_migrate_cli.py 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. # Copyright 2021-2024 Avaiga Private Limited
  2. #
  3. # Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
  4. # the License. You may obtain a copy of the License at
  5. #
  6. # http://www.apache.org/licenses/LICENSE-2.0
  7. #
  8. # Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
  9. # an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
  10. # specific language governing permissions and limitations under the License.
  11. import sys
  12. from typing import List
  13. from taipy.common._cli._base_cli._abstract_cli import _AbstractCLI
  14. from taipy.common._cli._base_cli._taipy_parser import _TaipyParser
  15. from taipy.common.config import Config
  16. from ._migrate import (
  17. _migrate_fs_entities,
  18. _migrate_mongo_entities,
  19. _remove_backup_file_entities,
  20. _remove_backup_mongo_entities,
  21. _restore_migrate_file_entities,
  22. _restore_migrate_mongo_entities,
  23. )
  24. class _MigrateCLI(_AbstractCLI):
  25. _COMMAND_NAME = "migrate"
  26. _ARGUMENTS = ["--repository-type", "--skip-backup", "--restore", "--remove-backup"]
  27. @classmethod
  28. def create_parser(cls):
  29. migrate_parser = _TaipyParser._add_subparser(
  30. cls._COMMAND_NAME,
  31. help="Migrate entities created from old taipy versions to be compatible with the current taipy version. "
  32. " The entity migration should be performed only after updating taipy code to the current version.",
  33. )
  34. migrate_parser.add_argument(
  35. "--repository-type",
  36. nargs="+",
  37. help="The type of repository to migrate. If filesystem, a path to the database folder should be informed. "
  38. "In case of mongo host, port, user and password must be informed, if left empty it "
  39. "is assumed default values",
  40. )
  41. migrate_parser.add_argument(
  42. "--skip-backup",
  43. action="store_true",
  44. help="Skip the backup of entities before migration.",
  45. )
  46. migrate_parser.add_argument(
  47. "--restore",
  48. action="store_true",
  49. help="Restore the migration of entities from backup folder.",
  50. )
  51. migrate_parser.add_argument(
  52. "--remove-backup",
  53. action="store_true",
  54. help="Remove the backup of entities. Only use this option if the migration was successful.",
  55. )
  56. @classmethod
  57. def handle_command(cls):
  58. args = cls._parse_arguments()
  59. if not args:
  60. return
  61. if not args.repository_type:
  62. _TaipyParser._sub_taipyparsers.get(cls._COMMAND_NAME).print_help()
  63. cls._logger.error("The following arguments are required: --repository-type")
  64. sys.exit(1)
  65. repository_type = args.repository_type[0]
  66. repository_args = args.repository_type[1:] if len(args.repository_type) > 1 else [None]
  67. if args.restore:
  68. cls.__handle_restore_backup(repository_type, repository_args)
  69. if args.remove_backup:
  70. cls.__handle_remove_backup(repository_type, repository_args)
  71. do_backup = not args.skip_backup
  72. cls.__migrate_entities(repository_type, repository_args, do_backup)
  73. sys.exit(0)
  74. @classmethod
  75. def __handle_remove_backup(cls, repository_type: str, repository_args: List):
  76. if repository_type == "filesystem":
  77. path = repository_args[0] or Config.core.taipy_storage_folder
  78. if not _remove_backup_file_entities(path):
  79. sys.exit(1)
  80. elif repository_type == "mongo":
  81. if not _remove_backup_mongo_entities():
  82. sys.exit(1)
  83. else:
  84. cls._logger.error(f"Unknown repository type {repository_type}")
  85. sys.exit(1)
  86. sys.exit(0)
  87. @classmethod
  88. def __handle_restore_backup(cls, repository_type: str, repository_args: List):
  89. if repository_type == "filesystem":
  90. path = repository_args[0] or Config.core.taipy_storage_folder
  91. if not _restore_migrate_file_entities(path):
  92. sys.exit(1)
  93. elif repository_type == "mongo":
  94. mongo_args = repository_args[1:5] if repository_args[0] else []
  95. if not _restore_migrate_mongo_entities(*mongo_args):
  96. sys.exit(1)
  97. else:
  98. cls._logger.error(f"Unknown repository type {repository_type}")
  99. sys.exit(1)
  100. sys.exit(0)
  101. @classmethod
  102. def __migrate_entities(cls, repository_type: str, repository_args: List, do_backup: bool):
  103. if repository_type == "filesystem":
  104. path = repository_args[0] or Config.core.taipy_storage_folder
  105. if not _migrate_fs_entities(path, do_backup):
  106. sys.exit(1)
  107. elif repository_type == "mongo":
  108. mongo_args = repository_args[1:5] if repository_args[0] else []
  109. _migrate_mongo_entities(*mongo_args, backup=do_backup) # type: ignore
  110. else:
  111. cls._logger.error(f"Unknown repository type {repository_type}")
  112. sys.exit(1)