@aws-cdk/aws-eks-v2-alpha
Version:
This module is deprecated. All constructs are now available under aws-cdk-lib/aws-eks-v2
531 lines • 76.8 kB
JavaScript
"use strict";
var __runInitializers = (this && this.__runInitializers) || function (thisArg, initializers, value) {
var useValue = arguments.length > 2;
for (var i = 0; i < initializers.length; i++) {
value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
}
return useValue ? value : void 0;
};
var __esDecorate = (this && this.__esDecorate) || function (ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; }
var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";
var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null;
var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});
var _, done = false;
for (var i = decorators.length - 1; i >= 0; i--) {
var context = {};
for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p];
for (var p in contextIn.access) context.access[p] = contextIn.access[p];
context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); };
var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);
if (kind === "accessor") {
if (result === void 0) continue;
if (result === null || typeof result !== "object") throw new TypeError("Object expected");
if (_ = accept(result.get)) descriptor.get = _;
if (_ = accept(result.set)) descriptor.set = _;
if (_ = accept(result.init)) initializers.unshift(_);
}
else if (_ = accept(result)) {
if (kind === "field") initializers.unshift(_);
else descriptor[key] = _;
}
}
if (target) Object.defineProperty(target, contextIn.name, descriptor);
done = true;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.Nodegroup = exports.TaintEffect = exports.CapacityType = exports.NodegroupAmiType = void 0;
const jsiiDeprecationWarnings = require("../.warnings.jsii.js");
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
const aws_ec2_1 = require("aws-cdk-lib/aws-ec2");
const aws_eks_1 = require("aws-cdk-lib/aws-eks");
const aws_iam_1 = require("aws-cdk-lib/aws-iam");
const core_1 = require("aws-cdk-lib/core");
const helpers_internal_1 = require("aws-cdk-lib/core/lib/helpers-internal");
const metadata_resource_1 = require("aws-cdk-lib/core/lib/metadata-resource");
const prop_injectable_1 = require("aws-cdk-lib/core/lib/prop-injectable");
const cxapi = require("aws-cdk-lib/cx-api");
const constructs_1 = require("constructs");
const cluster_1 = require("./cluster");
const nodegroup_1 = require("./private/nodegroup");
/**
* The AMI type for your node group.
*
* GPU instance types should use the `AL2_x86_64_GPU` AMI type, which uses the
* Amazon EKS-optimized Linux AMI with GPU support or the `BOTTLEROCKET_ARM_64_NVIDIA` or `BOTTLEROCKET_X86_64_NVIDIA`
* AMI types, which uses the Amazon EKS-optimized Linux AMI with Nvidia-GPU support.
*
* Non-GPU instances should use the `AL2_x86_64` AMI type, which uses the Amazon EKS-optimized Linux AMI.
*/
var NodegroupAmiType;
(function (NodegroupAmiType) {
/**
* Amazon Linux 2 (x86-64)
*/
NodegroupAmiType["AL2_X86_64"] = "AL2_x86_64";
/**
* Amazon Linux 2 with GPU support
*/
NodegroupAmiType["AL2_X86_64_GPU"] = "AL2_x86_64_GPU";
/**
* Amazon Linux 2 (ARM-64)
*/
NodegroupAmiType["AL2_ARM_64"] = "AL2_ARM_64";
/**
* Bottlerocket Linux (ARM-64)
*/
NodegroupAmiType["BOTTLEROCKET_ARM_64"] = "BOTTLEROCKET_ARM_64";
/**
* Bottlerocket (x86-64)
*/
NodegroupAmiType["BOTTLEROCKET_X86_64"] = "BOTTLEROCKET_x86_64";
/**
* Bottlerocket Linux with Nvidia-GPU support (ARM-64)
*/
NodegroupAmiType["BOTTLEROCKET_ARM_64_NVIDIA"] = "BOTTLEROCKET_ARM_64_NVIDIA";
/**
* Bottlerocket with Nvidia-GPU support (x86-64)
*/
NodegroupAmiType["BOTTLEROCKET_X86_64_NVIDIA"] = "BOTTLEROCKET_x86_64_NVIDIA";
/**
* Bottlerocket Linux (ARM-64) with FIPS enabled
*/
NodegroupAmiType["BOTTLEROCKET_ARM_64_FIPS"] = "BOTTLEROCKET_ARM_64_FIPS";
/**
* Bottlerocket (x86-64) with FIPS enabled
*/
NodegroupAmiType["BOTTLEROCKET_X86_64_FIPS"] = "BOTTLEROCKET_x86_64_FIPS";
/**
* Windows Core 2019 (x86-64)
*/
NodegroupAmiType["WINDOWS_CORE_2019_X86_64"] = "WINDOWS_CORE_2019_x86_64";
/**
* Windows Core 2022 (x86-64)
*/
NodegroupAmiType["WINDOWS_CORE_2022_X86_64"] = "WINDOWS_CORE_2022_x86_64";
/**
* Windows Full 2019 (x86-64)
*/
NodegroupAmiType["WINDOWS_FULL_2019_X86_64"] = "WINDOWS_FULL_2019_x86_64";
/**
* Windows Full 2022 (x86-64)
*/
NodegroupAmiType["WINDOWS_FULL_2022_X86_64"] = "WINDOWS_FULL_2022_x86_64";
/**
* Amazon Linux 2023 (x86-64)
*/
NodegroupAmiType["AL2023_X86_64_STANDARD"] = "AL2023_x86_64_STANDARD";
/**
* Amazon Linux 2023 with AWS Neuron drivers (x86-64)
*/
NodegroupAmiType["AL2023_X86_64_NEURON"] = "AL2023_x86_64_NEURON";
/**
* Amazon Linux 2023 with NVIDIA drivers (x86-64)
*/
NodegroupAmiType["AL2023_X86_64_NVIDIA"] = "AL2023_x86_64_NVIDIA";
/**
* Amazon Linux 2023 with NVIDIA drivers (ARM-64)
*/
NodegroupAmiType["AL2023_ARM_64_NVIDIA"] = "AL2023_ARM_64_NVIDIA";
/**
* Amazon Linux 2023 (ARM-64)
*/
NodegroupAmiType["AL2023_ARM_64_STANDARD"] = "AL2023_ARM_64_STANDARD";
})(NodegroupAmiType || (exports.NodegroupAmiType = NodegroupAmiType = {}));
/**
* Capacity type of the managed node group
*/
var CapacityType;
(function (CapacityType) {
/**
* spot instances
*/
CapacityType["SPOT"] = "SPOT";
/**
* on-demand instances
*/
CapacityType["ON_DEMAND"] = "ON_DEMAND";
/**
* capacity block instances
*/
CapacityType["CAPACITY_BLOCK"] = "CAPACITY_BLOCK";
})(CapacityType || (exports.CapacityType = CapacityType = {}));
/**
* Effect types of kubernetes node taint.
*
* Note: These values are specifically for AWS EKS NodeGroups and use the AWS API format.
* When using AWS CLI or API, taint effects must be NO_SCHEDULE, PREFER_NO_SCHEDULE, or NO_EXECUTE.
* When using Kubernetes directly or kubectl, taint effects must be NoSchedule, PreferNoSchedule, or NoExecute.
*
* For Kubernetes manifests (like Karpenter NodePools), use string literals with PascalCase format:
* - 'NoSchedule' instead of TaintEffect.NO_SCHEDULE
* - 'PreferNoSchedule' instead of TaintEffect.PREFER_NO_SCHEDULE
* - 'NoExecute' instead of TaintEffect.NO_EXECUTE
*
* @see https://docs.aws.amazon.com/eks/latest/userguide/node-taints-managed-node-groups.html
*/
var TaintEffect;
(function (TaintEffect) {
/**
* NoSchedule
*/
TaintEffect["NO_SCHEDULE"] = "NO_SCHEDULE";
/**
* PreferNoSchedule
*/
TaintEffect["PREFER_NO_SCHEDULE"] = "PREFER_NO_SCHEDULE";
/**
* NoExecute
*/
TaintEffect["NO_EXECUTE"] = "NO_EXECUTE";
})(TaintEffect || (exports.TaintEffect = TaintEffect = {}));
/**
* The Nodegroup resource class
* @resource AWS::EKS::Nodegroup
*/
let Nodegroup = (() => {
let _classDecorators = [prop_injectable_1.propertyInjectable];
let _classDescriptor;
let _classExtraInitializers = [];
let _classThis;
let _classSuper = core_1.Resource;
let _instanceExtraInitializers = [];
let _get_nodegroupArn_decorators;
let _get_nodegroupName_decorators;
var Nodegroup = class extends _classSuper {
static { _classThis = this; }
static {
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
_get_nodegroupArn_decorators = [helpers_internal_1.memoizedGetter];
_get_nodegroupName_decorators = [helpers_internal_1.memoizedGetter];
__esDecorate(this, null, _get_nodegroupArn_decorators, { kind: "getter", name: "nodegroupArn", static: false, private: false, access: { has: obj => "nodegroupArn" in obj, get: obj => obj.nodegroupArn }, metadata: _metadata }, null, _instanceExtraInitializers);
__esDecorate(this, null, _get_nodegroupName_decorators, { kind: "getter", name: "nodegroupName", static: false, private: false, access: { has: obj => "nodegroupName" in obj, get: obj => obj.nodegroupName }, metadata: _metadata }, null, _instanceExtraInitializers);
__esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
Nodegroup = _classThis = _classDescriptor.value;
if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
}
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-eks-v2-alpha.Nodegroup", version: "2.240.0-alpha.0" };
/** Uniquely identifies this class. */
static PROPERTY_INJECTION_ID = '@aws-cdk.aws-eks-v2-alpha.Nodegroup';
/**
* Import the Nodegroup from attributes
*/
static fromNodegroupName(scope, id, nodegroupName) {
try {
jsiiDeprecationWarnings.print("@aws-cdk/aws-eks-v2-alpha.Nodegroup#fromNodegroupName", "");
}
catch (error) {
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
Error.captureStackTrace(error, this.fromNodegroupName);
}
throw error;
}
class Import extends core_1.Resource {
nodegroupName = nodegroupName;
}
return new Import(scope, id);
}
/**
* the Amazon EKS cluster resource
*
* @attribute ClusterName
*/
cluster = __runInitializers(this, _instanceExtraInitializers);
/**
* IAM role of the instance profile for the nodegroup
*/
role;
resource;
desiredSize;
maxSize;
minSize;
constructor(scope, id, props) {
super(scope, id, {
physicalName: props.nodegroupName,
});
try {
jsiiDeprecationWarnings.print("@aws-cdk/aws-eks-v2-alpha.Nodegroup", "");
jsiiDeprecationWarnings._aws_cdk_aws_eks_v2_alpha_NodegroupProps(props);
}
catch (error) {
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
Error.captureStackTrace(error, Nodegroup);
}
throw error;
}
// Enhanced CDK Analytics Telemetry
(0, metadata_resource_1.addConstructMetadata)(this, props);
this.cluster = props.cluster;
this.desiredSize = props.desiredSize ?? props.minSize ?? 2;
this.maxSize = props.maxSize ?? this.desiredSize;
this.minSize = props.minSize ?? 1;
(0, core_1.withResolved)(this.desiredSize, this.maxSize, (desired, max) => {
if (desired === undefined) {
return;
}
if (desired > max) {
throw new core_1.ValidationError(`Desired capacity ${desired} can't be greater than max size ${max}`, this);
}
});
(0, core_1.withResolved)(this.desiredSize, this.minSize, (desired, min) => {
if (desired === undefined) {
return;
}
if (desired < min) {
throw new core_1.ValidationError(`Minimum capacity ${min} can't be greater than desired size ${desired}`, this);
}
});
if (props.launchTemplateSpec && props.diskSize) {
// see - https://docs.aws.amazon.com/eks/latest/userguide/launch-templates.html
// and https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-eks-nodegroup.html#cfn-eks-nodegroup-disksize
throw new core_1.ValidationError('diskSize must be specified within the launch template', this);
}
if (props.instanceType && props.instanceTypes) {
throw new core_1.ValidationError('"instanceType is deprecated, please use "instanceTypes" only.', this);
}
if (props.instanceType) {
core_1.Annotations.of(this).addWarningV2('@aws-cdk/aws-eks:managedNodeGroupDeprecatedInstanceType', '"instanceType" is deprecated and will be removed in the next major version. please use "instanceTypes" instead');
}
const instanceTypes = props.instanceTypes ?? (props.instanceType ? [props.instanceType] : undefined);
let possibleAmiTypes = [];
if (instanceTypes && instanceTypes.length > 0) {
/**
* if the user explicitly configured instance types, we can't caculate the expected ami type as we support
* Amazon Linux 2, Bottlerocket, and Windows now. However we can check:
*
* 1. instance types of different CPU architectures are not mixed(e.g. X86 with ARM).
* 2. user-specified amiType should be included in `possibleAmiTypes`.
*/
possibleAmiTypes = getPossibleAmiTypes(instanceTypes);
// if the user explicitly configured an ami type, make sure it's included in the possibleAmiTypes
if (props.amiType && !possibleAmiTypes.includes(props.amiType)) {
throw new core_1.ValidationError(`The specified AMI does not match the instance types architecture, either specify one of ${possibleAmiTypes.join(', ').toUpperCase()} or don't specify any`, this);
}
// if the user explicitly configured a Windows ami type, make sure the instanceType is allowed
if (props.amiType && windowsAmiTypes.includes(props.amiType) &&
instanceTypes.filter(isWindowsSupportedInstanceType).length < instanceTypes.length) {
throw new core_1.ValidationError('The specified instanceType does not support Windows workloads. '
+ 'Amazon EC2 instance types C3, C4, D2, I2, M4 (excluding m4.16xlarge), M6a.x, and '
+ 'R3 instances aren\'t supported for Windows workloads.', this);
}
}
if (!props.nodeRole) {
const ngRole = new aws_iam_1.Role(this, 'NodeGroupRole', {
assumedBy: new aws_iam_1.ServicePrincipal('ec2.amazonaws.com'),
});
ngRole.addManagedPolicy(aws_iam_1.ManagedPolicy.fromAwsManagedPolicyName('AmazonEKSWorkerNodePolicy'));
ngRole.addManagedPolicy(aws_iam_1.ManagedPolicy.fromAwsManagedPolicyName('AmazonEKS_CNI_Policy'));
ngRole.addManagedPolicy(aws_iam_1.ManagedPolicy.fromAwsManagedPolicyName('AmazonEC2ContainerRegistryReadOnly'));
// Grant additional IPv6 networking permissions if running in IPv6
// https://docs.aws.amazon.com/eks/latest/userguide/cni-iam-role.html
if (props.cluster.ipFamily == cluster_1.IpFamily.IP_V6) {
ngRole.addToPrincipalPolicy(new aws_iam_1.PolicyStatement({
// eslint-disable-next-line @cdklabs/no-literal-partition
resources: ['arn:aws:ec2:*:*:network-interface/*'],
actions: [
'ec2:AssignIpv6Addresses',
'ec2:UnassignIpv6Addresses',
],
}));
}
this.role = ngRole;
}
else {
this.role = props.nodeRole;
}
this.validateUpdateConfig(props.maxUnavailable, props.maxUnavailablePercentage);
this.resource = new aws_eks_1.CfnNodegroup(this, 'Resource', {
clusterName: this.cluster.clusterName,
nodegroupName: props.nodegroupName,
nodeRole: this.role.roleArn,
subnets: this.cluster.vpc.selectSubnets(props.subnets).subnetIds,
/**
* Case 1: If launchTemplate is explicitly specified with custom AMI, we cannot specify amiType, or the node group deployment will fail.
* As we don't know if the custom AMI is specified in the lauchTemplate, we just use props.amiType.
*
* Case 2: If launchTemplate is not specified, we try to determine amiType from the instanceTypes and it could be either AL2 or Bottlerocket.
* To avoid breaking changes, we use possibleAmiTypes[0] if amiType is undefined and make sure AL2 is always the first element in possibleAmiTypes
* as AL2 is previously the `expectedAmi` and this avoids breaking changes.
*
* That being said, users now either have to explicitly specify correct amiType or just leave it undefined.
*/
amiType: props.launchTemplateSpec ? props.amiType : (props.amiType ?? possibleAmiTypes[0]),
capacityType: props.capacityType ? props.capacityType.valueOf() : undefined,
diskSize: props.diskSize,
forceUpdateEnabled: props.forceUpdate ?? true,
// note that we don't check if a launch template is configured here (even though it might configure instance types as well)
// because this doesn't have a default value, meaning the user had to explicitly configure this.
instanceTypes: instanceTypes?.map(t => t.toString()),
labels: props.labels,
taints: props.taints,
launchTemplate: props.launchTemplateSpec,
releaseVersion: props.releaseVersion,
remoteAccess: props.remoteAccess ? {
ec2SshKey: props.remoteAccess.sshKeyName,
sourceSecurityGroups: props.remoteAccess.sourceSecurityGroups ?
props.remoteAccess.sourceSecurityGroups.map(m => m.securityGroupId) : undefined,
} : undefined,
scalingConfig: {
desiredSize: this.desiredSize,
maxSize: this.maxSize,
minSize: this.minSize,
},
tags: props.tags,
updateConfig: props.maxUnavailable || props.maxUnavailablePercentage ? {
maxUnavailable: props.maxUnavailable,
maxUnavailablePercentage: props.maxUnavailablePercentage,
} : undefined,
nodeRepairConfig: props.enableNodeAutoRepair ? {
enabled: props.enableNodeAutoRepair,
} : undefined,
});
if (this.cluster instanceof cluster_1.Cluster) {
// the controller runs on the worker nodes so they cannot
// be deleted before the controller.
if (this.cluster.albController) {
constructs_1.Node.of(this.cluster.albController).addDependency(this);
}
}
if (props.removalPolicy) {
core_1.RemovalPolicies.of(this).apply(props.removalPolicy);
}
}
/**
* ARN of the nodegroup
*
* @attribute
*/
get nodegroupArn() {
try {
jsiiDeprecationWarnings.print("@aws-cdk/aws-eks-v2-alpha.Nodegroup#nodegroupArn", "");
}
catch (error) {
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
Error.captureStackTrace(error, jsiiDeprecationWarnings.getPropertyDescriptor(this, "nodegroupArn").get);
}
throw error;
}
return this.getResourceArnAttribute(this.resource.attrArn, {
service: 'eks',
resource: 'nodegroup',
resourceName: this.physicalName,
});
}
/**
* Nodegroup name
*
* @attribute
*/
get nodegroupName() {
try {
jsiiDeprecationWarnings.print("@aws-cdk/aws-eks-v2-alpha.Nodegroup#nodegroupName", "");
}
catch (error) {
if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
Error.captureStackTrace(error, jsiiDeprecationWarnings.getPropertyDescriptor(this, "nodegroupName").get);
}
throw error;
}
if (core_1.FeatureFlags.of(this).isEnabled(cxapi.EKS_NODEGROUP_NAME)) {
return this.getResourceNameAttribute(this.resource.attrNodegroupName);
}
else {
return this.getResourceNameAttribute(this.resource.ref);
}
}
validateUpdateConfig(maxUnavailable, maxUnavailablePercentage) {
if (!maxUnavailable && !maxUnavailablePercentage)
return;
if (maxUnavailable && maxUnavailablePercentage) {
throw new core_1.ValidationError('maxUnavailable and maxUnavailablePercentage are not allowed to be defined together', this);
}
if (maxUnavailablePercentage && (maxUnavailablePercentage < 1 || maxUnavailablePercentage > 100)) {
throw new core_1.ValidationError(`maxUnavailablePercentage must be between 1 and 100, got ${maxUnavailablePercentage}`, this);
}
if (maxUnavailable) {
if (maxUnavailable > this.maxSize) {
throw new core_1.ValidationError(`maxUnavailable must be lower than maxSize (${this.maxSize}), got ${maxUnavailable}`, this);
}
if (maxUnavailable < 1 || maxUnavailable > 100) {
throw new core_1.ValidationError(`maxUnavailable must be between 1 and 100, got ${maxUnavailable}`, this);
}
}
}
static {
__runInitializers(_classThis, _classExtraInitializers);
}
};
return Nodegroup = _classThis;
})();
exports.Nodegroup = Nodegroup;
/**
* AMI types of different architectures. Make sure AL2 is always the first element, which will be the default
* AmiType if amiType and launchTemplateSpec are both undefined.
*/
const arm64AmiTypes = [
NodegroupAmiType.AL2_ARM_64,
NodegroupAmiType.AL2023_ARM_64_STANDARD,
NodegroupAmiType.BOTTLEROCKET_ARM_64,
];
const x8664AmiTypes = [
NodegroupAmiType.AL2_X86_64,
NodegroupAmiType.AL2023_X86_64_STANDARD,
NodegroupAmiType.BOTTLEROCKET_X86_64,
NodegroupAmiType.WINDOWS_CORE_2019_X86_64,
NodegroupAmiType.WINDOWS_CORE_2022_X86_64,
NodegroupAmiType.WINDOWS_FULL_2019_X86_64,
NodegroupAmiType.WINDOWS_FULL_2022_X86_64,
];
const windowsAmiTypes = [
NodegroupAmiType.WINDOWS_CORE_2019_X86_64,
NodegroupAmiType.WINDOWS_CORE_2022_X86_64,
NodegroupAmiType.WINDOWS_FULL_2019_X86_64,
NodegroupAmiType.WINDOWS_FULL_2022_X86_64,
];
const gpuAmiTypes = [
NodegroupAmiType.AL2_X86_64_GPU,
NodegroupAmiType.AL2023_X86_64_NEURON,
NodegroupAmiType.AL2023_X86_64_NVIDIA,
NodegroupAmiType.AL2023_ARM_64_NVIDIA,
NodegroupAmiType.BOTTLEROCKET_X86_64_NVIDIA,
NodegroupAmiType.BOTTLEROCKET_ARM_64_NVIDIA,
];
/**
* This function check if the instanceType is supported by Windows AMI.
* https://docs.aws.amazon.com/eks/latest/userguide/windows-support.html
* @param instanceType The EC2 instance type
*/
function isWindowsSupportedInstanceType(instanceType) {
// compare instanceType to forbidden InstanceTypes for Windows. Add exception for m6a.16xlarge.
// NOTE: i2 instance class is not present in the InstanceClass enum.
const forbiddenInstanceClasses = [aws_ec2_1.InstanceClass.C3, aws_ec2_1.InstanceClass.C4, aws_ec2_1.InstanceClass.D2, aws_ec2_1.InstanceClass.M4,
aws_ec2_1.InstanceClass.M6A, aws_ec2_1.InstanceClass.R3];
return instanceType.toString() === aws_ec2_1.InstanceType.of(aws_ec2_1.InstanceClass.M4, aws_ec2_1.InstanceSize.XLARGE16).toString() ||
forbiddenInstanceClasses.every((c) => !instanceType.sameInstanceClassAs(aws_ec2_1.InstanceType.of(c, aws_ec2_1.InstanceSize.LARGE)) && !instanceType.toString().match(/^i2/));
}
/**
* This function examines the CPU architecture of every instance type and determines
* what AMI types are compatible for all of them. it either throws or produces an array of possible AMI types because
* instance types of different CPU architectures are not supported.
* @param instanceTypes The instance types
* @returns NodegroupAmiType[]
*/
function getPossibleAmiTypes(instanceTypes) {
function typeToArch(instanceType) {
return (0, nodegroup_1.isGpuInstanceType)(instanceType) ? 'GPU' : instanceType.architecture;
}
const archAmiMap = new Map([
[aws_ec2_1.InstanceArchitecture.ARM_64, arm64AmiTypes],
[aws_ec2_1.InstanceArchitecture.X86_64, x8664AmiTypes],
['GPU', gpuAmiTypes],
]);
const architectures = new Set(instanceTypes.map(typeToArch));
if (architectures.size === 0) { // protective code, the current implementation will never result in this.
throw new core_1.UnscopedValidationError(`Cannot determine any ami type compatible with instance types: ${instanceTypes.map(i => i.toString()).join(', ')}`);
}
if (architectures.size > 1) {
throw new core_1.UnscopedValidationError('instanceTypes of different architectures is not allowed');
}
return archAmiMap.get(Array.from(architectures)[0]);
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFuYWdlZC1ub2RlZ3JvdXAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJtYW5hZ2VkLW5vZGVncm91cC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFDQSxpREFBc0c7QUFDdEcsaURBQW1EO0FBRW5ELGlEQUE2RjtBQUU3RiwyQ0FBZ0o7QUFDaEosNEVBQXVFO0FBQ3ZFLDhFQUE4RTtBQUM5RSwwRUFBMEU7QUFDMUUsNENBQTRDO0FBRTVDLDJDQUFrQztBQUVsQyx1Q0FBOEM7QUFDOUMsbURBQXdEO0FBYXhEOzs7Ozs7OztHQVFHO0FBQ0gsSUFBWSxnQkF5RVg7QUF6RUQsV0FBWSxnQkFBZ0I7SUFDMUI7O09BRUc7SUFDSCw2Q0FBeUIsQ0FBQTtJQUN6Qjs7T0FFRztJQUNILHFEQUFpQyxDQUFBO0lBQ2pDOztPQUVHO0lBQ0gsNkNBQXlCLENBQUE7SUFDekI7O09BRUc7SUFDSCwrREFBMkMsQ0FBQTtJQUMzQzs7T0FFRztJQUNILCtEQUEyQyxDQUFBO0lBQzNDOztPQUVHO0lBQ0gsNkVBQXlELENBQUE7SUFDekQ7O09BRUc7SUFDSCw2RUFBeUQsQ0FBQTtJQUN6RDs7T0FFRztJQUNILHlFQUFxRCxDQUFBO0lBQ3JEOztPQUVHO0lBQ0gseUVBQXFELENBQUE7SUFDckQ7O09BRUc7SUFDSCx5RUFBcUQsQ0FBQTtJQUNyRDs7T0FFRztJQUNILHlFQUFxRCxDQUFBO0lBQ3JEOztPQUVHO0lBQ0gseUVBQXFELENBQUE7SUFDckQ7O09BRUc7SUFDSCx5RUFBcUQsQ0FBQTtJQUNyRDs7T0FFRztJQUNILHFFQUFpRCxDQUFBO0lBQ2pEOztPQUVHO0lBQ0gsaUVBQTZDLENBQUE7SUFDN0M7O09BRUc7SUFDSCxpRUFBNkMsQ0FBQTtJQUM3Qzs7T0FFRztJQUNILGlFQUE2QyxDQUFBO0lBQzdDOztPQUVHO0lBQ0gscUVBQWlELENBQUE7QUFDbkQsQ0FBQyxFQXpFVyxnQkFBZ0IsZ0NB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Q0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFFLENBQUM7QUFDdkQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgSVNlY3VyaXR5R3JvdXAsIFN1Ym5ldFNlbGVjdGlvbiB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1lYzInO1xuaW1wb3J0IHsgSW5zdGFuY2VUeXBlLCBJbnN0YW5jZUFyY2hpdGVjdHVyZSwgSW5zdGFuY2VDbGFzcywgSW5zdGFuY2VTaXplIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWVjMic7XG5pbXBvcnQgeyBDZm5Ob2RlZ3JvdXAgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtZWtzJztcbmltcG9ydCB0eXBlIHsgSVJvbGUgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtaWFtJztcbmltcG9ydCB7IE1hbmFnZWRQb2xpY3ksIFBvbGljeVN0YXRlbWVudCwgUm9sZSwgU2VydmljZVByaW5jaXBhbCB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1pYW0nO1xuaW1wb3J0IHR5cGUgeyBJUmVzb3VyY2UsIFJlbW92YWxQb2xpY3kgfSBmcm9tICdhd3MtY2RrLWxpYi9jb3JlJztcbmltcG9ydCB7IFJlc291cmNlLCBBbm5vdGF0aW9ucywgd2l0aFJlc29sdmVkLCBGZWF0dXJlRmxhZ3MsIFZhbGlkYXRpb25FcnJvciwgUmVtb3ZhbFBvbGljaWVzLCBVbnNjb3BlZFZhbGlkYXRpb25FcnJvciB9IGZyb20gJ2F3cy1jZGstbGliL2NvcmUnO1xuaW1wb3J0IHsgbWVtb2l6ZWRHZXR0ZXIgfSBmcm9tICdhd3MtY2RrLWxpYi9jb3JlL2xpYi9oZWxwZXJzLWludGVybmFsJztcbmltcG9ydCB7IGFkZENvbnN0cnVjdE1ldGFkYXRhIH0gZnJvbSAnYXdzLWNkay1saWIvY29yZS9saWIvbWV0YWRhdGEtcmVzb3VyY2UnO1xuaW1wb3J0IHsgcHJvcGVydHlJbmplY3RhYmxlIH0gZnJvbSAnYXdzLWNkay1saWIvY29yZS9saWIvcHJvcC1pbmplY3RhYmxlJztcbmltcG9ydCAqIGFzIGN4YXBpIGZyb20gJ2F3cy1jZGstbGliL2N4LWFwaSc7XG5pbXBvcnQgdHlwZSB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHsgTm9kZSB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHR5cGUgeyBJQ2x1c3RlciB9IGZyb20gJy4vY2x1c3Rlcic7XG5pbXBvcnQgeyBDbHVzdGVyLCBJcEZhbWlseSB9IGZyb20gJy4vY2x1c3Rlcic7XG5pbXBvcnQgeyBpc0dwdUluc3RhbmNlVHlwZSB9IGZyb20gJy4vcHJpdmF0ZS9ub2RlZ3JvdXAnO1xuXG4vKipcbiAqIE5vZGVHcm91cCBpbnRlcmZhY2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJTm9kZWdyb3VwIGV4dGVuZHMgSVJlc291cmNlIHtcbiAgLyoqXG4gICAqIE5hbWUgb2YgdGhlIG5vZGVncm91cFxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICByZWFkb25seSBub2RlZ3JvdXBOYW1lOiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIEFNSSB0eXBlIGZvciB5b3VyIG5vZGUgZ3JvdXAuXG4gKlxuICogR1BVIGluc3RhbmNlIHR5cGVzIHNob3VsZCB1c2UgdGhlIGBBTDJfeDg2XzY0X0dQVWAgQU1JIHR5cGUsIHdoaWNoIHVzZXMgdGhlXG4gKiBBbWF6b24gRUtTLW9wdGltaXplZCBMaW51eCBBTUkgd2l0aCBHUFUgc3VwcG9ydCBvciB0aGUgYEJPVFRMRVJPQ0tFVF9BUk1fNjRfTlZJRElBYCBvciBgQk9UVExFUk9DS0VUX1g4Nl82NF9OVklESUFgXG4gKiBBTUkgdHlwZXMsIHdoaWNoIHVzZXMgdGhlIEFtYXpvbiBFS1Mtb3B0aW1pemVkIExpbnV4IEFNSSB3aXRoIE52aWRpYS1HUFUgc3VwcG9ydC5cbiAqXG4gKiBOb24tR1BVIGluc3RhbmNlcyBzaG91bGQgdXNlIHRoZSBgQUwyX3g4Nl82NGAgQU1JIHR5cGUsIHdoaWNoIHVzZXMgdGhlIEFtYXpvbiBFS1Mtb3B0aW1pemVkIExpbnV4IEFNSS5cbiAqL1xuZXhwb3J0IGVudW0gTm9kZWdyb3VwQW1pVHlwZSB7XG4gIC8qKlxuICAgKiBBbWF6b24gTGludXggMiAoeDg2LTY0KVxuICAgKi9cbiAgQUwyX1g4Nl82NCA9ICdBTDJfeDg2XzY0JyxcbiAgLyoqXG4gICAqIEFtYXpvbiBMaW51eCAyIHdpdGggR1BVIHN1cHBvcnRcbiAgICovXG4gIEFMMl9YODZfNjRfR1BVID0gJ0FMMl94ODZfNjRfR1BVJyxcbiAgLyoqXG4gICAqIEFtYXpvbiBMaW51eCAyIChBUk0tNjQpXG4gICAqL1xuICBBTDJfQVJNXzY0ID0gJ0FMMl9BUk1fNjQnLFxuICAvKipcbiAgICogIEJvdHRsZXJvY2tldCBMaW51eCAoQVJNLTY0KVxuICAgKi9cbiAgQk9UVExFUk9DS0VUX0FSTV82NCA9ICdCT1RUTEVST0NLRVRfQVJNXzY0JyxcbiAgLyoqXG4gICAqIEJvdHRsZXJvY2tldCAoeDg2LTY0KVxuICAgKi9cbiAgQk9UVExFUk9DS0VUX1g4Nl82NCA9ICdCT1RUTEVST0NLRVRfeDg2XzY0JyxcbiAgLyoqXG4gICAqICBCb3R0bGVyb2NrZXQgTGludXggd2l0aCBOdmlkaWEtR1BVIHN1cHBvcnQgKEFSTS02NClcbiAgICovXG4gIEJPVFRMRVJPQ0tFVF9BUk1fNjRfTlZJRElBID0gJ0JPVFRMRVJPQ0tFVF9BUk1fNjRfTlZJRElBJyxcbiAgLyoqXG4gICAqIEJvdHRsZXJvY2tldCB3aXRoIE52aWRpYS1HUFUgc3VwcG9ydCAoeDg2LTY0KVxuICAgKi9cbiAgQk9UVExFUk9DS0VUX1g4Nl82NF9OVklESUEgPSAnQk9UVExFUk9DS0VUX3g4Nl82NF9OVklESUEnLFxuICAvKipcbiAgICogQm90dGxlcm9ja2V0IExpbnV4IChBUk0tNjQpIHdpdGggRklQUyBlbmFibGVkXG4gICAqL1xuICBCT1RUTEVST0NLRVRfQVJNXzY0X0ZJUFMgPSAnQk9UVExFUk9DS0VUX0FSTV82NF9GSVBTJyxcbiAgLyoqXG4gICAqIEJvdHRsZXJvY2tldCAoeDg2LTY0KSB3aXRoIEZJUFMgZW5hYmxlZFxuICAgKi9cbiAgQk9UVExFUk9DS0VUX1g4Nl82NF9GSVBTID0gJ0JPVFRMRVJPQ0tFVF94ODZfNjRfRklQUycsXG4gIC8qKlxuICAgKiBXaW5kb3dzIENvcmUgMjAxOSAoeDg2LTY0KVxuICAgKi9cbiAgV0lORE9XU19DT1JFXzIwMTlfWDg2XzY0ID0gJ1dJTkRPV1NfQ09SRV8yMDE5X3g4Nl82NCcsXG4gIC8qKlxuICAgKiBXaW5kb3dzIENvcmUgMjAyMiAoeDg2LTY0KVxuICAgKi9cbiAgV0lORE9XU19DT1JFXzIwMjJfWDg2XzY0ID0gJ1dJTkRPV1NfQ09SRV8yMDIyX3g4Nl82NCcsXG4gIC8qKlxuICAgKiBXaW5kb3dzIEZ1bGwgMjAxOSAoeDg2LTY0KVxuICAgKi9cbiAgV0lORE9XU19GVUxMXzIwMTlfWDg2XzY0ID0gJ1dJTkRPV1NfRlVMTF8yMDE5X3g4Nl82NCcsXG4gIC8qKlxuICAgKiBXaW5kb3dzIEZ1bGwgMjAyMiAoeDg2LTY0KVxuICAgKi9cbiAgV0lORE9XU19GVUxMXzIwMjJfWDg2XzY0ID0gJ1dJTkRPV1NfRlVMTF8yMDIyX3g4Nl82NCcsXG4gIC8qKlxuICAgKiBBbWF6b24gTGludXggMjAyMyAoeDg2LTY0KVxuICAgKi9cbiAgQUwyMDIzX1g4Nl82NF9TVEFOREFSRCA9ICdBTDIwMjNfeDg2XzY0X1NUQU5EQVJEJyxcbiAgLyoqXG4gICAqIEFtYXpvbiBMaW51eCAyMDIzIHdpdGggQVdTIE5ldXJvbiBkcml2ZXJzICh4ODYtNjQpXG4gICAqL1xuICBBTDIwMjNfWDg2XzY0X05FVVJPTiA9ICdBTDIwMjNfeDg2XzY0X05FVVJPTicsXG4gIC8qKlxuICAgKiBBbWF6b24gTGludXggMjAyMyB3aXRoIE5WSURJQSBkcml2ZXJzICh4ODYtNjQpXG4gICAqL1xuICBBTDIwMjNfWDg2XzY0X05WSURJQSA9ICdBTDIwMjNfeDg2XzY0X05WSURJQScsXG4gIC8qKlxuICAgKiBBbWF6b24gTGludXggMjAyMyB3aXRoIE5WSURJQSBkcml2ZXJzIChBUk0tNjQpXG4gICAqL1xuICBBTDIwMjNfQVJNXzY0X05WSURJQSA9ICdBTDIwMjNfQVJNXzY0X05WSURJQScsXG4gIC8qKlxuICAgKiBBbWF6b24gTGludXggMjAyMyAoQVJNLTY0KVxuICAgKi9cbiAgQUwyMDIzX0FSTV82NF9TVEFOREFSRCA9ICdBTDIwMjNfQVJNXzY0X1NUQU5EQVJEJyxcbn1cblxuLyoqXG4gKiBDYXBhY2l0eSB0eXBlIG9mIHRoZSBtYW5hZ2VkIG5vZGUgZ3JvdXBcbiAqL1xuZXhwb3J0IGVudW0gQ2FwYWNpdHlUeXBlIHtcbiAgLyoqXG4gICAqIHNwb3QgaW5zdGFuY2VzXG4gICAqL1xuICBTUE9UID0gJ1NQT1QnLFxuICAvKipcbiAgICogb24tZGVtYW5kIGluc3RhbmNlc1xuICAgKi9cbiAgT05fREVNQU5EID0gJ09OX0RFTUFORCcsXG4gIC8qKlxuICAgKiBjYXBhY2l0eSBibG9jayBpbnN0YW5jZXNcbiAgICovXG4gIENBUEFDSVRZX0JMT0NLID0gJ0NBUEFDSVRZX0JMT0NLJyxcbn1cblxuLyoqXG4gKiBUaGUgcmVtb3RlIGFjY2VzcyAoU1NIKSBjb25maWd1cmF0aW9uIHRvIHVzZSB3aXRoIHlvdXIgbm9kZSBncm91cC5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NDbG91ZEZvcm1hdGlvbi9sYXRlc3QvVXNlckd1aWRlL2F3cy1wcm9wZXJ0aWVzLWVrcy1ub2RlZ3JvdXAtcmVtb3RlYWNjZXNzLmh0bWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBOb2RlZ3JvdXBSZW1vdGVBY2Nlc3Mge1xuICAvKipcbiAgICogVGhlIEFtYXpvbiBFQzIgU1NIIGtleSB0aGF0IHByb3ZpZGVzIGFjY2VzcyBmb3IgU1NIIGNvbW11bmljYXRpb24gd2l0aCB0aGUgd29ya2VyIG5vZGVzIGluIHRoZSBtYW5hZ2VkIG5vZGUgZ3JvdXAuXG4gICAqL1xuICByZWFkb25seSBzc2hLZXlOYW1lOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgc2VjdXJpdHkgZ3JvdXBzIHRoYXQgYXJlIGFsbG93ZWQgU1NIIGFjY2VzcyAocG9ydCAyMikgdG8gdGhlIHdvcmtlciBub2Rlcy4gSWYgeW91IHNwZWNpZnkgYW4gQW1hem9uIEVDMiBTU0hcbiAgICoga2V5IGJ1dCBkbyBub3Qgc3BlY2lmeSBhIHNvdXJjZSBzZWN1cml0eSBncm91cCB3aGVuIHlvdSBjcmVhdGUgYSBtYW5hZ2VkIG5vZGUgZ3JvdXAsIHRoZW4gcG9ydCAyMiBvbiB0aGUgd29ya2VyXG4gICAqIG5vZGVzIGlzIG9wZW5lZCB0byB0aGUgaW50ZXJuZXQgKDAuMC4wLjAvMCkuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gcG9ydCAyMiBvbiB0aGUgd29ya2VyIG5vZGVzIGlzIG9wZW5lZCB0byB0aGUgaW50ZXJuZXQgKDAuMC4wLjAvMClcbiAgICovXG4gIHJlYWRvbmx5IHNvdXJjZVNlY3VyaXR5R3JvdXBzPzogSVNlY3VyaXR5R3JvdXBbXTtcbn1cblxuLyoqXG4gKiBMYXVuY2ggdGVtcGxhdGUgcHJvcGVydHkgc3BlY2lmaWNhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIExhdW5jaFRlbXBsYXRlU3BlYyB7XG4gIC8qKlxuICAgKiBUaGUgTGF1bmNoIHRlbXBsYXRlIElEXG4gICAqL1xuICByZWFkb25seSBpZDogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIGxhdW5jaCB0ZW1wbGF0ZSB2ZXJzaW9uIHRvIGJlIHVzZWQgKG9wdGlvbmFsKS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSB0aGUgZGVmYXVsdCB2ZXJzaW9uIG9mIHRoZSBsYXVuY2ggdGVtcGxhdGVcbiAgICovXG4gIHJlYWRvbmx5IHZlcnNpb24/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogRWZmZWN0IHR5cGVzIG9mIGt1YmVybmV0ZXMgbm9kZSB0YWludC5cbiAqXG4gKiBOb3RlOiBUaGVzZSB2YWx1ZXMgYXJlIHNwZWNpZmljYWxseSBmb3IgQVdTIEVLUyBOb2RlR3JvdXBzIGFuZCB1c2UgdGhlIEFXUyBBUEkgZm9ybWF0LlxuICogV2hlbiB1c2luZyBBV1MgQ0xJIG9yIEFQSSwgdGFpbnQgZWZmZWN0cyBtdXN0IGJlIE5PX1NDSEVEVUxFLCBQUkVGRVJfTk9fU0NIRURVTEUsIG9yIE5PX0VYRUNVVEUuXG4gKiBXaGVuIHVzaW5nIEt1YmVybmV0ZXMgZGlyZWN0bHkgb3Iga3ViZWN0bCwgdGFpbnQgZWZmZWN0cyBtdXN0IGJlIE5vU2NoZWR1bGUsIFByZWZlck5vU2NoZWR1bGUsIG9yIE5vRXhlY3V0ZS5cbiAqXG4gKiBGb3IgS3ViZXJuZXRlcyBtYW5pZmVzdHMgKGxpa2UgS2FycGVudGVyIE5vZGVQb29scyksIHVzZSBzdHJpbmcgbGl0ZXJhbHMgd2l0aCBQYXNjYWxDYXNlIGZvcm1hdDpcbiAqIC0gJ05vU2NoZWR1bGUnIGluc3RlYWQgb2YgVGFpbnRFZmZlY3QuTk9fU0NIRURVTEVcbiAqIC0gJ1ByZWZlck5vU2NoZWR1bGUnIGluc3RlYWQgb2YgVGFpbnRFZmZlY3QuUFJFRkVSX05PX1NDSEVEVUxFXG4gKiAtICdOb0V4ZWN1dGUnIGluc3RlYWQgb2YgVGFpbnRFZmZlY3QuTk9fRVhFQ1VURVxuICpcbiAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2Vrcy9sYXRlc3QvdXNlcmd1aWRlL25vZGUtdGFpbnRzLW1hbmFnZWQtbm9kZS1ncm91cHMuaHRtbFxuICovXG5leHBvcnQgZW51bSBUYWludEVmZmVjdCB7XG4gIC8qKlxuICAgKiBOb1NjaGVkdWxlXG4gICAqL1xuICBOT19TQ0hFRFVMRSA9ICdOT19TQ0hFRFVMRScsXG4gIC8qKlxuICAgKiBQcmVmZXJOb1NjaGVkdWxlXG4gICAqL1xuICBQUkVGRVJfTk9fU0NIRURVTEUgPSAnUFJFRkVSX05PX1NDSEVEVUxFJyxcbiAgLyoqXG4gICAqIE5vRXhlY3V0ZVxuICAgKi9cbiAgTk9fRVhFQ1VURSA9ICdOT19FWEVDVVRFJyxcbn1cblxuLyoqXG4gKiBUYWludCBpbnRlcmZhY2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUYWludFNwZWMge1xuICAvKipcbiAgICogRWZmZWN0IHR5cGVcbiAgICpcbiAgICogQGRlZmF1bHQgLSBOb25lXG4gICAqL1xuICByZWFkb25seSBlZmZlY3Q/OiBUYWludEVmZmVjdDtcbiAgLyoqXG4gICAqIFRhaW50IGtleVxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE5vbmVcbiAgICovXG4gIHJlYWRvbmx5IGtleT86IHN0cmluZztcbiAgLyoqXG4gICAqIFRhaW50IHZhbHVlXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gTm9uZVxuICAgKi9cbiAgcmVhZG9ubHkgdmFsdWU/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIE5vZGVncm91cCBPcHRpb25zIGZvciBhZGROb2RlR3JvdXAoKSBtZXRob2RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBOb2RlZ3JvdXBPcHRpb25zIHtcbiAgLyoqXG4gICAqIE5hbWUgb2YgdGhlIE5vZGVncm91cFxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHJlc291cmNlIElEXG4gICAqL1xuICByZWFkb25seSBub2RlZ3JvdXBOYW1lPzogc3RyaW5nO1xuICAvKipcbiAgICogVGhlIHN1Ym5ldHMgdG8gdXNlIGZvciB0aGUgQXV0byBTY2FsaW5nIGdyb3VwIHRoYXQgaXMgY3JlYXRlZCBmb3IgeW91ciBub2RlIGdyb3VwLiBCeSBzcGVjaWZ5aW5nIHRoZVxuICAgKiBTdWJuZXRTZWxlY3Rpb24sIHRoZSBzZWxlY3RlZCBzdWJuZXRzIHdpbGwgYXV0b21hdGljYWxseSBhcHBseSByZXF1aXJlZCB0YWdzIGkuZS5cbiAgICogYGt1YmVybmV0ZXMuaW8vY2x1c3Rlci9DTFVTVEVSX05BTUVgIHdpdGggYSB2YWx1ZSBvZiBgc2hhcmVkYCwgd2hlcmUgYENMVVNURVJfTkFNRWAgaXMgcmVwbGFjZWQgd2l0aFxuICAgKiB0aGUgbmFtZSBvZiB5b3VyIGNsdXN0ZXIuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gcHJpdmF0ZSBzdWJuZXRzXG4gICAqL1xuICByZWFkb25seSBzdWJuZXRzPzogU3VibmV0U2VsZWN0aW9uO1xuICAvKipcbiAgICogVGhlIEFNSSB0eXBlIGZvciB5b3VyIG5vZGUgZ3JvdXAuIElmIHlvdSBleHBsaWNpdGx5IHNwZWNpZnkgdGhlIGxhdW5jaFRlbXBsYXRlIHdpdGggY3VzdG9tIEFNSSwgZG8gbm90IHNwZWNpZnkgdGhpcyBwcm9wZXJ0eSwgb3JcbiAgICogdGhlIG5vZGUgZ3JvdXAgZGVwbG95bWVudCB3aWxsIGZhaWwuIEluIG90aGVyIGNhc2VzLCB5b3Ugd2lsbCBuZWVkIHRvIHNwZWNpZnkgY29ycmVjdCBhbWlUeXBlIGZvciB0aGUgbm9kZWdyb3VwLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGF1dG8tZGV0ZXJtaW5lZCBmcm9tIHRoZSBpbnN0YW5jZVR5cGVzIHByb3BlcnR5IHdoZW4gbGF1bmNoVGVtcGxhdGVTcGVjIHByb3BlcnR5IGlzIG5vdCBzcGVjaWZpZWRcbiAgICovXG4gIHJlYWRvbmx5IGFtaVR5cGU/OiBOb2RlZ3JvdXBBbWlUeXBlO1xuICAvKipcbiAgICogVGhlIHJvb3QgZGV2aWNlIGRpc2sgc2l6ZSAoaW4gR2lCKSBmb3IgeW91ciBub2RlIGdyb3VwIGluc3RhbmNlcy5cbiAgICpcbiAgICogQGRlZmF1bHQgMjBcbiAgICovXG4gIHJlYWRvbmx5IGRpc2tTaXplPzogbnVtYmVyO1xuICAvKipcbiAgICogVGhlIGN1cnJlbnQgbnVtYmVyIG9mIHdvcmtlciBub2RlcyB0aGF0IHRoZSBtYW5hZ2VkIG5vZG