LEFT | RIGHT |
(no file at all) | |
1 package main | 1 package main |
2 | 2 |
3 import ( | 3 import ( |
4 "bytes" | 4 "bytes" |
5 "encoding/json" | 5 "encoding/json" |
6 "fmt" | 6 "fmt" |
7 "net/url" | 7 "net/url" |
8 "os" | 8 "os" |
9 "path/filepath" | 9 "path/filepath" |
10 | 10 |
11 . "launchpad.net/gocheck" | 11 . "launchpad.net/gocheck" |
12 "launchpad.net/goyaml" | 12 "launchpad.net/goyaml" |
13 "launchpad.net/juju-core/charm" | 13 "launchpad.net/juju-core/charm" |
14 "launchpad.net/juju-core/cmd" | 14 "launchpad.net/juju-core/cmd" |
15 "launchpad.net/juju-core/environs/dummy" | 15 "launchpad.net/juju-core/environs/dummy" |
16 "launchpad.net/juju-core/juju" | 16 "launchpad.net/juju-core/juju" |
17 "launchpad.net/juju-core/state" | 17 "launchpad.net/juju-core/state" |
18 coretesting "launchpad.net/juju-core/testing" | 18 coretesting "launchpad.net/juju-core/testing" |
| 19 "launchpad.net/juju-core/version" |
19 ) | 20 ) |
20 | 21 |
21 type StatusSuite struct { | 22 type StatusSuite struct { |
22 envSuite | 23 envSuite |
23 repoPath, seriesPath string | 24 repoPath, seriesPath string |
24 conn *juju.Conn | 25 conn *juju.Conn |
25 st *state.State | 26 st *state.State |
26 } | 27 } |
27 | 28 |
28 var _ = Suite(&StatusSuite{}) | 29 var _ = Suite(&StatusSuite{}) |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
88 m, err := st.Machine(0) | 89 m, err := st.Machine(0) |
89 c.Assert(err, IsNil) | 90 c.Assert(err, IsNil) |
90 inst, err := conn.Environ.StartInstance(m.Id(), nil, nil
) | 91 inst, err := conn.Environ.StartInstance(m.Id(), nil, nil
) |
91 c.Assert(err, IsNil) | 92 c.Assert(err, IsNil) |
92 err = m.SetInstanceId(inst.Id()) | 93 err = m.SetInstanceId(inst.Id()) |
93 c.Assert(err, IsNil) | 94 c.Assert(err, IsNil) |
94 }, | 95 }, |
95 map[string]interface{}{ | 96 map[string]interface{}{ |
96 "machines": map[int]interface{}{ | 97 "machines": map[int]interface{}{ |
97 0: map[string]interface{}{ | 98 0: map[string]interface{}{ |
98 » » » » » "dns-name": "palermo-0.dns", | 99 » » » » » "dns-name": "palermo-0.dns
", |
99 » » » » » "instance-id": "palermo-0", | 100 » » » » » "instance-id": "palermo-0", |
| 101 » » » » » "agent-version": "0.0.0", |
| 102 » » » » » "proposed-agent-version": "0.0.0", |
| 103 » » » » }, |
| 104 » » » }, |
| 105 » » » "services": make(map[string]interface{}), |
| 106 » » }, |
| 107 » }, |
| 108 » { |
| 109 » » "simulate the MA setting the version", |
| 110 » » func(st *state.State, conn *juju.Conn, c *C) { |
| 111 » » » m, err := st.Machine(0) |
| 112 » » » c.Assert(err, IsNil) |
| 113 » » » t := &state.Tools{ |
| 114 » » » » Binary: version.Binary{ |
| 115 » » » » » Number: version.MustParse("1.2.3"), |
| 116 » » » » » Series: "gutsy", |
| 117 » » » » » Arch: "ppc", |
| 118 » » » » }, |
| 119 » » » » URL: "http://canonical.com/", |
| 120 » » » } |
| 121 » » » err = m.SetAgentTools(t) |
| 122 » » » c.Assert(err, IsNil) |
| 123 » » }, |
| 124 » » map[string]interface{}{ |
| 125 » » » "machines": map[int]interface{}{ |
| 126 » » » » 0: map[string]interface{}{ |
| 127 » » » » » "dns-name": "palermo-0.dns
", |
| 128 » » » » » "instance-id": "palermo-0", |
| 129 » » » » » "agent-version": "1.2.3", |
| 130 » » » » » "proposed-agent-version": "0.0.0", |
| 131 » » » » }, |
| 132 » » » }, |
| 133 » » » "services": make(map[string]interface{}), |
| 134 » » }, |
| 135 » }, |
| 136 » { |
| 137 » » "simulate setting the proposed version", |
| 138 » » func(st *state.State, conn *juju.Conn, c *C) { |
| 139 » » » m, err := st.Machine(0) |
| 140 » » » c.Assert(err, IsNil) |
| 141 » » » t := &state.Tools{ |
| 142 » » » » Binary: version.Binary{ |
| 143 » » » » » Number: version.MustParse("2.0.3"), |
| 144 » » » » » Series: "gutsy", |
| 145 » » » » » Arch: "ppc", |
| 146 » » » » }, |
| 147 » » » » URL: "http://canonical.com/", |
| 148 » » » } |
| 149 » » » err = m.ProposeAgentTools(t) |
| 150 » » » c.Assert(err, IsNil) |
| 151 » » }, |
| 152 » » map[string]interface{}{ |
| 153 » » » "machines": map[int]interface{}{ |
| 154 » » » » 0: map[string]interface{}{ |
| 155 » » » » » "dns-name": "palermo-0.dns
", |
| 156 » » » » » "instance-id": "palermo-0", |
| 157 » » » » » "agent-version": "1.2.3", |
| 158 » » » » » "proposed-agent-version": "2.0.3", |
100 }, | 159 }, |
101 }, | 160 }, |
102 "services": make(map[string]interface{}), | 161 "services": make(map[string]interface{}), |
103 }, | 162 }, |
104 }, | 163 }, |
105 { | 164 { |
106 "add two services and expose one", | 165 "add two services and expose one", |
107 func(st *state.State, conn *juju.Conn, c *C) { | 166 func(st *state.State, conn *juju.Conn, c *C) { |
108 ch := coretesting.Charms.Dir("dummy") | 167 ch := coretesting.Charms.Dir("dummy") |
109 curl := charm.MustParseURL( | 168 curl := charm.MustParseURL( |
110 fmt.Sprintf("local:series/%s-%d", ch.Meta().Name
, ch.Revision()), | 169 fmt.Sprintf("local:series/%s-%d", ch.Meta().Name
, ch.Revision()), |
111 ) | 170 ) |
112 bundleURL, err := url.Parse("http://bundles.example.com/
dummy-1") | 171 bundleURL, err := url.Parse("http://bundles.example.com/
dummy-1") |
113 c.Assert(err, IsNil) | 172 c.Assert(err, IsNil) |
114 dummy, err := st.AddCharm(ch, curl, bundleURL, "dummy-1-
sha256") | 173 dummy, err := st.AddCharm(ch, curl, bundleURL, "dummy-1-
sha256") |
115 c.Assert(err, IsNil) | 174 c.Assert(err, IsNil) |
116 _, err = st.AddService("dummy-service", dummy) | 175 _, err = st.AddService("dummy-service", dummy) |
117 c.Assert(err, IsNil) | 176 c.Assert(err, IsNil) |
118 s, err := st.AddService("exposed-service", dummy) | 177 s, err := st.AddService("exposed-service", dummy) |
119 c.Assert(err, IsNil) | 178 c.Assert(err, IsNil) |
120 err = s.SetExposed() | 179 err = s.SetExposed() |
121 c.Assert(err, IsNil) | 180 c.Assert(err, IsNil) |
122 }, | 181 }, |
123 map[string]interface{}{ | 182 map[string]interface{}{ |
124 "machines": map[int]interface{}{ | 183 "machines": map[int]interface{}{ |
125 0: map[string]interface{}{ | 184 0: map[string]interface{}{ |
126 » » » » » "dns-name": "palermo-0.dns", | 185 » » » » » "dns-name": "palermo-0.dns
", |
127 » » » » » "instance-id": "palermo-0", | 186 » » » » » "instance-id": "palermo-0", |
| 187 » » » » » "agent-version": "1.2.3", |
| 188 » » » » » "proposed-agent-version": "2.0.3", |
128 }, | 189 }, |
129 }, | 190 }, |
130 "services": map[string]interface{}{ | 191 "services": map[string]interface{}{ |
131 "dummy-service": map[string]interface{}{ | 192 "dummy-service": map[string]interface{}{ |
132 "charm": "dummy", | 193 "charm": "dummy", |
133 "exposed": false, | 194 "exposed": false, |
134 }, | 195 }, |
135 "exposed-service": map[string]interface{}{ | 196 "exposed-service": map[string]interface{}{ |
136 "charm": "dummy", | 197 "charm": "dummy", |
137 "exposed": true, | 198 "exposed": true, |
138 }, | 199 }, |
139 }, | 200 }, |
140 }, | 201 }, |
141 }, | 202 }, |
| 203 { |
| 204 "add two more machines for units", |
| 205 func(st *state.State, conn *juju.Conn, c *C) { |
| 206 for i := 1; i < 3; i++ { |
| 207 m, err := st.AddMachine() |
| 208 c.Assert(err, IsNil) |
| 209 c.Assert(m.Id(), Equals, i) |
| 210 inst, err := conn.Environ.StartInstance(m.Id(),
nil, nil) |
| 211 c.Assert(err, IsNil) |
| 212 err = m.SetInstanceId(inst.Id()) |
| 213 c.Assert(err, IsNil) |
| 214 } |
| 215 }, |
| 216 map[string]interface{}{ |
| 217 "machines": map[int]interface{}{ |
| 218 0: map[string]interface{}{ |
| 219 "dns-name": "palermo-0.dns
", |
| 220 "instance-id": "palermo-0", |
| 221 "agent-version": "1.2.3", |
| 222 "proposed-agent-version": "2.0.3", |
| 223 }, |
| 224 1: map[string]interface{}{ |
| 225 "dns-name": "palermo-1.dns
", |
| 226 "instance-id": "palermo-1", |
| 227 "agent-version": "0.0.0", |
| 228 "proposed-agent-version": "0.0.0", |
| 229 }, |
| 230 2: map[string]interface{}{ |
| 231 "dns-name": "palermo-2.dns
", |
| 232 "instance-id": "palermo-2", |
| 233 "agent-version": "0.0.0", |
| 234 "proposed-agent-version": "0.0.0", |
| 235 }, |
| 236 }, |
| 237 "services": map[string]interface{}{ |
| 238 "dummy-service": map[string]interface{}{ |
| 239 "charm": "dummy", |
| 240 "exposed": false, |
| 241 }, |
| 242 "exposed-service": map[string]interface{}{ |
| 243 "charm": "dummy", |
| 244 "exposed": true, |
| 245 }, |
| 246 }, |
| 247 }, |
| 248 }, |
| 249 { |
| 250 "add units for services", |
| 251 func(st *state.State, conn *juju.Conn, c *C) { |
| 252 for i, n := range []string{"dummy-service", "exposed-ser
vice"} { |
| 253 s, err := st.Service(n) |
| 254 c.Assert(err, IsNil) |
| 255 u, err := s.AddUnit() |
| 256 c.Assert(err, IsNil) |
| 257 m, err := st.Machine(i + 1) |
| 258 c.Assert(err, IsNil) |
| 259 err = u.AssignToMachine(m) |
| 260 c.Assert(err, IsNil) |
| 261 } |
| 262 }, |
| 263 map[string]interface{}{ |
| 264 "machines": map[int]interface{}{ |
| 265 0: map[string]interface{}{ |
| 266 "dns-name": "palermo-0.dns
", |
| 267 "instance-id": "palermo-0", |
| 268 "agent-version": "1.2.3", |
| 269 "proposed-agent-version": "2.0.3", |
| 270 }, |
| 271 1: map[string]interface{}{ |
| 272 "dns-name": "palermo-1.dns
", |
| 273 "instance-id": "palermo-1", |
| 274 "agent-version": "0.0.0", |
| 275 "proposed-agent-version": "0.0.0", |
| 276 }, |
| 277 2: map[string]interface{}{ |
| 278 "dns-name": "palermo-2.dns
", |
| 279 "instance-id": "palermo-2", |
| 280 "agent-version": "0.0.0", |
| 281 "proposed-agent-version": "0.0.0", |
| 282 }, |
| 283 }, |
| 284 "services": map[string]interface{}{ |
| 285 "exposed-service": map[string]interface{}{ |
| 286 "exposed": true, |
| 287 "units": map[string]interface{}{ |
| 288 "exposed-service/0": map[string]
interface{}{ |
| 289 "agent-version":
"0.0.0", |
| 290 "proposed-agent-version"
: "0.0.0", |
| 291 "machine":
2, |
| 292 }, |
| 293 }, |
| 294 "charm": "dummy", |
| 295 }, |
| 296 "dummy-service": map[string]interface{}{ |
| 297 "charm": "dummy", |
| 298 "exposed": false, |
| 299 "units": map[string]interface{}{ |
| 300 "dummy-service/0": map[string]in
terface{}{ |
| 301 "agent-version":
"0.0.0", |
| 302 "proposed-agent-version"
: "0.0.0", |
| 303 "machine":
1, |
| 304 }, |
| 305 }, |
| 306 }, |
| 307 }, |
| 308 }, |
| 309 }, |
| 310 |
| 311 // TODO(dfc) test failing components by destructively mutating zk under
the hood |
142 } | 312 } |
143 | 313 |
144 func (s *StatusSuite) testStatus(format string, marshal func(v interface{}) ([]b
yte, error), unmarshal func(data []byte, v interface{}) error, c *C) { | 314 func (s *StatusSuite) testStatus(format string, marshal func(v interface{}) ([]b
yte, error), unmarshal func(data []byte, v interface{}) error, c *C) { |
145 for _, t := range statusTests { | 315 for _, t := range statusTests { |
146 c.Logf("testing %s: %s", format, t.title) | 316 c.Logf("testing %s: %s", format, t.title) |
147 t.prepare(s.st, s.conn, c) | 317 t.prepare(s.st, s.conn, c) |
148 ctx := &cmd.Context{c.MkDir(), &bytes.Buffer{}, &bytes.Buffer{}} | 318 ctx := &cmd.Context{c.MkDir(), &bytes.Buffer{}, &bytes.Buffer{}} |
149 code := cmd.Main(&StatusCommand{}, ctx, []string{"--format", for
mat}) | 319 code := cmd.Main(&StatusCommand{}, ctx, []string{"--format", for
mat}) |
150 c.Check(code, Equals, 0) | 320 c.Check(code, Equals, 0) |
151 c.Assert(ctx.Stderr.(*bytes.Buffer).String(), Equals, "") | 321 c.Assert(ctx.Stderr.(*bytes.Buffer).String(), Equals, "") |
152 | 322 |
153 var buf []byte | 323 var buf []byte |
154 var err error | 324 var err error |
155 if format == "json" { | 325 if format == "json" { |
156 buf, err = marshal(Jsonify(t.output)) | 326 buf, err = marshal(Jsonify(t.output)) |
157 } else { | 327 } else { |
158 buf, err = marshal(t.output) | 328 buf, err = marshal(t.output) |
159 } | 329 } |
160 c.Assert(err, IsNil) | 330 c.Assert(err, IsNil) |
161 expected := make(map[string]interface{}) | 331 expected := make(map[string]interface{}) |
162 err = unmarshal(buf, &expected) | 332 err = unmarshal(buf, &expected) |
163 c.Assert(err, IsNil) | 333 c.Assert(err, IsNil) |
164 | 334 |
165 actual := make(map[string]interface{}) | 335 actual := make(map[string]interface{}) |
166 err = unmarshal(ctx.Stdout.(*bytes.Buffer).Bytes(), &actual) | 336 err = unmarshal(ctx.Stdout.(*bytes.Buffer).Bytes(), &actual) |
167 c.Assert(err, IsNil) | 337 c.Assert(err, IsNil) |
168 | |
169 c.Assert(actual, DeepEquals, expected) | 338 c.Assert(actual, DeepEquals, expected) |
170 } | 339 } |
171 } | 340 } |
172 | 341 |
173 func (s *StatusSuite) TestYamlStatus(c *C) { | 342 func (s *StatusSuite) TestYamlStatus(c *C) { |
174 s.testStatus("yaml", goyaml.Marshal, goyaml.Unmarshal, c) | 343 s.testStatus("yaml", goyaml.Marshal, goyaml.Unmarshal, c) |
175 } | 344 } |
176 | 345 |
177 func (s *StatusSuite) TestJsonStatus(c *C) { | 346 func (s *StatusSuite) TestJsonStatus(c *C) { |
178 s.testStatus("json", json.Marshal, json.Unmarshal, c) | 347 s.testStatus("json", json.Marshal, json.Unmarshal, c) |
179 } | 348 } |
LEFT | RIGHT |