github.com/alibaba/ilogtail/pkg@v0.0.0-20250526110833-c53b480d046c/helper/containercenter/cri_runtime_api_v1alpha2_adapter.go (about)

     1  // Copyright 2025 iLogtail Authors
     2  //
     3  // Licensed under the Apache License, Version 2.0 (the "License");
     4  // you may not use this file except in compliance with the License.
     5  // You may obtain a copy of the License at
     6  //
     7  //      http://www.apache.org/licenses/LICENSE-2.0
     8  //
     9  // Unless required by applicable law or agreed to in writing, software
    10  // distributed under the License is distributed on an "AS IS" BASIS,
    11  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    12  // See the License for the specific language governing permissions and
    13  // limitations under the License.
    14  
    15  package containercenter
    16  
    17  import (
    18  	"context"
    19  
    20  	"google.golang.org/grpc"
    21  	criv1alpha2 "k8s.io/cri-api/pkg/apis/runtime/v1alpha2"
    22  )
    23  
    24  type RuntimeServiceV1Alpha2Adapter struct {
    25  	client criv1alpha2.RuntimeServiceClient
    26  }
    27  
    28  func newCRIRuntimeServiceV1Alpha2Adapter(conn *grpc.ClientConn) *RuntimeServiceV1Alpha2Adapter {
    29  	return &RuntimeServiceV1Alpha2Adapter{client: criv1alpha2.NewRuntimeServiceClient(conn)}
    30  }
    31  
    32  func (a *RuntimeServiceV1Alpha2Adapter) Version(ctx context.Context) (*CriVersionResponse, error) {
    33  	resp, err := a.client.Version(ctx, &criv1alpha2.VersionRequest{})
    34  	if err != nil {
    35  		return &CriVersionResponse{}, err
    36  	}
    37  	return &CriVersionResponse{
    38  		resp.Version,
    39  		resp.RuntimeName,
    40  		resp.RuntimeVersion,
    41  		resp.RuntimeApiVersion,
    42  	}, nil
    43  }
    44  
    45  func (a *RuntimeServiceV1Alpha2Adapter) ListContainers(ctx context.Context) (*CriListContainersResponse, error) {
    46  	resp, err := a.client.ListContainers(ctx, &criv1alpha2.ListContainersRequest{})
    47  	if err != nil {
    48  		return &CriListContainersResponse{}, err
    49  	}
    50  
    51  	containers := make([]*CriContainer, 0, len(resp.Containers))
    52  	for _, rawContainer := range resp.Containers {
    53  		container := &CriContainer{
    54  			ID:           rawContainer.Id,
    55  			PodSandboxID: rawContainer.PodSandboxId,
    56  			Metadata:     &CriContainerMetadata{},
    57  			Image:        &CriImageSpec{},
    58  			ImageRef:     rawContainer.ImageRef,
    59  			State:        CriContainerState(rawContainer.State),
    60  			CreatedAt:    rawContainer.CreatedAt,
    61  			Labels:       rawContainer.Labels,
    62  			Annotations:  rawContainer.Annotations,
    63  		}
    64  		if rawContainer.Image != nil {
    65  			container.Image.Image = rawContainer.Image.Image
    66  			container.Image.Annotations = rawContainer.Image.Annotations
    67  		}
    68  		if rawContainer.Metadata != nil {
    69  			container.Metadata.Name = rawContainer.Metadata.Name
    70  			container.Metadata.Attempt = rawContainer.Metadata.Attempt
    71  		}
    72  		containers = append(containers, container)
    73  	}
    74  
    75  	return &CriListContainersResponse{
    76  		Containers: containers,
    77  	}, nil
    78  }
    79  
    80  func (a *RuntimeServiceV1Alpha2Adapter) ContainerStatus(ctx context.Context, containerID string, verbose bool) (*CriContainerStatusResponse, error) {
    81  	rawStatus, err := a.client.ContainerStatus(ctx, &criv1alpha2.ContainerStatusRequest{
    82  		ContainerId: containerID,
    83  		Verbose:     verbose,
    84  	})
    85  	if err != nil {
    86  		return &CriContainerStatusResponse{}, err
    87  	}
    88  
    89  	status := &CriContainerStatus{}
    90  	if rawStatus.Status != nil {
    91  		status.ID = rawStatus.Status.Id
    92  		status.Metadata = &CriContainerMetadata{}
    93  		if rawStatus.Status.Metadata != nil {
    94  			status.Metadata.Name = rawStatus.Status.Metadata.Name
    95  			status.Metadata.Attempt = rawStatus.Status.Metadata.Attempt
    96  		}
    97  		status.State = CriContainerState(rawStatus.Status.State)
    98  		status.CreatedAt = rawStatus.Status.CreatedAt
    99  		status.StartedAt = rawStatus.Status.StartedAt
   100  		status.FinishedAt = rawStatus.Status.FinishedAt
   101  		status.ExitCode = rawStatus.Status.ExitCode
   102  		status.Image = &CriImageSpec{}
   103  		if rawStatus.Status.Image != nil {
   104  			status.Image.Image = rawStatus.Status.Image.Image
   105  			status.Image.Annotations = rawStatus.Status.Image.Annotations
   106  		}
   107  		status.ImageRef = rawStatus.Status.ImageRef
   108  		status.Reason = rawStatus.Status.Reason
   109  		status.Message = rawStatus.Status.Message
   110  		status.Labels = rawStatus.Status.Labels
   111  		status.Annotations = rawStatus.Status.Annotations
   112  		status.Mounts = []*CriMount{}
   113  		if rawStatus.Status.Mounts != nil {
   114  			for _, rawMount := range rawStatus.Status.Mounts {
   115  				status.Mounts = append(status.Mounts, &CriMount{
   116  					ContainerPath:  rawMount.ContainerPath,
   117  					HostPath:       rawMount.HostPath,
   118  					Readonly:       rawMount.Readonly,
   119  					SelinuxRelabel: rawMount.SelinuxRelabel,
   120  					Propagation:    CriMountPropagation(rawMount.Propagation),
   121  				})
   122  			}
   123  		}
   124  		status.LogPath = rawStatus.Status.LogPath
   125  	}
   126  
   127  	return &CriContainerStatusResponse{
   128  		Status: status,
   129  		Info:   rawStatus.Info,
   130  	}, nil
   131  }
   132  
   133  func (a *RuntimeServiceV1Alpha2Adapter) ListPodSandbox(ctx context.Context) (*CriListPodSandboxResponse, error) {
   134  	resp, err := a.client.ListPodSandbox(ctx, &criv1alpha2.ListPodSandboxRequest{})
   135  	if err != nil {
   136  		return &CriListPodSandboxResponse{}, err
   137  	}
   138  
   139  	sandboxs := make([]*CriPodSandbox, 0, len(resp.Items))
   140  	if resp.Items != nil {
   141  		for _, rawSandbox := range resp.Items {
   142  			sandbox := &CriPodSandbox{
   143  				ID:             rawSandbox.Id,
   144  				Metadata:       &CriPodSandboxMetadata{},
   145  				State:          CriContainerState(rawSandbox.State),
   146  				CreatedAt:      rawSandbox.CreatedAt,
   147  				Labels:         rawSandbox.Labels,
   148  				Annotations:    rawSandbox.Annotations,
   149  				RuntimeHandler: rawSandbox.RuntimeHandler,
   150  			}
   151  			if rawSandbox.Metadata != nil {
   152  				sandbox.Metadata.Name = rawSandbox.Metadata.Name
   153  				sandbox.Metadata.Attempt = rawSandbox.Metadata.Attempt
   154  			}
   155  			sandboxs = append(sandboxs, sandbox)
   156  		}
   157  	}
   158  
   159  	return &CriListPodSandboxResponse{
   160  		Items: sandboxs,
   161  	}, nil
   162  }
   163  
   164  func (a *RuntimeServiceV1Alpha2Adapter) PodSandboxStatus(ctx context.Context, sandboxID string, verbose bool) (*CriPodSandboxStatusResponse, error) {
   165  	rawStatus, err := a.client.PodSandboxStatus(ctx, &criv1alpha2.PodSandboxStatusRequest{
   166  		PodSandboxId: sandboxID,
   167  		Verbose:      verbose,
   168  	})
   169  	if err != nil {
   170  		return &CriPodSandboxStatusResponse{}, err
   171  	}
   172  
   173  	status := &CriPodSandboxStatus{}
   174  	if rawStatus.Status != nil {
   175  		status.ID = rawStatus.Status.Id
   176  		status.Metadata = &CriPodSandboxMetadata{}
   177  		if rawStatus.Status.Metadata != nil {
   178  			status.Metadata.Name = rawStatus.Status.Metadata.Name
   179  			status.Metadata.UID = rawStatus.Status.Metadata.Uid
   180  			status.Metadata.Namespace = rawStatus.Status.Metadata.Namespace
   181  			status.Metadata.Attempt = rawStatus.Status.Metadata.Attempt
   182  		}
   183  		status.State = CriContainerState(rawStatus.Status.State)
   184  		status.CreatedAt = rawStatus.Status.CreatedAt
   185  		status.Labels = rawStatus.Status.Labels
   186  		status.Annotations = rawStatus.Status.Annotations
   187  		status.RuntimeHandler = rawStatus.Status.RuntimeHandler
   188  	}
   189  
   190  	return &CriPodSandboxStatusResponse{
   191  		Status: status,
   192  		Info:   rawStatus.Info,
   193  	}, nil
   194  }