~sinzui/ubuntu/vivid/juju-core/vivid-1.24.6

« back to all changes in this revision

Viewing changes to src/gopkg.in/goose.v1/testservices/hook/service.go

  • Committer: Curtis Hovey
  • Date: 2015-09-30 14:14:54 UTC
  • mfrom: (1.1.34)
  • Revision ID: curtis@hovey.name-20150930141454-o3ldf23dzyjio6c0
Backport of 1.24.6 from wily. (LP: #1500916)

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
package hook
 
2
 
 
3
type TestService struct {
 
4
        ServiceControl
 
5
        // Hooks to run when specified control points are reached in the service business logic.
 
6
        ControlHooks map[string]ControlProcessor
 
7
}
 
8
 
 
9
// ControlProcessor defines a function that is run when a specified control point is reached in the service
 
10
// business logic. The function receives the service instance so internal state can be inspected, plus for any
 
11
// arguments passed to the currently executing service function.
 
12
type ControlProcessor func(sc ServiceControl, args ...interface{}) error
 
13
 
 
14
// ControlHookCleanup defines a function used to remove a control hook.
 
15
type ControlHookCleanup func()
 
16
 
 
17
// ServiceControl instances allow hooks to be registered for execution at the specified point of execution.
 
18
// The control point name can be a function name or a logical execution point meaningful to the service.
 
19
// If name is "", the hook for the currently executing function is executed.
 
20
// Returns a function which can be used to remove the hook.
 
21
type ServiceControl interface {
 
22
        RegisterControlPoint(name string, controller ControlProcessor) ControlHookCleanup
 
23
}
 
24
 
 
25
// ProcessControlHook retrieves the ControlProcessor for the specified hook name and runs it, returning any error.
 
26
// Use it like this to invoke a hook registered for some arbitrary control point:
 
27
// if err := n.ProcessControlHook("foobar", <serviceinstance>, <somearg1>, <somearg2>); err != nil {
 
28
//     return err
 
29
// }
 
30
func (s *TestService) ProcessControlHook(hookName string, sc ServiceControl, args ...interface{}) error {
 
31
        if s.ControlHooks == nil {
 
32
                return nil
 
33
        }
 
34
        if hook, ok := s.ControlHooks[hookName]; ok {
 
35
                return hook(sc, args...)
 
36
        }
 
37
        return nil
 
38
}
 
39
 
 
40
// ProcessFunctionHook runs the ControlProcessor for the current function, returning any error.
 
41
// Use it like this:
 
42
// if err := n.ProcessFunctionHook(<serviceinstance>, <somearg1>, <somearg2>); err != nil {
 
43
//     return err
 
44
// }
 
45
func (s *TestService) ProcessFunctionHook(sc ServiceControl, args ...interface{}) error {
 
46
        hookName := s.currentServiceMethodName()
 
47
        return s.ProcessControlHook(hookName, sc, args...)
 
48
}
 
49
 
 
50
// RegisterControlPoint assigns the specified controller to the named hook. If nil, any existing controller for the
 
51
// hook is removed.
 
52
// hookName is the name of a function on the service or some arbitrarily named control point.
 
53
func (s *TestService) RegisterControlPoint(hookName string, controller ControlProcessor) ControlHookCleanup {
 
54
        if s.ControlHooks == nil {
 
55
                s.ControlHooks = make(map[string]ControlProcessor)
 
56
        }
 
57
        if controller == nil {
 
58
                delete(s.ControlHooks, hookName)
 
59
        } else {
 
60
                s.ControlHooks[hookName] = controller
 
61
        }
 
62
        return func() {
 
63
                s.RegisterControlPoint(hookName, nil)
 
64
        }
 
65
}