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  }