...

Source file src/github.com/Microsoft/hcsshim/hcn/hcnglobals.go

Documentation: github.com/Microsoft/hcsshim/hcn

     1  //go:build windows
     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  // Globals are all global properties of the HCN Service.
    16  type Globals struct {
    17  	Version Version `json:"Version"`
    18  }
    19  
    20  // Version is the HCN Service version.
    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  	// HNSVersion1803 added ACL functionality.
    35  	HNSVersion1803 = VersionRanges{VersionRange{MinVersion: Version{Major: 7, Minor: 2}, MaxVersion: Version{Major: math.MaxInt32, Minor: math.MaxInt32}}}
    36  	// V2ApiSupport allows the use of V2 Api calls and V2 Schema.
    37  	V2ApiSupport = VersionRanges{VersionRange{MinVersion: Version{Major: 9, Minor: 2}, MaxVersion: Version{Major: math.MaxInt32, Minor: math.MaxInt32}}}
    38  	// Remote Subnet allows for Remote Subnet policies on Overlay networks
    39  	RemoteSubnetVersion = VersionRanges{VersionRange{MinVersion: Version{Major: 9, Minor: 2}, MaxVersion: Version{Major: math.MaxInt32, Minor: math.MaxInt32}}}
    40  	// A Host Route policy allows for local container to local host communication Overlay networks
    41  	HostRouteVersion = VersionRanges{VersionRange{MinVersion: Version{Major: 9, Minor: 2}, MaxVersion: Version{Major: math.MaxInt32, Minor: math.MaxInt32}}}
    42  	// HNS 9.3 through 10.0 (not included), and 10.2+ allows for Direct Server Return for loadbalancing
    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  	// HNS 9.3 through 10.0 (not included) and, 10.4+ provide support for configuring endpoints with /32 prefixes
    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  	// HNS 9.3 through 10.0 (not included) and, 10.4+ allow for HNS ACL Policies to support protocol 252 for VXLAN
    53  	AclSupportForProtocol252Version = VersionRanges{
    54  		VersionRange{MinVersion: Version{Major: 11, Minor: 0}, MaxVersion: Version{Major: math.MaxInt32, Minor: math.MaxInt32}},
    55  	}
    56  	// HNS 12.0 allows for session affinity for loadbalancing
    57  	SessionAffinityVersion = VersionRanges{VersionRange{MinVersion: Version{Major: 12, Minor: 0}, MaxVersion: Version{Major: math.MaxInt32, Minor: math.MaxInt32}}}
    58  	// HNS 11.10+ supports Ipv6 dual stack.
    59  	IPv6DualStackVersion = VersionRanges{
    60  		VersionRange{MinVersion: Version{Major: 11, Minor: 10}, MaxVersion: Version{Major: math.MaxInt32, Minor: math.MaxInt32}},
    61  	}
    62  	// HNS 13.0 allows for Set Policy support
    63  	SetPolicyVersion = VersionRanges{VersionRange{MinVersion: Version{Major: 13, Minor: 0}, MaxVersion: Version{Major: math.MaxInt32, Minor: math.MaxInt32}}}
    64  	// HNS 10.3 allows for VXLAN ports
    65  	VxlanPortVersion = VersionRanges{VersionRange{MinVersion: Version{Major: 10, Minor: 3}, MaxVersion: Version{Major: math.MaxInt32, Minor: math.MaxInt32}}}
    66  
    67  	//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
    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  	//HNS 13.2 allows for L4WfpProxy Policy support
    77  	L4WfpProxyPolicyVersion = VersionRanges{VersionRange{MinVersion: Version{Major: 13, Minor: 2}, MaxVersion: Version{Major: math.MaxInt32, Minor: math.MaxInt32}}}
    78  
    79  	//HNS 14.0 allows for TierAcl Policy support
    80  	TierAclPolicyVersion = VersionRanges{VersionRange{MinVersion: Version{Major: 14, Minor: 0}, MaxVersion: Version{Major: math.MaxInt32, Minor: math.MaxInt32}}}
    81  
    82  	//HNS 15.0 allows for NetworkACL Policy support
    83  	NetworkACLPolicyVersion = VersionRanges{VersionRange{MinVersion: Version{Major: 15, Minor: 0}, MaxVersion: Version{Major: math.MaxInt32, Minor: math.MaxInt32}}}
    84  
    85  	//HNS 15.0 allows for NestedIpSet support
    86  	NestedIpSetVersion = VersionRanges{VersionRange{MinVersion: Version{Major: 15, Minor: 0}, MaxVersion: Version{Major: math.MaxInt32, Minor: math.MaxInt32}}}
    87  )
    88  
    89  // GetGlobals returns the global properties of the HCN Service.
    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