OLD | NEW |
1 // Copyright 2013 Canonical Ltd. | 1 // Copyright 2013 Canonical Ltd. |
2 // Licensed under the AGPLv3, see LICENCE file for details. | 2 // Licensed under the AGPLv3, see LICENCE file for details. |
3 | 3 |
4 package local | 4 package local |
5 | 5 |
6 import ( | 6 import ( |
7 "fmt" | 7 "fmt" |
8 "net" | 8 "net" |
9 "os" | 9 "os" |
| 10 "os/user" |
10 "syscall" | 11 "syscall" |
11 | 12 |
12 "github.com/loggo/loggo" | 13 "github.com/loggo/loggo" |
13 | 14 |
14 "launchpad.net/juju-core/environs" | 15 "launchpad.net/juju-core/environs" |
15 "launchpad.net/juju-core/environs/config" | 16 "launchpad.net/juju-core/environs/config" |
16 "launchpad.net/juju-core/instance" | 17 "launchpad.net/juju-core/instance" |
17 "launchpad.net/juju-core/juju/osenv" | 18 "launchpad.net/juju-core/juju/osenv" |
18 "launchpad.net/juju-core/provider" | 19 "launchpad.net/juju-core/provider" |
19 "launchpad.net/juju-core/utils" | 20 "launchpad.net/juju-core/utils" |
20 "launchpad.net/juju-core/version" | 21 "launchpad.net/juju-core/version" |
21 ) | 22 ) |
22 | 23 |
23 var logger = loggo.GetLogger("juju.provider.local") | 24 var logger = loggo.GetLogger("juju.provider.local") |
24 | 25 |
25 var _ environs.EnvironProvider = (*environProvider)(nil) | 26 var _ environs.EnvironProvider = (*environProvider)(nil) |
26 | 27 |
27 type environProvider struct{} | 28 type environProvider struct{} |
28 | 29 |
29 var providerInstance = &environProvider{} | 30 var providerInstance = &environProvider{} |
30 | 31 |
31 func init() { | 32 func init() { |
32 environs.RegisterProvider(provider.Local, providerInstance) | 33 environs.RegisterProvider(provider.Local, providerInstance) |
33 } | 34 } |
34 | 35 |
| 36 var userCurrent = user.Current |
| 37 |
35 // Open implements environs.EnvironProvider.Open. | 38 // Open implements environs.EnvironProvider.Open. |
36 func (environProvider) Open(cfg *config.Config) (environs.Environ, error) { | 39 func (environProvider) Open(cfg *config.Config) (environs.Environ, error) { |
37 logger.Infof("opening environment %q", cfg.Name()) | 40 logger.Infof("opening environment %q", cfg.Name()) |
38 if _, ok := cfg.AgentVersion(); !ok { | 41 if _, ok := cfg.AgentVersion(); !ok { |
39 newCfg, err := cfg.Apply(map[string]interface{}{ | 42 newCfg, err := cfg.Apply(map[string]interface{}{ |
40 "agent-version": version.Current.Number.String(), | 43 "agent-version": version.Current.Number.String(), |
41 }) | 44 }) |
42 if err != nil { | 45 if err != nil { |
43 return nil, err | 46 return nil, err |
44 } | 47 } |
(...skipping 20 matching lines...) Expand all Loading... |
65 return nil, err | 68 return nil, err |
66 } | 69 } |
67 environ := &localEnviron{name: cfg.Name()} | 70 environ := &localEnviron{name: cfg.Name()} |
68 if err := environ.SetConfig(cfg); err != nil { | 71 if err := environ.SetConfig(cfg); err != nil { |
69 logger.Errorf("failure setting config: %v", err) | 72 logger.Errorf("failure setting config: %v", err) |
70 return nil, err | 73 return nil, err |
71 } | 74 } |
72 return environ, nil | 75 return environ, nil |
73 } | 76 } |
74 | 77 |
| 78 var detectAptProxies = utils.DetectAptProxies |
| 79 |
75 // Prepare implements environs.EnvironProvider.Prepare. | 80 // Prepare implements environs.EnvironProvider.Prepare. |
76 func (p environProvider) Prepare(cfg *config.Config) (environs.Environ, error) { | 81 func (p environProvider) Prepare(cfg *config.Config) (environs.Environ, error) { |
| 82 // The user must not set bootstrap-ip; this is determined by the provide
r, |
| 83 // and its presence used to determine whether the environment has yet be
en |
| 84 // bootstrapped. |
| 85 if _, ok := cfg.UnknownAttrs()["bootstrap-ip"]; ok { |
| 86 return nil, fmt.Errorf("bootstrap-ip must not be specified") |
| 87 } |
77 err := checkLocalPort(cfg.StatePort(), "state port") | 88 err := checkLocalPort(cfg.StatePort(), "state port") |
78 if err != nil { | 89 if err != nil { |
79 return nil, err | 90 return nil, err |
80 } | 91 } |
81 err = checkLocalPort(cfg.APIPort(), "API port") | 92 err = checkLocalPort(cfg.APIPort(), "API port") |
82 if err != nil { | 93 if err != nil { |
83 return nil, err | 94 return nil, err |
84 } | 95 } |
85 // If the user has specified no values for any of the three normal | 96 // If the user has specified no values for any of the three normal |
86 // proxies, then look in the environment and set them. | 97 // proxies, then look in the environment and set them. |
87 attrs := make(map[string]interface{}) | 98 attrs := make(map[string]interface{}) |
88 setIfNotBlank := func(key, value string) { | 99 setIfNotBlank := func(key, value string) { |
89 if value != "" { | 100 if value != "" { |
90 attrs[key] = value | 101 attrs[key] = value |
91 } | 102 } |
92 } | 103 } |
93 logger.Tracef("Look for proxies?") | 104 logger.Tracef("Look for proxies?") |
94 if cfg.HttpProxy() == "" && | 105 if cfg.HttpProxy() == "" && |
95 cfg.HttpsProxy() == "" && | 106 cfg.HttpsProxy() == "" && |
96 cfg.FtpProxy() == "" { | 107 cfg.FtpProxy() == "" { |
97 proxy := osenv.DetectProxies() | 108 proxy := osenv.DetectProxies() |
98 logger.Tracef("Proxies detected %#v", proxy) | 109 logger.Tracef("Proxies detected %#v", proxy) |
99 setIfNotBlank("http-proxy", proxy.Http) | 110 setIfNotBlank("http-proxy", proxy.Http) |
100 setIfNotBlank("https-proxy", proxy.Https) | 111 setIfNotBlank("https-proxy", proxy.Https) |
101 setIfNotBlank("ftp-proxy", proxy.Ftp) | 112 setIfNotBlank("ftp-proxy", proxy.Ftp) |
102 } | 113 } |
103 if cfg.AptHttpProxy() == "" && | 114 if cfg.AptHttpProxy() == "" && |
104 cfg.AptHttpsProxy() == "" && | 115 cfg.AptHttpsProxy() == "" && |
105 cfg.AptFtpProxy() == "" { | 116 cfg.AptFtpProxy() == "" { |
106 » » proxy, err := utils.DetectAptProxies() | 117 » » proxy, err := detectAptProxies() |
107 if err != nil { | 118 if err != nil { |
108 return nil, err | 119 return nil, err |
109 } | 120 } |
110 setIfNotBlank("apt-http-proxy", proxy.Http) | 121 setIfNotBlank("apt-http-proxy", proxy.Http) |
111 setIfNotBlank("apt-https-proxy", proxy.Https) | 122 setIfNotBlank("apt-https-proxy", proxy.Https) |
112 setIfNotBlank("apt-ftp-proxy", proxy.Ftp) | 123 setIfNotBlank("apt-ftp-proxy", proxy.Ftp) |
113 } | 124 } |
114 if len(attrs) > 0 { | 125 if len(attrs) > 0 { |
115 cfg, err = cfg.Apply(attrs) | 126 cfg, err = cfg.Apply(attrs) |
116 if err != nil { | 127 if err != nil { |
117 return nil, err | 128 return nil, err |
118 } | 129 } |
119 } | 130 } |
120 | 131 |
121 return p.Open(cfg) | 132 return p.Open(cfg) |
122 } | 133 } |
123 | 134 |
124 // checkLocalPort checks that the passed port is not used so far. | 135 // checkLocalPort checks that the passed port is not used so far. |
125 func checkLocalPort(port int, description string) error { | 136 var checkLocalPort = func(port int, description string) error { |
126 logger.Infof("checking %s", description) | 137 logger.Infof("checking %s", description) |
127 // Try to connect the port on localhost. | 138 // Try to connect the port on localhost. |
128 address := fmt.Sprintf("localhost:%d", port) | 139 address := fmt.Sprintf("localhost:%d", port) |
129 // TODO(mue) Add a timeout? | 140 // TODO(mue) Add a timeout? |
130 conn, err := net.Dial("tcp", address) | 141 conn, err := net.Dial("tcp", address) |
131 if err != nil { | 142 if err != nil { |
132 if nerr, ok := err.(*net.OpError); ok { | 143 if nerr, ok := err.(*net.OpError); ok { |
133 if nerr.Err == syscall.ECONNREFUSED { | 144 if nerr.Err == syscall.ECONNREFUSED { |
134 // No connection, so everything is fine. | 145 // No connection, so everything is fine. |
135 return nil | 146 return nil |
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
256 return getAddressForInterface("eth0") | 267 return getAddressForInterface("eth0") |
257 } | 268 } |
258 | 269 |
259 func (p environProvider) newConfig(cfg *config.Config) (*environConfig, error) { | 270 func (p environProvider) newConfig(cfg *config.Config) (*environConfig, error) { |
260 valid, err := p.Validate(cfg, nil) | 271 valid, err := p.Validate(cfg, nil) |
261 if err != nil { | 272 if err != nil { |
262 return nil, err | 273 return nil, err |
263 } | 274 } |
264 return newEnvironConfig(valid, valid.UnknownAttrs()), nil | 275 return newEnvironConfig(valid, valid.UnknownAttrs()), nil |
265 } | 276 } |
OLD | NEW |