nextmv 0.40.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 (129) hide show
  1. nextmv/__about__.py +1 -1
  2. nextmv/__init__.py +2 -0
  3. nextmv/cli/CONTRIBUTING.md +511 -0
  4. nextmv/cli/cloud/__init__.py +45 -0
  5. nextmv/cli/cloud/acceptance/__init__.py +27 -0
  6. nextmv/cli/cloud/acceptance/create.py +393 -0
  7. nextmv/cli/cloud/acceptance/delete.py +68 -0
  8. nextmv/cli/cloud/acceptance/get.py +104 -0
  9. nextmv/cli/cloud/acceptance/list.py +62 -0
  10. nextmv/cli/cloud/acceptance/update.py +95 -0
  11. nextmv/cli/cloud/account/__init__.py +28 -0
  12. nextmv/cli/cloud/account/create.py +83 -0
  13. nextmv/cli/cloud/account/delete.py +60 -0
  14. nextmv/cli/cloud/account/get.py +66 -0
  15. nextmv/cli/cloud/account/update.py +70 -0
  16. nextmv/cli/cloud/app/__init__.py +35 -0
  17. nextmv/cli/cloud/app/create.py +141 -0
  18. nextmv/cli/cloud/app/delete.py +58 -0
  19. nextmv/cli/cloud/app/exists.py +44 -0
  20. nextmv/cli/cloud/app/get.py +66 -0
  21. nextmv/cli/cloud/app/list.py +61 -0
  22. nextmv/cli/cloud/app/push.py +137 -0
  23. nextmv/cli/cloud/app/update.py +124 -0
  24. nextmv/cli/cloud/batch/__init__.py +29 -0
  25. nextmv/cli/cloud/batch/create.py +454 -0
  26. nextmv/cli/cloud/batch/delete.py +68 -0
  27. nextmv/cli/cloud/batch/get.py +104 -0
  28. nextmv/cli/cloud/batch/list.py +63 -0
  29. nextmv/cli/cloud/batch/metadata.py +66 -0
  30. nextmv/cli/cloud/batch/update.py +95 -0
  31. nextmv/cli/cloud/data/__init__.py +26 -0
  32. nextmv/cli/cloud/data/upload.py +162 -0
  33. nextmv/cli/cloud/ensemble/__init__.py +31 -0
  34. nextmv/cli/cloud/ensemble/create.py +414 -0
  35. nextmv/cli/cloud/ensemble/delete.py +67 -0
  36. nextmv/cli/cloud/ensemble/get.py +65 -0
  37. nextmv/cli/cloud/ensemble/update.py +103 -0
  38. nextmv/cli/cloud/input_set/__init__.py +30 -0
  39. nextmv/cli/cloud/input_set/create.py +168 -0
  40. nextmv/cli/cloud/input_set/get.py +63 -0
  41. nextmv/cli/cloud/input_set/list.py +63 -0
  42. nextmv/cli/cloud/input_set/update.py +123 -0
  43. nextmv/cli/cloud/instance/__init__.py +35 -0
  44. nextmv/cli/cloud/instance/create.py +290 -0
  45. nextmv/cli/cloud/instance/delete.py +62 -0
  46. nextmv/cli/cloud/instance/exists.py +39 -0
  47. nextmv/cli/cloud/instance/get.py +62 -0
  48. nextmv/cli/cloud/instance/list.py +60 -0
  49. nextmv/cli/cloud/instance/update.py +216 -0
  50. nextmv/cli/cloud/managed_input/__init__.py +31 -0
  51. nextmv/cli/cloud/managed_input/create.py +146 -0
  52. nextmv/cli/cloud/managed_input/delete.py +65 -0
  53. nextmv/cli/cloud/managed_input/get.py +63 -0
  54. nextmv/cli/cloud/managed_input/list.py +60 -0
  55. nextmv/cli/cloud/managed_input/update.py +97 -0
  56. nextmv/cli/cloud/run/__init__.py +37 -0
  57. nextmv/cli/cloud/run/cancel.py +37 -0
  58. nextmv/cli/cloud/run/create.py +530 -0
  59. nextmv/cli/cloud/run/get.py +199 -0
  60. nextmv/cli/cloud/run/input.py +86 -0
  61. nextmv/cli/cloud/run/list.py +80 -0
  62. nextmv/cli/cloud/run/logs.py +167 -0
  63. nextmv/cli/cloud/run/metadata.py +67 -0
  64. nextmv/cli/cloud/run/track.py +501 -0
  65. nextmv/cli/cloud/scenario/__init__.py +29 -0
  66. nextmv/cli/cloud/scenario/create.py +451 -0
  67. nextmv/cli/cloud/scenario/delete.py +65 -0
  68. nextmv/cli/cloud/scenario/get.py +102 -0
  69. nextmv/cli/cloud/scenario/list.py +63 -0
  70. nextmv/cli/cloud/scenario/metadata.py +67 -0
  71. nextmv/cli/cloud/scenario/update.py +93 -0
  72. nextmv/cli/cloud/secrets/__init__.py +33 -0
  73. nextmv/cli/cloud/secrets/create.py +206 -0
  74. nextmv/cli/cloud/secrets/delete.py +67 -0
  75. nextmv/cli/cloud/secrets/get.py +66 -0
  76. nextmv/cli/cloud/secrets/list.py +60 -0
  77. nextmv/cli/cloud/secrets/update.py +147 -0
  78. nextmv/cli/cloud/upload/__init__.py +22 -0
  79. nextmv/cli/cloud/upload/create.py +39 -0
  80. nextmv/cli/cloud/version/__init__.py +33 -0
  81. nextmv/cli/cloud/version/create.py +97 -0
  82. nextmv/cli/cloud/version/delete.py +62 -0
  83. nextmv/cli/cloud/version/exists.py +39 -0
  84. nextmv/cli/cloud/version/get.py +62 -0
  85. nextmv/cli/cloud/version/list.py +60 -0
  86. nextmv/cli/cloud/version/update.py +92 -0
  87. nextmv/cli/community/__init__.py +24 -0
  88. nextmv/cli/community/clone.py +3 -3
  89. nextmv/cli/community/list.py +1 -1
  90. nextmv/cli/configuration/__init__.py +23 -0
  91. nextmv/cli/configuration/config.py +68 -4
  92. nextmv/cli/configuration/create.py +14 -15
  93. nextmv/cli/configuration/delete.py +24 -12
  94. nextmv/cli/configuration/list.py +1 -1
  95. nextmv/cli/main.py +58 -16
  96. nextmv/cli/message.py +153 -0
  97. nextmv/cli/options.py +168 -0
  98. nextmv/cli/version.py +20 -1
  99. nextmv/cloud/__init__.py +4 -1
  100. nextmv/cloud/acceptance_test.py +19 -18
  101. nextmv/cloud/account.py +268 -24
  102. nextmv/cloud/application/__init__.py +955 -0
  103. nextmv/cloud/application/_acceptance.py +419 -0
  104. nextmv/cloud/application/_batch_scenario.py +860 -0
  105. nextmv/cloud/application/_ensemble.py +251 -0
  106. nextmv/cloud/application/_input_set.py +227 -0
  107. nextmv/cloud/application/_instance.py +289 -0
  108. nextmv/cloud/application/_managed_input.py +227 -0
  109. nextmv/cloud/application/_run.py +1393 -0
  110. nextmv/cloud/application/_secrets.py +294 -0
  111. nextmv/cloud/application/_utils.py +54 -0
  112. nextmv/cloud/application/_version.py +303 -0
  113. nextmv/cloud/batch_experiment.py +3 -1
  114. nextmv/cloud/instance.py +11 -1
  115. nextmv/cloud/integration.py +1 -1
  116. nextmv/cloud/package.py +50 -9
  117. nextmv/input.py +20 -36
  118. nextmv/local/application.py +3 -15
  119. nextmv/polling.py +54 -16
  120. nextmv/run.py +83 -27
  121. {nextmv-0.40.0.dist-info → nextmv-1.0.0.dev0.dist-info}/METADATA +33 -8
  122. nextmv-1.0.0.dev0.dist-info/RECORD +158 -0
  123. nextmv/cli/community/community.py +0 -24
  124. nextmv/cli/configuration/configuration.py +0 -23
  125. nextmv/cli/error.py +0 -22
  126. nextmv/cloud/application.py +0 -4204
  127. nextmv-0.40.0.dist-info/RECORD +0 -66
  128. {nextmv-0.40.0.dist-info → nextmv-1.0.0.dev0.dist-info}/WHEEL +0 -0
  129. {nextmv-0.40.0.dist-info → nextmv-1.0.0.dev0.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,168 @@
1
+ """
2
+ This module defines the cloud input-set 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.input_set import ManagedInput
15
+ from nextmv.safe import safe_id
16
+
17
+ # Set up subcommand application.
18
+ app = typer.Typer()
19
+
20
+
21
+ @app.command()
22
+ def create(
23
+ app_id: AppIDOption,
24
+ name: Annotated[
25
+ str,
26
+ typer.Option(
27
+ "--name",
28
+ "-n",
29
+ help="A name for the input set.",
30
+ metavar="NAME",
31
+ ),
32
+ ],
33
+ input_set_id: Annotated[
34
+ str | None,
35
+ typer.Option(
36
+ "--input-set-id",
37
+ "-s",
38
+ help="An optional ID for the input set. If not provided, a random ID will be generated.",
39
+ envvar="NEXTMV_INPUT_SET_ID",
40
+ metavar="INPUT_SET_ID",
41
+ ),
42
+ ] = None,
43
+ instance_id: Annotated[
44
+ str | None,
45
+ typer.Option(
46
+ "--instance-id",
47
+ "-i",
48
+ help="Instance ID to filter runs from.",
49
+ metavar="INSTANCE_ID",
50
+ ),
51
+ ] = None,
52
+ description: Annotated[
53
+ str | None,
54
+ typer.Option(
55
+ "--description",
56
+ "-d",
57
+ help="An optional description for the input set.",
58
+ metavar="DESCRIPTION",
59
+ ),
60
+ ] = None,
61
+ run_ids: Annotated[
62
+ list[str] | None,
63
+ typer.Option(
64
+ "--run-ids",
65
+ "-r",
66
+ help="List of run IDs to include in the input set (max 20). Pass multiple run IDs by repeating the flag.",
67
+ metavar="RUN_IDS",
68
+ ),
69
+ ] = None,
70
+ start_time: Annotated[
71
+ datetime | None,
72
+ typer.Option(
73
+ "--start-time",
74
+ formats=["%Y-%m-%dT%H:%M:%S%z"],
75
+ help="Start time for filtering runs. (example: [magenta]'2024-01-01T00:00:00Z'[/magenta])",
76
+ metavar="START_TIME",
77
+ ),
78
+ ] = None,
79
+ end_time: Annotated[
80
+ datetime | None,
81
+ typer.Option(
82
+ "--end-time",
83
+ formats=["%Y-%m-%dT%H:%M:%S%z"],
84
+ help="End time for filtering runs. (example: [magenta]'2024-01-01T00:00:00Z'[/magenta])",
85
+ metavar="END_TIME",
86
+ ),
87
+ ] = None,
88
+ maximum_runs: Annotated[
89
+ int | None,
90
+ typer.Option(
91
+ "--maximum-runs",
92
+ "-m",
93
+ help="Maximum number of runs to include (max [magenta]20[/magenta]).",
94
+ metavar="MAXIMUM_RUNS",
95
+ ),
96
+ ] = 20,
97
+ inputs: Annotated[
98
+ str | None,
99
+ typer.Option(
100
+ "--inputs",
101
+ help="Inputs for the input set. Data should be valid [magenta]json[/magenta]. Object "
102
+ "format: [magenta][{'id': 'id', 'name': 'name', 'description': 'description'}][/magenta].",
103
+ metavar="INPUTS",
104
+ ),
105
+ ] = None,
106
+ profile: ProfileOption = None,
107
+ ) -> None:
108
+ """
109
+ Create a new Nextmv Cloud input set for experiments.
110
+
111
+ An input set is a collection of inputs that can be reused across multiple
112
+ experiments.
113
+
114
+ 1. [code]--run-ids[/code]: Create from a list of existing run IDs.
115
+
116
+ 2. [code]--inputs[/code]: Create from existing managed inputs in the application.
117
+
118
+ 3. [code]--instance-id[/code] with [code]--start-time[/code] and [code]--end-time[/code]:
119
+ Create from instance runs matching the time range criteria.
120
+
121
+ [bold][underline]Examples[/underline][/bold]
122
+
123
+ - Create an input set for application [magenta]hare-app[/magenta] from runs.
124
+ A random input set ID will be generated if one is not provided.
125
+ $ [green]nextmv cloud input-set create --app-id hare-app \\
126
+ --name "Hare Input Set" --run-ids run-1 --run-ids run-2 --run-ids run-3"[/green]
127
+
128
+ - Create an input set with a specific ID.
129
+ $ [green]nextmv cloud input-set create --app-id hare-app --input-set-id hare-input-set \\
130
+ --name "Hare Input Set" --run-ids run-1 --run-ids run-2 --run-ids run-3"[/green]
131
+
132
+ - Create an input set using existing managed inputs.
133
+ $ [green]nextmv cloud input-set create --app-id hare-app --name "Hare Input Set" \\
134
+ --inputs '[{"id": "hare-input-1", "name": "hare input", "description": "hare description"}]'[/green]
135
+
136
+ - Create an input set from runs using a specific instance and time range.
137
+ $ [green]nextmv cloud input-set create --app-id hare-app --name "Hare Input Set" \\
138
+ --instance-id hare-instance --start-time "2024-01-01T00:00:00Z" \\
139
+ --end-time "2024-01-31T23:59:59Z"[/green]
140
+ """
141
+
142
+ cloud_app = build_app(app_id=app_id, profile=profile)
143
+ in_progress(msg="Creating input set...")
144
+
145
+ # Generate a random input set ID if one is not provided.
146
+ if input_set_id is None:
147
+ input_set_id = safe_id("input-set")
148
+
149
+ managed_inputs = []
150
+ if inputs is not None:
151
+ for d in json.loads(inputs):
152
+ i = ManagedInput.from_dict(d)
153
+ if i is None:
154
+ error(f"[magenta]{d}[/magenta] is not a valid [yellow]ManagedInput[/yellow]")
155
+ managed_inputs.append(i)
156
+
157
+ input_set = cloud_app.new_input_set(
158
+ input_set_id,
159
+ name,
160
+ description=description,
161
+ instance_id=instance_id,
162
+ run_ids=run_ids,
163
+ start_time=start_time,
164
+ end_time=end_time,
165
+ maximum_runs=maximum_runs,
166
+ inputs=managed_inputs,
167
+ )
168
+ print_json(input_set.to_dict())
@@ -0,0 +1,63 @@
1
+ """
2
+ This module defines the cloud input-set 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, InputSetIDOption, ProfileOption
13
+
14
+ # Set up subcommand application.
15
+ app = typer.Typer()
16
+
17
+
18
+ @app.command()
19
+ def get(
20
+ app_id: AppIDOption,
21
+ input_set_id: InputSetIDOption,
22
+ output: Annotated[
23
+ str | None,
24
+ typer.Option(
25
+ "--output",
26
+ "-o",
27
+ help="Saves the input set information to this location.",
28
+ metavar="OUTPUT_PATH",
29
+ ),
30
+ ] = None,
31
+ profile: ProfileOption = None,
32
+ ) -> None:
33
+ """
34
+ Get an Nextmv Cloud input set.
35
+
36
+ This command retrieves the details of an existing input set, including
37
+ its name, description, and the list of inputs it contains.
38
+
39
+ [bold][underline]Examples[/underline][/bold]
40
+
41
+ - Get an input set with the ID [magenta]hare-input-set[/magenta].
42
+ $ [green]nextmv cloud input-set get --app-id hare-app --input-set-id hare-input-set[/green]
43
+
44
+ - Get an input set with the ID [magenta]hare-input-set[/magenta] and save
45
+ the information to a [magenta]input-set.json[/magenta] file.
46
+ $ [green]nextmv cloud input-set get --app-id hare-app --input-set-id hare-input-set \\
47
+ --output input-set.json[/green]
48
+ """
49
+
50
+ cloud_app = build_app(app_id=app_id, profile=profile)
51
+ in_progress(msg="Getting input set...")
52
+ input_set = cloud_app.input_set(input_set_id=input_set_id)
53
+ input_set_dict = input_set.to_dict()
54
+
55
+ if output is not None and output != "":
56
+ with open(output, "w") as f:
57
+ json.dump(input_set_dict, f, indent=2)
58
+
59
+ success(msg=f"Input set information saved to [magenta]{output}[/magenta].")
60
+
61
+ return
62
+
63
+ print_json(input_set_dict)
@@ -0,0 +1,63 @@
1
+ """
2
+ This module defines the cloud input-set 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 input set list to this location.",
27
+ metavar="OUTPUT_PATH",
28
+ ),
29
+ ] = None,
30
+ profile: ProfileOption = None,
31
+ ) -> None:
32
+ """
33
+ List all input sets of a Nextmv Cloud application.
34
+
35
+ This command retrieves all input sets that exist for a given Nextmv Cloud
36
+ application.
37
+
38
+ [bold][underline]Examples[/underline][/bold]
39
+
40
+ - List all input sets of application [magenta]hare-app[/magenta].
41
+ $ [green]nextmv cloud input-set list --app-id hare-app[/green]
42
+
43
+ - List all input sets using the profile named [magenta]hare[/magenta].
44
+ $ [green]nextmv cloud input-set list --app-id hare-app --profile hare[/green]
45
+
46
+ - List all input sets and save the information to a [magenta]input-sets.json[/magenta] file.
47
+ $ [green]nextmv cloud input-set list --app-id hare-app --output input-sets.json[/green]
48
+ """
49
+
50
+ cloud_app = build_app(app_id=app_id, profile=profile)
51
+ in_progress(msg="Listing input sets...")
52
+ input_sets = cloud_app.list_input_sets()
53
+ input_sets_dicts = [input_set.to_dict() for input_set in input_sets]
54
+
55
+ if output is not None and output != "":
56
+ with open(output, "w") as f:
57
+ json.dump(input_sets_dicts, f, indent=2)
58
+
59
+ success(msg=f"Input set list information saved to [magenta]{output}[/magenta].")
60
+
61
+ return
62
+
63
+ print_json(input_sets_dicts)
@@ -0,0 +1,123 @@
1
+ """
2
+ This module defines the cloud input-set update 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 error, in_progress, print_json, success
12
+ from nextmv.cli.options import AppIDOption, InputSetIDOption, ProfileOption
13
+ from nextmv.cloud.input_set import ManagedInput
14
+
15
+ # Set up subcommand application.
16
+ app = typer.Typer()
17
+
18
+
19
+ @app.command()
20
+ def update(
21
+ app_id: AppIDOption,
22
+ input_set_id: InputSetIDOption,
23
+ name: Annotated[
24
+ str | None,
25
+ typer.Option(
26
+ "--name",
27
+ "-n",
28
+ help="A new name for the input set.",
29
+ metavar="NAME",
30
+ ),
31
+ ] = None,
32
+ description: Annotated[
33
+ str | None,
34
+ typer.Option(
35
+ "--description",
36
+ "-d",
37
+ help="A new description for the input set.",
38
+ metavar="DESCRIPTION",
39
+ ),
40
+ ] = None,
41
+ inputs: Annotated[
42
+ str | None,
43
+ typer.Option(
44
+ "--inputs",
45
+ help="Inputs for the input set. Data should be valid [magenta]json[/magenta]. Object "
46
+ "format: [magenta][{'id': 'id', 'name': 'name', 'description': 'description'}][/magenta].",
47
+ metavar="INPUTS",
48
+ ),
49
+ ] = None,
50
+ output: Annotated[
51
+ str | None,
52
+ typer.Option(
53
+ "--output",
54
+ "-o",
55
+ help="Saves the updated input set information to this location.",
56
+ metavar="OUTPUT_PATH",
57
+ ),
58
+ ] = None,
59
+ profile: ProfileOption = None,
60
+ ) -> None:
61
+ """
62
+ Updates a Nextmv Cloud input set.
63
+
64
+ This command updates the metadata of an existing input set. You can update
65
+ the name, description, or inputs of the input set.
66
+
67
+ [bold][underline]Examples[/underline][/bold]
68
+
69
+ - Update an input set's name.
70
+ $ [green]nextmv cloud input-set update --app-id hare-app \\
71
+ --input-set-id hare-input-set --name "New Name"[/green]
72
+
73
+ - Update an input set's description.
74
+ $ [green]nextmv cloud input-set update --app-id hare-app \\
75
+ --input-set-id hare-input-set --description "Updated description"[/green]
76
+
77
+ - Update an input set's inputs.
78
+ $ [green]nextmv cloud input-set update --app-id hare-app --input-set-id hare-input-set \\
79
+ --inputs '[{"id": "hare-input-1", "name": "hare input", "description": "hare description"}]'[/green]
80
+
81
+ - Update both name and description.
82
+ $ [green]nextmv cloud input-set update --app-id hare-app --input-set-id hare-input-set \\
83
+ --name "New Name" --description "Updated description"[/green]
84
+
85
+ - Update and save to a file.
86
+ $ [green]nextmv cloud input-set update --app-id hare-app --input-set-id hare-input-set \\
87
+ --name "New Name" --output updated_input_set.json[/green]
88
+ """
89
+
90
+ if name is None and description is None and inputs is None:
91
+ error("Provide at least one option: [code]--name[/code], [code]--description[/code], or [code]--inputs[/code].")
92
+
93
+ cloud_app = build_app(app_id=app_id, profile=profile)
94
+ in_progress(msg="Updating input set...")
95
+
96
+ managed_inputs = []
97
+ if inputs is not None:
98
+ for d in json.loads(inputs):
99
+ i = ManagedInput.from_dict(d)
100
+ if i is None:
101
+ error(f"[magenta]{d}[/magenta] is not a valid [yellow]ManagedInput[/yellow]")
102
+ managed_inputs.append(i)
103
+
104
+ updated_input_set = cloud_app.update_input_set(
105
+ id=input_set_id,
106
+ name=name,
107
+ description=description,
108
+ inputs=managed_inputs,
109
+ )
110
+ success(
111
+ f"Input set [magenta]{input_set_id}[/magenta] updated successfully in application [magenta]{app_id}[/magenta]."
112
+ )
113
+ updated_input_set_dict = updated_input_set.to_dict()
114
+
115
+ if output is not None and output != "":
116
+ with open(output, "w") as f:
117
+ json.dump(updated_input_set_dict, f, indent=2)
118
+
119
+ success(msg=f"Updated input set information saved to [magenta]{output}[/magenta].")
120
+
121
+ return
122
+
123
+ print_json(updated_input_set_dict)
@@ -0,0 +1,35 @@
1
+ """
2
+ This module defines the cloud instance command tree for the Nextmv CLI.
3
+ """
4
+
5
+ import typer
6
+
7
+ from nextmv.cli.cloud.instance.create import app as create_app
8
+ from nextmv.cli.cloud.instance.delete import app as delete_app
9
+ from nextmv.cli.cloud.instance.exists import app as exists_app
10
+ from nextmv.cli.cloud.instance.get import app as get_app
11
+ from nextmv.cli.cloud.instance.list import app as list_app
12
+ from nextmv.cli.cloud.instance.update import app as update_app
13
+
14
+ # Set up subcommand application.
15
+ app = typer.Typer()
16
+ app.add_typer(create_app)
17
+ app.add_typer(delete_app)
18
+ app.add_typer(exists_app)
19
+ app.add_typer(get_app)
20
+ app.add_typer(list_app)
21
+ app.add_typer(update_app)
22
+
23
+
24
+ @app.callback()
25
+ def callback() -> None:
26
+ """
27
+ Create and manage Nextmv Cloud application instances.
28
+
29
+ An application instance is a representation of a version and optional
30
+ configuration (options/parameters). Instances are the mechanism by which a
31
+ run is made. When you make a new run, the app determines which instance to
32
+ use and then uses the executable code associated to the version for the
33
+ run.
34
+ """
35
+ pass