mirror of https://github.com/docker/cli.git
105 lines
3.1 KiB
Go
105 lines
3.1 KiB
Go
package hcsshim
|
|
|
|
import (
|
|
"github.com/Microsoft/hcsshim/internal/hns"
|
|
)
|
|
|
|
// HNSEndpoint represents a network endpoint in HNS
|
|
type HNSEndpoint = hns.HNSEndpoint
|
|
|
|
// Namespace represents a Compartment.
|
|
type Namespace = hns.Namespace
|
|
|
|
//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 = hns.EndpointAttachDetachRequest
|
|
|
|
// EndpointResquestResponse is object to get the endpoint request response
|
|
type EndpointResquestResponse = hns.EndpointResquestResponse
|
|
|
|
// HNSEndpointRequest makes a HNS call to modify/query a network endpoint
|
|
func HNSEndpointRequest(method, path, request string) (*HNSEndpoint, error) {
|
|
return hns.HNSEndpointRequest(method, path, request)
|
|
}
|
|
|
|
// HNSListEndpointRequest makes a HNS call to query the list of available endpoints
|
|
func HNSListEndpointRequest() ([]HNSEndpoint, error) {
|
|
return hns.HNSListEndpointRequest()
|
|
}
|
|
|
|
// HotAttachEndpoint makes a HCS Call to attach the endpoint to the container
|
|
func HotAttachEndpoint(containerID string, endpointID string) error {
|
|
endpoint, err := GetHNSEndpointByID(endpointID)
|
|
isAttached, err := endpoint.IsAttached(containerID)
|
|
if isAttached {
|
|
return err
|
|
}
|
|
return modifyNetworkEndpoint(containerID, endpointID, Add)
|
|
}
|
|
|
|
// HotDetachEndpoint makes a HCS Call to detach the endpoint from the container
|
|
func HotDetachEndpoint(containerID string, endpointID string) error {
|
|
endpoint, err := GetHNSEndpointByID(endpointID)
|
|
isAttached, err := endpoint.IsAttached(containerID)
|
|
if !isAttached {
|
|
return err
|
|
}
|
|
return modifyNetworkEndpoint(containerID, endpointID, Remove)
|
|
}
|
|
|
|
// ModifyContainer corresponding to the container id, by sending a request
|
|
func modifyContainer(id string, request *ResourceModificationRequestResponse) error {
|
|
container, err := OpenContainer(id)
|
|
if err != nil {
|
|
if IsNotExist(err) {
|
|
return ErrComputeSystemDoesNotExist
|
|
}
|
|
return getInnerError(err)
|
|
}
|
|
defer container.Close()
|
|
err = container.Modify(request)
|
|
if err != nil {
|
|
if IsNotSupported(err) {
|
|
return ErrPlatformNotSupported
|
|
}
|
|
return getInnerError(err)
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func modifyNetworkEndpoint(containerID string, endpointID string, request RequestType) error {
|
|
requestMessage := &ResourceModificationRequestResponse{
|
|
Resource: Network,
|
|
Request: request,
|
|
Data: endpointID,
|
|
}
|
|
err := modifyContainer(containerID, requestMessage)
|
|
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// GetHNSEndpointByID get the Endpoint by ID
|
|
func GetHNSEndpointByID(endpointID string) (*HNSEndpoint, error) {
|
|
return hns.GetHNSEndpointByID(endpointID)
|
|
}
|
|
|
|
// GetHNSEndpointByName gets the endpoint filtered by Name
|
|
func GetHNSEndpointByName(endpointName string) (*HNSEndpoint, error) {
|
|
return hns.GetHNSEndpointByName(endpointName)
|
|
}
|