Skip to content

Commit b406f6b

Browse files
committed
encapsulate ix-plugin provisioning in JailCommandExecution events
1 parent 6e448ab commit b406f6b

File tree

4 files changed

+109
-18
lines changed

4 files changed

+109
-18
lines changed

iocage/cli/provision.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,7 @@ def _provision(
9595
)
9696
except iocage.lib.errors.IocageException:
9797
exit(1)
98+
9899
try:
99100
print_function(_execute_provisioner(jail))
100101
except iocage.lib.errors.IocageException:
@@ -118,6 +119,7 @@ def _execute_provisioner(
118119
jail: 'iocage.lib.Jail.JailsGenerator'
119120
) -> typing.Generator['iocage.lib.events.IocageEvent', None, None]:
120121
for event in jail.provisioner.provision():
121-
if isinstance(event, iocage.lib.events.JailLaunch) and event.done:
122-
print(event.stdout)
123122
yield event
123+
if isinstance(event, iocage.lib.events.JailCommandExecution):
124+
if event.done is True:
125+
print(event.stdout)

iocage/lib/Jail.py

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,6 @@
5252
import iocage.lib.Config.Jail.Properties.ResourceLimit
5353
import iocage.lib.ResourceSelector
5454
import iocage.lib.Config.Jail.File.Fstab
55-
import iocage.lib.Provisioning
5655

5756

