Skip to content

Commit ed63292

Browse files
authored
chore: update CRI client runtime version to v1 (test with multiple k8s versions) (#499)
* Update CRI client runtime version to v1 Signed-off-by: Peter Engelbert <[email protected]> * Refactor Signed-off-by: Peter Engelbert <[email protected]> * Restore log message Signed-off-by: Peter Engelbert <[email protected]> * Please the linter Signed-off-by: Peter Engelbert <[email protected]> * Add codegen check for CI Signed-off-by: Peter Engelbert <[email protected]> * Fix inaccurate label due to copy/paste Signed-off-by: Peter Engelbert <[email protected]> * Formatting Signed-off-by: Peter Engelbert <[email protected]> Signed-off-by: Peter Engelbert <[email protected]>
1 parent 0a823a8 commit ed63292

File tree

16 files changed

+434
-189
lines changed

16 files changed

+434
-189
lines changed

.github/workflows/test.yaml

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,28 @@ jobs:
125125
make manifests
126126
git diff --exit-code
127127
128+
check-codegen:
129+
name: "Check Codegen"
130+
runs-on: ubuntu-latest
131+
timeout-minutes: 5
132+
steps:
133+
- name: Harden Runner
134+
uses: step-security/harden-runner@2e205a28d0e1da00c5f53b161f4067b052c61f34
135+
with:
136+
egress-policy: audit
137+
- name: Check out code
138+
uses: actions/checkout@v3
139+
- name: Set up Go 1.19
140+
uses: actions/setup-go@v3
141+
with:
142+
go-version: 1.19
143+
- name: Check codegen
144+
run: |
145+
go mod tidy
146+
git diff --exit-code
147+
make generate
148+
git diff --exit-code
149+
128150
e2e-test:
129151
name: "E2E Tests"
130152
runs-on: ubuntu-latest

api/v1alpha1/zz_generated.deepcopy.go

Lines changed: 10 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pkg/collector/collector.go

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package main
22

33
import (
4-
"context"
54
"encoding/json"
65
"flag"
76
"fmt"
@@ -11,9 +10,9 @@ import (
1110
"os"
1211
"time"
1312

13+
"github.com/Azure/eraser/pkg/cri"
1414
"github.com/Azure/eraser/pkg/logger"
1515
"golang.org/x/sys/unix"
16-
pb "k8s.io/cri-api/pkg/apis/runtime/v1alpha2"
1716
logf "sigs.k8s.io/controller-runtime/pkg/log"
1817

1918
util "github.com/Azure/eraser/pkg/utils"
@@ -56,15 +55,12 @@ func main() {
5655
os.Exit(1)
5756
}
5857

59-
imageclient, conn, err := util.GetImageClient(context.Background(), socketPath)
58+
client, err := cri.NewCollectorClient(socketPath)
6059
if err != nil {
6160
log.Error(err, "failed to get image client")
6261
os.Exit(1)
6362
}
6463

65-
runTimeClient := pb.NewRuntimeServiceClient(conn)
66-
client := &client{imageclient, runTimeClient}
67-
6864
excluded, err = util.ParseExcluded()
6965
if os.IsNotExist(err) {
7066
log.Info("configmaps for exclusion do not exist")

pkg/collector/helpers.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,15 @@ import (
44
"context"
55

66
eraserv1alpha1 "github.com/Azure/eraser/api/v1alpha1"
7+
"github.com/Azure/eraser/pkg/cri"
78
util "github.com/Azure/eraser/pkg/utils"
89
)
910

10-
func getImages(c Client) ([]eraserv1alpha1.Image, error) {
11+
func getImages(c cri.Collector) ([]eraserv1alpha1.Image, error) {
1112
backgroundContext, cancel := context.WithTimeout(context.Background(), timeout)
1213
defer cancel()
1314

14-
images, err := c.listImages(backgroundContext)
15+
images, err := c.ListImages(backgroundContext)
1516
if err != nil {
1617
return nil, err
1718
}
@@ -40,7 +41,7 @@ func getImages(c Client) ([]eraserv1alpha1.Image, error) {
4041
idToImageMap[img.Id] = newImg
4142
}
4243

43-
containers, err := c.listContainers(backgroundContext)
44+
containers, err := c.ListContainers(backgroundContext)
4445
if err != nil {
4546
return nil, err
4647
}

pkg/collector/types.go

Lines changed: 0 additions & 28 deletions
This file was deleted.

pkg/cri/client.go

Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
package cri
2+
3+
import (
4+
"context"
5+
"fmt"
6+
7+
"github.com/Azure/eraser/pkg/utils"
8+
"google.golang.org/grpc"
9+
v1 "k8s.io/cri-api/pkg/apis/runtime/v1"
10+
v1alpha2 "k8s.io/cri-api/pkg/apis/runtime/v1alpha2"
11+
)
12+
13+
const (
14+
RuntimeV1 runtimeVersion = "v1"
15+
RuntimeV1Alpha2 runtimeVersion = "v1alpha2"
16+
)
17+
18+
type (
19+
Collector interface {
20+
ListImages(context.Context) ([]*v1.Image, error)
21+
ListContainers(context.Context) ([]*v1.Container, error)
22+
}
23+
24+
Eraser interface {
25+
Collector
26+
DeleteImage(context.Context, string) error
27+
}
28+
29+
runtimeTryFunc func(context.Context, *grpc.ClientConn) (string, error)
30+
)
31+
32+
func NewCollectorClient(socketPath string) (Collector, error) {
33+
return NewEraserClient(socketPath)
34+
}
35+
36+
func NewEraserClient(socketPath string) (Eraser, error) {
37+
ctx := context.Background()
38+
39+
conn, err := utils.GetConn(ctx, socketPath)
40+
if err != nil {
41+
return nil, err
42+
}
43+
44+
return newClientWithFallback(ctx, conn)
45+
}
46+
47+
func newClientWithFallback(ctx context.Context, conn *grpc.ClientConn) (Eraser, error) {
48+
errs := new(errors)
49+
funcs := []runtimeTryFunc{tryV1, tryV1Alpha2}
50+
51+
for _, f := range funcs {
52+
version, err := f(ctx, conn)
53+
if err != nil {
54+
errs.Append(err)
55+
continue
56+
}
57+
58+
client, err := getClientFromRuntimeVersion(conn, version)
59+
if err != nil {
60+
errs.Append(err)
61+
continue
62+
}
63+
64+
return client, nil
65+
}
66+
67+
return nil, errs
68+
}
69+
70+
func tryV1Alpha2(ctx context.Context, conn *grpc.ClientConn) (string, error) {
71+
runtimeClientV1Alpha2 := v1alpha2.NewRuntimeServiceClient(conn)
72+
req2 := v1alpha2.VersionRequest{}
73+
respv1Alpha2, err := runtimeClientV1Alpha2.Version(ctx, &req2)
74+
return respv1Alpha2.RuntimeApiVersion, err
75+
}
76+
77+
func tryV1(ctx context.Context, conn *grpc.ClientConn) (string, error) {
78+
runtimeClient := v1.NewRuntimeServiceClient(conn)
79+
req := v1.VersionRequest{}
80+
resp, err := runtimeClient.Version(ctx, &req)
81+
return resp.RuntimeApiVersion, err
82+
}
83+
84+
func getClientFromRuntimeVersion(conn *grpc.ClientConn, runtimeAPIVersion string) (Eraser, error) {
85+
switch runtimeAPIVersion {
86+
case string(RuntimeV1):
87+
imageClient := v1.NewImageServiceClient(conn)
88+
runtimeClient := v1.NewRuntimeServiceClient(conn)
89+
return &v1Client{
90+
images: imageClient,
91+
runtime: runtimeClient,
92+
}, nil
93+
case string(RuntimeV1Alpha2):
94+
runtimeClient := v1alpha2.NewRuntimeServiceClient(conn)
95+
imageClient := v1alpha2.NewImageServiceClient(conn)
96+
return &v1alpha2Client{
97+
images: imageClient,
98+
runtime: runtimeClient,
99+
}, nil
100+
}
101+
102+
return nil, fmt.Errorf("unrecognized CRI version: '%s'", runtimeAPIVersion)
103+
}

pkg/cri/client_v1.go

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
package cri
2+
3+
import (
4+
"context"
5+
6+
"google.golang.org/grpc/codes"
7+
"google.golang.org/grpc/status"
8+
v1 "k8s.io/cri-api/pkg/apis/runtime/v1"
9+
)
10+
11+
type (
12+
v1Client struct {
13+
images v1.ImageServiceClient
14+
runtime v1.RuntimeServiceClient
15+
}
16+
)
17+
18+
func (c *v1Client) ListContainers(ctx context.Context) (list []*v1.Container, err error) {
19+
resp, err := c.runtime.ListContainers(context.Background(), new(v1.ListContainersRequest))
20+
if err != nil {
21+
return nil, err
22+
}
23+
return resp.Containers, nil
24+
}
25+
26+
func (c *v1Client) ListImages(ctx context.Context) (list []*v1.Image, err error) {
27+
request := &v1.ListImagesRequest{Filter: nil}
28+
29+
resp, err := c.images.ListImages(ctx, request)
30+
if err != nil {
31+
return nil, err
32+
}
33+
34+
return resp.Images, nil
35+
}
36+
37+
func (c *v1Client) DeleteImage(ctx context.Context, image string) (err error) {
38+
if image == "" {
39+
return err
40+
}
41+
42+
request := &v1.RemoveImageRequest{Image: &v1.ImageSpec{Image: image}}
43+
44+
_, err = c.images.RemoveImage(ctx, request)
45+
if err != nil {
46+
if status.Code(err) == codes.NotFound {
47+
return nil
48+
}
49+
return err
50+
}
51+
52+
return nil
53+
}

0 commit comments

Comments
 (0)