integ/lib/thinkbox-docker-image-overrides.ts (71 lines of code) (raw):
/**
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0
*/
import { Repository } from 'aws-cdk-lib/aws-ecr';
import { ContainerImage } from 'aws-cdk-lib/aws-ecs';
import {
RenderQueueImages,
ThinkboxManagedDeadlineDockerRecipes as Recipes,
UsageBasedLicensingImages,
} from 'aws-rfdk/deadline';
import { Construct } from 'constructs';
type DeadlineDockerImageOverrides = {[key in Recipes]?: string};
/**
* Interface for Docker image overrides stored in an ECR repository.
*/
interface IECRImageOverrides {
/**
* The ARN of the ECR repository.
*/
readonly repositoryArn: string;
/**
* A mapping of Deadline Docker recipe names (see ThinkboxManagedDeadlineDockerRecipes in aws-rfdk) to tags of the override Docker images
*/
readonly imageOverrides: DeadlineDockerImageOverrides;
}
/**
* Implementation of {@link IECRImageOverrides}.
*/
class ECRImageOverrides implements IECRImageOverrides {
/**
* Creates an {@link ECRImageOverrides} from a JSON string.
* @param json The JSON string.
*/
public static fromJSON(json: string): ECRImageOverrides {
const obj = JSON.parse(json);
// Validate the input JSON
const errors = [];
[
'repositoryArn',
'imageOverrides',
].forEach(prop => {
if (!(prop in obj)) {
errors.push(`Property ${prop} was expected but not found in ${obj}`);
}
});
if (!(obj.imageOverrides instanceof Object)) {
errors.push(`Expected Object for imageOverrides but found ${typeof(obj.imageOverrides)}`);
}
Object.keys(obj.imageOverrides).forEach(key => {
if (!Object.values(Recipes).includes(key as Recipes)) {
errors.push(`Key ${key} in imageOverrides is invalid. Must be in: [${Object.values(Recipes)}].`);
}
});
if (errors.length > 0) {
throw new Error(`Invalid JSON for ECRImageOverrides: ${errors.join('\n')}`);
}
return obj as ECRImageOverrides;
}
/**
* @inheritdoc
*/
public readonly repositoryArn: string;
/**
* @inheritdoc
*/
public readonly imageOverrides: DeadlineDockerImageOverrides;
constructor(props: {repositoryArn: string, imageOverrides: DeadlineDockerImageOverrides}) {
this.repositoryArn = props.repositoryArn;
this.imageOverrides = props.imageOverrides;
}
}
/**
* Properties for {@link ThinkboxDockerImageOverrides}.
*/
export interface ThinkboxDockerImageOverridesProps {
/**
* The {@link RenderQueueImages} override.
*/
readonly renderQueueImages?: RenderQueueImages;
/**
* The {@link UsageBasedLicensingImages} override.
*/
readonly ublImages?: UsageBasedLicensingImages;
}
/**
* Contains overrides for Thinkbox Docker images used in the RFDK.
*/
export class ThinkboxDockerImageOverrides {
/**
* Creates a {@link ThinkboxDockerImageOverrides} from a JSON string. The JSON string must contain the fields in {@link IECRImageOverrides}.
*/
public static fromJSON(scope: Construct, id: string, json: string): ThinkboxDockerImageOverrides {
const overrides: IECRImageOverrides = ECRImageOverrides.fromJSON(json);
const repository = Repository.fromRepositoryArn(scope, `${id}Repository`, overrides.repositoryArn);
return new ThinkboxDockerImageOverrides({
renderQueueImages: Recipes.REMOTE_CONNECTION_SERVER in overrides.imageOverrides ?
{
remoteConnectionServer: ContainerImage.fromEcrRepository(repository, overrides.imageOverrides[Recipes.REMOTE_CONNECTION_SERVER]),
} : undefined,
ublImages: Recipes.LICENSE_FORWARDER in overrides.imageOverrides ?
{
licenseForwarder: ContainerImage.fromEcrRepository(repository, overrides.imageOverrides[Recipes.LICENSE_FORWARDER]),
} : undefined,
});
}
/**
* The {@link RenderQueueImages} override.
*/
public readonly renderQueueImages?: RenderQueueImages;
/**
* The {@link UsageBasedLicensingImages} override.
*/
public readonly ublImages?: UsageBasedLicensingImages;
constructor(props: ThinkboxDockerImageOverridesProps) {
this.renderQueueImages = props.renderQueueImages;
this.ublImages = props.ublImages;
}
}