github.com/Mirantis/virtlet@v1.5.2-0.20191204181327-1659b8a48e9b/pkg/manager/cri.go (about) 1 /* 2 Copyright 2018 Mirantis 3 4 Licensed under the Apache License, Version 2.0 (the "License"); 5 you may not use this file except in compliance with the License. 6 You may obtain a copy of the License at 7 8 http://www.apache.org/licenses/LICENSE-2.0 9 10 Unless required by applicable law or agreed to in writing, software 11 distributed under the License is distributed on an "AS IS" BASIS, 12 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 See the License for the specific language governing permissions and 14 limitations under the License. 15 */ 16 17 package manager 18 19 import ( 20 "errors" 21 "fmt" 22 "path/filepath" 23 24 kubeapi "k8s.io/kubernetes/pkg/kubelet/apis/cri/runtime/v1alpha2" 25 26 "github.com/Mirantis/virtlet/pkg/metadata/types" 27 "github.com/Mirantis/virtlet/pkg/network" 28 ) 29 30 func podSandboxMetadata(in *types.PodSandboxInfo) *kubeapi.PodSandboxMetadata { 31 return &kubeapi.PodSandboxMetadata{ 32 Name: in.Config.Name, 33 Uid: in.PodID, 34 Namespace: in.Config.Namespace, 35 Attempt: in.Config.Attempt, 36 } 37 } 38 39 // PodSandboxInfoToCRIPodSandboxStatus converts PodSandboxInfo to CRI PodSandboxStatus. 40 func PodSandboxInfoToCRIPodSandboxStatus(in *types.PodSandboxInfo) *kubeapi.PodSandboxStatus { 41 return &kubeapi.PodSandboxStatus{ 42 Id: in.PodID, 43 Metadata: podSandboxMetadata(in), 44 State: kubeapi.PodSandboxState(in.State), 45 CreatedAt: in.CreatedAt, 46 Linux: &kubeapi.LinuxPodSandboxStatus{ 47 Namespaces: &kubeapi.Namespace{ 48 // pod namespace for net / pid / ipc 49 Options: &kubeapi.NamespaceOption{}, 50 }, 51 }, 52 Labels: in.Config.Labels, 53 Annotations: in.Config.Annotations, 54 } 55 } 56 57 // PodSandboxInfoToCRIPodSandbox converts PodSandboxInfo to CRI PodSandbox. 58 func PodSandboxInfoToCRIPodSandbox(in *types.PodSandboxInfo) *kubeapi.PodSandbox { 59 return &kubeapi.PodSandbox{ 60 Id: in.PodID, 61 Metadata: podSandboxMetadata(in), 62 State: kubeapi.PodSandboxState(in.State), 63 CreatedAt: in.CreatedAt, 64 Labels: in.Config.Labels, 65 Annotations: in.Config.Annotations, 66 } 67 } 68 69 // CRIPodSandboxConfigToPodSandboxConfig converts CRI PodSandboxConfig to PodSandboxConfig. 70 func CRIPodSandboxConfigToPodSandboxConfig(in *kubeapi.PodSandboxConfig) *types.PodSandboxConfig { 71 meta := in.GetMetadata() 72 var portMappings []*types.PortMapping 73 for _, pm := range in.GetPortMappings() { 74 portMappings = append(portMappings, &types.PortMapping{ 75 Protocol: types.Protocol(pm.Protocol), 76 ContainerPort: pm.ContainerPort, 77 HostPort: pm.HostPort, 78 HostIp: pm.HostIp, 79 }) 80 } 81 return &types.PodSandboxConfig{ 82 Name: meta.GetName(), 83 Uid: meta.GetUid(), 84 Namespace: meta.GetNamespace(), 85 Attempt: meta.GetAttempt(), 86 Hostname: in.GetHostname(), 87 LogDirectory: in.GetLogDirectory(), 88 DnsConfig: &types.DNSConfig{ 89 Servers: in.GetDnsConfig().GetServers(), 90 Searches: in.GetDnsConfig().GetSearches(), 91 Options: in.GetDnsConfig().GetOptions(), 92 }, 93 PortMappings: portMappings, 94 Labels: in.GetLabels(), 95 Annotations: in.GetAnnotations(), 96 CgroupParent: in.GetLinux().GetCgroupParent(), 97 } 98 } 99 100 // CRIPodSandboxFilterToPodSandboxFilter converts CRI PodSandboxFilter to PodSandboxFilter. 101 func CRIPodSandboxFilterToPodSandboxFilter(in *kubeapi.PodSandboxFilter) *types.PodSandboxFilter { 102 if in == nil { 103 return nil 104 } 105 var state *types.PodSandboxState 106 if in.State != nil { 107 state = (*types.PodSandboxState)(&in.State.State) 108 } 109 return &types.PodSandboxFilter{ 110 Id: in.Id, 111 State: state, 112 LabelSelector: in.LabelSelector, 113 } 114 } 115 116 // GetVMConfig translates CRI CreateContainerRequest and CNI info to a VMConfig. 117 func GetVMConfig(in *kubeapi.CreateContainerRequest, csn *network.ContainerSideNetwork) (*types.VMConfig, error) { 118 if in.Config == nil || in.Config.Metadata == nil || in.Config.Metadata.Name == "" || in.Config.Image == nil || in.SandboxConfig == nil || in.SandboxConfig.Metadata == nil { 119 return nil, errors.New("invalid input data") 120 } 121 122 // Note that the fallbacks used belog for log dir & path 123 // shouldn't actually be used for real kubelet. 124 logDir := in.SandboxConfig.LogDirectory 125 if logDir == "" { 126 logDir = fmt.Sprintf("/var/log/pods/%s", in.PodSandboxId) 127 } 128 129 logPath := in.Config.LogPath 130 if logPath == "" { 131 logPath = fmt.Sprintf("%s_%d.log", in.Config.Metadata.Name, in.Config.Metadata.Attempt) 132 } 133 r := &types.VMConfig{ 134 PodSandboxID: in.PodSandboxId, 135 PodName: in.SandboxConfig.Metadata.Name, 136 PodNamespace: in.SandboxConfig.Metadata.Namespace, 137 Name: in.Config.Metadata.Name, 138 Image: in.Config.Image.Image, 139 Attempt: in.Config.Metadata.Attempt, 140 PodAnnotations: in.SandboxConfig.Annotations, 141 ContainerAnnotations: in.Config.Annotations, 142 ContainerLabels: in.Config.Labels, 143 ContainerSideNetwork: csn, 144 LogDirectory: logDir, 145 LogPath: logPath, 146 } 147 148 if linuxCfg := in.Config.Linux; linuxCfg != nil && linuxCfg.Resources != nil { 149 res := linuxCfg.Resources 150 r.MemoryLimitInBytes = res.MemoryLimitInBytes 151 r.CPUShares = res.CpuShares 152 r.CPUPeriod = res.CpuPeriod 153 r.CPUQuota = res.CpuQuota 154 } 155 156 for _, entry := range in.Config.Envs { 157 r.Environment = append(r.Environment, types.VMKeyValue{Key: entry.Key, Value: entry.Value}) 158 } 159 160 for _, mount := range in.Config.Mounts { 161 r.Mounts = append(r.Mounts, types.VMMount{ 162 ContainerPath: mount.ContainerPath, 163 HostPath: mount.HostPath, 164 Readonly: mount.Readonly, 165 }) 166 } 167 168 for _, dev := range in.Config.Devices { 169 r.VolumeDevices = append(r.VolumeDevices, types.VMVolumeDevice{ 170 DevicePath: dev.ContainerPath, 171 HostPath: dev.HostPath, 172 }) 173 } 174 175 return r, nil 176 } 177 178 // CRIContainerFilterToContainerFilter converts CRI ContainerFilter to ContainerFilter. 179 func CRIContainerFilterToContainerFilter(in *kubeapi.ContainerFilter) *types.ContainerFilter { 180 if in == nil { 181 return nil 182 } 183 var state *types.ContainerState 184 if in.State != nil { 185 state = (*types.ContainerState)(&in.State.State) 186 } 187 return &types.ContainerFilter{ 188 Id: in.Id, 189 State: state, 190 PodSandboxID: in.PodSandboxId, 191 LabelSelector: in.LabelSelector, 192 } 193 } 194 195 // CRIContainerStatsFilterToVMStatsFilter converts CRI ContainerStatsFilter to VMStatsFilter. 196 func CRIContainerStatsFilterToVMStatsFilter(in *kubeapi.ContainerStatsFilter) *types.VMStatsFilter { 197 if in == nil { 198 return nil 199 } 200 return &types.VMStatsFilter{ 201 Id: in.Id, 202 PodSandboxID: in.PodSandboxId, 203 LabelSelector: in.LabelSelector, 204 } 205 } 206 207 func containerMetadata(in *types.ContainerInfo) *kubeapi.ContainerMetadata { 208 return &kubeapi.ContainerMetadata{ 209 Name: in.Name, 210 Attempt: in.Config.Attempt, 211 } 212 } 213 214 // ContainerInfoToCRIContainer converts ContainerInfo to CRI Container 215 func ContainerInfoToCRIContainer(in *types.ContainerInfo) *kubeapi.Container { 216 return &kubeapi.Container{ 217 Id: in.Id, 218 PodSandboxId: in.Config.PodSandboxID, 219 Metadata: containerMetadata(in), 220 Image: &kubeapi.ImageSpec{Image: in.Config.Image}, 221 ImageRef: in.Config.Image, 222 State: kubeapi.ContainerState(in.State), 223 CreatedAt: in.CreatedAt, 224 Labels: in.Config.ContainerLabels, 225 Annotations: in.Config.ContainerAnnotations, 226 } 227 } 228 229 // ContainerInfoToCRIContainerStatus convers ContainerInfo to CRI ContainerStatus. 230 func ContainerInfoToCRIContainerStatus(in *types.ContainerInfo) *kubeapi.ContainerStatus { 231 var mounts []*kubeapi.Mount 232 for _, m := range in.Config.Mounts { 233 mounts = append(mounts, &kubeapi.Mount{ 234 ContainerPath: m.ContainerPath, 235 HostPath: m.HostPath, 236 Readonly: m.Readonly, 237 }) 238 } 239 return &kubeapi.ContainerStatus{ 240 Id: in.Id, 241 Metadata: containerMetadata(in), 242 Image: &kubeapi.ImageSpec{Image: in.Config.Image}, 243 ImageRef: in.Config.Image, 244 State: kubeapi.ContainerState(in.State), 245 CreatedAt: in.CreatedAt, 246 StartedAt: in.StartedAt, 247 Labels: in.Config.ContainerLabels, 248 Annotations: in.Config.ContainerAnnotations, 249 Mounts: mounts, 250 LogPath: filepath.Join(in.Config.LogDirectory, in.Config.LogPath), 251 // TODO: FinishedAt, Reason, Message 252 } 253 }