localstack 4.13.2.dev36__tar.gz → 4.13.2.dev53__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (144) hide show
  1. {localstack-4.13.2.dev36/localstack.egg-info → localstack-4.13.2.dev53}/PKG-INFO +1 -1
  2. {localstack-4.13.2.dev36 → localstack-4.13.2.dev53/localstack.egg-info}/PKG-INFO +1 -1
  3. {localstack-4.13.2.dev36 → localstack-4.13.2.dev53}/localstack.egg-info/SOURCES.txt +14 -1
  4. {localstack-4.13.2.dev36 → localstack-4.13.2.dev53}/localstack.egg-info/entry_points.txt +2 -2
  5. {localstack-4.13.2.dev36 → localstack-4.13.2.dev53}/localstack_cli/runtime/hooks.py +2 -2
  6. localstack-4.13.2.dev53/localstack_cli/testing/__init__.py +1 -0
  7. localstack-4.13.2.dev53/localstack_cli/testing/config.py +4 -0
  8. {localstack-4.13.2.dev36 → localstack-4.13.2.dev53}/localstack_cli/version.py +3 -3
  9. {localstack-4.13.2.dev36 → localstack-4.13.2.dev53}/plux.ini +2 -2
  10. localstack-4.13.2.dev53/tests/bootstrap/extensions/test_extension_install.py +52 -0
  11. localstack-4.13.2.dev53/tests/integration/replicator/__init__.py +0 -0
  12. localstack-4.13.2.dev53/tests/integration/replicator/core/__init__.py +0 -0
  13. localstack-4.13.2.dev53/tests/integration/replicator/core/test_replicator_cli.py +146 -0
  14. localstack-4.13.2.dev53/tests/unit/__init__.py +0 -0
  15. localstack-4.13.2.dev53/tests/unit/cli/__init__.py +0 -0
  16. localstack-4.13.2.dev53/tests/unit/pro/__init__.py +0 -0
  17. localstack-4.13.2.dev53/tests/unit/replicator/__init__.py +0 -0
  18. localstack-4.13.2.dev53/tests/unit/replicator/test_profile_loading.py +87 -0
  19. {localstack-4.13.2.dev36 → localstack-4.13.2.dev53}/.github/workflows/tests-cli.yml +0 -0
  20. {localstack-4.13.2.dev36 → localstack-4.13.2.dev53}/.gitignore +0 -0
  21. {localstack-4.13.2.dev36 → localstack-4.13.2.dev53}/Makefile +0 -0
  22. {localstack-4.13.2.dev36 → localstack-4.13.2.dev53}/README.md +0 -0
  23. {localstack-4.13.2.dev36 → localstack-4.13.2.dev53}/bin/localstack +0 -0
  24. {localstack-4.13.2.dev36 → localstack-4.13.2.dev53}/localstack.egg-info/dependency_links.txt +0 -0
  25. {localstack-4.13.2.dev36 → localstack-4.13.2.dev53}/localstack.egg-info/requires.txt +0 -0
  26. {localstack-4.13.2.dev36 → localstack-4.13.2.dev53}/localstack.egg-info/top_level.txt +0 -0
  27. {localstack-4.13.2.dev36 → localstack-4.13.2.dev53}/localstack_cli/__init__.py +0 -0
  28. {localstack-4.13.2.dev36 → localstack-4.13.2.dev53}/localstack_cli/cli/__init__.py +0 -0
  29. {localstack-4.13.2.dev36 → localstack-4.13.2.dev53}/localstack_cli/cli/console.py +0 -0
  30. {localstack-4.13.2.dev36 → localstack-4.13.2.dev53}/localstack_cli/cli/core_plugin.py +0 -0
  31. {localstack-4.13.2.dev36 → localstack-4.13.2.dev53}/localstack_cli/cli/exceptions.py +0 -0
  32. {localstack-4.13.2.dev36 → localstack-4.13.2.dev53}/localstack_cli/cli/localstack.py +0 -0
  33. {localstack-4.13.2.dev36 → localstack-4.13.2.dev53}/localstack_cli/cli/lpm.py +0 -0
  34. {localstack-4.13.2.dev36 → localstack-4.13.2.dev53}/localstack_cli/cli/main.py +0 -0
  35. {localstack-4.13.2.dev36 → localstack-4.13.2.dev53}/localstack_cli/cli/plugin.py +0 -0
  36. {localstack-4.13.2.dev36 → localstack-4.13.2.dev53}/localstack_cli/cli/plugins.py +0 -0
  37. {localstack-4.13.2.dev36 → localstack-4.13.2.dev53}/localstack_cli/cli/profiles.py +0 -0
  38. {localstack-4.13.2.dev36 → localstack-4.13.2.dev53}/localstack_cli/config.py +0 -0
  39. {localstack-4.13.2.dev36 → localstack-4.13.2.dev53}/localstack_cli/constants.py +0 -0
  40. {localstack-4.13.2.dev36 → localstack-4.13.2.dev53}/localstack_cli/logging/__init__.py +0 -0
  41. {localstack-4.13.2.dev36 → localstack-4.13.2.dev53}/localstack_cli/logging/format.py +0 -0
  42. {localstack-4.13.2.dev36 → localstack-4.13.2.dev53}/localstack_cli/logging/setup.py +0 -0
  43. {localstack-4.13.2.dev36 → localstack-4.13.2.dev53}/localstack_cli/packages/__init__.py +0 -0
  44. {localstack-4.13.2.dev36 → localstack-4.13.2.dev53}/localstack_cli/packages/api.py +0 -0
  45. {localstack-4.13.2.dev36 → localstack-4.13.2.dev53}/localstack_cli/packages/core.py +0 -0
  46. {localstack-4.13.2.dev36 → localstack-4.13.2.dev53}/localstack_cli/pro/__init__.py +0 -0
  47. {localstack-4.13.2.dev36 → localstack-4.13.2.dev53}/localstack_cli/pro/core/__init__.py +0 -0
  48. {localstack-4.13.2.dev36 → localstack-4.13.2.dev53}/localstack_cli/pro/core/bootstrap/__init__.py +0 -0
  49. {localstack-4.13.2.dev36 → localstack-4.13.2.dev53}/localstack_cli/pro/core/bootstrap/auth.py +0 -0
  50. {localstack-4.13.2.dev36 → localstack-4.13.2.dev53}/localstack_cli/pro/core/bootstrap/dns_utils.py +0 -0
  51. {localstack-4.13.2.dev36 → localstack-4.13.2.dev53}/localstack_cli/pro/core/bootstrap/entitlements.py +0 -0
  52. {localstack-4.13.2.dev36 → localstack-4.13.2.dev53}/localstack_cli/pro/core/bootstrap/extensions/__init__.py +0 -0
  53. {localstack-4.13.2.dev36 → localstack-4.13.2.dev53}/localstack_cli/pro/core/bootstrap/extensions/__main__.py +0 -0
  54. {localstack-4.13.2.dev36 → localstack-4.13.2.dev53}/localstack_cli/pro/core/bootstrap/extensions/autoinstall.py +0 -0
  55. {localstack-4.13.2.dev36 → localstack-4.13.2.dev53}/localstack_cli/pro/core/bootstrap/extensions/bootstrap.py +0 -0
  56. {localstack-4.13.2.dev36 → localstack-4.13.2.dev53}/localstack_cli/pro/core/bootstrap/extensions/repository.py +0 -0
  57. {localstack-4.13.2.dev36 → localstack-4.13.2.dev53}/localstack_cli/pro/core/bootstrap/licensingv2.py +0 -0
  58. {localstack-4.13.2.dev36 → localstack-4.13.2.dev53}/localstack_cli/pro/core/bootstrap/pods/__init__.py +0 -0
  59. {localstack-4.13.2.dev36 → localstack-4.13.2.dev53}/localstack_cli/pro/core/bootstrap/pods/api_types.py +0 -0
  60. {localstack-4.13.2.dev36 → localstack-4.13.2.dev53}/localstack_cli/pro/core/bootstrap/pods/constants.py +0 -0
  61. {localstack-4.13.2.dev36 → localstack-4.13.2.dev53}/localstack_cli/pro/core/bootstrap/pods/remotes/__init__.py +0 -0
  62. {localstack-4.13.2.dev36 → localstack-4.13.2.dev53}/localstack_cli/pro/core/bootstrap/pods/remotes/api.py +0 -0
  63. {localstack-4.13.2.dev36 → localstack-4.13.2.dev53}/localstack_cli/pro/core/bootstrap/pods/remotes/configs.py +0 -0
  64. {localstack-4.13.2.dev36 → localstack-4.13.2.dev53}/localstack_cli/pro/core/bootstrap/pods/remotes/params.py +0 -0
  65. {localstack-4.13.2.dev36 → localstack-4.13.2.dev53}/localstack_cli/pro/core/bootstrap/pods_client.py +0 -0
  66. {localstack-4.13.2.dev36 → localstack-4.13.2.dev53}/localstack_cli/pro/core/cli/__init__.py +0 -0
  67. {localstack-4.13.2.dev36 → localstack-4.13.2.dev53}/localstack_cli/pro/core/cli/auth.py +0 -0
  68. {localstack-4.13.2.dev36 → localstack-4.13.2.dev53}/localstack_cli/pro/core/cli/aws.py +0 -0
  69. {localstack-4.13.2.dev36 → localstack-4.13.2.dev53}/localstack_cli/pro/core/cli/cli.py +0 -0
  70. {localstack-4.13.2.dev36 → localstack-4.13.2.dev53}/localstack_cli/pro/core/cli/click_utils.py +0 -0
  71. {localstack-4.13.2.dev36 → localstack-4.13.2.dev53}/localstack_cli/pro/core/cli/cloud_pods.py +0 -0
  72. {localstack-4.13.2.dev36 → localstack-4.13.2.dev53}/localstack_cli/pro/core/cli/diff_view.py +0 -0
  73. {localstack-4.13.2.dev36 → localstack-4.13.2.dev53}/localstack_cli/pro/core/cli/ephemeral.py +0 -0
  74. {localstack-4.13.2.dev36 → localstack-4.13.2.dev53}/localstack_cli/pro/core/cli/extensions.py +0 -0
  75. {localstack-4.13.2.dev36 → localstack-4.13.2.dev53}/localstack_cli/pro/core/cli/iam.py +0 -0
  76. {localstack-4.13.2.dev36 → localstack-4.13.2.dev53}/localstack_cli/pro/core/cli/license.py +0 -0
  77. {localstack-4.13.2.dev36 → localstack-4.13.2.dev53}/localstack_cli/pro/core/cli/localstack.py +0 -0
  78. {localstack-4.13.2.dev36 → localstack-4.13.2.dev53}/localstack_cli/pro/core/cli/replicator.py +0 -0
  79. {localstack-4.13.2.dev36 → localstack-4.13.2.dev53}/localstack_cli/pro/core/cli/state.py +0 -0
  80. {localstack-4.13.2.dev36 → localstack-4.13.2.dev53}/localstack_cli/pro/core/cli/tree_view.py +0 -0
  81. {localstack-4.13.2.dev36 → localstack-4.13.2.dev53}/localstack_cli/pro/core/config.py +0 -0
  82. {localstack-4.13.2.dev36 → localstack-4.13.2.dev53}/localstack_cli/pro/core/constants.py +0 -0
  83. {localstack-4.13.2.dev36 → localstack-4.13.2.dev53}/localstack_cli/pro/core/plugins.py +0 -0
  84. {localstack-4.13.2.dev36 → localstack-4.13.2.dev53}/localstack_cli/runtime/__init__.py +0 -0
  85. {localstack-4.13.2.dev36 → localstack-4.13.2.dev53}/localstack_cli/runtime/exceptions.py +0 -0
  86. {localstack-4.13.2.dev36 → localstack-4.13.2.dev53}/localstack_cli/utils/__init__.py +0 -0
  87. {localstack-4.13.2.dev36 → localstack-4.13.2.dev53}/localstack_cli/utils/analytics/__init__.py +0 -0
  88. {localstack-4.13.2.dev36 → localstack-4.13.2.dev53}/localstack_cli/utils/analytics/cli.py +0 -0
  89. {localstack-4.13.2.dev36 → localstack-4.13.2.dev53}/localstack_cli/utils/analytics/client.py +0 -0
  90. {localstack-4.13.2.dev36 → localstack-4.13.2.dev53}/localstack_cli/utils/analytics/events.py +0 -0
  91. {localstack-4.13.2.dev36 → localstack-4.13.2.dev53}/localstack_cli/utils/analytics/logger.py +0 -0
  92. {localstack-4.13.2.dev36 → localstack-4.13.2.dev53}/localstack_cli/utils/analytics/metadata.py +0 -0
  93. {localstack-4.13.2.dev36 → localstack-4.13.2.dev53}/localstack_cli/utils/analytics/publisher.py +0 -0
  94. {localstack-4.13.2.dev36 → localstack-4.13.2.dev53}/localstack_cli/utils/analytics/service_request_aggregator.py +0 -0
  95. {localstack-4.13.2.dev36 → localstack-4.13.2.dev53}/localstack_cli/utils/archives.py +0 -0
  96. {localstack-4.13.2.dev36 → localstack-4.13.2.dev53}/localstack_cli/utils/batching.py +0 -0
  97. {localstack-4.13.2.dev36 → localstack-4.13.2.dev53}/localstack_cli/utils/bootstrap.py +0 -0
  98. {localstack-4.13.2.dev36 → localstack-4.13.2.dev53}/localstack_cli/utils/checksum.py +0 -0
  99. {localstack-4.13.2.dev36 → localstack-4.13.2.dev53}/localstack_cli/utils/collections.py +0 -0
  100. {localstack-4.13.2.dev36 → localstack-4.13.2.dev53}/localstack_cli/utils/common.py +0 -0
  101. {localstack-4.13.2.dev36 → localstack-4.13.2.dev53}/localstack_cli/utils/container_networking.py +0 -0
  102. {localstack-4.13.2.dev36 → localstack-4.13.2.dev53}/localstack_cli/utils/container_utils/__init__.py +0 -0
  103. {localstack-4.13.2.dev36 → localstack-4.13.2.dev53}/localstack_cli/utils/container_utils/container_client.py +0 -0
  104. {localstack-4.13.2.dev36 → localstack-4.13.2.dev53}/localstack_cli/utils/container_utils/docker_cmd_client.py +0 -0
  105. {localstack-4.13.2.dev36 → localstack-4.13.2.dev53}/localstack_cli/utils/container_utils/docker_sdk_client.py +0 -0
  106. {localstack-4.13.2.dev36 → localstack-4.13.2.dev53}/localstack_cli/utils/crypto.py +0 -0
  107. {localstack-4.13.2.dev36 → localstack-4.13.2.dev53}/localstack_cli/utils/docker_utils.py +0 -0
  108. {localstack-4.13.2.dev36 → localstack-4.13.2.dev53}/localstack_cli/utils/files.py +0 -0
  109. {localstack-4.13.2.dev36 → localstack-4.13.2.dev53}/localstack_cli/utils/functions.py +0 -0
  110. {localstack-4.13.2.dev36 → localstack-4.13.2.dev53}/localstack_cli/utils/http.py +0 -0
  111. {localstack-4.13.2.dev36 → localstack-4.13.2.dev53}/localstack_cli/utils/json.py +0 -0
  112. {localstack-4.13.2.dev36 → localstack-4.13.2.dev53}/localstack_cli/utils/net.py +0 -0
  113. {localstack-4.13.2.dev36 → localstack-4.13.2.dev53}/localstack_cli/utils/no_exit_argument_parser.py +0 -0
  114. {localstack-4.13.2.dev36 → localstack-4.13.2.dev53}/localstack_cli/utils/numbers.py +0 -0
  115. {localstack-4.13.2.dev36 → localstack-4.13.2.dev53}/localstack_cli/utils/objects.py +0 -0
  116. {localstack-4.13.2.dev36 → localstack-4.13.2.dev53}/localstack_cli/utils/patch.py +0 -0
  117. {localstack-4.13.2.dev36 → localstack-4.13.2.dev53}/localstack_cli/utils/platform.py +0 -0
  118. {localstack-4.13.2.dev36 → localstack-4.13.2.dev53}/localstack_cli/utils/run.py +0 -0
  119. {localstack-4.13.2.dev36 → localstack-4.13.2.dev53}/localstack_cli/utils/server/__init__.py +0 -0
  120. {localstack-4.13.2.dev36 → localstack-4.13.2.dev53}/localstack_cli/utils/server/tcp_proxy.py +0 -0
  121. {localstack-4.13.2.dev36 → localstack-4.13.2.dev53}/localstack_cli/utils/serving.py +0 -0
  122. {localstack-4.13.2.dev36 → localstack-4.13.2.dev53}/localstack_cli/utils/ssl.py +0 -0
  123. {localstack-4.13.2.dev36 → localstack-4.13.2.dev53}/localstack_cli/utils/strings.py +0 -0
  124. {localstack-4.13.2.dev36 → localstack-4.13.2.dev53}/localstack_cli/utils/sync.py +0 -0
  125. {localstack-4.13.2.dev36 → localstack-4.13.2.dev53}/localstack_cli/utils/threads.py +0 -0
  126. {localstack-4.13.2.dev36 → localstack-4.13.2.dev53}/localstack_cli/utils/time.py +0 -0
  127. {localstack-4.13.2.dev36 → localstack-4.13.2.dev53}/localstack_cli/utils/urls.py +0 -0
  128. {localstack-4.13.2.dev36 → localstack-4.13.2.dev53}/localstack_cli/utils/venv.py +0 -0
  129. {localstack-4.13.2.dev36 → localstack-4.13.2.dev53}/localstack_cli/utils/xml.py +0 -0
  130. {localstack-4.13.2.dev36 → localstack-4.13.2.dev53}/pyproject.toml +0 -0
  131. {localstack-4.13.2.dev36 → localstack-4.13.2.dev53}/setup.cfg +0 -0
  132. {localstack-4.13.2.dev36 → localstack-4.13.2.dev53}/tests/__init__.py +0 -0
  133. {localstack-4.13.2.dev36/tests/unit → localstack-4.13.2.dev53/tests/bootstrap}/__init__.py +0 -0
  134. {localstack-4.13.2.dev36/tests/unit/cli → localstack-4.13.2.dev53/tests/bootstrap/extensions}/__init__.py +0 -0
  135. {localstack-4.13.2.dev36 → localstack-4.13.2.dev53}/tests/cli/__init__.py +0 -0
  136. {localstack-4.13.2.dev36 → localstack-4.13.2.dev53}/tests/cli/conftest.py +0 -0
  137. {localstack-4.13.2.dev36 → localstack-4.13.2.dev53}/tests/cli/test_cli.py +0 -0
  138. {localstack-4.13.2.dev36 → localstack-4.13.2.dev53}/tests/cli/test_cli_pro.py +0 -0
  139. {localstack-4.13.2.dev36 → localstack-4.13.2.dev53}/tests/conftest.py +0 -0
  140. {localstack-4.13.2.dev36/tests/unit/pro → localstack-4.13.2.dev53/tests/integration}/__init__.py +0 -0
  141. {localstack-4.13.2.dev36 → localstack-4.13.2.dev53}/tests/unit/cli/test_cli.py +0 -0
  142. {localstack-4.13.2.dev36 → localstack-4.13.2.dev53}/tests/unit/cli/test_lpm.py +0 -0
  143. {localstack-4.13.2.dev36 → localstack-4.13.2.dev53}/tests/unit/cli/test_profiles.py +0 -0
  144. {localstack-4.13.2.dev36 → localstack-4.13.2.dev53}/tests/unit/pro/test_cli.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: localstack
