1
// Copyright 2015 Canonical Ltd.
2
// Licensed under the AGPLv3, see LICENCE file for details.
4
package apiaddressupdater
7
"github.com/juju/errors"
8
"github.com/juju/juju/api/machiner"
9
"gopkg.in/juju/names.v2"
11
"github.com/juju/juju/agent"
12
"github.com/juju/juju/api/base"
13
"github.com/juju/juju/api/uniter"
14
"github.com/juju/juju/cmd/jujud/agent/engine"
15
"github.com/juju/juju/worker"
16
"github.com/juju/juju/worker/dependency"
19
// ManifoldConfig defines the names of the manifolds on which a Manifold will depend.
20
type ManifoldConfig engine.AgentApiManifoldConfig
22
// Manifold returns a dependency manifold that runs an API address updater worker,
23
// using the resource names defined in the supplied config.
24
func Manifold(config ManifoldConfig) dependency.Manifold {
25
typedConfig := engine.AgentApiManifoldConfig(config)
26
return engine.AgentApiManifold(typedConfig, newWorker)
29
// newWorker trivially wraps NewAPIAddressUpdater for use in a engine.AgentApiManifold.
30
// It's not tested at the moment, because the scaffolding necessary is too
31
// unwieldy/distracting to introduce at this point.
32
var newWorker = func(a agent.Agent, apiCaller base.APICaller) (worker.Worker, error) {
33
tag := a.CurrentConfig().Tag()
35
// TODO(fwereade): use appropriate facade!
36
var facade APIAddresser
37
switch apiTag := tag.(type) {
39
facade = uniter.NewState(apiCaller, apiTag)
40
case names.MachineTag:
41
facade = machiner.NewState(apiCaller)
43
return nil, errors.Errorf("expected a unit or machine tag; got %q", tag)
46
setter := agent.APIHostPortsSetter{a}
47
w, err := NewAPIAddressUpdater(facade, setter)
49
return nil, errors.Trace(err)