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 }