hcn.go 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. // Package hcn is a shim for the Host Compute Networking (HCN) service, which manages networking for Windows Server
  2. // containers and Hyper-V containers. Previous to RS5, HCN was referred to as Host Networking Service (HNS).
  3. package hcn
  4. import (
  5. "encoding/json"
  6. "fmt"
  7. "syscall"
  8. "github.com/Microsoft/hcsshim/internal/guid"
  9. )
  10. //go:generate go run ../mksyscall_windows.go -output zsyscall_windows.go hcn.go
  11. /// HNS V1 API
  12. //sys SetCurrentThreadCompartmentId(compartmentId uint32) (hr error) = iphlpapi.SetCurrentThreadCompartmentId
  13. //sys _hnsCall(method string, path string, object string, response **uint16) (hr error) = vmcompute.HNSCall?
  14. /// HCN V2 API
  15. // Network
  16. //sys hcnEnumerateNetworks(query string, networks **uint16, result **uint16) (hr error) = computenetwork.HcnEnumerateNetworks?
  17. //sys hcnCreateNetwork(id *_guid, settings string, network *hcnNetwork, result **uint16) (hr error) = computenetwork.HcnCreateNetwork?
  18. //sys hcnOpenNetwork(id *_guid, network *hcnNetwork, result **uint16) (hr error) = computenetwork.HcnOpenNetwork?
  19. //sys hcnModifyNetwork(network hcnNetwork, settings string, result **uint16) (hr error) = computenetwork.HcnModifyNetwork?
  20. //sys hcnQueryNetworkProperties(network hcnNetwork, query string, properties **uint16, result **uint16) (hr error) = computenetwork.HcnQueryNetworkProperties?
  21. //sys hcnDeleteNetwork(id *_guid, result **uint16) (hr error) = computenetwork.HcnDeleteNetwork?
  22. //sys hcnCloseNetwork(network hcnNetwork) (hr error) = computenetwork.HcnCloseNetwork?
  23. // Endpoint
  24. //sys hcnEnumerateEndpoints(query string, endpoints **uint16, result **uint16) (hr error) = computenetwork.HcnEnumerateEndpoints?
  25. //sys hcnCreateEndpoint(network hcnNetwork, id *_guid, settings string, endpoint *hcnEndpoint, result **uint16) (hr error) = computenetwork.HcnCreateEndpoint?
  26. //sys hcnOpenEndpoint(id *_guid, endpoint *hcnEndpoint, result **uint16) (hr error) = computenetwork.HcnOpenEndpoint?
  27. //sys hcnModifyEndpoint(endpoint hcnEndpoint, settings string, result **uint16) (hr error) = computenetwork.HcnModifyEndpoint?
  28. //sys hcnQueryEndpointProperties(endpoint hcnEndpoint, query string, properties **uint16, result **uint16) (hr error) = computenetwork.HcnQueryEndpointProperties?
  29. //sys hcnDeleteEndpoint(id *_guid, result **uint16) (hr error) = computenetwork.HcnDeleteEndpoint?
  30. //sys hcnCloseEndpoint(endpoint hcnEndpoint) (hr error) = computenetwork.HcnCloseEndpoint?
  31. // Namespace
  32. //sys hcnEnumerateNamespaces(query string, namespaces **uint16, result **uint16) (hr error) = computenetwork.HcnEnumerateNamespaces?
  33. //sys hcnCreateNamespace(id *_guid, settings string, namespace *hcnNamespace, result **uint16) (hr error) = computenetwork.HcnCreateNamespace?
  34. //sys hcnOpenNamespace(id *_guid, namespace *hcnNamespace, result **uint16) (hr error) = computenetwork.HcnOpenNamespace?
  35. //sys hcnModifyNamespace(namespace hcnNamespace, settings string, result **uint16) (hr error) = computenetwork.HcnModifyNamespace?
  36. //sys hcnQueryNamespaceProperties(namespace hcnNamespace, query string, properties **uint16, result **uint16) (hr error) = computenetwork.HcnQueryNamespaceProperties?
  37. //sys hcnDeleteNamespace(id *_guid, result **uint16) (hr error) = computenetwork.HcnDeleteNamespace?
  38. //sys hcnCloseNamespace(namespace hcnNamespace) (hr error) = computenetwork.HcnCloseNamespace?
  39. // LoadBalancer
  40. //sys hcnEnumerateLoadBalancers(query string, loadBalancers **uint16, result **uint16) (hr error) = computenetwork.HcnEnumerateLoadBalancers?
  41. //sys hcnCreateLoadBalancer(id *_guid, settings string, loadBalancer *hcnLoadBalancer, result **uint16) (hr error) = computenetwork.HcnCreateLoadBalancer?
  42. //sys hcnOpenLoadBalancer(id *_guid, loadBalancer *hcnLoadBalancer, result **uint16) (hr error) = computenetwork.HcnOpenLoadBalancer?
  43. //sys hcnModifyLoadBalancer(loadBalancer hcnLoadBalancer, settings string, result **uint16) (hr error) = computenetwork.HcnModifyLoadBalancer?
  44. //sys hcnQueryLoadBalancerProperties(loadBalancer hcnLoadBalancer, query string, properties **uint16, result **uint16) (hr error) = computenetwork.HcnQueryLoadBalancerProperties?
  45. //sys hcnDeleteLoadBalancer(id *_guid, result **uint16) (hr error) = computenetwork.HcnDeleteLoadBalancer?
  46. //sys hcnCloseLoadBalancer(loadBalancer hcnLoadBalancer) (hr error) = computenetwork.HcnCloseLoadBalancer?
  47. // Service
  48. //sys hcnOpenService(service *hcnService, result **uint16) (hr error) = computenetwork.HcnOpenService?
  49. //sys hcnRegisterServiceCallback(service hcnService, callback int32, context int32, callbackHandle *hcnCallbackHandle) (hr error) = computenetwork.HcnRegisterServiceCallback?
  50. //sys hcnUnregisterServiceCallback(callbackHandle hcnCallbackHandle) (hr error) = computenetwork.HcnUnregisterServiceCallback?
  51. //sys hcnCloseService(service hcnService) (hr error) = computenetwork.HcnCloseService?
  52. type _guid = guid.GUID
  53. type hcnNetwork syscall.Handle
  54. type hcnEndpoint syscall.Handle
  55. type hcnNamespace syscall.Handle
  56. type hcnLoadBalancer syscall.Handle
  57. type hcnService syscall.Handle
  58. type hcnCallbackHandle syscall.Handle
  59. // SchemaVersion for HCN Objects/Queries.
  60. type SchemaVersion = Version // hcnglobals.go
  61. // HostComputeQueryFlags are passed in to a HostComputeQuery to determine which
  62. // properties of an object are returned.
  63. type HostComputeQueryFlags uint32
  64. var (
  65. // HostComputeQueryFlagsNone returns an object with the standard properties.
  66. HostComputeQueryFlagsNone HostComputeQueryFlags
  67. // HostComputeQueryFlagsDetailed returns an object with all properties.
  68. HostComputeQueryFlagsDetailed HostComputeQueryFlags = 1
  69. )
  70. // HostComputeQuery is the format for HCN queries.
  71. type HostComputeQuery struct {
  72. SchemaVersion SchemaVersion `json:""`
  73. Flags HostComputeQueryFlags `json:",omitempty"`
  74. Filter string `json:",omitempty"`
  75. }
  76. // defaultQuery generates HCN Query.
  77. // Passed into get/enumerate calls to filter results.
  78. func defaultQuery() HostComputeQuery {
  79. query := HostComputeQuery{
  80. SchemaVersion: SchemaVersion{
  81. Major: 2,
  82. Minor: 0,
  83. },
  84. Flags: HostComputeQueryFlagsNone,
  85. }
  86. return query
  87. }
  88. func defaultQueryJson() string {
  89. query := defaultQuery()
  90. queryJson, err := json.Marshal(query)
  91. if err != nil {
  92. return ""
  93. }
  94. return string(queryJson)
  95. }
  96. // PlatformDoesNotSupportError happens when users are attempting to use a newer shim on an older OS
  97. func platformDoesNotSupportError(featureName string) error {
  98. return fmt.Errorf("Platform does not support feature %s", featureName)
  99. }
  100. // V2ApiSupported returns an error if the HCN version does not support the V2 Apis.
  101. func V2ApiSupported() error {
  102. supported := GetSupportedFeatures()
  103. if supported.Api.V2 {
  104. return nil
  105. }
  106. return platformDoesNotSupportError("V2 Api/Schema")
  107. }
  108. func V2SchemaVersion() SchemaVersion {
  109. return SchemaVersion{
  110. Major: 2,
  111. Minor: 0,
  112. }
  113. }
  114. // RemoteSubnetSupported returns an error if the HCN version does not support Remote Subnet policies.
  115. func RemoteSubnetSupported() error {
  116. supported := GetSupportedFeatures()
  117. if supported.RemoteSubnet {
  118. return nil
  119. }
  120. return platformDoesNotSupportError("Remote Subnet")
  121. }
  122. // HostRouteSupported returns an error if the HCN version does not support Host Route policies.
  123. func HostRouteSupported() error {
  124. supported := GetSupportedFeatures()
  125. if supported.HostRoute {
  126. return nil
  127. }
  128. return platformDoesNotSupportError("Host Route")
  129. }
  130. // DSRSupported returns an error if the HCN version does not support Direct Server Return.
  131. func DSRSupported() error {
  132. supported := GetSupportedFeatures()
  133. if supported.DSR {
  134. return nil
  135. }
  136. return platformDoesNotSupportError("Direct Server Return (DSR)")
  137. }
  138. // RequestType are the different operations performed to settings.
  139. // Used to update the settings of Endpoint/Namespace objects.
  140. type RequestType string
  141. var (
  142. // RequestTypeAdd adds the provided settings object.
  143. RequestTypeAdd RequestType = "Add"
  144. // RequestTypeRemove removes the provided settings object.
  145. RequestTypeRemove RequestType = "Remove"
  146. // RequestTypeUpdate replaces settings with the ones provided.
  147. RequestTypeUpdate RequestType = "Update"
  148. // RequestTypeRefresh refreshes the settings provided.
  149. RequestTypeRefresh RequestType = "Refresh"
  150. )