settable.go 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. package v2 // import "github.com/docker/docker/plugin/v2"
  2. import (
  3. "errors"
  4. "fmt"
  5. "strings"
  6. )
  7. type settable struct {
  8. name string
  9. field string
  10. value string
  11. }
  12. var (
  13. allowedSettableFieldsEnv = []string{"value"}
  14. allowedSettableFieldsArgs = []string{"value"}
  15. allowedSettableFieldsDevices = []string{"path"}
  16. allowedSettableFieldsMounts = []string{"source"}
  17. errMultipleFields = errors.New("multiple fields are settable, one must be specified")
  18. errInvalidFormat = errors.New("invalid format, must be <name>[.<field>][=<value>]")
  19. )
  20. func newSettables(args []string) ([]settable, error) {
  21. sets := make([]settable, 0, len(args))
  22. for _, arg := range args {
  23. set, err := newSettable(arg)
  24. if err != nil {
  25. return nil, err
  26. }
  27. sets = append(sets, set)
  28. }
  29. return sets, nil
  30. }
  31. func newSettable(arg string) (settable, error) {
  32. var set settable
  33. if i := strings.Index(arg, "="); i == 0 {
  34. return set, errInvalidFormat
  35. } else if i < 0 {
  36. set.name = arg
  37. } else {
  38. set.name = arg[:i]
  39. set.value = arg[i+1:]
  40. }
  41. if i := strings.LastIndex(set.name, "."); i > 0 {
  42. set.field = set.name[i+1:]
  43. set.name = arg[:i]
  44. }
  45. return set, nil
  46. }
  47. // prettyName return name.field if there is a field, otherwise name.
  48. func (set *settable) prettyName() string {
  49. if set.field != "" {
  50. return fmt.Sprintf("%s.%s", set.name, set.field)
  51. }
  52. return set.name
  53. }
  54. func (set *settable) isSettable(allowedSettableFields []string, settable []string) (bool, error) {
  55. if set.field == "" {
  56. if len(settable) == 1 {
  57. // if field is not specified and there only one settable, default to it.
  58. set.field = settable[0]
  59. } else if len(settable) > 1 {
  60. return false, errMultipleFields
  61. }
  62. }
  63. isAllowed := false
  64. for _, allowedSettableField := range allowedSettableFields {
  65. if set.field == allowedSettableField {
  66. isAllowed = true
  67. break
  68. }
  69. }
  70. if isAllowed {
  71. for _, settableField := range settable {
  72. if set.field == settableField {
  73. return true, nil
  74. }
  75. }
  76. }
  77. return false, nil
  78. }
  79. func updateSettingsEnv(env *[]string, set *settable) {
  80. for i, e := range *env {
  81. if name, _, _ := strings.Cut(e, "="); name == set.name {
  82. (*env)[i] = set.name + "=" + set.value
  83. return
  84. }
  85. }
  86. *env = append(*env, set.name+"="+set.value)
  87. }