summaryrefslogtreecommitdiff
path: root/cloudinit/util.py
diff options
context:
space:
mode:
authorChad Smith <chad.smith@canonical.com>2022-12-15 13:03:36 -0700
committerGitHub <noreply@github.com>2022-12-15 13:03:36 -0700
commit040090a31f483014ec78cd353bb55bfae121bebd (patch)
treeb3d63e3fd99f558ac8508f0bc08f8f170e5ef191 /cloudinit/util.py
parent3a2232084f53fdae901e2bf34726466b8809be5a (diff)
downloadcloud-init-git-040090a31f483014ec78cd353bb55bfae121bebd.tar.gz
nocloud: add support for dmi variable expansion for seedfrom URL
NoCloud meta-data seedfrom (or kernel commandline seedfrom) URL can now provide variable expansion for system-specific DMI values as seen in /sys/class/dmi/id on Linux or kenv on FreeBSD platforms. Variable names of the format __dmi.SOME_VAR__ will be replaced when determining the URL from which NoCloud datasource GETs its user-data and meta-data. This allows for a common templated seedfrom URL which can be reused for mass deployments, but can allow for unique URLs based on classes of DMI system characteristics such as chassis serial, product name, UUID etc. LP: #1994980
Diffstat (limited to 'cloudinit/util.py')
-rw-r--r--cloudinit/util.py13
1 files changed, 8 insertions, 5 deletions
diff --git a/cloudinit/util.py b/cloudinit/util.py
index 96cd1b74..2ba0e077 100644
--- a/cloudinit/util.py
+++ b/cloudinit/util.py
@@ -38,7 +38,7 @@ from functools import lru_cache, total_ordering
from typing import Callable, Deque, Dict, List, TypeVar
from urllib import parse
-from cloudinit import importer
+from cloudinit import features, importer
from cloudinit import log as logging
from cloudinit import (
mergers,
@@ -976,14 +976,17 @@ def load_yaml(blob, default=None, allowed=(dict,)):
def read_seeded(base="", ext="", timeout=5, retries=10, file_retries=0):
if base.find("%s") >= 0:
- ud_url = base % ("user-data" + ext)
- vd_url = base % ("vendor-data" + ext)
- md_url = base % ("meta-data" + ext)
+ ud_url = base.replace("%s", "user-data" + ext)
+ vd_url = base.replace("%s", "vendor-data" + ext)
+ md_url = base.replace("%s", "meta-data" + ext)
else:
+ if features.NOCLOUD_SEED_URL_APPEND_FORWARD_SLASH:
+ if base[-1] != "/" and parse.urlparse(base).query == "":
+ # Append fwd slash when no query string and no %s
+ base += "/"
ud_url = "%s%s%s" % (base, "user-data", ext)
vd_url = "%s%s%s" % (base, "vendor-data", ext)
md_url = "%s%s%s" % (base, "meta-data", ext)
-
md_resp = url_helper.read_file_or_url(
md_url, timeout=timeout, retries=retries
)