Skip to content

Commit 2fd7593

Browse files
authored
Merge pull request #8 from Dunedan/skip-provisioning
Add an option to skip provisioning
2 parents e535040 + a138831 commit 2fd7593

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
@@ -46,11 +46,12 @@ def help(ctx):
4646

4747
@cli.command()
4848
@click.argument("name", required=False)
49+
@click.option("--no-provision", is_flag=True, help="Skip provisioning after starting the instances.")
4950
@click.pass_context
50-
def up(ctx, name: Optional[str]):
51+
def up(ctx, name: Optional[str], no_provision: Optional[bool]):
5152
"""Start and provision an instance or all instances if no name is provided."""
5253
try:
53-
Incant(reporter=ctx.obj["REPORTER"], **ctx.obj["OPTIONS"]).up(name)
54+
Incant(reporter=ctx.obj["REPORTER"], **ctx.obj["OPTIONS"]).up(name, provision=not no_provision)
5455
except IncantError as e:
5556
_handle_error(e, ctx.obj["REPORTER"])
5657

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)