From e657911f3507b0cc282ad1bd976341f35b36dc67 Mon Sep 17 00:00:00 2001 From: shapirov103 Date: Wed, 11 Jan 2023 22:59:55 -0500 Subject: [PATCH] resolves #560, fixing jupyter hub failure --- examples/blueprint-construct/index.ts | 27 +++++++++++--------- lib/addons/ack/index.ts | 2 +- lib/addons/cert-manager/index.ts | 2 +- lib/addons/efs-csi-driver/index.ts | 2 +- lib/addons/external-dns/index.ts | 2 +- lib/addons/jupyterhub/index.ts | 2 +- lib/addons/kube-state-metrics/index.ts | 2 +- lib/addons/prometheus-node-exporter/index.ts | 2 +- lib/spi/types.ts | 27 ++++++++++++++++++-- lib/stacks/eks-blueprint-stack.ts | 10 ++++---- lib/utils/addon-utils.ts | 4 +-- lib/utils/log-utils.ts | 3 ++- 12 files changed, 56 insertions(+), 29 deletions(-) diff --git a/examples/blueprint-construct/index.ts b/examples/blueprint-construct/index.ts index 0d7ad2ee6..b520e0e5e 100644 --- a/examples/blueprint-construct/index.ts +++ b/examples/blueprint-construct/index.ts @@ -22,7 +22,7 @@ export interface BlueprintConstructProps { export default class BlueprintConstruct { constructor(scope: Construct, props: cdk.StackProps) { - HelmAddOn.validateHelmVersions = true; + HelmAddOn.validateHelmVersions = false; HelmAddOn.failOnVersionValidation = false; // TODO: fix IAM user provisioning for admin user @@ -134,15 +134,16 @@ export default class BlueprintConstruct { irsaRoles: ["CloudWatchFullAccess", "AmazonSQSFullAccess"] }), new blueprints.addons.AWSPrivateCAIssuerAddon(), - // new blueprints.addons.JupyterHubAddOn({ - // efsConfig: { - // pvcName: "efs-persist", - // removalPolicy: cdk.RemovalPolicy.DESTROY, - // capacity: '10Gi', - // }, - // enableIngress: false, - // notebookStack: 'jupyter/datascience-notebook', - // }), + new blueprints.addons.JupyterHubAddOn({ + efsConfig: { + pvcName: "efs-persist", + removalPolicy: cdk.RemovalPolicy.DESTROY, + capacity: '10Gi', + }, + enableIngress: false, + notebookStack: 'jupyter/datascience-notebook', + values: { prePuller: { hook: { enabled: false }}} + }), new blueprints.EmrEksAddOn() ]; @@ -163,9 +164,10 @@ export default class BlueprintConstruct { { id: "mng1", amiType: NodegroupAmiType.AL2_X86_64, - instanceTypes: [new ec2.InstanceType('m5.2xlarge')], + instanceTypes: [new ec2.InstanceType('m5.4xlarge')], diskSize: 25, - desiredSize: 3, + desiredSize: 2, + maxSize: 3, nodeGroupSubnets: { subnetType: ec2.SubnetType.PRIVATE_WITH_EGRESS } }, { @@ -173,6 +175,7 @@ export default class BlueprintConstruct { instanceTypes: [new ec2.InstanceType('t3.large')], nodeGroupCapacityType: CapacityType.SPOT, desiredSize: 0, + minSize: 0, customAmi: { machineImage: ec2.MachineImage.genericLinux({ 'us-east-1': 'ami-08e520f5673ee0894', diff --git a/lib/addons/ack/index.ts b/lib/addons/ack/index.ts index 6338061af..d623d6a77 100644 --- a/lib/addons/ack/index.ts +++ b/lib/addons/ack/index.ts @@ -51,7 +51,7 @@ const defaultProps: AckAddOnProps = { /** * Main class to instantiate the Helm chart */ -@Reflect.metadata("strictOrder", true) +@Reflect.metadata("ordered", true) export class AckAddOn extends HelmAddOn { readonly options: AckAddOnProps; diff --git a/lib/addons/cert-manager/index.ts b/lib/addons/cert-manager/index.ts index 52338b008..06ecfcca6 100644 --- a/lib/addons/cert-manager/index.ts +++ b/lib/addons/cert-manager/index.ts @@ -26,7 +26,7 @@ const defaultProps: HelmAddOnProps & CertManagerAddOnProps = { name: "blueprints-cert-manager-addon", namespace: "cert-manager", chart: "cert-manager", - version: "1.10.1", + version: "1.11.0", release: "cert-manager", repository: "https://charts.jetstack.io", values: {}, diff --git a/lib/addons/efs-csi-driver/index.ts b/lib/addons/efs-csi-driver/index.ts index de787106a..6115bc75e 100644 --- a/lib/addons/efs-csi-driver/index.ts +++ b/lib/addons/efs-csi-driver/index.ts @@ -32,7 +32,7 @@ export interface EfsCsiDriverProps extends HelmAddOnUserProps { * Defaults options for the add-on */ const defaultProps: EfsCsiDriverProps = { - version: '2.3.5', + version: '2.3.6', namespace: "kube-system", repository: "https://kubernetes-sigs.github.io/aws-efs-csi-driver/", name: EFS_CSI_DRIVER, diff --git a/lib/addons/external-dns/index.ts b/lib/addons/external-dns/index.ts index 1f174381a..ae8ea0430 100644 --- a/lib/addons/external-dns/index.ts +++ b/lib/addons/external-dns/index.ts @@ -24,7 +24,7 @@ const defaultProps = { namespace: 'external-dns', repository: 'https://charts.bitnami.com/bitnami', release: 'blueprints-addon-external-dns', - version: '6.12.3', + version: '6.13.0', values: {}, }; diff --git a/lib/addons/jupyterhub/index.ts b/lib/addons/jupyterhub/index.ts index e8157faf2..d77207df5 100644 --- a/lib/addons/jupyterhub/index.ts +++ b/lib/addons/jupyterhub/index.ts @@ -192,7 +192,7 @@ export class JupyterHubAddOn extends HelmAddOn { } // Create Helm Chart - const jupyterHubChart = this.addHelmChart(clusterInfo, values, false, true); + const jupyterHubChart = this.addHelmChart(clusterInfo, values, false, false); // Add dependency jupyterHubChart.node.addDependency(ns); diff --git a/lib/addons/kube-state-metrics/index.ts b/lib/addons/kube-state-metrics/index.ts index f2c8f0993..e5d6da13c 100644 --- a/lib/addons/kube-state-metrics/index.ts +++ b/lib/addons/kube-state-metrics/index.ts @@ -21,7 +21,7 @@ const defaultProps: HelmAddOnProps & KubeStateMetricsAddOnProps = { name: "kube-state-metrics", namespace: "kube-system", chart: "kube-state-metrics", - version: "4.27.0", + version: "4.28.0", release: "kube-state-metrics", repository: "https://prometheus-community.github.io/helm-charts", values: {}, diff --git a/lib/addons/prometheus-node-exporter/index.ts b/lib/addons/prometheus-node-exporter/index.ts index 1439d143d..87f1da21e 100644 --- a/lib/addons/prometheus-node-exporter/index.ts +++ b/lib/addons/prometheus-node-exporter/index.ts @@ -21,7 +21,7 @@ const defaultProps: HelmAddOnProps & PrometheusNodeExporterAddOnProps = { name: "prometheus-node-exporter", namespace: "prometheus-node-exporter", chart: "prometheus-node-exporter", - version: "4.9.0", + version: "4.12.0", release: "prometheus-node-exporter", repository: "https://prometheus-community.github.io/helm-charts", values: {}, diff --git a/lib/spi/types.ts b/lib/spi/types.ts index 6a683a999..22d37518d 100644 --- a/lib/spi/types.ts +++ b/lib/spi/types.ts @@ -5,6 +5,7 @@ import { Cluster, KubernetesVersion, Nodegroup } from 'aws-cdk-lib/aws-eks'; import { Construct } from 'constructs'; import { ResourceProvider } from '.'; import { EksBlueprintProps } from '../stacks'; +import { logger } from "../utils/log-utils"; /** * Data type defining helm repositories for GitOps bootstrapping. @@ -121,6 +122,7 @@ export class ClusterInfo { private readonly provisionedAddOns: Map; private readonly scheduledAddOns: Map>; + private readonly orderedAddOns: string[]; private resourceContext: ResourceContext; /** @@ -132,6 +134,7 @@ export class ClusterInfo { this.cluster = cluster; this.provisionedAddOns = new Map(); this.scheduledAddOns = new Map>(); + this.orderedAddOns = []; } /** @@ -156,6 +159,12 @@ export class ClusterInfo { * @param construct */ public addProvisionedAddOn(addOn: string, construct: Construct) { + if(this.isOrderedAddOn(addOn) && this.provisionedAddOns.size > 0){ + const prev : Construct = Array.from(this.provisionedAddOns.values()).pop()!; + construct.node.addDependency(prev); + const prevAddOn = Array.from(this.provisionedAddOns.keys()).pop()!; + logger.debug(`Adding dependency from ${addOn} to ${prevAddOn}`); + } this.provisionedAddOns.set(addOn, construct); } @@ -172,7 +181,7 @@ export class ClusterInfo { * Returns all provisioned addons * @returns scheduledAddOns: Map */ - public getAllProvisionedAddons(): Map { + public getAllProvisionedAddons(): Map { return this.provisionedAddOns; } @@ -181,11 +190,25 @@ export class ClusterInfo { * of the addon being provisioned * @param addOn * @param promise + * @param ordered if addon depends on previous addons for completion (runs serially) */ - public addScheduledAddOn(addOn: string, promise: Promise) { + public addScheduledAddOn(addOn: string, promise: Promise, ordered: boolean) { this.scheduledAddOns.set(addOn, promise); + if(ordered) { + this.orderedAddOns.push(addOn); + } } + /** + * Indicates if strict ordering is applied to the addon + * @param addOn addOn key + * @returns + */ + public isOrderedAddOn(addOn: string) { + return this.orderedAddOns.includes(addOn); + } + + /** * Returns the promise for the Addon construct * @param addOn diff --git a/lib/stacks/eks-blueprint-stack.ts b/lib/stacks/eks-blueprint-stack.ts index 8cf42c00f..9564e7de0 100644 --- a/lib/stacks/eks-blueprint-stack.ts +++ b/lib/stacks/eks-blueprint-stack.ts @@ -6,7 +6,7 @@ import { MngClusterProvider } from '../cluster-providers/mng-cluster-provider'; import { VpcProvider } from '../resource-providers/vpc'; import * as spi from '../spi'; import * as constraints from '../utils/constraints-utils'; -import { getAddOnNameOrId, setupClusterLogging, withUsageTracking } from '../utils'; +import * as utils from '../utils'; import { cloneDeep } from '../utils'; import { IKey } from "aws-cdk-lib/aws-kms"; import {KmsKeyProvider} from "../resource-providers/kms-key"; @@ -208,7 +208,7 @@ export class EksBlueprint extends cdk.Stack { } constructor(scope: Construct, blueprintProps: EksBlueprintProps, props?: cdk.StackProps) { - super(scope, blueprintProps.id, withUsageTracking(EksBlueprint.USAGE_ID, props)); + super(scope, blueprintProps.id, utils.withUsageTracking(EksBlueprint.USAGE_ID, props)); this.validateInput(blueprintProps); const resourceContext = this.provideNamedResources(blueprintProps); @@ -236,7 +236,7 @@ export class EksBlueprint extends cdk.Stack { let enableLogTypes: string[] | undefined = blueprintProps.enableControlPlaneLogTypes; if (enableLogTypes) { - setupClusterLogging(this.clusterInfo.cluster.stack, this.clusterInfo.cluster, enableLogTypes); + utils.setupClusterLogging(this.clusterInfo.cluster.stack, this.clusterInfo.cluster, enableLogTypes); } const postDeploymentSteps = Array(); @@ -244,8 +244,8 @@ export class EksBlueprint extends cdk.Stack { for (let addOn of (blueprintProps.addOns ?? [])) { // must iterate in the strict order const result = addOn.deploy(this.clusterInfo); if (result) { - const addOnKey = getAddOnNameOrId(addOn); - this.clusterInfo.addScheduledAddOn(addOnKey, result); + const addOnKey = utils.getAddOnNameOrId(addOn); + this.clusterInfo.addScheduledAddOn(addOnKey, result, utils.isOrderedAddOn(addOn)); } const postDeploy: any = addOn; if ((postDeploy as spi.ClusterPostDeploy).postDeploy !== undefined) { diff --git a/lib/utils/addon-utils.ts b/lib/utils/addon-utils.ts index f6ade47b5..b74855e13 100644 --- a/lib/utils/addon-utils.ts +++ b/lib/utils/addon-utils.ts @@ -12,8 +12,8 @@ export function getAddOnNameOrId(addOn: ClusterAddOn): string { return addOn.id ?? addOn.constructor.name; } -export function isStrictOrder(addOn: ClusterAddOn) : boolean { - return Reflect.getMetadata("strictOrder", addOn) ?? false; +export function isOrderedAddOn(addOn: ClusterAddOn) : boolean { + return Reflect.getMetadata("ordered", addOn.constructor) ?? false; } /** * Decorator function that accepts a list of AddOns and diff --git a/lib/utils/log-utils.ts b/lib/utils/log-utils.ts index 28bd9c545..6155e032a 100644 --- a/lib/utils/log-utils.ts +++ b/lib/utils/log-utils.ts @@ -22,5 +22,6 @@ export const logger = new Logger({ colorizePrettyLogs: true, displayLogLevel: true, name: "main", - overwriteConsole: true + overwriteConsole: true, + minLevel: "info" }); \ No newline at end of file