Skip to content

Commit 59b6165

Browse files
committed
Merge branch '2.9' into merge-2.9-20220112
2 parents 4bc645a + b9b2dc6 commit 59b6165

File tree

7 files changed

+303
-49
lines changed

7 files changed

+303
-49
lines changed

worker/caasapplicationprovisioner/application.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,10 @@ func NewAppWorker(config AppWorkerConfig) func() (worker.Worker, error) {
8383
}
8484

8585
func (a *appWorker) Notify() {
86-
a.changes <- struct{}{}
86+
select {
87+
case a.changes <- struct{}{}:
88+
case <-a.catacomb.Dying():
89+
}
8790
}
8891

8992
func (a *appWorker) Kill() {

worker/caasapplicationprovisioner/application_test.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -909,7 +909,6 @@ func (s *ApplicationWorkerSuite) TestUpgradeInfoNotFound(c *gc.C) {
909909
return nil, errors.NotFoundf("test charm")
910910
}),
911911
)
912-
913912
appWorker := s.startAppWorker(c, nil, facade, broker, nil)
914913

915914
s.waitDone(c, done)

worker/caasapplicationprovisioner/mock_test.go

Lines changed: 1 addition & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -6,26 +6,12 @@ package caasapplicationprovisioner_test
66
import (
77
jujutesting "github.com/juju/testing"
88
"github.com/juju/worker/v3"
9-
10-
"github.com/juju/juju/core/watcher"
11-
"github.com/juju/juju/core/watcher/watchertest"
12-
"github.com/juju/juju/worker/caasapplicationprovisioner"
139
)
1410

1511
//go:generate go run github.com/golang/mock/mockgen -package mocks -destination mocks/broker_mock.go github.com/juju/juju/worker/caasapplicationprovisioner CAASBroker
1612
//go:generate go run github.com/golang/mock/mockgen -package mocks -destination mocks/facade_mock.go github.com/juju/juju/worker/caasapplicationprovisioner CAASProvisionerFacade
1713
//go:generate go run github.com/golang/mock/mockgen -package mocks -destination mocks/unitfacade_mock.go github.com/juju/juju/worker/caasapplicationprovisioner CAASUnitProvisionerFacade
18-
19-
type mockFacade struct {
20-
caasapplicationprovisioner.CAASProvisionerFacade
21-
jujutesting.Stub
22-
appWatcher *watchertest.MockStringsWatcher
23-
}
24-
25-
func (f *mockFacade) WatchApplications() (watcher.StringsWatcher, error) {
26-
f.MethodCall(f, "WatchApplications")
27-
return f.appWatcher, f.NextErr()
28-
}
14+
//go:generate go run github.com/golang/mock/mockgen -package mocks -destination mocks/runner_mock.go github.com/juju/juju/worker/caasapplicationprovisioner Runner
2915

