diff --git a/model/plugin.go b/model/plugin.go index 1060345..35af26d 100644 --- a/model/plugin.go +++ b/model/plugin.go @@ -24,6 +24,7 @@ type PluginInstanceDefinition struct { PrecheckContainers []ContainerDefinition `yaml:"precheck_containers,omitempty"` InitContainers []ContainerDefinition `yaml:"init_containers,omitempty"` Containers []ContainerDefinition `yaml:"containers"` + PostContainers []ContainerDefinition `yaml:"post_containers,omitempty"` CleanContainers []ContainerDefinition `yaml:"clean_containers,omitempty"` } diff --git a/plugin/executor.go b/plugin/executor.go index 60caea7..acd41cb 100644 --- a/plugin/executor.go +++ b/plugin/executor.go @@ -134,20 +134,22 @@ func (w *executor) Precheck(ctx context.Context) error { // Apply installs plugin to containerd, perform the following steps: // 1. config container runtime. -// 2. upload init_containers and containers required images to containerd. +// 2. upload required images to containerd. // 3. remove all containers in the containerd namespace. // 4. start and wait init_containers, kill the container after timeout. // 5. start and run containers. // 6. wait for all containers ready. // 7. setup container logging config. -// 8. remove unused images from containerd. +// 8. setup container metrics config. +// 9. start and wait post_containers, kill the container after timeout. +// 10. remove unused images from containerd. func (w *executor) Apply(ctx context.Context) error { err := w.configContainerRuntime(ctx) if err != nil { return fmt.Errorf("config container runtime: %s", err) } - err = w.uploadContainerImages(ctx, append(w.instance.InitContainers, w.instance.Containers...)...) + err = w.uploadContainerImages(ctx, append(append(w.instance.InitContainers, w.instance.Containers...), w.instance.PostContainers...)...) if err != nil { return fmt.Errorf("upload container images: %s", err) } @@ -182,6 +184,11 @@ func (w *executor) Apply(ctx context.Context) error { return fmt.Errorf("setup metrics: %s", err) } + err = w.runAndWaitContainers(ctx, w.instance.PostContainers...) + if err != nil { + return fmt.Errorf("start post containers: %s", err) + } + err = w.removeUnusedImages(ctx, w.instance.Containers...) if err != nil { return fmt.Errorf("remove unused images: %s", err) diff --git a/plugin/executor_test.go b/plugin/executor_test.go index a65dbf7..93029d0 100644 --- a/plugin/executor_test.go +++ b/plugin/executor_test.go @@ -78,6 +78,10 @@ func TestHostPluginExecutorApply(t *testing.T) { newContainerDefinition(rand.String(10), rand.String(10)), newContainerDefinition(rand.String(10), rand.String(10)), }, + PostContainers: []model.ContainerDefinition{ + newContainerDefinition(rand.String(10), rand.String(10)), + newContainerDefinition(rand.String(10), rand.String(10)), + }, }) t.Run("should create containers and remove unused containers", func(t *testing.T) {