diff --git a/components/engine/vendor.conf b/components/engine/vendor.conf index 0c202e0cad..7608b0e337 100644 --- a/components/engine/vendor.conf +++ b/components/engine/vendor.conf @@ -1,6 +1,6 @@ # the following lines are in sorted order, FYI github.com/Azure/go-ansiterm 19f72df4d05d31cbe1c56bfc8045c96babff6c7e -github.com/Microsoft/hcsshim v0.6.1 +github.com/Microsoft/hcsshim v0.6.2 github.com/Microsoft/go-winio v0.4.4 github.com/moby/buildkit da2b9dc7dab99e824b2b1067ad7d0523e32dd2d9 https://github.com/dmcgowan/buildkit.git github.com/davecgh/go-spew 346938d642f2ec3594ed81d874461961cd0faa76 diff --git a/components/engine/vendor/github.com/Microsoft/hcsshim/hnsendpoint.go b/components/engine/vendor/github.com/Microsoft/hcsshim/hnsendpoint.go index 07c6a7bc36..92afc0c249 100644 --- a/components/engine/vendor/github.com/Microsoft/hcsshim/hnsendpoint.go +++ b/components/engine/vendor/github.com/Microsoft/hcsshim/hnsendpoint.go @@ -26,6 +26,31 @@ type HNSEndpoint struct { IsRemoteEndpoint bool `json:",omitempty"` } +//SystemType represents the type of the system on which actions are done +type SystemType string + +// SystemType const +const ( + ContainerType SystemType = "Container" + VirtualMachineType SystemType = "VirtualMachine" + HostType SystemType = "Host" +) + +// EndpointAttachDetachRequest is the structure used to send request to the container to modify the system +// Supported resource types are Network and Request Types are Add/Remove +type EndpointAttachDetachRequest struct { + ContainerID string `json:"ContainerId,omitempty"` + SystemType SystemType `json:"SystemType"` + CompartmentID uint16 `json:"CompartmentId,omitempty"` + VirtualNICName string `json:"VirtualNicName,omitempty"` +} + +// EndpointResquestResponse is object to get the endpoint request response +type EndpointResquestResponse struct { + Success bool + Error string +} + // HNSEndpointRequest makes a HNS call to modify/query a network endpoint func HNSEndpointRequest(method, path, request string) (*HNSEndpoint, error) { endpoint := &HNSEndpoint{} @@ -94,12 +119,12 @@ func modifyNetworkEndpoint(containerID string, endpointID string, request Reques return nil } -// GetHNSEndpointByID +// GetHNSEndpointByID get the Endpoint by ID func GetHNSEndpointByID(endpointID string) (*HNSEndpoint, error) { return HNSEndpointRequest("GET", endpointID, "") } -// GetHNSNetworkName filtered by Name +// GetHNSEndpointByName gets the endpoint filtered by Name func GetHNSEndpointByName(endpointName string) (*HNSEndpoint, error) { hnsResponse, err := HNSListEndpointRequest() if err != nil { @@ -135,7 +160,7 @@ func (endpoint *HNSEndpoint) Delete() (*HNSEndpoint, error) { return HNSEndpointRequest("DELETE", endpoint.Id, "") } -// Delete Endpoint by sending EndpointRequest to HNS +// Update Endpoint func (endpoint *HNSEndpoint) Update() (*HNSEndpoint, error) { operation := "Update" title := "HCSShim::HNSEndpoint::" + operation @@ -144,30 +169,30 @@ func (endpoint *HNSEndpoint) Update() (*HNSEndpoint, error) { if err != nil { return nil, err } - err = hnsCall("POST", "/endpoints/"+endpoint.Id+"/update", string(jsonString), &endpoint) + err = hnsCall("POST", "/endpoints/"+endpoint.Id, string(jsonString), &endpoint) return endpoint, err } -// Hot Attach an endpoint to a container -func (endpoint *HNSEndpoint) HotAttach(containerID string) error { - operation := "HotAttach" +// ContainerHotAttach attaches an endpoint to a running container +func (endpoint *HNSEndpoint) ContainerHotAttach(containerID string) error { + operation := "ContainerHotAttach" title := "HCSShim::HNSEndpoint::" + operation logrus.Debugf(title+" id=%s, containerId=%s", endpoint.Id, containerID) return modifyNetworkEndpoint(containerID, endpoint.Id, Add) } -// Hot Detach an endpoint from a container -func (endpoint *HNSEndpoint) HotDetach(containerID string) error { - operation := "HotDetach" +// ContainerHotDetach detaches an endpoint from a running container +func (endpoint *HNSEndpoint) ContainerHotDetach(containerID string) error { + operation := "ContainerHotDetach" title := "HCSShim::HNSEndpoint::" + operation logrus.Debugf(title+" id=%s, containerId=%s", endpoint.Id, containerID) return modifyNetworkEndpoint(containerID, endpoint.Id, Remove) } -// Apply Acl Policy on the Endpoint +// ApplyACLPolicy applies Acl Policy on the Endpoint func (endpoint *HNSEndpoint) ApplyACLPolicy(policy *ACLPolicy) error { operation := "ApplyACLPolicy" title := "HCSShim::HNSEndpoint::" + operation @@ -181,3 +206,113 @@ func (endpoint *HNSEndpoint) ApplyACLPolicy(policy *ACLPolicy) error { _, err = endpoint.Update() return err } + +// ContainerAttach attaches an endpoint to container +func (endpoint *HNSEndpoint) ContainerAttach(containerID string, compartmentID uint16) error { + operation := "ContainerAttach" + title := "HCSShim::HNSEndpoint::" + operation + logrus.Debugf(title+" id=%s", endpoint.Id) + + requestMessage := &EndpointAttachDetachRequest{ + ContainerID: containerID, + CompartmentID: compartmentID, + SystemType: ContainerType, + } + response := &EndpointResquestResponse{} + jsonString, err := json.Marshal(requestMessage) + if err != nil { + return err + } + return hnsCall("POST", "/endpoints/"+endpoint.Id+"/attach", string(jsonString), &response) +} + +// ContainerDetach detaches an endpoint from container +func (endpoint *HNSEndpoint) ContainerDetach(containerID string) error { + operation := "ContainerDetach" + title := "HCSShim::HNSEndpoint::" + operation + logrus.Debugf(title+" id=%s", endpoint.Id) + + requestMessage := &EndpointAttachDetachRequest{ + ContainerID: containerID, + SystemType: ContainerType, + } + response := &EndpointResquestResponse{} + + jsonString, err := json.Marshal(requestMessage) + if err != nil { + return err + } + return hnsCall("POST", "/endpoints/"+endpoint.Id+"/detach", string(jsonString), &response) +} + +// HostAttach attaches a nic on the host +func (endpoint *HNSEndpoint) HostAttach(compartmentID uint16) error { + operation := "HostAttach" + title := "HCSShim::HNSEndpoint::" + operation + logrus.Debugf(title+" id=%s", endpoint.Id) + requestMessage := &EndpointAttachDetachRequest{ + CompartmentID: compartmentID, + SystemType: HostType, + } + response := &EndpointResquestResponse{} + + jsonString, err := json.Marshal(requestMessage) + if err != nil { + return err + } + return hnsCall("POST", "/endpoints/"+endpoint.Id+"/attach", string(jsonString), &response) + +} + +// HostDetach detaches a nic on the host +func (endpoint *HNSEndpoint) HostDetach() error { + operation := "HostDetach" + title := "HCSShim::HNSEndpoint::" + operation + logrus.Debugf(title+" id=%s", endpoint.Id) + requestMessage := &EndpointAttachDetachRequest{ + SystemType: HostType, + } + response := &EndpointResquestResponse{} + + jsonString, err := json.Marshal(requestMessage) + if err != nil { + return err + } + return hnsCall("POST", "/endpoints/"+endpoint.Id+"/detach", string(jsonString), &response) +} + +// VirtualMachineNICAttach attaches a endpoint to a virtual machine +func (endpoint *HNSEndpoint) VirtualMachineNICAttach(virtualMachineNICName string) error { + operation := "VirtualMachineNicAttach" + title := "HCSShim::HNSEndpoint::" + operation + logrus.Debugf(title+" id=%s", endpoint.Id) + requestMessage := &EndpointAttachDetachRequest{ + VirtualNICName: virtualMachineNICName, + SystemType: VirtualMachineType, + } + response := &EndpointResquestResponse{} + + jsonString, err := json.Marshal(requestMessage) + if err != nil { + return err + } + return hnsCall("POST", "/endpoints/"+endpoint.Id+"/attach", string(jsonString), &response) +} + +// VirtualMachineNICDetach detaches a endpoint from a virtual machine +func (endpoint *HNSEndpoint) VirtualMachineNICDetach() error { + operation := "VirtualMachineNicDetach" + title := "HCSShim::HNSEndpoint::" + operation + logrus.Debugf(title+" id=%s", endpoint.Id) + + requestMessage := &EndpointAttachDetachRequest{ + SystemType: VirtualMachineType, + } + response := &EndpointResquestResponse{} + + jsonString, err := json.Marshal(requestMessage) + if err != nil { + return err + } + return hnsCall("POST", "/endpoints/"+endpoint.Id+"/detach", string(jsonString), &response) +} diff --git a/components/engine/vendor/github.com/Microsoft/hcsshim/hnspolicylist.go b/components/engine/vendor/github.com/Microsoft/hcsshim/hnspolicylist.go index 4f2978f680..15653b4f42 100644 --- a/components/engine/vendor/github.com/Microsoft/hcsshim/hnspolicylist.go +++ b/components/engine/vendor/github.com/Microsoft/hcsshim/hnspolicylist.go @@ -6,6 +6,7 @@ import ( "github.com/sirupsen/logrus" ) +// RoutePolicy is a structure defining schema for Route based Policy type RoutePolicy struct { Policy DestinationPrefix string `json:"DestinationPrefix,omitempty"` @@ -13,6 +14,7 @@ type RoutePolicy struct { EncapEnabled bool `json:"NeedEncap,omitempty"` } +// ELBPolicy is a structure defining schema for ELB LoadBalancing based Policy type ELBPolicy struct { LBPolicy SourceVIP string `json:"SourceVIP,omitempty"` @@ -20,6 +22,7 @@ type ELBPolicy struct { ILB bool `json:"ILB,omitempty"` } +// LBPolicy is a structure defining schema for LoadBalancing based Policy type LBPolicy struct { Policy Protocol uint16 `json:"Protocol,omitempty"` @@ -27,10 +30,11 @@ type LBPolicy struct { ExternalPort uint16 } +// PolicyList is a structure defining schema for Policy list request type PolicyList struct { - Id string `json:"ID,omitempty"` - EndpointReferences []string `json:"References,omitempty"` - Policies []string `json:"Policies,omitempty"` + ID string `json:"ID,omitempty"` + EndpointReferences []string `json:"References,omitempty"` + Policies []json.RawMessage `json:"Policies,omitempty"` } // HNSPolicyListRequest makes a call into HNS to update/query a single network @@ -44,6 +48,7 @@ func HNSPolicyListRequest(method, path, request string) (*PolicyList, error) { return &policy, nil } +// HNSListPolicyListRequest gets all the policy list func HNSListPolicyListRequest() ([]PolicyList, error) { var plist []PolicyList err := hnsCall("GET", "/policylists/", "", &plist) @@ -54,7 +59,7 @@ func HNSListPolicyListRequest() ([]PolicyList, error) { return plist, nil } -// PolicyListRequest makes a HNS call to modify/query a network endpoint +// PolicyListRequest makes a HNS call to modify/query a network policy list func PolicyListRequest(method, path, request string) (*PolicyList, error) { policylist := &PolicyList{} err := hnsCall(method, "/policylists/"+path, request, &policylist) @@ -65,11 +70,16 @@ func PolicyListRequest(method, path, request string) (*PolicyList, error) { return policylist, nil } +// GetPolicyListByID get the policy list by ID +func GetPolicyListByID(policyListID string) (*PolicyList, error) { + return PolicyListRequest("GET", policyListID, "") +} + // Create PolicyList by sending PolicyListRequest to HNS. func (policylist *PolicyList) Create() (*PolicyList, error) { operation := "Create" title := "HCSShim::PolicyList::" + operation - logrus.Debugf(title+" id=%s", policylist.Id) + logrus.Debugf(title+" id=%s", policylist.ID) jsonString, err := json.Marshal(policylist) if err != nil { return nil, err @@ -77,20 +87,20 @@ func (policylist *PolicyList) Create() (*PolicyList, error) { return PolicyListRequest("POST", "", string(jsonString)) } -// Create PolicyList by sending PolicyListRequest to HNS +// Delete deletes PolicyList func (policylist *PolicyList) Delete() (*PolicyList, error) { operation := "Delete" title := "HCSShim::PolicyList::" + operation - logrus.Debugf(title+" id=%s", policylist.Id) + logrus.Debugf(title+" id=%s", policylist.ID) - return PolicyListRequest("DELETE", policylist.Id, "") + return PolicyListRequest("DELETE", policylist.ID, "") } -// Add an endpoint to a Policy List +// AddEndpoint add an endpoint to a Policy List func (policylist *PolicyList) AddEndpoint(endpoint *HNSEndpoint) (*PolicyList, error) { operation := "AddEndpoint" title := "HCSShim::PolicyList::" + operation - logrus.Debugf(title+" id=%s, endpointId:%s", policylist.Id, endpoint.Id) + logrus.Debugf(title+" id=%s, endpointId:%s", policylist.ID, endpoint.Id) _, err := policylist.Delete() if err != nil { @@ -103,11 +113,11 @@ func (policylist *PolicyList) AddEndpoint(endpoint *HNSEndpoint) (*PolicyList, e return policylist.Create() } -// Remove an endpoint from the Policy List +// RemoveEndpoint removes an endpoint from the Policy List func (policylist *PolicyList) RemoveEndpoint(endpoint *HNSEndpoint) (*PolicyList, error) { operation := "RemoveEndpoint" title := "HCSShim::PolicyList::" + operation - logrus.Debugf(title+" id=%s, endpointId:%s", policylist.Id, endpoint.Id) + logrus.Debugf(title+" id=%s, endpointId:%s", policylist.ID, endpoint.Id) _, err := policylist.Delete() if err != nil { @@ -153,12 +163,11 @@ func AddLoadBalancer(endpoints []HNSEndpoint, isILB bool, vip string, protocol u if err != nil { return nil, err } - - policylist.Policies[0] = string(jsonString) + policylist.Policies = append(policylist.Policies, jsonString) return policylist.Create() } -// AddLoadBalancer policy list for the specified endpoints +// AddRoute adds route policy list for the specified endpoints func AddRoute(endpoints []HNSEndpoint, destinationPrefix string, nextHop string, encapEnabled bool) (*PolicyList, error) { operation := "AddRoute" title := "HCSShim::PolicyList::" + operation @@ -182,6 +191,6 @@ func AddRoute(endpoints []HNSEndpoint, destinationPrefix string, nextHop string, return nil, err } - policylist.Policies[0] = string(jsonString) + policylist.Policies = append(policylist.Policies, jsonString) return policylist.Create() } diff --git a/components/engine/vendor/github.com/Microsoft/hcsshim/interface.go b/components/engine/vendor/github.com/Microsoft/hcsshim/interface.go index a547dd3136..9fc7852e41 100644 --- a/components/engine/vendor/github.com/Microsoft/hcsshim/interface.go +++ b/components/engine/vendor/github.com/Microsoft/hcsshim/interface.go @@ -48,6 +48,8 @@ type HvRuntime struct { LinuxInitrdFile string `json:",omitempty"` // File under ImagePath on host containing an initrd image for starting a Linux utility VM LinuxKernelFile string `json:",omitempty"` // File under ImagePath on host containing a kernel for starting a Linux utility VM LinuxBootParameters string `json:",omitempty"` // Additional boot parameters for starting a Linux Utility VM in initrd mode + BootSource string `json:",omitempty"` // "Vhd" for Linux Utility VM booting from VHD + WritableBootSource bool `json:",omitempty"` // Linux Utility VM booting from VHD } type MappedVirtualDisk struct { diff --git a/components/engine/vendor/github.com/Microsoft/hcsshim/legacy.go b/components/engine/vendor/github.com/Microsoft/hcsshim/legacy.go index 85761573ca..c7f6073ac3 100644 --- a/components/engine/vendor/github.com/Microsoft/hcsshim/legacy.go +++ b/components/engine/vendor/github.com/Microsoft/hcsshim/legacy.go @@ -307,6 +307,16 @@ func (r *legacyLayerReader) Read(b []byte) (int, error) { return r.backupReader.Read(b) } +func (r *legacyLayerReader) Seek(offset int64, whence int) (int64, error) { + if r.backupReader == nil { + if r.currentFile == nil { + return 0, errors.New("no current file") + } + return r.currentFile.Seek(offset, whence) + } + return 0, errors.New("seek not supported on this stream") +} + func (r *legacyLayerReader) Close() error { r.proceed <- false <-r.result