diff --git a/cmd/prefetchfiles-nri-plugin/main.go b/cmd/prefetchfiles-nri-plugin/main.go index 62f4c356c1..bd79d3ae82 100644 --- a/cmd/prefetchfiles-nri-plugin/main.go +++ b/cmd/prefetchfiles-nri-plugin/main.go @@ -1,7 +1,7 @@ /* - * Copyright (c) 2023. Nydus Developers. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 +* Copyright (c) 2023. Nydus Developers. All rights reserved. +* +* SPDX-License-Identifier: Apache-2.0 */ package main @@ -26,30 +26,21 @@ import ( "github.com/containerd/nri/pkg/api" "github.com/containerd/nri/pkg/stub" - "github.com/containerd/nydus-snapshotter/pkg/fanotify" "github.com/containerd/nydus-snapshotter/version" - "github.com/pelletier/go-toml" ) const ( - defaultEvents = "RunPodSandbox" - defaultServerPath = "/usr/local/bin/optimizer-server" - defaultPersistDir = "/opt/nri/optimizer/results" + endpointPL = "/api/v1/daemons/prefetch" //////////todo + defaultEvents = "RunPodSandbox" + defaulthttp = "http://system.sock" + defaultsockaddr = "/run/containerd-nydus/system.sock" ) -type PluginConfig struct { - Events []string `toml:"events"` - ServerPath string `toml:"server_path"` - PersistDir string `toml:"persist_dir"` - Timeout int `toml:"timeout"` - Overwrite bool `toml:"overwrite"` -} - type PluginArgs struct { PluginName string PluginIdx string PluginEvents string - Config PluginConfig + Sockaddr string } type Flags struct { @@ -69,35 +60,18 @@ func buildFlags(args *PluginArgs) []cli.Flag { Usage: "plugin index to register to NRI", Destination: &args.PluginIdx, }, + &cli.StringFlag{ + Name: "sockaddr", + Value: defaultsockaddr, + Usage: "default unix domain socket address", + Destination: &args.Sockaddr, + }, &cli.StringFlag{ Name: "events", Value: defaultEvents, Usage: "the events that containerd subscribes to. DO NOT CHANGE THIS.", Destination: &args.PluginEvents, }, - &cli.StringFlag{ - Name: "server-path", - Value: defaultServerPath, - Usage: "the path of optimizer server binary", - Destination: &args.Config.ServerPath, - }, - &cli.StringFlag{ - Name: "persist-dir", - Value: defaultPersistDir, - Usage: "the directory to persist accessed files list for container", - Destination: &args.Config.PersistDir, - }, - &cli.IntFlag{ - Name: "timeout", - Value: 0, - Usage: "the timeout to kill optimizer server, 0 to disable it", - Destination: &args.Config.Timeout, - }, - &cli.BoolFlag{ - Name: "overwrite", - Usage: "whether to overwrite the existed persistent files", - Destination: &args.Config.Overwrite, - }, } } @@ -115,50 +89,24 @@ type plugin struct { } var ( - cfg PluginConfig - log *logrus.Logger - logWriter *syslog.Writer - globalFanotifyServer = make(map[string]*fanotify.Server) + globalsock string + log *logrus.Logger + logWriter *syslog.Writer ) -func (p *plugin) Configure(config, runtime, version string) (stub.EventMask, error) { - log.Infof("got configuration data: %q from runtime %s %s", config, runtime, version) - if config == "" { - return p.mask, nil - } - - tree, err := toml.Load(config) - if err != nil { - return 0, errors.Wrap(err, "parse TOML") - } - if err := tree.Unmarshal(&cfg); err != nil { - return 0, err - } - - p.mask, err = api.ParseEventMask(cfg.Events...) - if err != nil { - return 0, errors.Wrap(err, "parse events in configuration") - } - - log.Infof("configuration: %#v", cfg) - - return p.mask, nil -} - -func sendDataOverHTTP(data string, endpoint string) error { - url := "http://172.0.0.1:9110" + endpoint +func sendDataOverHTTP(data string, endpoint string, sock string) error { + url := defaulthttp + endpoint req, err := http.NewRequest("POST", url, bytes.NewBufferString(data)) if err != nil { return err } - conn, err := net.Dial("unix", "/run/containerd-nydus/system.sock") + conn, err := net.Dial("unix", sock) if err != nil { return err } defer conn.Close() - client := &http.Client{ Transport: &http.Transport{ DialContext: func(_ context.Context, _, _ string) (net.Conn, error) { @@ -174,35 +122,34 @@ func sendDataOverHTTP(data string, endpoint string) error { return nil } + func (p *plugin) RunPodSandbox(pod *api.PodSandbox) error { name := pod.Name parts := strings.Split(name, "-") name = parts[0] if pod.Annotations == nil { log.Printf("error: Pod annotations is nil") - return nil + return errors.New("Pod annotations is nil") } + prefetchList, ok := pod.Annotations["prefetch_list"] if !ok { errMsg := "Pod.yaml annotations don't have prefetch list." log.Printf("error: %s", errMsg) - return nil + return errors.New(errMsg) } + msg := fmt.Sprintf("%s : %s", name, prefetchList) - err := sendDataOverHTTP(msg, "/api/v1/daemons/prefetch") + err := sendDataOverHTTP(msg, endpointPL, globalsock) if err != nil { log.Printf("Failed to send data: %v\n", err) - } else { - log.Println("Data sent successfully") + return err } return nil } func (p *plugin) onClose() { - for _, fanotifyServer := range globalFanotifyServer { - fanotifyServer.StopServer() - } os.Exit(0) } @@ -210,8 +157,8 @@ func main() { flags := NewPluginFlags() app := &cli.App{ - Name: "optimizer-nri-plugin", - Usage: "Optimizer client for NRI plugin to manage optimizer server", + Name: "prefetchfiles-nri-plugin", + Usage: "NRI plugin for obtaining and transmitting prefetch files path", Version: version.Version, Flags: flags.F, HideVersion: true, @@ -221,13 +168,14 @@ func main() { err error ) - cfg = flags.Args.Config + flags.Args.Sockaddr = c.String("sockaddr") + globalsock = flags.Args.Sockaddr log = logrus.StandardLogger() log.SetFormatter(&logrus.TextFormatter{ PadLevelText: true, }) - logWriter, err = syslog.New(syslog.LOG_INFO, "optimizer-nri-plugin") + logWriter, err = syslog.New(syslog.LOG_INFO, "prefetchfiles-nri-plugin") if err == nil { log.SetOutput(io.MultiWriter(os.Stdout, logWriter)) @@ -243,10 +191,8 @@ func main() { p := &plugin{} if p.mask, err = api.ParseEventMask(flags.Args.PluginEvents); err != nil { - log.Fatalf("failed to parse events: %v", err) } - cfg.Events = strings.Split(flags.Args.PluginEvents, ",") if p.stub, err = stub.New(p, append(opts, stub.WithOnClose(p.onClose))...); err != nil { log.Fatalf("failed to create plugin stub: %v", err) @@ -264,9 +210,9 @@ func main() { if err := app.Run(os.Args); err != nil { if errdefs.IsConnectionClosed(err) { - log.Info("optimizer NRI plugin exited") + log.Info("prefetchfiles NRI plugin exited") } else { - log.WithError(err).Fatal("failed to start optimizer NRI plugin") + log.WithError(err).Fatal("failed to start prefetchfiles NRI plugin") } } }