1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
|
// Copyright 2013 Joyent Inc.
// Licensed under the AGPLv3, see LICENCE file for details.
package joyent
import (
"sync"
"launchpad.net/juju-core/constraints"
"launchpad.net/juju-core/environs"
"launchpad.net/juju-core/environs/config"
"launchpad.net/juju-core/environs/storage"
"launchpad.net/juju-core/provider/common"
"launchpad.net/juju-core/state"
"launchpad.net/juju-core/state/api"
)
// This file contains the core of the joyent Environ implementation. You will
// probably not need to change this file very much to begin with; and if you
// never need to add any more fields, you may never need to touch it.
//
// The rest of the implementation is split into environ_instance.go (which
// must be implemented ) and environ_firewall.go (which can be safely
// ignored until you've got an environment bootstrapping successfully).
type joyentEnviron struct {
name string
// All mutating operations should lock the mutex. Non-mutating operations
// should read all fields (other than name, which is immutable) from a
// shallow copy taken with getSnapshot().
// This advice is predicated on the goroutine-safety of the values of the
// affected fields.
lock sync.Mutex
ecfg *environConfig
storage storage.Storage
}
var _ environs.Environ = (*joyentEnviron)(nil)
func NewEnviron(cfg *config.Config) (*joyentEnviron, error) {
env := new(joyentEnviron)
err := env.SetConfig(cfg)
if err != nil {
return nil, err
}
env.name = cfg.Name()
env.storage = NewStorage(env)
return env, nil
}
func (env *joyentEnviron) Name() string {
return env.name
}
func (*joyentEnviron) Provider() environs.EnvironProvider {
return providerInstance
}
func (env *joyentEnviron) SetConfig(cfg *config.Config) error {
env.lock.Lock()
defer env.lock.Unlock()
ecfg, err := validateConfig(cfg, env.ecfg)
if err != nil {
return err
}
storage, err := newStorage(ecfg)
if err != nil {
return err
}
env.ecfg = ecfg
env.storage = storage
return nil
}
func (env *joyentEnviron) getSnapshot() *joyentEnviron {
env.lock.Lock()
clone := *env
env.lock.Unlock()
clone.lock = sync.Mutex{}
return &clone
}
func (env *joyentEnviron) Config() *config.Config {
return env.getSnapshot().ecfg.Config
}
func (env *joyentEnviron) Storage() storage.Storage {
return env.getSnapshot().storage
}
func (env *joyentEnviron) PublicStorage() storage.StorageReader {
return environs.EmptyStorage
}
func (env *joyentEnviron) Bootstrap(ctx environs.BootstrapContext, cons constraints.Value) error {
return common.Bootstrap(ctx, env, cons)
}
func (env *joyentEnviron) StateInfo() (*state.Info, *api.Info, error) {
return common.StateInfo(env)
}
func (env *joyentEnviron) Destroy() error {
return common.Destroy(env)
}
|