address_pools.go 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. package opts
  2. import (
  3. "encoding/csv"
  4. "encoding/json"
  5. "fmt"
  6. "strconv"
  7. "strings"
  8. types "github.com/docker/docker/libnetwork/ipamutils"
  9. )
  10. // PoolsOpt is a Value type for parsing the default address pools definitions
  11. type PoolsOpt struct {
  12. Values []*types.NetworkToSplit
  13. }
  14. // UnmarshalJSON fills values structure info from JSON input
  15. func (p *PoolsOpt) UnmarshalJSON(raw []byte) error {
  16. return json.Unmarshal(raw, &(p.Values))
  17. }
  18. // Set predefined pools
  19. func (p *PoolsOpt) Set(value string) error {
  20. csvReader := csv.NewReader(strings.NewReader(value))
  21. fields, err := csvReader.Read()
  22. if err != nil {
  23. return err
  24. }
  25. poolsDef := types.NetworkToSplit{}
  26. for _, field := range fields {
  27. parts := strings.SplitN(field, "=", 2)
  28. if len(parts) != 2 {
  29. return fmt.Errorf("invalid field '%s' must be a key=value pair", field)
  30. }
  31. key := strings.ToLower(parts[0])
  32. value := strings.ToLower(parts[1])
  33. switch key {
  34. case "base":
  35. poolsDef.Base = value
  36. case "size":
  37. size, err := strconv.Atoi(value)
  38. if err != nil {
  39. return fmt.Errorf("invalid size value: %q (must be integer): %v", value, err)
  40. }
  41. poolsDef.Size = size
  42. default:
  43. return fmt.Errorf("unexpected key '%s' in '%s'", key, field)
  44. }
  45. }
  46. p.Values = append(p.Values, &poolsDef)
  47. return nil
  48. }
  49. // Type returns the type of this option
  50. func (p *PoolsOpt) Type() string {
  51. return "pool-options"
  52. }
  53. // String returns a string repr of this option
  54. func (p *PoolsOpt) String() string {
  55. var pools []string
  56. for _, pool := range p.Values {
  57. repr := fmt.Sprintf("%s %d", pool.Base, pool.Size)
  58. pools = append(pools, repr)
  59. }
  60. return strings.Join(pools, ", ")
  61. }
  62. // Value returns the mounts
  63. func (p *PoolsOpt) Value() []*types.NetworkToSplit {
  64. return p.Values
  65. }
  66. // Name returns the flag name of this option
  67. func (p *PoolsOpt) Name() string {
  68. return "default-address-pools"
  69. }