...

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

Documentation: github.com/Microsoft/hcsshim/hcn

     1  //go:build windows
     2  
     3  package hcn
     4  
     5  import (
     6  	"encoding/json"
     7  	"fmt"
     8  	"syscall"
     9  
    10  	"github.com/Microsoft/go-winio/pkg/guid"
    11  )
    12  
    13  //go:generate go run github.com/Microsoft/go-winio/tools/mkwinsyscall -output zsyscall_windows.go hcn.go
    14  
    15  /// HNS V1 API
    16  
    17  //sys SetCurrentThreadCompartmentId(compartmentId uint32) (hr error) = iphlpapi.SetCurrentThreadCompartmentId
    18  //sys _hnsCall(method string, path string, object string, response **uint16) (hr error) = vmcompute.HNSCall?
    19  
    20  /// HCN V2 API
    21  
    22  // Network
    23  //sys hcnEnumerateNetworks(query string, networks **uint16, result **uint16) (hr error) = computenetwork.HcnEnumerateNetworks?
    24  //sys hcnCreateNetwork(id *_guid, settings string, network *hcnNetwork, result **uint16) (hr error) = computenetwork.HcnCreateNetwork?
    25  //sys hcnOpenNetwork(id *_guid, network *hcnNetwork, result **uint16) (hr error) = computenetwork.HcnOpenNetwork?
    26  //sys hcnModifyNetwork(network hcnNetwork, settings string, result **uint16) (hr error) = computenetwork.HcnModifyNetwork?
    27  //sys hcnQueryNetworkProperties(network hcnNetwork, query string, properties **uint16, result **uint16) (hr error) = computenetwork.HcnQueryNetworkProperties?
    28  //sys hcnDeleteNetwork(id *_guid, result **uint16) (hr error) = computenetwork.HcnDeleteNetwork?
    29  //sys hcnCloseNetwork(network hcnNetwork) (hr error) = computenetwork.HcnCloseNetwork?
    30  
    31  // Endpoint
    32  //sys hcnEnumerateEndpoints(query string, endpoints **uint16, result **uint16) (hr error) = computenetwork.HcnEnumerateEndpoints?
    33  //sys hcnCreateEndpoint(network hcnNetwork, id *_guid, settings string, endpoint *hcnEndpoint, result **uint16) (hr error) = computenetwork.HcnCreateEndpoint?
    34  //sys hcnOpenEndpoint(id *_guid, endpoint *hcnEndpoint, result **uint16) (hr error) = computenetwork.HcnOpenEndpoint?
    35  //sys hcnModifyEndpoint(endpoint hcnEndpoint, settings string, result **uint16) (hr error) = computenetwork.HcnModifyEndpoint?
    36  //sys hcnQueryEndpointProperties(endpoint hcnEndpoint, query string, properties **uint16, result **uint16) (hr error) = computenetwork.HcnQueryEndpointProperties?
    37  //sys hcnDeleteEndpoint(id *_guid, result **uint16) (hr error) = computenetwork.HcnDeleteEndpoint?
    38  //sys hcnCloseEndpoint(endpoint hcnEndpoint) (hr error) = computenetwork.HcnCloseEndpoint?
    39  
    40  // Namespace
    41  //sys hcnEnumerateNamespaces(query string, namespaces **uint16, result **uint16) (hr error) = computenetwork.HcnEnumerateNamespaces?
    42  //sys hcnCreateNamespace(id *_guid, settings string, namespace *hcnNamespace, result **uint16) (hr error) = computenetwork.HcnCreateNamespace?
    43  //sys hcnOpenNamespace(id *_guid, namespace *hcnNamespace, result **uint16) (hr error) = computenetwork.HcnOpenNamespace?
    44  //sys hcnModifyNamespace(namespace hcnNamespace, settings string, result **uint16) (hr error) = computenetwork.HcnModifyNamespace?
    45  //sys hcnQueryNamespaceProperties(namespace hcnNamespace, query string, properties **uint16, result **uint16) (hr error) = computenetwork.HcnQueryNamespaceProperties?
    46  //sys hcnDeleteNamespace(id *_guid, result **uint16) (hr error) = computenetwork.HcnDeleteNamespace?
    47  //sys hcnCloseNamespace(namespace hcnNamespace) (hr error) = computenetwork.HcnCloseNamespace?
    48  
    49  // LoadBalancer
    50  //sys hcnEnumerateLoadBalancers(query string, loadBalancers **uint16, result **uint16) (hr error) = computenetwork.HcnEnumerateLoadBalancers?
    51  //sys hcnCreateLoadBalancer(id *_guid, settings string, loadBalancer *hcnLoadBalancer, result **uint16) (hr error) = computenetwork.HcnCreateLoadBalancer?
    52  //sys hcnOpenLoadBalancer(id *_guid, loadBalancer *hcnLoadBalancer, result **uint16) (hr error) = computenetwork.HcnOpenLoadBalancer?
    53  //sys hcnModifyLoadBalancer(loadBalancer hcnLoadBalancer, settings string, result **uint16) (hr error) = computenetwork.HcnModifyLoadBalancer?
    54  //sys hcnQueryLoadBalancerProperties(loadBalancer hcnLoadBalancer, query string, properties **uint16, result **uint16) (hr error) = computenetwork.HcnQueryLoadBalancerProperties?
    55  //sys hcnDeleteLoadBalancer(id *_guid, result **uint16) (hr error) = computenetwork.HcnDeleteLoadBalancer?
    56  //sys hcnCloseLoadBalancer(loadBalancer hcnLoadBalancer) (hr error) = computenetwork.HcnCloseLoadBalancer?
    57  
    58  // SDN Routes
    59  //sys hcnEnumerateRoutes(query string, routes **uint16, result **uint16) (hr error) = computenetwork.HcnEnumerateSdnRoutes?
    60  //sys hcnCreateRoute(id *_guid, settings string, route *hcnRoute, result **uint16) (hr error) = computenetwork.HcnCreateSdnRoute?
    61  //sys hcnOpenRoute(id *_guid, route *hcnRoute, result **uint16) (hr error) = computenetwork.HcnOpenSdnRoute?
    62  //sys hcnModifyRoute(route hcnRoute, settings string, result **uint16) (hr error) = computenetwork.HcnModifySdnRoute?
    63  //sys hcnQueryRouteProperties(route hcnRoute, query string, properties **uint16, result **uint16) (hr error) = computenetwork.HcnQuerySdnRouteProperties?
    64  //sys hcnDeleteRoute(id *_guid, result **uint16) (hr error) = computenetwork.HcnDeleteSdnRoute?
    65  //sys hcnCloseRoute(route hcnRoute) (hr error) = computenetwork.HcnCloseSdnRoute?
    66  
    67  type _guid = guid.GUID
    68  
    69  type hcnNetwork syscall.Handle
    70  type hcnEndpoint syscall.Handle
    71  type hcnNamespace syscall.Handle
    72  type hcnLoadBalancer syscall.Handle
    73  type hcnRoute syscall.Handle
    74  
    75  // SchemaVersion for HCN Objects/Queries.
    76  type SchemaVersion = Version // hcnglobals.go
    77  
    78  // HostComputeQueryFlags are passed in to a HostComputeQuery to determine which
    79  // properties of an object are returned.
    80  type HostComputeQueryFlags uint32
    81  
    82  var (
    83  	// HostComputeQueryFlagsNone returns an object with the standard properties.
    84  	HostComputeQueryFlagsNone HostComputeQueryFlags
    85  	// HostComputeQueryFlagsDetailed returns an object with all properties.
    86  	HostComputeQueryFlagsDetailed HostComputeQueryFlags = 1
    87  )
    88  
    89  // HostComputeQuery is the format for HCN queries.
    90  type HostComputeQuery struct {
    91  	SchemaVersion SchemaVersion         `json:""`
    92  	Flags         HostComputeQueryFlags `json:",omitempty"`
    93  	Filter        string                `json:",omitempty"`
    94  }
    95  
    96  type ExtraParams struct {
    97  	Resources        json.RawMessage `json:",omitempty"`
    98  	SharedContainers json.RawMessage `json:",omitempty"`
    99  	LayeredOn        string          `json:",omitempty"`
   100  	SwitchGuid       string          `json:",omitempty"`
   101  	UtilityVM        string          `json:",omitempty"`
   102  	VirtualMachine   string          `json:",omitempty"`
   103  }
   104  
   105  type Health struct {
   106  	Data  interface{} `json:",omitempty"`
   107  	Extra ExtraParams `json:",omitempty"`
   108  }
   109  
   110  // defaultQuery generates HCN Query.
   111  // Passed into get/enumerate calls to filter results.
   112  func defaultQuery() HostComputeQuery {
   113  	query := HostComputeQuery{
   114  		SchemaVersion: SchemaVersion{
   115  			Major: 2,
   116  			Minor: 0,
   117  		},
   118  		Flags: HostComputeQueryFlagsNone,
   119  	}
   120  	return query
   121  }
   122  
   123  // PlatformDoesNotSupportError happens when users are attempting to use a newer shim on an older OS
   124  func platformDoesNotSupportError(featureName string) error {
   125  	return fmt.Errorf("platform does not support feature %s", featureName)
   126  }
   127  
   128  // V2ApiSupported returns an error if the HCN version does not support the V2 Apis.
   129  func V2ApiSupported() error {
   130  	supported, err := GetCachedSupportedFeatures()
   131  	if err != nil {
   132  		return err
   133  	}
   134  	if supported.Api.V2 {
   135  		return nil
   136  	}
   137  	return platformDoesNotSupportError("V2 Api/Schema")
   138  }
   139  
   140  func V2SchemaVersion() SchemaVersion {
   141  	return SchemaVersion{
   142  		Major: 2,
   143  		Minor: 0,
   144  	}
   145  }
   146  
   147  // RemoteSubnetSupported returns an error if the HCN version does not support Remote Subnet policies.
   148  func RemoteSubnetSupported() error {
   149  	supported, err := GetCachedSupportedFeatures()
   150  	if err != nil {
   151  		return err
   152  	}
   153  	if supported.RemoteSubnet {
   154  		return nil
   155  	}
   156  	return platformDoesNotSupportError("Remote Subnet")
   157  }
   158  
   159  // HostRouteSupported returns an error if the HCN version does not support Host Route policies.
   160  func HostRouteSupported() error {
   161  	supported, err := GetCachedSupportedFeatures()
   162  	if err != nil {
   163  		return err
   164  	}
   165  	if supported.HostRoute {
   166  		return nil
   167  	}
   168  	return platformDoesNotSupportError("Host Route")
   169  }
   170  
   171  // DSRSupported returns an error if the HCN version does not support Direct Server Return.
   172  func DSRSupported() error {
   173  	supported, err := GetCachedSupportedFeatures()
   174  	if err != nil {
   175  		return err
   176  	}
   177  	if supported.DSR {
   178  		return nil
   179  	}
   180  	return platformDoesNotSupportError("Direct Server Return (DSR)")
   181  }
   182  
   183  // Slash32EndpointPrefixesSupported returns an error if the HCN version does not support configuring endpoints with /32 prefixes.
   184  func Slash32EndpointPrefixesSupported() error {
   185  	supported, err := GetCachedSupportedFeatures()
   186  	if err != nil {
   187  		return err
   188  	}
   189  	if supported.Slash32EndpointPrefixes {
   190  		return nil
   191  	}
   192  	return platformDoesNotSupportError("Slash 32 Endpoint prefixes")
   193  }
   194  
   195  // AclSupportForProtocol252Supported returns an error if the HCN version does not support HNS ACL Policies to support protocol 252 for VXLAN.
   196  func AclSupportForProtocol252Supported() error {
   197  	supported, err := GetCachedSupportedFeatures()
   198  	if err != nil {
   199  		return err
   200  	}
   201  	if supported.AclSupportForProtocol252 {
   202  		return nil
   203  	}
   204  	return platformDoesNotSupportError("HNS ACL Policies to support protocol 252 for VXLAN")
   205  }
   206  
   207  // SessionAffinitySupported returns an error if the HCN version does not support Session Affinity.
   208  func SessionAffinitySupported() error {
   209  	supported, err := GetCachedSupportedFeatures()
   210  	if err != nil {
   211  		return err
   212  	}
   213  	if supported.SessionAffinity {
   214  		return nil
   215  	}
   216  	return platformDoesNotSupportError("Session Affinity")
   217  }
   218  
   219  // IPv6DualStackSupported returns an error if the HCN version does not support IPv6DualStack.
   220  func IPv6DualStackSupported() error {
   221  	supported, err := GetCachedSupportedFeatures()
   222  	if err != nil {
   223  		return err
   224  	}
   225  	if supported.IPv6DualStack {
   226  		return nil
   227  	}
   228  	return platformDoesNotSupportError("IPv6 DualStack")
   229  }
   230  
   231  // L4proxySupported returns an error if the HCN version does not support L4Proxy
   232  func L4proxyPolicySupported() error {
   233  	supported, err := GetCachedSupportedFeatures()
   234  	if err != nil {
   235  		return err
   236  	}
   237  	if supported.L4Proxy {
   238  		return nil
   239  	}
   240  	return platformDoesNotSupportError("L4ProxyPolicy")
   241  }
   242  
   243  // L4WfpProxySupported returns an error if the HCN version does not support L4WfpProxy
   244  func L4WfpProxyPolicySupported() error {
   245  	supported, err := GetCachedSupportedFeatures()
   246  	if err != nil {
   247  		return err
   248  	}
   249  	if supported.L4WfpProxy {
   250  		return nil
   251  	}
   252  	return platformDoesNotSupportError("L4WfpProxyPolicy")
   253  }
   254  
   255  // SetPolicySupported returns an error if the HCN version does not support SetPolicy.
   256  func SetPolicySupported() error {
   257  	supported, err := GetCachedSupportedFeatures()
   258  	if err != nil {
   259  		return err
   260  	}
   261  	if supported.SetPolicy {
   262  		return nil
   263  	}
   264  	return platformDoesNotSupportError("SetPolicy")
   265  }
   266  
   267  // VxlanPortSupported returns an error if the HCN version does not support configuring the VXLAN TCP port.
   268  func VxlanPortSupported() error {
   269  	supported, err := GetCachedSupportedFeatures()
   270  	if err != nil {
   271  		return err
   272  	}
   273  	if supported.VxlanPort {
   274  		return nil
   275  	}
   276  	return platformDoesNotSupportError("VXLAN port configuration")
   277  }
   278  
   279  // TierAclPolicySupported returns an error if the HCN version does not support configuring the TierAcl.
   280  func TierAclPolicySupported() error {
   281  	supported, err := GetCachedSupportedFeatures()
   282  	if err != nil {
   283  		return err
   284  	}
   285  	if supported.TierAcl {
   286  		return nil
   287  	}
   288  	return platformDoesNotSupportError("TierAcl")
   289  }
   290  
   291  // NetworkACLPolicySupported returns an error if the HCN version does not support NetworkACLPolicy
   292  func NetworkACLPolicySupported() error {
   293  	supported, err := GetCachedSupportedFeatures()
   294  	if err != nil {
   295  		return err
   296  	}
   297  	if supported.NetworkACL {
   298  		return nil
   299  	}
   300  	return platformDoesNotSupportError("NetworkACL")
   301  }
   302  
   303  // NestedIpSetSupported returns an error if the HCN version does not support NestedIpSet
   304  func NestedIpSetSupported() error {
   305  	supported, err := GetCachedSupportedFeatures()
   306  	if err != nil {
   307  		return err
   308  	}
   309  	if supported.NestedIpSet {
   310  		return nil
   311  	}
   312  	return platformDoesNotSupportError("NestedIpSet")
   313  }
   314  
   315  // RequestType are the different operations performed to settings.
   316  // Used to update the settings of Endpoint/Namespace objects.
   317  type RequestType string
   318  
   319  var (
   320  	// RequestTypeAdd adds the provided settings object.
   321  	RequestTypeAdd RequestType = "Add"
   322  	// RequestTypeRemove removes the provided settings object.
   323  	RequestTypeRemove RequestType = "Remove"
   324  	// RequestTypeUpdate replaces settings with the ones provided.
   325  	RequestTypeUpdate RequestType = "Update"
   326  	// RequestTypeRefresh refreshes the settings provided.
   327  	RequestTypeRefresh RequestType = "Refresh"
   328  )
   329  

View as plain text