backend.go 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. package backend
  2. import (
  3. "context"
  4. "errors"
  5. "fmt"
  6. "github.com/sirupsen/logrus"
  7. "github.com/docker/api/compose"
  8. "github.com/docker/api/containers"
  9. )
  10. var (
  11. errNoType = errors.New("backend: no type")
  12. errNoName = errors.New("backend: no name")
  13. errTypeRegistered = errors.New("backend: already registered")
  14. )
  15. type initFunc func(context.Context) (interface{}, error)
  16. type registeredBackend struct {
  17. name string
  18. backendType string
  19. init initFunc
  20. }
  21. var backends = struct {
  22. r []*registeredBackend
  23. }{}
  24. // Aggregation of service interfaces
  25. type Service interface {
  26. ContainerService() containers.Service
  27. ComposeService() compose.Service
  28. }
  29. // Register adds a typed backend to the registry
  30. func Register(name string, backendType string, init initFunc) {
  31. if name == "" {
  32. logrus.Fatal(errNoName)
  33. }
  34. if backendType == "" {
  35. logrus.Fatal(errNoType)
  36. }
  37. for _, b := range backends.r {
  38. if b.backendType == backendType {
  39. logrus.Fatal(errTypeRegistered)
  40. }
  41. }
  42. backends.r = append(backends.r, &registeredBackend{
  43. name,
  44. backendType,
  45. init,
  46. })
  47. }
  48. // Get returns the backend registered for a particular type, it returns
  49. // an error if there is no registered backends for the given type.
  50. func Get(ctx context.Context, backendType string) (interface{}, error) {
  51. for _, b := range backends.r {
  52. if b.backendType == backendType {
  53. return b.init(ctx)
  54. }
  55. }
  56. return nil, fmt.Errorf("backend not found for context %q", backendType)
  57. }