diff options
author | Lubomir Rintel <lkundrak@v3.sk> | 2023-04-17 07:08:05 +0200 |
---|---|---|
committer | Thomas Haller <thaller@redhat.com> | 2023-05-12 12:42:55 +0200 |
commit | 79f6a7da567637443f82d2ea1d6ea10e8f3c6208 (patch) | |
tree | b8c59a2265389435acd8d31fa1105f89574af9e0 | |
parent | 661545efcd65b085a76494ab58f1565b0c0bd5ab (diff) | |
download | NetworkManager-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.c | 38 |
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, |