From 8d0faf08c06e65fb8ee0e8fbb61fe559ae79036d Mon Sep 17 00:00:00 2001 From: David Rio Deiros Date: Wed, 26 Jun 2024 10:35:29 -0400 Subject: [PATCH 1/2] Fix: adds missing code --- ch9/Makefile | 22 ++++++++++++++++++++++ ch9/task/task.go | 34 ++++++++++++++++++++++++++++++++++ ch9/task1.json | 17 +++++++++++++++++ ch9/task2.json | 17 +++++++++++++++++ 4 files changed, 90 insertions(+) create mode 100644 ch9/Makefile create mode 100644 ch9/task1.json create mode 100644 ch9/task2.json diff --git a/ch9/Makefile b/ch9/Makefile new file mode 100644 index 0000000..555c057 --- /dev/null +++ b/ch9/Makefile @@ -0,0 +1,22 @@ +all: + cat Makefile + +start: + CUBE_WORKER_HOST=localhost \ + CUBE_WORKER_PORT=5555 \ + CUBE_MANAGER_HOST=localhost \ + CUBE_MANAGER_PORT=5556 \ + go run main.go + +list: + @curl -s localhost:5556/tasks | jq + +send/%: + @curl -s --request POST \ + --header 'Content-Type: application/json' \ + --data @task$*.json \ + localhost:5556/tasks | jq + +delete: + @echo 'curl -s --request DELETE "localhost:5556/tasks/xxxxx"' + diff --git a/ch9/task/task.go b/ch9/task/task.go index a12d349..e3e61a0 100644 --- a/ch9/task/task.go +++ b/ch9/task/task.go @@ -31,6 +31,9 @@ type Task struct { RestartPolicy string StartTime time.Time FinishTime time.Time + HostPorts nat.PortMap + HealthCheck string + RestartCount int } type TaskEvent struct { @@ -68,6 +71,11 @@ type Config struct { RestartPolicy string } +type DockerInspectResponse struct { + Error error + Container *types.ContainerJSON +} + func NewConfig(t *Task) *Config { return &Config{ Name: t.Name, @@ -172,3 +180,29 @@ func (d *Docker) Stop(id string) DockerResult { return DockerResult{Action: "stop", Result: "success", Error: nil} } + +func (d *Docker) Inspect(containerID string) DockerInspectResponse { + dc, _ := client.NewClientWithOpts(client.FromEnv) + ctx := context.Background() + resp, err := dc.ContainerInspect(ctx, containerID) + if err != nil { + log.Printf("Error inspecting container: %s\n", err) + return DockerInspectResponse{Error: err} + } + + return DockerInspectResponse{Container: &resp} +} + +// FIXME: +func (d *Docker) Remove(containerID string) DockerResult { + dc, _ := client.NewClientWithOpts(client.FromEnv) + ctx := context.Background() + // resp + _, err := dc.ContainerInspect(ctx, containerID) + if err != nil { + log.Printf("Error inspecting container: %s\n", err) + return DockerResult{Error: err} + } + + return DockerResult{Action: "stop", Result: "success", Error: nil} +} diff --git a/ch9/task1.json b/ch9/task1.json new file mode 100644 index 0000000..98d74f9 --- /dev/null +++ b/ch9/task1.json @@ -0,0 +1,17 @@ +{ + "ID": "a7aa1d44-08f6-443e-9378-f5884311019e", + "State": 2, + "Task": { + "State": 1, + "ID": "bb1d59ef-9fc1-4e4b-a44d-db571eeed203", + "Name": "test-chapter-9.1", + "Image": "timboring/echo-server:latest", + "ExposedPorts": { + "7777/tcp": {} + }, + "PortBindings": { + "7777/tcp": "7777" + }, + "HealthCheck": "/health" + } +} diff --git a/ch9/task2.json b/ch9/task2.json new file mode 100644 index 0000000..b95e507 --- /dev/null +++ b/ch9/task2.json @@ -0,0 +1,17 @@ +{ + "ID": "6be4cb6b-61d1-40cb-bc7b-9cacefefa60c", + "State": 2, + "Task": { + "State": 1, + "ID": "21b23589-5d2d-4731-b5c9-a97e9832d021", + "Name": "test-chapter-9.2", + "Image": "timboring/echo-server:latest", + "ExposedPorts": { + "7777/tcp": {} + }, + "PortBindings": { + "7777/tcp": "7777" + }, + "HealthCheck": "/healthfail" + } +} From ca554762472765c351bbf6a9fb42ae9c9c2689da Mon Sep 17 00:00:00 2001 From: David Rio Deiros Date: Mon, 1 Jul 2024 12:01:53 -0400 Subject: [PATCH 2/2] Fixes last chapter. --- ch10/Makefile | 22 +++++++++++++++++++ ch10/main.go | 10 ++++----- ch10/manager/api.go | 6 +++++- ch10/task/task.go | 34 +++++++++++++++++++++++++++++ ch12/Makefile | 4 ++++ ch12/cmd/root.go | 14 ++---------- ch12/go.mod | 28 +++++++++++++----------- ch12/go.sum | 52 +++++++++++++++++++++++++++------------------ ch12/task.json | 4 ++-- ch12/task/task.go | 34 +++++++++++++++++++++++++++++ ch9/Makefile | 5 ++--- 11 files changed, 157 insertions(+), 56 deletions(-) create mode 100644 ch10/Makefile create mode 100644 ch12/Makefile diff --git a/ch10/Makefile b/ch10/Makefile new file mode 100644 index 0000000..555c057 --- /dev/null +++ b/ch10/Makefile @@ -0,0 +1,22 @@ +all: + cat Makefile + +start: + CUBE_WORKER_HOST=localhost \ + CUBE_WORKER_PORT=5555 \ + CUBE_MANAGER_HOST=localhost \ + CUBE_MANAGER_PORT=5556 \ + go run main.go + +list: + @curl -s localhost:5556/tasks | jq + +send/%: + @curl -s --request POST \ + --header 'Content-Type: application/json' \ + --data @task$*.json \ + localhost:5556/tasks | jq + +delete: + @echo 'curl -s --request DELETE "localhost:5556/tasks/xxxxx"' + diff --git a/ch10/main.go b/ch10/main.go index dae09a3..a5b55ab 100644 --- a/ch10/main.go +++ b/ch10/main.go @@ -19,20 +19,21 @@ func main() { mhost := os.Getenv("CUBE_MANAGER_HOST") mport, _ := strconv.Atoi(os.Getenv("CUBE_MANAGER_PORT")) - fmt.Println("Starting Cube worker") - + fmt.Println("Starting Cube worker 1") w1 := worker.Worker{ Queue: *queue.New(), Db: make(map[uuid.UUID]*task.Task), } wapi1 := worker.Api{Address: whost, Port: wport, Worker: &w1} + fmt.Println("Starting Cube worker 2") w2 := worker.Worker{ Queue: *queue.New(), Db: make(map[uuid.UUID]*task.Task), } wapi2 := worker.Api{Address: whost, Port: wport + 1, Worker: &w2} + fmt.Println("Starting Cube worker 3") w3 := worker.Worker{ Queue: *queue.New(), Db: make(map[uuid.UUID]*task.Task), @@ -58,8 +59,8 @@ func main() { fmt.Sprintf("%s:%d", whost, wport+1), fmt.Sprintf("%s:%d", whost, wport+2), } - //m := manager.New(workers, "roundrobin") - m := manager.New(workers, "epvm") + m := manager.New(workers, "roundrobin") + //m := manager.New(workers, "epvm") mapi := manager.Api{Address: mhost, Port: mport, Manager: m} go m.ProcessTasks() @@ -68,5 +69,4 @@ func main() { //go m.UpdateNodeStats() mapi.Start() - } diff --git a/ch10/manager/api.go b/ch10/manager/api.go index dde1591..6ce7794 100644 --- a/ch10/manager/api.go +++ b/ch10/manager/api.go @@ -2,6 +2,7 @@ package manager import ( "fmt" + "log" "net/http" "github.com/go-chi/chi/v5" @@ -32,5 +33,8 @@ func (a *Api) initRouter() { func (a *Api) Start() { a.initRouter() - http.ListenAndServe(fmt.Sprintf("%s:%d", a.Address, a.Port), a.Router) + err := http.ListenAndServe(fmt.Sprintf("%s:%d", a.Address, a.Port), a.Router) + if err != nil { + log.Fatal(err) + } } diff --git a/ch10/task/task.go b/ch10/task/task.go index a12d349..4a6d82d 100644 --- a/ch10/task/task.go +++ b/ch10/task/task.go @@ -31,6 +31,9 @@ type Task struct { RestartPolicy string StartTime time.Time FinishTime time.Time + HealthCheck string + HostPorts nat.PortMap + RestartCount int } type TaskEvent struct { @@ -151,6 +154,11 @@ func (d *Docker) Run() DockerResult { return DockerResult{ContainerId: resp.ID, Action: "start", Result: "success"} } +type DockerInspectResponse struct { + Error error + Container *types.ContainerJSON +} + func (d *Docker) Stop(id string) DockerResult { log.Printf("Attempting to stop container %v", id) ctx := context.Background() @@ -172,3 +180,29 @@ func (d *Docker) Stop(id string) DockerResult { return DockerResult{Action: "stop", Result: "success", Error: nil} } + +func (d *Docker) Inspect(containerID string) DockerInspectResponse { + dc, _ := client.NewClientWithOpts(client.FromEnv) + ctx := context.Background() + resp, err := dc.ContainerInspect(ctx, containerID) + if err != nil { + log.Printf("Error inspecting container: %s\n", err) + return DockerInspectResponse{Error: err} + } + + return DockerInspectResponse{Container: &resp} +} + +// FIXME: +func (d *Docker) Remove(containerID string) DockerResult { + dc, _ := client.NewClientWithOpts(client.FromEnv) + ctx := context.Background() + // resp + _, err := dc.ContainerInspect(ctx, containerID) + if err != nil { + log.Printf("Error inspecting container: %s\n", err) + return DockerResult{Error: err} + } + + return DockerResult{Action: "stop", Result: "success", Error: nil} +} diff --git a/ch12/Makefile b/ch12/Makefile new file mode 100644 index 0000000..8894aab --- /dev/null +++ b/ch12/Makefile @@ -0,0 +1,4 @@ + +all: + @echo "go run main.go worker -n w01 -p 5556" + @echo "go run main.go manager -w localhost:5556,localhost:5557" diff --git a/ch12/cmd/root.go b/ch12/cmd/root.go index 34116b3..c45761d 100644 --- a/ch12/cmd/root.go +++ b/ch12/cmd/root.go @@ -1,6 +1,5 @@ /* Copyright © 2023 NAME HERE - */ package cmd @@ -10,18 +9,11 @@ import ( "github.com/spf13/cobra" ) - - // rootCmd represents the base command when called without any subcommands var rootCmd = &cobra.Command{ Use: "cube", - Short: "A brief description of your application", - Long: `A longer description that spans multiple lines and likely contains -examples and usage of using your application. For example: - -Cobra is a CLI library for Go that empowers applications. -This application is a tool to generate the needed files -to quickly create a Cobra application.`, + Short: "a toy orchestrator", + Long: `cube is a minimal orchestrator system that was written as a didactical tool.`, // Uncomment the following line if your bare application // has an action associated with it: // Run: func(cmd *cobra.Command, args []string) { }, @@ -47,5 +39,3 @@ func init() { // when this action is called directly. rootCmd.Flags().BoolP("toggle", "t", false, "Help message for toggle") } - - diff --git a/ch12/go.mod b/ch12/go.mod index 73b2621..034170a 100644 --- a/ch12/go.mod +++ b/ch12/go.mod @@ -1,37 +1,41 @@ module cube -go 1.19 +go 1.21 + +toolchain go1.22.4 require ( github.com/boltdb/bolt v1.3.1 github.com/c9s/goprocinfo v0.0.0-20210130143923-c95fcf8c64a8 github.com/docker/docker v20.10.6+incompatible github.com/docker/go-connections v0.4.0 + github.com/docker/go-units v0.4.0 github.com/go-chi/chi/v5 v5.0.4 github.com/golang-collections/collections v0.0.0-20130729185459-604e922904d3 - github.com/google/go-cmp v0.5.4 - github.com/google/uuid v1.2.0 + github.com/google/go-cmp v0.6.0 + github.com/google/uuid v1.6.0 github.com/moby/moby v20.10.6+incompatible + github.com/spf13/cobra v1.7.0 ) require ( github.com/Microsoft/go-winio v0.5.0 // indirect github.com/containerd/containerd v1.5.1 // indirect github.com/docker/distribution v2.7.1+incompatible // indirect - github.com/docker/go-units v0.4.0 // indirect github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang/protobuf v1.4.3 // indirect + github.com/golang/protobuf v1.5.3 // indirect github.com/inconshreveable/mousetrap v1.1.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.1 // indirect github.com/pkg/errors v0.9.1 // indirect - github.com/sirupsen/logrus v1.8.1 // indirect - github.com/spf13/cobra v1.7.0 // indirect + github.com/sirupsen/logrus v1.9.3 // indirect github.com/spf13/pflag v1.0.5 // indirect - golang.org/x/net v0.0.0-20210510120150-4163338589ed // indirect - golang.org/x/sys v0.0.0-20210423082822-04245dca01da // indirect - google.golang.org/genproto v0.0.0-20201110150050-8816d57aaa9a // indirect - google.golang.org/grpc v1.37.1 // indirect - google.golang.org/protobuf v1.25.0 // indirect + github.com/stretchr/testify v1.9.0 // indirect + golang.org/x/net v0.26.0 // indirect + golang.org/x/sys v0.21.0 // indirect + golang.org/x/time v0.5.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20231120223509-83a465c0220f // indirect + google.golang.org/grpc v1.59.0 // indirect + google.golang.org/protobuf v1.33.0 // indirect ) diff --git a/ch12/go.sum b/ch12/go.sum index caa8609..8758ee8 100644 --- a/ch12/go.sum +++ b/ch12/go.sum @@ -100,7 +100,6 @@ github.com/cilium/ebpf v0.2.0/go.mod h1:To2CFviqOWL/M0gIMsvSMlqe7em/l1ALkX1PyjrX github.com/cilium/ebpf v0.4.0/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJXRs= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= github.com/containerd/aufs v0.0.0-20200908144142-dab0cbea06f4/go.mod h1:nukgQABAEopAHvB6j7cnP5zJ+/3aVcE7hCYqvIwAHyE= github.com/containerd/aufs v0.0.0-20201003224125-76a6863f2989/go.mod h1:AkGGQs9NM2vtYHaUen+NljV0/baGCAPELGm2q9ZXpWU= @@ -240,7 +239,6 @@ github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= @@ -311,8 +309,10 @@ github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:W github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.4.3 h1:JjCZWpVbqXDqFVmTfYWEVTMIYrL/NPdPSCHPJ0T/raM= github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= +github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= @@ -322,8 +322,10 @@ github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.4 h1:L8R9j+yAqZuZjsqh/z+F1NCffTKKLShY6zXTItVIZ8M= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= @@ -336,8 +338,9 @@ github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm4 github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.2.0 h1:qJYtXnJRWmpe7m/3XlyhrsLrEURqHRM2kxzoxXqyUDs= github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg= @@ -525,8 +528,8 @@ github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMB github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE= -github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= +github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= @@ -556,9 +559,10 @@ github.com/stretchr/testify v0.0.0-20180303142811-b89eecf5ca5d/go.mod h1:a8OnRci github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/syndtr/gocapability v0.0.0-20170704070218-db04d3cc01c8/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= github.com/syndtr/gocapability v0.0.0-20180916011248-d98352740cb2/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= @@ -678,8 +682,8 @@ golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwY golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210510120150-4163338589ed h1:p9UgmWI9wKpfYmgaV/IZKGdXc5qEK45tDwwwDyjS26I= -golang.org/x/net v0.0.0-20210510120150-4163338589ed/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.26.0 h1:soB7SVo0PWrY4vPW/+ay0jKDNScG2X9wFeYlXIvJsOQ= +golang.org/x/net v0.26.0/go.mod h1:5YKkiSynbBIh3p6iOc/vibscux0x38BZDkn8sCUPxHE= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -753,8 +757,9 @@ golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20201202213521-69691e467435/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210324051608-47abb6519492/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da h1:b3NXsE2LusjYGGjL5bxEVZZORm/YEFFrWFjR8eFrw/c= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.21.0 h1:rF+pYz3DAGSQAxAu1CbC7catZg4ebC4UIeIhKxBZvws= +golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -762,13 +767,15 @@ golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3 golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6 h1:aRYxNxv6iGQlyVaZmk6ZgYEDa+Jg18DxebPSrd6bg1M= +golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4= +golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e h1:EHBhcS0mlXEAVwNyO2dLfjToGsyY4j24pTs2ScHnX7s= golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= +golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -809,7 +816,6 @@ golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4f golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/api v0.0.0-20160322025152-9bf6e6e569ff/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= @@ -849,8 +855,9 @@ google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfG google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20201110150050-8816d57aaa9a h1:pOwg4OoaRYScjmR4LlLgdtnyoHYTSAVhhqe5uPdpII8= google.golang.org/genproto v0.0.0-20201110150050-8816d57aaa9a/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto/googleapis/rpc v0.0.0-20231120223509-83a465c0220f h1:ultW7fxlIvee4HYrtnaRPon9HpEgFk5zYpmfMgtKB5I= +google.golang.org/genproto/googleapis/rpc v0.0.0-20231120223509-83a465c0220f/go.mod h1:L9KNLi232K1/xB6f7AlSX692koaRnKaWSR0stBki0Yc= google.golang.org/grpc v0.0.0-20160317175043-d3ddb4469d5a/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= @@ -865,8 +872,8 @@ google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8 google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.37.1 h1:ARnQJNWxGyYJpdf/JXscNlQr/uv607ZPU9Z7ogHi+iI= -google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.59.0 h1:Z5Iec2pjwb+LEOqzpB2MR12/eKFhDPhuqW91O+4bwUk= +google.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -876,8 +883,11 @@ google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2 google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= -google.golang.org/protobuf v1.25.0 h1:Ejskq+SyPohKW+1uil0JJMtmHCgJPJ/qWTxr8qp+R4c= google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= +google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -903,8 +913,8 @@ gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= diff --git a/ch12/task.json b/ch12/task.json index 0265590..45ab1b7 100644 --- a/ch12/task.json +++ b/ch12/task.json @@ -3,8 +3,8 @@ "State": 2, "Task": { "State": 1, - "ID": "21b23589-5d2d-4731-b5c9-a97e9832d021", - "Name": "test-chapter-8", + "ID": "21b23589-5d2d-4731-b5c9-a97e9832d021", + "Name": "test-chapter-12a", "Image": "strm/helloworld-http" } } diff --git a/ch12/task/task.go b/ch12/task/task.go index a12d349..f051555 100644 --- a/ch12/task/task.go +++ b/ch12/task/task.go @@ -31,6 +31,9 @@ type Task struct { RestartPolicy string StartTime time.Time FinishTime time.Time + HostPorts nat.PortMap + HealthCheck string + RestartCount int } type TaskEvent struct { @@ -172,3 +175,34 @@ func (d *Docker) Stop(id string) DockerResult { return DockerResult{Action: "stop", Result: "success", Error: nil} } + +type DockerInspectResponse struct { + Error error + Container *types.ContainerJSON +} + +func (d *Docker) Inspect(containerID string) DockerInspectResponse { + dc, _ := client.NewClientWithOpts(client.FromEnv) + ctx := context.Background() + resp, err := dc.ContainerInspect(ctx, containerID) + if err != nil { + log.Printf("Error inspecting container: %s\n", err) + return DockerInspectResponse{Error: err} + } + + return DockerInspectResponse{Container: &resp} +} + +// FIXME: +func (d *Docker) Remove(containerID string) DockerResult { + dc, _ := client.NewClientWithOpts(client.FromEnv) + ctx := context.Background() + // resp + _, err := dc.ContainerInspect(ctx, containerID) + if err != nil { + log.Printf("Error inspecting container: %s\n", err) + return DockerResult{Error: err} + } + + return DockerResult{Action: "stop", Result: "success", Error: nil} +} diff --git a/ch9/Makefile b/ch9/Makefile index 555c057..270350a 100644 --- a/ch9/Makefile +++ b/ch9/Makefile @@ -17,6 +17,5 @@ send/%: --data @task$*.json \ localhost:5556/tasks | jq -delete: - @echo 'curl -s --request DELETE "localhost:5556/tasks/xxxxx"' - +delete/%: + curl -s --request DELETE "localhost:5556/tasks/$*"