5
4
"launchpad.net/gnuflag"
6
5
"launchpad.net/juju/go/cmd"
6
"launchpad.net/juju/go/environs"
7
"launchpad.net/juju/go/log"
8
"launchpad.net/juju/go/state"
12
_ "launchpad.net/juju/go/environs/dummy"
13
_ "launchpad.net/juju/go/environs/ec2"
9
16
// ProvisioningAgent is a cmd.Command responsible for running a provisioning agent.
28
35
// Run runs a provisioning agent.
29
36
func (a *ProvisioningAgent) Run(_ *cmd.Context) error {
30
return fmt.Errorf("MachineAgent.Run not implemented")
37
// TODO(dfc) place the logic in a loop with a suitable delay
38
st, err := state.Open(&a.Conf.StateInfo)
42
p := NewProvisioner(st)
46
type Provisioner struct {
48
environ environs.Environ
51
environWatcher *state.ConfigWatcher
52
machinesWatcher *state.MachinesWatcher
55
// NewProvisioner returns a Provisioner.
56
func NewProvisioner(st *state.State) *Provisioner {
64
func (p *Provisioner) loop() {
67
p.environWatcher = p.st.WatchEnvironConfig()
68
// TODO(dfc) we need a method like state.IsConnected() here to exit cleanly if
69
// there is a connection problem.
72
case <-p.tomb.Dying():
74
case config, ok := <-p.environWatcher.Changes():
76
err := p.environWatcher.Stop()
83
p.environ, err = environs.NewEnviron(config.Map())
85
log.Printf("provisioner loaded invalid environment configuration: %v", err)
88
log.Printf("provisioner loaded new environment configuration")
94
func (p *Provisioner) innerLoop() {
95
p.machinesWatcher = p.st.WatchMachines()
96
// TODO(dfc) we need a method like state.IsConnected() here to exit cleanly if
97
// there is a connection problem.
100
case <-p.tomb.Dying():
102
case change, ok := <-p.environWatcher.Changes():
104
err := p.environWatcher.Stop()
110
config, err := environs.NewConfig(change.Map())
112
log.Printf("provisioner loaded invalid environment configuration: %v", err)
115
p.environ.SetConfig(config)
116
log.Printf("provisioner loaded new environment configuration")
117
case machines, ok := <-p.machinesWatcher.Changes():
119
err := p.machinesWatcher.Stop()
125
p.processMachines(machines)
130
// Wait waits for the Provisioner to exit.
131
func (p *Provisioner) Wait() error {
135
// Stop stops the Provisioner and returns any error encountered while
137
func (p *Provisioner) Stop() error {
142
func (p *Provisioner) processMachines(changes *state.MachinesChange) {}