@pulumi/pulumi 3.163.0-alpha.xdc88586 → 3.163.0-alpha.xffc5a7c
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/automation/cmd.js +92 -111
- package/automation/cmd.js.map +1 -1
- package/automation/localWorkspace.js +383 -476
- package/automation/localWorkspace.js.map +1 -1
- package/automation/remoteWorkspace.js +38 -55
- package/automation/remoteWorkspace.js.map +1 -1
- package/automation/server.js +6 -16
- package/automation/server.js.map +1 -1
- package/automation/stack.js +537 -608
- package/automation/stack.js.map +1 -1
- package/cmd/dynamic-provider/index.js +204 -235
- package/cmd/dynamic-provider/index.js.map +1 -1
- package/cmd/run/error.js +3 -3
- package/cmd/run/error.js.map +1 -1
- package/cmd/run/run.js +322 -336
- package/cmd/run/run.js.map +1 -1
- package/cmd/run/tracing.js +1 -2
- package/cmd/run/tracing.js.map +1 -1
- package/cmd/run-plugin/run.js +13 -17
- package/cmd/run-plugin/run.js.map +1 -1
- package/cmd/run-policy-pack/run.js +12 -16
- package/cmd/run-policy-pack/run.js.map +1 -1
- package/output.js +61 -78
- package/output.js.map +1 -1
- package/package.json +1 -1
- package/provider/experimental/analyzer.js +43 -46
- package/provider/experimental/analyzer.js.map +1 -1
- package/provider/experimental/provider.js +22 -36
- package/provider/experimental/provider.js.map +1 -1
- package/provider/server.js +359 -397
- package/provider/server.js.map +1 -1
- package/resource.js +29 -41
- package/resource.js.map +1 -1
- package/runtime/asyncIterableUtil.js +6 -17
- package/runtime/asyncIterableUtil.js.map +1 -1
- package/runtime/callbacks.js +254 -269
- package/runtime/callbacks.js.map +1 -1
- package/runtime/closure/codePaths.js +117 -135
- package/runtime/closure/codePaths.js.map +1 -1
- package/runtime/closure/createClosure.js +807 -871
- package/runtime/closure/createClosure.js.map +1 -1
- package/runtime/closure/parseFunction.js +2 -3
- package/runtime/closure/parseFunction.js.map +1 -1
- package/runtime/closure/serializeClosure.js +17 -30
- package/runtime/closure/serializeClosure.js.map +1 -1
- package/runtime/closure/v8.js +166 -190
- package/runtime/closure/v8.js.map +1 -1
- package/runtime/closure/v8Hooks.js +19 -34
- package/runtime/closure/v8Hooks.js.map +1 -1
- package/runtime/dependsOn.js +61 -80
- package/runtime/dependsOn.js.map +1 -1
- package/runtime/invoke.js +155 -170
- package/runtime/invoke.js.map +1 -1
- package/runtime/mocks.js +77 -96
- package/runtime/mocks.js.map +1 -1
- package/runtime/resource.js +238 -252
- package/runtime/resource.js.map +1 -1
- package/runtime/rpc.js +193 -215
- package/runtime/rpc.js.map +1 -1
- package/runtime/settings.js +70 -87
- package/runtime/settings.js.map +1 -1
- package/runtime/stack.js +111 -131
- package/runtime/stack.js.map +1 -1
- package/stackReference.js +39 -58
- package/stackReference.js.map +1 -1
- package/tsutils.js +1 -2
- package/tsutils.js.map +1 -1
- package/utils.js +2 -3
- package/utils.js.map +1 -1
- package/version.js +1 -1
package/provider/server.js
CHANGED
|
@@ -12,15 +12,6 @@
|
|
|
12
12
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
13
|
// See the License for the specific language governing permissions and
|
|
14
14
|
// limitations under the License.
|
|
15
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
16
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
17
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
18
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
19
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
20
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
21
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
22
|
-
});
|
|
23
|
-
};
|
|
24
15
|
var __importStar = (this && this.__importStar) || function (mod) {
|
|
25
16
|
if (mod && mod.__esModule) return mod;
|
|
26
17
|
var result = {};
|
|
@@ -127,187 +118,173 @@ class Server {
|
|
|
127
118
|
resp.setAcceptoutputs(true);
|
|
128
119
|
callback(undefined, resp);
|
|
129
120
|
}
|
|
130
|
-
parameterize(call, callback) {
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
if (
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
return;
|
|
137
|
-
}
|
|
138
|
-
res = yield this.provider.parameterizeArgs(call.request.getArgs().getArgsList());
|
|
121
|
+
async parameterize(call, callback) {
|
|
122
|
+
let res = null;
|
|
123
|
+
if (call.request.hasArgs()) {
|
|
124
|
+
if (!this.provider.parameterizeArgs) {
|
|
125
|
+
callback(new Error("parameterizeArgs not implemented"), undefined);
|
|
126
|
+
return;
|
|
139
127
|
}
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
res = yield this.provider.parameterizeValue(call.request.getValue().getName(), call.request.getValue().getVersion(), Buffer.from(b64, "base64").toString("utf-8"));
|
|
128
|
+
res = await this.provider.parameterizeArgs(call.request.getArgs().getArgsList());
|
|
129
|
+
}
|
|
130
|
+
else {
|
|
131
|
+
if (!this.provider.parameterizeValue) {
|
|
132
|
+
callback(new Error("parameterizeValue not implemented"), undefined);
|
|
133
|
+
return;
|
|
147
134
|
}
|
|
148
|
-
const
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
135
|
+
const b64 = call.request.getValue().getValue_asB64();
|
|
136
|
+
res = await this.provider.parameterizeValue(call.request.getValue().getName(), call.request.getValue().getVersion(), Buffer.from(b64, "base64").toString("utf-8"));
|
|
137
|
+
}
|
|
138
|
+
const resp = new provproto.ParameterizeResponse();
|
|
139
|
+
resp.setName(res.name);
|
|
140
|
+
resp.setVersion(res.version);
|
|
141
|
+
callback(undefined, resp);
|
|
153
142
|
}
|
|
154
143
|
// CRUD resource methods
|
|
155
|
-
check(call, callback) {
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
inputs = result.inputs;
|
|
168
|
-
}
|
|
169
|
-
if (result.failures) {
|
|
170
|
-
failures = result.failures;
|
|
171
|
-
}
|
|
144
|
+
async check(call, callback) {
|
|
145
|
+
try {
|
|
146
|
+
const req = call.request;
|
|
147
|
+
const resp = new provproto.CheckResponse();
|
|
148
|
+
const olds = req.getOlds().toJavaScript();
|
|
149
|
+
const news = req.getNews().toJavaScript();
|
|
150
|
+
let inputs = news;
|
|
151
|
+
let failures = [];
|
|
152
|
+
if (this.provider.check) {
|
|
153
|
+
const result = await this.provider.check(req.getUrn(), olds, news);
|
|
154
|
+
if (result.inputs) {
|
|
155
|
+
inputs = result.inputs;
|
|
172
156
|
}
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
inputs = news;
|
|
157
|
+
if (result.failures) {
|
|
158
|
+
failures = result.failures;
|
|
176
159
|
}
|
|
177
|
-
resp.setInputs(structproto.Struct.fromJavaScript(inputs));
|
|
178
|
-
if (failures.length !== 0) {
|
|
179
|
-
const failureList = [];
|
|
180
|
-
for (const f of failures) {
|
|
181
|
-
const failure = new provproto.CheckFailure();
|
|
182
|
-
failure.setProperty(f.property);
|
|
183
|
-
failure.setReason(f.reason);
|
|
184
|
-
failureList.push(failure);
|
|
185
|
-
}
|
|
186
|
-
resp.setFailuresList(failureList);
|
|
187
|
-
}
|
|
188
|
-
callback(undefined, resp);
|
|
189
160
|
}
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
161
|
+
else {
|
|
162
|
+
// If no check method was provided, propagate the new inputs as-is.
|
|
163
|
+
inputs = news;
|
|
193
164
|
}
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
const news = req.getNews().toJavaScript();
|
|
203
|
-
if (this.provider.diff) {
|
|
204
|
-
const result = yield this.provider.diff(req.getId(), req.getUrn(), olds, news);
|
|
205
|
-
if (result.changes === true) {
|
|
206
|
-
resp.setChanges(provproto.DiffResponse.DiffChanges.DIFF_SOME);
|
|
207
|
-
}
|
|
208
|
-
else if (result.changes === false) {
|
|
209
|
-
resp.setChanges(provproto.DiffResponse.DiffChanges.DIFF_NONE);
|
|
210
|
-
}
|
|
211
|
-
else {
|
|
212
|
-
resp.setChanges(provproto.DiffResponse.DiffChanges.DIFF_UNKNOWN);
|
|
213
|
-
}
|
|
214
|
-
if (result.replaces && result.replaces.length !== 0) {
|
|
215
|
-
resp.setReplacesList(result.replaces);
|
|
216
|
-
}
|
|
217
|
-
if (result.deleteBeforeReplace) {
|
|
218
|
-
resp.setDeletebeforereplace(result.deleteBeforeReplace);
|
|
219
|
-
}
|
|
165
|
+
resp.setInputs(structproto.Struct.fromJavaScript(inputs));
|
|
166
|
+
if (failures.length !== 0) {
|
|
167
|
+
const failureList = [];
|
|
168
|
+
for (const f of failures) {
|
|
169
|
+
const failure = new provproto.CheckFailure();
|
|
170
|
+
failure.setProperty(f.property);
|
|
171
|
+
failure.setReason(f.reason);
|
|
172
|
+
failureList.push(failure);
|
|
220
173
|
}
|
|
221
|
-
|
|
222
|
-
}
|
|
223
|
-
catch (e) {
|
|
224
|
-
console.error(`${e}: ${e.stack}`);
|
|
225
|
-
callback(e, undefined);
|
|
174
|
+
resp.setFailuresList(failureList);
|
|
226
175
|
}
|
|
227
|
-
|
|
176
|
+
callback(undefined, resp);
|
|
177
|
+
}
|
|
178
|
+
catch (e) {
|
|
179
|
+
console.error(`${e}: ${e.stack}`);
|
|
180
|
+
callback(e, undefined);
|
|
181
|
+
}
|
|
228
182
|
}
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
183
|
+
async diff(call, callback) {
|
|
184
|
+
try {
|
|
185
|
+
const req = call.request;
|
|
186
|
+
const resp = new provproto.DiffResponse();
|
|
187
|
+
const olds = req.getOlds().toJavaScript();
|
|
188
|
+
const news = req.getNews().toJavaScript();
|
|
189
|
+
if (this.provider.diff) {
|
|
190
|
+
const result = await this.provider.diff(req.getId(), req.getUrn(), olds, news);
|
|
191
|
+
if (result.changes === true) {
|
|
192
|
+
resp.setChanges(provproto.DiffResponse.DiffChanges.DIFF_SOME);
|
|
236
193
|
}
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
const result = yield this.provider.create(req.getUrn(), props);
|
|
240
|
-
resp.setId(result.id);
|
|
241
|
-
resp.setProperties(structproto.Struct.fromJavaScript(result.outs));
|
|
242
|
-
callback(undefined, resp);
|
|
243
|
-
}
|
|
244
|
-
catch (e) {
|
|
245
|
-
const response = grpcResponseFromError(e);
|
|
246
|
-
return callback(/*err:*/ response, /*value:*/ null, /*metadata:*/ response.metadata);
|
|
247
|
-
}
|
|
248
|
-
});
|
|
249
|
-
}
|
|
250
|
-
read(call, callback) {
|
|
251
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
252
|
-
try {
|
|
253
|
-
const req = call.request;
|
|
254
|
-
const resp = new provproto.ReadResponse();
|
|
255
|
-
const id = req.getId();
|
|
256
|
-
const props = req.getProperties().toJavaScript();
|
|
257
|
-
if (this.provider.read) {
|
|
258
|
-
const result = yield this.provider.read(id, req.getUrn(), props);
|
|
259
|
-
resp.setId(result.id);
|
|
260
|
-
resp.setProperties(structproto.Struct.fromJavaScript(result.props));
|
|
261
|
-
resp.setInputs(result.inputs === undefined ? undefined : structproto.Struct.fromJavaScript(result.inputs));
|
|
194
|
+
else if (result.changes === false) {
|
|
195
|
+
resp.setChanges(provproto.DiffResponse.DiffChanges.DIFF_NONE);
|
|
262
196
|
}
|
|
263
197
|
else {
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
198
|
+
resp.setChanges(provproto.DiffResponse.DiffChanges.DIFF_UNKNOWN);
|
|
199
|
+
}
|
|
200
|
+
if (result.replaces && result.replaces.length !== 0) {
|
|
201
|
+
resp.setReplacesList(result.replaces);
|
|
202
|
+
}
|
|
203
|
+
if (result.deleteBeforeReplace) {
|
|
204
|
+
resp.setDeletebeforereplace(result.deleteBeforeReplace);
|
|
267
205
|
}
|
|
268
|
-
callback(undefined, resp);
|
|
269
206
|
}
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
207
|
+
callback(undefined, resp);
|
|
208
|
+
}
|
|
209
|
+
catch (e) {
|
|
210
|
+
console.error(`${e}: ${e.stack}`);
|
|
211
|
+
callback(e, undefined);
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
async create(call, callback) {
|
|
215
|
+
try {
|
|
216
|
+
const req = call.request;
|
|
217
|
+
if (!this.provider.create) {
|
|
218
|
+
callback(new Error(`unknown resource type ${req.getUrn()}`), undefined);
|
|
219
|
+
return;
|
|
273
220
|
}
|
|
274
|
-
|
|
221
|
+
const resp = new provproto.CreateResponse();
|
|
222
|
+
const props = req.getProperties().toJavaScript();
|
|
223
|
+
const result = await this.provider.create(req.getUrn(), props);
|
|
224
|
+
resp.setId(result.id);
|
|
225
|
+
resp.setProperties(structproto.Struct.fromJavaScript(result.outs));
|
|
226
|
+
callback(undefined, resp);
|
|
227
|
+
}
|
|
228
|
+
catch (e) {
|
|
229
|
+
const response = grpcResponseFromError(e);
|
|
230
|
+
return callback(/*err:*/ response, /*value:*/ null, /*metadata:*/ response.metadata);
|
|
231
|
+
}
|
|
275
232
|
}
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
resp.setProperties(structproto.Struct.fromJavaScript(result.outs));
|
|
288
|
-
callback(undefined, resp);
|
|
233
|
+
async read(call, callback) {
|
|
234
|
+
try {
|
|
235
|
+
const req = call.request;
|
|
236
|
+
const resp = new provproto.ReadResponse();
|
|
237
|
+
const id = req.getId();
|
|
238
|
+
const props = req.getProperties().toJavaScript();
|
|
239
|
+
if (this.provider.read) {
|
|
240
|
+
const result = await this.provider.read(id, req.getUrn(), props);
|
|
241
|
+
resp.setId(result.id);
|
|
242
|
+
resp.setProperties(structproto.Struct.fromJavaScript(result.props));
|
|
243
|
+
resp.setInputs(result.inputs === undefined ? undefined : structproto.Struct.fromJavaScript(result.inputs));
|
|
289
244
|
}
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
245
|
+
else {
|
|
246
|
+
// In the event of a missing read, simply return back the input state.
|
|
247
|
+
resp.setId(id);
|
|
248
|
+
resp.setProperties(req.getProperties());
|
|
293
249
|
}
|
|
294
|
-
|
|
250
|
+
callback(undefined, resp);
|
|
251
|
+
}
|
|
252
|
+
catch (e) {
|
|
253
|
+
console.error(`${e}: ${e.stack}`);
|
|
254
|
+
callback(e, undefined);
|
|
255
|
+
}
|
|
295
256
|
}
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
257
|
+
async update(call, callback) {
|
|
258
|
+
try {
|
|
259
|
+
const req = call.request;
|
|
260
|
+
const resp = new provproto.UpdateResponse();
|
|
261
|
+
const olds = req.getOlds().toJavaScript();
|
|
262
|
+
const news = req.getNews().toJavaScript();
|
|
263
|
+
let result = {};
|
|
264
|
+
if (this.provider.update) {
|
|
265
|
+
result = (await this.provider.update(req.getId(), req.getUrn(), olds, news)) || {};
|
|
305
266
|
}
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
267
|
+
resp.setProperties(structproto.Struct.fromJavaScript(result.outs));
|
|
268
|
+
callback(undefined, resp);
|
|
269
|
+
}
|
|
270
|
+
catch (e) {
|
|
271
|
+
const response = grpcResponseFromError(e);
|
|
272
|
+
return callback(/*err:*/ response, /*value:*/ null, /*metadata:*/ response.metadata);
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
async delete(call, callback) {
|
|
276
|
+
try {
|
|
277
|
+
const req = call.request;
|
|
278
|
+
const props = req.getProperties().toJavaScript();
|
|
279
|
+
if (this.provider.delete) {
|
|
280
|
+
await this.provider.delete(req.getId(), req.getUrn(), props);
|
|
309
281
|
}
|
|
310
|
-
|
|
282
|
+
callback(undefined, new emptyproto.Empty());
|
|
283
|
+
}
|
|
284
|
+
catch (e) {
|
|
285
|
+
console.error(`${e}: ${e.stack}`);
|
|
286
|
+
callback(e, undefined);
|
|
287
|
+
}
|
|
311
288
|
}
|
|
312
289
|
buildInvalidPropertiesError(message, errors) {
|
|
313
290
|
const metadata = new grpc.Metadata();
|
|
@@ -336,154 +313,103 @@ class Server {
|
|
|
336
313
|
};
|
|
337
314
|
return error;
|
|
338
315
|
}
|
|
339
|
-
construct(call, callback) {
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
return;
|
|
353
|
-
}
|
|
354
|
-
yield configureRuntime(req, this.engineAddr);
|
|
355
|
-
const inputs = yield deserializeInputs(req.getInputs(), req.getInputdependenciesMap());
|
|
356
|
-
// Rebuild the resource options.
|
|
357
|
-
const dependsOn = [];
|
|
358
|
-
for (const urn of req.getDependenciesList()) {
|
|
359
|
-
dependsOn.push(new resource.DependencyResource(urn));
|
|
360
|
-
}
|
|
361
|
-
const providers = {};
|
|
362
|
-
const rpcProviders = req.getProvidersMap();
|
|
363
|
-
if (rpcProviders) {
|
|
364
|
-
for (const [pkg, ref] of rpcProviders.entries()) {
|
|
365
|
-
providers[pkg] = createProviderResource(ref);
|
|
366
|
-
}
|
|
367
|
-
}
|
|
368
|
-
const opts = {
|
|
369
|
-
aliases: req.getAliasesList(),
|
|
370
|
-
dependsOn: dependsOn,
|
|
371
|
-
protect: req.getProtect(),
|
|
372
|
-
providers: providers,
|
|
373
|
-
parent: req.getParent() ? new resource.DependencyResource(req.getParent()) : undefined,
|
|
374
|
-
};
|
|
375
|
-
const result = yield this.provider.construct(name, type, inputs, opts);
|
|
376
|
-
const resp = new provproto.ConstructResponse();
|
|
377
|
-
resp.setUrn(yield output_1.output(result.urn).promise());
|
|
378
|
-
const [state, stateDependencies] = yield rpc.serializeResourceProperties(`construct(${type}, ${name})`, result.state);
|
|
379
|
-
const stateDependenciesMap = resp.getStatedependenciesMap();
|
|
380
|
-
for (const [key, resources] of stateDependencies) {
|
|
381
|
-
const deps = new provproto.ConstructResponse.PropertyDependencies();
|
|
382
|
-
deps.setUrnsList(yield Promise.all(Array.from(resources).map((r) => r.urn.promise())));
|
|
383
|
-
stateDependenciesMap.set(key, deps);
|
|
384
|
-
}
|
|
385
|
-
resp.setState(structproto.Struct.fromJavaScript(state));
|
|
386
|
-
// Wait for RPC operations to complete.
|
|
387
|
-
yield settings.waitForRPCs();
|
|
388
|
-
callback(undefined, resp);
|
|
389
|
-
}
|
|
390
|
-
catch (e) {
|
|
391
|
-
if (errors_1.InputPropertiesError.isInstance(e)) {
|
|
392
|
-
const error = this.buildInvalidPropertiesError(e.message, e.errors);
|
|
393
|
-
callback(error, undefined);
|
|
394
|
-
return;
|
|
395
|
-
}
|
|
396
|
-
else if (errors_1.InputPropertyError.isInstance(e)) {
|
|
397
|
-
const error = this.buildInvalidPropertiesError("", [
|
|
398
|
-
{ propertyPath: e.propertyPath, reason: e.reason },
|
|
399
|
-
]);
|
|
400
|
-
callback(error, undefined);
|
|
401
|
-
return;
|
|
402
|
-
}
|
|
403
|
-
callback(e, undefined);
|
|
316
|
+
async construct(call, callback) {
|
|
317
|
+
// Setup a new async state store for this run
|
|
318
|
+
const store = new localState.LocalStore();
|
|
319
|
+
return localState.asyncLocalStorage.run(store, async () => {
|
|
320
|
+
const callbackId = Symbol("id");
|
|
321
|
+
this._callbacks.set(callbackId, callback);
|
|
322
|
+
try {
|
|
323
|
+
const req = call.request;
|
|
324
|
+
const type = req.getType();
|
|
325
|
+
const name = req.getName();
|
|
326
|
+
if (!this.provider.construct) {
|
|
327
|
+
callback(new Error(`unknown resource type ${type}`), undefined);
|
|
328
|
+
return;
|
|
404
329
|
}
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
330
|
+
await configureRuntime(req, this.engineAddr);
|
|
331
|
+
const inputs = await deserializeInputs(req.getInputs(), req.getInputdependenciesMap());
|
|
332
|
+
// Rebuild the resource options.
|
|
333
|
+
const dependsOn = [];
|
|
334
|
+
for (const urn of req.getDependenciesList()) {
|
|
335
|
+
dependsOn.push(new resource.DependencyResource(urn));
|
|
408
336
|
}
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
// Setup a new async state store for this run
|
|
415
|
-
const store = new localState.LocalStore();
|
|
416
|
-
return localState.asyncLocalStorage.run(store, () => __awaiter(this, void 0, void 0, function* () {
|
|
417
|
-
const callbackId = Symbol("id");
|
|
418
|
-
this._callbacks.set(callbackId, callback);
|
|
419
|
-
try {
|
|
420
|
-
const req = call.request;
|
|
421
|
-
if (!this.provider.call) {
|
|
422
|
-
callback(new Error(`unknown function ${req.getTok()}`), undefined);
|
|
423
|
-
return;
|
|
424
|
-
}
|
|
425
|
-
yield configureRuntime(req, this.engineAddr);
|
|
426
|
-
const args = yield deserializeInputs(req.getArgs(), req.getArgdependenciesMap());
|
|
427
|
-
const result = yield this.provider.call(req.getTok(), args);
|
|
428
|
-
const resp = new provproto.CallResponse();
|
|
429
|
-
if (result.outputs) {
|
|
430
|
-
const [ret, retDependencies] = yield rpc.serializeResourceProperties(`call(${req.getTok()})`, result.outputs);
|
|
431
|
-
const returnDependenciesMap = resp.getReturndependenciesMap();
|
|
432
|
-
for (const [key, resources] of retDependencies) {
|
|
433
|
-
const deps = new provproto.CallResponse.ReturnDependencies();
|
|
434
|
-
deps.setUrnsList(yield Promise.all(Array.from(resources).map((r) => r.urn.promise())));
|
|
435
|
-
returnDependenciesMap.set(key, deps);
|
|
436
|
-
}
|
|
437
|
-
resp.setReturn(structproto.Struct.fromJavaScript(ret));
|
|
337
|
+
const providers = {};
|
|
338
|
+
const rpcProviders = req.getProvidersMap();
|
|
339
|
+
if (rpcProviders) {
|
|
340
|
+
for (const [pkg, ref] of rpcProviders.entries()) {
|
|
341
|
+
providers[pkg] = createProviderResource(ref);
|
|
438
342
|
}
|
|
439
|
-
if ((result.failures || []).length !== 0) {
|
|
440
|
-
const failureList = [];
|
|
441
|
-
for (const f of result.failures) {
|
|
442
|
-
const failure = new provproto.CheckFailure();
|
|
443
|
-
failure.setProperty(f.property);
|
|
444
|
-
failure.setReason(f.reason);
|
|
445
|
-
failureList.push(failure);
|
|
446
|
-
}
|
|
447
|
-
resp.setFailuresList(failureList);
|
|
448
|
-
}
|
|
449
|
-
// Wait for RPC operations to complete.
|
|
450
|
-
yield settings.waitForRPCs();
|
|
451
|
-
callback(undefined, resp);
|
|
452
343
|
}
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
344
|
+
const opts = {
|
|
345
|
+
aliases: req.getAliasesList(),
|
|
346
|
+
dependsOn: dependsOn,
|
|
347
|
+
protect: req.getProtect(),
|
|
348
|
+
providers: providers,
|
|
349
|
+
parent: req.getParent() ? new resource.DependencyResource(req.getParent()) : undefined,
|
|
350
|
+
};
|
|
351
|
+
const result = await this.provider.construct(name, type, inputs, opts);
|
|
352
|
+
const resp = new provproto.ConstructResponse();
|
|
353
|
+
resp.setUrn(await output_1.output(result.urn).promise());
|
|
354
|
+
const [state, stateDependencies] = await rpc.serializeResourceProperties(`construct(${type}, ${name})`, result.state);
|
|
355
|
+
const stateDependenciesMap = resp.getStatedependenciesMap();
|
|
356
|
+
for (const [key, resources] of stateDependencies) {
|
|
357
|
+
const deps = new provproto.ConstructResponse.PropertyDependencies();
|
|
358
|
+
deps.setUrnsList(await Promise.all(Array.from(resources).map((r) => r.urn.promise())));
|
|
359
|
+
stateDependenciesMap.set(key, deps);
|
|
360
|
+
}
|
|
361
|
+
resp.setState(structproto.Struct.fromJavaScript(state));
|
|
362
|
+
// Wait for RPC operations to complete.
|
|
363
|
+
await settings.waitForRPCs();
|
|
364
|
+
callback(undefined, resp);
|
|
365
|
+
}
|
|
366
|
+
catch (e) {
|
|
367
|
+
if (errors_1.InputPropertiesError.isInstance(e)) {
|
|
368
|
+
const error = this.buildInvalidPropertiesError(e.message, e.errors);
|
|
369
|
+
callback(error, undefined);
|
|
370
|
+
return;
|
|
467
371
|
}
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
372
|
+
else if (errors_1.InputPropertyError.isInstance(e)) {
|
|
373
|
+
const error = this.buildInvalidPropertiesError("", [
|
|
374
|
+
{ propertyPath: e.propertyPath, reason: e.reason },
|
|
375
|
+
]);
|
|
376
|
+
callback(error, undefined);
|
|
377
|
+
return;
|
|
471
378
|
}
|
|
472
|
-
|
|
379
|
+
callback(e, undefined);
|
|
380
|
+
}
|
|
381
|
+
finally {
|
|
382
|
+
// remove the gRPC callback context from the map of in-flight callbacks
|
|
383
|
+
this._callbacks.delete(callbackId);
|
|
384
|
+
}
|
|
473
385
|
});
|
|
474
386
|
}
|
|
475
|
-
|
|
476
|
-
|
|
387
|
+
async call(call, callback) {
|
|
388
|
+
// Setup a new async state store for this run
|
|
389
|
+
const store = new localState.LocalStore();
|
|
390
|
+
return localState.asyncLocalStorage.run(store, async () => {
|
|
391
|
+
const callbackId = Symbol("id");
|
|
392
|
+
this._callbacks.set(callbackId, callback);
|
|
477
393
|
try {
|
|
478
394
|
const req = call.request;
|
|
479
|
-
if (!this.provider.
|
|
395
|
+
if (!this.provider.call) {
|
|
480
396
|
callback(new Error(`unknown function ${req.getTok()}`), undefined);
|
|
481
397
|
return;
|
|
482
398
|
}
|
|
483
|
-
|
|
484
|
-
const
|
|
485
|
-
const
|
|
486
|
-
resp.
|
|
399
|
+
await configureRuntime(req, this.engineAddr);
|
|
400
|
+
const args = await deserializeInputs(req.getArgs(), req.getArgdependenciesMap());
|
|
401
|
+
const result = await this.provider.call(req.getTok(), args);
|
|
402
|
+
const resp = new provproto.CallResponse();
|
|
403
|
+
if (result.outputs) {
|
|
404
|
+
const [ret, retDependencies] = await rpc.serializeResourceProperties(`call(${req.getTok()})`, result.outputs);
|
|
405
|
+
const returnDependenciesMap = resp.getReturndependenciesMap();
|
|
406
|
+
for (const [key, resources] of retDependencies) {
|
|
407
|
+
const deps = new provproto.CallResponse.ReturnDependencies();
|
|
408
|
+
deps.setUrnsList(await Promise.all(Array.from(resources).map((r) => r.urn.promise())));
|
|
409
|
+
returnDependenciesMap.set(key, deps);
|
|
410
|
+
}
|
|
411
|
+
resp.setReturn(structproto.Struct.fromJavaScript(ret));
|
|
412
|
+
}
|
|
487
413
|
if ((result.failures || []).length !== 0) {
|
|
488
414
|
const failureList = [];
|
|
489
415
|
for (const f of result.failures) {
|
|
@@ -494,75 +420,113 @@ class Server {
|
|
|
494
420
|
}
|
|
495
421
|
resp.setFailuresList(failureList);
|
|
496
422
|
}
|
|
423
|
+
// Wait for RPC operations to complete.
|
|
424
|
+
await settings.waitForRPCs();
|
|
497
425
|
callback(undefined, resp);
|
|
498
426
|
}
|
|
499
427
|
catch (e) {
|
|
500
|
-
|
|
428
|
+
if (errors_1.InputPropertiesError.isInstance(e)) {
|
|
429
|
+
const error = this.buildInvalidPropertiesError(e.message, e.errors);
|
|
430
|
+
callback(error, undefined);
|
|
431
|
+
return;
|
|
432
|
+
}
|
|
433
|
+
else if (errors_1.InputPropertyError.isInstance(e)) {
|
|
434
|
+
const error = this.buildInvalidPropertiesError("", [
|
|
435
|
+
{ propertyPath: e.propertyPath, reason: e.reason },
|
|
436
|
+
]);
|
|
437
|
+
callback(error, undefined);
|
|
438
|
+
return;
|
|
439
|
+
}
|
|
501
440
|
callback(e, undefined);
|
|
502
441
|
}
|
|
442
|
+
finally {
|
|
443
|
+
// remove the gRPC callback context from the map of in-flight callbacks
|
|
444
|
+
this._callbacks.delete(callbackId);
|
|
445
|
+
}
|
|
503
446
|
});
|
|
504
447
|
}
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
throw new Error("fatal: Missing <engine> address");
|
|
512
|
-
}
|
|
513
|
-
settings.resetOptions(req.getProject(), req.getStack(), req.getParallel(), engineAddr, req.getMonitorendpoint(), req.getDryrun(), req.getOrganization());
|
|
514
|
-
// resetOptions doesn't reset the saved features
|
|
515
|
-
yield settings.awaitFeatureSupport();
|
|
516
|
-
const pulumiConfig = {};
|
|
517
|
-
const rpcConfig = req.getConfigMap();
|
|
518
|
-
if (rpcConfig) {
|
|
519
|
-
for (const [k, v] of rpcConfig.entries()) {
|
|
520
|
-
pulumiConfig[k] = v;
|
|
448
|
+
async invoke(call, callback) {
|
|
449
|
+
try {
|
|
450
|
+
const req = call.request;
|
|
451
|
+
if (!this.provider.invoke) {
|
|
452
|
+
callback(new Error(`unknown function ${req.getTok()}`), undefined);
|
|
453
|
+
return;
|
|
521
454
|
}
|
|
455
|
+
const args = req.getArgs().toJavaScript();
|
|
456
|
+
const result = await this.provider.invoke(req.getTok(), args);
|
|
457
|
+
const resp = new provproto.InvokeResponse();
|
|
458
|
+
resp.setReturn(structproto.Struct.fromJavaScript(result.outputs));
|
|
459
|
+
if ((result.failures || []).length !== 0) {
|
|
460
|
+
const failureList = [];
|
|
461
|
+
for (const f of result.failures) {
|
|
462
|
+
const failure = new provproto.CheckFailure();
|
|
463
|
+
failure.setProperty(f.property);
|
|
464
|
+
failure.setReason(f.reason);
|
|
465
|
+
failureList.push(failure);
|
|
466
|
+
}
|
|
467
|
+
resp.setFailuresList(failureList);
|
|
468
|
+
}
|
|
469
|
+
callback(undefined, resp);
|
|
522
470
|
}
|
|
523
|
-
|
|
524
|
-
|
|
471
|
+
catch (e) {
|
|
472
|
+
console.error(`${e}: ${e.stack}`);
|
|
473
|
+
callback(e, undefined);
|
|
474
|
+
}
|
|
475
|
+
}
|
|
476
|
+
}
|
|
477
|
+
async function configureRuntime(req, engineAddr) {
|
|
478
|
+
// NOTE: these are globals! We should ensure that all settings are identical between calls, and eventually
|
|
479
|
+
// refactor so we can avoid the global state.
|
|
480
|
+
if (engineAddr === undefined) {
|
|
481
|
+
throw new Error("fatal: Missing <engine> address");
|
|
482
|
+
}
|
|
483
|
+
settings.resetOptions(req.getProject(), req.getStack(), req.getParallel(), engineAddr, req.getMonitorendpoint(), req.getDryrun(), req.getOrganization());
|
|
484
|
+
// resetOptions doesn't reset the saved features
|
|
485
|
+
await settings.awaitFeatureSupport();
|
|
486
|
+
const pulumiConfig = {};
|
|
487
|
+
const rpcConfig = req.getConfigMap();
|
|
488
|
+
if (rpcConfig) {
|
|
489
|
+
for (const [k, v] of rpcConfig.entries()) {
|
|
490
|
+
pulumiConfig[k] = v;
|
|
491
|
+
}
|
|
492
|
+
}
|
|
493
|
+
config.setAllConfig(pulumiConfig, req.getConfigsecretkeysList());
|
|
525
494
|
}
|
|
526
495
|
/**
|
|
527
496
|
* Deserializes the inputs struct and applies appropriate dependencies.
|
|
528
497
|
*
|
|
529
498
|
* @internal
|
|
530
499
|
*/
|
|
531
|
-
function deserializeInputs(inputsStruct, inputDependencies) {
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
const
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
// wrapping it as an output.
|
|
545
|
-
result[k] = input;
|
|
546
|
-
}
|
|
547
|
-
else {
|
|
548
|
-
// Otherwise, wrap it in an output so we can handle secrets and/or track dependencies.
|
|
549
|
-
// Note: If the value is or contains an unknown value, the Output will mark its value as
|
|
550
|
-
// unknown automatically, so we just pass true for isKnown here.
|
|
551
|
-
const deps = depsUrns.map((depUrn) => new resource.DependencyResource(depUrn));
|
|
552
|
-
result[k] = new output_1.Output(deps, Promise.resolve(rpc.unwrapRpcSecret(input)), Promise.resolve(true), Promise.resolve(isSecret), Promise.resolve([]));
|
|
553
|
-
}
|
|
500
|
+
async function deserializeInputs(inputsStruct, inputDependencies) {
|
|
501
|
+
const result = {};
|
|
502
|
+
const deserializedInputs = rpc.deserializeProperties(inputsStruct);
|
|
503
|
+
for (const k of Object.keys(deserializedInputs)) {
|
|
504
|
+
const input = deserializedInputs[k];
|
|
505
|
+
const isSecret = rpc.isRpcSecret(input);
|
|
506
|
+
const depsUrns = inputDependencies.get(k)?.getUrnsList() ?? [];
|
|
507
|
+
if (!isSecret &&
|
|
508
|
+
(depsUrns.length === 0 || containsOutputs(input) || (await isResourceReference(input, depsUrns)))) {
|
|
509
|
+
// If the input isn't a secret and either doesn't have any dependencies, already contains Outputs (from
|
|
510
|
+
// deserialized output values), or is a resource reference, then we can return it directly without
|
|
511
|
+
// wrapping it as an output.
|
|
512
|
+
result[k] = input;
|
|
554
513
|
}
|
|
555
|
-
|
|
556
|
-
|
|
514
|
+
else {
|
|
515
|
+
// Otherwise, wrap it in an output so we can handle secrets and/or track dependencies.
|
|
516
|
+
// Note: If the value is or contains an unknown value, the Output will mark its value as
|
|
517
|
+
// unknown automatically, so we just pass true for isKnown here.
|
|
518
|
+
const deps = depsUrns.map((depUrn) => new resource.DependencyResource(depUrn));
|
|
519
|
+
result[k] = new output_1.Output(deps, Promise.resolve(rpc.unwrapRpcSecret(input)), Promise.resolve(true), Promise.resolve(isSecret), Promise.resolve([]));
|
|
520
|
+
}
|
|
521
|
+
}
|
|
522
|
+
return result;
|
|
557
523
|
}
|
|
558
524
|
exports.deserializeInputs = deserializeInputs;
|
|
559
525
|
/**
|
|
560
526
|
* Returns true if the input is a resource reference.
|
|
561
527
|
*/
|
|
562
|
-
function isResourceReference(input, deps) {
|
|
563
|
-
return
|
|
564
|
-
return resource.Resource.isInstance(input) && deps.length === 1 && deps[0] === (yield input.urn.promise());
|
|
565
|
-
});
|
|
528
|
+
async function isResourceReference(input, deps) {
|
|
529
|
+
return resource.Resource.isInstance(input) && deps.length === 1 && deps[0] === (await input.urn.promise());
|
|
566
530
|
}
|
|
567
531
|
/**
|
|
568
532
|
* Returns true if the deserialized input contains outputs (deeply), excluding
|
|
@@ -636,58 +600,56 @@ function grpcResponseFromError(e) {
|
|
|
636
600
|
}
|
|
637
601
|
// Add a flag to track if main has already been called
|
|
638
602
|
let isServing = false;
|
|
639
|
-
function main(provider, args) {
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
603
|
+
async function main(provider, args) {
|
|
604
|
+
if (isServing) {
|
|
605
|
+
// If we're already serving, just return and don't start another server.
|
|
606
|
+
return Promise.resolve();
|
|
607
|
+
}
|
|
608
|
+
isServing = true;
|
|
609
|
+
require("source-map-support").install();
|
|
610
|
+
// We track all uncaught errors here. If we have any, we will make sure we always have a non-0 exit
|
|
611
|
+
// code.
|
|
612
|
+
const uncaughtErrors = new Set();
|
|
613
|
+
const uncaughtHandler = (err) => {
|
|
614
|
+
if (!uncaughtErrors.has(err)) {
|
|
615
|
+
uncaughtErrors.add(err);
|
|
616
|
+
// Use `pulumi.log.error` here to tell the engine there was a fatal error, which should
|
|
617
|
+
// stop processing subsequent resource operations.
|
|
618
|
+
log.error(err.stack || err.message || "" + err);
|
|
644
619
|
}
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
620
|
+
};
|
|
621
|
+
process.on("uncaughtException", uncaughtHandler);
|
|
622
|
+
// @ts-ignore 'unhandledRejection' will almost always invoke uncaughtHandler with an Error. so just
|
|
623
|
+
// suppress the TS strictness here.
|
|
624
|
+
process.on("unhandledRejection", uncaughtHandler);
|
|
625
|
+
process.on("exit", (code) => {
|
|
626
|
+
// If there were any uncaught errors at all, we always want to exit with an error code.
|
|
627
|
+
if (code === 0 && uncaughtErrors.size > 0) {
|
|
628
|
+
process.exitCode = 1;
|
|
629
|
+
}
|
|
630
|
+
});
|
|
631
|
+
const parsedArgs = internals_1.parseArgs(args);
|
|
632
|
+
// Finally connect up the gRPC client/server and listen for incoming requests.
|
|
633
|
+
const server = new grpc.Server({
|
|
634
|
+
"grpc.max_receive_message_length": settings.maxRPCMessageSize,
|
|
635
|
+
});
|
|
636
|
+
// The program receives a single optional argument: the address of the RPC endpoint for the engine. It
|
|
637
|
+
// optionally also takes a second argument, a reference back to the engine, but this may be missing.
|
|
638
|
+
const engineAddr = parsedArgs?.engineAddress;
|
|
639
|
+
server.addService(provrpc.ResourceProviderService, new Server(engineAddr, provider, uncaughtErrors));
|
|
640
|
+
const port = await new Promise((resolve, reject) => {
|
|
641
|
+
server.bindAsync(`127.0.0.1:0`, grpc.ServerCredentials.createInsecure(), (err, p) => {
|
|
642
|
+
if (err) {
|
|
643
|
+
reject(err);
|
|
656
644
|
}
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
// @ts-ignore 'unhandledRejection' will almost always invoke uncaughtHandler with an Error. so just
|
|
660
|
-
// suppress the TS strictness here.
|
|
661
|
-
process.on("unhandledRejection", uncaughtHandler);
|
|
662
|
-
process.on("exit", (code) => {
|
|
663
|
-
// If there were any uncaught errors at all, we always want to exit with an error code.
|
|
664
|
-
if (code === 0 && uncaughtErrors.size > 0) {
|
|
665
|
-
process.exitCode = 1;
|
|
645
|
+
else {
|
|
646
|
+
resolve(p);
|
|
666
647
|
}
|
|
667
648
|
});
|
|
668
|
-
const parsedArgs = internals_1.parseArgs(args);
|
|
669
|
-
// Finally connect up the gRPC client/server and listen for incoming requests.
|
|
670
|
-
const server = new grpc.Server({
|
|
671
|
-
"grpc.max_receive_message_length": settings.maxRPCMessageSize,
|
|
672
|
-
});
|
|
673
|
-
// The program receives a single optional argument: the address of the RPC endpoint for the engine. It
|
|
674
|
-
// optionally also takes a second argument, a reference back to the engine, but this may be missing.
|
|
675
|
-
const engineAddr = parsedArgs === null || parsedArgs === void 0 ? void 0 : parsedArgs.engineAddress;
|
|
676
|
-
server.addService(provrpc.ResourceProviderService, new Server(engineAddr, provider, uncaughtErrors));
|
|
677
|
-
const port = yield new Promise((resolve, reject) => {
|
|
678
|
-
server.bindAsync(`127.0.0.1:0`, grpc.ServerCredentials.createInsecure(), (err, p) => {
|
|
679
|
-
if (err) {
|
|
680
|
-
reject(err);
|
|
681
|
-
}
|
|
682
|
-
else {
|
|
683
|
-
resolve(p);
|
|
684
|
-
}
|
|
685
|
-
});
|
|
686
|
-
});
|
|
687
|
-
// Emit the address so the monitor can read it to connect. The gRPC server will keep the message loop alive.
|
|
688
|
-
// We explicitly convert the number to a string so that Node doesn't colorize the output.
|
|
689
|
-
console.log(port.toString());
|
|
690
649
|
});
|
|
650
|
+
// Emit the address so the monitor can read it to connect. The gRPC server will keep the message loop alive.
|
|
651
|
+
// We explicitly convert the number to a string so that Node doesn't colorize the output.
|
|
652
|
+
console.log(port.toString());
|
|
691
653
|
}
|
|
692
654
|
exports.main = main;
|
|
693
655
|
/**
|