3016
type mockNotifyWorker struct {
3117
worker.Worker

worker/caasapplicationprovisioner/mocks/runner_mock.go

Lines changed: 104 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

worker/caasapplicationprovisioner/package_test.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
// Copyright 2020 Canonical Ltd.
22
// Licensed under the AGPLv3, see LICENCE file for details.
33

4-
package caasapplicationprovisioner_test
4+
package caasapplicationprovisioner
55

66
import (
77
stdtesting "testing"
@@ -12,3 +12,5 @@ import (
1212
func TestPackage(t *stdtesting.T) {
1313
gc.TestingT(t)
1414
}
15+
16+
var NewProvisionerWorkerForTest = newProvisionerWorker

worker/caasapplicationprovisioner/worker.go

Lines changed: 51 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,14 @@ type CAASBroker interface {
7070
Units(appName string, mode caas.DeploymentMode) ([]caas.Unit, error)
7171
}
7272

73+
// Runner exposes functionalities of a worker.Runner.
74+
type Runner interface {
75+
Worker(id string, abort <-chan struct{}) (worker.Worker, error)
76+
StartWorker(id string, startFunc func() (worker.Worker, error)) error
77+
StopAndRemoveWorker(id string, abort <-chan struct{}) error
78+
worker.Worker
79+
}
80+
7381
// Config defines the operation of a Worker.
7482
type Config struct {
7583
Facade CAASProvisionerFacade
@@ -83,7 +91,7 @@ type Config struct {
8391

8492
type provisioner struct {
8593
catacomb catacomb.Catacomb
86-
runner *worker.Runner
94+
runner Runner
8795
facade CAASProvisionerFacade
8896
broker CAASBroker
8997
clock clock.Clock
@@ -95,20 +103,28 @@ type provisioner struct {
95103

96104
// NewProvisionerWorker starts and returns a new CAAS provisioner worker.
97105
func NewProvisionerWorker(config Config) (worker.Worker, error) {
106+
return newProvisionerWorker(config,
107+
worker.NewRunner(worker.RunnerParams{
108+
Clock: config.Clock,
109+
IsFatal: func(error) bool { return false },
110+
RestartDelay: 3 * time.Second,
111+
Logger: config.Logger.Child("runner"),
112+
}),
113+
)
114+
}
115+
116+
func newProvisionerWorker(
117+
config Config, runner Runner,
118+
) (worker.Worker, error) {
98119
p := &provisioner{
99120
facade: config.Facade,
100121
broker: config.Broker,
101122
modelTag: config.ModelTag,
102123
clock: config.Clock,
103124
logger: config.Logger,
104125
newAppWorker: config.NewAppWorker,
105-
runner: worker.NewRunner(worker.RunnerParams{
106-
Clock: config.Clock,
107-
IsFatal: func(error) bool { return false },
108-
RestartDelay: 3 * time.Second,
109-
Logger: config.Logger.Child("runner"),
110-
}),
111-
unitFacade: config.UnitFacade,
126+
runner: runner,
127+
unitFacade: config.UnitFacade,
112128
}
113129
err := catacomb.Invoke(catacomb.Plan{
114130
Site: &p.catacomb,
@@ -145,8 +161,17 @@ func (p *provisioner) loop() error {
145161
if !ok {
146162
return errors.New("app watcher closed channel")
147163
}
148-
for _, app := range apps {
149-
existingWorker, err := p.runner.Worker(app, nil)
164+
for _, appName := range apps {
165+
appLife, err := p.facade.Life(appName)
166+
if err != nil && !errors.IsNotFound(err) {
167+
return errors.Trace(err)
168+
}
169+
if errors.IsNotFound(err) || appLife == life.Dead {
170+
p.shutDownAppWorker(appName)
171+
continue
172+
}
173+
174+
existingWorker, err := p.runner.Worker(appName, p.catacomb.Dying())
150175
if errors.IsNotFound(err) {
151176
// Ignore.
152177
} else if err == worker.ErrDead {
@@ -163,20 +188,33 @@ func (p *provisioner) loop() error {
163188
}
164189

165190
config := AppWorkerConfig{
166-
Name: app,
191+
Name: appName,
167192
Facade: p.facade,
168193
Broker: p.broker,
169194
ModelTag: p.modelTag,
170195
Clock: p.clock,
171-
Logger: p.logger.Child("applicationworker"),
196+
Logger: p.logger.Child(appName),
172197
UnitFacade: p.unitFacade,
173198
}
174199
startFunc := p.newAppWorker(config)
175-
err = p.runner.StartWorker(app, startFunc)
200+
p.logger.Debugf("starting app worker %q", appName)
201+
err = p.runner.StartWorker(appName, startFunc)
176202
if err != nil {
177203
return errors.Trace(err)
178204
}
179205
}
180206
}
181207
}
182208
}
209+
210+
func (p *provisioner) shutDownAppWorker(appName string) {
211+
err := p.runner.StopAndRemoveWorker(appName, p.catacomb.Dying())
212+
if errors.IsNotFound(err) {
213+
return
214+
}
215+
if err != nil {
216+
p.logger.Warningf("stopping app worker %q: %v", appName, err)
217+
return
218+
}
219+
p.logger.Debugf("removed app worker %q", appName)
220+
}

0 commit comments

Comments
 (0)