3
- Version: 4.13.2.dev36
3
+ Version: 4.13.2.dev53
4
4
  Summary: The LocalStack Command Line Interface
5
5
  Author-email: LocalStack Contributors <info@localstack.cloud>
6
6
  License-Expression: Apache-2.0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: localstack
3
- Version: 4.13.2.dev36
3
+ Version: 4.13.2.dev53
4
4
  Summary: The LocalStack Command Line Interface
5
5
  Author-email: LocalStack Contributors <info@localstack.cloud>
6
6
  License-Expression: Apache-2.0
@@ -64,6 +64,8 @@ pyproject.toml
64
64
  ./localstack_cli/runtime/__init__.py
65
65
  ./localstack_cli/runtime/exceptions.py
66
66
  ./localstack_cli/runtime/hooks.py
67
+ ./localstack_cli/testing/__init__.py
68
+ ./localstack_cli/testing/config.py
67
69
  ./localstack_cli/utils/__init__.py
68
70
  ./localstack_cli/utils/archives.py
69
71
  ./localstack_cli/utils/batching.py
@@ -176,6 +178,8 @@ localstack_cli/pro/core/cli/tree_view.py
176
178
  localstack_cli/runtime/__init__.py
177
179
  localstack_cli/runtime/exceptions.py
178
180
  localstack_cli/runtime/hooks.py
