53
50
c.Assert(result.Host, gc.Equals, "")
56
// blockAllChanges blocks all operations that could change environment -
57
// setting block-all-changes to true.
58
// Asserts that no errors were encountered.
59
func (s *runSuite) blockAllChanges(c *gc.C) {
60
err := s.State.UpdateEnvironConfig(map[string]interface{}{"block-all-changes": true}, nil, nil)
61
c.Assert(err, jc.ErrorIsNil)
64
53
func (s *runSuite) TestRemoteParamsForMachinePopulatesWithAddress(c *gc.C) {
65
54
machine := s.addMachineWithAddress(c, "10.3.2.1")
80
69
c.Assert(err, jc.ErrorIsNil)
81
70
machine, err := s.State.Machine(mId)
82
71
c.Assert(err, jc.ErrorIsNil)
83
machine.SetProviderAddresses(network.NewAddress("10.3.2.1", network.ScopeUnknown))
72
machine.SetProviderAddresses(network.NewAddress("10.3.2.1"))
87
76
func (s *runSuite) TestGetAllUnitNames(c *gc.C) {
88
77
charm := s.AddTestingCharm(c, "dummy")
89
78
owner := s.AdminUserTag(c)
90
magic, err := s.State.AddService("magic", owner.String(), charm, nil)
79
magic, err := s.State.AddService("magic", owner.String(), charm, nil, nil, nil)
91
80
s.addUnit(c, magic)
92
81
s.addUnit(c, magic)
94
notAssigned, err := s.State.AddService("not-assigned", owner.String(), charm, nil)
83
notAssigned, err := s.State.AddService("not-assigned", owner.String(), charm, nil, nil, nil)
95
84
c.Assert(err, jc.ErrorIsNil)
96
85
_, err = notAssigned.AddUnit()
97
86
c.Assert(err, jc.ErrorIsNil)
99
_, err = s.State.AddService("no-units", owner.String(), charm, nil)
88
_, err = s.State.AddService("no-units", owner.String(), charm, nil, nil, nil)
100
89
c.Assert(err, jc.ErrorIsNil)
102
wordpress, err := s.State.AddService("wordpress", owner.String(), s.AddTestingCharm(c, "wordpress"), nil)
91
wordpress, err := s.State.AddService("wordpress", owner.String(), s.AddTestingCharm(c, "wordpress"), nil, nil, nil)
103
92
c.Assert(err, jc.ErrorIsNil)
104
93
wordpress0 := s.addUnit(c, wordpress)
105
_, err = s.State.AddService("logging", owner.String(), s.AddTestingCharm(c, "logging"), nil)
94
_, err = s.State.AddService("logging", owner.String(), s.AddTestingCharm(c, "logging"), nil, nil, nil)
106
95
c.Assert(err, jc.ErrorIsNil)
108
97
eps, err := s.State.InferEndpoints("logging", "wordpress")
173
162
func (s *runSuite) mockSSH(c *gc.C, cmd string) {
175
fakessh := filepath.Join(testbin, "ssh")
176
s.PatchEnvPathPrepend(testbin)
177
err := ioutil.WriteFile(fakessh, []byte(cmd), 0755)
178
c.Assert(err, jc.ErrorIsNil)
163
gitjujutesting.PatchExecutable(c, s, "ssh", cmd)
164
gitjujutesting.PatchExecutable(c, s, "scp", cmd)
165
client, _ := ssh.NewOpenSSHClient()
166
s.PatchValue(&ssh.DefaultClient, client)
181
169
func (s *runSuite) TestParallelExecuteErrorsOnBlankHost(c *gc.C) {
182
170
s.mockSSH(c, echoInputShowArgs)
184
172
params := []*client.RemoteExec{
186
174
ExecParams: ssh.ExecParams{
188
176
Timeout: testing.LongWait,
213
201
c.Assert(runResults.Results, gc.HasLen, 1)
214
202
result := runResults.Results[0]
215
203
c.Assert(result.Error, gc.Equals, "")
216
c.Assert(string(result.Stderr), jc.Contains, "-i /some/dir/system-identity")
204
c.Assert(string(result.Stderr), jc.Contains, "system-identity")
219
207
func (s *runSuite) TestParallelExecuteCopiesAcrossMachineAndUnit(c *gc.C) {
220
208
s.mockSSH(c, echoInputShowArgs)
222
210
params := []*client.RemoteExec{
224
212
ExecParams: ssh.ExecParams{
225
213
Host: "localhost",
254
242
results, err := client.RunOnAllMachines("hostname", testing.LongWait)
255
243
c.Assert(err, jc.ErrorIsNil)
256
244
c.Assert(results, gc.HasLen, 3)
257
246
var expectedResults []params.RunResult
258
247
for i := 0; i < 3; i++ {
259
248
expectedResults = append(expectedResults,
260
249
params.RunResult{
261
ExecResponse: exec.ExecResponse{Stdout: []byte("juju-run --no-context 'hostname'\n")},
250
ExecResponse: exec.ExecResponse{Stdout: []byte(expectedCommand[0])},
263
252
MachineId: fmt.Sprint(i),
276
265
s.mockSSH(c, echoInput)
278
267
// block all changes
280
client := s.APIState.Client()
281
_, err := client.RunOnAllMachines("hostname", testing.LongWait)
282
c.Assert(errors.Cause(err), gc.DeepEquals, common.ErrOperationBlocked)
268
s.BlockAllChanges(c, "TestBlockRunOnAllMachines")
269
_, err := s.APIState.Client().RunOnAllMachines("hostname", testing.LongWait)
270
s.AssertBlocked(c, err, "TestBlockRunOnAllMachines")
285
273
func (s *runSuite) TestRunMachineAndService(c *gc.C) {
289
277
charm := s.AddTestingCharm(c, "dummy")
290
278
owner := s.Factory.MakeUser(c, nil).Tag()
291
magic, err := s.State.AddService("magic", owner.String(), charm, nil)
279
magic, err := s.State.AddService("magic", owner.String(), charm, nil, nil, nil)
292
280
c.Assert(err, jc.ErrorIsNil)
293
281
s.addUnit(c, magic)
294
282
s.addUnit(c, magic)
309
297
c.Assert(err, jc.ErrorIsNil)
310
298
c.Assert(results, gc.HasLen, 3)
311
300
expectedResults := []params.RunResult{
313
ExecResponse: exec.ExecResponse{Stdout: []byte("juju-run --no-context 'hostname'\n")},
302
ExecResponse: exec.ExecResponse{Stdout: []byte(expectedCommand[0])},
317
ExecResponse: exec.ExecResponse{Stdout: []byte("juju-run magic/0 'hostname'\n")},
306
ExecResponse: exec.ExecResponse{Stdout: []byte(expectedCommand[1])},
319
308
UnitId: "magic/0",
322
ExecResponse: exec.ExecResponse{Stdout: []byte("juju-run magic/1 'hostname'\n")},
311
ExecResponse: exec.ExecResponse{Stdout: []byte(expectedCommand[2])},
324
313
UnitId: "magic/1",
335
324
charm := s.AddTestingCharm(c, "dummy")
336
325
owner := s.Factory.MakeUser(c, nil).Tag()
337
magic, err := s.State.AddService("magic", owner.String(), charm, nil)
326
magic, err := s.State.AddService("magic", owner.String(), charm, nil, nil, nil)
338
327
c.Assert(err, jc.ErrorIsNil)
339
328
s.addUnit(c, magic)
340
329
s.addUnit(c, magic)
355
344
Machines: []string{"0"},
356
345
Services: []string{"magic"},
358
c.Assert(errors.Cause(err), gc.DeepEquals, common.ErrOperationBlocked)
347
s.AssertBlocked(c, err, "TestBlockRunMachineAndService")
361
var echoInputShowArgs = `#!/bin/bash
362
# Write the args to stderr
364
# And echo stdin to stdout
370
var echoInput = `#!/bin/bash
371
# And echo stdin to stdout