1
// Copyright 2015 Canonical Ltd.
2
// Licensed under the AGPLv3, see LICENCE file for details.
4
package storageprovisioner
9
"github.com/juju/errors"
10
"github.com/juju/utils/clock"
11
"gopkg.in/juju/names.v2"
13
"github.com/juju/juju/agent"
14
"github.com/juju/juju/api/base"
15
"github.com/juju/juju/api/storageprovisioner"
16
"github.com/juju/juju/cmd/jujud/agent/engine"
17
"github.com/juju/juju/storage/provider"
18
"github.com/juju/juju/worker"
19
"github.com/juju/juju/worker/dependency"
22
// MachineManifoldConfig defines a storage provisioner's configuration and dependencies.
23
type MachineManifoldConfig struct {
29
func (config MachineManifoldConfig) newWorker(a agent.Agent, apiCaller base.APICaller) (worker.Worker, error) {
30
if config.Clock == nil {
31
return nil, dependency.ErrMissing
34
cfg := a.CurrentConfig()
35
api, err := storageprovisioner.NewState(apiCaller, cfg.Tag())
37
return nil, errors.Trace(err)
40
tag, ok := cfg.Tag().(names.MachineTag)
42
return nil, errors.Errorf("this manifold may only be used inside a machine agent")
45
storageDir := filepath.Join(cfg.DataDir(), "storage")
46
w, err := NewStorageProvisioner(Config{
48
StorageDir: storageDir,
52
Registry: provider.CommonStorageProviders(),
58
return nil, errors.Trace(err)
63
// MachineManifold returns a dependency.Manifold that runs a storage provisioner.
64
func MachineManifold(config MachineManifoldConfig) dependency.Manifold {
65
typedConfig := engine.AgentApiManifoldConfig{
66
AgentName: config.AgentName,
67
APICallerName: config.APICallerName,
69
return engine.AgentApiManifold(typedConfig, config.newWorker)