Initial
This commit is contained in:
5
resources/app/node_modules/@smithy/credential-provider-imds/dist-es/config/Endpoint.js
generated
vendored
Normal file
5
resources/app/node_modules/@smithy/credential-provider-imds/dist-es/config/Endpoint.js
generated
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
export var Endpoint;
|
||||
(function (Endpoint) {
|
||||
Endpoint["IPv4"] = "http://169.254.169.254";
|
||||
Endpoint["IPv6"] = "http://[fd00:ec2::254]";
|
||||
})(Endpoint || (Endpoint = {}));
|
||||
7
resources/app/node_modules/@smithy/credential-provider-imds/dist-es/config/EndpointConfigOptions.js
generated
vendored
Normal file
7
resources/app/node_modules/@smithy/credential-provider-imds/dist-es/config/EndpointConfigOptions.js
generated
vendored
Normal file
@@ -0,0 +1,7 @@
|
||||
export const ENV_ENDPOINT_NAME = "AWS_EC2_METADATA_SERVICE_ENDPOINT";
|
||||
export const CONFIG_ENDPOINT_NAME = "ec2_metadata_service_endpoint";
|
||||
export const ENDPOINT_CONFIG_OPTIONS = {
|
||||
environmentVariableSelector: (env) => env[ENV_ENDPOINT_NAME],
|
||||
configFileSelector: (profile) => profile[CONFIG_ENDPOINT_NAME],
|
||||
default: undefined,
|
||||
};
|
||||
5
resources/app/node_modules/@smithy/credential-provider-imds/dist-es/config/EndpointMode.js
generated
vendored
Normal file
5
resources/app/node_modules/@smithy/credential-provider-imds/dist-es/config/EndpointMode.js
generated
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
export var EndpointMode;
|
||||
(function (EndpointMode) {
|
||||
EndpointMode["IPv4"] = "IPv4";
|
||||
EndpointMode["IPv6"] = "IPv6";
|
||||
})(EndpointMode || (EndpointMode = {}));
|
||||
8
resources/app/node_modules/@smithy/credential-provider-imds/dist-es/config/EndpointModeConfigOptions.js
generated
vendored
Normal file
8
resources/app/node_modules/@smithy/credential-provider-imds/dist-es/config/EndpointModeConfigOptions.js
generated
vendored
Normal file
@@ -0,0 +1,8 @@
|
||||
import { EndpointMode } from "./EndpointMode";
|
||||
export const ENV_ENDPOINT_MODE_NAME = "AWS_EC2_METADATA_SERVICE_ENDPOINT_MODE";
|
||||
export const CONFIG_ENDPOINT_MODE_NAME = "ec2_metadata_service_endpoint_mode";
|
||||
export const ENDPOINT_MODE_CONFIG_OPTIONS = {
|
||||
environmentVariableSelector: (env) => env[ENV_ENDPOINT_MODE_NAME],
|
||||
configFileSelector: (profile) => profile[CONFIG_ENDPOINT_MODE_NAME],
|
||||
default: EndpointMode.IPv4,
|
||||
};
|
||||
9
resources/app/node_modules/@smithy/credential-provider-imds/dist-es/error/InstanceMetadataV1FallbackError.js
generated
vendored
Normal file
9
resources/app/node_modules/@smithy/credential-provider-imds/dist-es/error/InstanceMetadataV1FallbackError.js
generated
vendored
Normal file
@@ -0,0 +1,9 @@
|
||||
import { CredentialsProviderError } from "@smithy/property-provider";
|
||||
export class InstanceMetadataV1FallbackError extends CredentialsProviderError {
|
||||
constructor(message, tryNextLink = true) {
|
||||
super(message, tryNextLink);
|
||||
this.tryNextLink = tryNextLink;
|
||||
this.name = "InstanceMetadataV1FallbackError";
|
||||
Object.setPrototypeOf(this, InstanceMetadataV1FallbackError.prototype);
|
||||
}
|
||||
}
|
||||
66
resources/app/node_modules/@smithy/credential-provider-imds/dist-es/fromContainerMetadata.js
generated
vendored
Normal file
66
resources/app/node_modules/@smithy/credential-provider-imds/dist-es/fromContainerMetadata.js
generated
vendored
Normal file
@@ -0,0 +1,66 @@
|
||||
import { CredentialsProviderError } from "@smithy/property-provider";
|
||||
import { parse } from "url";
|
||||
import { httpRequest } from "./remoteProvider/httpRequest";
|
||||
import { fromImdsCredentials, isImdsCredentials } from "./remoteProvider/ImdsCredentials";
|
||||
import { providerConfigFromInit } from "./remoteProvider/RemoteProviderInit";
|
||||
import { retry } from "./remoteProvider/retry";
|
||||
export const ENV_CMDS_FULL_URI = "AWS_CONTAINER_CREDENTIALS_FULL_URI";
|
||||
export const ENV_CMDS_RELATIVE_URI = "AWS_CONTAINER_CREDENTIALS_RELATIVE_URI";
|
||||
export const ENV_CMDS_AUTH_TOKEN = "AWS_CONTAINER_AUTHORIZATION_TOKEN";
|
||||
export const fromContainerMetadata = (init = {}) => {
|
||||
const { timeout, maxRetries } = providerConfigFromInit(init);
|
||||
return () => retry(async () => {
|
||||
const requestOptions = await getCmdsUri();
|
||||
const credsResponse = JSON.parse(await requestFromEcsImds(timeout, requestOptions));
|
||||
if (!isImdsCredentials(credsResponse)) {
|
||||
throw new CredentialsProviderError("Invalid response received from instance metadata service.");
|
||||
}
|
||||
return fromImdsCredentials(credsResponse);
|
||||
}, maxRetries);
|
||||
};
|
||||
const requestFromEcsImds = async (timeout, options) => {
|
||||
if (process.env[ENV_CMDS_AUTH_TOKEN]) {
|
||||
options.headers = {
|
||||
...options.headers,
|
||||
Authorization: process.env[ENV_CMDS_AUTH_TOKEN],
|
||||
};
|
||||
}
|
||||
const buffer = await httpRequest({
|
||||
...options,
|
||||
timeout,
|
||||
});
|
||||
return buffer.toString();
|
||||
};
|
||||
const CMDS_IP = "169.254.170.2";
|
||||
const GREENGRASS_HOSTS = {
|
||||
localhost: true,
|
||||
"127.0.0.1": true,
|
||||
};
|
||||
const GREENGRASS_PROTOCOLS = {
|
||||
"http:": true,
|
||||
"https:": true,
|
||||
};
|
||||
const getCmdsUri = async () => {
|
||||
if (process.env[ENV_CMDS_RELATIVE_URI]) {
|
||||
return {
|
||||
hostname: CMDS_IP,
|
||||
path: process.env[ENV_CMDS_RELATIVE_URI],
|
||||
};
|
||||
}
|
||||
if (process.env[ENV_CMDS_FULL_URI]) {
|
||||
const parsed = parse(process.env[ENV_CMDS_FULL_URI]);
|
||||
if (!parsed.hostname || !(parsed.hostname in GREENGRASS_HOSTS)) {
|
||||
throw new CredentialsProviderError(`${parsed.hostname} is not a valid container metadata service hostname`, false);
|
||||
}
|
||||
if (!parsed.protocol || !(parsed.protocol in GREENGRASS_PROTOCOLS)) {
|
||||
throw new CredentialsProviderError(`${parsed.protocol} is not a valid container metadata service protocol`, false);
|
||||
}
|
||||
return {
|
||||
...parsed,
|
||||
port: parsed.port ? parseInt(parsed.port, 10) : undefined,
|
||||
};
|
||||
}
|
||||
throw new CredentialsProviderError("The container metadata credential provider cannot be used unless" +
|
||||
` the ${ENV_CMDS_RELATIVE_URI} or ${ENV_CMDS_FULL_URI} environment` +
|
||||
" variable is set", false);
|
||||
};
|
||||
132
resources/app/node_modules/@smithy/credential-provider-imds/dist-es/fromInstanceMetadata.js
generated
vendored
Normal file
132
resources/app/node_modules/@smithy/credential-provider-imds/dist-es/fromInstanceMetadata.js
generated
vendored
Normal file
@@ -0,0 +1,132 @@
|
||||
import { loadConfig } from "@smithy/node-config-provider";
|
||||
import { CredentialsProviderError } from "@smithy/property-provider";
|
||||
import { InstanceMetadataV1FallbackError } from "./error/InstanceMetadataV1FallbackError";
|
||||
import { httpRequest } from "./remoteProvider/httpRequest";
|
||||
import { fromImdsCredentials, isImdsCredentials } from "./remoteProvider/ImdsCredentials";
|
||||
import { providerConfigFromInit } from "./remoteProvider/RemoteProviderInit";
|
||||
import { retry } from "./remoteProvider/retry";
|
||||
import { getInstanceMetadataEndpoint } from "./utils/getInstanceMetadataEndpoint";
|
||||
import { staticStabilityProvider } from "./utils/staticStabilityProvider";
|
||||
const IMDS_PATH = "/latest/meta-data/iam/security-credentials/";
|
||||
const IMDS_TOKEN_PATH = "/latest/api/token";
|
||||
const AWS_EC2_METADATA_V1_DISABLED = "AWS_EC2_METADATA_V1_DISABLED";
|
||||
const PROFILE_AWS_EC2_METADATA_V1_DISABLED = "ec2_metadata_v1_disabled";
|
||||
const X_AWS_EC2_METADATA_TOKEN = "x-aws-ec2-metadata-token";
|
||||
export const fromInstanceMetadata = (init = {}) => staticStabilityProvider(getInstanceImdsProvider(init), { logger: init.logger });
|
||||
const getInstanceImdsProvider = (init) => {
|
||||
let disableFetchToken = false;
|
||||
const { logger, profile } = init;
|
||||
const { timeout, maxRetries } = providerConfigFromInit(init);
|
||||
const getCredentials = async (maxRetries, options) => {
|
||||
const isImdsV1Fallback = disableFetchToken || options.headers?.[X_AWS_EC2_METADATA_TOKEN] == null;
|
||||
if (isImdsV1Fallback) {
|
||||
let fallbackBlockedFromProfile = false;
|
||||
let fallbackBlockedFromProcessEnv = false;
|
||||
const configValue = await loadConfig({
|
||||
environmentVariableSelector: (env) => {
|
||||
const envValue = env[AWS_EC2_METADATA_V1_DISABLED];
|
||||
fallbackBlockedFromProcessEnv = !!envValue && envValue !== "false";
|
||||
if (envValue === undefined) {
|
||||
throw new CredentialsProviderError(`${AWS_EC2_METADATA_V1_DISABLED} not set in env, checking config file next.`);
|
||||
}
|
||||
return fallbackBlockedFromProcessEnv;
|
||||
},
|
||||
configFileSelector: (profile) => {
|
||||
const profileValue = profile[PROFILE_AWS_EC2_METADATA_V1_DISABLED];
|
||||
fallbackBlockedFromProfile = !!profileValue && profileValue !== "false";
|
||||
return fallbackBlockedFromProfile;
|
||||
},
|
||||
default: false,
|
||||
}, {
|
||||
profile,
|
||||
})();
|
||||
if (init.ec2MetadataV1Disabled || configValue) {
|
||||
const causes = [];
|
||||
if (init.ec2MetadataV1Disabled)
|
||||
causes.push("credential provider initialization (runtime option ec2MetadataV1Disabled)");
|
||||
if (fallbackBlockedFromProfile)
|
||||
causes.push(`config file profile (${PROFILE_AWS_EC2_METADATA_V1_DISABLED})`);
|
||||
if (fallbackBlockedFromProcessEnv)
|
||||
causes.push(`process environment variable (${AWS_EC2_METADATA_V1_DISABLED})`);
|
||||
throw new InstanceMetadataV1FallbackError(`AWS EC2 Metadata v1 fallback has been blocked by AWS SDK configuration in the following: [${causes.join(", ")}].`);
|
||||
}
|
||||
}
|
||||
const imdsProfile = (await retry(async () => {
|
||||
let profile;
|
||||
try {
|
||||
profile = await getProfile(options);
|
||||
}
|
||||
catch (err) {
|
||||
if (err.statusCode === 401) {
|
||||
disableFetchToken = false;
|
||||
}
|
||||
throw err;
|
||||
}
|
||||
return profile;
|
||||
}, maxRetries)).trim();
|
||||
return retry(async () => {
|
||||
let creds;
|
||||
try {
|
||||
creds = await getCredentialsFromProfile(imdsProfile, options);
|
||||
}
|
||||
catch (err) {
|
||||
if (err.statusCode === 401) {
|
||||
disableFetchToken = false;
|
||||
}
|
||||
throw err;
|
||||
}
|
||||
return creds;
|
||||
}, maxRetries);
|
||||
};
|
||||
return async () => {
|
||||
const endpoint = await getInstanceMetadataEndpoint();
|
||||
if (disableFetchToken) {
|
||||
logger?.debug("AWS SDK Instance Metadata", "using v1 fallback (no token fetch)");
|
||||
return getCredentials(maxRetries, { ...endpoint, timeout });
|
||||
}
|
||||
else {
|
||||
let token;
|
||||
try {
|
||||
token = (await getMetadataToken({ ...endpoint, timeout })).toString();
|
||||
}
|
||||
catch (error) {
|
||||
if (error?.statusCode === 400) {
|
||||
throw Object.assign(error, {
|
||||
message: "EC2 Metadata token request returned error",
|
||||
});
|
||||
}
|
||||
else if (error.message === "TimeoutError" || [403, 404, 405].includes(error.statusCode)) {
|
||||
disableFetchToken = true;
|
||||
}
|
||||
logger?.debug("AWS SDK Instance Metadata", "using v1 fallback (initial)");
|
||||
return getCredentials(maxRetries, { ...endpoint, timeout });
|
||||
}
|
||||
return getCredentials(maxRetries, {
|
||||
...endpoint,
|
||||
headers: {
|
||||
[X_AWS_EC2_METADATA_TOKEN]: token,
|
||||
},
|
||||
timeout,
|
||||
});
|
||||
}
|
||||
};
|
||||
};
|
||||
const getMetadataToken = async (options) => httpRequest({
|
||||
...options,
|
||||
path: IMDS_TOKEN_PATH,
|
||||
method: "PUT",
|
||||
headers: {
|
||||
"x-aws-ec2-metadata-token-ttl-seconds": "21600",
|
||||
},
|
||||
});
|
||||
const getProfile = async (options) => (await httpRequest({ ...options, path: IMDS_PATH })).toString();
|
||||
const getCredentialsFromProfile = async (profile, options) => {
|
||||
const credsResponse = JSON.parse((await httpRequest({
|
||||
...options,
|
||||
path: IMDS_PATH + profile,
|
||||
})).toString());
|
||||
if (!isImdsCredentials(credsResponse)) {
|
||||
throw new CredentialsProviderError("Invalid response received from instance metadata service.");
|
||||
}
|
||||
return fromImdsCredentials(credsResponse);
|
||||
};
|
||||
7
resources/app/node_modules/@smithy/credential-provider-imds/dist-es/index.js
generated
vendored
Normal file
7
resources/app/node_modules/@smithy/credential-provider-imds/dist-es/index.js
generated
vendored
Normal file
@@ -0,0 +1,7 @@
|
||||
export * from "./fromContainerMetadata";
|
||||
export * from "./fromInstanceMetadata";
|
||||
export * from "./remoteProvider/RemoteProviderInit";
|
||||
export * from "./types";
|
||||
export { httpRequest } from "./remoteProvider/httpRequest";
|
||||
export { getInstanceMetadataEndpoint } from "./utils/getInstanceMetadataEndpoint";
|
||||
export { Endpoint } from "./config/Endpoint";
|
||||
12
resources/app/node_modules/@smithy/credential-provider-imds/dist-es/remoteProvider/ImdsCredentials.js
generated
vendored
Normal file
12
resources/app/node_modules/@smithy/credential-provider-imds/dist-es/remoteProvider/ImdsCredentials.js
generated
vendored
Normal file
@@ -0,0 +1,12 @@
|
||||
export const isImdsCredentials = (arg) => Boolean(arg) &&
|
||||
typeof arg === "object" &&
|
||||
typeof arg.AccessKeyId === "string" &&
|
||||
typeof arg.SecretAccessKey === "string" &&
|
||||
typeof arg.Token === "string" &&
|
||||
typeof arg.Expiration === "string";
|
||||
export const fromImdsCredentials = (creds) => ({
|
||||
accessKeyId: creds.AccessKeyId,
|
||||
secretAccessKey: creds.SecretAccessKey,
|
||||
sessionToken: creds.Token,
|
||||
expiration: new Date(creds.Expiration),
|
||||
});
|
||||
3
resources/app/node_modules/@smithy/credential-provider-imds/dist-es/remoteProvider/RemoteProviderInit.js
generated
vendored
Normal file
3
resources/app/node_modules/@smithy/credential-provider-imds/dist-es/remoteProvider/RemoteProviderInit.js
generated
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
export const DEFAULT_TIMEOUT = 1000;
|
||||
export const DEFAULT_MAX_RETRIES = 0;
|
||||
export const providerConfigFromInit = ({ maxRetries = DEFAULT_MAX_RETRIES, timeout = DEFAULT_TIMEOUT, }) => ({ maxRetries, timeout });
|
||||
36
resources/app/node_modules/@smithy/credential-provider-imds/dist-es/remoteProvider/httpRequest.js
generated
vendored
Normal file
36
resources/app/node_modules/@smithy/credential-provider-imds/dist-es/remoteProvider/httpRequest.js
generated
vendored
Normal file
@@ -0,0 +1,36 @@
|
||||
import { ProviderError } from "@smithy/property-provider";
|
||||
import { Buffer } from "buffer";
|
||||
import { request } from "http";
|
||||
export function httpRequest(options) {
|
||||
return new Promise((resolve, reject) => {
|
||||
const req = request({
|
||||
method: "GET",
|
||||
...options,
|
||||
hostname: options.hostname?.replace(/^\[(.+)\]$/, "$1"),
|
||||
});
|
||||
req.on("error", (err) => {
|
||||
reject(Object.assign(new ProviderError("Unable to connect to instance metadata service"), err));
|
||||
req.destroy();
|
||||
});
|
||||
req.on("timeout", () => {
|
||||
reject(new ProviderError("TimeoutError from instance metadata service"));
|
||||
req.destroy();
|
||||
});
|
||||
req.on("response", (res) => {
|
||||
const { statusCode = 400 } = res;
|
||||
if (statusCode < 200 || 300 <= statusCode) {
|
||||
reject(Object.assign(new ProviderError("Error response received from instance metadata service"), { statusCode }));
|
||||
req.destroy();
|
||||
}
|
||||
const chunks = [];
|
||||
res.on("data", (chunk) => {
|
||||
chunks.push(chunk);
|
||||
});
|
||||
res.on("end", () => {
|
||||
resolve(Buffer.concat(chunks));
|
||||
req.destroy();
|
||||
});
|
||||
});
|
||||
req.end();
|
||||
});
|
||||
}
|
||||
2
resources/app/node_modules/@smithy/credential-provider-imds/dist-es/remoteProvider/index.js
generated
vendored
Normal file
2
resources/app/node_modules/@smithy/credential-provider-imds/dist-es/remoteProvider/index.js
generated
vendored
Normal file
@@ -0,0 +1,2 @@
|
||||
export * from "./ImdsCredentials";
|
||||
export * from "./RemoteProviderInit";
|
||||
7
resources/app/node_modules/@smithy/credential-provider-imds/dist-es/remoteProvider/retry.js
generated
vendored
Normal file
7
resources/app/node_modules/@smithy/credential-provider-imds/dist-es/remoteProvider/retry.js
generated
vendored
Normal file
@@ -0,0 +1,7 @@
|
||||
export const retry = (toRetry, maxRetries) => {
|
||||
let promise = toRetry();
|
||||
for (let i = 0; i < maxRetries; i++) {
|
||||
promise = promise.catch(toRetry);
|
||||
}
|
||||
return promise;
|
||||
};
|
||||
1
resources/app/node_modules/@smithy/credential-provider-imds/dist-es/types.js
generated
vendored
Normal file
1
resources/app/node_modules/@smithy/credential-provider-imds/dist-es/types.js
generated
vendored
Normal file
@@ -0,0 +1 @@
|
||||
export {};
|
||||
17
resources/app/node_modules/@smithy/credential-provider-imds/dist-es/utils/getExtendedInstanceMetadataCredentials.js
generated
vendored
Normal file
17
resources/app/node_modules/@smithy/credential-provider-imds/dist-es/utils/getExtendedInstanceMetadataCredentials.js
generated
vendored
Normal file
@@ -0,0 +1,17 @@
|
||||
const STATIC_STABILITY_REFRESH_INTERVAL_SECONDS = 5 * 60;
|
||||
const STATIC_STABILITY_REFRESH_INTERVAL_JITTER_WINDOW_SECONDS = 5 * 60;
|
||||
const STATIC_STABILITY_DOC_URL = "https://docs.aws.amazon.com/sdkref/latest/guide/feature-static-credentials.html";
|
||||
export const getExtendedInstanceMetadataCredentials = (credentials, logger) => {
|
||||
const refreshInterval = STATIC_STABILITY_REFRESH_INTERVAL_SECONDS +
|
||||
Math.floor(Math.random() * STATIC_STABILITY_REFRESH_INTERVAL_JITTER_WINDOW_SECONDS);
|
||||
const newExpiration = new Date(Date.now() + refreshInterval * 1000);
|
||||
logger.warn("Attempting credential expiration extension due to a credential service availability issue. A refresh of these " +
|
||||
`credentials will be attempted after ${new Date(newExpiration)}.\nFor more information, please visit: ` +
|
||||
STATIC_STABILITY_DOC_URL);
|
||||
const originalExpiration = credentials.originalExpiration ?? credentials.expiration;
|
||||
return {
|
||||
...credentials,
|
||||
...(originalExpiration ? { originalExpiration } : {}),
|
||||
expiration: newExpiration,
|
||||
};
|
||||
};
|
||||
19
resources/app/node_modules/@smithy/credential-provider-imds/dist-es/utils/getInstanceMetadataEndpoint.js
generated
vendored
Normal file
19
resources/app/node_modules/@smithy/credential-provider-imds/dist-es/utils/getInstanceMetadataEndpoint.js
generated
vendored
Normal file
@@ -0,0 +1,19 @@
|
||||
import { loadConfig } from "@smithy/node-config-provider";
|
||||
import { parseUrl } from "@smithy/url-parser";
|
||||
import { Endpoint as InstanceMetadataEndpoint } from "../config/Endpoint";
|
||||
import { ENDPOINT_CONFIG_OPTIONS } from "../config/EndpointConfigOptions";
|
||||
import { EndpointMode } from "../config/EndpointMode";
|
||||
import { ENDPOINT_MODE_CONFIG_OPTIONS, } from "../config/EndpointModeConfigOptions";
|
||||
export const getInstanceMetadataEndpoint = async () => parseUrl((await getFromEndpointConfig()) || (await getFromEndpointModeConfig()));
|
||||
const getFromEndpointConfig = async () => loadConfig(ENDPOINT_CONFIG_OPTIONS)();
|
||||
const getFromEndpointModeConfig = async () => {
|
||||
const endpointMode = await loadConfig(ENDPOINT_MODE_CONFIG_OPTIONS)();
|
||||
switch (endpointMode) {
|
||||
case EndpointMode.IPv4:
|
||||
return InstanceMetadataEndpoint.IPv4;
|
||||
case EndpointMode.IPv6:
|
||||
return InstanceMetadataEndpoint.IPv6;
|
||||
default:
|
||||
throw new Error(`Unsupported endpoint mode: ${endpointMode}.` + ` Select from ${Object.values(EndpointMode)}`);
|
||||
}
|
||||
};
|
||||
25
resources/app/node_modules/@smithy/credential-provider-imds/dist-es/utils/staticStabilityProvider.js
generated
vendored
Normal file
25
resources/app/node_modules/@smithy/credential-provider-imds/dist-es/utils/staticStabilityProvider.js
generated
vendored
Normal file
@@ -0,0 +1,25 @@
|
||||
import { getExtendedInstanceMetadataCredentials } from "./getExtendedInstanceMetadataCredentials";
|
||||
export const staticStabilityProvider = (provider, options = {}) => {
|
||||
const logger = options?.logger || console;
|
||||
let pastCredentials;
|
||||
return async () => {
|
||||
let credentials;
|
||||
try {
|
||||
credentials = await provider();
|
||||
if (credentials.expiration && credentials.expiration.getTime() < Date.now()) {
|
||||
credentials = getExtendedInstanceMetadataCredentials(credentials, logger);
|
||||
}
|
||||
}
|
||||
catch (e) {
|
||||
if (pastCredentials) {
|
||||
logger.warn("Credential renew failed: ", e);
|
||||
credentials = getExtendedInstanceMetadataCredentials(pastCredentials, logger);
|
||||
}
|
||||
else {
|
||||
throw e;
|
||||
}
|
||||
}
|
||||
pastCredentials = credentials;
|
||||
return credentials;
|
||||
};
|
||||
};
|
||||
Reference in New Issue
Block a user