common.go 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. package controlapi
  2. import (
  3. "regexp"
  4. "strings"
  5. "github.com/docker/swarmkit/api"
  6. "github.com/docker/swarmkit/manager/state/store"
  7. "google.golang.org/grpc"
  8. "google.golang.org/grpc/codes"
  9. )
  10. var isValidName = regexp.MustCompile(`^[a-zA-Z0-9](?:[-_]*[A-Za-z0-9]+)*$`)
  11. func buildFilters(by func(string) store.By, values []string) store.By {
  12. filters := make([]store.By, 0, len(values))
  13. for _, v := range values {
  14. filters = append(filters, by(v))
  15. }
  16. return store.Or(filters...)
  17. }
  18. func filterContains(match string, candidates []string) bool {
  19. if len(candidates) == 0 {
  20. return true
  21. }
  22. for _, c := range candidates {
  23. if c == match {
  24. return true
  25. }
  26. }
  27. return false
  28. }
  29. func filterContainsPrefix(match string, candidates []string) bool {
  30. if len(candidates) == 0 {
  31. return true
  32. }
  33. for _, c := range candidates {
  34. if strings.HasPrefix(match, c) {
  35. return true
  36. }
  37. }
  38. return false
  39. }
  40. func filterMatchLabels(match map[string]string, candidates map[string]string) bool {
  41. if len(candidates) == 0 {
  42. return true
  43. }
  44. for k, v := range candidates {
  45. c, ok := match[k]
  46. if !ok {
  47. return false
  48. }
  49. if v != "" && v != c {
  50. return false
  51. }
  52. }
  53. return true
  54. }
  55. func validateAnnotations(m api.Annotations) error {
  56. if m.Name == "" {
  57. return grpc.Errorf(codes.InvalidArgument, "meta: name must be provided")
  58. }
  59. if !isValidName.MatchString(m.Name) {
  60. // if the name doesn't match the regex
  61. return grpc.Errorf(codes.InvalidArgument, "name must be valid as a DNS name component")
  62. }
  63. if len(m.Name) > 63 {
  64. // DNS labels are limited to 63 characters
  65. return grpc.Errorf(codes.InvalidArgument, "name must be 63 characters or fewer")
  66. }
  67. return nil
  68. }
  69. func validateDriver(driver *api.Driver, defName string) error {
  70. if driver == nil {
  71. // It is ok to not specify the driver. We will choose
  72. // a default driver.
  73. return nil
  74. }
  75. if driver.Name == "" {
  76. return grpc.Errorf(codes.InvalidArgument, "driver name: if driver is specified name is required")
  77. }
  78. if driver.Name != defName {
  79. return grpc.Errorf(codes.InvalidArgument, "invalid driver (%s) specified", driver.Name)
  80. }
  81. return nil
  82. }