123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192 |
- package hcsshim
- import (
- "fmt"
- "os"
- "time"
- "github.com/Microsoft/hcsshim/internal/hcs"
- "github.com/Microsoft/hcsshim/internal/mergemaps"
- "github.com/Microsoft/hcsshim/internal/schema1"
- )
- // ContainerProperties holds the properties for a container and the processes running in that container
- type ContainerProperties = schema1.ContainerProperties
- // MemoryStats holds the memory statistics for a container
- type MemoryStats = schema1.MemoryStats
- // ProcessorStats holds the processor statistics for a container
- type ProcessorStats = schema1.ProcessorStats
- // StorageStats holds the storage statistics for a container
- type StorageStats = schema1.StorageStats
- // NetworkStats holds the network statistics for a container
- type NetworkStats = schema1.NetworkStats
- // Statistics is the structure returned by a statistics call on a container
- type Statistics = schema1.Statistics
- // ProcessList is the structure of an item returned by a ProcessList call on a container
- type ProcessListItem = schema1.ProcessListItem
- // MappedVirtualDiskController is the structure of an item returned by a MappedVirtualDiskList call on a container
- type MappedVirtualDiskController = schema1.MappedVirtualDiskController
- // Type of Request Support in ModifySystem
- type RequestType = schema1.RequestType
- // Type of Resource Support in ModifySystem
- type ResourceType = schema1.ResourceType
- // RequestType const
- const (
- Add = schema1.Add
- Remove = schema1.Remove
- Network = schema1.Network
- )
- // ResourceModificationRequestResponse 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 ResourceModificationRequestResponse = schema1.ResourceModificationRequestResponse
- type container struct {
- system *hcs.System
- }
- // createComputeSystemAdditionalJSON is read from the environment at initialisation
- // time. It allows an environment variable to define additional JSON which
- // is merged in the CreateComputeSystem call to HCS.
- var createContainerAdditionalJSON []byte
- func init() {
- createContainerAdditionalJSON = ([]byte)(os.Getenv("HCSSHIM_CREATECONTAINER_ADDITIONALJSON"))
- }
- // CreateContainer creates a new container with the given configuration but does not start it.
- func CreateContainer(id string, c *ContainerConfig) (Container, error) {
- fullConfig, err := mergemaps.MergeJSON(c, createContainerAdditionalJSON)
- if err != nil {
- return nil, fmt.Errorf("failed to merge additional JSON '%s': %s", createContainerAdditionalJSON, err)
- }
- system, err := hcs.CreateComputeSystem(id, fullConfig)
- if err != nil {
- return nil, err
- }
- return &container{system}, err
- }
- // OpenContainer opens an existing container by ID.
- func OpenContainer(id string) (Container, error) {
- system, err := hcs.OpenComputeSystem(id)
- if err != nil {
- return nil, err
- }
- return &container{system}, err
- }
- // GetContainers gets a list of the containers on the system that match the query
- func GetContainers(q ComputeSystemQuery) ([]ContainerProperties, error) {
- return hcs.GetComputeSystems(q)
- }
- // Start synchronously starts the container.
- func (container *container) Start() error {
- return convertSystemError(container.system.Start(), container)
- }
- // Shutdown requests a container shutdown, but it may not actually be shutdown until Wait() succeeds.
- func (container *container) Shutdown() error {
- return convertSystemError(container.system.Shutdown(), container)
- }
- // Terminate requests a container terminate, but it may not actually be terminated until Wait() succeeds.
- func (container *container) Terminate() error {
- return convertSystemError(container.system.Terminate(), container)
- }
- // Waits synchronously waits for the container to shutdown or terminate.
- func (container *container) Wait() error {
- return convertSystemError(container.system.Wait(), container)
- }
- // WaitTimeout synchronously waits for the container to terminate or the duration to elapse. It
- // returns false if timeout occurs.
- func (container *container) WaitTimeout(t time.Duration) error {
- return convertSystemError(container.system.WaitTimeout(t), container)
- }
- // Pause pauses the execution of a container.
- func (container *container) Pause() error {
- return convertSystemError(container.system.Pause(), container)
- }
- // Resume resumes the execution of a container.
- func (container *container) Resume() error {
- return convertSystemError(container.system.Resume(), container)
- }
- // HasPendingUpdates returns true if the container has updates pending to install
- func (container *container) HasPendingUpdates() (bool, error) {
- return false, nil
- }
- // Statistics returns statistics for the container. This is a legacy v1 call
- func (container *container) Statistics() (Statistics, error) {
- properties, err := container.system.Properties(schema1.PropertyTypeStatistics)
- if err != nil {
- return Statistics{}, convertSystemError(err, container)
- }
- return properties.Statistics, nil
- }
- // ProcessList returns an array of ProcessListItems for the container. This is a legacy v1 call
- func (container *container) ProcessList() ([]ProcessListItem, error) {
- properties, err := container.system.Properties(schema1.PropertyTypeProcessList)
- if err != nil {
- return nil, convertSystemError(err, container)
- }
- return properties.ProcessList, nil
- }
- // This is a legacy v1 call
- func (container *container) MappedVirtualDisks() (map[int]MappedVirtualDiskController, error) {
- properties, err := container.system.Properties(schema1.PropertyTypeMappedVirtualDisk)
- if err != nil {
- return nil, convertSystemError(err, container)
- }
- return properties.MappedVirtualDiskControllers, nil
- }
- // CreateProcess launches a new process within the container.
- func (container *container) CreateProcess(c *ProcessConfig) (Process, error) {
- p, err := container.system.CreateProcess(c)
- if err != nil {
- return nil, convertSystemError(err, container)
- }
- return &process{p}, nil
- }
- // OpenProcess gets an interface to an existing process within the container.
- func (container *container) OpenProcess(pid int) (Process, error) {
- p, err := container.system.OpenProcess(pid)
- if err != nil {
- return nil, convertSystemError(err, container)
- }
- return &process{p}, nil
- }
- // Close cleans up any state associated with the container but does not terminate or wait for it.
- func (container *container) Close() error {
- return convertSystemError(container.system.Close(), container)
- }
- // Modify the System
- func (container *container) Modify(config *ResourceModificationRequestResponse) error {
- return convertSystemError(container.system.Modify(config), container)
- }
|