/
parameter-group.ts
108 lines (96 loc) · 3.03 KB
/
parameter-group.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
import { IResource, Resource } from 'aws-cdk-lib/core';
import { Construct } from 'constructs';
import { CfnClusterParameterGroup } from 'aws-cdk-lib/aws-redshift';
/**
* A parameter group
*/
export interface IClusterParameterGroup extends IResource {
/**
* The name of this parameter group
*
* @attribute
*/
readonly clusterParameterGroupName: string;
}
/**
* A new cluster or instance parameter group
*/
abstract class ClusterParameterGroupBase extends Resource implements IClusterParameterGroup {
/**
* The name of the parameter group
*/
public abstract readonly clusterParameterGroupName: string;
}
/**
* Properties for a parameter group
*/
export interface ClusterParameterGroupProps {
/**
* Description for this parameter group
*
* @default a CDK generated description
*/
readonly description?: string;
/**
* The parameters in this parameter group
*/
readonly parameters: { [name: string]: string };
}
/**
* A cluster parameter group
*
* @resource AWS::Redshift::ClusterParameterGroup
*/
export class ClusterParameterGroup extends ClusterParameterGroupBase {
/**
* Imports a parameter group
*/
public static fromClusterParameterGroupName(scope: Construct, id: string, clusterParameterGroupName: string): IClusterParameterGroup {
class Import extends Resource implements IClusterParameterGroup {
public readonly clusterParameterGroupName = clusterParameterGroupName;
}
return new Import(scope, id);
}
/**
* The name of the parameter group
*/
public readonly clusterParameterGroupName: string;
/**
* The parameters in the parameter group
*/
readonly parameters: { [name: string]: string };
/**
* The underlying CfnClusterParameterGroup
*/
private readonly resource: CfnClusterParameterGroup;
constructor(scope: Construct, id: string, props: ClusterParameterGroupProps) {
super(scope, id);
this.parameters = props.parameters;
this.resource = new CfnClusterParameterGroup(this, 'Resource', {
description: props.description || 'Cluster parameter group for family redshift-1.0',
parameterGroupFamily: 'redshift-1.0',
parameters: this.parseParameters(),
});
this.clusterParameterGroupName = this.resource.ref;
}
private parseParameters(): any {
return Object.entries(this.parameters).map(([name, value]) => {
return { parameterName: name, parameterValue: value };
});
}
/**
* Adds a parameter to the parameter group
*
* @param name the parameter name
* @param value the parameter name
*/
public addParameter(name: string, value: string): void {
const existingValue = Object.entries(this.parameters).find(([key, _]) => key === name)?.[1];
if (existingValue === undefined) {
this.parameters[name] = value;
this.resource.parameters = this.parseParameters();
} else if (existingValue !== value) {
throw new Error(`The parameter group already contains the parameter "${name}", but with a different value (Given: ${value}, Existing: ${existingValue}).`);
}
}
}