Bläddra i källkod

add docker event feed

reid 2 år sedan
förälder
incheckning
f166233c0e
4 ändrade filer med 40 tillägg och 11 borttagningar
  1. 25 5
      docker/docker.go
  2. 7 4
      go.mod
  3. 2 2
      go.sum
  4. 6 0
      main.go

+ 25 - 5
docker/docker.go

@@ -283,17 +283,37 @@ func StopContainerByName(containerName string) error {
 	if err != nil {
 		return err
 	}
-	for _, container := range containers {
-		for _, name := range container.Names {
+	for _, cont := range containers {
+		for _, name := range cont.Names {
 			if name == "/"+containerName {
 				// Stop the container
-				if err := cli.ContainerStop(ctx, container.ID, nil); err != nil {
+				options := container.StopOptions{}
+				if err := cli.ContainerStop(ctx, cont.ID, options); err != nil {
 					return fmt.Errorf("failed to stop container %s: %v", containerName, err)
 				}
-				logger.Info(fmt.Printf("Successfully stopped container %s\n", containerName))
+				logger.Info(fmt.Sprintf("Successfully stopped container %s\n", containerName))
 				return nil
 			}
 		}
 	}
 	return fmt.Errorf("container with name %s not found", containerName)
-}
+}
+
+func DockerListener() {
+	ctx := context.Background()
+	cli, err := client.NewClientWithOpts(client.FromEnv)
+	if err != nil {
+		logger.Error(fmt.Sprintf("Error initializing Docker client: %v", err))
+		return
+	}
+	messages, errs := cli.Events(ctx, types.EventsOptions{})
+	for {
+		select {
+		case event := <-messages:
+			// Convert the Docker event to our custom event and send it to the EventBus
+			EventBus <- Event{Type: event.Action, Data: event}
+		case err := <-errs:
+			logger.Error(fmt.Sprintf("Docker event error: %v", err))
+		}
+	}
+}

+ 7 - 4
go.mod

@@ -2,7 +2,13 @@ module goseg
 
 go 1.21.0
 
-require github.com/docker/docker v24.0.5+incompatible
+require (
+	github.com/docker/docker v24.0.5+incompatible
+	github.com/gorilla/mux v1.8.0
+	github.com/gorilla/websocket v1.5.0
+	github.com/shirou/gopsutil v3.21.11+incompatible
+	github.com/spaolacci/murmur3 v1.1.0
+)
 
 require (
 	github.com/Microsoft/go-winio v0.6.1 // indirect
@@ -11,14 +17,11 @@ require (
 	github.com/docker/go-units v0.5.0 // indirect
 	github.com/go-ole/go-ole v1.2.6 // indirect
 	github.com/gogo/protobuf v1.3.2 // indirect
-	github.com/gorilla/mux v1.8.0 // indirect
-	github.com/gorilla/websocket v1.5.0 // indirect
 	github.com/moby/term v0.5.0 // indirect
 	github.com/morikuni/aec v1.0.0 // indirect
 	github.com/opencontainers/go-digest v1.0.0 // indirect
 	github.com/opencontainers/image-spec v1.0.2 // indirect
 	github.com/pkg/errors v0.9.1 // indirect
-	github.com/shirou/gopsutil v3.21.11+incompatible // indirect
 	github.com/stretchr/testify v1.8.4 // indirect
 	github.com/tklauser/go-sysconf v0.3.12 // indirect
 	github.com/tklauser/numcpus v0.6.1 // indirect

+ 2 - 2
go.sum

@@ -38,6 +38,8 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb
 github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
 github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKlUeu/erjjvaPEYiI=
 github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA=
+github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI=
+github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
 github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=
 github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
 github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU=
@@ -70,8 +72,6 @@ golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5h
 golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU=
-golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.11.0 h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM=
 golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=

+ 6 - 0
main.go

@@ -5,6 +5,7 @@ import (
 	"goseg/config"
 	"goseg/docker"
 	"goseg/ws"
+	"goseg/rectify"
 	"log/slog"
 	"net/http"
 	"os"
@@ -51,7 +52,12 @@ func main() {
 			versionUpdateChannel <- versionUpdate
 		}()
 	}
+	// infinite version check loop
 	go config.CheckVersionLoop()
+	// listen to docker daemon
+	go docker.DockerListener()
+	// digest docker events from eventbus
+	go rectify.HandleDockerEvents()
 	// just making sure we can parse (debug)
 	var pierList string
 	for _, pier := range conf.Piers {