| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421 |
- // Copyright 2019 Yunion
- //
- // Licensed under the Apache License, Version 2.0 (the "License");
- // you may not use this file except in compliance with the License.
- // You may obtain a copy of the License at
- //
- // http://www.apache.org/licenses/LICENSE-2.0
- //
- // Unless required by applicable law or agreed to in writing, software
- // distributed under the License is distributed on an "AS IS" BASIS,
- // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- // See the License for the specific language governing permissions and
- // limitations under the License.
- package apis
- import (
- "encoding/json"
- "yunion.io/x/pkg/errors"
- "yunion.io/x/pkg/util/sets"
- )
- type ContainerKeyValue struct {
- Key string `json:"key"`
- Value string `json:"value"`
- ValueFrom *ContainerValueSource `json:"value_from"`
- }
- type ContainerValueSource struct {
- Credential *ContainerValueSourceCredential `json:"credential"`
- }
- type ContainerValueSourceCredential struct {
- Id string `json:"id"`
- Key string `json:"key"`
- }
- type ContainerLifecyleHandlerType string
- const (
- ContainerLifecyleHandlerTypeExec ContainerLifecyleHandlerType = "exec"
- )
- type ContainerLifecyleHandlerExecAction struct {
- Command []string `json:"command"`
- }
- type ContainerLifecyleHandler struct {
- Type ContainerLifecyleHandlerType `json:"type"`
- Exec *ContainerLifecyleHandlerExecAction `json:"exec"`
- }
- type ContainerLifecyle struct {
- PostStart *ContainerLifecyleHandler `json:"post_start"`
- }
- type ContainerProcMountType string
- const (
- // DefaultProcMount uses the container runtime defaults for readonly and masked
- // paths for /proc. Most container runtimes mask certain paths in /proc to avoid
- // accidental security exposure of special devices or information.
- ContainerDefaultProcMount ContainerProcMountType = "Default"
- // UnmaskedProcMount bypasses the default masking behavior of the container
- // runtime and ensures the newly created /proc the container stays in tact with
- // no modifications.
- ContainerUnmaskedProcMount ContainerProcMountType = "Unmasked"
- )
- type ContainerSecurityContext struct {
- RunAsUser *int64 `json:"run_as_user,omitempty"`
- RunAsGroup *int64 `json:"run_as_group,omitempty"`
- // procMount denotes the type of proc mount to use for the containers.
- // The default is DefaultProcMount which uses the container runtime defaults for
- ProcMount ContainerProcMountType `json:"proc_mount"`
- ApparmorProfile string `json:"apparmor_profile"`
- }
- type ContainerResources struct {
- // CpuCfsQuota can be set to 0.5 that mapping to 0.5*100000 for cpu.cpu_cfs_quota_us
- CpuCfsQuota *float64 `json:"cpu_cfs_quota,omitempty"`
- // MemoryLimitMB will be transferred to memory.limit_in_bytes
- // MemoryLimitMB *int64 `json:"memory_limit_mb,omitempty"`
- // PidsMax will be set to pids.max
- PidsMax *int `json:"pids_max"`
- // DevicesAllow will be set to devices.allow
- DevicesAllow []string `json:"devices_allow"`
- // This flag only affects the cpuset controller. If the clone_children
- // flag is enabled in a cgroup, a new cpuset cgroup will copy its
- // configuration fromthe parent during initialization.
- CpusetCloneChildren bool `json:"cpuset_clone_children"`
- // cgroup memory.high
- MemoryHighRatio *float64 `json:"memory_high_ratio"`
- }
- type ContainerEnvRefValueType string
- const (
- ContainerEnvRefValueTypeIsolatedDevice ContainerEnvRefValueType = "isolated_device"
- )
- type ContainerIsolatedDeviceOnlyEnv struct {
- Key string `json:"key"`
- FromRenderPath bool `json:"from_render_path"`
- FromIndex bool `json:"from_index"`
- FromDeviceMinor bool `json:"from_device_minor"`
- }
- type ContainerCDIKind string
- var (
- CONTAINER_CDI_KIND_NVIDIA_GPU ContainerCDIKind = "nvidia.com/gpu"
- )
- type ContainerIsolatedDeviceCDI struct {
- Kind ContainerCDIKind
- }
- type ContainerSpec struct {
- // Image to use.
- Image string `json:"image"`
- // Image pull policy
- ImagePullPolicy ImagePullPolicy `json:"image_pull_policy"`
- // Image credential id
- ImageCredentialId string `json:"image_credential_id"`
- // Command to execute (i.e., entrypoint for docker)
- Command []string `json:"command"`
- // Args for the Command (i.e. command for docker)
- Args []string `json:"args"`
- // Current working directory of the command.
- WorkingDir string `json:"working_dir"`
- // List of environment variable to set in the container.
- Envs []*ContainerKeyValue `json:"envs"`
- // Enable lxcfs
- EnableLxcfs bool `json:"enable_lxcfs"`
- Capabilities *ContainerCapability `json:"capabilities"`
- Privileged bool `json:"privileged"`
- DisableNoNewPrivs bool `json:"disable_no_new_privs"`
- Lifecyle *ContainerLifecyle `json:"lifecyle"`
- CgroupDevicesAllow []string `json:"cgroup_devices_allow"`
- CgroupPidsMax int `json:"cgroup_pids_max"`
- ResourcesLimit *ContainerResources `json:"resources_limit"`
- SimulateCpu bool `json:"simulate_cpu"`
- ShmSizeMB int `json:"shm_size_mb"`
- SecurityContext *ContainerSecurityContext `json:"security_context,omitempty"`
- // Periodic probe of container liveness.
- // Container will be restarted if the probe fails.
- // Cannot be updated.
- //LivenessProbe *ContainerProbe `json:"liveness_probe,omitempty"`
- // StartupProbe indicates that the Pod has successfully initialized.
- // If specified, no other probes are executed until this completes successfully.
- StartupProbe *ContainerProbe `json:"startup_probe,omitempty"`
- AlwaysRestart bool `json:"always_restart"`
- Primary bool `json:"primary"`
- // DependsOn is a list of container name which this container depends on when pod start
- // Only works for containers created & started by pod-create & server-start
- DependsOn []string `json:"depends_on,omitempty"`
- }
- func (c *ContainerSpec) NeedProbe() bool {
- //if c.LivenessProbe != nil {
- // return true
- //}
- if c.StartupProbe != nil {
- return true
- }
- return false
- }
- type ContainerCapability struct {
- Add []string `json:"add"`
- Drop []string `json:"drop"`
- }
- type ImagePullPolicy string
- const (
- ImagePullPolicyAlways = "Always"
- ImagePullPolicyIfNotPresent = "IfNotPresent"
- )
- type ContainerVolumeMountType string
- const (
- CONTAINER_VOLUME_MOUNT_TYPE_DISK ContainerVolumeMountType = "disk"
- CONTAINER_VOLUME_MOUNT_TYPE_HOST_PATH ContainerVolumeMountType = "host_path"
- CONTAINER_VOLUME_MOUNT_TYPE_TEXT ContainerVolumeMountType = "text"
- CONTAINER_VOLUME_MOUNT_TYPE_CEPHF_FS ContainerVolumeMountType = "ceph_fs"
- )
- type ContainerDeviceType string
- const (
- CONTAINER_DEVICE_TYPE_ISOLATED_DEVICE ContainerDeviceType = "isolated_device"
- CONTAINER_DEVICE_TYPE_HOST ContainerDeviceType = "host"
- )
- type ContainerMountPropagation string
- const (
- // No mount propagation ("private" in Linux terminology).
- MOUNTPROPAGATION_PROPAGATION_PRIVATE ContainerMountPropagation = "private"
- // Mounts get propagated from the host to the container ("rslave" in Linux).
- MOUNTPROPAGATION_PROPAGATION_HOST_TO_CONTAINER ContainerMountPropagation = "rslave"
- // Mounts get propagated from the host to the container and from the
- // container to the host ("rshared" in Linux).
- MOUNTPROPAGATION_PROPAGATION_BIDIRECTIONAL ContainerMountPropagation = "rshared"
- )
- var (
- ContainerMountPropagations = sets.NewString(
- string(MOUNTPROPAGATION_PROPAGATION_PRIVATE), string(MOUNTPROPAGATION_PROPAGATION_HOST_TO_CONTAINER), string(MOUNTPROPAGATION_PROPAGATION_BIDIRECTIONAL))
- )
- type ContainerVolumeMount struct {
- // 用于标识当前 pod volume mount 的唯一性
- UniqueName string `json:"unique_name"`
- Type ContainerVolumeMountType `json:"type"`
- Disk *ContainerVolumeMountDisk `json:"disk"`
- HostPath *ContainerVolumeMountHostPath `json:"host_path"`
- Text *ContainerVolumeMountText `json:"text"`
- CephFS *ContainerVolumeMountCephFS `json:"ceph_fs"`
- // Mounted read-only if true, read-write otherwise (false or unspecified).
- ReadOnly bool `json:"read_only"`
- // Path within the container at which the volume should be mounted. Must
- // not contain ':'.
- MountPath string `json:"mount_path"`
- // If set, the mount needs SELinux relabeling.
- SelinuxRelabel bool `json:"selinux_relabel,omitempty"`
- // Requested propagation mode.
- Propagation ContainerMountPropagation `json:"propagation,omitempty"`
- // Owner permissions
- FsUser *int64 `json:"fs_user,omitempty"`
- FsGroup *int64 `json:"fs_group,omitempty"`
- }
- type ContainerOverlayDiskImage struct {
- DiskId string `json:"disk_id"`
- ImageId string `json:"image_id"`
- }
- type ContainerDiskOverlayType string
- const (
- CONTAINER_DISK_OVERLAY_TYPE_DIRECTORY ContainerDiskOverlayType = "directory"
- CONTAINER_DISK_OVERLAY_TYPE_DISK_IMAGE ContainerDiskOverlayType = "disk_image"
- CONTAINER_DISK_OVERLAY_TYPE_UNKNOWN ContainerDiskOverlayType = "unknown"
- )
- type ContainerVolumeMountDiskOverlay struct {
- LowerDir []string `json:"lower_dir"`
- UseDiskImage bool `json:"use_disk_image"`
- }
- func (o ContainerVolumeMountDiskOverlay) GetType() ContainerDiskOverlayType {
- if len(o.LowerDir) != 0 {
- return CONTAINER_DISK_OVERLAY_TYPE_DIRECTORY
- }
- if o.UseDiskImage {
- return CONTAINER_DISK_OVERLAY_TYPE_DISK_IMAGE
- }
- return CONTAINER_DISK_OVERLAY_TYPE_UNKNOWN
- }
- func (o ContainerVolumeMountDiskOverlay) IsValid() error {
- if o.GetType() == CONTAINER_DISK_OVERLAY_TYPE_UNKNOWN {
- return errors.ErrNotSupported
- }
- return nil
- }
- type HostLowerPath struct {
- PrePath string `json:"pre_path"`
- PostPath string `json:"post_path"`
- }
- type ContainerVolumeMountDiskPostImageOverlay struct {
- Id string `json:"id"`
- PathMap map[string]string `json:"path_map"`
- // 宿主机底层目录映射, key 为 PathMap 的 key,value 为 overlay lower 格式,多目录以 ":" 分隔
- HostLowerMap map[string]*HostLowerPath `json:"host_lower_map"`
- UpperConfig *PostOverlayUpperConfig `json:"upper_config"`
- }
- type PostOverlayUpperConfigType string
- const (
- PostOverlayUpperConfigTypeDisk PostOverlayUpperConfigType = "disk"
- )
- type PostOverlayUpperConfigDisk struct {
- SubPath string `json:"sub_path"`
- }
- type PostOverlayUpperConfig struct {
- Type PostOverlayUpperConfigType `json:"type"`
- Disk *PostOverlayUpperConfigDisk `json:"disk"`
- }
- type ContainerVolumeMountDiskPostImageOverlayUnpacker ContainerVolumeMountDiskPostImageOverlay
- func (ov *ContainerVolumeMountDiskPostImageOverlay) UnmarshalJSON(data []byte) error {
- nov := new(ContainerVolumeMountDiskPostImageOverlayUnpacker)
- if err := json.Unmarshal(data, nov); err != nil {
- return err
- }
- ov.Id = nov.Id
- // 防止 PathMap 被合并,总是用 Unarmshal data 里面的 path_map
- ov.PathMap = nov.PathMap
- ov.HostLowerMap = nov.HostLowerMap
- ov.UpperConfig = nov.UpperConfig
- return nil
- }
- type ContainerVolumeMountDiskPostOverlayType string
- const (
- CONTAINER_VOLUME_MOUNT_DISK_POST_OVERLAY_HOSTPATH ContainerVolumeMountDiskPostOverlayType = "host_path"
- CONTAINER_VOLUME_MOUNT_DISK_POST_OVERLAY_IMAGE ContainerVolumeMountDiskPostOverlayType = "image"
- )
- type ContainerVolumeMountDiskPostOverlay struct {
- // 宿主机底层目录
- HostLowerDir []string `json:"host_lower_dir"`
- // 宿主机上层目录
- HostUpperDir string `json:"host_upper_dir"`
- // 合并后要挂载到容器的目录
- ContainerTargetDir string `json:"container_target_dir"`
- Image *ContainerVolumeMountDiskPostImageOverlay `json:"image"`
- FsUser *int64 `json:"fs_user,omitempty"`
- FsGroup *int64 `json:"fs_group,omitempty"`
- FlattenLayers bool `json:"flatten_layers"`
- }
- func (o ContainerVolumeMountDiskPostOverlay) IsEqual(input ContainerVolumeMountDiskPostOverlay) bool {
- if o.GetType() != input.GetType() {
- return false
- }
- switch o.GetType() {
- case CONTAINER_VOLUME_MOUNT_DISK_POST_OVERLAY_HOSTPATH:
- return o.ContainerTargetDir == input.ContainerTargetDir
- case CONTAINER_VOLUME_MOUNT_DISK_POST_OVERLAY_IMAGE:
- return o.Image.Id == input.Image.Id
- }
- return false
- }
- func (o ContainerVolumeMountDiskPostOverlay) GetType() ContainerVolumeMountDiskPostOverlayType {
- if o.Image != nil {
- return CONTAINER_VOLUME_MOUNT_DISK_POST_OVERLAY_IMAGE
- }
- return CONTAINER_VOLUME_MOUNT_DISK_POST_OVERLAY_HOSTPATH
- }
- type ContainerVolumeMountDisk struct {
- Index *int `json:"index,omitempty"`
- Id string `json:"id"`
- SubDirectory string `json:"sub_directory"`
- StorageSizeFile string `json:"storage_size_file"`
- // lower overlay 设置,disk 的 volume 会作为 upper,最终 merged 的目录会传给容器
- Overlay *ContainerVolumeMountDiskOverlay `json:"overlay"`
- // case insensitive feature is incompatible with overlayfs
- CaseInsensitivePaths []string `json:"case_insensitive_paths"`
- // 当 disk volume 挂载完后,需要 overlay 的目录设置
- PostOverlay []*ContainerVolumeMountDiskPostOverlay `json:"post_overlay"`
- // The ext2 filesystem reserves a certain percentage of the available space (by default 5%, see mke2fs(8) and tune2fs(8)). These options determine who can use the reserved blocks. (Roughly: whoever has the specified uid, or belongs to the specified group.)
- ResGid int `json:"res_gid"`
- ResUid int `json:"res_uid"`
- }
- type ContainerVolumeMountHostPathType string
- const (
- CONTAINER_VOLUME_MOUNT_HOST_PATH_TYPE_DIRECTORY ContainerVolumeMountHostPathType = "directory"
- CONTAINER_VOLUME_MOUNT_HOST_PATH_TYPE_FILE ContainerVolumeMountHostPathType = "file"
- )
- type ContainerVolumeMountHostPathAutoCreateConfig struct {
- Uid uint `json:"uid"`
- Gid uint `json:"gid"`
- Permissions string `json:"permissions"`
- }
- type ContainerVolumeMountHostPath struct {
- Type ContainerVolumeMountHostPathType `json:"type"`
- Path string `json:"path"`
- AutoCreate bool `json:"auto_create"`
- AutoCreateConfig *ContainerVolumeMountHostPathAutoCreateConfig `json:"auto_create_config,omitempty"`
- }
- type ContainerVolumeMountText struct {
- Content string `json:"content"`
- }
- type ContainerVolumeMountCephFS struct {
- Id string `json:"id"`
- }
- type ContainerPullImageAuthConfig struct {
- Username string `json:"username,omitempty"`
- Password string `json:"password,omitempty"`
- Auth string `json:"auth,omitempty"`
- ServerAddress string `json:"server_address,omitempty"`
- // IdentityToken is used to authenticate the user and get
- // an access token for the registry.
- IdentityToken string `json:"identity_token,omitempty"`
- // RegistryToken is a bearer token to be sent to a registry
- RegistryToken string `json:"registry_token,omitempty"`
- }
- type ContainerRootfs struct {
- Type ContainerVolumeMountType `json:"type"`
- Disk *ContainerVolumeMountDisk `json:"disk"`
- //CephFS *ContainerVolumeMountCephFS `json:"ceph_fs"`
- // 是否持久化
- Persistent bool `json:"persistent"`
- }
|