Skip to content

Commit d730ce1

Browse files
committed
fixing unit tests, _key_init() still broken
1 parent d0d72e8 commit d730ce1

8 files changed

Lines changed: 207 additions & 195 deletions

File tree

stackinator/mirror.py

Lines changed: 63 additions & 82 deletions
Original file line numberDiff line numberDiff line change
@@ -71,8 +71,8 @@ def _load_mirrors(self, cmdline_cache: Optional[pathlib.Path]) -> Dict[str, Dict
7171
raise MirrorError(
7272
"Mirror build cache config is missing a required 'private_key' path."
7373
)
74-
self.build_cache_mirror = "buildcache"
75-
enabled_mirrors["buildcache"] = buildcache
74+
self.build_cache_mirror = "buildcache"
75+
enabled_mirrors["buildcache"] = buildcache
7676
else:
7777
self.build_cache_mirror = None
7878

@@ -81,17 +81,13 @@ def _load_mirrors(self, cmdline_cache: Optional[pathlib.Path]) -> Dict[str, Dict
8181
enabled_mirrors["buildcache"] = self._load_cmdline_cache(cmdline_cache)
8282
self.build_cache_mirror = self.CMDLINE_CACHE
8383

84-
8584
bootstrap = mirrors.get("bootstrap")
8685
if bootstrap and bootstrap.get("enabled", True):
87-
self.bootstrap_mirror = bootstrap
8886
enabled_mirrors["bootstrap"] = bootstrap
89-
else:
90-
self.bootstrap_mirror = None
9187

9288
for name, mirror in mirrors.get("sourcecache", {}).items():
93-
if mirror.get("enabled", True):
94-
enabled_mirrors[name] = mirror
89+
if mirror.get("enabled", True):
90+
enabled_mirrors[name] = mirror
9591

9692
return enabled_mirrors
9793

@@ -182,44 +178,26 @@ def _create_spack_mirrors_yaml(self, dest: pathlib.Path):
182178

183179
raw = {"mirrors": {}}
184180

185-
if self.build_cache_mirror:
186-
url = self.mirrors.get("buildcache")["url"]
187-
name = self.build_cache_mirror
181+
for name, mirror in self.mirrors.items():
182+
url = mirror["url"]
188183

189-
if self.build_cache_mirror.get("mount_specific", True) and self._mount_point is not None:
190-
url = url.rstrip("/") + "/" + self._mount_point.as_posix().lstrip("/")
184+
# Make the mirror path specific to the mount point
185+
if(name=="buildcache"):
186+
if mirror["mount_specific"] and self._mount_point is not None:
187+
url = url.rstrip("/") + "/" + self._mount_point.as_posix().lstrip("/")
191188

192189
raw["mirrors"][name] = {
193190
"fetch": {"url": url},
194191
"push": {"url": url},
195192
}
196193

197-
elif self.mirrors.get("bootstrap"):
198-
url = self.mirrors.get("bootstrap")["url"]
199-
200-
raw["mirrors"]["bootstrap"] = {
201-
"fetch": {"url": url},
202-
"push": {"url": url},
203-
}
204-
205-
elif self.mirrors.get("sourcecache"):
206-
source_mirrors = self.mirrors.get("sourcecache")
207-
208-
for name, mirror in source_mirrors.items():
209-
url = mirror["url"]
210-
211-
raw["mirrors"][name] = {
212-
"fetch": {"url": url},
213-
"push": {"url": url},
214-
}
215-
216194
with dest.open("w") as file:
217195
yaml.dump(raw, file, default_flow_style=False)
218196

219197
def _create_bootstrap_configs(self, config_root: pathlib.Path):
220198
"""Create the bootstrap.yaml and bootstrap metadata dirs in our build dir."""
221199

222-
if not self.bootstrap_mirror:
200+
if not self.mirrors.get("bootstrap"):
223201
return
224202

225203
bootstrap_yaml = {
@@ -229,17 +207,17 @@ def _create_bootstrap_configs(self, config_root: pathlib.Path):
229207
}
230208
}
231209

232-
bs_mirror_path = config_root / f"bootstrap/{self.bootstrap_mirror}"
210+
bs_mirror_path = config_root / "bootstrap" / "bootstrap-mirror"
233211
mirror = self.mirrors.get("bootstrap")
234212
# Tell spack where to find the metadata for each bootstrap mirror.
235213
bootstrap_yaml["bootstrap"]["sources"].append(
236214
{
237-
"name": "bootstrap_mirror",
215+
"name": "bootstrap-mirror",
238216
"metadata": str(bs_mirror_path),
239217
}
240218
)
241219
# And trust each one
242-
bootstrap_yaml["bootstrap"]["trusted"][bootstrap_mirror] = True
220+
bootstrap_yaml["bootstrap"]["trusted"]["bootstrap-mirror"] = True
243221

244222
# Create the metadata dir and metadata.yaml
245223
bs_mirror_path.mkdir(parents=True, exist_ok=True)
@@ -256,44 +234,44 @@ def _create_bootstrap_configs(self, config_root: pathlib.Path):
256234
yaml.dump(bootstrap_yaml, file, default_flow_style=False)
257235

258236
def _key_init(self):
259-
key_info = []
260-
261-
for name, mirror in self.mirrors.items():
262-
if mirror.get("private_key") is None:
263-
continue
237+
key_info = {}
238+
239+
key = self.mirrors["buildcache"].get("private_key")
264240

265-
key = mirror["private_key"]
241+
if key is None:
242+
return
266243

267-
# if path, check if abs path, if not, append sys config path in front and check again
268-
path = pathlib.Path(os.path.expandvars(key))
244+
# if path, check if abs path, if not, append sys config path in front and check again
245+
path = pathlib.Path(os.path.expandvars(key))
269246

270-
if not path.is_absolute():
271-
# try prepending system config path
272-
path = self._system_config_root / path
247+
if not path.is_absolute():
248+
# try prepending system config path
249+
path = self._system_config_root / path
273250

274-
if path.is_file():
275-
# use the user-provided file
276-
key_info.append({"path": pathlib.Path(f"{name}.pgp"), "source": path})
277-
else:
278-
# convert base64 key to binary
279-
try:
280-
binary_key = base64.b64decode(key)
281-
except ValueError:
282-
raise MirrorError(
283-
f"Key for mirror '{name}' is not valid: '{path}'. \n"
284-
f"Must be a path to a GPG public key or a base64 encoded GPG public key. \n"
285-
f"Check the key listed in mirrors.yaml in system config."
286-
)
251+
if path.is_file():
252+
# use the user-provided file
253+
key_info = {"path": pathlib.Path(f"buildcache.pgp"), "source": path}
254+
else:
255+
# convert base64 key to binary
256+
try:
257+
binary_key = base64.b64decode(key, validate=True)
258+
print(binary_key)
259+
except ValueError:
260+
raise MirrorError(
261+
f"Key for mirror 'buildcache' is not valid. \n"
262+
f"Must be a path to a GPG public key or a base64 encoded GPG public key. \n"
263+
f"Check the key listed in mirrors.yaml in system config."
264+
)
287265

288-
file_type = magic.from_buffer(binary_key, mime=True)
289-
if file_type not in ("application/x-gnupg-keyring", "application/pgp-keys"):
290-
raise MirrorError(
291-
f"Key for mirror {name} is not a valid GPG key. \n"
292-
f"The file (or base64) was readable, but the data itself was not a PGP key.\n"
293-
f"Check the key listed in mirrors.yaml in system config."
294-
)
266+
file_type = magic.from_buffer(binary_key, mime=True)
267+
if file_type not in ("application/x-gnupg-keyring", "application/pgp-keys"):
268+
raise MirrorError(
269+
f"Key for mirror 'buildcache' is not a valid GPG key. \n"
270+
f"The file (or base64) was readable, but the data itself was not a PGP key.\n"
271+
f"Check the key listed in mirrors.yaml in system config."
272+
)
295273

296-
key_info.append({"path": pathlib.Path(f"{name}.pgp"), "source": binary_key})
274+
key_info = {"path": pathlib.Path("buildcache.pgp"), "source": binary_key}
297275

298276
return key_info
299277

@@ -302,17 +280,20 @@ def _key_setup(self, key_store: pathlib.Path):
302280

303281
key_store.mkdir(exist_ok=True)
304282

305-
for key_info in self._keys:
306-
path = key_store / key_info["path"]
307-
source = key_info["source"]
308-
309-
match source:
310-
case pathlib.Path():
311-
# copy source -> path
312-
shutil.copy2(source, path)
313-
case bytes():
314-
# open path and copy in bytes
315-
with open(path, "wb") as writer:
316-
writer.write(source)
317-
case _:
318-
raise TypeError(f"Expected Path or bytes, got {type(source).__name__}")
283+
#for key_info in self._keys:
284+
285+
#path = key_store / key_info["path"]
286+
path = key_store / self._keys["path"]
287+
#source = key_info["source"]
288+
source = self._keys["source"]
289+
290+
match source:
291+
case pathlib.Path():
292+
# copy source -> path
293+
shutil.copy2(source, path)
294+
case bytes():
295+
# open path and copy in bytes
296+
with open(path, "wb") as writer:
297+
writer.write(source)
298+
case _:
299+
raise TypeError(f"Expected Path or bytes, got {type(source).__name__}")

stackinator/schema/mirror.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@
3232
},
3333
"cmdline": {
3434
"type": "boolean",
35-
"default": true
35+
"default": false
3636
}
3737
},
3838
"additionalProperties": false,
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
1-
bad-key:
1+
buildcache:
22
url: https://mirror.spack.io
3-
public_key: bad_key.gpg
3+
private_key: bad_key.gpg
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
1-
bad-key-path:
1+
buildcache:
22
url: https://mirror.spack.io
3-
public_key: /path/doesnt/exist
3+
private_key: /path/doesnt/exist
Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,4 @@
1-
bad-url:
2-
url: https://www.testsite.io/services
1+
sourcecache:
2+
bad-url:
3+
url: https://www.testsite.io/services
4+
enabled: true
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
bootstrap:
2+
url: https://mirror.spack.io
3+
enabled: true
4+
buildcache:
5+
url: https://mirror.spack.io
6+
enabled: true
7+
private_key: "\
8+
mQINBGm4GvsBEACTyzQFPfRUgo1Wmb9/KgrSr/EFVobRX3LlrcAMemo4nFRdS88aCcEhRWzYQ8ML\
9+
eGvcxFbzbAoEZACpThMspYOwFsVzIUc3lYQT7g9M/KNEPHztqaTWCqESYmzDFtaLYys6AQP52KMB\
10+
2x0ya8NNd9whd2a9Vc3yD3u9qW8iqkqxDjNYtTc9Lo7T8DHlhJ79TKm8f3w0QZowTxPYh5NA8GiF\
11+
kBN6J8hmg39LekC1kAWi2BwjDzRll19zVQtYfv+b4i/ripqmMNp4zcU93Ox1ReUFOmO3eiIq3GSK\
12+
IbXw7h/NGLAImIeuMzce5cqz65iVk7+iyKeXtx5dSUGskiLR2voX8xVOGVhNtxfiolviyUAhT4kb\
13+
WcWK6ipZ9h/nEyeZ9GYtoDkKMguet2a4bJCBsQmo4FR9Pf5c7qqs79obxLXzZe9zDnj1sbxAabJh\
14+
jLUdwJqIPKvdPNy3F3nOBeKY8Jf1D+Y3szxzJX8gwqrNSyCbZUeXsaQhMZWUVoztxUXW+qfC8jlA\
15+
TfoUQuQPC9Zr+8wU/3uUlKtChQo0prgwHAEHezwNpyEhZZc884RIt55DNKllH9UeqNwUWKpZYHG3\
16+
qVxV+oi7MenLeKvfsg6nVCL0CETtB88dOen7BFfBZj9NRszRqIlVudDFf+5gqKQ0f1H241w/n4nH\
17+
KEAzm7kma4cV8QARAQABtBtUZXN0IEtleSA8bm9wZUBub3doZXJlLmNvbT6JAlEEEwEKADsWIQSe\
18+
CE84hgwq8uroW+w4Qgxu0DsXiAUCabga+wIbAwULCQgHAgIiAgYVCgkICwIEFgIDAQIeBwIXgAAK\
19+
CRA4Qgxu0DsXiBbaD/4w7MlAf5SuOxrbH3fruN7k8NPxjwsvocB3VGo5AxzIy18C78IOYm5F2EQ+\
20+
LpjsK05t1ZPsHFsBaLduo0CODcF8m1gJLI8S0uMmVUywnDGJjMKYiZNeIqXDlohVciD2KPIxWL+i\
21+
qgho1BhFKlnQkXgEaxotUXFwHiKqcBwFcq21nu3PRVqsobMTk/UgeJhoSZf7ZIj5SyVHa6YVCoMr\
22+
HB0TqRz3xIW/TDl+oxyfEdhMZ8iU6IdohfMkCP+ayZEpdx1SS37S47SRxbgNblbfJ9PfJD/dQzx1\
23+
WnGVXxinSPjTTxIwNCyiEIrxqvLnk+O8fUHeEIrSqn9P0bZrCv02gAPUIfl7l4gN4boSgWEsfS5i\
24+
/KL8ZUDGZCb9Fux64zaM17lHfwGWCAKbi1KjYRL4W7zaVmps6MfdLOcJdQSdpQufs9vRbMhiDW1x\
25+
glsvz8JzPYiF2xRqJsx2odiufx4Mrrq5yxER07sDjKzUZYF6xD8qC5BAh6/xDUE+p8EOqc0HsqTE\
26+
PhqBLdqGLf8GaXj3I9F6ZCH5dtSmehB6Q77KJ1hWTm9OzDdYm2apExbMIB9Z2H5c8FLZfIb4lnpW\
27+
lhtP97eAix9JnBzoTe8QeaV5hcvQoqypTu5rD3ne2kQHlavmSeq5KVVWrIKGsfnZNRqDg7vKg/fw\
28+
kx1f2T8qMLVfGxogJrkCDQRpuBr7ARAA08MhBUQkj4nVaLmW+Xa5e+nTnE8nYoKPYJIpbIDYP2Pe\
29+
mD9Yca9HGWHnzUgsH4KEvdETrT/Uj9i3o+6xNZJ1Xz0GQkKW+2Vttl5ZBKwipHsn2iP+e78wAhwm\
30+
HqYZi/ymgLJDEXmrgyXNr+cKaAI2cEWOb+Vomgu+WFF4ENG/UiIJH6zP5JY0TcSC1Ao47y4qL6bH\
31+
Mfzz2zi3JpbvOi1/uY2TvMgitaL45tsukuEYMFfEEnd4Vyl0LSCFYv3zQx5JRSbu5ujlRdHnopS0\
32+
UeWZMV+iEXYZ6wKVFtQ6nvxxDpjMf8k3Q5Ss+z0F9oTRwdlaJhdhXZx8PleBu0Ah1Wxd9+V6tYgF\
33+
zrjsJB9eaXKIEeioZi8xNFB6RYUuNgjIfTtgtps685LeiGCy5q55MkC2FuKVAdv+YZcuJNdy/3gx\
34+
Kg5bLz/aVQRfxakDQHI7kp9fl3bDK5jbWeY8EKvtTI8x7fxthPZP6Az2g4zp+ZojgEUdUXveuw0Y\
35+
3MVaMu0ehG81nUHNU1tu7ELuhDWM6VkigokS1zptBsPbKojfp/oZJn6DGD1LZ+QyIdSUkjyfcs9H\
36+
sfuyAbrgzVCmbcNY42x3IOZZZjIfQ66bJZpGht6kHEfO896oB2d+a7KS25ZWa5G+SsWntv5nnclr\
37+
6DYFz3ThuYVmjQDLh8jN78/f45Jd6N8AEQEAAYkCNgQYAQoAIBYhBJ4ITziGDCry6uhb7DhCDG7Q\
38+
OxeIBQJpuBr7AhsMAAoJEDhCDG7QOxeIVx8P/1wxrmmYWhIMDObXIpCM3vxq8dO+84nTuBQbomKR\
39+
NURKOiCwgndEL3N38pf0gAToSIatrTF2VdkJsksyMEIzUaNmsYiHA9xYqhmCJ2pIqWeh2ONsNdmw\
40+
Fg/M5mwZpvwl28Z2MpJP+NY6u52a3jxkxpGY1Q4+KxgMRhqXe6faXQtYwwUiYVGPSznQPudYLZ2Z\
41+
+b8rGrz0AUVvvSWt3bVbUwZIMVSK0RVIWxG/sW7dWhkhtev+04fUlaxHnQ2b8G3h6AjONmLcIlpx\
42+
7p1dVvolEqV0YQUgosl47J3tLnzacsqNzIS1Dya0ukLrXAYmeQzQWvwhLpLqjMh3cqLl5SkjatB7\
43+
xU9Qu4IXENnvWSnqCRZzz6CbU/81FopTGgJfxbYok2v78O5qTdkbeszSHN8uCuvhpPKruHZgsFc6\
44+
lw+hYhtB8YXbB8lT2f1Fp0DeEnPM+OzRgjeRYl3gmE8/1PtKGuTCOJzTxTtLWorFYtV0DXiOq4Vd\
45+
eYkR+m3vNiYVkdALN5uIL8goYrPvs/fvq1wI49iyKw6B3pE5xIQSEjgPpwJ/7hvQUhenJTtrNRs8\
46+
eKXSnjHZjhJbgIReoXSQwG44RqNtiV8dJsdPu98P27keSigBB5kguB0gCWeFVHkLfpBR3aRxSacG\
47+
gllMF++N8+7T4/ehkA/hs2udYRkSCANLQ3I3"
48+
mount_specific: false
49+
cmdline: false
50+
sourcecache:
51+
mirror1:
52+
url: https://github.com
53+
enabled: true
54+
mirror2:
55+
url: https://github.com/spack
56+
enabled: true
57+
disabled-mirror:
58+
url: https://github.com
59+
enabled: false
Lines changed: 17 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -1,55 +1,19 @@
1-
fake-mirror:
2-
url: https://github.com
3-
public_key: ../../test-gpg-pub.asc
4-
disabled-mirror:
5-
url: https://github.com
6-
enabled: false
7-
buildcache-mirror:
1+
bootstrap:
82
url: https://mirror.spack.io
9-
private_key: '../test-gpg-priv.asc'
10-
public_key: "\
11-
mQINBGm4GvsBEACTyzQFPfRUgo1Wmb9/KgrSr/EFVobRX3LlrcAMemo4nFRdS88aCcEhRWzYQ8ML\
12-
eGvcxFbzbAoEZACpThMspYOwFsVzIUc3lYQT7g9M/KNEPHztqaTWCqESYmzDFtaLYys6AQP52KMB\
13-
2x0ya8NNd9whd2a9Vc3yD3u9qW8iqkqxDjNYtTc9Lo7T8DHlhJ79TKm8f3w0QZowTxPYh5NA8GiF\
14-
kBN6J8hmg39LekC1kAWi2BwjDzRll19zVQtYfv+b4i/ripqmMNp4zcU93Ox1ReUFOmO3eiIq3GSK\
15-
IbXw7h/NGLAImIeuMzce5cqz65iVk7+iyKeXtx5dSUGskiLR2voX8xVOGVhNtxfiolviyUAhT4kb\
16-
WcWK6ipZ9h/nEyeZ9GYtoDkKMguet2a4bJCBsQmo4FR9Pf5c7qqs79obxLXzZe9zDnj1sbxAabJh\
17-
jLUdwJqIPKvdPNy3F3nOBeKY8Jf1D+Y3szxzJX8gwqrNSyCbZUeXsaQhMZWUVoztxUXW+qfC8jlA\
18-
TfoUQuQPC9Zr+8wU/3uUlKtChQo0prgwHAEHezwNpyEhZZc884RIt55DNKllH9UeqNwUWKpZYHG3\
19-
qVxV+oi7MenLeKvfsg6nVCL0CETtB88dOen7BFfBZj9NRszRqIlVudDFf+5gqKQ0f1H241w/n4nH\
20-
KEAzm7kma4cV8QARAQABtBtUZXN0IEtleSA8bm9wZUBub3doZXJlLmNvbT6JAlEEEwEKADsWIQSe\
21-
CE84hgwq8uroW+w4Qgxu0DsXiAUCabga+wIbAwULCQgHAgIiAgYVCgkICwIEFgIDAQIeBwIXgAAK\
22-
CRA4Qgxu0DsXiBbaD/4w7MlAf5SuOxrbH3fruN7k8NPxjwsvocB3VGo5AxzIy18C78IOYm5F2EQ+\
23-
LpjsK05t1ZPsHFsBaLduo0CODcF8m1gJLI8S0uMmVUywnDGJjMKYiZNeIqXDlohVciD2KPIxWL+i\
24-
qgho1BhFKlnQkXgEaxotUXFwHiKqcBwFcq21nu3PRVqsobMTk/UgeJhoSZf7ZIj5SyVHa6YVCoMr\
25-
HB0TqRz3xIW/TDl+oxyfEdhMZ8iU6IdohfMkCP+ayZEpdx1SS37S47SRxbgNblbfJ9PfJD/dQzx1\
26-
WnGVXxinSPjTTxIwNCyiEIrxqvLnk+O8fUHeEIrSqn9P0bZrCv02gAPUIfl7l4gN4boSgWEsfS5i\
27-
/KL8ZUDGZCb9Fux64zaM17lHfwGWCAKbi1KjYRL4W7zaVmps6MfdLOcJdQSdpQufs9vRbMhiDW1x\
28-
glsvz8JzPYiF2xRqJsx2odiufx4Mrrq5yxER07sDjKzUZYF6xD8qC5BAh6/xDUE+p8EOqc0HsqTE\
29-
PhqBLdqGLf8GaXj3I9F6ZCH5dtSmehB6Q77KJ1hWTm9OzDdYm2apExbMIB9Z2H5c8FLZfIb4lnpW\
30-
lhtP97eAix9JnBzoTe8QeaV5hcvQoqypTu5rD3ne2kQHlavmSeq5KVVWrIKGsfnZNRqDg7vKg/fw\
31-
kx1f2T8qMLVfGxogJrkCDQRpuBr7ARAA08MhBUQkj4nVaLmW+Xa5e+nTnE8nYoKPYJIpbIDYP2Pe\
32-
mD9Yca9HGWHnzUgsH4KEvdETrT/Uj9i3o+6xNZJ1Xz0GQkKW+2Vttl5ZBKwipHsn2iP+e78wAhwm\
33-
HqYZi/ymgLJDEXmrgyXNr+cKaAI2cEWOb+Vomgu+WFF4ENG/UiIJH6zP5JY0TcSC1Ao47y4qL6bH\
34-
Mfzz2zi3JpbvOi1/uY2TvMgitaL45tsukuEYMFfEEnd4Vyl0LSCFYv3zQx5JRSbu5ujlRdHnopS0\
35-
UeWZMV+iEXYZ6wKVFtQ6nvxxDpjMf8k3Q5Ss+z0F9oTRwdlaJhdhXZx8PleBu0Ah1Wxd9+V6tYgF\
36-
zrjsJB9eaXKIEeioZi8xNFB6RYUuNgjIfTtgtps685LeiGCy5q55MkC2FuKVAdv+YZcuJNdy/3gx\
37-
Kg5bLz/aVQRfxakDQHI7kp9fl3bDK5jbWeY8EKvtTI8x7fxthPZP6Az2g4zp+ZojgEUdUXveuw0Y\
38-
3MVaMu0ehG81nUHNU1tu7ELuhDWM6VkigokS1zptBsPbKojfp/oZJn6DGD1LZ+QyIdSUkjyfcs9H\
39-
sfuyAbrgzVCmbcNY42x3IOZZZjIfQ66bJZpGht6kHEfO896oB2d+a7KS25ZWa5G+SsWntv5nnclr\
40-
6DYFz3ThuYVmjQDLh8jN78/f45Jd6N8AEQEAAYkCNgQYAQoAIBYhBJ4ITziGDCry6uhb7DhCDG7Q\
41-
OxeIBQJpuBr7AhsMAAoJEDhCDG7QOxeIVx8P/1wxrmmYWhIMDObXIpCM3vxq8dO+84nTuBQbomKR\
42-
NURKOiCwgndEL3N38pf0gAToSIatrTF2VdkJsksyMEIzUaNmsYiHA9xYqhmCJ2pIqWeh2ONsNdmw\
43-
Fg/M5mwZpvwl28Z2MpJP+NY6u52a3jxkxpGY1Q4+KxgMRhqXe6faXQtYwwUiYVGPSznQPudYLZ2Z\
44-
+b8rGrz0AUVvvSWt3bVbUwZIMVSK0RVIWxG/sW7dWhkhtev+04fUlaxHnQ2b8G3h6AjONmLcIlpx\
45-
7p1dVvolEqV0YQUgosl47J3tLnzacsqNzIS1Dya0ukLrXAYmeQzQWvwhLpLqjMh3cqLl5SkjatB7\
46-
xU9Qu4IXENnvWSnqCRZzz6CbU/81FopTGgJfxbYok2v78O5qTdkbeszSHN8uCuvhpPKruHZgsFc6\
47-
lw+hYhtB8YXbB8lT2f1Fp0DeEnPM+OzRgjeRYl3gmE8/1PtKGuTCOJzTxTtLWorFYtV0DXiOq4Vd\
48-
eYkR+m3vNiYVkdALN5uIL8goYrPvs/fvq1wI49iyKw6B3pE5xIQSEjgPpwJ/7hvQUhenJTtrNRs8\
49-
eKXSnjHZjhJbgIReoXSQwG44RqNtiV8dJsdPu98P27keSigBB5kguB0gCWeFVHkLfpBR3aRxSacG\
50-
gllMF++N8+7T4/ehkA/hs2udYRkSCANLQ3I3"
51-
52-
cache: true
53-
bootstrap-mirror:
3+
enabled: true
4+
buildcache:
545
url: https://mirror.spack.io
55-
bootstrap: true
6+
enabled: true
7+
private_key: ../../test-gpg-priv.asc
8+
mount_specific: false
9+
cmdline: false
10+
sourcecache:
11+
mirror1:
12+
url: https://github.com
13+
enabled: true
14+
mirror2:
15+
url: https://github.com/spack
16+
enabled: true
17+
disabled-mirror:
18+
url: https://github.com
19+
enabled: false

0 commit comments

Comments
 (0)