config.go 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. package subnet
  2. import (
  3. "encoding/json"
  4. "errors"
  5. "github.com/coreos-inc/kolach/pkg"
  6. )
  7. type Config struct {
  8. Network pkg.IP4Net
  9. FirstIP pkg.IP4
  10. LastIP pkg.IP4
  11. HostSubnet uint
  12. }
  13. func ParseConfig(s string) (*Config, error) {
  14. cfg := new(Config)
  15. err := json.Unmarshal([]byte(s), cfg)
  16. if err != nil {
  17. return nil, err
  18. }
  19. if cfg.HostSubnet > 0 {
  20. if cfg.HostSubnet < cfg.Network.PrefixLen {
  21. return nil, errors.New("HostSubnet is larger network than Network")
  22. }
  23. } else {
  24. // try to give each host a /24 but if the whole network
  25. // is /24 or smaller, half the network
  26. if cfg.Network.PrefixLen < 24 {
  27. cfg.HostSubnet = 24
  28. } else {
  29. cfg.HostSubnet = cfg.Network.PrefixLen + 1
  30. }
  31. }
  32. if cfg.FirstIP == pkg.IP4(0) {
  33. cfg.FirstIP = cfg.Network.IP
  34. } else if !cfg.Network.Contains(cfg.FirstIP) {
  35. return nil, errors.New("FirstIP is not in the range of the Network")
  36. }
  37. if cfg.LastIP == pkg.IP4(0) {
  38. cfg.LastIP = cfg.Network.Next().IP
  39. cfg.LastIP -= (1 << (32 - cfg.HostSubnet))
  40. } else if !cfg.Network.Contains(cfg.LastIP) {
  41. return nil, errors.New("LastIP is not in the range of the Network")
  42. }
  43. return cfg, nil
  44. }