181
+ localstack_cli/testing/__init__.py
182
+ localstack_cli/testing/config.py
179
183
  localstack_cli/utils/__init__.py
180
184
  localstack_cli/utils/archives.py
181
185
  localstack_cli/utils/batching.py
@@ -222,14 +226,23 @@ localstack_cli/utils/server/__init__.py
222
226
  localstack_cli/utils/server/tcp_proxy.py
223
227
  tests/__init__.py
224
228
  tests/conftest.py
229
+ tests/bootstrap/__init__.py
230
+ tests/bootstrap/extensions/__init__.py
231
+ tests/bootstrap/extensions/test_extension_install.py
225
232
  tests/cli/__init__.py
226
233
  tests/cli/conftest.py
227
234
  tests/cli/test_cli.py
228
235
  tests/cli/test_cli_pro.py
236
+ tests/integration/__init__.py
237
+ tests/integration/replicator/__init__.py
238
+ tests/integration/replicator/core/__init__.py
239
+ tests/integration/replicator/core/test_replicator_cli.py
229
240
  tests/unit/__init__.py
230
241
  tests/unit/cli/__init__.py
231
242
  tests/unit/cli/test_cli.py
232
243
  tests/unit/cli/test_lpm.py
233
244
  tests/unit/cli/test_profiles.py
