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