@@ -1747,6 +1747,103 @@ func TestCompleteJob(t *testing.T) {
1747
1747
})
1748
1748
}
1749
1749
})
1750
+
1751
+ t .Run ("PrebuiltWorkspaceClaimWithResourceReplacements" , func (t * testing.T ) {
1752
+ t .Parallel ()
1753
+
1754
+ ctx := testutil .Context (t , testutil .WaitLong )
1755
+
1756
+ done := make (chan struct {})
1757
+ orchestrator := & mockPrebuildsOrchestrator {
1758
+ ReconciliationOrchestrator : agplprebuilds .DefaultReconciler ,
1759
+ done : done ,
1760
+ }
1761
+ srv , db , ps , pd := setup (t , false , & overrides {
1762
+ prebuildsOrchestrator : orchestrator ,
1763
+ })
1764
+
1765
+ user := dbgen .User (t , db , database.User {})
1766
+ template := dbgen .Template (t , db , database.Template {
1767
+ Name : "template" ,
1768
+ Provisioner : database .ProvisionerTypeEcho ,
1769
+ OrganizationID : pd .OrganizationID ,
1770
+ })
1771
+ file := dbgen .File (t , db , database.File {CreatedBy : user .ID })
1772
+ workspaceTable := dbgen .Workspace (t , db , database.WorkspaceTable {
1773
+ TemplateID : template .ID ,
1774
+ OwnerID : user .ID ,
1775
+ OrganizationID : pd .OrganizationID ,
1776
+ })
1777
+ version := dbgen .TemplateVersion (t , db , database.TemplateVersion {
1778
+ OrganizationID : pd .OrganizationID ,
1779
+ TemplateID : uuid.NullUUID {
1780
+ UUID : template .ID ,
1781
+ Valid : true ,
1782
+ },
1783
+ JobID : uuid .New (),
1784
+ })
1785
+ build := dbgen .WorkspaceBuild (t , db , database.WorkspaceBuild {
1786
+ WorkspaceID : workspaceTable .ID ,
1787
+ InitiatorID : user .ID ,
1788
+ TemplateVersionID : version .ID ,
1789
+ Transition : database .WorkspaceTransitionStart ,
1790
+ Reason : database .BuildReasonInitiator ,
1791
+ })
1792
+ job := dbgen .ProvisionerJob (t , db , ps , database.ProvisionerJob {
1793
+ FileID : file .ID ,
1794
+ InitiatorID : user .ID ,
1795
+ Type : database .ProvisionerJobTypeWorkspaceBuild ,
1796
+ Input : must (json .Marshal (provisionerdserver.WorkspaceProvisionJob {
1797
+ WorkspaceBuildID : build .ID ,
1798
+
1799
+ // Mark the job as a prebuilt workspace claim.
1800
+ PrebuildClaimedByUser : uuid .New (),
1801
+ IsPrebuild : false ,
1802
+ })),
1803
+ OrganizationID : pd .OrganizationID ,
1804
+ })
1805
+ _ , err := db .AcquireProvisionerJob (ctx , database.AcquireProvisionerJobParams {
1806
+ OrganizationID : pd .OrganizationID ,
1807
+ WorkerID : uuid.NullUUID {
1808
+ UUID : pd .ID ,
1809
+ Valid : true ,
1810
+ },
1811
+ Types : []database.ProvisionerType {database .ProvisionerTypeEcho },
1812
+ })
1813
+ require .NoError (t , err )
1814
+
1815
+ replacements := []* sdkproto.ResourceReplacement {
1816
+ {
1817
+ Resource : "docker_container[0]" ,
1818
+ Paths : []string {"env" },
1819
+ },
1820
+ }
1821
+ _ , err = srv .CompleteJob (ctx , & proto.CompletedJob {
1822
+ JobId : job .ID .String (),
1823
+ Type : & proto.CompletedJob_WorkspaceBuild_ {
1824
+ WorkspaceBuild : & proto.CompletedJob_WorkspaceBuild {
1825
+ State : []byte {},
1826
+ ResourceReplacements : replacements ,
1827
+ },
1828
+ },
1829
+ })
1830
+ require .NoError (t , err )
1831
+
1832
+ testutil .RequireReceive (ctx , t , done )
1833
+ require .Equal (t , replacements , orchestrator .replacements )
1834
+ })
1835
+ }
1836
+
1837
+ type mockPrebuildsOrchestrator struct {
1838
+ agplprebuilds.ReconciliationOrchestrator
1839
+
1840
+ replacements []* sdkproto.ResourceReplacement
1841
+ done chan struct {}
1842
+ }
1843
+
1844
+ func (m * mockPrebuildsOrchestrator ) TrackResourceReplacement (_ context.Context , _ , _ , _ uuid.UUID , replacements []* sdkproto.ResourceReplacement ) {
1845
+ m .replacements = replacements
1846
+ m .done <- struct {}{}
1750
1847
}
1751
1848
1752
1849
func TestInsertWorkspacePresetsAndParameters (t * testing.T ) {
@@ -2632,6 +2729,7 @@ type overrides struct {
2632
2729
heartbeatInterval time.Duration
2633
2730
auditor audit.Auditor
2634
2731
notificationEnqueuer notifications.Enqueuer
2732
+ prebuildsOrchestrator agplprebuilds.ReconciliationOrchestrator
2635
2733
}
2636
2734
2637
2735
func setup (t * testing.T , ignoreLogErrors bool , ov * overrides ) (proto.DRPCProvisionerDaemonServer , database.Store , pubsub.Pubsub , database.ProvisionerDaemon ) {
@@ -2713,6 +2811,13 @@ func setup(t *testing.T, ignoreLogErrors bool, ov *overrides) (proto.DRPCProvisi
2713
2811
})
2714
2812
require .NoError (t , err )
2715
2813
2814
+ prebuildsOrchestrator := ov .prebuildsOrchestrator
2815
+ if prebuildsOrchestrator == nil {
2816
+ prebuildsOrchestrator = agplprebuilds .DefaultReconciler
2817
+ }
2818
+ var op atomic.Pointer [agplprebuilds.ReconciliationOrchestrator ]
2819
+ op .Store (& prebuildsOrchestrator )
2820
+
2716
2821
srv , err := provisionerdserver .NewServer (
2717
2822
ov .ctx ,
2718
2823
& url.URL {},
@@ -2740,7 +2845,7 @@ func setup(t *testing.T, ignoreLogErrors bool, ov *overrides) (proto.DRPCProvisi
2740
2845
HeartbeatFn : ov .heartbeatFn ,
2741
2846
},
2742
2847
notifEnq ,
2743
- agplprebuilds . DefaultReconciler ,
2848
+ & op ,
2744
2849
)
2745
2850
require .NoError (t , err )
2746
2851
return srv , db , ps , daemon
0 commit comments