5857
class JailResource(
@@ -377,6 +376,7 @@ def provisioner(self) -> 'iocage.lib.Provisioning.prototype.Provisioner':
377376
except AttributeError:
378377
pass
379378

379+
import iocage.lib.Provisioning
380380
self._provisioner = iocage.lib.Provisioning.Provisioner(jail=self)
381381
return self._provisioner
382382

@@ -1299,14 +1299,20 @@ def exec( # noqa: T484
12991299
"""
13001300
command = ["/usr/sbin/jexec", str(self.jid)] + command
13011301

1302-
child, stdout, stderr = iocage.lib.helpers.exec(
1302+
command_env = self.env
1303+
if "env" in kwargs:
1304+
for env_key, env_value in kwargs["env"].items():
1305+
command_env[env_key] = env_value
1306+
del kwargs["env"]
1307+
1308+
stdout, stderr, returncode = iocage.lib.helpers.exec(
13031309
command,
13041310
logger=self.logger,
1305-
env=self.env,
1311+
env=command_env,
13061312
**kwargs # noqa: T484
13071313
)
13081314

1309-
return child, stdout, stderr
1315+
return stdout, stderr, returncode
13101316

13111317
def passthru(
13121318
self,

iocage/lib/Provisioning/ix.py

Lines changed: 76 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
# POSSIBILITY OF SUCH DAMAGE.
2424
"""iocage provisioner for ix-plugins."""
2525
import typing
26+
import os.path
2627
import json
2728
import urllib.error
2829
import urllib.request
@@ -35,6 +36,24 @@
3536
import iocage.lib.Provisioning
3637

3738

39+
class PackageUpdateEvent(iocage.lib.events.JailCommandExecution):
40+
"""IocageEvent for package update fetching."""
41+
42+
pass
43+
44+
45+
class PackageInstallEvent(iocage.lib.events.JailCommandExecution):
46+
"""IocageEvent for package installation."""
47+
48+
pass
49+
50+
51+
class PostInstallExecutionEvent(iocage.lib.events.JailCommandExecution):
52+
"""IocageEvent for post_install.sh execution."""
53+
54+
pass
55+
56+
3857
class PluginDefinition(dict):
3958
"""ix-iocage-plugin definition."""
4059

@@ -110,13 +129,24 @@ def provision(
110129
jail=self.jail,
111130
event_scope=event_scope
112131
)
132+
yield jailProvisioningEvent.begin()
113133
_scope = jailProvisioningEvent.scope
114-
jailProvisioningAssetDownloadEvent = events.JailProvisioningAssetDownload(
134+
event_kargs = dict(
115135
jail=self.jail,
116136
event_scope=_scope
117137
)
118-
119-
yield jailProvisioningEvent.begin()
138+
jailProvisioningAssetDownloadEvent = events.JailProvisioningAssetDownload(
139+
**event_kargs
140+
)
141+
packageUpdateEvent = PackageUpdateEvent(
142+
**event_kargs
143+
)
144+
packageInstallEvent = PackageInstallEvent(
145+
**event_kargs
146+
)
147+
postInstallExecutionEvent = PostInstallExecutionEvent(
148+
**event_kargs
149+
)
120150

121151
# download provisioning assets
122152
try:
@@ -148,19 +178,52 @@ def provision(
148178
self.jail.fstab.save()
149179

150180
if "pkgs" in pluginDefinition.keys():
151-
pkg_packages = " ".join(pluginDefinition["pkgs"])
181+
pkg_packages = list(pluginDefinition["pkgs"])
152182
else:
153-
pkg_packages = pluginDefinition.name
183+
pkg_packages = [pluginDefinition.name]
154184

155-
commands = [
156-
"ASSUME_ALWAYS_YES=true pkg update",
157-
f"ASSUME_ALWAYS_YES=true pkg install -y {pkg_packages}",
158-
"./ix-plugin/post_install.sh"
159-
]
160-
161-
for event in self.jail.fork_exec("\n".join(commands)):
185+
for event in self.jail.start():
162186
yield event
163187

188+
try:
189+
yield packageUpdateEvent.begin()
190+
try:
191+
stdout, stderr, returncode = self.jail.exec(
192+
["pkg", "update"],
193+
env=dict(ASSUME_ALWAYS_YES="true")
194+
)
195+
yield packageUpdateEvent.end(stdout=stdout)
196+
except iocage.lib.errors.IocageException as e:
197+
yield packageUpdateEvent.fail(e)
198+
raise e
199+
200+
yield packageInstallEvent.begin()
201+
try:
202+
stdout, stderr, returncode = self.jail.exec(
203+
["pkg", "install", "-y"] + pkg_packages,
204+
env=dict(ASSUME_ALWAYS_YES="true")
205+
)
206+
yield packageInstallEvent.end(stdout=stdout)
207+
except iocage.lib.errors.IocageException as e:
208+
yield packageInstallEvent.fail(e)
209+
raise e
210+
211+
yield postInstallExecutionEvent.begin()
212+
try:
213+
if os.path.isfile(f"{plugin_dataset.mountpoint}/post_install.sh"):
214+
stdout, stderr, returncode = self.jail.exec(
215+
["/.ix-plugin/post_install.sh"]
216+
)
217+
yield postInstallExecutionEvent.end(stdout=stdout)
218+
else:
219+
yield postInstallExecutionEvent.skip()
220+
except iocage.lib.errors.IocageException as e:
221+
yield postInstallExecutionEvent.fail(e)
222+
raise e
223+
finally:
224+
for event in self.jail.stop(force=True):
225+
yield event
226+
164227
yield jailProvisioningEvent.end()
165228

166229

@@ -170,6 +233,7 @@ def __get_empty_dataset(
170233
) -> libzfs.ZFSDataset:
171234
try:
172235
dataset = zfs.get_dataset(dataset_name)
236+
dataset.umount()
173237
zfs.delete_dataset_recursive(dataset)
174238
except libzfs.ZFSException:
175239
pass

iocage/lib/events.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -892,3 +892,22 @@ def __init__( # noqa: T484
892892
) -> None:
893893

894894
JailEvent.__init__(self, jail, **kwargs)
895+
896+
897+
class JailCommandExecution(JailEvent):
898+
"""Run command in a jail."""
899+
900+
stdout: typing.Optional[str]
901+
902+
def __init__( # noqa: T484
903+
self,
904+
jail: 'iocage.lib.Jail.JailGenerator',
905+
**kwargs
906+
) -> None:
907+
self.stdout = None
908+
JailEvent.__init__(self, jail, **kwargs)
909+
910+
def end(self, stdout, **kwargs) -> 'IocageEvent': # noqa: T484
911+
"""Successfully finish an event."""
912+
self.stdout = stdout
913+
return IocageEvent.end(self, **kwargs)

0 commit comments

Comments
 (0)