nextmv 1.0.0__py3-none-any.whl → 1.0.0.dev0__py3-none-any.whl

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 (140) hide show
  1. nextmv/__about__.py +1 -1
  2. nextmv/__entrypoint__.py +2 -1
  3. nextmv/__init__.py +4 -0
  4. nextmv/cli/CONTRIBUTING.md +40 -112
  5. nextmv/cli/cloud/__init__.py +0 -4
  6. nextmv/cli/cloud/acceptance/create.py +22 -20
  7. nextmv/cli/cloud/acceptance/delete.py +12 -8
  8. nextmv/cli/cloud/acceptance/get.py +10 -9
  9. nextmv/cli/cloud/acceptance/list.py +3 -3
  10. nextmv/cli/cloud/acceptance/update.py +6 -6
  11. nextmv/cli/cloud/account/__init__.py +3 -3
  12. nextmv/cli/cloud/account/create.py +11 -11
  13. nextmv/cli/cloud/account/delete.py +8 -7
  14. nextmv/cli/cloud/account/get.py +3 -3
  15. nextmv/cli/cloud/account/update.py +5 -5
  16. nextmv/cli/cloud/app/create.py +26 -25
  17. nextmv/cli/cloud/app/delete.py +7 -6
  18. nextmv/cli/cloud/app/exists.py +2 -2
  19. nextmv/cli/cloud/app/get.py +2 -2
  20. nextmv/cli/cloud/app/list.py +3 -3
  21. nextmv/cli/cloud/app/push.py +54 -349
  22. nextmv/cli/cloud/app/update.py +12 -12
  23. nextmv/cli/cloud/batch/create.py +28 -26
  24. nextmv/cli/cloud/batch/delete.py +10 -6
  25. nextmv/cli/cloud/batch/get.py +9 -9
  26. nextmv/cli/cloud/batch/list.py +3 -3
  27. nextmv/cli/cloud/batch/metadata.py +4 -4
  28. nextmv/cli/cloud/batch/update.py +6 -6
  29. nextmv/cli/cloud/data/__init__.py +1 -1
  30. nextmv/cli/cloud/data/upload.py +15 -15
  31. nextmv/cli/cloud/ensemble/__init__.py +0 -2
  32. nextmv/cli/cloud/ensemble/create.py +22 -21
  33. nextmv/cli/cloud/ensemble/delete.py +10 -6
  34. nextmv/cli/cloud/ensemble/get.py +4 -4
  35. nextmv/cli/cloud/ensemble/update.py +9 -9
  36. nextmv/cli/cloud/input_set/__init__.py +0 -2
  37. nextmv/cli/cloud/input_set/create.py +22 -22
  38. nextmv/cli/cloud/input_set/get.py +3 -3
  39. nextmv/cli/cloud/input_set/list.py +3 -3
  40. nextmv/cli/cloud/input_set/update.py +24 -24
  41. nextmv/cli/cloud/instance/create.py +15 -14
  42. nextmv/cli/cloud/instance/delete.py +7 -6
  43. nextmv/cli/cloud/instance/exists.py +2 -2
  44. nextmv/cli/cloud/instance/get.py +2 -2
  45. nextmv/cli/cloud/instance/list.py +3 -3
  46. nextmv/cli/cloud/instance/update.py +14 -14
  47. nextmv/cli/cloud/managed_input/create.py +16 -14
  48. nextmv/cli/cloud/managed_input/delete.py +8 -7
  49. nextmv/cli/cloud/managed_input/get.py +3 -3
  50. nextmv/cli/cloud/managed_input/list.py +3 -3
  51. nextmv/cli/cloud/managed_input/update.py +9 -9
  52. nextmv/cli/cloud/run/cancel.py +2 -2
  53. nextmv/cli/cloud/run/create.py +40 -34
  54. nextmv/cli/cloud/run/get.py +8 -8
  55. nextmv/cli/cloud/run/input.py +4 -4
  56. nextmv/cli/cloud/run/list.py +6 -6
  57. nextmv/cli/cloud/run/logs.py +10 -9
  58. nextmv/cli/cloud/run/metadata.py +4 -4
  59. nextmv/cli/cloud/run/track.py +33 -32
  60. nextmv/cli/cloud/scenario/create.py +21 -21
  61. nextmv/cli/cloud/scenario/delete.py +10 -6
  62. nextmv/cli/cloud/scenario/get.py +9 -9
  63. nextmv/cli/cloud/scenario/list.py +3 -3
  64. nextmv/cli/cloud/scenario/metadata.py +4 -4
  65. nextmv/cli/cloud/scenario/update.py +6 -6
  66. nextmv/cli/cloud/secrets/create.py +17 -17
  67. nextmv/cli/cloud/secrets/delete.py +10 -6
  68. nextmv/cli/cloud/secrets/get.py +4 -4
  69. nextmv/cli/cloud/secrets/list.py +3 -3
  70. nextmv/cli/cloud/secrets/update.py +20 -17
  71. nextmv/cli/cloud/upload/create.py +2 -2
  72. nextmv/cli/cloud/version/create.py +10 -9
  73. nextmv/cli/cloud/version/delete.py +7 -6
  74. nextmv/cli/cloud/version/exists.py +2 -2
  75. nextmv/cli/cloud/version/get.py +2 -2
  76. nextmv/cli/cloud/version/list.py +3 -3
  77. nextmv/cli/cloud/version/update.py +8 -8
  78. nextmv/cli/community/__init__.py +1 -1
  79. nextmv/cli/community/clone.py +204 -20
  80. nextmv/cli/community/list.py +125 -60
  81. nextmv/cli/configuration/config.py +10 -43
  82. nextmv/cli/configuration/create.py +7 -7
  83. nextmv/cli/configuration/delete.py +8 -8
  84. nextmv/cli/configuration/list.py +3 -3
  85. nextmv/cli/main.py +36 -26
  86. nextmv/cli/message.py +54 -71
  87. nextmv/cli/options.py +0 -28
  88. nextmv/cli/version.py +1 -1
  89. nextmv/cloud/__init__.py +38 -14
  90. nextmv/cloud/acceptance_test.py +65 -1
  91. nextmv/cloud/account.py +6 -1
  92. nextmv/cloud/application/__init__.py +75 -18
  93. nextmv/cloud/application/_acceptance.py +8 -13
  94. nextmv/cloud/application/_batch_scenario.py +19 -4
  95. nextmv/cloud/application/_input_set.py +6 -42
  96. nextmv/cloud/application/_instance.py +3 -3
  97. nextmv/cloud/application/_managed_input.py +2 -2
  98. nextmv/cloud/application/_version.py +3 -4
  99. nextmv/cloud/batch_experiment.py +1 -3
  100. nextmv/cloud/integration.py +4 -7
  101. nextmv/deprecated.py +3 -5
  102. nextmv/input.py +52 -0
  103. nextmv/local/runner.py +1 -1
  104. nextmv/model.py +11 -50
  105. nextmv/options.py +256 -11
  106. nextmv/output.py +62 -0
  107. nextmv/run.py +10 -1
  108. nextmv/status.py +51 -1
  109. {nextmv-1.0.0.dist-info → nextmv-1.0.0.dev0.dist-info}/METADATA +4 -5
  110. nextmv-1.0.0.dev0.dist-info/RECORD +158 -0
  111. nextmv/cli/cloud/ensemble/list.py +0 -63
  112. nextmv/cli/cloud/input_set/delete.py +0 -64
  113. nextmv/cli/cloud/shadow/__init__.py +0 -33
  114. nextmv/cli/cloud/shadow/create.py +0 -184
  115. nextmv/cli/cloud/shadow/delete.py +0 -64
  116. nextmv/cli/cloud/shadow/get.py +0 -61
  117. nextmv/cli/cloud/shadow/list.py +0 -63
  118. nextmv/cli/cloud/shadow/metadata.py +0 -66
  119. nextmv/cli/cloud/shadow/start.py +0 -43
  120. nextmv/cli/cloud/shadow/stop.py +0 -53
  121. nextmv/cli/cloud/shadow/update.py +0 -96
  122. nextmv/cli/cloud/switchback/__init__.py +0 -33
  123. nextmv/cli/cloud/switchback/create.py +0 -151
  124. nextmv/cli/cloud/switchback/delete.py +0 -64
  125. nextmv/cli/cloud/switchback/get.py +0 -62
  126. nextmv/cli/cloud/switchback/list.py +0 -63
  127. nextmv/cli/cloud/switchback/metadata.py +0 -68
  128. nextmv/cli/cloud/switchback/start.py +0 -43
  129. nextmv/cli/cloud/switchback/stop.py +0 -53
  130. nextmv/cli/cloud/switchback/update.py +0 -96
  131. nextmv/cli/confirm.py +0 -34
  132. nextmv/cloud/application/_shadow.py +0 -320
  133. nextmv/cloud/application/_switchback.py +0 -332
  134. nextmv/cloud/community.py +0 -446
  135. nextmv/cloud/shadow.py +0 -254
  136. nextmv/cloud/switchback.py +0 -228
  137. nextmv-1.0.0.dist-info/RECORD +0 -185
  138. nextmv-1.0.0.dist-info/entry_points.txt +0 -2
  139. {nextmv-1.0.0.dist-info → nextmv-1.0.0.dev0.dist-info}/WHEEL +0 -0
  140. {nextmv-1.0.0.dist-info → nextmv-1.0.0.dev0.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,158 @@
1
+ nextmv/__about__.py,sha256=4CvH-pDPOAW9ZuZLXqXn-X3ERrLrJx5pb2z5te42bnM,28
2
+ nextmv/__entrypoint__.py,sha256=dA0iwwHtrq6Z9w9FxmxKLoBGLyhe7jWtUAU-Y3PEgHg,1094
3
+ nextmv/__init__.py,sha256=BJyzWmcHWx_Y3S6RkaP65hQzVs7A9nEXIlVz9uShgxg,3985
4
+ nextmv/_serialization.py,sha256=jYitMS1MU8ldsmObT-K_8V8P2Wx69tnDiEHCCgPGun4,2834
5
+ nextmv/base_model.py,sha256=kPFqE-c_3LcEy8fY0qDrJk_gbPYgSKtetRMby71oxE8,2298
6
+ nextmv/deprecated.py,sha256=kEVfyQ-nT0v2ePXTNldjQG9uH5IlfQVy3L4tztIxwmU,1638
7
+ nextmv/input.py,sha256=Z_y2GERFJxgTKbWDXLtJvxLZgdGf9leN3ytphCIBcdU,39036
8
+ nextmv/logger.py,sha256=kNIbu46MisrzYe4T0hNMpWfRTKKacDVvbtQcNys_c_E,2513
9
+ nextmv/manifest.py,sha256=v9En9zMZVKZn6G_HThoKUZowMtZr5hxzwWiK9wkVHPU,49023
10
+ nextmv/model.py,sha256=9g-pAUg8E--CyUFU39J7e4MZcj0WrWtgIqfwGmoF7UA,14998
11
+ nextmv/options.py,sha256=rfQV0F5_it-L27wjqrs902wr4Q7sgSN7dw5o0c5sdEg,37842
12
+ nextmv/output.py,sha256=kjGWfgXfsEL6Np9xDhJdKyXYA17bMGjuuthDAWHzl2M,56288
13
+ nextmv/polling.py,sha256=fwnAxmfpuBg4d6pi53TRTyyefdpf-cHLoTG6trAu-QA,11048
14
+ nextmv/run.py,sha256=Sgp7qaRgTtpdLhbmwhg8Cc1o5loklirof8o8CB4qkt4,54441
15
+ nextmv/safe.py,sha256=VAK4fGEurbLNji4Pg5Okga5XQSbI4aI9JJf95_68Z20,3867
16
+ nextmv/status.py,sha256=SCDLhh2om3yeO5FxO0x-_RShQsZNXEpjHNdCGdb3VUI,2787
17
+ nextmv/cli/CONTRIBUTING.md,sha256=MFPgNHLV2GcfWqHVy79bW3oHRIzQLwouVg2tPT9SILo,19701
18
+ nextmv/cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
19
+ nextmv/cli/main.py,sha256=RDj9Wi7Lida4BZvX24sI1jKdjGyPw2ug7400CMFThww,5752
20
+ nextmv/cli/message.py,sha256=PLv8koTxfg7z8XMpDDZCCQsRibF6iCaGYTHwo1TMmIE,3529
21
+ nextmv/cli/options.py,sha256=iK_uZpK9z2fRH9tLW9TRGuHVYZEKrtceAcPTlwJviN0,5967
22
+ nextmv/cli/version.py,sha256=IxVKXCB0L61nSOti4Jc36np4xzraecXKIMRvPmGEAfk,685
23
+ nextmv/cli/cloud/__init__.py,sha256=uqc9N0LjBoWrKhPyf_yUOeVb1DCTTU8EAyfb7aG0Bts,1680
24
+ nextmv/cli/cloud/acceptance/__init__.py,sha256=v4U1m6z5zI8mQpmIE4kFeEYOsaDxnGRnRj2j5I6WueI,711
25
+ nextmv/cli/cloud/acceptance/create.py,sha256=viuBlF1Xd8fww_1fealx8Bvb6fGwyNPu7--lfiZ2_p0,14705
26
+ nextmv/cli/cloud/acceptance/delete.py,sha256=wkxDTzU4H7o4IVpY7_MbZ-Po_MPmgcUblqg-LwI-atk,2287
27
+ nextmv/cli/cloud/acceptance/get.py,sha256=lDHXBQrZ467SvAt700_oNopT0NGP48ldR64WJG7Di9Y,3497
28
+ nextmv/cli/cloud/acceptance/list.py,sha256=lc7x8npP2jVVSqRbyRj6kpJjpJUIeRboI4CPzRFzzWQ,1893
29
+ nextmv/cli/cloud/acceptance/update.py,sha256=rts9YjUCbd5K2HExbEGyukfWEhadTcYoJULldMeOjGo,2924
30
+ nextmv/cli/cloud/account/__init__.py,sha256=kjlfvDFSDCZG5zVzBV2Zqxa9aALWPAC6PdKOwzWS-A4,760
31
+ nextmv/cli/cloud/account/create.py,sha256=d4MtjMSuNbgZ0HZfhd-bhogO5_yjamjnss-kTk-9Fqw,2884
32
+ nextmv/cli/cloud/account/delete.py,sha256=SyZ_0psImmaduEuRd6JDlY0sYjJTV8SgMNR3DREDx3A,1863
33
+ nextmv/cli/cloud/account/get.py,sha256=KY2Qmj-27OYxTXMauwngdEBtXzjpdp7-fhw7b7Os7Ao,1849
34
+ nextmv/cli/cloud/account/update.py,sha256=QFdPLjnDolVQZZwMUKTxP_YhZWi3MUUVdyaEEDQplL8,2117
35
+ nextmv/cli/cloud/app/__init__.py,sha256=-ex_7C34XY1K3bU8hQ9vdnjJEzNamuuHNuK_cJSkHac,1037
36
+ nextmv/cli/cloud/app/create.py,sha256=-FtXlltMx2hlHE206MQTK2Tjpl8GEC8klVlKJvP8gc8,4652
37
+ nextmv/cli/cloud/app/delete.py,sha256=JWyfpDMm5BcQ8jlee4AIJ7fO5UEsZfYNKndDkmPQKvg,1729
38
+ nextmv/cli/cloud/app/exists.py,sha256=T3OW77w_0Xv_suCGgGT0JVa8fYg7fYueVjC5evRwz0A,1266
39
+ nextmv/cli/cloud/app/get.py,sha256=XU4C5ftJ_vBZGW6obB2zFxLMA3an9mXJmmKpCr0qCpA,1773
40
+ nextmv/cli/cloud/app/list.py,sha256=t3gPFRVIE-kdvoWmSZHIWDLG_qoTgha8ZvHtDScolqA,1665
41
+ nextmv/cli/cloud/app/push.py,sha256=IKjlqbQLqc2B9Sz41PVG-8bYm0hZqBhk30gqLLtT-uY,5057
42
+ nextmv/cli/cloud/app/update.py,sha256=I0cXbAvYelNEZROQrZ9fxXrffm-sAf7kuNH86VUgtHw,4146
43
+ nextmv/cli/cloud/batch/__init__.py,sha256=-_UjmvrQItACUY_BQ_cOffNJixNHAb4vH_pew25sJ3o,774
44
+ nextmv/cli/cloud/batch/create.py,sha256=FsSxFhkGPvdFHE5O6bc-XnmK86pb77RapMbT2vzELTs,15609
45
+ nextmv/cli/cloud/batch/delete.py,sha256=JnNHP5WklNVTlmARjt_EQDBodpObqXbtrTKID9MMymY,2272
46
+ nextmv/cli/cloud/batch/get.py,sha256=HUvgkAAyAxBuUx_5JIWMd_Zd5bujcold3xucLhZKAzo,3520
47
+ nextmv/cli/cloud/batch/list.py,sha256=3fxjKT4v1tMBucEBXXZjp5TwsTQ9HsNIZtlwwWjMd9o,1892
48
+ nextmv/cli/cloud/batch/metadata.py,sha256=cdoubGzhmoAx1xQSdsiyMuZqh9rw3TuCVsZ3VWVPY04,2228
49
+ nextmv/cli/cloud/batch/update.py,sha256=xpwx50jsb3YclVnWP_IjofsW9HrgCD7TNzgkMIrMZUs,3006
50
+ nextmv/cli/cloud/data/__init__.py,sha256=PvS7VLEq1fjZKk74WjZxRiOIIME312cG5WK8M8pUUTI,755
51
+ nextmv/cli/cloud/data/upload.py,sha256=-PEimZCislsc3WafyOypnUTRsI5MqXtfs0kdX7VeeMU,5732
52
+ nextmv/cli/cloud/ensemble/__init__.py,sha256=lbYgyuQXQO0R2jjxGLr7DsxvuZAF_akQWGvdTWdyzSU,973
53
+ nextmv/cli/cloud/ensemble/create.py,sha256=5Xy0IjOWa7hS4TBxePbVAOK3Ck2J3ZiW7XfDUv4qoe0,14983
54
+ nextmv/cli/cloud/ensemble/delete.py,sha256=0X4qPh6k9VRAkv8Q2U3ift1gGrp_O0Yte-s-LA3NVfA,2262
55
+ nextmv/cli/cloud/ensemble/get.py,sha256=H_Yv-ohCy4HX3OMp9iuoRgrG6xI_5uUtFMiQ7--896c,2143
56
+ nextmv/cli/cloud/ensemble/update.py,sha256=RkViCmg-0E9YEW9Nk72XERgur5VR6bRC6sNdOsoRAzQ,3425
57
+ nextmv/cli/cloud/input_set/__init__.py,sha256=wyt0LX9xqcGDrb-rPx-MN0WQA7o9jZnK2CpShfrki3o,867
58
+ nextmv/cli/cloud/input_set/create.py,sha256=65HLYSVMFK2NqF0QzLPPWZYt2b5e5zHrP20msm9iXu8,5590
59
+ nextmv/cli/cloud/input_set/get.py,sha256=LLjizIgNEPrt0YjtjSIo_vxI4DRju9XmcKDbIaMqJHk,1924
60
+ nextmv/cli/cloud/input_set/list.py,sha256=FlhvhYrwKooWigaU7g3iCvPCT_V2BIodsaQsuUM94_w,1908
61
+ nextmv/cli/cloud/input_set/update.py,sha256=xJ6-zaM3M_cwt3fnK2aWrQxDHDx_pl6k3JIzqRuNZTc,4111
62
+ nextmv/cli/cloud/instance/__init__.py,sha256=UH46OH_xNpGGzIbUTMHBXZ7SLStikOhz1iC8lO2Nfjs,1111
63
+ nextmv/cli/cloud/instance/create.py,sha256=cs9o0z4F5486Chei6dNQn_QPrCyZt1_y2ewIyGcTYCo,9681
64
+ nextmv/cli/cloud/instance/delete.py,sha256=2BbTe7iSbyP014uwehvUqbAsDAmEbTlPSeRPLdNol_4,1997
65
+ nextmv/cli/cloud/instance/exists.py,sha256=6zEOYzIoLhmw8hpKIVbCnn0ly-3OpS13vAoAtvXzNL4,1328
66
+ nextmv/cli/cloud/instance/get.py,sha256=DOOtwFHeSWiqxmwXQjHu85ljCSk66kykWBLKWIzt0dE,1880
67
+ nextmv/cli/cloud/instance/list.py,sha256=vkNw9V-xkI5OR7fJP2Z6Dl3Ff5VvjV9CHguTem5F9I0,1803
68
+ nextmv/cli/cloud/instance/update.py,sha256=Lxbnsi_I8zz-v3_JnF34EUhIselt3U2olisyHE5A1kA,7394
69
+ nextmv/cli/cloud/managed_input/__init__.py,sha256=aS1YQ_nN92Z7-GG-geEiEABx_fq5nVS23Nii6W8uGbQ,940
70
+ nextmv/cli/cloud/managed_input/create.py,sha256=orMTDkJRd0vtG8zMWuMV-aqMbNDBBcEgh24CLAf7rkc,5031
71
+ nextmv/cli/cloud/managed_input/delete.py,sha256=eUk0Of4MKPkc_znf-HZjlmZJpX-Ie0PtXnDNiSrw9Zk,2154
72
+ nextmv/cli/cloud/managed_input/get.py,sha256=y50V25EdTq4KEwtbCtl-pPRZjm8mAlmQ6RxuAx2WdZ8,2053
73
+ nextmv/cli/cloud/managed_input/list.py,sha256=i8sknHczxOyVruBSdhqVKM4rnrzly6MCJzS0vITSE98,1908
74
+ nextmv/cli/cloud/managed_input/update.py,sha256=6scLGyuISyhRkQ7BHdyKvYC3qBvy9M6MfLJJowKnhHQ,3233
75
+ nextmv/cli/cloud/run/__init__.py,sha256=KyonwVd5lfweaq-cIpPuRAzHFrK0slfqJsIjsT_p4PU,1102
76
+ nextmv/cli/cloud/run/cancel.py,sha256=bmfO5srPbUwOl8cSESq2OxA1TebHwcvmviwm_vVGMPk,1267
77
+ nextmv/cli/cloud/run/create.py,sha256=vI1BOuHZcFkueeNx4bAC8Iw0fEivqV66TtI1XvZIak4,19862
78
+ nextmv/cli/cloud/run/get.py,sha256=JkTBiyiyawn_VIS7OPCrLgApr-apfzaHnI9mfwgMxzo,7885
79
+ nextmv/cli/cloud/run/input.py,sha256=A7_GVyxkJeL1sbktXIJ-jzhQp5gVl030OxmFD3OIewM,3196
80
+ nextmv/cli/cloud/run/list.py,sha256=8y9lAtrYrYp-u97odSthKm47bBW6TS8ylqDTLU9202Q,2605
81
+ nextmv/cli/cloud/run/logs.py,sha256=hzHDIPyc9TdRjJ-FHgUqN491g2N7ULQcdPIg4z9lj58,6139
82
+ nextmv/cli/cloud/run/metadata.py,sha256=Jz3wjre5Z3hSmTZBsDsR4K_3SOdPt3JAI3qeSygRSYY,2309
83
+ nextmv/cli/cloud/run/track.py,sha256=otdT_3nL6JGOIL_dNXOn2eUwGGvuJZrtz7aEMUKq8TY,18037
84
+ nextmv/cli/cloud/scenario/__init__.py,sha256=lHblPFBIlCGjRzEw9VLEG8dPKoWRKyi88a2VYfXwqsM,792
85
+ nextmv/cli/cloud/scenario/create.py,sha256=2xPofy-d8Tp49iHKmUCsF6Fx35czfC45WcjMs-LzJmc,15630
86
+ nextmv/cli/cloud/scenario/delete.py,sha256=3WDYiq1b3-ZzmIhPor9uZLpx63lBLLw5Ps2W8vJZRXI,2141
87
+ nextmv/cli/cloud/scenario/get.py,sha256=IyBveR97HY59xsaJzEFbNZ8wBO5gw8QV5sGN8-NEVgQ,3449
88
+ nextmv/cli/cloud/scenario/list.py,sha256=BVLYi5XohWTq1T00ItAOyAn0YCcklLtZ8laMRhTviyo,1865
89
+ nextmv/cli/cloud/scenario/metadata.py,sha256=F0BZYwYigAvdgrdJav-t1HjdijAQN5GPZuO4dihs3tI,2222
90
+ nextmv/cli/cloud/scenario/update.py,sha256=9ItVRpNy3zDLkrkCOFMIDFQ3ipQJJKUSF3zUDpVUkDk,2936
91
+ nextmv/cli/cloud/secrets/__init__.py,sha256=-96-F6eccRH804CePGJDsDCnjD5LRdwvSRqmAbTdVjY,1056
92
+ nextmv/cli/cloud/secrets/create.py,sha256=-yanco4oB2g1JZWcBlnH3NAN5FPvYFria2WQ4UYMnfU,8239
93
+ nextmv/cli/cloud/secrets/delete.py,sha256=vDiYRk81eH1dv-iRMIlyZplsGPCtzNcTNgCrMYSq8wU,2227
94
+ nextmv/cli/cloud/secrets/get.py,sha256=kqOcf4XGt1nIHSuyueGMOmKoA94WRZEbdL5Q9Nle9i8,2158
95
+ nextmv/cli/cloud/secrets/list.py,sha256=j4z6_wG-cP9zzeGIcRWinVXlgoQkPQatc_oF0ygrP9Q,1891
96
+ nextmv/cli/cloud/secrets/update.py,sha256=2LiVqhtBlHw_5ZY484l03VxSFh4S0CbNJabEhDwzqrM,5447
97
+ nextmv/cli/cloud/upload/__init__.py,sha256=khOl6NxkPd4KEqN0xMdxzmST-Ct3Vr_xk8zbMvbrLl8,511
98
+ nextmv/cli/cloud/upload/create.py,sha256=AslXZoZaNViKgt23KUF9-xgYJmBLxMQSvSTtHGX3uoc,1224
99
+ nextmv/cli/cloud/version/__init__.py,sha256=ATPKdKvQM-IambdwIcqB1GZzqLVpjn1ZQkz2E_RghzY,1016
100
+ nextmv/cli/cloud/version/create.py,sha256=DA9Nkht0MBqAoBEEPB5WgrL2i3PvraSopS0rwO5zCDk,3054
101
+ nextmv/cli/cloud/version/delete.py,sha256=yOWq64ys7iB-1HZkO9QSDgYF6fLNFPkF51VCQrwH-hI,1971
102
+ nextmv/cli/cloud/version/exists.py,sha256=yWuJDp2mAlj7JxDMM2hCi4sQ8RQdBOXYFhhrUlODnGY,1306
103
+ nextmv/cli/cloud/version/get.py,sha256=sPvJiutMce98TKfgHB1gTeSOL-scQMunKFd0T6VDUkg,1847
104
+ nextmv/cli/cloud/version/list.py,sha256=3kvsxy3rPguRkSbUkEKM7V5p3yeS2SINsQL_HYOKMBo,1782
105
+ nextmv/cli/cloud/version/update.py,sha256=-PdBcU4Sy9tC9w5Wls9M-8tr0zAHBJlOXlTOniZw04E,2911
106
+ nextmv/cli/community/__init__.py,sha256=t2l6adm9Km6hSvSFzeKHTQzacVSnwjx4wpj2kqee5nM,612
107
+ nextmv/cli/community/clone.py,sha256=yz5nBei81VWh2SawEEauEUv71oIUkmnb4OOCQl4BLVA,9154
108
+ nextmv/cli/community/list.py,sha256=9dRzsR8fz9LeITyn2722JawO8-DWVCYhMc-ltqeB-sU,7499
109
+ nextmv/cli/configuration/__init__.py,sha256=7oryF4PKkORh8bcdgbN2k36rZrFpJsM7Xfq_J4-MkFs,516
110
+ nextmv/cli/configuration/config.py,sha256=E9ohkMlyt1IF6pzc9T-5lmf-3qUn_WTQVdgg-PLPa0I,5382
111
+ nextmv/cli/configuration/create.py,sha256=msXo0GL-M64OlFCvJDfqeCJCaRmWe1gFMWhAMSosYfw,2670
112
+ nextmv/cli/configuration/delete.py,sha256=0T5SnIUE580VYjn4WeXbGDjjQ2w3OrxLRFVlM0jxeSI,1961
113
+ nextmv/cli/configuration/list.py,sha256=5fx3rtQYBkxYrq0aZXLMSRh6Hh97acKe6nFY6uoRie8,2203
114
+ nextmv/cloud/__init__.py,sha256=Gp5FSfC-euKcIV4j6aVEmgf1OlPbRt2tNhIGV2AW3OA,5514
115
+ nextmv/cloud/acceptance_test.py,sha256=-2GIQH19byuKKYWt2BWzlrQ9Np9cDcwXZewqx-Wt3tk,27812
116
+ nextmv/cloud/account.py,sha256=ivYXsqfp7A5bplHHoTNnfesVxVV1fbGT5cSbvgt_z9Q,13725
117
+ nextmv/cloud/assets.py,sha256=alw634ub-DR0CHQXZy_ObeGvQthPXFLdgzgbvbH1SGY,1376
118
+ nextmv/cloud/batch_experiment.py,sha256=thS94-ZdMR7Em5TeGN5UtnIDHmhzqld_U49SODyhrPU,10537
119
+ nextmv/cloud/client.py,sha256=Yj4FE4GKsLHkYijAYXcotlyNfhAWANMuWetHXsYPg1M,18101
120
+ nextmv/cloud/ensemble.py,sha256=_hKPjSLtuGH1xGG70ZBsmY_IL5XinZqVHHwBxtX9Omw,8570
121
+ nextmv/cloud/input_set.py,sha256=wsLmMI1C7BslWDN5j1RnVUA8z54-Hq1eLG9bkzyqafo,4187
122
+ nextmv/cloud/instance.py,sha256=rLrgNNvNyC6hZtjxIfTR2Luylmbh2emJIZVCy_hTJZ4,5495
123
+ nextmv/cloud/integration.py,sha256=S4BNX3GFGNA1SXDWaRAUeS0hW6XkYXWSdWXX-s-x_nA,18112
124
+ nextmv/cloud/package.py,sha256=88XSJ15QGcHboNJAw2hGowiLKBu2O2nV5ZieZFx7XDI,17133
125
+ nextmv/cloud/scenario.py,sha256=1_4PI9ehYaSonEe_l59cFhZNmqQ_brXXP6-mVq9i8a8,14183
126
+ nextmv/cloud/secrets.py,sha256=fA5cX0jfTsPVZWV7433wzETGlXpWRLHGswuObx9e6FQ,6820
127
+ nextmv/cloud/url.py,sha256=Fz70ywkWdCLmP21ZBmJwZi5kDbjpmsX_VlwVF_xQeHg,1836
128
+ nextmv/cloud/version.py,sha256=5_S7_pWUVBFbvAArku20eK7S645GJcHtgE2OpXLdSzQ,5300
129
+ nextmv/cloud/application/__init__.py,sha256=hwKK8qnriw6SH64Kvcwvv-DI4mWf0czRwdTmXnq12x0,35255
130
+ nextmv/cloud/application/_acceptance.py,sha256=ZwbVkur3-1fwM_L4F8ZUqrNaIdHgYGxKd3utoOCWjSc,13679
131
+ nextmv/cloud/application/_batch_scenario.py,sha256=QbEoeihRu1ZGYoce0vC0uWfGSHWYwpi7ICSCVjqgBwM,29135
132
+ nextmv/cloud/application/_ensemble.py,sha256=05l9uR0hTnW8nQjhRzjd2TPfvCoaAqNddWP-aVRL5rg,7666
133
+ nextmv/cloud/application/_input_set.py,sha256=m7PKqhR3evdE_a_RER1L6iKwftlaxTiRd1JQvgCepUU,7069
134
+ nextmv/cloud/application/_instance.py,sha256=UNkl1Qp1XqSN6aLcsPZkGgH00rrrK0WTveSf6cq6lGc,8346
135
+ nextmv/cloud/application/_managed_input.py,sha256=ceXPuEpHUAtX66MXdf9HVZBG9AG0rLnXohlAl4vbbsc,6668
136
+ nextmv/cloud/application/_run.py,sha256=4lrxyQCUGJszdiYNGynYg6RXBPqjQ4tFcDmxH9dfSXY,53869
137
+ nextmv/cloud/application/_secrets.py,sha256=hWhPAyY8aDF8zlEz9opPNLrFOYtp-COFqG_jgOZ6VxI,9476
138
+ nextmv/cloud/application/_utils.py,sha256=GqksGBHCV2sc-itL6hlWnncUJjIxhw6LH3pOjs4M-us,1643
139
+ nextmv/cloud/application/_version.py,sha256=6bBuYY5J-5k4Dj3hu9TP7CbxtEUvDM3zIsPI97nwjt0,8502
140
+ nextmv/default_app/.gitignore,sha256=gsfnfXMYNt-YTroh5hAzauwBZoPDJ6D_fB17rMSnIko,8
141
+ nextmv/default_app/README.md,sha256=hW3zWcYzxhYfof-pThaN1Fkx93GT8tTUVRhx15edBis,662
142
+ nextmv/default_app/app.yaml,sha256=TKjKnuoK0SDpouB_AS7TQmE_8HZbQYjmwFvhzFL1xpc,382
143
+ nextmv/default_app/input.json,sha256=zgvbKL3boB0WIU6-9mEU3ZWBddQ5cQ0vhgmDwDyz4hE,63
144
+ nextmv/default_app/main.py,sha256=gG-1JIvKXPCkm4JV46PcXxsQTAefwPXQbdPxkSubhf0,888
145
+ nextmv/default_app/requirements.txt,sha256=wRE_HkYYWzCGnYZ2NuatHXul4gCHvU3iUAdsxtzpYiA,29
146
+ nextmv/default_app/src/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
147
+ nextmv/default_app/src/visuals.py,sha256=WYK_YBnLmYo3TpVev1CpoNCuW5R7hk9QIkeCmvMn1Fs,1014
148
+ nextmv/local/__init__.py,sha256=6BsoqlK4dw6X11_uKzz9gBPfxKpdiol2FYO8R3X73SE,116
149
+ nextmv/local/application.py,sha256=SBOARPnffAH6q-S0GGPEjt0gYIXmeR-38-VcZMfhqKk,47745
150
+ nextmv/local/executor.py,sha256=1qoynUCB9UDgXhjXKds0OGc8McAtAsQHJ0-QVWTJrQs,36562
151
+ nextmv/local/geojson_handler.py,sha256=7FavJdkUonop-yskjis0x3qFGB8A5wZyoBUblw-bVhw,12540
152
+ nextmv/local/local.py,sha256=cp56UpI8h19Ob6Jvb_Ni0ceXH5Vv3ET_iPTDe6ftq3Y,2617
153
+ nextmv/local/plotly_handler.py,sha256=bLb50e3AkVr_W-F6S7lXfeRdN60mG2jk3UElNmhoMWU,1930
154
+ nextmv/local/runner.py,sha256=Fa-G4g5yaBgLeBfYU-ePs65Q3Ses_xYvXGhPtHpAkrU,8546
155
+ nextmv-1.0.0.dev0.dist-info/METADATA,sha256=W-PViTDWgdCtXtQW4_1EDKZdEq1K0um0Hh3e4NSrSLI,16484
156
+ nextmv-1.0.0.dev0.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
157
+ nextmv-1.0.0.dev0.dist-info/licenses/LICENSE,sha256=ZIbK-sSWA-OZprjNbmJAglYRtl5_K4l9UwAV3PGJAPc,11349
158
+ nextmv-1.0.0.dev0.dist-info/RECORD,,
@@ -1,63 +0,0 @@
1
- """
2
- This module defines the cloud ensemble list command for the Nextmv CLI.
3
- """
4
-
5
- import json
6
- from typing import Annotated
7
-
8
- import typer
9
-
10
- from nextmv.cli.configuration.config import build_app
11
- from nextmv.cli.message import in_progress, print_json, success
12
- from nextmv.cli.options import AppIDOption, ProfileOption
13
-
14
- # Set up subcommand application.
15
- app = typer.Typer()
16
-
17
-
18
- @app.command()
19
- def list(
20
- app_id: AppIDOption,
21
- output: Annotated[
22
- str | None,
23
- typer.Option(
24
- "--output",
25
- "-o",
26
- help="Saves the list of ensemble definitions to this location.",
27
- metavar="OUTPUT_PATH",
28
- ),
29
- ] = None,
30
- profile: ProfileOption = None,
31
- ) -> None:
32
- """
33
- List all Nextmv Cloud ensemble definitions for an application.
34
-
35
- This command retrieves all ensemble definitions associated with the specified
36
- application.
37
-
38
- [bold][underline]Examples[/underline][/bold]
39
-
40
- - List all ensemble definitions for application [magenta]hare-app[/magenta].
41
- $ [dim]nextmv cloud ensemble list --app-id hare-app[/dim]
42
-
43
- - List all ensemble definitions and save to a file.
44
- $ [dim]nextmv cloud ensemble list --app-id hare-app --output ensembles.json[/dim]
45
-
46
- - List all ensemble definitions using a specific profile.
47
- $ [dim]nextmv cloud ensemble list --app-id hare-app --profile prod[/dim]
48
- """
49
-
50
- cloud_app = build_app(app_id=app_id, profile=profile)
51
- in_progress(msg="Listing ensemble definitions...")
52
- ensembles = cloud_app.list_ensemble_definitions()
53
- ensembles_dict = [ensemble.to_dict() for ensemble in ensembles]
54
-
55
- if output is not None and output != "":
56
- with open(output, "w") as f:
57
- json.dump(ensembles_dict, f, indent=2)
58
-
59
- success(msg=f"Ensemble definitions list saved to [magenta]{output}[/magenta].")
60
-
61
- return
62
-
63
- print_json(ensembles_dict)
@@ -1,64 +0,0 @@
1
- """
2
- This module defines the cloud input-set delete command for the Nextmv CLI.
3
- """
4
-
5
- from typing import Annotated
6
-
7
- import typer
8
-
9
- from nextmv.cli.configuration.config import build_app
10
- from nextmv.cli.confirm import get_confirmation
11
- from nextmv.cli.message import info, success
12
- from nextmv.cli.options import AppIDOption, InputSetIDOption, ProfileOption
13
-
14
- # Set up subcommand application.
15
- app = typer.Typer()
16
-
17
-
18
- @app.command()
19
- def delete(
20
- app_id: AppIDOption,
21
- input_set_id: InputSetIDOption,
22
- yes: Annotated[
23
- bool,
24
- typer.Option(
25
- "--yes",
26
- "-y",
27
- help="Agree to deletion confirmation prompt. Useful for non-interactive sessions.",
28
- ),
29
- ] = False,
30
- profile: ProfileOption = None,
31
- ) -> None:
32
- """
33
- Deletes a Nextmv Cloud input set.
34
-
35
- This action is permanent and cannot be undone. The input set and all
36
- associated data will be deleted. Use the --yes flag to skip the
37
- confirmation prompt.
38
-
39
- [bold][underline]Examples[/underline][/bold]
40
-
41
- - Delete the input set with the ID [magenta]hop-analysis[/magenta] from application
42
- [magenta]hare-app[/magenta].
43
- $ [dim]nextmv cloud input-set delete --app-id hare-app --input-set-id hop-analysis[/dim]
44
-
45
- - Delete the input set without confirmation prompt.
46
- $ [dim]nextmv cloud input-set delete --app-id hare-app --input-set-id carrot-routes --yes[/dim]
47
- """
48
-
49
- if not yes:
50
- confirm = get_confirmation(
51
- f"Are you sure you want to delete input set [magenta]{input_set_id}[/magenta] "
52
- f"from application [magenta]{app_id}[/magenta]? This action cannot be undone.",
53
- )
54
-
55
- if not confirm:
56
- info(f"Input set [magenta]{input_set_id}[/magenta] will not be deleted.")
57
- return
58
-
59
- cloud_app = build_app(app_id=app_id, profile=profile)
60
- cloud_app.delete_input_set(input_set_id=input_set_id)
61
- success(
62
- f"Input set [magenta]{input_set_id}[/magenta] deleted successfully "
63
- f"from application [magenta]{app_id}[/magenta]."
64
- )
@@ -1,33 +0,0 @@
1
- """
2
- This module defines the cloud shadow command tree for the Nextmv CLI.
3
- """
4
-
5
- import typer
6
-
7
- from nextmv.cli.cloud.shadow.create import app as create_app
8
- from nextmv.cli.cloud.shadow.delete import app as delete_app
9
- from nextmv.cli.cloud.shadow.get import app as get_app
10
- from nextmv.cli.cloud.shadow.list import app as list_app
11
- from nextmv.cli.cloud.shadow.metadata import app as metadata_app
12
- from nextmv.cli.cloud.shadow.start import app as start_app
13
- from nextmv.cli.cloud.shadow.stop import app as stop_app
14
- from nextmv.cli.cloud.shadow.update import app as update_app
15
-
16
- # Set up subcommand application.
17
- app = typer.Typer()
18
- app.add_typer(create_app)
19
- app.add_typer(delete_app)
20
- app.add_typer(get_app)
21
- app.add_typer(list_app)
22
- app.add_typer(metadata_app)
23
- app.add_typer(start_app)
24
- app.add_typer(stop_app)
25
- app.add_typer(update_app)
26
-
27
-
28
- @app.callback()
29
- def callback() -> None:
30
- """
31
- Create and manage Nextmv Cloud shadow tests.
32
- """
33
- pass
@@ -1,184 +0,0 @@
1
- """
2
- This module defines the cloud shadow create command for the Nextmv CLI.
3
- """
4
-
5
- import json
6
- from datetime import datetime
7
- from typing import Annotated
8
-
9
- import typer
10
-
11
- from nextmv.cli.configuration.config import build_app
12
- from nextmv.cli.message import error, in_progress, print_json
13
- from nextmv.cli.options import AppIDOption, ProfileOption
14
- from nextmv.cloud.shadow import StartEvents, TerminationEvents
15
-
16
- # Set up subcommand application.
17
- app = typer.Typer()
18
-
19
-
20
- @app.command()
21
- def create(
22
- app_id: AppIDOption,
23
- comparisons: Annotated[
24
- str,
25
- typer.Option(
26
- "--comparisons",
27
- "-c",
28
- help="Object mapping baseline instance IDs to a list of comparison instance IDs. "
29
- "Data should be valid [magenta]json[/magenta]. "
30
- "Object format: [dim]{'baseline_id1': ['comparison_id1', 'comparison_id2'], 'baseline_id2': ...}[/dim]",
31
- metavar="COMPARISONS",
32
- ),
33
- ],
34
- termination_maximum_runs: Annotated[
35
- int,
36
- typer.Option(
37
- "--termination-maximum-runs",
38
- "-m",
39
- help="Maximum number of runs for the shadow test termination condition.",
40
- metavar="TERMINATION_MAXIMUM_RUNS",
41
- min=1,
42
- max=300,
43
- ),
44
- ],
45
- description: Annotated[
46
- str | None,
47
- typer.Option(
48
- "--description",
49
- "-d",
50
- help="Description of the shadow test.",
51
- metavar="DESCRIPTION",
52
- ),
53
- ] = None,
54
- name: Annotated[
55
- str | None,
56
- typer.Option(
57
- "--name",
58
- "-n",
59
- help="Name of the shadow test. If not provided, the ID will be used as the name.",
60
- metavar="NAME",
61
- ),
62
- ] = None,
63
- shadow_test_id: Annotated[
64
- str | None,
65
- typer.Option(
66
- "--shadow-test-id",
67
- "-s",
68
- help="ID for the shadow test. Will be generated if not provided.",
69
- envvar="NEXTMV_SHADOW_TEST_ID",
70
- metavar="SHADOW_TEST_ID",
71
- ),
72
- ] = None,
73
- start_time: Annotated[
74
- datetime | None,
75
- typer.Option(
76
- "--start-time",
77
- "-r",
78
- formats=["%Y-%m-%dT%H:%M:%S%z"],
79
- help="Scheduled time for shadow test start in [magenta]RFC 3339[/magenta] format. "
80
- "Object format: [dim]'2024-01-01T00:00:00Z'[/dim]",
81
- metavar="START_TIME",
82
- ),
83
- ] = None,
84
- termination_time: Annotated[
85
- datetime | None,
86
- typer.Option(
87
- "--termination-time",
88
- "-t",
89
- help="Scheduled time for shadow test end in [magenta]RFC 3339[/magenta] format. "
90
- "Object format: [dim]'2024-01-01T00:00:00Z'[/dim]",
91
- formats=["%Y-%m-%dT%H:%M:%S%z"],
92
- metavar="TERMINATION_TIME",
93
- ),
94
- ] = None,
95
- profile: ProfileOption = None,
96
- ) -> None:
97
- """
98
- Create a new Nextmv Cloud shadow test in draft mode.
99
-
100
- Use the --comparisons option to define how to set up instance comparisons.
101
- The value should be valid [magenta]json[/magenta]. The keys of the
102
- comparisons object are the baseline instance IDs, and the values are the
103
- candidate lists of instance IDs to compare against the respective baseline.
104
-
105
- Here is an example comparisons object:
106
- [dim]{
107
- "baseline-instance-1": ["candidate-instance-1", "candidate-instance-2"],
108
- "baseline-instance-2": ["candidate-instance-3"]
109
- }[/dim]
110
-
111
- You may specify the --start-time option to make the shadow test start at a
112
- specific time. Alternatively, you may use the [code]nextmv cloud shadow
113
- start[/code] command to start the test.
114
-
115
- The --termination-maximum-runs option is required and provides control over
116
- when the shadow test should terminate, after said number of runs.
117
- Alternatively, you may specify the --termination-time option or use the
118
- [code]nextmv cloud shadow stop[/code] command to stop the test.
119
-
120
- [bold][underline]Examples[/underline][/bold]
121
-
122
- - Create a shadow test with a baseline and two candidate instances.
123
- $ [dim]COMPARISONS='{
124
- "fluffy-bunny-baseline": [
125
- "hopping-candidate-ears",
126
- "speedy-cottontail"
127
- ]
128
- }'
129
- nextmv cloud shadow create --app-id hare-app --shadow-test-id bunny-hop-shadow --name "Bunny Hop Showdown" \\
130
- --comparisons "$COMPARISONS" --termination-maximum-runs 100[/dim]
131
-
132
- - Create a shadow test with multiple baselines and candidates.
133
- $ [dim]COMPARISONS='{
134
- "fluffy-bunny-baseline": [
135
- "hopping-candidate-ears"
136
- ],
137
- "wise-old-rabbit": [
138
- "burrow-master"
139
- ]
140
- }'
141
- nextmv cloud shadow create --app-id hare-app --shadow-test-id warren-race --name "Warren Race Test" \\
142
- --comparisons "$COMPARISONS" --termination-maximum-runs 50[/dim]
143
-
144
- - Create a shadow test with a scheduled start and termination time.
145
- $ [dim]COMPARISONS='{
146
- "fluffy-bunny-baseline": [
147
- "hopping-candidate-ears"
148
- ]
149
- }'
150
- nextmv cloud shadow create --app-id hare-app --shadow-test-id sunrise-hop --name "Sunrise Hop Test" \\
151
- --comparisons "$COMPARISONS" --start-time '2026-01-23T10:00:00Z' \\
152
- --termination-time '2026-01-23T18:00:00Z' --termination-maximum-runs 20[/dim]
153
-
154
- - Create a shadow test with a description.
155
- $ [dim]COMPARISONS='{
156
- "fluffy-bunny-baseline": [
157
- "hopping-candidate-ears"
158
- ]
159
- }'
160
- nextmv cloud shadow create --app-id hare-app --shadow-test-id carrot-compare --name "Carrot Comparison" \\
161
- --description "Testing cool bunnies" --comparisons "$COMPARISONS" --termination-maximum-runs 10[/dim]
162
- """
163
-
164
- cloud_app = build_app(app_id=app_id, profile=profile)
165
-
166
- try:
167
- comparisons_dict = json.loads(comparisons)
168
- except json.JSONDecodeError as e:
169
- error(f"Invalid comparisons format: [magenta]{comparisons}[/magenta]. Error: {e}")
170
-
171
- in_progress(msg="Creating shadow test in draft mode...")
172
- shadow_test = cloud_app.new_shadow_test(
173
- comparisons=comparisons_dict,
174
- termination_events=TerminationEvents(
175
- maximum_runs=termination_maximum_runs,
176
- time=termination_time,
177
- ),
178
- shadow_test_id=shadow_test_id,
179
- name=name,
180
- description=description,
181
- start_events=StartEvents(time=start_time) if start_time is not None else None,
182
- )
183
-
184
- print_json(shadow_test.to_dict())
@@ -1,64 +0,0 @@
1
- """
2
- This module defines the cloud shadow delete command for the Nextmv CLI.
3
- """
4
-
5
- from typing import Annotated
6
-
7
- import typer
8
-
9
- from nextmv.cli.configuration.config import build_app
10
- from nextmv.cli.confirm import get_confirmation
11
- from nextmv.cli.message import info, success
12
- from nextmv.cli.options import AppIDOption, ProfileOption, ShadowTestIDOption
13
-
14
- # Set up subcommand application.
15
- app = typer.Typer()
16
-
17
-
18
- @app.command()
19
- def delete(
20
- app_id: AppIDOption,
21
- shadow_test_id: ShadowTestIDOption,
22
- yes: Annotated[
23
- bool,
24
- typer.Option(
25
- "--yes",
26
- "-y",
27
- help="Agree to deletion confirmation prompt. Useful for non-interactive sessions.",
28
- ),
29
- ] = False,
30
- profile: ProfileOption = None,
31
- ) -> None:
32
- """
33
- Deletes a Nextmv Cloud shadow test.
34
-
35
- This action is permanent and cannot be undone. The shadow test and all
36
- associated data, including runs, will be deleted. Use the --yes
37
- flag to skip the confirmation prompt.
38
-
39
- [bold][underline]Examples[/underline][/bold]
40
-
41
- - Delete the shadow test with the ID [magenta]hop-analysis[/magenta] from application
42
- [magenta]hare-app[/magenta].
43
- $ [dim]nextmv cloud shadow delete --app-id hare-app --shadow-test-id hop-analysis[/dim]
44
-
45
- - Delete the shadow test without confirmation prompt.
46
- $ [dim]nextmv cloud shadow delete --app-id hare-app --shadow-test-id carrot-routes --yes[/dim]
47
- """
48
-
49
- if not yes:
50
- confirm = get_confirmation(
51
- f"Are you sure you want to delete shadow test [magenta]{shadow_test_id}[/magenta] "
52
- f"from application [magenta]{app_id}[/magenta]? This action cannot be undone.",
53
- )
54
-
55
- if not confirm:
56
- info(f"Shadow test [magenta]{shadow_test_id}[/magenta] will not be deleted.")
57
- return
58
-
59
- cloud_app = build_app(app_id=app_id, profile=profile)
60
- cloud_app.delete_shadow_test(shadow_test_id=shadow_test_id)
61
- success(
62
- f"Shadow test [magenta]{shadow_test_id}[/magenta] deleted successfully "
63
- f"from application [magenta]{app_id}[/magenta]."
64
- )
@@ -1,61 +0,0 @@
1
- """
2
- This module defines the cloud shadow get command for the Nextmv CLI.
3
- """
4
-
5
- import json
6
- from typing import Annotated
7
-
8
- import typer
9
-
10
- from nextmv.cli.configuration.config import build_app
11
- from nextmv.cli.message import in_progress, print_json, success
12
- from nextmv.cli.options import AppIDOption, ProfileOption, ShadowTestIDOption
13
-
14
- # Set up subcommand application.
15
- app = typer.Typer()
16
-
17
-
18
- @app.command()
19
- def get(
20
- app_id: AppIDOption,
21
- shadow_test_id: ShadowTestIDOption,
22
- output: Annotated[
23
- str | None,
24
- typer.Option(
25
- "--output",
26
- "-o",
27
- help="Saves the results to this location.",
28
- metavar="OUTPUT_PATH",
29
- ),
30
- ] = None,
31
- profile: ProfileOption = None,
32
- ) -> None:
33
- """
34
- Get a Nextmv Cloud shadow test, including its runs.
35
-
36
- [bold][underline]Examples[/underline][/bold]
37
-
38
- - Get the shadow test with ID [magenta]carrot-optimization[/magenta] from application
39
- [magenta]hare-app[/magenta].
40
- $ [dim]nextmv cloud shadow get --app-id hare-app --shadow-test-id carrot-optimization[/dim]
41
-
42
- - Get the shadow test using a specific profile.
43
- $ [dim]nextmv cloud shadow get --app-id hare-app --shadow-test-id lettuce-routes --profile prod[/dim]
44
- """
45
-
46
- cloud_app = build_app(app_id=app_id, profile=profile)
47
- in_progress(msg="Getting shadow test...")
48
- shadow_test = cloud_app.shadow_test(shadow_test_id=shadow_test_id)
49
-
50
- shadow_test_dict = shadow_test.to_dict()
51
-
52
- # Handle output
53
- if output is not None and output != "":
54
- with open(output, "w") as f:
55
- json.dump(shadow_test_dict, f, indent=2)
56
-
57
- success(msg=f"Shadow test output saved to [magenta]{output}[/magenta].")
58
-
59
- return
60
-
61
- print_json(shadow_test_dict)