- Notifications
You must be signed in to change notification settings - Fork1k
Commitbb58844

Rafael Rodriguez
feat(cli): prompt for missing required template variables on template creation (#19973)
## SummaryIn this pull request we're adding support in the CLI for prompting theuser for any missing required template variables in the `coder templatespush` command and automatically retrying the template build once a userhas provided any missing variable values.Closes:#19782### DemoIn the following recording I created a simple template terraform filethat used different variable types (string, number, boolean, andsensitive) and prompted the user to enter a value for each variable.<details><summary>See example template terraform file</summary>```tf...# Required variables for testing interactive promptingvariable "docker_image" { description = "Docker image to use for the workspace" type = string}variable "workspace_name" { description = "Name of the workspace" type = string}variable "cpu_limit" { description = "CPU limit for the container (number of cores)" type = number}variable "enable_gpu" { description = "Enable GPU access for the container" type = bool}variable "api_key" { description = "API key for external services (sensitive)" type = string sensitive = true}# Optional variable with defaultvariable "docker_socket" { default = "/var/run/docker.sock" description = "Docker socket path" type = string}...```</details>Once the user entered a valid value for each variable, the templatebuild would be retried.https://github.com/user-attachments/assets/770cf954-3cbc-4464-925e-2be4e32a97de<details><summary>See output from recording</summary>```shell$ ./scripts/coder-dev.sh templates push test-required-params -d examples/templates/test-required-params/INFO : Overriding codersdk.SessionTokenCookie as we are developing inside a Coder workspace./home/coder/coder/build/coder-slim_2.26.0-devel+a68122ca3_linux_amd64Provisioner tags: <none>WARN: No .terraform.lock.hcl file found | When provisioning, Coder will be unable to cache providers without a lockfile and must download them from the internet each time. | Create one by running terraform init in your template directory.> Upload "examples/templates/test-required-params"? (yes/no) yes=== ✔ Queued [0ms]==> ⧗ Running==> ⧗ Running=== ✔ Running [4ms]==> ⧗ Setting up=== ✔ Setting up [0ms]==> ⧗ Parsing template parameters=== ✔ Parsing template parameters [8ms]==> ⧗ Cleaning Up=== ✘ Cleaning Up [4ms]=== ✘ Cleaning Up [8ms]Found 5 missing required variables: - docker_image (string): Docker image to use for the workspace - workspace_name (string): Name of the workspace - cpu_limit (number): CPU limit for the container (number of cores) - enable_gpu (bool): Enable GPU access for the container - api_key (string): API key for external services (sensitive)The template requires values for the following variables:var.docker_image (required) Description: Docker image to use for the workspace Type: string Current value: <empty>> Enter value: image-namevar.workspace_name (required) Description: Name of the workspace Type: string Current value: <empty>> Enter value: workspace-namevar.cpu_limit (required) Description: CPU limit for the container (number of cores) Type: number Current value: <empty>> Enter value: 1var.enable_gpu (required) Description: Enable GPU access for the container Type: bool Current value: <empty>? Select value: falsevar.api_key (required), sensitive Description: API key for external services (sensitive) Type: string Current value: <empty>> Enter value: (*redacted*) ******Retrying template build with provided variables...=== ✔ Queued [0ms]==> ⧗ Running==> ⧗ Running=== ✔ Running [2ms]==> ⧗ Setting up=== ✔ Setting up [0ms]==> ⧗ Parsing template parameters=== ✔ Parsing template parameters [7ms]==> ⧗ Detecting persistent resources2025-09-25 22:34:14.731Z Terraform 1.13.02025-09-25 22:34:15.140Z data.coder_provisioner.me: Refreshing...2025-09-25 22:34:15.140Z data.coder_workspace.me: Refreshing...2025-09-25 22:34:15.140Z data.coder_workspace_owner.me: Refreshing...2025-09-25 22:34:15.141Z data.coder_provisioner.me: Refresh complete after 0s [id=2bd73098-d127-4362-b3a5-628e5bce6998]2025-09-25 22:34:15.141Z data.coder_workspace_owner.me: Refresh complete after 0s [id=c2006933-4f3e-4c45-9e04-79612c3a5eca]2025-09-25 22:34:15.141Z data.coder_workspace.me: Refresh complete after 0s [id=36f2dc6f-0bf2-43bd-bc4d-b29768334e02]2025-09-25 22:34:15.186Z coder_agent.main: Plan to create2025-09-25 22:34:15.186Z module.code-server[0].coder_app.code-server: Plan to create2025-09-25 22:34:15.186Z docker_volume.home_volume: Plan to create2025-09-25 22:34:15.186Z module.code-server[0].coder_script.code-server: Plan to create2025-09-25 22:34:15.187Z docker_container.workspace[0]: Plan to create2025-09-25 22:34:15.187Z Plan: 5 to add, 0 to change, 0 to destroy.=== ✔ Detecting persistent resources [3104ms]==> ⧗ Detecting ephemeral resources2025-09-25 22:34:16.033Z Terraform 1.13.02025-09-25 22:34:16.428Z data.coder_workspace.me: Refreshing...2025-09-25 22:34:16.428Z data.coder_provisioner.me: Refreshing...2025-09-25 22:34:16.429Z data.coder_workspace_owner.me: Refreshing...2025-09-25 22:34:16.429Z data.coder_provisioner.me: Refresh complete after 0s [id=2d2f7083-88e6-425c-9df3-856a3bf4cc73]2025-09-25 22:34:16.429Z data.coder_workspace.me: Refresh complete after 0s [id=c723575e-c7d3-43d7-bf54-0e34d0959dc3]2025-09-25 22:34:16.431Z data.coder_workspace_owner.me: Refresh complete after 0s [id=d43470c2-236e-4ae9-a977-6b53688c2cb1]2025-09-25 22:34:16.453Z coder_agent.main: Plan to create2025-09-25 22:34:16.453Z docker_volume.home_volume: Plan to create2025-09-25 22:34:16.454Z Plan: 2 to add, 0 to change, 0 to destroy.=== ✔ Detecting ephemeral resources [1278ms]==> ⧗ Cleaning Up=== ✔ Cleaning Up [6ms]┌──────────────────────────────────┐│ Template Preview │├──────────────────────────────────┤│ RESOURCE │├──────────────────────────────────┤│ docker_container.workspace ││ └─ main (linux, amd64) │├──────────────────────────────────┤│ docker_volume.home_volume │└──────────────────────────────────┘The test-required-params template has been created at Sep 2522:34:16! Developers can provision a workspace with this template using:Updated version at Sep 25 22:34:16!```</details>### Changes- Added a new function to check if the provisioner failed due to atemplate missing required variables- Added a handler function that is called when a provisioner fails dueto the "missing required variables" error. The handler function will:- Check for provided template variables and identify any missingvariables- Prompt the user for any missing variables (prompt is adapted based onthe variable type) - Validate user input for missing variables- Retry the template build when all variables have been provided by theuser### TestingAdded tests for the following scenarios:- Ensure validation based on variable type- Ensure users are not prompted for variables with a default value- Ensure variables provided via a variables files (`--variables-file`)or a variable flag (`--variable`) take precedence over a template1 parenta360785 commitbb58844
File tree
4 files changed
+400
-53
lines changed- cli
- codersdk
4 files changed
+400
-53
lines changedOriginal file line number | Diff line number | Diff line change | |
---|---|---|---|
| |||
9 | 9 |
| |
10 | 10 |
| |
11 | 11 |
| |
| 12 | + | |
12 | 13 |
| |
13 | 14 |
| |
14 | 15 |
| |
| |||
461 | 462 |
| |
462 | 463 |
| |
463 | 464 |
| |
464 |
| - | |
465 |
| - | |
| 465 | + | |
| 466 | + | |
| 467 | + | |
| 468 | + | |
| 469 | + | |
| 470 | + | |
| 471 | + | |
466 | 472 |
| |
467 |
| - | |
468 | 473 |
| |
469 | 474 |
| |
470 | 475 |
| |
| |||
528 | 533 |
| |
529 | 534 |
| |
530 | 535 |
| |
| 536 | + | |
| 537 | + | |
| 538 | + | |
| 539 | + | |
| 540 | + | |
| 541 | + | |
| 542 | + | |
| 543 | + | |
| 544 | + | |
| 545 | + | |
| 546 | + | |
| 547 | + | |
| 548 | + | |
| 549 | + | |
| 550 | + | |
| 551 | + | |
| 552 | + | |
| 553 | + | |
| 554 | + | |
| 555 | + | |
| 556 | + | |
| 557 | + | |
| 558 | + | |
| 559 | + | |
| 560 | + | |
| 561 | + | |
| 562 | + | |
| 563 | + | |
| 564 | + | |
| 565 | + | |
| 566 | + | |
| 567 | + | |
| 568 | + | |
| 569 | + | |
| 570 | + | |
| 571 | + | |
| 572 | + | |
| 573 | + | |
| 574 | + | |
| 575 | + | |
| 576 | + | |
| 577 | + | |
| 578 | + | |
| 579 | + | |
| 580 | + | |
| 581 | + | |
| 582 | + | |
| 583 | + | |
| 584 | + | |
| 585 | + | |
| 586 | + | |
| 587 | + | |
| 588 | + | |
| 589 | + | |
| 590 | + | |
| 591 | + | |
| 592 | + | |
| 593 | + | |
| 594 | + | |
| 595 | + | |
| 596 | + | |
| 597 | + | |
| 598 | + | |
| 599 | + | |
| 600 | + | |
| 601 | + | |
| 602 | + | |
| 603 | + | |
| 604 | + | |
| 605 | + | |
| 606 | + | |
| 607 | + | |
| 608 | + | |
| 609 | + | |
| 610 | + | |
| 611 | + | |
| 612 | + | |
| 613 | + | |
| 614 | + | |
| 615 | + | |
| 616 | + | |
| 617 | + | |
| 618 | + | |
| 619 | + | |
| 620 | + | |
| 621 | + | |
| 622 | + | |
| 623 | + | |
| 624 | + | |
| 625 | + | |
| 626 | + | |
| 627 | + | |
| 628 | + | |
| 629 | + | |
| 630 | + | |
| 631 | + | |
| 632 | + | |
| 633 | + | |
| 634 | + | |
| 635 | + | |
| 636 | + | |
| 637 | + | |
| 638 | + | |
| 639 | + | |
| 640 | + | |
| 641 | + | |
| 642 | + | |
| 643 | + | |
| 644 | + | |
| 645 | + | |
| 646 | + | |
| 647 | + | |
| 648 | + | |
| 649 | + | |
| 650 | + | |
| 651 | + | |
| 652 | + | |
| 653 | + | |
| 654 | + | |
| 655 | + | |
| 656 | + | |
| 657 | + | |
| 658 | + | |
| 659 | + | |
| 660 | + | |
| 661 | + | |
| 662 | + | |
| 663 | + | |
| 664 | + | |
| 665 | + | |
| 666 | + | |
| 667 | + | |
| 668 | + | |
| 669 | + | |
| 670 | + | |
| 671 | + | |
| 672 | + | |
| 673 | + | |
| 674 | + | |
| 675 | + | |
| 676 | + | |
| 677 | + | |
| 678 | + | |
| 679 | + | |
| 680 | + | |
| 681 | + | |
| 682 | + | |
| 683 | + | |
| 684 | + | |
| 685 | + |
0 commit comments
Comments
(0)