2019-01-12 04:58:27 +00:00
|
|
|
package hcn
|
|
|
|
|
|
|
|
import (
|
|
|
|
"encoding/json"
|
|
|
|
"fmt"
|
|
|
|
|
|
|
|
"github.com/Microsoft/hcsshim/internal/hcserror"
|
|
|
|
"github.com/Microsoft/hcsshim/internal/interop"
|
|
|
|
"github.com/sirupsen/logrus"
|
|
|
|
)
|
|
|
|
|
|
|
|
// Globals are all global properties of the HCN Service.
|
|
|
|
type Globals struct {
|
|
|
|
Version Version `json:"Version"`
|
|
|
|
}
|
|
|
|
|
|
|
|
// Version is the HCN Service version.
|
|
|
|
type Version struct {
|
|
|
|
Major int `json:"Major"`
|
|
|
|
Minor int `json:"Minor"`
|
|
|
|
}
|
|
|
|
|
|
|
|
var (
|
|
|
|
// HNSVersion1803 added ACL functionality.
|
|
|
|
HNSVersion1803 = Version{Major: 7, Minor: 2}
|
|
|
|
// V2ApiSupport allows the use of V2 Api calls and V2 Schema.
|
2019-09-30 23:25:17 +00:00
|
|
|
V2ApiSupport = Version{Major: 9, Minor: 2}
|
2019-07-10 00:29:38 +00:00
|
|
|
// Remote Subnet allows for Remote Subnet policies on Overlay networks
|
|
|
|
RemoteSubnetVersion = Version{Major: 9, Minor: 2}
|
|
|
|
// A Host Route policy allows for local container to local host communication Overlay networks
|
|
|
|
HostRouteVersion = Version{Major: 9, Minor: 2}
|
|
|
|
// HNS 10.2 allows for Direct Server Return for loadbalancing
|
|
|
|
DSRVersion = Version{Major: 10, Minor: 2}
|
2019-01-12 04:58:27 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
// GetGlobals returns the global properties of the HCN Service.
|
|
|
|
func GetGlobals() (*Globals, error) {
|
|
|
|
var version Version
|
|
|
|
err := hnsCall("GET", "/globals/version", "", &version)
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
|
|
|
|
globals := &Globals{
|
|
|
|
Version: version,
|
|
|
|
}
|
|
|
|
|
|
|
|
return globals, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
type hnsResponse struct {
|
|
|
|
Success bool
|
|
|
|
Error string
|
|
|
|
Output json.RawMessage
|
|
|
|
}
|
|
|
|
|
|
|
|
func hnsCall(method, path, request string, returnResponse interface{}) error {
|
|
|
|
var responseBuffer *uint16
|
|
|
|
logrus.Debugf("[%s]=>[%s] Request : %s", method, path, request)
|
|
|
|
|
|
|
|
err := _hnsCall(method, path, request, &responseBuffer)
|
|
|
|
if err != nil {
|
|
|
|
return hcserror.New(err, "hnsCall ", "")
|
|
|
|
}
|
|
|
|
response := interop.ConvertAndFreeCoTaskMemString(responseBuffer)
|
|
|
|
|
|
|
|
hnsresponse := &hnsResponse{}
|
|
|
|
if err = json.Unmarshal([]byte(response), &hnsresponse); err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
if !hnsresponse.Success {
|
|
|
|
return fmt.Errorf("HNS failed with error : %s", hnsresponse.Error)
|
|
|
|
}
|
|
|
|
|
|
|
|
if len(hnsresponse.Output) == 0 {
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
logrus.Debugf("Network Response : %s", hnsresponse.Output)
|
|
|
|
err = json.Unmarshal(hnsresponse.Output, returnResponse)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
return nil
|
|
|
|
}
|