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  }