Skip to content

Commit 02e7137

Browse files
committed
add clean pod interface
1 parent 3309beb commit 02e7137

File tree

7 files changed

+592
-372
lines changed

7 files changed

+592
-372
lines changed

cluster/calcium/meta.go

+34
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,10 @@ package calcium
55

66
import (
77
"context"
8+
"sync"
89

10+
enginetypes "github.com/docker/docker/api/types"
11+
"github.com/docker/docker/api/types/filters"
912
"github.com/projecteru2/core/types"
1013
log "github.com/sirupsen/logrus"
1114
)
@@ -25,6 +28,37 @@ func (c *Calcium) RemovePod(ctx context.Context, podname string) error {
2528
return c.store.RemovePod(ctx, podname)
2629
}
2730

31+
// CleanPod clean pod images
32+
func (c *Calcium) CleanPod(ctx context.Context, podname string, prune bool, images []string) error {
33+
nodes, err := c.store.GetNodesByPod(ctx, podname)
34+
if err != nil {
35+
log.Debugf("[CleanPod] Error during GetNodesByPod %s %v", podname, err)
36+
return err
37+
}
38+
wg := sync.WaitGroup{}
39+
for _, node := range nodes {
40+
wg.Add(1)
41+
go func(node *types.Node) {
42+
defer wg.Done()
43+
for _, image := range images {
44+
if _, err := node.Engine.ImageRemove(ctx, image, enginetypes.ImageRemoveOptions{PruneChildren: true}); err != nil {
45+
log.Infof("[CleanPod] Clean %s pod %s node %s image", podname, node.Name, image)
46+
} else {
47+
log.Errorf("[CleanPod] Clean %s pod %s node %s image failed: %v", podname, node.Name, image, err)
48+
}
49+
}
50+
if prune {
51+
_, err := node.Engine.ImagesPrune(ctx, filters.NewArgs())
52+
if err != nil {
53+
log.Errorf("[CleanPod] Prune %s pod %s node failed: %v", podname, node.Name, err)
54+
}
55+
}
56+
}(node)
57+
}
58+
wg.Wait()
59+
return nil
60+
}
61+
2862
// RemoveNode remove a node
2963
func (c *Calcium) RemoveNode(ctx context.Context, nodename, podname string) (*types.Pod, error) {
3064
n, err := c.GetNode(ctx, podname, nodename)

cluster/cluster.go

+1
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ type Cluster interface {
3232
AddPod(ctx context.Context, podname, favor, desc string) (*types.Pod, error)
3333
AddNode(ctx context.Context, nodename, endpoint, podname, ca, cert, key string, cpu, share int, memory int64, labels map[string]string) (*types.Node, error)
3434
RemovePod(ctx context.Context, podname string) error
35+
CleanPod(ctx context.Context, podname string, prune bool, images []string) error
3536
RemoveNode(ctx context.Context, nodename, podname string) (*types.Pod, error)
3637
ListPods(ctx context.Context) ([]*types.Pod, error)
3738
ListPodNodes(ctx context.Context, podname string, all bool) ([]*types.Node, error)

rpc/gen/core.pb.go

+308-218
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

rpc/gen/core.proto

+7
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ service CoreRPC {
77
rpc AddPod(AddPodOptions) returns (Pod) {};
88
rpc RemovePod(RemovePodOptions) returns (Empty) {};
99
rpc GetPod(GetPodOptions) returns (Pod) {};
10+
rpc CleanPod(CleanPodOptions) returns (Empty) {};
1011

1112
rpc AddNode(AddNodeOptions) returns (Node) {};
1213
rpc RemoveNode(RemoveNodeOptions) returns (Pod) {};
@@ -34,6 +35,12 @@ service CoreRPC {
3435

3536
message Empty {}
3637

38+
message CleanPodOptions {
39+
string podname = 1;
40+
bool prune = 2;
41+
repeated string images = 3;
42+
}
43+
3744
message DeployStatusOptions {
3845
string appname = 1;
3946
string entrypoint = 2;

rpc/gen/core_pb2.py

+216-154
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

rpc/gen/core_pb2_grpc.py

+17
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,11 @@ def __init__(self, channel):
3434
request_serializer=core__pb2.GetPodOptions.SerializeToString,
3535
response_deserializer=core__pb2.Pod.FromString,
3636
)
37+
self.CleanPod = channel.unary_unary(
38+
'/pb.CoreRPC/CleanPod',
39+
request_serializer=core__pb2.CleanPodOptions.SerializeToString,
40+
response_deserializer=core__pb2.Empty.FromString,
41+
)
3742
self.AddNode = channel.unary_unary(
3843
'/pb.CoreRPC/AddNode',
3944
request_serializer=core__pb2.AddNodeOptions.SerializeToString,
@@ -173,6 +178,13 @@ def GetPod(self, request, context):
173178
context.set_details('Method not implemented!')
174179
raise NotImplementedError('Method not implemented!')
175180

181+
def CleanPod(self, request, context):
182+
# missing associated documentation comment in .proto file
183+
pass
184+
context.set_code(grpc.StatusCode.UNIMPLEMENTED)
185+
context.set_details('Method not implemented!')
186+
raise NotImplementedError('Method not implemented!')
187+
176188
def AddNode(self, request, context):
177189
# missing associated documentation comment in .proto file
178190
pass
@@ -343,6 +355,11 @@ def add_CoreRPCServicer_to_server(servicer, server):
343355
request_deserializer=core__pb2.GetPodOptions.FromString,
344356
response_serializer=core__pb2.Pod.SerializeToString,
345357
),
358+
'CleanPod': grpc.unary_unary_rpc_method_handler(
359+
servicer.CleanPod,
360+
request_deserializer=core__pb2.CleanPodOptions.FromString,
361+
response_serializer=core__pb2.Empty.SerializeToString,
362+
),
346363
'AddNode': grpc.unary_unary_rpc_method_handler(
347364
servicer.AddNode,
348365
request_deserializer=core__pb2.AddNodeOptions.FromString,

rpc/rpc.go

+9
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,15 @@ func (v *Vibranium) GetPod(ctx context.Context, opts *pb.GetPodOptions) (*pb.Pod
150150
return toRPCPod(p), nil
151151
}
152152

153+
// CleanPod clean pod images
154+
func (v *Vibranium) CleanPod(ctx context.Context, opts *pb.CleanPodOptions) (*pb.Empty, error) {
155+
err := v.cluster.CleanPod(ctx, opts.Podname, opts.Prune, opts.Images)
156+
if err != nil {
157+
return nil, err
158+
}
159+
return &pb.Empty{}, nil
160+
}
161+
153162
// GetNode get a node
154163
func (v *Vibranium) GetNode(ctx context.Context, opts *pb.GetNodeOptions) (*pb.Node, error) {
155164
n, err := v.cluster.GetNode(ctx, opts.Podname, opts.Nodename)

0 commit comments

Comments
 (0)