github.com/wallyworld/juju@v0.0.0-20161013125918-6cf1bc9d917a/worker/uniter/operation/util_test.go (about) 1 // Copyright 2014-2015 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package operation_test 5 6 import ( 7 "github.com/juju/errors" 8 "github.com/juju/testing" 9 utilexec "github.com/juju/utils/exec" 10 corecharm "gopkg.in/juju/charm.v6-unstable" 11 "gopkg.in/juju/charm.v6-unstable/hooks" 12 13 "github.com/juju/juju/worker/uniter/charm" 14 "github.com/juju/juju/worker/uniter/hook" 15 "github.com/juju/juju/worker/uniter/operation" 16 "github.com/juju/juju/worker/uniter/runner" 17 "github.com/juju/juju/worker/uniter/runner/context" 18 "github.com/juju/juju/worker/uniter/runner/jujuc" 19 ) 20 21 type MockGetArchiveInfo struct { 22 gotCharmURL *corecharm.URL 23 info charm.BundleInfo 24 err error 25 } 26 27 func (mock *MockGetArchiveInfo) Call(charmURL *corecharm.URL) (charm.BundleInfo, error) { 28 mock.gotCharmURL = charmURL 29 return mock.info, mock.err 30 } 31 32 type MockSetCurrentCharm struct { 33 gotCharmURL *corecharm.URL 34 err error 35 } 36 37 func (mock *MockSetCurrentCharm) Call(charmURL *corecharm.URL) error { 38 mock.gotCharmURL = charmURL 39 return mock.err 40 } 41 42 type DeployCallbacks struct { 43 operation.Callbacks 44 *MockGetArchiveInfo 45 *MockSetCurrentCharm 46 MockInitializeMetricsTimers *MockNoArgs 47 } 48 49 func (cb *DeployCallbacks) GetArchiveInfo(charmURL *corecharm.URL) (charm.BundleInfo, error) { 50 return cb.MockGetArchiveInfo.Call(charmURL) 51 } 52 53 func (cb *DeployCallbacks) SetCurrentCharm(charmURL *corecharm.URL) error { 54 return cb.MockSetCurrentCharm.Call(charmURL) 55 } 56 57 func (cb *DeployCallbacks) InitializeMetricsTimers() error { 58 return cb.MockInitializeMetricsTimers.Call() 59 } 60 61 type MockBundleInfo struct { 62 charm.BundleInfo 63 } 64 65 type MockStage struct { 66 gotInfo *charm.BundleInfo 67 gotAbort *<-chan struct{} 68 err error 69 } 70 71 func (mock *MockStage) Call(info charm.BundleInfo, abort <-chan struct{}) error { 72 mock.gotInfo = &info 73 mock.gotAbort = &abort 74 return mock.err 75 } 76 77 type MockNoArgs struct { 78 called bool 79 err error 80 } 81 82 func (mock *MockNoArgs) Call() error { 83 mock.called = true 84 return mock.err 85 } 86 87 type MockDeployer struct { 88 charm.Deployer 89 *MockStage 90 MockDeploy *MockNoArgs 91 MockNotifyRevert *MockNoArgs 92 MockNotifyResolved *MockNoArgs 93 } 94 95 func (d *MockDeployer) Stage(info charm.BundleInfo, abort <-chan struct{}) error { 96 return d.MockStage.Call(info, abort) 97 } 98 99 func (d *MockDeployer) Deploy() error { 100 return d.MockDeploy.Call() 101 } 102 103 type MockFailAction struct { 104 gotActionId *string 105 gotMessage *string 106 err error 107 } 108 109 func (mock *MockFailAction) Call(actionId, message string) error { 110 mock.gotActionId = &actionId 111 mock.gotMessage = &message 112 return mock.err 113 } 114 115 type RunActionCallbacks struct { 116 operation.Callbacks 117 *MockFailAction 118 executingMessage string 119 } 120 121 func (cb *RunActionCallbacks) FailAction(actionId, message string) error { 122 return cb.MockFailAction.Call(actionId, message) 123 } 124 125 func (cb *RunActionCallbacks) SetExecutingStatus(message string) error { 126 cb.executingMessage = message 127 return nil 128 } 129 130 type RunCommandsCallbacks struct { 131 operation.Callbacks 132 executingMessage string 133 } 134 135 func (cb *RunCommandsCallbacks) SetExecutingStatus(message string) error { 136 cb.executingMessage = message 137 return nil 138 } 139 140 type MockPrepareHook struct { 141 gotHook *hook.Info 142 name string 143 err error 144 } 145 146 func (mock *MockPrepareHook) Call(hookInfo hook.Info) (string, error) { 147 mock.gotHook = &hookInfo 148 return mock.name, mock.err 149 } 150 151 type PrepareHookCallbacks struct { 152 operation.Callbacks 153 *MockPrepareHook 154 executingMessage string 155 } 156 157 func (cb *PrepareHookCallbacks) PrepareHook(hookInfo hook.Info) (string, error) { 158 return cb.MockPrepareHook.Call(hookInfo) 159 } 160 161 func (cb *PrepareHookCallbacks) SetExecutingStatus(message string) error { 162 cb.executingMessage = message 163 return nil 164 } 165 166 type MockNotify struct { 167 gotName *string 168 gotContext *runner.Context 169 } 170 171 func (mock *MockNotify) Call(hookName string, ctx runner.Context) { 172 mock.gotName = &hookName 173 mock.gotContext = &ctx 174 } 175 176 type ExecuteHookCallbacks struct { 177 *PrepareHookCallbacks 178 MockNotifyHookCompleted *MockNotify 179 MockNotifyHookFailed *MockNotify 180 } 181 182 func (cb *ExecuteHookCallbacks) NotifyHookCompleted(hookName string, ctx runner.Context) { 183 cb.MockNotifyHookCompleted.Call(hookName, ctx) 184 } 185 186 func (cb *ExecuteHookCallbacks) NotifyHookFailed(hookName string, ctx runner.Context) { 187 cb.MockNotifyHookFailed.Call(hookName, ctx) 188 } 189 190 type MockCommitHook struct { 191 gotHook *hook.Info 192 err error 193 } 194 195 func (mock *MockCommitHook) Call(hookInfo hook.Info) error { 196 mock.gotHook = &hookInfo 197 return mock.err 198 } 199 200 type CommitHookCallbacks struct { 201 operation.Callbacks 202 *MockCommitHook 203 } 204 205 func (cb *CommitHookCallbacks) CommitHook(hookInfo hook.Info) error { 206 return cb.MockCommitHook.Call(hookInfo) 207 } 208 209 type MockUpdateRelations struct { 210 gotIds *[]int 211 err error 212 } 213 214 func (mock *MockUpdateRelations) Call(ids []int) error { 215 mock.gotIds = &ids 216 return mock.err 217 } 218 219 type UpdateRelationsCallbacks struct { 220 operation.Callbacks 221 *MockUpdateRelations 222 } 223 224 func (cb *UpdateRelationsCallbacks) UpdateRelations(ids []int) error { 225 return cb.MockUpdateRelations.Call(ids) 226 } 227 228 type MockNewActionRunner struct { 229 gotActionId *string 230 runner *MockRunner 231 err error 232 } 233 234 func (mock *MockNewActionRunner) Call(actionId string) (runner.Runner, error) { 235 mock.gotActionId = &actionId 236 return mock.runner, mock.err 237 } 238 239 type MockNewHookRunner struct { 240 gotHook *hook.Info 241 runner *MockRunner 242 err error 243 } 244 245 func (mock *MockNewHookRunner) Call(hookInfo hook.Info) (runner.Runner, error) { 246 mock.gotHook = &hookInfo 247 return mock.runner, mock.err 248 } 249 250 type MockNewCommandRunner struct { 251 gotInfo *context.CommandInfo 252 runner *MockRunner 253 err error 254 } 255 256 func (mock *MockNewCommandRunner) Call(info context.CommandInfo) (runner.Runner, error) { 257 mock.gotInfo = &info 258 return mock.runner, mock.err 259 } 260 261 type MockRunnerFactory struct { 262 *MockNewActionRunner 263 *MockNewHookRunner 264 *MockNewCommandRunner 265 } 266 267 func (f *MockRunnerFactory) NewActionRunner(actionId string) (runner.Runner, error) { 268 return f.MockNewActionRunner.Call(actionId) 269 } 270 271 func (f *MockRunnerFactory) NewHookRunner(hookInfo hook.Info) (runner.Runner, error) { 272 return f.MockNewHookRunner.Call(hookInfo) 273 } 274 275 func (f *MockRunnerFactory) NewCommandRunner(commandInfo context.CommandInfo) (runner.Runner, error) { 276 return f.MockNewCommandRunner.Call(commandInfo) 277 } 278 279 type MockContext struct { 280 runner.Context 281 testing.Stub 282 actionData *context.ActionData 283 setStatusCalled bool 284 status jujuc.StatusInfo 285 } 286 287 func (mock *MockContext) ActionData() (*context.ActionData, error) { 288 if mock.actionData == nil { 289 return nil, errors.New("not an action context") 290 } 291 return mock.actionData, nil 292 } 293 294 func (mock *MockContext) HasExecutionSetUnitStatus() bool { 295 return mock.setStatusCalled 296 } 297 298 func (mock *MockContext) ResetExecutionSetUnitStatus() { 299 mock.setStatusCalled = false 300 } 301 302 func (mock *MockContext) SetUnitStatus(status jujuc.StatusInfo) error { 303 mock.setStatusCalled = true 304 mock.status = status 305 return nil 306 } 307 308 func (mock *MockContext) UnitName() string { 309 return "unit/0" 310 } 311 312 func (mock *MockContext) UnitStatus() (*jujuc.StatusInfo, error) { 313 return &mock.status, nil 314 } 315 316 func (mock *MockContext) Prepare() error { 317 mock.MethodCall(mock, "Prepare") 318 return mock.NextErr() 319 } 320 321 type MockRunAction struct { 322 gotName *string 323 err error 324 } 325 326 func (mock *MockRunAction) Call(actionName string) error { 327 mock.gotName = &actionName 328 return mock.err 329 } 330 331 type MockRunCommands struct { 332 gotCommands *string 333 response *utilexec.ExecResponse 334 err error 335 } 336 337 func (mock *MockRunCommands) Call(commands string) (*utilexec.ExecResponse, error) { 338 mock.gotCommands = &commands 339 return mock.response, mock.err 340 } 341 342 type MockRunHook struct { 343 gotName *string 344 err error 345 setStatusCalled bool 346 } 347 348 func (mock *MockRunHook) Call(hookName string) error { 349 mock.gotName = &hookName 350 return mock.err 351 } 352 353 type MockRunner struct { 354 *MockRunAction 355 *MockRunCommands 356 *MockRunHook 357 context runner.Context 358 } 359 360 func (r *MockRunner) Context() runner.Context { 361 return r.context 362 } 363 364 func (r *MockRunner) RunAction(actionName string) error { 365 return r.MockRunAction.Call(actionName) 366 } 367 368 func (r *MockRunner) RunCommands(commands string) (*utilexec.ExecResponse, error) { 369 return r.MockRunCommands.Call(commands) 370 } 371 372 func (r *MockRunner) RunHook(hookName string) error { 373 r.Context().(*MockContext).setStatusCalled = r.MockRunHook.setStatusCalled 374 return r.MockRunHook.Call(hookName) 375 } 376 377 func NewDeployCallbacks() *DeployCallbacks { 378 return &DeployCallbacks{ 379 MockGetArchiveInfo: &MockGetArchiveInfo{info: &MockBundleInfo{}}, 380 MockSetCurrentCharm: &MockSetCurrentCharm{}, 381 } 382 } 383 384 func NewDeployCommitCallbacks(err error) *DeployCallbacks { 385 return &DeployCallbacks{ 386 MockInitializeMetricsTimers: &MockNoArgs{err: err}, 387 } 388 } 389 func NewMockDeployer() *MockDeployer { 390 return &MockDeployer{ 391 MockStage: &MockStage{}, 392 MockDeploy: &MockNoArgs{}, 393 MockNotifyRevert: &MockNoArgs{}, 394 MockNotifyResolved: &MockNoArgs{}, 395 } 396 } 397 398 func NewPrepareHookCallbacks() *PrepareHookCallbacks { 399 return &PrepareHookCallbacks{ 400 MockPrepareHook: &MockPrepareHook{nil, "some-hook-name", nil}, 401 } 402 } 403 404 func NewRunActionRunnerFactory(runErr error) *MockRunnerFactory { 405 return &MockRunnerFactory{ 406 MockNewActionRunner: &MockNewActionRunner{ 407 runner: &MockRunner{ 408 MockRunAction: &MockRunAction{err: runErr}, 409 context: &MockContext{ 410 actionData: &context.ActionData{Name: "some-action-name"}, 411 }, 412 }, 413 }, 414 } 415 } 416 417 func NewRunCommandsRunnerFactory(runResponse *utilexec.ExecResponse, runErr error) *MockRunnerFactory { 418 return &MockRunnerFactory{ 419 MockNewCommandRunner: &MockNewCommandRunner{ 420 runner: &MockRunner{ 421 MockRunCommands: &MockRunCommands{response: runResponse, err: runErr}, 422 context: &MockContext{}, 423 }, 424 }, 425 } 426 } 427 428 func NewRunHookRunnerFactory(runErr error) *MockRunnerFactory { 429 return &MockRunnerFactory{ 430 MockNewHookRunner: &MockNewHookRunner{ 431 runner: &MockRunner{ 432 MockRunHook: &MockRunHook{err: runErr}, 433 context: &MockContext{}, 434 }, 435 }, 436 } 437 } 438 439 type MockSendResponse struct { 440 gotResponse **utilexec.ExecResponse 441 gotErr *error 442 } 443 444 func (mock *MockSendResponse) Call(response *utilexec.ExecResponse, err error) { 445 mock.gotResponse = &response 446 mock.gotErr = &err 447 } 448 449 var curl = corecharm.MustParseURL 450 var someActionId = "f47ac10b-58cc-4372-a567-0e02b2c3d479" 451 var randomActionId = "9f484882-2f18-4fd2-967d-db9663db7bea" 452 var overwriteState = operation.State{ 453 Kind: operation.Continue, 454 Step: operation.Pending, 455 Started: true, 456 CharmURL: curl("cs:quantal/wordpress-2"), 457 ActionId: &randomActionId, 458 Hook: &hook.Info{Kind: hooks.Install}, 459 } 460 var someCommandArgs = operation.CommandArgs{ 461 Commands: "do something", 462 RelationId: 123, 463 RemoteUnitName: "foo/456", 464 ForceRemoteUnit: true, 465 }