|
4 | 4 | """Define classes for interacting with CI artifacts""" |
5 | 5 |
|
6 | 6 | import re |
7 | | -from dataclasses import dataclass |
8 | 7 | from pathlib import Path |
9 | 8 | from typing import Iterator |
10 | 9 |
|
11 | 10 | import pytest |
12 | 11 |
|
13 | 12 | from framework.defs import ARTIFACT_DIR |
14 | | -from framework.utils import check_output, get_firecracker_version_from_toml |
15 | | -from framework.with_filelock import with_filelock |
16 | | -from host_tools.cargo_build import get_binary |
17 | 13 |
|
18 | 14 |
|
19 | 15 | def select_supported_kernels(): |
@@ -55,101 +51,3 @@ def kernel_params( |
55 | 51 | """Return supported kernels""" |
56 | 52 | for kernel in select(glob, artifact_dir): |
57 | 53 | yield pytest.param(kernel, id=kernel.name) |
58 | | - |
59 | | - |
60 | | -@dataclass(frozen=True, repr=True) |
61 | | -class FirecrackerArtifact: |
62 | | - """Utility class for Firecracker binary artifacts.""" |
63 | | - |
64 | | - path: Path |
65 | | - |
66 | | - @property |
67 | | - def name(self): |
68 | | - """Get the Firecracker name.""" |
69 | | - return self.path.name |
70 | | - |
71 | | - @property |
72 | | - def jailer(self): |
73 | | - """Get the jailer with the same version.""" |
74 | | - return self.path.with_name(f"jailer-v{self.version}") |
75 | | - |
76 | | - @property |
77 | | - def version(self): |
78 | | - """Return Firecracker's version: `X.Y.Z-prerelase`.""" |
79 | | - # Get the filename, split on the first '-' and trim the leading 'v'. |
80 | | - # sample: firecracker-v1.2.0-alpha |
81 | | - return self.path.name.split("-", 1)[1][1:] |
82 | | - |
83 | | - @property |
84 | | - def version_tuple(self): |
85 | | - """Return the artifact's version as a tuple `(X, Y, Z)`.""" |
86 | | - return tuple(int(x) for x in self.version.split(".")) |
87 | | - |
88 | | - @property |
89 | | - def snapshot_version_tuple(self): |
90 | | - """Return the artifact's snapshot version as a tuple: `X.Y.0`.""" |
91 | | - |
92 | | - # Starting from Firecracker v1.7.0, snapshots have their own version that is |
93 | | - # independent of Firecracker versions. For these Firecracker versions, use |
94 | | - # the --snapshot-version Firecracker flag, to figure out which snapshot version |
95 | | - # it supports. |
96 | | - |
97 | | - return ( |
98 | | - check_output([self.path, "--snapshot-version"]) |
99 | | - .stdout.strip() |
100 | | - .split("\n")[0] |
101 | | - .split(".") |
102 | | - ) |
103 | | - |
104 | | - @property |
105 | | - def snapshot_version(self): |
106 | | - """Return the artifact's snapshot version: `X.Y.0`. |
107 | | -
|
108 | | - Due to how Firecracker maps release versions to snapshot versions, we |
109 | | - have to request the minor version instead of the actual version. |
110 | | - """ |
111 | | - return ".".join(str(x) for x in self.snapshot_version_tuple) |
112 | | - |
113 | | - |
114 | | -@with_filelock |
115 | | -def current_release(version): |
116 | | - """Massage this working copy Firecracker binary to look like a normal |
117 | | - release, so it can run the same tests. |
118 | | - """ |
119 | | - binaries = [] |
120 | | - for binary in ["firecracker", "jailer"]: |
121 | | - bin_path1 = get_binary(binary) |
122 | | - bin_path2 = bin_path1.with_name(f"{binary}-v{version}") |
123 | | - if not bin_path2.exists(): |
124 | | - bin_path2.unlink(missing_ok=True) |
125 | | - bin_path2.hardlink_to(bin_path1) |
126 | | - binaries.append(bin_path2) |
127 | | - return binaries |
128 | | - |
129 | | - |
130 | | -def working_version_as_artifact(): |
131 | | - """ |
132 | | - Return working copy of Firecracker as a release artifact |
133 | | - """ |
134 | | - cargo_version = get_firecracker_version_from_toml() |
135 | | - return FirecrackerArtifact(current_release(str(cargo_version))[0]) |
136 | | - |
137 | | - |
138 | | -def firecracker_artifacts(): |
139 | | - """Return all supported firecracker binaries.""" |
140 | | - cargo_version = get_firecracker_version_from_toml() |
141 | | - # until the next minor version (but *not* including) |
142 | | - max_version = (cargo_version.major, cargo_version.minor + 1, 0) |
143 | | - prefix = "firecracker/firecracker-*" |
144 | | - for firecracker in sorted(ARTIFACT_DIR.glob(prefix)): |
145 | | - match = re.match(r"firecracker-v(\d+)\.(\d+)\.(\d+)", firecracker.name) |
146 | | - if not match: |
147 | | - continue |
148 | | - fc = FirecrackerArtifact(firecracker) |
149 | | - version = fc.version_tuple |
150 | | - if version >= max_version: |
151 | | - continue |
152 | | - yield pytest.param(fc, id=fc.name) |
153 | | - |
154 | | - fc = working_version_as_artifact() |
155 | | - yield pytest.param(fc, id=fc.name) |
0 commit comments