|
248 | 248 | :StackName StackId}})) |
249 | 249 | (update-stack! client request StackId))))) |
250 | 250 |
|
| 251 | +(defn- execute-change-set! [client stack-name {:keys [changes id]}] |
| 252 | + (when (seq changes) |
| 253 | + ; This op only returns {} |
| 254 | + (u/invoke! client |
| 255 | + {:op :ExecuteChangeSet |
| 256 | + :request |
| 257 | + {:ChangeSetName id |
| 258 | + :StackName stack-name}}))) |
| 259 | + |
251 | 260 | (defn- outputs-map-raw [outputs-seq] |
252 | 261 | (reduce |
253 | 262 | (fn [m {:keys [OutputKey] :as output}] |
|
314 | 323 |
|
315 | 324 | (defn- start-stack! [{::ds/keys [config instance system] |
316 | 325 | :as signal}] |
317 | | - (let [{:keys [name region template]} config |
318 | | - {:keys [client]} instance |
| 326 | + (let [{:keys [change-set name region template]} config |
| 327 | + {inst-client :client} instance |
| 328 | + client (or inst-client |
| 329 | + (:client config) |
| 330 | + (aws/client {:api :cloudformation :region region})) |
319 | 331 | schema (-> system ::ds/component-def :schema)] |
320 | | - (if client |
| 332 | + (cond |
| 333 | + inst-client |
321 | 334 | instance |
322 | | - (let [_ (validate! signal schema template) |
323 | | - client (or (:client config) |
324 | | - (aws/client {:api :cloudformation :region region}))] |
| 335 | + |
| 336 | + change-set |
| 337 | + (let [{:keys [stack-id]} change-set |
| 338 | + r (execute-change-set! client name change-set)] |
| 339 | + (wait-until-complete! stack-id client) |
| 340 | + (stack-instance client name stack-id)) |
| 341 | + |
| 342 | + :else |
| 343 | + (do (validate! signal schema template) |
325 | 344 | (loop [[r updated?] (cou-stack! client signal (:json (template-data :template template :validate? false)))] |
326 | 345 | (cond |
327 | 346 | (some-> r u/aws-error-message in-progress-error-message?) |
|
336 | 355 | (do |
337 | 356 | (when updated? |
338 | 357 | (wait-until-complete! name client :error-on-rollback? true)) |
339 | | - (stack-instance client (:name config) r)))))))) |
| 358 | + (stack-instance client name r)))))))) |
340 | 359 |
|
341 | 360 | (defn- stop! |
342 | 361 | "Stops a [[change-set]], [[stack]], or [[stack-properties]]." |
|
369 | 388 | \"CAPABILITY_IAM\" |
370 | 389 | \"CAPABILITY_NAMED_IAM\"} |
371 | 390 |
|
| 391 | + :change-set |
| 392 | + A reference to a [[change-set]] component. |
| 393 | + If this is provided, the :capabilities, :parameters, |
| 394 | + and :template options for the stack are ignored. |
| 395 | +
|
372 | 396 | :client |
373 | 397 | An AWS client as produced by |
374 | 398 | `cognitect.aws.client.api/client` |
|
406 | 430 | :salmon/early-validate |
407 | 431 | (fn [{{::ds/keys [component-def]} ::ds/system |
408 | 432 | :as signal}] |
409 | | - (validate! signal |
410 | | - (:salmon/early-schema component-def) |
411 | | - (-> component-def ::ds/config :template) |
412 | | - :pre? true)) |
| 433 | + (let [{{:keys [change-set template]} ::ds/config |
| 434 | + :salmon/keys [early-schema]} component-def] |
| 435 | + (when-not change-set |
| 436 | + (validate! signal early-schema template :pre? true)))) |
413 | 437 | :schema stack-schema}) |
414 | 438 |
|
415 | 439 | (defn- get-stack-properties! |
|
0 commit comments