hcnglobals.go 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. //go:build windows
  2. package hcn
  3. import (
  4. "encoding/json"
  5. "fmt"
  6. "math"
  7. "github.com/Microsoft/hcsshim/internal/hcserror"
  8. "github.com/Microsoft/hcsshim/internal/interop"
  9. "github.com/sirupsen/logrus"
  10. )
  11. // Globals are all global properties of the HCN Service.
  12. type Globals struct {
  13. Version Version `json:"Version"`
  14. }
  15. // Version is the HCN Service version.
  16. type Version struct {
  17. Major int `json:"Major"`
  18. Minor int `json:"Minor"`
  19. }
  20. type VersionRange struct {
  21. MinVersion Version
  22. MaxVersion Version
  23. }
  24. type VersionRanges []VersionRange
  25. var (
  26. // HNSVersion1803 added ACL functionality.
  27. HNSVersion1803 = VersionRanges{VersionRange{MinVersion: Version{Major: 7, Minor: 2}, MaxVersion: Version{Major: math.MaxInt32, Minor: math.MaxInt32}}}
  28. // V2ApiSupport allows the use of V2 Api calls and V2 Schema.
  29. V2ApiSupport = VersionRanges{VersionRange{MinVersion: Version{Major: 9, Minor: 2}, MaxVersion: Version{Major: math.MaxInt32, Minor: math.MaxInt32}}}
  30. // Remote Subnet allows for Remote Subnet policies on Overlay networks
  31. RemoteSubnetVersion = VersionRanges{VersionRange{MinVersion: Version{Major: 9, Minor: 2}, MaxVersion: Version{Major: math.MaxInt32, Minor: math.MaxInt32}}}
  32. // A Host Route policy allows for local container to local host communication Overlay networks
  33. HostRouteVersion = VersionRanges{VersionRange{MinVersion: Version{Major: 9, Minor: 2}, MaxVersion: Version{Major: math.MaxInt32, Minor: math.MaxInt32}}}
  34. // HNS 9.3 through 10.0 (not included), and 10.2+ allows for Direct Server Return for loadbalancing
  35. DSRVersion = VersionRanges{
  36. VersionRange{MinVersion: Version{Major: 9, Minor: 3}, MaxVersion: Version{Major: 9, Minor: math.MaxInt32}},
  37. VersionRange{MinVersion: Version{Major: 10, Minor: 2}, MaxVersion: Version{Major: math.MaxInt32, Minor: math.MaxInt32}},
  38. }
  39. // HNS 9.3 through 10.0 (not included) and, 10.4+ provide support for configuring endpoints with /32 prefixes
  40. Slash32EndpointPrefixesVersion = VersionRanges{
  41. VersionRange{MinVersion: Version{Major: 9, Minor: 3}, MaxVersion: Version{Major: 9, Minor: math.MaxInt32}},
  42. VersionRange{MinVersion: Version{Major: 10, Minor: 4}, MaxVersion: Version{Major: math.MaxInt32, Minor: math.MaxInt32}},
  43. }
  44. // HNS 9.3 through 10.0 (not included) and, 10.4+ allow for HNS ACL Policies to support protocol 252 for VXLAN
  45. AclSupportForProtocol252Version = VersionRanges{
  46. VersionRange{MinVersion: Version{Major: 11, Minor: 0}, MaxVersion: Version{Major: math.MaxInt32, Minor: math.MaxInt32}},
  47. }
  48. // HNS 12.0 allows for session affinity for loadbalancing
  49. SessionAffinityVersion = VersionRanges{VersionRange{MinVersion: Version{Major: 12, Minor: 0}, MaxVersion: Version{Major: math.MaxInt32, Minor: math.MaxInt32}}}
  50. // HNS 11.10+ supports Ipv6 dual stack.
  51. IPv6DualStackVersion = VersionRanges{
  52. VersionRange{MinVersion: Version{Major: 11, Minor: 10}, MaxVersion: Version{Major: math.MaxInt32, Minor: math.MaxInt32}},
  53. }
  54. // HNS 13.0 allows for Set Policy support
  55. SetPolicyVersion = VersionRanges{VersionRange{MinVersion: Version{Major: 13, Minor: 0}, MaxVersion: Version{Major: math.MaxInt32, Minor: math.MaxInt32}}}
  56. // HNS 10.3 allows for VXLAN ports
  57. VxlanPortVersion = VersionRanges{VersionRange{MinVersion: Version{Major: 10, Minor: 3}, MaxVersion: Version{Major: math.MaxInt32, Minor: math.MaxInt32}}}
  58. //HNS 9.5 through 10.0(not included), 10.5 through 11.0(not included), 11.11 through 12.0(not included), 12.1 through 13.0(not included), 13.1+ allows for Network L4Proxy Policy support
  59. L4ProxyPolicyVersion = VersionRanges{
  60. VersionRange{MinVersion: Version{Major: 9, Minor: 5}, MaxVersion: Version{Major: 9, Minor: math.MaxInt32}},
  61. VersionRange{MinVersion: Version{Major: 10, Minor: 5}, MaxVersion: Version{Major: 10, Minor: math.MaxInt32}},
  62. VersionRange{MinVersion: Version{Major: 11, Minor: 11}, MaxVersion: Version{Major: 11, Minor: math.MaxInt32}},
  63. VersionRange{MinVersion: Version{Major: 12, Minor: 1}, MaxVersion: Version{Major: 12, Minor: math.MaxInt32}},
  64. VersionRange{MinVersion: Version{Major: 13, Minor: 1}, MaxVersion: Version{Major: math.MaxInt32, Minor: math.MaxInt32}},
  65. }
  66. //HNS 13.2 allows for L4WfpProxy Policy support
  67. L4WfpProxyPolicyVersion = VersionRanges{VersionRange{MinVersion: Version{Major: 13, Minor: 2}, MaxVersion: Version{Major: math.MaxInt32, Minor: math.MaxInt32}}}
  68. //HNS 14.0 allows for TierAcl Policy support
  69. TierAclPolicyVersion = VersionRanges{VersionRange{MinVersion: Version{Major: 14, Minor: 0}, MaxVersion: Version{Major: math.MaxInt32, Minor: math.MaxInt32}}}
  70. //HNS 15.0 allows for NetworkACL Policy support
  71. NetworkACLPolicyVersion = VersionRanges{VersionRange{MinVersion: Version{Major: 15, Minor: 0}, MaxVersion: Version{Major: math.MaxInt32, Minor: math.MaxInt32}}}
  72. //HNS 15.0 allows for NestedIpSet support
  73. NestedIpSetVersion = VersionRanges{VersionRange{MinVersion: Version{Major: 15, Minor: 0}, MaxVersion: Version{Major: math.MaxInt32, Minor: math.MaxInt32}}}
  74. )
  75. // GetGlobals returns the global properties of the HCN Service.
  76. func GetGlobals() (*Globals, error) {
  77. var version Version
  78. err := hnsCall("GET", "/globals/version", "", &version)
  79. if err != nil {
  80. return nil, err
  81. }
  82. globals := &Globals{
  83. Version: version,
  84. }
  85. return globals, nil
  86. }
  87. type hnsResponse struct {
  88. Success bool
  89. Error string
  90. Output json.RawMessage
  91. }
  92. func hnsCall(method, path, request string, returnResponse interface{}) error {
  93. var responseBuffer *uint16
  94. logrus.Debugf("[%s]=>[%s] Request : %s", method, path, request)
  95. err := _hnsCall(method, path, request, &responseBuffer)
  96. if err != nil {
  97. return hcserror.New(err, "hnsCall", "")
  98. }
  99. response := interop.ConvertAndFreeCoTaskMemString(responseBuffer)
  100. hnsresponse := &hnsResponse{}
  101. if err = json.Unmarshal([]byte(response), &hnsresponse); err != nil {
  102. return err
  103. }
  104. if !hnsresponse.Success {
  105. return fmt.Errorf("HNS failed with error : %s", hnsresponse.Error)
  106. }
  107. if len(hnsresponse.Output) == 0 {
  108. return nil
  109. }
  110. logrus.Debugf("Network Response : %s", hnsresponse.Output)
  111. err = json.Unmarshal(hnsresponse.Output, returnResponse)
  112. if err != nil {
  113. return err
  114. }
  115. return nil
  116. }