234
245
  tests/unit/pro/__init__.py
235
- tests/unit/pro/test_cli.py
246
+ tests/unit/pro/test_cli.py
247
+ tests/unit/replicator/__init__.py
248
+ tests/unit/replicator/test_profile_loading.py
@@ -1,12 +1,12 @@
1
1
  [console_scripts]
2
2
  localstack = localstack_cli.cli.main:main
3
3
 
4
- [localstack.hooks.configure_localstack_container]
4
+ [localstack_cli.hooks.configure_localstack_container]
5
5
  configure_extensions_dev_container = localstack_cli.pro.core.plugins:configure_extensions_dev_container
6
6
  configure_pro_container = localstack_cli.pro.core.plugins:configure_pro_container
7
7
  set_analytics_header = localstack_cli.utils.analytics.metadata:set_analytics_header
8
8
 
9
- [localstack.hooks.prepare_host]
9
+ [localstack_cli.hooks.prepare_host]
10
10
  activate_pro_key_on_host = localstack_cli.pro.core.plugins:activate_pro_key_on_host
11
11
  configure_extensions_dev_host = localstack_cli.pro.core.plugins:configure_extensions_dev_host
12
12
  patch_community_pro_detection = localstack_cli.pro.core.plugins:patch_community_pro_detection
@@ -3,8 +3,8 @@ import functools
3
3
  from plux import PluginManager, plugin
