summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLubomir Rintel <lkundrak@v3.sk>2023-04-17 07:08:05 +0200
committerThomas Haller <thaller@redhat.com>2023-05-12 12:42:55 +0200
commit79f6a7da567637443f82d2ea1d6ea10e8f3c6208 (patch)
treeb8c59a2265389435acd8d31fa1105f89574af9e0
parent661545efcd65b085a76494ab58f1565b0c0bd5ab (diff)
downloadNetworkManager-79f6a7da567637443f82d2ea1d6ea10e8f3c6208.tar.gz
cloud-setup/gcp: add ability to redirect metadata API requests
A different host can be specified with (undocumented, private) NM_CLOUD_SETUP_GCP_HOST environment variable.
-rw-r--r--src/nm-cloud-setup/nmcs-provider-gcp.c38
1 files changed, 31 insertions, 7 deletions
diff --git a/src/nm-cloud-setup/nmcs-provider-gcp.c b/src/nm-cloud-setup/nmcs-provider-gcp.c
index d1d4d821ce..33d0fe08f9 100644
--- a/src/nm-cloud-setup/nmcs-provider-gcp.c
+++ b/src/nm-cloud-setup/nmcs-provider-gcp.c
@@ -13,15 +13,39 @@
#define HTTP_POLL_TIMEOUT_MS 10000
#define HTTP_RATE_LIMIT_MS 1000
-#define NM_GCP_HOST "metadata.google.internal"
-#define NM_GCP_BASE "http://" NM_GCP_HOST
-#define NM_GCP_API_VERSION "/v1"
-#define NM_GCP_METADATA_URL_BASE NM_GCP_BASE "/computeMetadata" NM_GCP_API_VERSION "/instance"
-#define NM_GCP_METADATA_URL_NET "/network-interfaces/"
+#define NM_GCP_HOST "metadata.google.internal"
+#define NM_GCP_BASE "http://" NM_GCP_HOST
+#define NM_GCP_API_VERSION "/v1"
+#define NM_GCP_METADATA_URL_NET "/network-interfaces/"
#define NM_GCP_METADATA_HEADER "Metadata-Flavor: Google"
-#define _gcp_uri_concat(...) nmcs_utils_uri_build_concat(NM_GCP_METADATA_URL_BASE, __VA_ARGS__)
+static const char *
+_gcp_base(void)
+{
+ static const char *base_cached = NULL;
+ const char *base;
+
+again:
+ base = g_atomic_pointer_get(&base_cached);
+ if (G_UNLIKELY(!base)) {
+ /* The base URI can be set via environment variable.
+ * This is mainly for testing, it's not usually supposed to be configured.
+ * Consider this private API! */
+ base = g_getenv(NMCS_ENV_VARIABLE("NM_CLOUD_SETUP_GCP_HOST"));
+ base = nmcs_utils_uri_complete_interned(base) ?: ("" NM_GCP_BASE);
+
+ if (!g_atomic_pointer_compare_and_exchange(&base_cached, NULL, base))
+ goto again;
+ }
+
+ return base;
+}
+
+#define _gcp_uri_concat(...) \
+ nmcs_utils_uri_build_concat(_gcp_base(), \
+ "/computeMetadata" NM_GCP_API_VERSION "/instance", \
+ __VA_ARGS__)
#define _gcp_uri_interfaces(...) _gcp_uri_concat(NM_GCP_METADATA_URL_NET, ##__VA_ARGS__)
/*****************************************************************************/
@@ -73,7 +97,7 @@ detect(NMCSProvider *provider, GTask *task)
http_client = nmcs_provider_get_http_client(provider);
nm_http_client_poll_req(http_client,
- (uri = _gcp_uri_concat("id")),
+ (uri = _gcp_uri_concat("/id")),
HTTP_TIMEOUT_MS,
256 * 1024,
7000,