1
2
3 package hcn
4
5 import (
6 "encoding/json"
7 "fmt"
8 "math"
9
10 "github.com/Microsoft/hcsshim/internal/hcserror"
11 "github.com/Microsoft/hcsshim/internal/interop"
12 "github.com/sirupsen/logrus"
13 )
14
15
16 type Globals struct {
17 Version Version `json:"Version"`
18 }
19
20
21 type Version struct {
22 Major int `json:"Major"`
23 Minor int `json:"Minor"`
24 }
25
26 type VersionRange struct {
27 MinVersion Version
28 MaxVersion Version
29 }
30
31 type VersionRanges []VersionRange
32
33 var (
34
35 HNSVersion1803 = VersionRanges{VersionRange{MinVersion: Version{Major: 7, Minor: 2}, MaxVersion: Version{Major: math.MaxInt32, Minor: math.MaxInt32}}}
36
37 V2ApiSupport = VersionRanges{VersionRange{MinVersion: Version{Major: 9, Minor: 2}, MaxVersion: Version{Major: math.MaxInt32, Minor: math.MaxInt32}}}
38
39 RemoteSubnetVersion = VersionRanges{VersionRange{MinVersion: Version{Major: 9, Minor: 2}, MaxVersion: Version{Major: math.MaxInt32, Minor: math.MaxInt32}}}
40
41 HostRouteVersion = VersionRanges{VersionRange{MinVersion: Version{Major: 9, Minor: 2}, MaxVersion: Version{Major: math.MaxInt32, Minor: math.MaxInt32}}}
42
43 DSRVersion = VersionRanges{
44 VersionRange{MinVersion: Version{Major: 9, Minor: 3}, MaxVersion: Version{Major: 9, Minor: math.MaxInt32}},
45 VersionRange{MinVersion: Version{Major: 10, Minor: 2}, MaxVersion: Version{Major: math.MaxInt32, Minor: math.MaxInt32}},
46 }
47
48 Slash32EndpointPrefixesVersion = VersionRanges{
49 VersionRange{MinVersion: Version{Major: 9, Minor: 3}, MaxVersion: Version{Major: 9, Minor: math.MaxInt32}},
50 VersionRange{MinVersion: Version{Major: 10, Minor: 4}, MaxVersion: Version{Major: math.MaxInt32, Minor: math.MaxInt32}},
51 }
52
53 AclSupportForProtocol252Version = VersionRanges{
54 VersionRange{MinVersion: Version{Major: 11, Minor: 0}, MaxVersion: Version{Major: math.MaxInt32, Minor: math.MaxInt32}},
55 }
56
57 SessionAffinityVersion = VersionRanges{VersionRange{MinVersion: Version{Major: 12, Minor: 0}, MaxVersion: Version{Major: math.MaxInt32, Minor: math.MaxInt32}}}
58
59 IPv6DualStackVersion = VersionRanges{
60 VersionRange{MinVersion: Version{Major: 11, Minor: 10}, MaxVersion: Version{Major: math.MaxInt32, Minor: math.MaxInt32}},
61 }
62
63 SetPolicyVersion = VersionRanges{VersionRange{MinVersion: Version{Major: 13, Minor: 0}, MaxVersion: Version{Major: math.MaxInt32, Minor: math.MaxInt32}}}
64
65 VxlanPortVersion = VersionRanges{VersionRange{MinVersion: Version{Major: 10, Minor: 3}, MaxVersion: Version{Major: math.MaxInt32, Minor: math.MaxInt32}}}
66
67
68 L4ProxyPolicyVersion = VersionRanges{
69 VersionRange{MinVersion: Version{Major: 9, Minor: 5}, MaxVersion: Version{Major: 9, Minor: math.MaxInt32}},
70 VersionRange{MinVersion: Version{Major: 10, Minor: 5}, MaxVersion: Version{Major: 10, Minor: math.MaxInt32}},
71 VersionRange{MinVersion: Version{Major: 11, Minor: 11}, MaxVersion: Version{Major: 11, Minor: math.MaxInt32}},
72 VersionRange{MinVersion: Version{Major: 12, Minor: 1}, MaxVersion: Version{Major: 12, Minor: math.MaxInt32}},
73 VersionRange{MinVersion: Version{Major: 13, Minor: 1}, MaxVersion: Version{Major: math.MaxInt32, Minor: math.MaxInt32}},
74 }
75
76
77 L4WfpProxyPolicyVersion = VersionRanges{VersionRange{MinVersion: Version{Major: 13, Minor: 2}, MaxVersion: Version{Major: math.MaxInt32, Minor: math.MaxInt32}}}
78
79
80 TierAclPolicyVersion = VersionRanges{VersionRange{MinVersion: Version{Major: 14, Minor: 0}, MaxVersion: Version{Major: math.MaxInt32, Minor: math.MaxInt32}}}
81
82
83 NetworkACLPolicyVersion = VersionRanges{VersionRange{MinVersion: Version{Major: 15, Minor: 0}, MaxVersion: Version{Major: math.MaxInt32, Minor: math.MaxInt32}}}
84
85
86 NestedIpSetVersion = VersionRanges{VersionRange{MinVersion: Version{Major: 15, Minor: 0}, MaxVersion: Version{Major: math.MaxInt32, Minor: math.MaxInt32}}}
87 )
88
89
90 func GetGlobals() (*Globals, error) {
91 var version Version
92 err := hnsCall("GET", "/globals/version", "", &version)
93 if err != nil {
94 return nil, err
95 }
96
97 globals := &Globals{
98 Version: version,
99 }
100
101 return globals, nil
102 }
103
104 type hnsResponse struct {
105 Success bool
106 Error string
107 Output json.RawMessage
108 }
109
110 func hnsCall(method, path, request string, returnResponse interface{}) error {
111 var responseBuffer *uint16
112 logrus.Debugf("[%s]=>[%s] Request : %s", method, path, request)
113
114 err := _hnsCall(method, path, request, &responseBuffer)
115 if err != nil {
116 return hcserror.New(err, "hnsCall", "")
117 }
118 response := interop.ConvertAndFreeCoTaskMemString(responseBuffer)
119
120 hnsresponse := &hnsResponse{}
121 if err = json.Unmarshal([]byte(response), &hnsresponse); err != nil {
122 return err
123 }
124
125 if !hnsresponse.Success {
126 return fmt.Errorf("HNS failed with error : %s", hnsresponse.Error)
127 }
128
129 if len(hnsresponse.Output) == 0 {
130 return nil
131 }
132
133 logrus.Debugf("Network Response : %s", hnsresponse.Output)
134 err = json.Unmarshal(hnsresponse.Output, returnResponse)
135 if err != nil {
136 return err
137 }
138
139 return nil
140 }
141
View as plain text