Skip to content

Commit a138831

Browse files
committed
Add an option to skip provisioning
This adds an option to skip provisioning when creating instances.
1 parent e2185d0 commit a138831

3 files changed

Lines changed: 31 additions & 4 deletions

File tree

incant/cli.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,11 +39,12 @@ def _handle_error(error: Exception, reporter: Reporter) -> None:
3939

4040
@cli.command()
4141
@click.argument("name", required=False)
42+
@click.option("--no-provision", is_flag=True, help="Skip provisioning after starting the instances.")
4243
@click.pass_context
43-
def up(ctx, name: Optional[str]):
44+
def up(ctx, name: Optional[str], no_provision: Optional[bool]):
4445
"""Start and provision an instance or all instances if no name is provided."""
4546
try:
46-
Incant(reporter=ctx.obj["REPORTER"], **ctx.obj["OPTIONS"]).up(name)
47+
Incant(reporter=ctx.obj["REPORTER"], **ctx.obj["OPTIONS"]).up(name, provision=not no_provision)
4748
except IncantError as e:
4849
_handle_error(e, ctx.obj["REPORTER"])
4950

incant/incant.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ def _get_instance_configs(self, name: Optional[str] = None) -> InstanceDict:
4040
def dump_config(self):
4141
self.config_manager.dump_config()
4242

43-
def up(self, name=None):
43+
def up(self, name=None, provision: bool = True):
4444
instance_configs = self._get_instance_configs(name)
4545

4646
# Step 1 -- Create instances (we do this for all instances so that they can
@@ -82,7 +82,7 @@ def up(self, name=None):
8282
if instance_config.shared_folder:
8383
self.incus.create_shared_folder(instance_config.name)
8484

85-
if instance_config.provision:
85+
if instance_config.provision and provision:
8686
# Automatically run provisioning after instance creation
8787
self.provision(instance_config.name)
8888

tests/test_incant.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -258,6 +258,32 @@ def test_up_single_instance_with_provision(
258258
mock_incus_cli.is_instance_ready.assert_called_once_with("test-instance", True)
259259
incant_app.provisioner.provision.assert_called_once_with("test-instance", ["script.sh"])
260260

261+
@patch("incant.incant.time.sleep", return_value=None)
262+
def test_up_single_instance_with_provision_but_disabled(
263+
self,
264+
mock_sleep,
265+
incant_app,
266+
mock_config_manager,
267+
mock_incus_cli,
268+
mock_provision_manager,
269+
mock_reporter,
270+
):
271+
instance_config = InstanceConfig(
272+
name="test-instance", image="img", provision=["script.sh"], shared_folder=False
273+
)
274+
mock_config_manager.instance_configs = {"test-instance": instance_config}
275+
mock_incus_cli.is_agent_running.return_value = True
276+
mock_incus_cli.is_agent_usable.return_value = True
277+
mock_incus_cli.is_instance_ready.return_value = True # Provision implies wait
278+
279+
incant_app.up("test-instance", provision=False)
280+
281+
mock_incus_cli.create_instance.assert_called_once_with(instance_config)
282+
mock_incus_cli.is_agent_running.assert_called_once_with("test-instance")
283+
mock_incus_cli.is_agent_usable.assert_called_once_with("test-instance")
284+
mock_incus_cli.is_instance_ready.assert_called_once_with("test-instance", True)
285+
incant_app.provisioner.provision.assert_not_called()
286+
261287
@patch("incant.incant.time.sleep", return_value=None)
262288
def test_up_single_instance_with_shared_folder(
263289
self, mock_sleep, incant_app, mock_config_manager, mock_incus_cli, mock_reporter

0 commit comments

Comments
 (0)