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.
- nextmv/__about__.py +1 -1
- nextmv/__entrypoint__.py +2 -1
- nextmv/__init__.py +4 -0
- nextmv/cli/CONTRIBUTING.md +40 -112
- nextmv/cli/cloud/__init__.py +0 -4
- nextmv/cli/cloud/acceptance/create.py +22 -20
- nextmv/cli/cloud/acceptance/delete.py +12 -8
- nextmv/cli/cloud/acceptance/get.py +10 -9
- nextmv/cli/cloud/acceptance/list.py +3 -3
- nextmv/cli/cloud/acceptance/update.py +6 -6
- nextmv/cli/cloud/account/__init__.py +3 -3
- nextmv/cli/cloud/account/create.py +11 -11
- nextmv/cli/cloud/account/delete.py +8 -7
- nextmv/cli/cloud/account/get.py +3 -3
- nextmv/cli/cloud/account/update.py +5 -5
- nextmv/cli/cloud/app/create.py +26 -25
- nextmv/cli/cloud/app/delete.py +7 -6
- nextmv/cli/cloud/app/exists.py +2 -2
- nextmv/cli/cloud/app/get.py +2 -2
- nextmv/cli/cloud/app/list.py +3 -3
- nextmv/cli/cloud/app/push.py +54 -349
- nextmv/cli/cloud/app/update.py +12 -12
- nextmv/cli/cloud/batch/create.py +28 -26
- nextmv/cli/cloud/batch/delete.py +10 -6
- nextmv/cli/cloud/batch/get.py +9 -9
- nextmv/cli/cloud/batch/list.py +3 -3
- nextmv/cli/cloud/batch/metadata.py +4 -4
- nextmv/cli/cloud/batch/update.py +6 -6
- nextmv/cli/cloud/data/__init__.py +1 -1
- nextmv/cli/cloud/data/upload.py +15 -15
- nextmv/cli/cloud/ensemble/__init__.py +0 -2
- nextmv/cli/cloud/ensemble/create.py +22 -21
- nextmv/cli/cloud/ensemble/delete.py +10 -6
- nextmv/cli/cloud/ensemble/get.py +4 -4
- nextmv/cli/cloud/ensemble/update.py +9 -9
- nextmv/cli/cloud/input_set/__init__.py +0 -2
- nextmv/cli/cloud/input_set/create.py +22 -22
- nextmv/cli/cloud/input_set/get.py +3 -3
- nextmv/cli/cloud/input_set/list.py +3 -3
- nextmv/cli/cloud/input_set/update.py +24 -24
- nextmv/cli/cloud/instance/create.py +15 -14
- nextmv/cli/cloud/instance/delete.py +7 -6
- nextmv/cli/cloud/instance/exists.py +2 -2
- nextmv/cli/cloud/instance/get.py +2 -2
- nextmv/cli/cloud/instance/list.py +3 -3
- nextmv/cli/cloud/instance/update.py +14 -14
- nextmv/cli/cloud/managed_input/create.py +16 -14
- nextmv/cli/cloud/managed_input/delete.py +8 -7
- nextmv/cli/cloud/managed_input/get.py +3 -3
- nextmv/cli/cloud/managed_input/list.py +3 -3
- nextmv/cli/cloud/managed_input/update.py +9 -9
- nextmv/cli/cloud/run/cancel.py +2 -2
- nextmv/cli/cloud/run/create.py +40 -34
- nextmv/cli/cloud/run/get.py +8 -8
- nextmv/cli/cloud/run/input.py +4 -4
- nextmv/cli/cloud/run/list.py +6 -6
- nextmv/cli/cloud/run/logs.py +10 -9
- nextmv/cli/cloud/run/metadata.py +4 -4
- nextmv/cli/cloud/run/track.py +33 -32
- nextmv/cli/cloud/scenario/create.py +21 -21
- nextmv/cli/cloud/scenario/delete.py +10 -6
- nextmv/cli/cloud/scenario/get.py +9 -9
- nextmv/cli/cloud/scenario/list.py +3 -3
- nextmv/cli/cloud/scenario/metadata.py +4 -4
- nextmv/cli/cloud/scenario/update.py +6 -6
- nextmv/cli/cloud/secrets/create.py +17 -17
- nextmv/cli/cloud/secrets/delete.py +10 -6
- nextmv/cli/cloud/secrets/get.py +4 -4
- nextmv/cli/cloud/secrets/list.py +3 -3
- nextmv/cli/cloud/secrets/update.py +20 -17
- nextmv/cli/cloud/upload/create.py +2 -2
- nextmv/cli/cloud/version/create.py +10 -9
- nextmv/cli/cloud/version/delete.py +7 -6
- nextmv/cli/cloud/version/exists.py +2 -2
- nextmv/cli/cloud/version/get.py +2 -2
- nextmv/cli/cloud/version/list.py +3 -3
- nextmv/cli/cloud/version/update.py +8 -8
- nextmv/cli/community/__init__.py +1 -1
- nextmv/cli/community/clone.py +204 -20
- nextmv/cli/community/list.py +125 -60
- nextmv/cli/configuration/config.py +10 -43
- nextmv/cli/configuration/create.py +7 -7
- nextmv/cli/configuration/delete.py +8 -8
- nextmv/cli/configuration/list.py +3 -3
- nextmv/cli/main.py +36 -26
- nextmv/cli/message.py +54 -71
- nextmv/cli/options.py +0 -28
- nextmv/cli/version.py +1 -1
- nextmv/cloud/__init__.py +38 -14
- nextmv/cloud/acceptance_test.py +65 -1
- nextmv/cloud/account.py +6 -1
- nextmv/cloud/application/__init__.py +75 -18
- nextmv/cloud/application/_acceptance.py +8 -13
- nextmv/cloud/application/_batch_scenario.py +19 -4
- nextmv/cloud/application/_input_set.py +6 -42
- nextmv/cloud/application/_instance.py +3 -3
- nextmv/cloud/application/_managed_input.py +2 -2
- nextmv/cloud/application/_version.py +3 -4
- nextmv/cloud/batch_experiment.py +1 -3
- nextmv/cloud/integration.py +4 -7
- nextmv/deprecated.py +3 -5
- nextmv/input.py +52 -0
- nextmv/local/runner.py +1 -1
- nextmv/model.py +11 -50
- nextmv/options.py +256 -11
- nextmv/output.py +62 -0
- nextmv/run.py +10 -1
- nextmv/status.py +51 -1
- {nextmv-1.0.0.dist-info → nextmv-1.0.0.dev0.dist-info}/METADATA +4 -5
- nextmv-1.0.0.dev0.dist-info/RECORD +158 -0
- nextmv/cli/cloud/ensemble/list.py +0 -63
- nextmv/cli/cloud/input_set/delete.py +0 -64
- nextmv/cli/cloud/shadow/__init__.py +0 -33
- nextmv/cli/cloud/shadow/create.py +0 -184
- nextmv/cli/cloud/shadow/delete.py +0 -64
- nextmv/cli/cloud/shadow/get.py +0 -61
- nextmv/cli/cloud/shadow/list.py +0 -63
- nextmv/cli/cloud/shadow/metadata.py +0 -66
- nextmv/cli/cloud/shadow/start.py +0 -43
- nextmv/cli/cloud/shadow/stop.py +0 -53
- nextmv/cli/cloud/shadow/update.py +0 -96
- nextmv/cli/cloud/switchback/__init__.py +0 -33
- nextmv/cli/cloud/switchback/create.py +0 -151
- nextmv/cli/cloud/switchback/delete.py +0 -64
- nextmv/cli/cloud/switchback/get.py +0 -62
- nextmv/cli/cloud/switchback/list.py +0 -63
- nextmv/cli/cloud/switchback/metadata.py +0 -68
- nextmv/cli/cloud/switchback/start.py +0 -43
- nextmv/cli/cloud/switchback/stop.py +0 -53
- nextmv/cli/cloud/switchback/update.py +0 -96
- nextmv/cli/confirm.py +0 -34
- nextmv/cloud/application/_shadow.py +0 -320
- nextmv/cloud/application/_switchback.py +0 -332
- nextmv/cloud/community.py +0 -446
- nextmv/cloud/shadow.py +0 -254
- nextmv/cloud/switchback.py +0 -228
- nextmv-1.0.0.dist-info/RECORD +0 -185
- nextmv-1.0.0.dist-info/entry_points.txt +0 -2
- {nextmv-1.0.0.dist-info → nextmv-1.0.0.dev0.dist-info}/WHEEL +0 -0
- {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
|
-
)
|
nextmv/cli/cloud/shadow/get.py
DELETED
|
@@ -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)
|