package events import ( "context" "time" "github.com/containerd/containerd/containers" "edge-infra.dev/pkg/sds/devices/class" dsv1 "edge-infra.dev/pkg/sds/devices/k8s/apis/v1" plugins "edge-infra.dev/pkg/sds/devices/k8s/device-plugins" "edge-infra.dev/pkg/sds/devices/logger" ) // ClassEventConstructor returns a constructor function that instantiates a new device class event from a modified/deleted class func ClassEventConstructor(servers map[string]plugins.Plugin, deviceClasses map[string]*dsv1.DeviceClass, allContainers map[string]*containers.Container) func(ctx context.Context, deviceClass *dsv1.DeviceClass) DeviceEvent { return func(ctx context.Context, deviceClass *dsv1.DeviceClass) DeviceEvent { log := logger.FromContext(ctx) name := deviceClass.ClassName() if deviceClass.Annotations[dsv1.MarkDeletedAnn] == "true" { log.Info("device class was deleted", "class", name) servers[name].Stop() delete(servers, name) delete(deviceClasses, name) return newClassEvent(deviceClass.ClassName(), allContainers) } log.Info("device class was modified", "class", name) deviceClasses[name] = deviceClass return newClassEvent(deviceClass.ClassName(), allContainers) } } // newClassEvent returns a new device event built from the changed class func newClassEvent(changedClass string, allContainers map[string]*containers.Container) DeviceEvent { event := &classEvent{ event: &event{ containers: map[string]*containers.Container{}, postHookFn: func(context.Context) {}, timestamp: time.Now(), }, } for _, ctr := range allContainers { if _, ok := ctr.Labels[changedClass]; ok { ctr.Labels[class.DefaultClass] = requested event.event.containers[ctr.ID] = ctr } } return event }