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.
This commit is contained in:
Lubomir Rintel 2023-04-17 07:08:05 +02:00 committed by Thomas Haller
parent 661545efcd
commit 79f6a7da56
No known key found for this signature in database
GPG key ID: 29C2366E4DFC5728

View file

@ -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,