4
4
 
5
5
  # plugin namespace constants
6
- HOOKS_CONFIGURE_LOCALSTACK_CONTAINER = "localstack.hooks.configure_localstack_container"
7
- HOOKS_PREPARE_HOST = "localstack.hooks.prepare_host"
6
+ HOOKS_CONFIGURE_LOCALSTACK_CONTAINER = "localstack_cli.hooks.configure_localstack_container"
7
+ HOOKS_PREPARE_HOST = "localstack_cli.hooks.prepare_host"
8
8
 
9
9
 
10
10
  def hook(namespace: str, priority: int = 0, **kwargs):
@@ -0,0 +1 @@
1
+ """Testing utilities for the LocalStack CLI."""
@@ -0,0 +1,4 @@
1
+ """Testing configuration constants."""
2
+
3
+ # Secondary test account ID for multi-account testing scenarios
4
+ SECONDARY_TEST_AWS_ACCOUNT_ID = "886468871268"
@@ -28,7 +28,7 @@ version_tuple: VERSION_TUPLE
28
28
  commit_id: COMMIT_ID
29
29
  __commit_id__: COMMIT_ID
30
30
 
31
- __version__ = version = '4.13.2.dev36'
32
- __version_tuple__ = version_tuple = (4, 13, 2, 'dev36')
31
+ __version__ = version = '4.13.2.dev53'
32
+ __version_tuple__ = version_tuple = (4, 13, 2, 'dev53')
33
33
 
