@@ -781,6 +781,190 @@ func TestWorkspaceBuildWithRichParameters(t *testing.T) {
781
781
})
782
782
require .Error (t ,err )
783
783
})
784
+
785
+ t .Run ("NewImmutableRequiredParameterAdded" ,func (t * testing.T ) {
786
+ t .Parallel ()
787
+
788
+ client := coderdtest .New (t ,& coderdtest.Options {IncludeProvisionerDaemon :true })
789
+ user := coderdtest .CreateFirstUser (t ,client )
790
+ version := coderdtest .CreateTemplateVersion (t ,client ,user .OrganizationID ,echoResponses )
791
+ coderdtest .AwaitTemplateVersionJob (t ,client ,version .ID )
792
+
793
+ template := coderdtest .CreateTemplate (t ,client ,user .OrganizationID ,version .ID )
794
+ workspace := coderdtest .CreateWorkspace (t ,client ,user .OrganizationID ,template .ID ,func (cwr * codersdk.CreateWorkspaceRequest ) {
795
+ cwr .RichParameterValues = initialBuildParameters
796
+ })
797
+
798
+ workspaceBuild := coderdtest .AwaitWorkspaceBuildJob (t ,client ,workspace .LatestBuild .ID )
799
+ require .Equal (t ,codersdk .WorkspaceStatusRunning ,workspaceBuild .Status )
800
+
801
+ // Push new template revision
802
+ const newImmutableParameterName = "new_immutable_parameter"
803
+ const newImmutableParameterDescription = "This is also an immutable parameter"
804
+ version2 := coderdtest .UpdateTemplateVersion (t ,client ,user .OrganizationID ,& echo.Responses {
805
+ Parse :echo .ParseComplete ,
806
+ ProvisionPlan : []* proto.Provision_Response {
807
+ {
808
+ Type :& proto.Provision_Response_Complete {
809
+ Complete :& proto.Provision_Complete {
810
+ Parameters : []* proto.RichParameter {
811
+ {Name :firstParameterName ,Description :firstParameterDescription ,Mutable :true },
812
+ {Name :secondParameterName ,Description :secondParameterDescription ,Mutable :true },
813
+ {Name :immutableParameterName ,Description :immutableParameterDescription ,Mutable :false },
814
+ {Name :newImmutableParameterName ,Description :newImmutableParameterDescription ,Mutable :false ,Required :true },
815
+ },
816
+ },
817
+ },
818
+ },
819
+ },
820
+ ProvisionApply : []* proto.Provision_Response {{
821
+ Type :& proto.Provision_Response_Complete {
822
+ Complete :& proto.Provision_Complete {},
823
+ },
824
+ }},
825
+ },template .ID )
826
+ coderdtest .AwaitTemplateVersionJob (t ,client ,version2 .ID )
827
+ err := client .UpdateActiveTemplateVersion (context .Background (),template .ID , codersdk.UpdateActiveTemplateVersion {
828
+ ID :version2 .ID ,
829
+ })
830
+ require .NoError (t ,err )
831
+
832
+ // Update build parameters
833
+ ctx ,cancel := context .WithTimeout (context .Background (),testutil .WaitLong )
834
+ defer cancel ()
835
+
836
+ nextBuildParameters := []codersdk.WorkspaceBuildParameter {
837
+ {Name :newImmutableParameterName ,Value :"good" },
838
+ }
839
+ _ ,err = client .CreateWorkspaceBuild (ctx ,workspace .ID , codersdk.CreateWorkspaceBuildRequest {
840
+ TemplateVersionID :version2 .ID ,
841
+ Transition :codersdk .WorkspaceTransitionStart ,
842
+ RichParameterValues :nextBuildParameters ,
843
+ })
844
+ require .NoError (t ,err )
845
+ })
846
+
847
+ t .Run ("NewImmutableOptionalParameterAdded" ,func (t * testing.T ) {
848
+ t .Parallel ()
849
+
850
+ client := coderdtest .New (t ,& coderdtest.Options {IncludeProvisionerDaemon :true })
851
+ user := coderdtest .CreateFirstUser (t ,client )
852
+ version := coderdtest .CreateTemplateVersion (t ,client ,user .OrganizationID ,echoResponses )
853
+ coderdtest .AwaitTemplateVersionJob (t ,client ,version .ID )
854
+
855
+ template := coderdtest .CreateTemplate (t ,client ,user .OrganizationID ,version .ID )
856
+ workspace := coderdtest .CreateWorkspace (t ,client ,user .OrganizationID ,template .ID ,func (cwr * codersdk.CreateWorkspaceRequest ) {
857
+ cwr .RichParameterValues = initialBuildParameters
858
+ })
859
+
860
+ workspaceBuild := coderdtest .AwaitWorkspaceBuildJob (t ,client ,workspace .LatestBuild .ID )
861
+ require .Equal (t ,codersdk .WorkspaceStatusRunning ,workspaceBuild .Status )
862
+
863
+ // Push new template revision
864
+ const newImmutableParameterName = "new_immutable_parameter"
865
+ const newImmutableParameterDescription = "This is also an immutable parameter"
866
+ version2 := coderdtest .UpdateTemplateVersion (t ,client ,user .OrganizationID ,& echo.Responses {
867
+ Parse :echo .ParseComplete ,
868
+ ProvisionPlan : []* proto.Provision_Response {
869
+ {
870
+ Type :& proto.Provision_Response_Complete {
871
+ Complete :& proto.Provision_Complete {
872
+ Parameters : []* proto.RichParameter {
873
+ {Name :firstParameterName ,Description :firstParameterDescription ,Mutable :true },
874
+ {Name :secondParameterName ,Description :secondParameterDescription ,Mutable :true },
875
+ {Name :immutableParameterName ,Description :immutableParameterDescription ,Mutable :false },
876
+ {Name :newImmutableParameterName ,Description :newImmutableParameterDescription ,Mutable :false ,DefaultValue :"12345" },
877
+ },
878
+ },
879
+ },
880
+ },
881
+ },
882
+ ProvisionApply : []* proto.Provision_Response {{
883
+ Type :& proto.Provision_Response_Complete {
884
+ Complete :& proto.Provision_Complete {},
885
+ },
886
+ }},
887
+ },template .ID )
888
+ coderdtest .AwaitTemplateVersionJob (t ,client ,version2 .ID )
889
+ err := client .UpdateActiveTemplateVersion (context .Background (),template .ID , codersdk.UpdateActiveTemplateVersion {
890
+ ID :version2 .ID ,
891
+ })
892
+ require .NoError (t ,err )
893
+
894
+ // Update build parameters
895
+ ctx ,cancel := context .WithTimeout (context .Background (),testutil .WaitLong )
896
+ defer cancel ()
897
+
898
+ nextBuildParameters := []codersdk.WorkspaceBuildParameter {
899
+ {Name :newImmutableParameterName ,Value :"good" },
900
+ }
901
+ _ ,err = client .CreateWorkspaceBuild (ctx ,workspace .ID , codersdk.CreateWorkspaceBuildRequest {
902
+ TemplateVersionID :version2 .ID ,
903
+ Transition :codersdk .WorkspaceTransitionStart ,
904
+ RichParameterValues :nextBuildParameters ,
905
+ })
906
+ require .NoError (t ,err )
907
+ })
908
+
909
+ t .Run ("NewImmutableOptionalParameterUsesDefault" ,func (t * testing.T ) {
910
+ t .Parallel ()
911
+
912
+ client := coderdtest .New (t ,& coderdtest.Options {IncludeProvisionerDaemon :true })
913
+ user := coderdtest .CreateFirstUser (t ,client )
914
+ version := coderdtest .CreateTemplateVersion (t ,client ,user .OrganizationID ,echoResponses )
915
+ coderdtest .AwaitTemplateVersionJob (t ,client ,version .ID )
916
+
917
+ template := coderdtest .CreateTemplate (t ,client ,user .OrganizationID ,version .ID )
918
+ workspace := coderdtest .CreateWorkspace (t ,client ,user .OrganizationID ,template .ID ,func (cwr * codersdk.CreateWorkspaceRequest ) {
919
+ cwr .RichParameterValues = initialBuildParameters
920
+ })
921
+
922
+ workspaceBuild := coderdtest .AwaitWorkspaceBuildJob (t ,client ,workspace .LatestBuild .ID )
923
+ require .Equal (t ,codersdk .WorkspaceStatusRunning ,workspaceBuild .Status )
924
+
925
+ // Push new template revision
926
+ const newImmutableParameterName = "new_immutable_parameter"
927
+ const newImmutableParameterDescription = "This is also an immutable parameter"
928
+ version2 := coderdtest .UpdateTemplateVersion (t ,client ,user .OrganizationID ,& echo.Responses {
929
+ Parse :echo .ParseComplete ,
930
+ ProvisionPlan : []* proto.Provision_Response {
931
+ {
932
+ Type :& proto.Provision_Response_Complete {
933
+ Complete :& proto.Provision_Complete {
934
+ Parameters : []* proto.RichParameter {
935
+ {Name :firstParameterName ,Description :firstParameterDescription ,Mutable :true },
936
+ {Name :secondParameterName ,Description :secondParameterDescription ,Mutable :true },
937
+ {Name :immutableParameterName ,Description :immutableParameterDescription ,Mutable :false },
938
+ {Name :newImmutableParameterName ,Description :newImmutableParameterDescription ,Mutable :false ,DefaultValue :"12345" },
939
+ },
940
+ },
941
+ },
942
+ },
943
+ },
944
+ ProvisionApply : []* proto.Provision_Response {{
945
+ Type :& proto.Provision_Response_Complete {
946
+ Complete :& proto.Provision_Complete {},
947
+ },
948
+ }},
949
+ },template .ID )
950
+ coderdtest .AwaitTemplateVersionJob (t ,client ,version2 .ID )
951
+ err := client .UpdateActiveTemplateVersion (context .Background (),template .ID , codersdk.UpdateActiveTemplateVersion {
952
+ ID :version2 .ID ,
953
+ })
954
+ require .NoError (t ,err )
955
+
956
+ // Update build parameters
957
+ ctx ,cancel := context .WithTimeout (context .Background (),testutil .WaitLong )
958
+ defer cancel ()
959
+
960
+ var nextBuildParameters []codersdk.WorkspaceBuildParameter
961
+ _ ,err = client .CreateWorkspaceBuild (ctx ,workspace .ID , codersdk.CreateWorkspaceBuildRequest {
962
+ TemplateVersionID :version2 .ID ,
963
+ Transition :codersdk .WorkspaceTransitionStart ,
964
+ RichParameterValues :nextBuildParameters ,
965
+ })
966
+ require .NoError (t ,err )
967
+ })
784
968
}
785
969
786
970
func TestWorkspaceBuildValidateRichParameters (t * testing.T ) {