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