Skip to content

Commit

Permalink
Add support for kickstart to mrack plugin
Browse files Browse the repository at this point in the history
  • Loading branch information
skycastlelily committed Sep 27, 2024
1 parent 1e0cee2 commit 21822b9
Show file tree
Hide file tree
Showing 4 changed files with 52 additions and 30 deletions.
3 changes: 3 additions & 0 deletions tmt/schemas/provision/beaker.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,9 @@ properties:
hardware:
$ref: "/schemas/provision/hardware#/definitions/hardware"

kickstart:
$ref: "/schemas/provision/kickstart#/definitions/kickstart"

role:
$ref: "/schemas/common#/definitions/role"

Expand Down
29 changes: 1 addition & 28 deletions tmt/steps/provision/artemis.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
from tmt.utils import (
ProvisionError,
UpdatableMessage,
_normalize_user_data,
dict_to_yaml,
field,
retry_session,
Expand Down Expand Up @@ -86,34 +87,6 @@
DEFAULT_RETRY_BACKOFF_FACTOR = 1


def _normalize_user_data(
key_address: str,
raw_value: Any,
logger: tmt.log.Logger) -> dict[str, str]:
if isinstance(raw_value, dict):
return {
str(key).strip(): str(value).strip() for key, value in raw_value.items()
}

if isinstance(raw_value, (list, tuple)):
user_data = {}

for datum in raw_value:
try:
key, value = datum.split('=', 1)

except ValueError as exc:
raise tmt.utils.NormalizationError(
key_address, datum, 'a KEY=VALUE string') from exc

user_data[key.strip()] = value.strip()

return user_data

raise tmt.utils.NormalizationError(
key_address, value, 'a dictionary or a list of KEY=VALUE strings')


def _normalize_log_type(
key_address: str,
raw_value: Any,
Expand Down
22 changes: 20 additions & 2 deletions tmt/steps/provision/mrack.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,15 @@
import tmt.steps
import tmt.steps.provision
import tmt.utils
from tmt.utils import Command, Path, ProvisionError, ShellScript, UpdatableMessage, field
from tmt.utils import (
Command,
Path,
ProvisionError,
ShellScript,
UpdatableMessage,
_normalize_user_data,
field,
)

mrack: Any
providers: Any
Expand Down Expand Up @@ -676,6 +684,7 @@ def _translate_tmt_hw(self, hw: tmt.hardware.Hardware) -> dict[str, Any]:
def create_host_requirement(self, host: CreateJobParameters) -> dict[str, Any]:
""" Create single input for Beaker provisioner """

host["beaker"]["ks_append"] = host.get('kickstart')
req: dict[str, Any] = super().create_host_requirement(dataclasses.asdict(host))

if host.hardware and host.hardware.constraint:
Expand Down Expand Up @@ -763,6 +772,13 @@ class BeakerGuestData(tmt.steps.provision.GuestSshData):
{DEFAULT_API_SESSION_REFRESH} seconds by default.
""",
normalize=tmt.utils.normalize_int)
kickstart: dict[str, str] = field(
default_factory=dict,
option='--kickstart',
metavar='KEY=VALUE',
help='Optional Beaker kickstart to use when provisioning the guest.',
multiple=True,
normalize=_normalize_user_data)

beaker_job_owner: Optional[str] = field(
default=None,
Expand Down Expand Up @@ -907,6 +923,7 @@ class GuestBeaker(tmt.steps.provision.GuestSsh):
arch: str
image: str = "fedora-latest"
hardware: Optional[tmt.hardware.Hardware] = None
kickstart: dict[str, str]

beaker_job_owner: Optional[str] = None

Expand Down Expand Up @@ -983,7 +1000,8 @@ def _create(self, tmt_name: str) -> None:
os=self.image,
name=f'{self.image}-{self.arch}',
whiteboard=self.whiteboard or tmt_name,
beaker_job_owner=self.beaker_job_owner)
beaker_job_owner=self.beaker_job_owner,
kickstart=self.kickstart)

try:
response = self.api.create(data)
Expand Down
28 changes: 28 additions & 0 deletions tmt/utils/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,34 @@
from tmt._compat.typing import Self, TypeAlias


def _normalize_user_data(
key_address: str,
raw_value: Any,
logger: tmt.log.Logger) -> dict[str, str]:
if isinstance(raw_value, dict):
return {
str(key).strip(): str(value).strip() for key, value in raw_value.items()
}

if isinstance(raw_value, (list, tuple)):
user_data = {}

for datum in raw_value:
try:
key, value = datum.split('=', 1)

except ValueError as exc:
raise tmt.utils.NormalizationError(
key_address, datum, 'a KEY=VALUE string') from exc

user_data[key.strip()] = value.strip()

return user_data

raise tmt.utils.NormalizationError(
key_address, value, 'a dictionary or a list of KEY=VALUE strings')


def configure_optional_constant(default: Optional[int], envvar: str) -> Optional[int]:
"""
Deduce the actual value of a global constant which may be left unset.
Expand Down

0 comments on commit 21822b9

Please sign in to comment.