Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 7987596

Browse files
committed
Add periodic updates
1 parent 33ecab0 commit 7987596

File tree

2 files changed

+72
-7
lines changed

2 files changed

+72
-7
lines changed

provisionerd/provisionerd.go

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,16 +32,20 @@ type Provisioners map[string]sdkproto.DRPCProvisionerClient
3232
type Options struct {
3333
Logger slog.Logger
3434

35-
PollInterval time.Duration
36-
Provisioners Provisioners
37-
WorkDirectory string
35+
UpdateInterval time.Duration
36+
PollInterval time.Duration
37+
Provisioners Provisioners
38+
WorkDirectory string
3839
}
3940

4041
// New creates and starts a provisioner daemon.
4142
func New(clientDialer Dialer, opts *Options) io.Closer {
4243
if opts.PollInterval == 0 {
4344
opts.PollInterval = 5 * time.Second
4445
}
46+
if opts.UpdateInterval == 0 {
47+
opts.UpdateInterval = 5 * time.Second
48+
}
4549
ctx, ctxCancel := context.WithCancel(context.Background())
4650
daemon := &provisionerDaemon{
4751
clientDialer: clientDialer,
@@ -192,6 +196,24 @@ func (p *provisionerDaemon) isRunningJob() bool {
192196
}
193197

194198
func (p *provisionerDaemon) runJob(ctx context.Context) {
199+
go func() {
200+
ticker := time.NewTicker(p.opts.UpdateInterval)
201+
defer ticker.Stop()
202+
select {
203+
case <-p.closed:
204+
return
205+
case <-ctx.Done():
206+
return
207+
case <-ticker.C:
208+
err := p.updateStream.Send(&proto.JobUpdate{
209+
JobId: p.acquiredJob.JobId,
210+
})
211+
if err != nil {
212+
p.cancelActiveJob(fmt.Sprintf("send periodic update: %s", err))
213+
return
214+
}
215+
}
216+
}()
195217
go func() {
196218
select {
197219
case <-p.closed:

provisionerd/provisionerd_test.go

Lines changed: 47 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,48 @@ func TestProvisionerd(t *testing.T) {
153153
require.NoError(t, closer.Close())
154154
})
155155

156+
t.Run("RunningPeriodicUpdate", func(t *testing.T) {
157+
t.Parallel()
158+
completeChan := make(chan struct{})
159+
closer := createProvisionerd(t, func(ctx context.Context) (proto.DRPCProvisionerDaemonClient, error) {
160+
return createProvisionerDaemonClient(t, provisionerDaemonTestServer{
161+
acquireJob: func(ctx context.Context, _ *proto.Empty) (*proto.AcquiredJob, error) {
162+
return &proto.AcquiredJob{
163+
JobId: "test",
164+
Provisioner: "someprovisioner",
165+
ProjectSourceArchive: createTar(t, map[string]string{
166+
"test.txt": "content",
167+
}),
168+
Type: &proto.AcquiredJob_ProjectImport_{
169+
ProjectImport: &proto.AcquiredJob_ProjectImport{},
170+
},
171+
}, nil
172+
},
173+
updateJob: func(stream proto.DRPCProvisionerDaemon_UpdateJobStream) error {
174+
for {
175+
_, err := stream.Recv()
176+
if err != nil {
177+
return err
178+
}
179+
close(completeChan)
180+
}
181+
},
182+
cancelJob: func(ctx context.Context, job *proto.CancelledJob) (*proto.Empty, error) {
183+
return &proto.Empty{}, nil
184+
},
185+
}), nil
186+
}, provisionerd.Provisioners{
187+
"someprovisioner": createProvisionerClient(t, provisionerTestServer{
188+
parse: func(request *sdkproto.Parse_Request, stream sdkproto.DRPCProvisioner_ParseStream) error {
189+
<-stream.Context().Done()
190+
return nil
191+
},
192+
}),
193+
})
194+
<-completeChan
195+
require.NoError(t, closer.Close())
196+
})
197+
156198
t.Run("ProjectImport", func(t *testing.T) {
157199
t.Parallel()
158200
var (
@@ -331,10 +373,11 @@ func createTar(t *testing.T, files map[string]string) []byte {
331373
// Creates a provisionerd implementation with the provided dialer and provisioners.
332374
func createProvisionerd(t *testing.T, dialer provisionerd.Dialer, provisioners provisionerd.Provisioners) io.Closer {
333375
closer := provisionerd.New(dialer, &provisionerd.Options{
334-
Logger: slogtest.Make(t, nil).Named("provisionerd").Leveled(slog.LevelDebug),
335-
PollInterval: 50 * time.Millisecond,
336-
Provisioners: provisioners,
337-
WorkDirectory: t.TempDir(),
376+
Logger: slogtest.Make(t, nil).Named("provisionerd").Leveled(slog.LevelDebug),
377+
PollInterval: 50 * time.Millisecond,
378+
UpdateInterval: 50 * time.Millisecond,
379+
Provisioners: provisioners,
380+
WorkDirectory: t.TempDir(),
338381
})
339382
t.Cleanup(func() {
340383
_ = closer.Close()

0 commit comments

Comments
 (0)