@@ -30,16 +30,70 @@ export interface GetContextKeyOptions {
30
30
*/
31
31
export interface GetContextValueOptions extends GetContextKeyOptions {
32
32
/**
33
- * The value to return if the context value was not found and a missing
34
- * context is reported.
33
+ * The value to return if the lookup has not yet been performed.
34
+ *
35
+ * Upon first synthesis, the lookups has not yet been performed. The
36
+ * `getValue()` operation returns this value instead, so that synthesis can
37
+ * proceed. After synthesis completes the first time, the actual lookup will
38
+ * be performed and synthesis will run again with the *real* value.
39
+ *
40
+ * Dummy values should preferably have valid shapes so that downstream
41
+ * consumers of lookup values don't throw validation exceptions if they
42
+ * encounter a dummy value (or all possible downstream consumers need to
43
+ * effectively check for the well-known shape of the dummy value); throwing an
44
+ * exception would error out the synthesis operation and prevent the lookup
45
+ * and the second, real, synthesis from happening.
46
+ *
47
+ * ## Connection to mustExist
48
+ *
49
+ * `dummyValue` is also used as the official value to return if the lookup has
50
+ * failed and `mustExist == false`.
35
51
*/
36
52
readonly dummyValue : any ;
37
53
38
54
/**
39
- * When True, the context provider will not throw an error if missing context
40
- * is reported
55
+ * Whether the resource must exist
56
+ *
57
+ * If this is set (the default), the query fails if the value or resource we
58
+ * tried to look up doesn't exist.
59
+ *
60
+ * If this is `false` and the value we tried to look up could not be found, the
61
+ * failure is suppressed and `dummyValue` is officially returned instead.
62
+ *
63
+ * When this happens, `dummyValue` is encoded into cached context and it will
64
+ * never be refreshed anymore until the user runs `cdk context --reset <key>`.
65
+ *
66
+ * Note that it is not possible for the CDK app code to make a distinction
67
+ * between "the lookup has not been performed yet" and "the lookup didn't
68
+ * find anything and we returned a default value instead".
69
+ *
70
+ * ## Context providers
71
+ *
72
+ * This feature must explicitly be supported by context providers. It is
73
+ * currently supported by:
74
+ *
75
+ * - KMS key provider
76
+ * - SSM parameter provider
77
+ *
78
+ * ## Note to implementors
79
+ *
80
+ * The dummy value should not be returned for all SDK lookup failures. For
81
+ * example, "no network" or "no credentials" or "malformed query" should
82
+ * not lead to the dummy value being returned. Only the case of "no such
83
+ * resource" should.
84
+ *
85
+ * @default true
86
+ */
87
+ readonly mustExist ?: boolean ;
88
+
89
+ /**
90
+ * Ignore a lookup failure and return the `dummyValue` instead
91
+ *
92
+ * `mustExist` is the recommended alias for this deprecated
93
+ * property (note that its value is reversed).
41
94
*
42
95
* @default false
96
+ * @deprecated Use mustExist instead
43
97
*/
44
98
readonly ignoreErrorOnMissingContext ?: boolean ;
45
99
}
@@ -92,6 +146,10 @@ export class ContextProvider {
92
146
}
93
147
94
148
public static getValue ( scope : Construct , options : GetContextValueOptions ) : GetContextValueResult {
149
+ if ( ( options . mustExist !== undefined ) && ( options . ignoreErrorOnMissingContext !== undefined ) ) {
150
+ throw new Error ( 'Only supply one of \'mustExist\' and \'ignoreErrorOnMissingContext\'' ) ;
151
+ }
152
+
95
153
const stack = Stack . of ( scope ) ;
96
154
97
155
if ( Token . isUnresolved ( stack . account ) || Token . isUnresolved ( stack . region ) ) {
@@ -108,10 +166,19 @@ export class ContextProvider {
108
166
// if context is missing or an error occurred during context retrieval,
109
167
// report and return a dummy value.
110
168
if ( value === undefined || providerError !== undefined ) {
169
+ // Render 'ignoreErrorOnMissingContext' iff one of the parameters is supplied.
170
+ const ignoreErrorOnMissingContext = options . mustExist !== undefined || options . ignoreErrorOnMissingContext !== undefined
171
+ ? ( options . mustExist !== undefined ? ! options . mustExist : options . ignoreErrorOnMissingContext )
172
+ : undefined ;
173
+
111
174
// build a version of the props which includes the dummyValue and ignoreError flag
112
175
const extendedProps : { [ p : string ] : any } = {
113
176
dummyValue : options . dummyValue ,
114
- ignoreErrorOnMissingContext : options . ignoreErrorOnMissingContext ,
177
+
178
+ // Even though we renamed the user-facing property, the field in the
179
+ // cloud assembly still has the original name, which is somewhat wrong
180
+ // because it's not about missing context.
181
+ ignoreErrorOnMissingContext,
115
182
...props ,
116
183
} ;
117
184
0 commit comments