34
- __commit_id__ = commit_id = 'ge6b10fc37'
34
+ __commit_id__ = commit_id = 'g9339dde9f'
@@ -1,9 +1,9 @@
1
- [localstack.hooks.configure_localstack_container]
1
+ [localstack_cli.hooks.configure_localstack_container]
2
2
  configure_extensions_dev_container = localstack_cli.pro.core.plugins:configure_extensions_dev_container
3
3
  configure_pro_container = localstack_cli.pro.core.plugins:configure_pro_container
4
4
  set_analytics_header = localstack_cli.utils.analytics.metadata:set_analytics_header
5
5
 
6
- [localstack.hooks.prepare_host]
6
+ [localstack_cli.hooks.prepare_host]
7
7
  activate_pro_key_on_host = localstack_cli.pro.core.plugins:activate_pro_key_on_host
8
8
  configure_extensions_dev_host = localstack_cli.pro.core.plugins:configure_extensions_dev_host
9
9
  patch_community_pro_detection = localstack_cli.pro.core.plugins:patch_community_pro_detection
@@ -0,0 +1,52 @@
1
+ import os
2
+
3
+ from click.testing import CliRunner
4
+ from localstack_cli import config
5
+ from localstack_cli.pro.core import config as pro_config
6
+ from localstack_cli.pro.core.cli.extensions import extensions as extensions_cli
7
+
8
+
9
+ def test_extensions_install_with_IMAGE_NAME_installs_correct_venv_version(tmp_path, monkeypatch):
10
+ volume_dir = tmp_path / "volume"
11
+ monkeypatch.setattr(config, "VOLUME_DIR", str(volume_dir))
12
+
13
+ # define an image version with an older Python version
14
+ monkeypatch.setenv("IMAGE_NAME", "localstack/localstack-pro:4.8.1")
15
+
16
+ runner = CliRunner()
17
+ runner.invoke(extensions_cli, ["install", "localstack-extension-hello-world"])
18
+
19
+ # check that the venv for the extensions was created with Python 3.11
20
+ python_bin = volume_dir / "lib" / "extensions" / "python_venv" / "lib" / "python3.11"
21
+ assert python_bin.exists(), f"Python 3.11 venv not found at {python_bin}"
22
+
23
+
24
+ def test_extensions_list_without_image_name_or_auth_env(tmp_path, monkeypatch):
25
+ # explicitly declare this is the CLI and unset a potential IMAGE_NAME
26
+ monkeypatch.setenv("LOCALSTACK_CLI", "1")
27
+ monkeypatch.setenv("IMAGE_NAME", "")
28
+
29
+ # extract the auth token from the test environment
30
+ token = os.environ.get("LOCALSTACK_AUTH_TOKEN")
31
+
32
+ # unset all auth token env vars
33
+ monkeypatch.setenv("LOCALSTACK_AUTH_TOKEN", "")
34
+ monkeypatch.setenv("LOCALSTACK_API_KEY", "")
35
+
36
+ # create a temporary auth cache file
37
+ tmp_auth_cache_path = tmp_path / "auth.json"
38
+ monkeypatch.setattr(pro_config, "AUTH_CACHE_PATH", str(tmp_auth_cache_path))
39
+
40
+ # set the token in the temp auth cache
41
+ from localstack_cli.pro.core.bootstrap.auth import get_auth_cache
42
+
43
+ cache = get_auth_cache()
44
+ cache["LOCALSTACK_AUTH_TOKEN"] = token
45
+ cache.save()
46
+
47
+ # make sure that the extensions list command works properly by
48
+ # defaulting to the Pro image even though IMAGE_NAME and
49
+ # LOCALSTACK_AUTH_TOKEN are not set
50
+ runner = CliRunner()
51
+ result = runner.invoke(extensions_cli, ["list"])
52
+ assert result.exit_code == 0
@@ -0,0 +1,146 @@
1
+ import json
2
+ from collections.abc import Generator
3
+
4
+ import pytest
5
+ from _pytest.capture import CaptureFixture
6
+ from click.testing import CliRunner, Result
7
+ from localstack_cli.pro.core.cli.replicator import replicator
8
+ from localstack_cli.testing.config import SECONDARY_TEST_AWS_ACCOUNT_ID
9
+ from localstack_cli.utils.strings import short_uid
10
+ from localstack_cli.utils.sync import retry
11
+
12
+
13
+ @pytest.fixture
14
+ def runner(capsys: CaptureFixture[str]) -> Generator[CliRunner]:
15
+ """
16
+ Convenience fixture to return a click.CliRunner for cli testing
17
+ This allows us to keep running the replicator test with log_cli enabled
18
+ to receive the logs from localstack.
19
+ """
20
+
21
+ class NoCapsysCliRunner(CliRunner):
22
+ """Override CliRunner to disable capsys"""
23
+
24
+ def __init__(self, **kwargs):
25
+ # Don't combine stdout and stderr into the same output stream
26
+ # The CLI logs to stderr and the output on stdout should be JSON formatted
27
+ # so that it can be parsed by external tools.
28
+ # If we cross the streams then we can no longer parse the output in tests
29
+ # as JSON
30
+ kwargs.pop("mix_stderr", None)
31
+ super().__init__(**kwargs)
32
+
33
+ def invoke(self, *args, **kwargs) -> Result:
34
+ # Way to fix https://github.com/pallets/click/issues/824
35
+ with capsys.disabled():
36
+ result = super().invoke(*args, **kwargs)
37
+ return result
38
+
39
+ yield NoCapsysCliRunner()
40
+
41
+
42
+ def test_start_mock_replication_job(runner, monkeypatch):
43
+ # ensure AWS_PROFILE is not set in the environment
44
+ monkeypatch.delenv("AWS_PROFILE", raising=False)
45
+
46
+ result = runner.invoke(
47
+ replicator,
48
+ ["start", "--replication-type", "MOCK"],
49
+ env={
50
+ "AWS_ACCESS_KEY_ID": "test",
51
+ "AWS_SECRET_ACCESS_KEY": "test",
52
+ "AWS_DEFAULT_REGION": "us-east-1",
53
+ },
54
+ )
55
+ assert result.exit_code == 0, result.output
56
+
57
+ response = json.loads(result.stdout)
58
+ job_id = response["job_id"]
59
+ assert response["state"] == "SUBMITTED"
60
+ assert response["error_message"] is None
61
+ assert response["type"] == "MOCK"
62
+ assert response["replication_config"] == {"delay": 1}
63
+
64
+ def _assert_status():
65
+ status_result = runner.invoke(replicator, ["status", job_id])
66
+ assert status_result.exit_code == 0, status_result.output
67
+
68
+ job_status = json.loads(status_result.stdout)
69
+ assert job_status["state"] == "SUCCEEDED"
70
+
71
+ retry(_assert_status, retries=5, sleep=1)
72
+
73
+
74
+ def test_list_resources(runner, monkeypatch):
75
+ result = runner.invoke(replicator, ["resources"])
76
+ assert result.exit_code == 0, result.output
77
+
78
+ resources: list[dict] = json.loads(result.stdout)
79
+
80
+ supported_resource_types = [resource["resource_type"] for resource in resources]
81
+ assert "AWS::SSM::Parameter" in supported_resource_types
82
+
83
+ for resource in resources:
84
+ assert len(resource["policy_statements"]) > 0
85
+
86
+
87
+ @pytest.mark.skip("using runtime client")
88
+ @pytest.mark.parametrize("method", ["ARN", "CFN"])
89
+ def test_start_single_replication_job(
90
+ method,
91
+ runner,
92
+ monkeypatch,
93
+ aws_client,
94
+ create_parameter,
95
+ source_credentials,
96
+ wait_for_job_state,
97
+ target_aws_client,
98
+ region_name,
99
+ source_aws_endpoint,
100
+ ):
101
+ parameter_name = f"mock-{short_uid()}"
102
+ create_parameter(
103
+ Name=parameter_name,
104
+ Type="String",
105
+ Value="test",
106
+ )
107
+
108
+ args = [
109
+ "start",
110
+ "--replication-type",
111
+ "SINGLE_RESOURCE",
112
+ "--target-account-id",
113
+ SECONDARY_TEST_AWS_ACCOUNT_ID,
114
+ ]
115
+
116
+ if method == "ARN":
117
+ parameter_arn = aws_client.ssm.get_parameter(Name=parameter_name)["Parameter"]["ARN"]
118
+ args.extend(["--resource-arn", parameter_arn])
119
+ else:
120
+ args.extend(
121
+ ["--resource-type", "AWS::SSM::Parameter", "--resource-identifier", parameter_name]
122
+ )
123
+
124
+ result = runner.invoke(
125
+ replicator,
126
+ args=args,
127
+ env={
128
+ "AWS_ACCESS_KEY_ID": source_credentials.access_key,
129
+ "AWS_SECRET_ACCESS_KEY": source_credentials.secret_key,
130
+ "AWS_SESSION_TOKEN": source_credentials.token,
131
+ "AWS_DEFAULT_REGION": region_name,
132
+ "AWS_ENDPOINT_URL": source_aws_endpoint,
133
+ },
134
+ )
135
+
136
+ job_id = json.loads(result.stdout)["job_id"]
137
+
138
+ def _assert_status():
139
+ status_result = runner.invoke(replicator, ["status", job_id])
140
+ job_status = json.loads(status_result.stdout)
141
+ assert job_status["state"] == "SUCCEEDED"
142
+
143
+ retry(_assert_status, retries=5, sleep=1)
144
+
145
+ parameter_found = target_aws_client.ssm.get_parameter(Name=parameter_name)["Parameter"]
146
+ assert parameter_found["Value"] == "test"
File without changes
File without changes
File without changes
@@ -0,0 +1,87 @@
1
+ import pytest
2
+ from localstack_cli.pro.core.cli.replicator import (
3
+ ProfileLoadError,
4
+ get_config_from_profile,
5
+ get_source_config,
6
+ )
7
+ from localstack_cli.utils.strings import short_uid
8
+
9
+
10
+ @pytest.fixture
11
+ def profile_name():
12
+ return f"profile-{short_uid()}"
13
+
14
+
15
+ @pytest.fixture
16
+ def access_key_id():
17
+ return f"access-key-{short_uid()}"
18
+
19
+
20
+ @pytest.fixture
21
+ def secret_key():
22
+ return f"secret-key-{short_uid()}"
23
+
24
+
25
+ @pytest.fixture
26
+ def profile_region():
27
+ return "us-east-1"
28
+
29
+
30
+ @pytest.fixture
31
+ def profile_dir(tmpdir, access_key_id, secret_key, profile_name, profile_region):
32
+ config_path = tmpdir / "config"
33
+ credentials_path = tmpdir / "credentials"
34
+
35
+ config = f"""[profile {profile_name}]
36
+ region = {profile_region}
37
+ """
38
+
39
+ credentials = f"""[{profile_name}]
40
+ aws_access_key_id = {access_key_id}
41
+ aws_secret_access_key = {secret_key}
42
+ """
43
+
44
+ with config_path.open("w") as outfile:
45
+ outfile.write(config)
46
+
47
+ with credentials_path.open("w") as outfile:
48
+ outfile.write(credentials)
49
+
50
+ return tmpdir
51
+
52
+
53
+ def test_load_profile(tmpdir, profile_name, profile_dir, profile_region, access_key_id, secret_key):
54
+ config = get_config_from_profile(profile_name, profile_dir)
55
+
56
+ assert config["aws_access_key_id"] == access_key_id
57
+ assert config["aws_secret_access_key"] == secret_key
58
+ assert config.get("aws_session_token") is None
59
+ assert config["region_name"] == profile_region
60
+ assert config["profile_name"] == profile_name
61
+
62
+
63
+ def test_load_missing_profile(tmpdir, profile_dir):
64
+ invalid_profile_name = f"profile-{short_uid()}"
65
+ with pytest.raises(ProfileLoadError) as exc_info:
66
+ get_config_from_profile(invalid_profile_name, profile_dir)
67
+
68
+ assert str(exc_info.value) == f"Could not find profile '{invalid_profile_name}'"
69
+
70
+
71
+ def test_envars_override_profile(
72
+ tmpdir, access_key_id, profile_dir, secret_key, profile_name, profile_region, monkeypatch
73
+ ):
74
+ monkeypatch.setenv("AWS_PROFILE", profile_name)
75
+
76
+ test_access_key = short_uid()
77
+ monkeypatch.setenv("AWS_ACCESS_KEY_ID", test_access_key)
78
+ test_secret_key = short_uid()
79
+ monkeypatch.setenv("AWS_SECRET_ACCESS_KEY", test_secret_key)
80
+ test_region = short_uid()
81
+ monkeypatch.setenv("AWS_DEFAULT_REGION", test_region)
82
+
83
+ env = get_source_config(profile_dir=profile_dir)
84
+
85
+ assert env.get("aws_access_key_id") == test_access_key
86
+ assert env.get("aws_secret_access_key") == test_secret_key
87
+ assert env.get("region_name") == test_region