diff --git a/README.md b/README.md index 96d08449..9c93d208 100644 --- a/README.md +++ b/README.md @@ -55,6 +55,7 @@ It is currently in active development in the Kubernetes community through the [d | [kpod-push(1)](/docs/kpod-push.1.md) | Push an image to a specified destination | | [kpod-rmi(1)](/docs/kpod-rmi.1.md) | Removes one or more images | | [kpod-save(1)](/docs/kpod-save.1.md) | Saves an image to an archive | +| [kpod-stats(1)](/docs/kpod-stats.1.md) | Display a live stream of one or more containers' resource usage statistics | | [kpod-tag(1)](/docs/kpod-tag.1.md) | Add an additional name to a local image | | [kpod-umount(1)](/docs/kpod-umount.1.md) | Unmount a working container's root filesystem | | [kpod-version(1)](/docs/kpod-version.1.md) | Display the Kpod version information | diff --git a/cmd/kpod/images.go b/cmd/kpod/images.go index d6f2bda1..815822b2 100644 --- a/cmd/kpod/images.go +++ b/cmd/kpod/images.go @@ -152,7 +152,7 @@ func outputImages(store storage.Store, images []storage.Image, truncate, digests Name: name, Digest: imageDigest, CreatedAt: createdTime.Format("Jan 2, 2006 15:04"), - Size: libkpodimage.FormattedSize(size), + Size: libkpodimage.FormattedSize(float64(size)), } imageOutput = append(imageOutput, params) } diff --git a/cmd/kpod/main.go b/cmd/kpod/main.go index 5ae2a6a6..fe6a8b48 100644 --- a/cmd/kpod/main.go +++ b/cmd/kpod/main.go @@ -39,6 +39,9 @@ func main() { tagCommand, umountCommand, versionCommand, + saveCommand, + statsCommand, + loadCommand, } app.Flags = []cli.Flag{ cli.StringFlag{ diff --git a/cmd/kpod/stats.go b/cmd/kpod/stats.go new file mode 100644 index 00000000..10269f71 --- /dev/null +++ b/cmd/kpod/stats.go @@ -0,0 +1,240 @@ +package main + +import ( + "encoding/json" + "fmt" + "os" + "strings" + "text/template" + "time" + + tm "github.com/buger/goterm" + "github.com/kubernetes-incubator/cri-o/libkpod" + libkpodimage "github.com/kubernetes-incubator/cri-o/libkpod/image" + "github.com/kubernetes-incubator/cri-o/oci" + "github.com/pkg/errors" + "github.com/urfave/cli" +) + +var printf func(format string, a ...interface{}) (n int, err error) +var println func(a ...interface{}) (n int, err error) + +type statsOutputParams struct { + Container string + ID string + CPUPerc string + MemUsage string + MemPerc string + NetIO string + BlockIO string + PIDs uint64 +} + +var ( + statsFlags = []cli.Flag{ + cli.BoolFlag{ + Name: "all, a", + Usage: "show all containers. Only running containers are shown by default. The default is false", + }, + cli.BoolFlag{ + Name: "no-stream", + Usage: "disable streaming stats and only pull the first result, default setting is false", + }, + cli.StringFlag{ + Name: "format", + Usage: "pretty-print container statistics using a Go template", + }, + cli.BoolFlag{ + Name: "json", + Usage: "output container statistics in json format", + }, + } + + statsDescription = "display a live stream of one or more containers' resource usage statistics" + statsCommand = cli.Command{ + Name: "stats", + Usage: "Display percentage of CPU, memory, network I/O, block I/O and PIDs for one or more containers", + Description: statsDescription, + Flags: statsFlags, + Action: statsCmd, + ArgsUsage: "", + } +) + +func statsCmd(c *cli.Context) error { + config, err := getConfig(c) + if err != nil { + return errors.Wrapf(err, "could not read config") + } + containerServer, err := libkpod.New(config) + if err != nil { + return errors.Wrapf(err, "could not create container server") + } + err = containerServer.Update() + if err != nil { + return errors.Wrapf(err, "could not update list of containers") + } + times := -1 + if c.Bool("no-stream") { + times = 1 + } + statsChan := make(chan []*libkpod.ContainerStats) + // iterate over the channel until it is closed + go func() { + // print using goterm + printf = tm.Printf + println = tm.Println + for stats := range statsChan { + // Continually refresh statistics + tm.Clear() + tm.MoveCursor(1, 1) + outputStats(stats, c.String("format"), c.Bool("json")) + tm.Flush() + time.Sleep(time.Second) + } + }() + return getStats(containerServer, c.Args(), c.Bool("all"), statsChan, times) +} + +func getStats(server *libkpod.ContainerServer, args []string, all bool, statsChan chan []*libkpod.ContainerStats, times int) error { + ctrs, err := server.ListContainers(isRunning, ctrInList(args)) + if err != nil { + return err + } + containerStats := map[string]*libkpod.ContainerStats{} + for _, ctr := range ctrs { + initialStats, err := server.GetContainerStats(ctr, &libkpod.ContainerStats{}) + if err != nil { + return err + } + containerStats[ctr.ID()] = initialStats + } + step := 1 + if times == -1 { + times = 1 + step = 0 + } + for i := 0; i < times; i += step { + reportStats := []*libkpod.ContainerStats{} + for _, ctr := range ctrs { + id := ctr.ID() + if _, ok := containerStats[ctr.ID()]; !ok { + initialStats, err := server.GetContainerStats(ctr, &libkpod.ContainerStats{}) + if err != nil { + return err + } + containerStats[id] = initialStats + } + stats, err := server.GetContainerStats(ctr, containerStats[id]) + if err != nil { + return err + } + // replace the previous measurement with the current one + containerStats[id] = stats + reportStats = append(reportStats, stats) + } + statsChan <- reportStats + + err := server.Update() + if err != nil { + return err + } + ctrs, err = server.ListContainers(isRunning, ctrInList(args)) + if err != nil { + return err + } + } + return nil +} + +func outputStats(stats []*libkpod.ContainerStats, format string, json bool) error { + if format == "" { + outputStatsHeader() + } + if json { + return outputStatsAsJSON(stats) + } + var err error + for _, s := range stats { + if format == "" { + outputStatsUsingFormatString(s) + } else { + params := getStatsOutputParams(s) + err2 := outputStatsUsingTemplate(format, params) + if err2 != nil { + err = errors.Wrapf(err, err2.Error()) + } + } + } + return err +} + +func outputStatsHeader() { + printf("%-64s %-16s %-32s %-16s %-24s %-24s %s\n", "CONTAINER", "CPU %", "MEM USAGE / MEM LIMIT", "MEM %", "NET I/O", "BLOCK I/O", "PIDS") +} + +func outputStatsUsingFormatString(stats *libkpod.ContainerStats) { + printf("%-64s %-16s %-32s %-16s %-24s %-24s %d\n", stats.Container, floatToPercentString(stats.CPU), combineHumanValues(stats.MemUsage, stats.MemLimit), floatToPercentString(stats.MemPerc), combineHumanValues(stats.NetInput, stats.NetOutput), combineHumanValues(stats.BlockInput, stats.BlockOutput), stats.PIDs) +} + +func combineHumanValues(a, b uint64) string { + return fmt.Sprintf("%s / %s", libkpodimage.FormattedSize(float64(a)), libkpodimage.FormattedSize(float64(b))) +} + +func floatToPercentString(f float64) string { + return fmt.Sprintf("%.2f %s", f, "%") +} + +func getStatsOutputParams(stats *libkpod.ContainerStats) statsOutputParams { + return statsOutputParams{ + Container: stats.Container, + ID: stats.Container, + CPUPerc: floatToPercentString(stats.CPU), + MemUsage: combineHumanValues(stats.MemUsage, stats.MemLimit), + MemPerc: floatToPercentString(stats.MemPerc), + NetIO: combineHumanValues(stats.NetInput, stats.NetOutput), + BlockIO: combineHumanValues(stats.BlockInput, stats.BlockOutput), + PIDs: stats.PIDs, + } +} + +func outputStatsUsingTemplate(format string, params statsOutputParams) error { + tmpl, err := template.New("stats").Parse(format) + if err != nil { + return errors.Wrapf(err, "template parsing error") + } + + err = tmpl.Execute(os.Stdout, params) + if err != nil { + return err + } + println() + return nil +} + +func outputStatsAsJSON(stats []*libkpod.ContainerStats) error { + s, err := json.Marshal(stats) + if err != nil { + return err + } + println(s) + return nil +} + +func isRunning(ctr *oci.Container) bool { + return ctr.State().Status == "running" +} + +func ctrInList(idsOrNames []string) func(ctr *oci.Container) bool { + if len(idsOrNames) == 0 { + return func(*oci.Container) bool { return true } + } + return func(ctr *oci.Container) bool { + for _, idOrName := range idsOrNames { + if strings.HasPrefix(ctr.ID(), idOrName) || strings.HasSuffix(ctr.Name(), idOrName) { + return true + } + } + return false + } +} diff --git a/completions/bash/kpod b/completions/bash/kpod index 15ef1a18..27c6b93f 100644 --- a/completions/bash/kpod +++ b/completions/bash/kpod @@ -199,6 +199,25 @@ _kpod_rmi() { esac } +_kpod_stats() { + local boolean_options=" + --help + --all + -a + --no-stream + --format + " + + case "$cur" in + -*) + COMPREPLY=($(compgen -W "$boolean_options $options_with_args" -- "$cur")) + ;; + *) + __kpod_list_containers + ;; + esac +} + kpod_tag() { local options_with_args=" " @@ -284,6 +303,7 @@ _kpod_kpod() { pull push rmi + stats tag umount unmount diff --git a/docs/kpod-stats.1.md b/docs/kpod-stats.1.md new file mode 100644 index 00000000..1c1c0b35 --- /dev/null +++ b/docs/kpod-stats.1.md @@ -0,0 +1,37 @@ +% kpod(1) kpod-stats - Display a live stream of 1 or more containers' resource usage statistics +% Ryan Cole +# kpod-stats "1" "July 2017" "kpod" + +## NAME +kpod-stats - Display a live stream of 1 or more containers' resource usage statistics + +## SYNOPSIS +**kpod** **stats** [*options* [...]] [container] + +## DESCRIPTION +Display a live stream of one or more containers' resource usage statistics + +## OPTIONS + +**--all, -a** + +Show all containers. Only running containers are shown by default + +**--no-stream** + +Disable streaming stats and only pull the first result, default setting is false + +**--format="TEMPLATE"** + +Pretty-print images using a Go template + + +## EXAMPLE + +TODO + +## SEE ALSO +kpod(1) + +## HISTORY +July 2017, Originally compiled by Ryan Cole diff --git a/kpod-images.json b/kpod-images.json new file mode 100644 index 00000000..a87f1d5b --- /dev/null +++ b/kpod-images.json @@ -0,0 +1,18446 @@ +{ + "version": 1, + "width": 211, + "height": 52, + "duration": 66890.973605, + "command": null, + "title": null, + "env": { + "TERM": "xterm-256color", + "SHELL": "/usr/bin/zsh" + }, + "stdout": [ + [ + 0.127359, + "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r" + ], + [ + 0.026267, + "\r\n\u001b[34m\u001b[01mcri-o\u001b[22m \u001b[90mgit/kpod-format-table \u001b[39m \u001b[33m\u001b[39m\r\n" + ], + [ + 0.001269, + "\u001b]7;file://localhost.localdomain/home/ryan/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007" + ], + [ + 8.9e-05, + "\u001b]2;ryan@localhost: ~/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007" + ], + [ + 2.3e-05, + "\u001b]1;..cubator/cri-o\u0007" + ], + [ + 0.000195, + "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[35m❯\u001b[39m " + ], + [ + 2.3e-05, + "\u001b[K\u001b[208C\u001b[90m\u001b[39m\u001b[208D" + ], + [ + 3.5e-05, + "\u001b[?1h\u001b=" + ], + [ + 3.6e-05, + "\u001b[?2004h" + ], + [ + 0.431984, + "s" + ], + [ + 0.085317, + "\bsu" + ], + [ + 0.129126, + "d" + ], + [ + 0.088005, + "o" + ], + [ + 0.135671, + " " + ], + [ + 0.08011, + "k" + ], + [ + 0.080023, + "p" + ], + [ + 0.120208, + "o" + ], + [ + 0.063327, + "d" + ], + [ + 0.136258, + " " + ], + [ + 0.120298, + "i" + ], + [ + 0.07945, + "m" + ], + [ + 0.048586, + "a" + ], + [ + 0.111702, + "g" + ], + [ + 0.120452, + "e" + ], + [ + 0.055606, + "s" + ], + [ + 0.55923, + " " + ], + [ + 0.144712, + "-" + ], + [ + 0.152054, + "-" + ], + [ + 0.176129, + "n" + ], + [ + 0.100308, + "o" + ], + [ + 0.207951, + "-" + ], + [ + 0.140053, + "t" + ], + [ + 0.143338, + "r" + ], + [ + 0.076824, + "u" + ], + [ + 0.187154, + "n" + ], + [ + 0.107836, + "c" + ], + [ + 0.11269, + "\u001b[?1l\u001b>" + ], + [ + 0.000169, + "\u001b[?2004l\r\r\n" + ], + [ + 0.0058, + "\u001b]2;sudo kpod images --no-trunc\u0007\u001b]1;kpod\u0007" + ], + [ + 0.930864, + "[sudo] password for ryan: " + ], + [ + 2.238114, + "\r\n" + ], + [ + 1.996034, + "Sorry, try again.\r\n" + ], + [ + 0.916497, + "[sudo] password for ryan: " + ], + [ + 2.392113, + "\r\n" + ], + [ + 0.093899, + "\u001b[34mINFO\u001b[0m[0000] [graphdriver] using prior storage driver \"overlay\" \r\n" + ], + [ + 0.00085, + "IMAGE ID IMAGE NAME CREATED AT SIZE\r\n" + ], + [ + 0.000894, + "3edb693215a22336c352ba66d101fafda7e2ecbad1ecf2137e1c495e461d8f23 docker.io/kubernetes/pause:latest Jul 19, 2014 07:02 241 KB\r\n" + ], + [ + 0.000324, + "1adfcf922a991e2d59a98dd2b5adc813b590261737d77c3ec7ae23e4f927d6bb docker.io/library/fedora:latest Jul 20, 2017 17:07 219.9 MB\r\n" + ], + [ + 0.000358, + "524b9482e987a953b81321580372c07c3c765ce7c336445797428658384c6812 docker.io/library/redis:latest Jul 24, 2017 18:37 101 MB\r\n" + ], + [ + 0.000352, + "9518288ded9bd43a055a4022d84c440b3ac16981f943bb099b60e0984e9e23d2 docker.io/library/redis:alpine Jul 24, 2017 18:39 26.22 MB\r\n" + ], + [ + 0.003194, + "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r" + ], + [ + 0.024028, + "\r\n\u001b[34m\u001b[01mcri-o\u001b[22m \u001b[90mgit/kpod-format-table \u001b[39m \u001b[33m9s\u001b[39m\r\n" + ], + [ + 0.001135, + "\u001b]7;file://localhost.localdomain/home/ryan/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007" + ], + [ + 0.000102, + "\u001b]2;ryan@localhost: ~/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007" + ], + [ + 1.8e-05, + "\u001b]1;..cubator/cri-o\u0007" + ], + [ + 0.000176, + "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[35m❯\u001b[39m " + ], + [ + 4.3e-05, + "\u001b[K\u001b[208C\u001b[90m\u001b[39m\u001b[208D\u001b[?1h\u001b=" + ], + [ + 4.8e-05, + "\u001b[?2004h" + ], + [ + 1.658662, + "s" + ], + [ + 0.071652, + "\bsu" + ], + [ + 0.15257, + "d" + ], + [ + 0.143602, + "o" + ], + [ + 0.160358, + " " + ], + [ + 0.119704, + "k" + ], + [ + 0.104527, + "p" + ], + [ + 0.087276, + "o" + ], + [ + 0.096382, + "d" + ], + [ + 0.088303, + " " + ], + [ + 0.08811, + "i" + ], + [ + 0.0717, + "m" + ], + [ + 0.079483, + "a" + ], + [ + 0.103857, + "g" + ], + [ + 0.080719, + "e" + ], + [ + 0.056202, + "s" + ], + [ + 0.111434, + " " + ], + [ + 0.152746, + "-" + ], + [ + 0.111237, + "q" + ], + [ + 0.144032, + "\u001b[?1l\u001b>" + ], + [ + 0.000167, + "\u001b[?2004l\r\r\n" + ], + [ + 0.004109, + "\u001b]2;sudo kpod images -q\u0007\u001b]1;kpod\u0007" + ], + [ + 0.094407, + "\u001b[34mINFO\u001b[0m[0000] [graphdriver] using prior storage driver \"overlay\" \r\n" + ], + [ + 0.001695, + "3edb693215a22336c352ba66d101fafda7e2ecbad1ecf2137e1c495e461d8f23\r\n" + ], + [ + 0.000296, + "1adfcf922a991e2d59a98dd2b5adc813b590261737d77c3ec7ae23e4f927d6bb\r\n" + ], + [ + 0.000377, + "524b9482e987a953b81321580372c07c3c765ce7c336445797428658384c6812\r\n" + ], + [ + 0.000392, + "9518288ded9bd43a055a4022d84c440b3ac16981f943bb099b60e0984e9e23d2\r\n" + ], + [ + 0.002686, + "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r" + ], + [ + 0.024178, + "\r\n\u001b[34m\u001b[01mcri-o\u001b[22m \u001b[90mgit/kpod-format-table \u001b[39m \u001b[33m\u001b[39m\r\n" + ], + [ + 0.001405, + "\u001b]7;file://localhost.localdomain/home/ryan/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007" + ], + [ + 0.000211, + "\u001b]2;ryan@localhost: ~/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007" + ], + [ + 5.2e-05, + "\u001b]1;..cubator/cri-o\u0007" + ], + [ + 0.000251, + "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[35m❯\u001b[39m \u001b[K\u001b[208C\u001b[90m\u001b[39m\u001b[208D" + ], + [ + 4.9e-05, + "\u001b[?1h\u001b=" + ], + [ + 7.2e-05, + "\u001b[?2004h" + ], + [ + 0.566345, + "s" + ], + [ + 0.119935, + "\bsu" + ], + [ + 0.142907, + "d" + ], + [ + 0.104809, + "o" + ], + [ + 0.223809, + " " + ], + [ + 0.144031, + "k" + ], + [ + 0.127885, + "p" + ], + [ + 0.104093, + "o" + ], + [ + 0.136222, + "d" + ], + [ + 0.111758, + " " + ], + [ + 0.088148, + "i" + ], + [ + 0.079691, + "m" + ], + [ + 0.09608, + "a" + ], + [ + 0.111767, + "g" + ], + [ + 0.096631, + "e" + ], + [ + 0.063607, + "s" + ], + [ + 0.120256, + " " + ], + [ + 0.223186, + "-" + ], + [ + 0.16889, + "-" + ], + [ + 0.151472, + "d" + ], + [ + 0.120605, + "i" + ], + [ + 0.11131, + "g" + ], + [ + 0.096141, + "e" + ], + [ + 0.120451, + "s" + ], + [ + 0.095792, + "t" + ], + [ + 0.120047, + "s" + ], + [ + 0.272206, + " " + ], + [ + 0.1516, + "r" + ], + [ + 0.056258, + "e" + ], + [ + 0.175241, + "d" + ], + [ + 0.144489, + "i" + ], + [ + 0.136449, + "s" + ], + [ + 0.159879, + "\u001b[?1l\u001b>" + ], + [ + 0.000108, + "\u001b[?2004l\r\r\n" + ], + [ + 0.004344, + "\u001b]2;sudo kpod images --digests redis\u0007\u001b]1;kpod\u0007" + ], + [ + 0.090151, + "\u001b[34mINFO\u001b[0m[0000] [graphdriver] using prior storage driver \"overlay\" \r\n" + ], + [ + 0.000807, + "IMAGE ID IMAGE NAME DIGEST CREATED AT SIZE\r\n" + ], + [ + 0.000758, + "524b9482e987 docker.io/library/redis:latest sha256:b839545984cee95685e514aeb441a8b0624818559d89910aa31ad645c904210f Jul 24, 2017 18:37 101 MB\r\n" + ], + [ + 0.000371, + "9518288ded9b docker.io/library/redis:alpine sha256:e633cded055a94202e4ccccb8125b7f383cd6ee56527ab890db643383a2647dd Jul 24, 2017 18:39 26.22 MB\r\n" + ], + [ + 0.00292, + "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r" + ], + [ + 0.023228, + "\r\n\u001b[34m\u001b[01mcri-o\u001b[22m \u001b[90mgit/kpod-format-table \u001b[39m \u001b[33m\u001b[39m\r\n" + ], + [ + 0.001399, + "\u001b]7;file://localhost.localdomain/home/ryan/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007" + ], + [ + 0.000108, + "\u001b]2;ryan@localhost: ~/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007" + ], + [ + 5.3e-05, + "\u001b]1;..cubator/cri-o\u0007" + ], + [ + 0.000122, + "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[35m❯\u001b[39m \u001b[K\u001b[208C\u001b[90m\u001b[39m\u001b[208D" + ], + [ + 2.7e-05, + "\u001b[?1h\u001b=" + ], + [ + 4.6e-05, + "\u001b[?2004h" + ], + [ + 0.987423, + "s" + ], + [ + 0.11214, + "\bsu" + ], + [ + 0.12844, + "d" + ], + [ + 0.079782, + "o" + ], + [ + 0.183347, + " " + ], + [ + 0.096053, + "k" + ], + [ + 0.103724, + "p" + ], + [ + 0.095897, + "o" + ], + [ + 0.128513, + "d" + ], + [ + 0.119949, + " " + ], + [ + 0.096107, + "i" + ], + [ + 0.087565, + "m" + ], + [ + 0.080849, + "a" + ], + [ + 0.095739, + "g" + ], + [ + 0.096047, + "e" + ], + [ + 0.055373, + "s" + ], + [ + 0.160498, + " " + ], + [ + 0.168065, + "-" + ], + [ + 0.135891, + "-" + ], + [ + 0.160099, + "f" + ], + [ + 0.144124, + "i" + ], + [ + 0.312147, + "l" + ], + [ + 0.183726, + "t" + ], + [ + 0.183798, + "e" + ], + [ + 0.104556, + "r" + ], + [ + 1.071509, + " " + ], + [ + 0.208609, + "\"" + ], + [ + 0.25584, + "s" + ], + [ + 0.191556, + "i" + ], + [ + 0.119659, + "n" + ], + [ + 0.536775, + "c" + ], + [ + 0.09534, + "e" + ], + [ + 0.54414, + "=" + ], + [ + 0.144045, + "f" + ], + [ + 0.06374, + "e" + ], + [ + 0.184989, + "d" + ], + [ + 0.135526, + "o" + ], + [ + 0.136149, + "r" + ], + [ + 0.080286, + "a" + ], + [ + 0.454973, + ":" + ], + [ + 0.624879, + "l" + ], + [ + 0.096184, + "a" + ], + [ + 0.111656, + "t" + ], + [ + 0.120147, + "e" + ], + [ + 0.08794, + "s" + ], + [ + 0.06356, + "t" + ], + [ + 0.288506, + "\"" + ], + [ + 0.543802, + " " + ], + [ + 0.200564, + "-" + ], + [ + 0.142861, + "-" + ], + [ + 0.128436, + "f" + ], + [ + 0.112036, + "o" + ], + [ + 0.151167, + "r" + ], + [ + 0.128503, + "m" + ], + [ + 0.120291, + "a" + ], + [ + 0.088635, + "t" + ], + [ + 0.143602, + " " + ], + [ + 0.256717, + "\"" + ], + [ + 1.46299, + "t" + ], + [ + 0.107784, + "a" + ], + [ + 0.156707, + "b" + ], + [ + 0.123646, + "l" + ], + [ + 0.223815, + "e" + ], + [ + 0.22418, + " " + ], + [ + 0.304259, + "{" + ], + [ + 0.20813, + "{" + ], + [ + 0.599583, + "." + ], + [ + 0.335909, + "I" + ], + [ + 0.268363, + "D" + ], + [ + 0.591353, + "\b \b" + ], + [ + 0.119781, + "\b \b" + ], + [ + 0.156399, + "\b \b" + ], + [ + 0.376287, + " " + ], + [ + 0.095973, + "t" + ], + [ + 0.151826, + "r" + ], + [ + 0.039602, + "u" + ], + [ + 0.192491, + "n" + ], + [ + 0.088154, + "c" + ], + [ + 0.147825, + "a" + ], + [ + 0.123835, + "t" + ], + [ + 0.104099, + "e" + ], + [ + 0.135647, + " " + ], + [ + 0.216888, + "." + ], + [ + 0.303994, + "I" + ], + [ + 0.191778, + "D" + ], + [ + 0.574958, + " " + ], + [ + 0.19329, + "8" + ], + [ + 0.439791, + "}" + ], + [ + 0.143884, + "}" + ], + [ + 0.143784, + " " + ], + [ + 0.256871, + "{" + ], + [ + 0.151265, + "{" + ], + [ + 0.671939, + "." + ], + [ + 0.880114, + "\b \b" + ], + [ + 0.759869, + " " + ], + [ + 0.167976, + "." + ], + [ + 0.344489, + "N" + ], + [ + 0.191508, + "a" + ], + [ + 0.095324, + "m" + ], + [ + 0.223992, + "e" + ], + [ + 0.128763, + " " + ], + [ + 0.15222, + "|" + ], + [ + 0.255382, + " " + ], + [ + 0.144061, + "p" + ], + [ + 0.128167, + "r" + ], + [ + 0.096088, + "i" + ], + [ + 0.071635, + "n" + ], + [ + 0.120055, + "t" + ], + [ + 0.264652, + "f" + ], + [ + 0.151244, + " " + ], + [ + 0.192646, + "\\" + ], + [ + 0.26379, + "\"" + ], + [ + 1.311952, + "%" + ], + [ + 4.68053, + "-" + ], + [ + 1.015928, + "t" + ], + [ + 0.551856, + "\b \b" + ], + [ + 1.032351, + "6" + ], + [ + 0.111812, + "4" + ], + [ + 0.295612, + "s" + ], + [ + 0.719816, + "\\" + ], + [ + 0.248899, + "\"" + ], + [ + 0.599051, + " " + ], + [ + 0.311681, + "}" + ], + [ + 0.137392, + "}" + ], + [ + 0.894842, + " " + ], + [ + 0.224545, + "{" + ], + [ + 0.127645, + "{" + ], + [ + 0.224058, + "." + ], + [ + 0.184217, + "C" + ], + [ + 0.248132, + "r" + ], + [ + 0.079278, + "e" + ], + [ + 0.104455, + "a" + ], + [ + 0.087831, + "t" + ], + [ + 0.064342, + "e" + ], + [ + 0.19221, + "d" + ], + [ + 0.199615, + "A" + ], + [ + 0.464438, + "t" + ], + [ + 0.367064, + "}" + ], + [ + 0.15281, + "}" + ], + [ + 0.559881, + "\"" + ], + [ + 0.448076, + "\u001b[?1l\u001b>" + ], + [ + 0.000334, + "\u001b[?2004l\r\r\n" + ], + [ + 0.005051, + "\u001b]2;sudo kpod images --filter \"since=fedora:latest\" --format \u0007" + ], + [ + 9.2e-05, + "\u001b]1;kpod\u0007" + ], + [ + 0.092964, + "\u001b[34mINFO\u001b[0m[0000] [graphdriver] using prior storage driver \"overlay\" \r\n" + ], + [ + 0.003089, + "template: image:1: function \"truncate\" not defined\r\nTemplate parsing error\r\nmain.outputUsingTemplate\r\n\t/home/ryan/Development/Go/src/github.com/kubernetes-incubator/cri-o/cmd/kpod/images.go:178\r\nmain.outputImages\r\n\t/home/ryan/Development/Go/src/github.com/kubernetes-incubator/cri-o/cmd/kpod/images.go:165\r\nmain.imagesCmd\r\n\t/home/ryan/Development/Go/src/github.com/kubernetes-incubator/cri-o/cmd/kpod/images.go:120\r\ngithub.com/kubernetes-incubator/cri-o/vendor/github.com/urfave/cli.HandleAction\r\n\t/home/ryan/Development/Go/src/github.com/kubernetes-incubator/cri-o/vendor/github.com/urfave/cli/app.go:485\r\ngithub.com/kubernetes-incubator/cri-o/vendor/github.com/urfave/cli.Command.Run\r\n\t/home/ryan/Development/Go/src/github.com/kubernetes-incubator/cri-o/vendor/github.com/urfave/cli/command.go:193\r\ngithub.com/kubernetes-incubator/cri-o/vendor/github.com/urfave/cli.(*App).Run\r\n\t/home/ryan/Development/Go/src/github.com/kubernetes-incubator/cri-o/vendor/github.com/urfave/cli/app.go:250\r\nmain.main\r\n\t" + ], + [ + 2.8e-05, + "/home/ryan/Development/Go/src/github.com/kubernetes-incubator/cri-o/cmd/kpod/main.go:61\r\nruntime.main\r\n\t/usr/lib/golang/src/runtime/proc.go:185\r\nruntime.goexit\r\n\t/usr/lib/golang/src/runtime/asm_amd64.s:2197\r\n" + ], + [ + 0.002932, + "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r" + ], + [ + 0.026506, + "\r\n\u001b[34m\u001b[01mcri-o\u001b[22m \u001b[90mgit/kpod-format-table \u001b[39m \u001b[33m\u001b[39m\r\n" + ], + [ + 0.000971, + "\u001b]7;file://localhost.localdomain/home/ryan/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007" + ], + [ + 0.000117, + "\u001b]2;ryan@localhost: ~/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007\u001b]1;..cubator/cri-o\u0007" + ], + [ + 0.00031, + "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[31m❯\u001b[39m \u001b[K\u001b[208C\u001b[90m\u001b[39m\u001b[208D" + ], + [ + 4.6e-05, + "\u001b[?1h\u001b=" + ], + [ + 2.9e-05, + "\u001b[?2004h" + ], + [ + 5.719975, + "sudo kpod images --filter \"since=fedora:latest\" --format \"table {{ truncate .ID 8}} {{ .Name | printf \\\"%-64s\\\" }} {{.CreatedAt}}\"" + ], + [ + 0.111141, + "\b" + ], + [ + 0.500452, + "\b" + ], + [ + 0.030822, + "\b" + ], + [ + 0.031199, + "\b" + ], + [ + 0.030859, + "\b" + ], + [ + 0.030714, + "\b" + ], + [ + 0.029362, + "\b" + ], + [ + 0.031473, + "\b" + ], + [ + 0.030015, + "\b" + ], + [ + 0.030409, + "\b" + ], + [ + 0.030238, + "\b" + ], + [ + 0.031711, + "\b" + ], + [ + 0.029911, + "\b" + ], + [ + 0.031066, + "\b" + ], + [ + 0.029076, + "\b" + ], + [ + 0.03054, + "\b" + ], + [ + 0.031011, + "\b" + ], + [ + 0.031156, + "\b" + ], + [ + 0.030493, + "\b" + ], + [ + 0.029937, + "\b" + ], + [ + 0.030608, + "\b" + ], + [ + 0.030465, + "\b" + ], + [ + 0.030741, + "\b" + ], + [ + 0.030923, + "\b" + ], + [ + 0.029979, + "\b" + ], + [ + 0.0302, + "\b" + ], + [ + 0.031404, + "\b" + ], + [ + 0.030985, + "\b" + ], + [ + 0.030991, + "\b" + ], + [ + 0.030493, + "\b" + ], + [ + 0.031775, + "\b" + ], + [ + 0.030463, + "\b" + ], + [ + 0.03012, + "\b" + ], + [ + 0.030377, + "\b" + ], + [ + 0.030266, + "\b" + ], + [ + 0.031003, + "\b" + ], + [ + 0.029286, + "\b" + ], + [ + 0.031623, + "\b" + ], + [ + 0.029799, + "\b" + ], + [ + 0.029213, + "\b" + ], + [ + 0.03082, + "\b" + ], + [ + 0.030044, + "\b" + ], + [ + 0.030151, + "\b" + ], + [ + 0.030665, + "\b" + ], + [ + 0.030377, + "\b" + ], + [ + 0.030146, + "\b" + ], + [ + 0.093081, + "\b" + ], + [ + 0.191739, + "\b" + ], + [ + 0.144119, + "\b" + ], + [ + 0.327779, + "\b}} {{ .Name | printf \\\"%-64s\\\" }} {{.CreatedAt}}\" \u001b[50D" + ], + [ + 0.176138, + "\b}} {{ .Name | printf \\\"%-64s\\\" }} {{.CreatedAt}}\" \u001b[50D" + ], + [ + 0.39199, + "\b" + ], + [ + 0.223786, + "\b" + ], + [ + 0.144097, + "\b" + ], + [ + 0.279236, + "\u001b[1C" + ], + [ + 0.501129, + "\u001b[1C" + ], + [ + 0.029576, + "\u001b[1C" + ], + [ + 0.029751, + "\u001b[1C" + ], + [ + 0.032205, + "\u001b[1C" + ], + [ + 0.02899, + "\u001b[1C" + ], + [ + 0.515239, + "\b{{ .Name | printf \\\"%-64s\\\" }} {{.CreatedAt}}\" \u001b[47D" + ], + [ + 0.499546, + "\b{{ .Name | printf \\\"%-64s\\\" }} {{.CreatedAt}}\" \u001b[47D" + ], + [ + 0.030618, + "\b{{ .Name | printf \\\"%-64s\\\" }} {{.CreatedAt}}\" \u001b[47D" + ], + [ + 0.031062, + "\b{{ .Name | printf \\\"%-64s\\\" }} {{.CreatedAt}}\" \u001b[47D" + ], + [ + 0.030453, + "\b{{ .Name | printf \\\"%-64s\\\" }} {{.CreatedAt}}\" \u001b[47D" + ], + [ + 0.03064, + "\b{{ .Name | printf \\\"%-64s\\\" }} {{.CreatedAt}}\" \u001b[47D" + ], + [ + 0.029812, + "\b{{ .Name | printf \\\"%-64s\\\" }} {{.CreatedAt}}\" \u001b[47D" + ], + [ + 0.030975, + "\b{{ .Name | printf \\\"%-64s\\\" }} {{.CreatedAt}}\" \u001b[47D" + ], + [ + 0.030209, + "\b{{ .Name | printf \\\"%-64s\\\" }} {{.CreatedAt}}\" \u001b[47D" + ], + [ + 0.03139, + "\b{{ .Name | printf \\\"%-64s\\\" }} {{.CreatedAt}}\" \u001b[47D" + ], + [ + 0.030639, + "\b{{ .Name | printf \\\"%-64s\\\" }} {{.CreatedAt}}\" \u001b[47D" + ], + [ + 0.031502, + "\b{{ .Name | printf \\\"%-64s\\\" }} {{.CreatedAt}}\" \u001b[47D" + ], + [ + 0.030081, + "\b{{ .Name | printf \\\"%-64s\\\" }} {{.CreatedAt}}\" \u001b[47D" + ], + [ + 0.029882, + "\b{{ .Name | printf \\\"%-64s\\\" }} {{.CreatedAt}}\" \u001b[47D" + ], + [ + 0.030344, + "\b{{ .Name | printf \\\"%-64s\\\" }} {{.CreatedAt}}\" \u001b[47D" + ], + [ + 0.031029, + "\b{{ .Name | printf \\\"%-64s\\\" }} {{.CreatedAt}}\" \u001b[47D" + ], + [ + 0.030391, + "\u001b[1C .Name | printf \\\"%-64s\\\" }} {{.CreatedAt}}\" \u001b[47D" + ], + [ + 0.121577, + "\u001b[1C .Name | printf \\\"%-64s\\\" }} {{.CreatedAt}}\" \u001b[47D" + ], + [ + 0.167127, + "\b{{ .Name | printf \\\"%-64s\\\" }} {{.CreatedAt}}\" \u001b[47D" + ], + [ + 0.248096, + "\u001b[?1l\u001b>" + ], + [ + 0.000222, + "\u001b[?2004l\r\r\n" + ], + [ + 0.003167, + "\u001b]2;sudo kpod images --filter \"since=fedora:latest\" --format \u0007\u001b]1;kpod\u0007" + ], + [ + 0.095477, + "\u001b[34mINFO\u001b[0m[0000] [graphdriver] using prior storage driver \"overlay\" \r\n" + ], + [ + 0.003009, + "tabledocker.io/library/redis:latest Jul 24, 2017 18:37\r\n" + ], + [ + 0.000421, + "tabledocker.io/library/redis:alpine Jul 24, 2017 18:39\r\n" + ], + [ + 0.003381, + "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r" + ], + [ + 0.023509, + "\r\n\u001b[34m\u001b[01mcri-o\u001b[22m \u001b[90mgit/kpod-format-table \u001b[39m \u001b[33m\u001b[39m\r\n" + ], + [ + 0.001093, + "\u001b]7;file://localhost.localdomain/home/ryan/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007" + ], + [ + 5.4e-05, + "\u001b]2;ryan@localhost: ~/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007" + ], + [ + 2.3e-05, + "\u001b]1;..cubator/cri-o\u0007" + ], + [ + 0.000102, + "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[35m❯\u001b[39m \u001b[K\u001b[208C\u001b[90m\u001b[39m\u001b[208D" + ], + [ + 5.2e-05, + "\u001b[?1h\u001b=" + ], + [ + 2.1e-05, + "\u001b[?2004h" + ], + [ + 0.493915, + "sudo kpod images --filter \"since=fedora:latest\" --format \"table{{ .Name | printf \\\"%-64s\\\" }} {{.CreatedAt}}\"" + ], + [ + 4.023647, + "\u001b[?2004l\r\r\n" + ], + [ + 0.000724, + "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r" + ], + [ + 0.033033, + "\r\n\u001b[34m\u001b[01mcri-o\u001b[22m \u001b[90mgit/kpod-format-table \u001b[39m \u001b[33m\u001b[39m\r\n" + ], + [ + 0.001493, + "\u001b]7;file://localhost.localdomain/home/ryan/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007" + ], + [ + 0.00011, + "\u001b]2;ryan@localhost: ~/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007" + ], + [ + 5.3e-05, + "\u001b]1;..cubator/cri-o\u0007" + ], + [ + 7.4e-05, + "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[31m❯\u001b[39m " + ], + [ + 6.4e-05, + "\u001b[K\u001b[208C\u001b[90m\u001b[39m\u001b[208D\u001b[?1h\u001b=" + ], + [ + 4.6e-05, + "\u001b[?2004h" + ], + [ + 2.477293, + "r" + ], + [ + 0.095704, + "\brm" + ], + [ + 0.159753, + " " + ], + [ + 0.216552, + "k" + ], + [ + 0.168314, + "\u0007" + ], + [ + 0.000157, + "\r\r\n" + ], + [ + 7.6e-05, + "\u001b[J\u001b[38;5;40mkpod\u001b[0m* \u001b[Jkpod-images.json \u001b[Jkubernetes.md \u001b[J\u001b[A\u001b[0m\u001b[27m\u001b[24m\u001b[39m\r\u001b[2Crm k\u001b[K\u001b[204C\u001b[90m\u001b[39m\u001b[39m\u001b[204D" + ], + [ + 0.679935, + "p" + ], + [ + 0.233955, + "\r\r\n\u001b[J\u001b[A\u001b[7Cod" + ], + [ + 0.493364, + "i" + ], + [ + 0.2874, + "\b \b" + ], + [ + 0.208224, + "-" + ], + [ + 0.208753, + "i" + ], + [ + 0.079436, + "m" + ], + [ + 0.137168, + "ages.json\u001b[1m \u001b[0m" + ], + [ + 0.598602, + "\b\u001b[0m \b" + ], + [ + 0.000266, + "\u001b[?1l\u001b>\u001b[?2004l\r\r\n\u001b[J" + ], + [ + 0.004718, + "\u001b]2;rm kpod-images.json\u0007\u001b]1;rm\u0007" + ], + [ + 0.002042, + "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r" + ], + [ + 0.028039, + "\r\n\u001b[34m\u001b[01mcri-o\u001b[22m \u001b[90mgit/kpod-format-table \u001b[39m \u001b[33m\u001b[39m\r\n" + ], + [ + 0.000994, + "\u001b]7;file://localhost.localdomain/home/ryan/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007" + ], + [ + 0.000103, + "\u001b]2;ryan@localhost: ~/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007" + ], + [ + 1.4e-05, + "\u001b]1;..cubator/cri-o\u0007" + ], + [ + 6.4e-05, + "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[35m❯\u001b[39m \u001b[K\u001b[208C\u001b[90m\u001b[39m\u001b[208D" + ], + [ + 5.8e-05, + "\u001b[?1h\u001b=" + ], + [ + 2.6e-05, + "\u001b[?2004h" + ], + [ + 0.779169, + "g" + ], + [ + 0.136128, + "\bgi" + ], + [ + 0.048534, + "t" + ], + [ + 0.104105, + " " + ], + [ + 0.079724, + "s" + ], + [ + 0.104241, + "t" + ], + [ + 0.079697, + "a" + ], + [ + 0.11214, + "t" + ], + [ + 0.119676, + "u" + ], + [ + 0.208639, + "s" + ], + [ + 0.191009, + "\u001b[?1l\u001b>" + ], + [ + 3.6e-05, + "\u001b[?2004l" + ], + [ + 2.7e-05, + "\r\r\n" + ], + [ + 0.00253, + "\u001b]2;git status\u0007\u001b]1;git\u0007" + ], + [ + 0.017282, + "On branch kpod-format-table\r\nnothing to commit, working tree clean\r\n" + ], + [ + 0.000574, + "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r" + ], + [ + 0.036636, + "\r\n\u001b[34m\u001b[01mcri-o\u001b[22m \u001b[90mgit/kpod-format-table \u001b[39m \u001b[33m\u001b[39m\r\n" + ], + [ + 0.001716, + "\u001b]7;file://localhost.localdomain/home/ryan/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007" + ], + [ + 9.3e-05, + "\u001b]2;ryan@localhost: ~/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007" + ], + [ + 3.6e-05, + "\u001b]1;..cubator/cri-o\u0007" + ], + [ + 8.1e-05, + "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[35m❯\u001b[39m " + ], + [ + 4.9e-05, + "\u001b[K\u001b[208C\u001b[90m\u001b[39m\u001b[208D" + ], + [ + 4.6e-05, + "\u001b[?1h\u001b=\u001b[?2004h" + ], + [ + 0.75012, + "s" + ], + [ + 0.599165, + "\b \b" + ], + [ + 0.19198, + "m" + ], + [ + 0.064457, + "\bma" + ], + [ + 0.127947, + "k" + ], + [ + 0.136116, + "e" + ], + [ + 0.07172, + " " + ], + [ + 0.096215, + "k" + ], + [ + 0.071462, + "p" + ], + [ + 0.080589, + "o" + ], + [ + 0.10344, + "d" + ], + [ + 0.152208, + "\u001b[?1l\u001b>" + ], + [ + 5.1e-05, + "\u001b[?2004l\r\r\n" + ], + [ + 0.003042, + "\u001b]2;make kpod\u0007\u001b]1;make\u0007" + ], + [ + 6.729784, + "make: 'kpod' is up to date.\r\n" + ], + [ + 0.000291, + "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r" + ], + [ + 0.026264, + "\r\n\u001b[34m\u001b[01mcri-o\u001b[22m \u001b[90mgit/kpod-format-table \u001b[39m \u001b[33m7s\u001b[39m\r\n" + ], + [ + 0.001087, + "\u001b]7;file://localhost.localdomain/home/ryan/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007" + ], + [ + 7.6e-05, + "\u001b]2;ryan@localhost: ~/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007" + ], + [ + 1.9e-05, + "\u001b]1;..cubator/cri-o\u0007" + ], + [ + 7.5e-05, + "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[35m❯\u001b[39m \u001b[K\u001b[208C\u001b[90m\u001b[39m\u001b[208D" + ], + [ + 0.000122, + "\u001b[?1h\u001b=" + ], + [ + 2.8e-05, + "\u001b[?2004h" + ], + [ + 13.163278, + "s" + ], + [ + 0.168391, + "\bsu" + ], + [ + 0.127831, + "d" + ], + [ + 0.10395, + "o" + ], + [ + 0.223816, + " " + ], + [ + 0.12801, + "k" + ], + [ + 0.615488, + "\b \b" + ], + [ + 0.176737, + "m" + ], + [ + 0.040224, + "a" + ], + [ + 0.216001, + "k" + ], + [ + 0.120125, + "e" + ], + [ + 0.095559, + " " + ], + [ + 0.176055, + "i" + ], + [ + 0.087364, + "n" + ], + [ + 0.064466, + "s" + ], + [ + 0.096026, + "t" + ], + [ + 0.128305, + "a" + ], + [ + 0.159057, + "l" + ], + [ + 0.152629, + "l" + ], + [ + 1.088301, + "\u001b[?1l\u001b>" + ], + [ + 0.000115, + "\u001b[?2004l\r\r\n" + ], + [ + 0.008092, + "\u001b]2;sudo make install\u0007\u001b]1;make\u0007" + ], + [ + 0.035813, + "mkdir -p \"/home/ryan/Development/Go/src/github.com/kubernetes-incubator/cri-o/_output/src/github.com/kubernetes-incubator\"\r\n" + ], + [ + 0.003636, + "ln -s \"/home/ryan/Development/Go/src/github.com/kubernetes-incubator/cri-o\" \"/home/ryan/Development/Go/src/github.com/kubernetes-incubator/cri-o/_output/src/github.com/kubernetes-incubator\"\r\n" + ], + [ + 0.001734, + "touch \"/home/ryan/Development/Go/src/github.com/kubernetes-incubator/cri-o/_output/.gopathok\"\r\n" + ], + [ + 0.001583, + "install -D -m 755 crio /usr/local/bin/crio\r\n" + ], + [ + 0.053752, + "install -D -m 755 crioctl /usr/local/bin/crioctl\r\n" + ], + [ + 0.032266, + "install -D -m 755 kpod /usr/local/bin/kpod\r\n" + ], + [ + 0.046161, + "install -D -m 755 conmon/conmon /usr/local/libexec/crio/conmon\r\n" + ], + [ + 0.003465, + "install -D -m 755 pause/pause /usr/local/libexec/crio/pause\r\n" + ], + [ + 0.004506, + "install -d -m 755 /usr/local/share/man/man1\r\n" + ], + [ + 0.000924, + "install -d -m 755 /usr/local/share/man/man5\r\n" + ], + [ + 0.000709, + "install -d -m 755 /usr/local/share/man/man8\r\n" + ], + [ + 0.000731, + "install -m 644 docs/kpod-diff.1 docs/kpod-push.1 docs/kpod-cp.1 docs/kpod.1 docs/kpod-export.1 docs/kpod-load.1 docs/kpod-logs.1 docs/kpod-images.1 docs/kpod-umount.1 docs/kpod-save.1 docs/kpod-mount.1 docs/kpod-info.1 docs/kpod-inspect.1 docs/kpod-history.1 docs/kpod-pull.1 docs/kpod-rmi.1 docs/kpod-version.1 docs/kpod-tag.1 -t /usr/local/share/man/man1\r\n" + ], + [ + 0.014923, + "install -m 644 docs/crio.conf.5 -t /usr/local/share/man/man5\r\n" + ], + [ + 0.006695, + "install -m 644 docs/crio.8 -t /usr/local/share/man/man8\r\n" + ], + [ + 0.005468, + "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r" + ], + [ + 0.030073, + "\r\n\u001b[34m\u001b[01mcri-o\u001b[22m \u001b[90mgit/kpod-format-table \u001b[39m \u001b[33m\u001b[39m\r\n" + ], + [ + 0.00096, + "\u001b]7;file://localhost.localdomain/home/ryan/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007" + ], + [ + 8.4e-05, + "\u001b]2;ryan@localhost: ~/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007" + ], + [ + 2.4e-05, + "\u001b]1;..cubator/cri-o\u0007" + ], + [ + 8.2e-05, + "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[35m❯\u001b[39m " + ], + [ + 2.2e-05, + "\u001b[K\u001b[208C\u001b[90m\u001b[39m\u001b[208D" + ], + [ + 3.6e-05, + "\u001b[?1h\u001b=" + ], + [ + 2.5e-05, + "\u001b[?2004h" + ], + [ + 1.588728, + "s" + ], + [ + 0.158798, + "\bsu" + ], + [ + 0.12764, + "d" + ], + [ + 0.088209, + "o" + ], + [ + 0.160458, + " " + ], + [ + 0.152138, + "." + ], + [ + 0.200633, + "/" + ], + [ + 0.343621, + "\b \b" + ], + [ + 0.142987, + "\b \b" + ], + [ + 0.336517, + "k" + ], + [ + 0.192818, + "p" + ], + [ + 0.079464, + "o" + ], + [ + 0.167625, + "d" + ], + [ + 0.160306, + " " + ], + [ + 0.49613, + "i" + ], + [ + 0.120488, + "m" + ], + [ + 0.247645, + "a" + ], + [ + 0.160515, + "g" + ], + [ + 0.087028, + "e" + ], + [ + 0.072479, + "s" + ], + [ + 0.08742, + " " + ], + [ + 0.120873, + "-" + ], + [ + 0.127862, + "-" + ], + [ + 0.119898, + "f" + ], + [ + 0.12007, + "o" + ], + [ + 0.127375, + "r" + ], + [ + 0.111896, + "m" + ], + [ + 0.088551, + "a" + ], + [ + 0.119081, + "t" + ], + [ + 0.144899, + " " + ], + [ + 0.40945, + "{" + ], + [ + 0.598946, + "\b \b" + ], + [ + 0.497455, + "\"" + ], + [ + 0.498444, + "t" + ], + [ + 0.107574, + "a" + ], + [ + 0.143907, + "b" + ], + [ + 0.136371, + "l" + ], + [ + 0.119485, + "e" + ], + [ + 0.080146, + " " + ], + [ + 0.336807, + "{" + ], + [ + 0.231791, + "{" + ], + [ + 0.271322, + "." + ], + [ + 0.319863, + "I" + ], + [ + 0.160571, + "D" + ], + [ + 0.415578, + "}" + ], + [ + 0.424342, + "}" + ], + [ + 0.264361, + "\"" + ], + [ + 0.431581, + "\u001b[?1l\u001b>" + ], + [ + 6.9e-05, + "\u001b[?2004l" + ], + [ + 5.4e-05, + "\r\r\n" + ], + [ + 0.004691, + "\u001b]2;sudo kpod images --format \"table {{.ID}}\"\u0007\u001b]1;kpod\u0007" + ], + [ + 0.096877, + "IMAGE ID \r\n3edb693215a22336c352ba66d101fafda7e2ecbad1ecf2137e1c495e461d8f23\r\n1adfcf922a991e2d59a98dd2b5adc813b590261737d77c3ec7ae23e4f927d6bb\r\n524b9482e987a953b81321580372c07c3c765ce7c336445797428658384c6812\r\n9518288ded9bd43a055a4022d84c440b3ac16981f943bb099b60e0984e9e23d2\r\n" + ], + [ + 0.003109, + "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r" + ], + [ + 0.024093, + "\r\n\u001b[34m\u001b[01mcri-o\u001b[22m \u001b[90mgit/kpod-format-table \u001b[39m \u001b[33m\u001b[39m\r\n" + ], + [ + 0.001338, + "\u001b]7;file://localhost.localdomain/home/ryan/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007" + ], + [ + 0.00015, + "\u001b]2;ryan@localhost: ~/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007" + ], + [ + 2.2e-05, + "\u001b]1;..cubator/cri-o\u0007" + ], + [ + 0.000103, + "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[35m❯\u001b[39m \u001b[K\u001b[208C\u001b[90m\u001b[39m\u001b[208D" + ], + [ + 5.9e-05, + "\u001b[?1h\u001b=" + ], + [ + 2.6e-05, + "\u001b[?2004h" + ], + [ + 5.653254, + "w" + ], + [ + 0.123493, + "\bwh" + ], + [ + 0.080798, + "i" + ], + [ + 0.127546, + "c" + ], + [ + 0.112514, + "h" + ], + [ + 0.079037, + " " + ], + [ + 0.129196, + "k" + ], + [ + 0.135422, + "p" + ], + [ + 0.076117, + "o" + ], + [ + 0.116658, + "d" + ], + [ + 0.144849, + "\u001b[?1l\u001b>\u001b[?2004l\r\r\n" + ], + [ + 0.002681, + "\u001b]2;( alias; declare -f; ) | /usr/bin/which --tty-only --read-alias --show-tilde\u0007\u001b]1;which\u0007" + ], + [ + 0.004242, + "/usr/local/bin/kpod\r\n" + ], + [ + 0.000126, + "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r" + ], + [ + 0.026103, + "\r\n\u001b[34m\u001b[01mcri-o\u001b[22m \u001b[90mgit/kpod-format-table \u001b[39m \u001b[33m\u001b[39m\r\n" + ], + [ + 0.002394, + "\u001b]7;file://localhost.localdomain/home/ryan/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007" + ], + [ + 0.000493, + "\u001b]2;ryan@localhost: ~/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007\u001b]1;..cubator/cri-o\u0007" + ], + [ + 0.000187, + "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[35m❯\u001b[39m \u001b[K\u001b[208C\u001b[90m\u001b[39m\u001b[208D" + ], + [ + 7.9e-05, + "\u001b[?1h\u001b=" + ], + [ + 6.2e-05, + "\u001b[?2004h" + ], + [ + 86.650128, + "m" + ], + [ + 0.161011, + "\bma" + ], + [ + 0.655411, + "k" + ], + [ + 0.103692, + "e" + ], + [ + 0.063223, + " " + ], + [ + 0.09703, + "k" + ], + [ + 0.119343, + "p" + ], + [ + 0.049093, + "o" + ], + [ + 0.303802, + "d" + ], + [ + 0.144347, + "\u001b[?1l\u001b>" + ], + [ + 4.4e-05, + "\u001b[?2004l\r\r\n" + ], + [ + 0.004019, + "\u001b]2;make kpod\u0007\u001b]1;make\u0007" + ], + [ + 6.725858, + "go build -ldflags '-X main.gitCommit=99495909 -X main.buildInfo=1502916060' -tags \"selinux seccomp \" -o kpod github.com/kubernetes-incubator/cri-o/cmd/kpod\r\n" + ], + [ + 4.213403, + "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r" + ], + [ + 0.018496, + "\r\n\u001b[34m\u001b[01mcri-o\u001b[22m \u001b[90mgit/kpod-format-table* \u001b[39m \u001b[33m11s\u001b[39m\r\n" + ], + [ + 0.001197, + "\u001b]7;file://localhost.localdomain/home/ryan/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007" + ], + [ + 0.000111, + "\u001b]2;ryan@localhost: ~/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007" + ], + [ + 2e-05, + "\u001b]1;..cubator/cri-o\u0007" + ], + [ + 0.000112, + "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[35m❯\u001b[39m \u001b[K\u001b[208C\u001b[90m\u001b[39m\u001b[208D" + ], + [ + 5.6e-05, + "\u001b[?1h\u001b=" + ], + [ + 8e-05, + "\u001b[?2004h" + ], + [ + 0.768399, + "s" + ], + [ + 0.111451, + "\bsu" + ], + [ + 0.096019, + "d" + ], + [ + 0.103589, + "o" + ], + [ + 0.104726, + " " + ], + [ + 0.079095, + "k" + ], + [ + 0.177292, + "p" + ], + [ + 0.358902, + "\b \b" + ], + [ + 0.12001, + "\b \b" + ], + [ + 0.167745, + "m" + ], + [ + 0.096101, + "a" + ], + [ + 0.096699, + "k" + ], + [ + 0.088325, + "e" + ], + [ + 0.087158, + " " + ], + [ + 0.064768, + "i" + ], + [ + 0.071949, + "n" + ], + [ + 0.048283, + "s" + ], + [ + 0.095575, + "t" + ], + [ + 0.080741, + "a" + ], + [ + 0.135503, + "l" + ], + [ + 0.111733, + "l" + ], + [ + 0.135263, + "\u001b[?1l\u001b>" + ], + [ + 0.000111, + "\u001b[?2004l\r\r\n" + ], + [ + 0.001633, + "\u001b]2;sudo make install\u0007\u001b]1;make\u0007" + ], + [ + 3.04395, + "install -D -m 755 crio /usr/local/bin/crio\r\n" + ], + [ + 0.05693, + "install -D -m 755 crioctl /usr/local/bin/crioctl\r\n" + ], + [ + 0.033176, + "install -D -m 755 kpod /usr/local/bin/kpod\r\n" + ], + [ + 0.04205, + "install -D -m 755 conmon/conmon /usr/local/libexec/crio/conmon\r\n" + ], + [ + 0.002903, + "install -D -m 755 pause/pause /usr/local/libexec/crio/pause\r\n" + ], + [ + 0.004348, + "install -d -m 755 /usr/local/share/man/man1\r\n" + ], + [ + 0.000355, + "install -d -m 755 /usr/local/share/man/man5\r\n" + ], + [ + 0.000615, + "install -d -m 755 /usr/local/share/man/man8\r\n" + ], + [ + 0.000636, + "install -m 644 docs/kpod-diff.1 docs/kpod-push.1 docs/kpod-cp.1 docs/kpod.1 docs/kpod-export.1 docs/kpod-load.1 docs/kpod-logs.1 docs/kpod-images.1 docs/kpod-umount.1 docs/kpod-save.1 docs/kpod-mount.1 docs/kpod-info.1 docs/kpod-inspect.1 docs/kpod-history.1 docs/kpod-pull.1 docs/kpod-rmi.1 docs/kpod-version.1 docs/kpod-tag.1 -t /usr/local/share/man/man1\r\n" + ], + [ + 0.011201, + "install -m 644 docs/crio.conf.5 -t /usr/local/share/man/man5\r\n" + ], + [ + 0.004078, + "install -m 644 docs/crio.8 -t /usr/local/share/man/man8\r\n" + ], + [ + 0.00848, + "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r" + ], + [ + 0.020721, + "\r\n\u001b[34m\u001b[01mcri-o\u001b[22m \u001b[90mgit/kpod-format-table* \u001b[39m \u001b[33m\u001b[39m\r\n" + ], + [ + 0.001114, + "\u001b]7;file://localhost.localdomain/home/ryan/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007" + ], + [ + 9.5e-05, + "\u001b]2;ryan@localhost: ~/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007" + ], + [ + 2.1e-05, + "\u001b]1;..cubator/cri-o\u0007" + ], + [ + 0.000165, + "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[35m❯\u001b[39m \u001b[K\u001b[208C\u001b[90m\u001b[39m\u001b[208D\u001b[?1h\u001b=\u001b[?2004h" + ], + [ + 388.817771, + "v" + ], + [ + 0.052535, + "\bvi" + ], + [ + 0.099467, + " " + ], + [ + 0.312442, + "m" + ], + [ + 0.159718, + "c" + ], + [ + 0.207542, + "\b \b" + ], + [ + 0.111893, + "\b \b" + ], + [ + 0.088207, + "c" + ], + [ + 0.120601, + "m" + ], + [ + 0.122793, + "d\u001b[1m/\u001b[0m" + ], + [ + 0.06091, + "\b\u001b[0m/k" + ], + [ + 0.12778, + "pod\u001b[1m/\u001b[0m" + ], + [ + 0.339925, + "\b\u001b[0m/r" + ], + [ + 0.124315, + "m" + ], + [ + 0.119998, + "i.go\u001b[1m \u001b[0m" + ], + [ + 0.071475, + "\b\u001b[0m i" + ], + [ + 0.511445, + "\b \b" + ], + [ + 0.145079, + "\b" + ], + [ + 0.195924, + "\u001b[?1l\u001b>" + ], + [ + 0.000365, + "\u001b[?2004l\r\r\n" + ], + [ + 0.008801, + "\u001b]2;vim cmd/kpod/rmi.go\u0007\u001b]1;vi\u0007" + ], + [ + 0.134848, + "\u001b[?2004h\u001b[?1049h\u001b[?1h\u001b=\u001b[?2004h" + ], + [ + 0.000609, + "\u001b[1;52r\u001b[?12;25h\u001b[?12l\u001b[?25h\u001b[27m\u001b[23m\u001b[m\u001b[93m\u001b[107m\u001b[H\u001b[2J\u001b[?25l\u001b[52;1H\"cmd/kpod/rmi.go\"" + ], + [ + 0.000144, + " 123L, 3096C" + ], + [ + 0.008903, + "\u001b[2;1H▽\u001b[6n\u001b[2;1H \u001b[1;1H\u001b[>c" + ], + [ + 0.001667, + "\u001b[1;1H\u001b[96m\u001b[47m 1 \u001b[m\u001b[93m\u001b[107m\u001b[32mpackage\u001b[m\u001b[93m\u001b[107m main\r\n\u001b[96m\u001b[47m 2 \r\n 3 \u001b[m\u001b[93m\u001b[107m\u001b[32mimport\u001b[m\u001b[93m\u001b[107m (\r\n\u001b[96m\u001b[47m 4 \u001b[m\u001b[93m\u001b[107m \u001b[36m\"fmt\"\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m 5 \r\n 6 \u001b[m\u001b[93m\u001b[107m \u001b[36m\"github.com/containers/storage\"\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m 7 \u001b[m\u001b[93m\u001b[107m libkpodimage \u001b[36m\"github.com/kubernetes-incubator/cri-o/libkpod/image\"\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m 8 \u001b[m\u001b[93m\u001b[107m \u001b[36m\"github.com/pkg/errors\"\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m 9 \u001b[m\u001b[93m\u001b[107m \u001b[36m\"github.com/urfave/cli\"\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m 10 \u001b[m\u001b[93m\u001b[107m)\r\n\u001b[96m\u001b[47m 11 \r\n 12 \u001b[m\u001b[93m\u001b[107m\u001b[32mvar\u001b[m\u001b[93m\u001b[107m (\r\n\u001b[96m\u001b[47m 13 \u001b[m\u001b[93m\u001b[107m rmiDescription = \u001b[36m\"removes one or more locally stored images.\"\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m 14 \u001b[m\u001b[93m\u001b[107m rmiFlags\u001b[7C= []cli.Flag{\r\n\u001b[96m\u001b[47m 15 \u001b[m\u001b[93m\u001b[107m\u001b[8Ccli.BoolFlag{\r\n\u001b[96m\u001b[47m 16 \u001b[m\u001b[93m\u001b[107m\u001b[12CName: \u001b[36m\"force, f\"\u001b[m\u001b[93m\u001b[107m,\r\n\u001b[96m\u001b[47m 17 \u001b[m\u001b[93m\u001b[107m\u001b[12CUsage: \u001b[36m\"force removal of the image\"\u001b[m\u001b[93m\u001b[107m,\r\n\u001b[" + ], + [ + 2e-05, + "96m\u001b[47m 18 \u001b[m\u001b[93m\u001b[107m\u001b[8C},\r\n\u001b[96m\u001b[47m 19 \u001b[m\u001b[93m\u001b[107m }\r\n\u001b[96m\u001b[47m 20 \u001b[m\u001b[93m\u001b[107m rmiCommand = cli.Command{\r\n\u001b[96m\u001b[47m 21 \u001b[m\u001b[93m\u001b[107m\u001b[8CName:\u001b[8C\u001b[36m\"rmi\"\u001b[m\u001b[93m\u001b[107m,\r\n\u001b[96m\u001b[47m 22 \u001b[m\u001b[93m\u001b[107m\u001b[8CUsage:\u001b[7C\u001b[36m\"removes one or more images from local storage\"\u001b[m\u001b[93m\u001b[107m,\r\n\u001b[96m\u001b[47m 23 \u001b[m\u001b[93m\u001b[107m\u001b[8CDescription: rmiDescription,\r\n\u001b[96m\u001b[47m 24 \u001b[m\u001b[93m\u001b[107m\u001b[8CAction: rmiCmd,\r\n\u001b[96m\u001b[47m 25 \u001b[m\u001b[93m\u001b[107m\u001b[8CArgsUsage: \u001b[36m\"IMAGE-NAME-OR-ID [...]\"\u001b[m\u001b[93m\u001b[107m,\r\n\u001b[96m\u001b[47m 26 \u001b[m\u001b[93m\u001b[107m\u001b[8CFlags:\u001b[7CrmiFlags,\r\n\u001b[96m\u001b[47m 27 \u001b[m\u001b[93m\u001b[107m }\r\n\u001b[96m\u001b[47m 28 \u001b[m\u001b[93m\u001b[107m)\r\n\u001b[96m\u001b[47m 29 \r\n 30 \u001b[m\u001b[93m\u001b[107m\u001b[32mfunc\u001b[m\u001b[93m\u001b[107m rmiCmd(c *cli.Context) \u001b[33merror\u001b[m\u001b[93m\u001b[107m {\r\n\u001b[96m\u001b[47m 31 \r\n 32 \u001b[m\u001b[93m\u001b[107m force := \u001b[36mfalse\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m 33 \u001b[m\u001b[93m\u001b[107m \u001b[32mif\u001b[m\u001b[93m\u001b[107m c.IsSet(\u001b[36m\"force\"\u001b[m\u001b[93m\u001b[107m) {\r\n\u001b[96m\u001b[47m 34 \u001b[m\u001b[93m\u001b[107m\u001b[8Cforce = c.Bool(\u001b[36m\"force\"\u001b[m\u001b[93m\u001b[107m)\r\n\u001b[96m\u001b[47m 35 \u001b[m\u001b[93m" + ], + [ + 0.028983, + "\u001b[107m }\r\n\u001b[96m\u001b[47m 36 \r\n 37 \u001b[m\u001b[93m\u001b[107m args := c.Args()\r\n\u001b[96m\u001b[47m 38 \u001b[m\u001b[93m\u001b[107m \u001b[32mif\u001b[m\u001b[93m\u001b[107m \u001b[32mlen\u001b[m\u001b[93m\u001b[107m(args) == \u001b[36m0\u001b[m\u001b[93m\u001b[107m {\r\n\u001b[96m\u001b[47m 39 \u001b[m\u001b[93m\u001b[107m\u001b[8C\u001b[32mreturn\u001b[m\u001b[93m\u001b[107m errors.Errorf(\u001b[36m\"image name or ID must be specified\"\u001b[m\u001b[93m\u001b[107m)\r\n\u001b[96m\u001b[47m 40 \u001b[m\u001b[93m\u001b[107m }\r\n\u001b[96m\u001b[47m 41 \r\n 42 \u001b[m\u001b[93m\u001b[107m config, err := getConfig(c)\r\n\u001b[96m\u001b[47m 43 \u001b[m\u001b[93m\u001b[107m \u001b[32mif\u001b[m\u001b[93m\u001b[107m err != \u001b[36mnil\u001b[m\u001b[93m\u001b[107m {\r\n\u001b[96m\u001b[47m 44 \u001b[m\u001b[93m\u001b[107m\u001b[8C\u001b[32mreturn\u001b[m\u001b[93m\u001b[107m errors.Wrapf(err, \u001b[36m\"Could not get config\"\u001b[m\u001b[93m\u001b[107m)\r\n\u001b[96m\u001b[47m 45 \u001b[m\u001b[93m\u001b[107m }\r\n\u001b[96m\u001b[47m 46 \u001b[m\u001b[93m\u001b[107m store, err := getStore(config)\r\n\u001b[96m\u001b[47m 47 \u001b[m\u001b[93m\u001b[107m \u001b[32mif\u001b[m\u001b[93m\u001b[107m err != \u001b[36mnil\u001b[m\u001b[93m\u001b[107m {\r\n\u001b[96m\u001b[47m 48 \u001b[m\u001b[93m\u001b[107m\u001b[8C\u001b[32mreturn\u001b[m\u001b[93m\u001b[107m err\r\n\u001b[96m\u001b[47m 49 \u001b[m\u001b[93m\u001b[107m }\r\n\u001b[96m\u001b[47m 50 \u001b[m\u001b[93m\u001b[107m\r\n\u001b[1m\u001b[38;5;22m\u001b[48;5;148m NORMAL \u001b[m\u001b[93m\u001b[107m\u001b[38;5;148m\u001b[48;5;240m\u001b[51;10H \u001b[m\u001b[93m" + ], + [ + 2.8e-05, + "\u001b[107m\u001b[38;5;250m\u001b[48;5;240m\u001b[51;12H kpod-format-table \u001b[m\u001b[93m\u001b[107m\u001b[38;5;245m\u001b[48;5;240m\u001b[51;32H \u001b[m\u001b[93m\u001b[107m\u001b[38;5;250m\u001b[48;5;240mcmd/kpod/\u001b[m\u001b[93m\u001b[107m\u001b[1m\u001b[38;5;231m\u001b[48;5;240mrmi.go \u001b[m\u001b[93m\u001b[107m\u001b[38;5;240m\u001b[48;5;236m\u001b[51;50H \u001b[m\u001b[93m\u001b[107m\u001b[38;5;231m\u001b[48;5;236m                                                                                                                             \u001b[m\u001b[93m\u001b[107m\u001b[38;5;247m\u001b[48;5;236munix\u001b[m\u001b[93m\u001b[107m\u001b[38;5;244m\u001b[48;5;236m \u001b[m\u001b[93m\u001b[107m\u001b[51;182H\u001b[38;5;247m\u001b[48;5;236m utf-8\u001b[m\u001b[93m\u001b[107m\u001b[38;5;244m\u001b[48;5;236m \u001b[m\u001b[93m\u001b[107m\u001b[51;190H\u001b[38;5;247m\u001b[48;5;236m go\u001b[m\u001b[93m\u001b[107m\u001b[38;5;240m\u001b[48;5;236m \u001b[m\u001b[93m\u001b[107m\u001b[51;195H\u001b[38;5;70m\u001b[48;5;240m   1%\u001b[m\u001b[93m\u001b[107m\u001b[38;5;252m\u001b[48;5;240m \u001b[m\u001b[93m\u001b[107m\u001b[51;202H\u001b[38;5;235m\u001b[48;5;252m \u001b[51;204H \u001b[m\u001b[93m\u001b[107m\u001b[1m\u001b[38;5;235m\u001b[48;5;252m  1\u001b[m\u001b[93m" + ], + [ + 0.009152, + "\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:1  \u001b[1;5H\u001b[?12l\u001b[?25h\u001bP+q436f\u001b\\\u001bP+q6b75\u001b\\\u001bP+q6b64\u001b\\\u001bP+q6b72\u001b\\\u001bP+q6b6c\u001b\\\u001bP+q2332\u001b\\\u001bP+q2334\u001b\\\u001bP+q2569\u001b\\\u001bP+q2a37\u001b\\\u001bP+q6b31\u001b\\" + ], + [ + 0.418144, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[52;1H\u001b[K\u001b[52;1H/\u001b[?2004h" + ], + [ + 6.9e-05, + "\u001b[?12l\u001b[?25h" + ], + [ + 0.594911, + "m\u001b[?25l" + ], + [ + 0.011367, + "\u001b[1;13H\u001b[7m\u001b[91mm\u001b[27m\u001b[m\u001b[93m\u001b[107m\u001b[51;2H\u001b[1m\u001b[38;5;22m\u001b[48;5;148mCOMMND \u001b[m\u001b[93m\u001b[107m\u001b[200C\u001b[38;5;22m\u001b[48;5;252m9\r\n\u001b[m\u001b[93m\u001b[107m/m\u001b[?12l\u001b[?25h" + ], + [ + 0.22557, + "u\u001b[?25l" + ], + [ + 0.014952, + "\u001b[1;13Hm\u001b[39;52H\u001b[7m\u001b[91mmu\u001b[27m\u001b[m\u001b[93m\u001b[107m\u001b[51;195H\u001b[38;5;107m\u001b[48;5;240m  32%\u001b[m\u001b[93m\u001b[107m\u001b[6C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m39\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:48\r\n\u001b[m\u001b[93m\u001b[107m/mu\u001b[?12l\u001b[?25h" + ], + [ + 0.081033, + "s\u001b[?25l" + ], + [ + 0.011335, + "\u001b[39;54H\u001b[7m\u001b[91ms\u001b[52;5H\u001b[?12l\u001b[?25h" + ], + [ + 0.076678, + "\u001b[27m\u001b[m\u001b[93m\u001b[107mt\u001b[?25l" + ], + [ + 0.012142, + "\u001b[39;55H\u001b[7m\u001b[91mt\u001b[52;6H\u001b[?12l\u001b[?25h" + ], + [ + 0.180332, + "\u001b[?25l" + ], + [ + 0.008175, + "\u001b[39;56H \u001b[52;7H\u001b[?12l\u001b[?25h" + ], + [ + 0.087385, + "\u001b[27m\u001b[m\u001b[93m\u001b[107mf\u001b[?25l" + ], + [ + 0.011478, + "\u001b[1;50r\u001b[1;1H\u001b[19M\u001b[1;52r\u001b[20;52H\u001b[36mmust \u001b[m\u001b[93m\u001b[107m\u001b[32;1H\u001b[96m\u001b[47m 51 \u001b[m\u001b[93m\u001b[107m \u001b[32mfor\u001b[m\u001b[93m\u001b[107m _, id := \u001b[32mrange\u001b[m\u001b[93m\u001b[107m args {\r\n\u001b[96m\u001b[47m 52 \u001b[m\u001b[93m\u001b[107m\u001b[8Cimage, err := libkpodimage.FindImage(store, id)\r\n\u001b[96m\u001b[47m 53 \u001b[m\u001b[93m\u001b[107m\u001b[8C\u001b[32mif\u001b[m\u001b[93m\u001b[107m err != \u001b[36mnil\u001b[m\u001b[93m\u001b[107m {\r\n\u001b[96m\u001b[47m 54 \u001b[m\u001b[93m\u001b[107m\u001b[12C\u001b[32mreturn\u001b[m\u001b[93m\u001b[107m errors.Wrapf(err, \u001b[36m\"could not get image \u001b[m\u001b[93m\u001b[107m\u001b[31m%q\u001b[m\u001b[93m\u001b[107m\u001b[36m\"\u001b[m\u001b[93m\u001b[107m, id)\r\n\u001b[96m\u001b[47m 55 \u001b[m\u001b[93m\u001b[107m\u001b[8C}\r\n\u001b[96m\u001b[47m 56 \u001b[m\u001b[93m\u001b[107m\u001b[8C\u001b[32mif\u001b[m\u001b[93m\u001b[107m image != \u001b[36mnil\u001b[m\u001b[93m\u001b[107m {\r\n\u001b[96m\u001b[47m 57 \u001b[m\u001b[93m\u001b[107m\u001b[12CctrIDs, err := runningContainers(image, store)\r\n\u001b[96m\u001b[47m 58 \u001b[m\u001b[93m\u001b[107m\u001b[12C\u001b[32mif\u001b[m\u001b[93m\u001b[107m err != \u001b[36mnil\u001b[m\u001b[93m\u001b[107m {\r\n\u001b[96m\u001b[47m 59 \u001b[m\u001b[93m\u001b[107m\u001b[16C\u001b[32mreturn\u001b[m\u001b[93m\u001b[107m errors.Wrapf(err, \u001b[36m\"error getting running containers for image \u001b[m\u001b[93m\u001b[107m\u001b[31m%q\u001b[m\u001b[93m\u001b[107m\u001b[36m\"\u001b[m\u001b[93m\u001b[107m, id)\r\n\u001b[96m\u001b[47m 60 \u001b[m\u001b[93m\u001b[107m\u001b[12C}\r\n\u001b[96m\u001b[47m 61" + ], + [ + 2.8e-05, + " \u001b[m\u001b[93m\u001b[107m\u001b[12C\u001b[32mif\u001b[m\u001b[93m\u001b[107m \u001b[32mlen\u001b[m\u001b[93m\u001b[107m(ctrIDs) > \u001b[36m0\u001b[m\u001b[93m\u001b[107m && \u001b[32mlen\u001b[m\u001b[93m\u001b[107m(image.Names) <= \u001b[36m1\u001b[m\u001b[93m\u001b[107m {\r\n\u001b[96m\u001b[47m 62 \u001b[m\u001b[93m\u001b[107m\u001b[16C\u001b[32mif\u001b[m\u001b[93m\u001b[107m force {\r\n\u001b[96m\u001b[47m 63 \u001b[m\u001b[93m\u001b[107m\u001b[20CremoveContainers(ctrIDs, store)\r\n\u001b[96m\u001b[47m 64 \u001b[m\u001b[93m\u001b[107m\u001b[16C} \u001b[32melse\u001b[m\u001b[93m\u001b[107m {\r\n\u001b[96m\u001b[47m 65 \u001b[m\u001b[93m\u001b[107m\u001b[20C\u001b[32mfor\u001b[m\u001b[93m\u001b[107m ctrID := \u001b[32mrange\u001b[m\u001b[93m\u001b[107m ctrIDs {\r\n\u001b[96m\u001b[47m 66 \u001b[m\u001b[93m\u001b[107m\u001b[24C\u001b[32mreturn\u001b[m\u001b[93m\u001b[107m fmt.Errorf(\u001b[36m\"Could not remove image \u001b[m\u001b[93m\u001b[107m\u001b[31m%q\u001b[m\u001b[93m\u001b[107m\u001b[36m (\u001b[m\u001b[93m\u001b[107m\u001b[7m\u001b[91mmust f\u001b[27m\u001b[m\u001b[93m\u001b[107m\u001b[36morce) - container \u001b[m\u001b[93m\u001b[107m\u001b[31m%q\u001b[m\u001b[93m\u001b[107m\u001b[36m is using its reference image\"\u001b[m\u001b[93m\u001b[107m, id, ctrID)\r\n\u001b[96m\u001b[47m 67 \u001b[m\u001b[93m\u001b[107m\u001b[20C}\r\n\u001b[96m\u001b[47m 68 \u001b[m\u001b[93m\u001b[107m\u001b[16C}\r\n\u001b[96m\u001b[47m 69 \u001b[m\u001b[93m\u001b[107m\u001b[12C}\u001b[51;195H\u001b[38;5;107m\u001b[48;5;240m  54%\u001b[m\u001b[93m\u001b[107m\u001b[6C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m66\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:71\u001b[m\u001b[93m\u001b[107m\u001b[52;1H\u001b[K\u001b[52;1H/" + ], + [ + 2.2e-05, + "must f\u001b[?12l\u001b[?25h" + ], + [ + 0.084161, + "o\u001b[?25l" + ], + [ + 0.012305, + "\u001b[47;81H\u001b[7m\u001b[91mo\u001b[52;9H\u001b[?12l\u001b[?25h" + ], + [ + 0.116387, + "\u001b[27m\u001b[m\u001b[93m\u001b[107mr\u001b[?25l" + ], + [ + 0.011734, + "\u001b[47;82H\u001b[7m\u001b[91mr\u001b[52;10H\u001b[?12l\u001b[?25h" + ], + [ + 0.255362, + "\u001b[27m\u001b[m\u001b[93m\u001b[107mc\u001b[?25l" + ], + [ + 0.011191, + "\u001b[47;83H\u001b[7m\u001b[91mc\u001b[52;11H\u001b[?12l\u001b[?25h" + ], + [ + 0.0573, + "\u001b[27m\u001b[m\u001b[93m\u001b[107me\u001b[?25l" + ], + [ + 0.013394, + "\u001b[47;84H\u001b[7m\u001b[91me\u001b[52;12H\u001b[?12l\u001b[?25h" + ], + [ + 0.202815, + "\r\u001b[?25l" + ], + [ + 0.008924, + "\u001b[27m\u001b[m\u001b[93m\u001b[107m\u001b[47;75H\u001b[7m\u001b[33mmust force\u001b[m\u001b[93m\u001b[107m\u001b[51;2H\u001b[1m\u001b[38;5;22m\u001b[48;5;148mNORMAL \u001b[47;75H\u001b[?12l\u001b[?25h" + ], + [ + 1.635195, + "\u001b[?25l\u001b[1;50r\u001b[m\u001b[93m\u001b[107m\u001b[50;1H\r\n\u001b[1;52r\u001b[45;51H\u001b[1m\u001b[31m\u001b[106m{\u001b[47;25H}\u001b[m\u001b[93m\u001b[107m\r\n\r\n\r\n\u001b[96m\u001b[47m 70 \u001b[m\u001b[93m\u001b[107m\u001b[12C\u001b[96m// If the user supplied an ID, we cannot delete the image if it is referred to by multiple tags\u001b[m\u001b[93m\u001b[107m\u001b[52;1H\u001b[K\u001b[51;207H\u001b[1m\u001b[38;5;235m\u001b[48;5;252m7\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:2\u001b[47;25H\u001b[?12l\u001b[?25h" + ], + [ + 0.536079, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[45;51H{\u001b[47;25H}\u001b[51;207H\u001b[1m\u001b[38;5;235m\u001b[48;5;252m6\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:7\u001b[46;75H\u001b[?12l\u001b[?25h" + ], + [ + 0.422312, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[45;51H\u001b[1m\u001b[31m\u001b[106m{\u001b[47;25H}\u001b[m\u001b[93m\u001b[107m\u001b[51;195H\u001b[38;5;107m\u001b[48;5;240m  53%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m5\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:47\u001b[45;51H\u001b[?12l\u001b[?25h" + ], + [ + 7.590339, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m{\u001b[47;25H}\u001b[51;195H\u001b[38;5;107m\u001b[48;5;240m  54%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m6\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:71\u001b[46;75H\u001b[?12l\u001b[?25h" + ], + [ + 0.524344, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[45;51H\u001b[1m\u001b[31m\u001b[106m{\u001b[47;25H}\u001b[m\u001b[93m\u001b[107m\u001b[51;207H\u001b[1m\u001b[38;5;235m\u001b[48;5;252m7\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:2\u001b[47;25H\u001b[?12l\u001b[?25h" + ], + [ + 0.384796, + "\u001b[?25l\u001b[1;50r\u001b[m\u001b[93m\u001b[107m\u001b[50;1H\r\n\u001b[1;52r\u001b[43;28H\u001b[1m\u001b[31m\u001b[106m{\u001b[m\u001b[93m\u001b[107m\u001b[44;51H{\u001b[46;25H}\u001b[47;21H\u001b[1m\u001b[31m\u001b[106m}\u001b[m\u001b[93m\u001b[107m\r\n\r\n\r\n\u001b[96m\u001b[47m 71 \u001b[m\u001b[93m\u001b[107m\u001b[12C\u001b[32mif\u001b[m\u001b[93m\u001b[107m libkpodimage.MatchesID(image.ID, id) {\u001b[51;195H\u001b[38;5;107m\u001b[48;5;240m  55%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m8\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:17\u001b[47;21H\u001b[?12l\u001b[?25h" + ], + [ + 1.34616, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[43;28H{\u001b[44;51H\u001b[1m\u001b[31m\u001b[106m{\u001b[46;25H}\u001b[m\u001b[93m\u001b[107m\u001b[47;21H}\u001b[51;195H\u001b[38;5;107m\u001b[48;5;240m  54%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m7\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:21\u001b[46;25H\u001b[?12l\u001b[?25h" + ], + [ + 6.08698, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[44;51H{\u001b[46;25H}\u001b[51;207H\u001b[1m\u001b[38;5;235m\u001b[48;5;252m6\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:7\u001b[45;75H\u001b[?12l\u001b[?25h" + ], + [ + 0.759914, + "\u001b[51;210H2\u001b[45;76H" + ], + [ + 0.494462, + "\u001b[51;210H3\u001b[45;77H" + ], + [ + 0.033092, + "\u001b[51;210H4\u001b[45;78H" + ], + [ + 0.027331, + "\u001b[51;210H5\u001b[45;79H" + ], + [ + 0.032653, + "\u001b[51;210H6\u001b[45;80H" + ], + [ + 0.028729, + "\u001b[51;210H7\u001b[45;81H" + ], + [ + 0.034268, + "\u001b[51;210H8\u001b[45;82H" + ], + [ + 0.022711, + "\u001b[51;210H9\u001b[45;83H" + ], + [ + 0.033818, + "\u001b[51;209H80\u001b[45;84H" + ], + [ + 0.033041, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[45;74H\u001b[1m\u001b[31m\u001b[106m(\u001b[10C)\u001b[m\u001b[93m\u001b[107m\u001b[51;210H\u001b[38;5;22m\u001b[48;5;252m1\u001b[45;85H\u001b[?12l\u001b[?25h" + ], + [ + 0.029548, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[45;74H\u001b[36m(\u001b[m\u001b[93m\u001b[107m\u001b[7m\u001b[33mm\u001b[m\u001b[93m\u001b[107m\u001b[9C\u001b[36m) \u001b[m\u001b[93m\u001b[107m\u001b[51;210H\u001b[38;5;22m\u001b[48;5;252m2\u001b[45;86H\u001b[?12l\u001b[?25h" + ], + [ + 0.02919, + "\u001b[51;210H3\u001b[45;87H" + ], + [ + 0.030088, + "\u001b[51;210H4\u001b[45;88H" + ], + [ + 0.032142, + "\u001b[51;210H5\u001b[45;89H" + ], + [ + 0.03027, + "\u001b[51;210H6\u001b[45;90H" + ], + [ + 0.030009, + "\u001b[51;210H7\u001b[45;91H" + ], + [ + 0.031925, + "\u001b[51;210H8\u001b[45;92H" + ], + [ + 0.027725, + "\u001b[51;210H9\u001b[45;93H" + ], + [ + 0.031953, + "\u001b[51;209H90\u001b[45;94H" + ], + [ + 0.029383, + "\u001b[51;210H1\u001b[45;95H" + ], + [ + 0.030754, + "\u001b[51;210H2\u001b[45;96H" + ], + [ + 0.03042, + "\u001b[51;210H3\u001b[45;97H" + ], + [ + 0.030576, + "\u001b[51;210H4\u001b[45;98H" + ], + [ + 0.031217, + "\u001b[51;210H5\u001b[45;99H" + ], + [ + 0.031561, + "\u001b[51;210H6\u001b[45;100H" + ], + [ + 0.136981, + "\u001b[51;210H7\u001b[45;101H" + ], + [ + 8.584841, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[44;51H\u001b[1m\u001b[31m\u001b[106m{\u001b[46;25H}\u001b[m\u001b[93m\u001b[107m\u001b[51;207H\u001b[1m\u001b[38;5;235m\u001b[48;5;252m7\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:21\u001b[46;25H\u001b[?12l\u001b[?25h" + ], + [ + 0.501453, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[43;28H\u001b[1m\u001b[31m\u001b[106m{\u001b[m\u001b[93m\u001b[107m\u001b[44;51H{\u001b[46;25H}\u001b[47;21H\u001b[1m\u001b[31m\u001b[106m}\u001b[m\u001b[93m\u001b[107m\u001b[51;195H\u001b[38;5;107m\u001b[48;5;240m  55%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m8\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:17\u001b[47;21H\u001b[?12l\u001b[?25h" + ], + [ + 0.032681, + "\u001b[?25l\u001b[1;50r\u001b[m\u001b[93m\u001b[107m\u001b[50;1H\r\n\u001b[1;52r\u001b[39;61H\u001b[1m\u001b[31m\u001b[106m{\u001b[m\u001b[93m\u001b[107m\u001b[42;28H{\u001b[46;21H}\u001b[47;17H\u001b[1m\u001b[31m\u001b[106m}\u001b[m\u001b[93m\u001b[107m\r\n\r\n\r\n\u001b[96m\u001b[47m 72 \u001b[m\u001b[93m\u001b[107m\u001b[16C\u001b[32mif\u001b[m\u001b[93m\u001b[107m \u001b[32mlen\u001b[m\u001b[93m\u001b[107m(image.Names) > \u001b[36m1\u001b[m\u001b[93m\u001b[107m && !force {\u001b[51;195H\u001b[38;5;107m\u001b[48;5;240m  56%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m9\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:13\u001b[47;17H\u001b[?12l\u001b[?25h" + ], + [ + 0.026312, + "\u001b[?25l\u001b[1;50r\u001b[m\u001b[93m\u001b[107m\u001b[50;1H\r\n\u001b[1;52r\u001b[38;61H{\u001b[46;17H}\u001b[50;1H\u001b[96m\u001b[47m 73 \u001b[m\u001b[93m\u001b[107m\u001b[20C\u001b[32mreturn\u001b[m\u001b[93m\u001b[107m fmt.Errorf(\u001b[36m\"unable to delete \u001b[m\u001b[93m\u001b[107m\u001b[31m%s\u001b[m\u001b[93m\u001b[107m\u001b[36m (\u001b[m\u001b[93m\u001b[107m\u001b[7m\u001b[33mmust force\u001b[m\u001b[93m\u001b[107m\u001b[36m) - image is referred to in multiple tags\"\u001b[m\u001b[93m\u001b[107m, image.ID)\u001b[51;195H\u001b[38;5;107m\u001b[48;5;240m  57%\u001b[m\u001b[93m\u001b[107m\u001b[6C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m70\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:97\u001b[47;101H\u001b[?12l\u001b[?25h" + ], + [ + 0.027588, + "\u001b[?25l\u001b[1;50r\u001b[m\u001b[93m\u001b[107m\u001b[50;1H\r\n\u001b[1;52r\u001b[50;1H\u001b[96m\u001b[47m 74 \u001b[m\u001b[93m\u001b[107m\u001b[16C}\u001b[51;195H\u001b[38;5;107m\u001b[48;5;240m  58%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m1\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:53\u001b[47;57H\u001b[?12l\u001b[?25h" + ], + [ + 0.034204, + "\u001b[?25l\u001b[1;50r\u001b[m\u001b[93m\u001b[107m\u001b[50;1H\r\n\u001b[1;52r\u001b[47;55H\u001b[1m\u001b[31m\u001b[106m{\u001b[49;21H}\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m 75 \u001b[m\u001b[93m\u001b[107m\u001b[16C\u001b[96m// If it is forced, we have to untag the image so that it can be deleted\u001b[m\u001b[93m\u001b[107m\u001b[51;195H\u001b[38;5;107m\u001b[48;5;240m  59%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m2\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:51\u001b[47;55H\u001b[?12l\u001b[?25h" + ], + [ + 0.025136, + "\u001b[?25l\u001b[1;50r\u001b[m\u001b[93m\u001b[107m\u001b[50;1H\r\n\u001b[1;52r\u001b[46;55H{\u001b[48;21H}\r\n\r\n\u001b[96m\u001b[47m 76 \u001b[m\u001b[93m\u001b[107m\u001b[16Cimage.Names = image.Names[:\u001b[36m0\u001b[m\u001b[93m\u001b[107m]\u001b[51;207H\u001b[1m\u001b[38;5;235m\u001b[48;5;252m3\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:97\u001b[47;101H\u001b[?12l\u001b[?25h" + ], + [ + 0.037748, + "\u001b[?25l\u001b[1;50r\u001b[m\u001b[93m\u001b[107m\u001b[50;1H\r\n\u001b[1;52r\u001b[45;55H\u001b[1m\u001b[31m\u001b[106m{\u001b[47;21H}\u001b[m\u001b[93m\u001b[107m\r\n\r\n\r\n\u001b[96m\u001b[47m 77 \u001b[m\u001b[93m\u001b[107m\u001b[12C} \u001b[32melse\u001b[m\u001b[93m\u001b[107m {\u001b[51;195H\u001b[38;5;107m\u001b[48;5;240m  60%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m4\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:1\u001b[47;21H\u001b[?12l\u001b[?25h" + ], + [ + 0.029845, + "\u001b[?25l\u001b[1;50r\u001b[m\u001b[93m\u001b[107m\u001b[50;1H\r\n\u001b[1;52r\u001b[44;55H{\u001b[46;21H}\u001b[50;1H\u001b[96m\u001b[47m 78 \u001b[m\u001b[93m\u001b[107m\u001b[16Cname, err2 := libkpodimage.UntagImage(store, image, id)\u001b[51;195H\u001b[38;5;107m\u001b[48;5;240m  61%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m5\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:88\u001b[47;92H\u001b[?12l\u001b[?25h" + ], + [ + 0.029474, + "\u001b[?25l\u001b[1;50r\u001b[m\u001b[93m\u001b[107m\u001b[50;1H\r\n\u001b[1;52r\u001b[47;46H\u001b[1m\u001b[31m\u001b[106m[\u001b[2C]\u001b[m\u001b[93m\u001b[107m\r\n\r\n\r\n\u001b[96m\u001b[47m 79 \u001b[m\u001b[93m\u001b[107m\u001b[16C\u001b[32mif\u001b[m\u001b[93m\u001b[107m err2 != \u001b[36mnil\u001b[m\u001b[93m\u001b[107m {\u001b[51;195H\u001b[38;5;107m\u001b[48;5;240m  62%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m6\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:45\u001b[47;49H\u001b[?12l\u001b[?25h" + ], + [ + 0.027846, + "\u001b[?25l\u001b[1;50r\u001b[m\u001b[93m\u001b[107m\u001b[50;1H\r\n\u001b[1;52r\u001b[46;46H[:\u001b[1C]\u001b[50;1H\u001b[96m\u001b[47m 80 \u001b[m\u001b[93m\u001b[107m\u001b[20C\u001b[32mreturn\u001b[m\u001b[93m\u001b[107m err\u001b[51;195H\u001b[38;5;107m\u001b[48;5;240m  63%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m7\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:20\u001b[47;24H\u001b[?12l\u001b[?25h" + ], + [ + 0.028156, + "\u001b[?25l\u001b[1;50r\u001b[m\u001b[93m\u001b[107m\u001b[50;1H\r\n\u001b[1;52r\u001b[47;58H\u001b[1m\u001b[31m\u001b[106m(\u001b[16C)\u001b[m\u001b[93m\u001b[107m\r\n\r\n\r\n\u001b[96m\u001b[47m 81 \u001b[m\u001b[93m\u001b[107m\u001b[16C}\u001b[51;207H\u001b[1m\u001b[38;5;235m\u001b[48;5;252m8\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:71\u001b[47;75H\u001b[?12l\u001b[?25h" + ], + [ + 0.036773, + "\u001b[?25l\u001b[1;50r\u001b[m\u001b[93m\u001b[107m\u001b[50;1H\r\n\u001b[1;52r\u001b[46;58H(s\u001b[15C)\u001b[47;36H\u001b[1m\u001b[31m\u001b[106m{\u001b[49;21H}\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m 82 \u001b[m\u001b[93m\u001b[107m\u001b[16Cfmt.Printf(\u001b[36m\"untagged: \u001b[m\u001b[93m\u001b[107m\u001b[31m%s\u001b[m\u001b[93m\u001b[107m\u001b[36m\"\u001b[m\u001b[93m\u001b[107m, name)\u001b[51;195H\u001b[38;5;108m\u001b[48;5;240m  64%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m9\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:32\u001b[47;36H\u001b[?12l\u001b[?25h" + ], + [ + 0.029719, + "\u001b[?25l\u001b[1;50r\u001b[m\u001b[93m\u001b[107m\u001b[50;1H\r\n\u001b[1;52r\u001b[46;36H{\u001b[48;21H}\r\n\r\n\u001b[96m\u001b[47m 83 \u001b[m\u001b[93m\u001b[107m\u001b[12C}\u001b[51;195H\u001b[38;5;108m\u001b[48;5;240m  65%\u001b[m\u001b[93m\u001b[107m\u001b[6C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m80\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:30\u001b[47;34H\u001b[?12l\u001b[?25h" + ], + [ + 0.032707, + "\u001b[?25l\u001b[1;50r\u001b[m\u001b[93m\u001b[107m\u001b[50;1H\r\n\u001b[1;52r\u001b[45;36H\u001b[1m\u001b[31m\u001b[106m{\u001b[47;21H}\u001b[m\u001b[93m\u001b[107m\r\n\r\n\r\n\u001b[96m\u001b[47m 84 \u001b[m\u001b[93m\u001b[107m\u001b[51;195H\u001b[38;5;108m\u001b[48;5;240m  66%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m1\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:17\u001b[47;21H\u001b[?12l\u001b[?25h" + ], + [ + 0.026852, + "\u001b[?25l\u001b[1;50r\u001b[m\u001b[93m\u001b[107m\u001b[50;1H\r\n\u001b[1;52r\u001b[44;36H{\u001b[46;21H}\u001b[47;31H\u001b[1m\u001b[31m\u001b[106m(\u001b[20C)\u001b[m\u001b[93m\u001b[107m\r\n\r\n\r\n\u001b[96m\u001b[47m 85 \u001b[m\u001b[93m\u001b[107m\u001b[12C\u001b[32mif\u001b[m\u001b[93m\u001b[107m \u001b[32mlen\u001b[m\u001b[93m\u001b[107m(image.Names) > \u001b[36m0\u001b[m\u001b[93m\u001b[107m {\u001b[51;195H\u001b[38;5;108m\u001b[48;5;240m  67%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m2\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:48\u001b[47;52H\u001b[?12l\u001b[?25h" + ], + [ + 0.026473, + "\u001b[?25l\u001b[1;50r\u001b[m\u001b[93m\u001b[107m\u001b[50;1H\r\n\u001b[1;52r\u001b[41;24H\u001b[1m\u001b[31m\u001b[106m{\u001b[m\u001b[93m\u001b[107m\u001b[46;31H(\u001b[36m\"\u001b[m\u001b[93m\u001b[107m\u001b[19C)\u001b[47;17H\u001b[1m\u001b[31m\u001b[106m}\u001b[m\u001b[93m\u001b[107m\r\n\r\n\r\n\u001b[96m\u001b[47m 86 \u001b[m\u001b[93m\u001b[107m\u001b[16C\u001b[32mcontinue\u001b[m\u001b[93m\u001b[107m\u001b[51;207H\u001b[1m\u001b[38;5;235m\u001b[48;5;252m3\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:13\u001b[47;17H\u001b[?12l\u001b[?25h" + ], + [ + 0.032368, + "\u001b[?25l\u001b[1;50r\u001b[m\u001b[93m\u001b[107m\u001b[50;1H\r\n\u001b[1;52r\u001b[40;24H{\u001b[46;17H}\u001b[50;1H\u001b[96m\u001b[47m 87 \u001b[m\u001b[93m\u001b[107m\u001b[12C}\u001b[51;195H\u001b[38;5;108m\u001b[48;5;240m  68%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m4\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:1 \u001b[47;5H\u001b[?12l\u001b[?25h" + ], + [ + 0.03189, + "\u001b[?25l\u001b[1;50r\u001b[m\u001b[93m\u001b[107m\u001b[50;1H\r\n\u001b[1;52r\u001b[47;41H\u001b[1m\u001b[31m\u001b[106m{\u001b[49;17H}\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m 88 \u001b[m\u001b[93m\u001b[107m\u001b[12Cid, err := libkpodimage.RemoveImage(image, store)\u001b[51;195H\u001b[38;5;108m\u001b[48;5;240m  69%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m5\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:37\u001b[47;41H\u001b[?12l\u001b[?25h" + ], + [ + 0.036978, + "\u001b[?25l\u001b[1;50r\u001b[m\u001b[93m\u001b[107m\u001b[50;1H\r\n\u001b[1;52r\u001b[46;41H{\u001b[48;17H}\r\n\r\n\u001b[96m\u001b[47m 89 \u001b[m\u001b[93m\u001b[107m\u001b[12C\u001b[32mif\u001b[m\u001b[93m\u001b[107m err != \u001b[36mnil\u001b[m\u001b[93m\u001b[107m {\u001b[51;195H\u001b[38;5;108m\u001b[48;5;240m  70%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m6\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:24\u001b[47;28H\u001b[?12l\u001b[?25h" + ], + [ + 0.031976, + "\u001b[?25l\u001b[1;50r\u001b[m\u001b[93m\u001b[107m\u001b[50;1H\r\n\u001b[1;52r\u001b[45;41H\u001b[1m\u001b[31m\u001b[106m{\u001b[47;17H}\u001b[m\u001b[93m\u001b[107m\r\n\r\n\r\n\u001b[96m\u001b[47m 90 \u001b[m\u001b[93m\u001b[107m\u001b[16C\u001b[32mreturn\u001b[m\u001b[93m\u001b[107m err\u001b[51;195H\u001b[38;5;108m\u001b[48;5;240m  71%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m7\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:13\u001b[47;17H\u001b[?12l\u001b[?25h" + ], + [ + 0.034896, + "\u001b[?25l\u001b[1;50r\u001b[m\u001b[93m\u001b[107m\u001b[50;1H\r\n\u001b[1;52r\u001b[44;41H{\u001b[46;17H}\u001b[47;52H\u001b[1m\u001b[31m\u001b[106m(\u001b[12C)\u001b[m\u001b[93m\u001b[107m\r\n\r\n\r\n\u001b[96m\u001b[47m 91 \u001b[m\u001b[93m\u001b[107m\u001b[12C}\u001b[51;195H\u001b[38;5;108m\u001b[48;5;240m  72%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m8\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:61\u001b[47;65H\u001b[?12l\u001b[?25h" + ], + [ + 0.017603, + "\u001b[?25l\u001b[1;50r\u001b[m\u001b[93m\u001b[107m\u001b[50;1H\r\n\u001b[1;52r\u001b[46;52H(i\u001b[11C)\u001b[47;31H\u001b[1m\u001b[31m\u001b[106m{\u001b[49;17H}\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m 92 \u001b[m\u001b[93m\u001b[107m\u001b[12Cfmt.Printf(\u001b[36m\"\u001b[m\u001b[93m\u001b[107m\u001b[31m%s\\n\u001b[m\u001b[93m\u001b[107m\u001b[36m\"\u001b[m\u001b[93m\u001b[107m, id)\u001b[51;207H\u001b[1m\u001b[38;5;235m\u001b[48;5;252m9\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:27\u001b[47;31H\u001b[?12l\u001b[?25h" + ], + [ + 0.040503, + "\u001b[?25l\u001b[1;50r\u001b[m\u001b[93m\u001b[107m\u001b[50;1H\r\n\u001b[1;52r\u001b[46;31H{\u001b[48;17H}\r\n\r\n\u001b[96m\u001b[47m 93 \u001b[m\u001b[93m\u001b[107m\u001b[8C}\u001b[51;195H\u001b[38;5;108m\u001b[48;5;240m  73%\u001b[m\u001b[93m\u001b[107m\u001b[6C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m90\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:26\u001b[47;30H\u001b[?12l\u001b[?25h" + ], + [ + 0.028582, + "\u001b[?25l\u001b[1;50r\u001b[m\u001b[93m\u001b[107m\u001b[50;1H\r\n\u001b[1;52r\u001b[45;31H\u001b[1m\u001b[31m\u001b[106m{\u001b[47;17H}\u001b[m\u001b[93m\u001b[107m\r\n\r\n\r\n\u001b[96m\u001b[47m 94 \u001b[m\u001b[93m\u001b[107m }\u001b[51;195H\u001b[38;5;108m\u001b[48;5;240m  74%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m1\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:13\u001b[47;17H\u001b[?12l\u001b[?25h" + ], + [ + 0.031483, + "\u001b[?25l\u001b[1;50r\u001b[m\u001b[93m\u001b[107m\u001b[50;1H\r\n\u001b[1;52r\u001b[44;31H{\u001b[46;17H}\u001b[47;27H\u001b[1m\u001b[31m\u001b[106m(\u001b[10C)\u001b[m\u001b[93m\u001b[107m\r\n\r\n\r\n\u001b[96m\u001b[47m 95 \u001b[m\u001b[93m\u001b[107m\u001b[51;195H\u001b[38;5;108m\u001b[48;5;240m  75%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m2\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:34\u001b[47;38H\u001b[?12l\u001b[?25h" + ], + [ + 0.161023, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[44;31H\u001b[1m\u001b[31m\u001b[106m{\u001b[46;17H}\u001b[m\u001b[93m\u001b[107m\u001b[47;27H(\u001b[36m\"\u001b[m\u001b[93m\u001b[107m\u001b[9C)\u001b[51;195H\u001b[38;5;108m\u001b[48;5;240m  74%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m1\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:13\u001b[46;17H\u001b[?12l\u001b[?25h" + ], + [ + 0.499146, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[44;31H{\u001b[46;17H}\u001b[51;195H\u001b[38;5;108m\u001b[48;5;240m  73%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m0\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:26\u001b[45;30H\u001b[?12l\u001b[?25h" + ], + [ + 0.027118, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[44;31H\u001b[1m\u001b[31m\u001b[106m{\u001b[46;17H}\u001b[m\u001b[93m\u001b[107m\u001b[51;195H\u001b[38;5;108m\u001b[48;5;240m  72%\u001b[m\u001b[93m\u001b[107m\u001b[6C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m89\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:27\u001b[44;31H\u001b[?12l\u001b[?25h" + ], + [ + 0.033789, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[43;52H\u001b[1m\u001b[31m\u001b[106m(\u001b[12C)\u001b[m\u001b[93m\u001b[107m\u001b[44;31H{\u001b[46;17H}\u001b[51;207H\u001b[1m\u001b[38;5;235m\u001b[48;5;252m8\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:61\u001b[43;65H\u001b[?12l\u001b[?25h" + ], + [ + 0.026661, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[40;41H\u001b[1m\u001b[31m\u001b[106m{\u001b[42;17H}\u001b[m\u001b[93m\u001b[107m\u001b[43;52H(i\u001b[11C)\u001b[51;195H\u001b[38;5;108m\u001b[48;5;240m  71%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m7\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:13\u001b[42;17H\u001b[?12l\u001b[?25h" + ], + [ + 0.032548, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[40;41H{\u001b[42;17H}\u001b[51;195H\u001b[38;5;108m\u001b[48;5;240m  70%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m6\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:24\u001b[41;28H\u001b[?12l\u001b[?25h" + ], + [ + 0.029278, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[40;41H\u001b[1m\u001b[31m\u001b[106m{\u001b[42;17H}\u001b[m\u001b[93m\u001b[107m\u001b[51;195H\u001b[38;5;108m\u001b[48;5;240m  69%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m5\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:37\u001b[40;41H\u001b[?12l\u001b[?25h" + ], + [ + 0.026258, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m{\u001b[42;17H}\u001b[51;195H\u001b[38;5;108m\u001b[48;5;240m  68%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m4\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:1 \u001b[39;5H\u001b[?12l\u001b[?25h" + ], + [ + 0.034793, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[32;24H\u001b[1m\u001b[31m\u001b[106m{\u001b[38;17H}\u001b[m\u001b[93m\u001b[107m\u001b[51;195H\u001b[38;5;108m\u001b[48;5;240m  67%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m3\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:13\u001b[38;17H\u001b[?12l\u001b[?25h" + ], + [ + 0.032971, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[32;24H{\u001b[37;31H\u001b[1m\u001b[31m\u001b[106m(\u001b[20C)\u001b[m\u001b[93m\u001b[107m\u001b[38;17H}\u001b[51;207H\u001b[1m\u001b[38;5;235m\u001b[48;5;252m2\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:48\u001b[37;52H\u001b[?12l\u001b[?25h" + ], + [ + 0.029998, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[34;36H\u001b[1m\u001b[31m\u001b[106m{\u001b[36;21H}\u001b[m\u001b[93m\u001b[107m\u001b[37;31H(\u001b[36m\"\u001b[m\u001b[93m\u001b[107m\u001b[19C)\u001b[51;195H\u001b[38;5;108m\u001b[48;5;240m  66%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m1\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:17\u001b[36;21H\u001b[?12l\u001b[?25h" + ], + [ + 0.030022, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[34;36H{\u001b[36;21H}\u001b[51;195H\u001b[38;5;108m\u001b[48;5;240m  65%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m0\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:30\u001b[35;34H\u001b[?12l\u001b[?25h" + ], + [ + 0.031828, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[34;36H\u001b[1m\u001b[31m\u001b[106m{\u001b[36;21H}\u001b[m\u001b[93m\u001b[107m\u001b[51;195H\u001b[38;5;108m\u001b[48;5;240m  64%\u001b[m\u001b[93m\u001b[107m\u001b[6C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m79\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:32\u001b[34;36H\u001b[?12l\u001b[?25h" + ], + [ + 0.027492, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[33;58H\u001b[1m\u001b[31m\u001b[106m(\u001b[16C)\u001b[m\u001b[93m\u001b[107m\u001b[34;36H{\u001b[36;21H}\u001b[51;195H\u001b[38;5;107m\u001b[48;5;240m  63%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m8\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:71\u001b[33;75H\u001b[?12l\u001b[?25h" + ], + [ + 0.032435, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[32;24H\u001b[1m\u001b[31m\u001b[106m{\u001b[m\u001b[93m\u001b[107m\u001b[33;58H(s\u001b[15C)\u001b[38;17H\u001b[1m\u001b[31m\u001b[106m}\u001b[m\u001b[93m\u001b[107m\u001b[51;207H\u001b[1m\u001b[38;5;235m\u001b[48;5;252m7\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:20\u001b[32;24H\u001b[?12l\u001b[?25h" + ], + [ + 0.031073, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[31;46H\u001b[1m\u001b[31m\u001b[106m[\u001b[2C]\u001b[m\u001b[93m\u001b[107m\u001b[32;24H{\u001b[38;17H}\u001b[51;195H\u001b[38;5;107m\u001b[48;5;240m  62%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m6\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:45\u001b[31;49H\u001b[?12l\u001b[?25h" + ], + [ + 0.025565, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\b\b\b[:\u001b[1C]\u001b[51;195H\u001b[38;5;107m\u001b[48;5;240m  61%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m5\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:88\u001b[30;92H\u001b[?12l\u001b[?25h" + ], + [ + 0.034775, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[27;55H\u001b[1m\u001b[31m\u001b[106m{\u001b[29;21H}\u001b[m\u001b[93m\u001b[107m\u001b[51;195H\u001b[38;5;107m\u001b[48;5;240m  60%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m4\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:17\u001b[29;21H\u001b[?12l\u001b[?25h" + ], + [ + 0.031444, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[27;55H{\u001b[29;21H}\u001b[51;195H\u001b[38;5;107m\u001b[48;5;240m  59%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m3\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:9\u001b[28;101H\u001b[?12l\u001b[?25h" + ], + [ + 0.027046, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[27;55H\u001b[1m\u001b[31m\u001b[106m{\u001b[29;21H}\u001b[m\u001b[93m\u001b[107m\u001b[51;207H\u001b[1m\u001b[38;5;235m\u001b[48;5;252m2\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:51\u001b[27;55H\u001b[?12l\u001b[?25h" + ], + [ + 0.034344, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[26;57H\u001b[1m\u001b[31m\u001b[106m{\u001b[m\u001b[93m\u001b[107m\u001b[27;55H{\u001b[29;21H}\u001b[32;17H\u001b[1m\u001b[31m\u001b[106m}\u001b[m\u001b[93m\u001b[107m\u001b[51;195H\u001b[38;5;107m\u001b[48;5;240m  58%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m1\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:53\u001b[26;57H\u001b[?12l\u001b[?25h" + ], + [ + 0.032004, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m{\u001b[32;17H} \u001b[51;195H\u001b[38;5;107m\u001b[48;5;240m  57%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m0\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:97\u001b[25;101H\u001b[?12l\u001b[?25h" + ], + [ + 0.031757, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[16;61H\u001b[1m\u001b[31m\u001b[106m{\u001b[24;17H}\u001b[m\u001b[93m\u001b[107m\u001b[51;195H\u001b[38;5;107m\u001b[48;5;240m  56%\u001b[m\u001b[93m\u001b[107m\u001b[6C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m69\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:13\u001b[24;17H\u001b[?12l\u001b[?25h" + ], + [ + 0.027946, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[16;61H{\u001b[19;28H\u001b[1m\u001b[31m\u001b[106m{\u001b[23;21H}\u001b[m\u001b[93m\u001b[107m\u001b[24;17H}\u001b[51;195H\u001b[38;5;107m\u001b[48;5;240m  55%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m8\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:17\u001b[23;21H\u001b[?12l\u001b[?25h" + ], + [ + 0.032109, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[19;28H{\u001b[20;51H\u001b[1m\u001b[31m\u001b[106m{\u001b[22;25H}\u001b[m\u001b[93m\u001b[107m\u001b[23;21H}\u001b[51;195H\u001b[38;5;107m\u001b[48;5;240m  54%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m7\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:21\u001b[22;25H\u001b[?12l\u001b[?25h" + ], + [ + 0.185364, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[20;51H{\u001b[22;25H}\u001b[51;207H\u001b[1m\u001b[38;5;235m\u001b[48;5;252m6\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:97\u001b[21;101H\u001b[?12l\u001b[?25h" + ], + [ + 12.251553, + "\u001b[51;210H8\u001b[21;102H" + ], + [ + 0.640334, + "\u001b[51;210H9\u001b[21;103H" + ], + [ + 0.179298, + "\u001b[m\u001b[93m\u001b[107m\u001b[51;175H\u001b[38;5;247m\u001b[48;5;236munix\u001b[m\u001b[93m\u001b[107m\u001b[38;5;244m\u001b[48;5;236m \u001b[m\u001b[93m\u001b[107m\u001b[51;181H\u001b[38;5;247m\u001b[48;5;236m utf-8\u001b[m\u001b[93m\u001b[107m\u001b[38;5;244m\u001b[48;5;236m \u001b[m\u001b[93m\u001b[107m\u001b[51;189H\u001b[38;5;247m\u001b[48;5;236m go\u001b[m\u001b[93m\u001b[107m\u001b[38;5;240m\u001b[48;5;236m \u001b[m\u001b[93m\u001b[107m\u001b[51;194H\u001b[38;5;107m\u001b[48;5;240m \u001b[1C54%\u001b[m\u001b[93m\u001b[107m\u001b[38;5;252m\u001b[48;5;240m \u001b[m\u001b[93m\u001b[107m\u001b[51;201H\u001b[38;5;235m\u001b[48;5;252m \u001b[51;203H \u001b[m\u001b[93m\u001b[107m\u001b[1m\u001b[38;5;235m\u001b[48;5;252m 66\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:100\u001b[21;104H" + ], + [ + 0.807758, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[52;1H\u001b[34m-- INSERT --" + ], + [ + 0.042962, + "\u001b[m\u001b[93m\u001b[107m\u001b[51;1H\u001b[1m\u001b[38;5;23m\u001b[48;5;231m INSERT \u001b[m\u001b[93m\u001b[107m\u001b[38;5;148m\u001b[48;5;240m\u001b[m\u001b[93m\u001b[107m\u001b[51;9H\u001b[38;5;231m\u001b[48;5;31m\u001b[51;10H \u001b[m\u001b[93m\u001b[107m\u001b[38;5;117m\u001b[48;5;31m\u001b[51;12H kpod-format-table \u001b[m\u001b[93m\u001b[107m\u001b[38;5;74m\u001b[48;5;31m\u001b[51;32H \u001b[m\u001b[93m\u001b[107m\u001b[38;5;117m\u001b[48;5;31mcmd/kpod/\u001b[m\u001b[93m\u001b[107m\u001b[1m\u001b[38;5;231m\u001b[48;5;31mrmi.go \u001b[m\u001b[93m\u001b[107m\u001b[38;5;240m\u001b[48;5;236m\u001b[m\u001b[93m\u001b[107m\u001b[51;49H\u001b[38;5;31m\u001b[48;5;24m\u001b[51;50H \u001b[m\u001b[93m\u001b[107m\u001b[38;5;231m\u001b[48;5;24m                                                                                                                            \u001b[m\u001b[93m\u001b[107m\u001b[38;5;117m\u001b[48;5;24munix\u001b[m\u001b[93m\u001b[107m\u001b[38;5;74m\u001b[48;5;24m \u001b[m\u001b[93m\u001b[107m\u001b[51;181H\u001b[38;5;117m\u001b[48;5;24m utf-8\u001b[m\u001b[93m\u001b[107m\u001b[38;5;74m\u001b[48;5;24m \u001b[m\u001b[93m\u001b[107m\u001b[51;189H\u001b[38;5;117m\u001b[48;5;24m go\u001b[m\u001b[93m\u001b[107m\u001b[38;5;31m\u001b[48;5;24m \u001b[m\u001b[93m\u001b[107m\u001b[51;194H\u001b[38;5;186m\u001b[4" + ], + [ + 2.9e-05, + "8;5;31m  54%\u001b[m\u001b[93m\u001b[107m\u001b[38;5;117m\u001b[48;5;31m \u001b[m\u001b[93m\u001b[107m\u001b[51;201H\u001b[38;5;24m\u001b[48;5;117m \u001b[51;203H \u001b[m\u001b[93m\u001b[107m\u001b[1m\u001b[38;5;24m\u001b[48;5;117m 66\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[m\u001b[93m\u001b[107m\b\u001b[38;5;22m\u001b[48;5;117m:100 \u001b[21;104H\u001b[?12l\u001b[?25h" + ], + [ + 0.145919, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\b\u001b[36m using its reference image\"\u001b[m\u001b[93m\u001b[107m, id, ctrID)\u001b[21;142H\u001b[K\u001b[51;48H\u001b[1m\u001b[38;5;220m\u001b[48;5;31m + \u001b[m\u001b[93m\u001b[107m\u001b[38;5;31m\u001b[48;5;24m\u001b[51;52H \u001b[m\u001b[93m\u001b[107m\u001b[122C\u001b[38;5;231m\u001b[48;5;24m \u001b[m\u001b[93m\u001b[107m\u001b[38;5;117m\u001b[48;5;24munix\u001b[m\u001b[93m\u001b[107m\u001b[38;5;74m\u001b[48;5;24m \u001b[m\u001b[93m\u001b[107m\u001b[51;182H\u001b[38;5;117m\u001b[48;5;24m utf-8\u001b[m\u001b[93m\u001b[107m\u001b[38;5;74m\u001b[48;5;24m \u001b[m\u001b[93m\u001b[107m\u001b[51;190H\u001b[38;5;117m\u001b[48;5;24m go\u001b[m\u001b[93m\u001b[107m\u001b[38;5;31m\u001b[48;5;24m \u001b[m\u001b[93m\u001b[107m\u001b[51;196H\u001b[38;5;186m\u001b[48;5;31m 54%\u001b[m\u001b[93m\u001b[107m\u001b[38;5;117m\u001b[48;5;31m \u001b[m\u001b[93m\u001b[107m\u001b[51;202H\u001b[38;5;24m\u001b[48;5;117m \u001b[51;204H \u001b[m\u001b[93m\u001b[107m\u001b[1m\u001b[38;5;24m\u001b[48;5;117m6\b 66\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;117m:99\u001b[21;103H\u001b[?12l\u001b[?25h" + ], + [ + 0.48937, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\b\u001b[36m using its reference image\"\u001b[m\u001b[93m\u001b[107m, id, ctrID)\u001b[21;141H\u001b[K\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m8\u001b[21;102H\u001b[?12l\u001b[?25h" + ], + [ + 0.027128, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[36musing its reference image\"\u001b[m\u001b[93m\u001b[107m, id, ctrID)\u001b[21;140H\u001b[K\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m7\u001b[21;101H\u001b[?12l\u001b[?25h" + ], + [ + 0.02875, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\b\b\u001b[36m% using its reference image\"\u001b[m\u001b[93m\u001b[107m, id, ctrID)\u001b[21;139H\u001b[K\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m6\u001b[21;100H\u001b[?12l\u001b[?25h" + ], + [ + 0.031194, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\b\u001b[36m using its reference image\"\u001b[m\u001b[93m\u001b[107m, id, ctrID)\u001b[21;138H\u001b[K\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m5\u001b[21;99H\u001b[?12l\u001b[?25h" + ], + [ + 0.02624, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[36musing its reference image\"\u001b[m\u001b[93m\u001b[107m, id, ctrID)\u001b[21;137H\u001b[K\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m4\u001b[21;98H\u001b[?12l\u001b[?25h" + ], + [ + 0.032683, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\b\u001b[36m using its reference image\"\u001b[m\u001b[93m\u001b[107m, id, ctrID)\u001b[21;136H\u001b[K\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m3\u001b[21;97H\u001b[?12l\u001b[?25h" + ], + [ + 0.029086, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\b\u001b[36m using its reference image\"\u001b[m\u001b[93m\u001b[107m, id, ctrID)\u001b[21;135H\u001b[K\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m2\u001b[21;96H\u001b[?12l\u001b[?25h" + ], + [ + 0.030766, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\b\u001b[36m using its reference image\"\u001b[m\u001b[93m\u001b[107m, id, ctrID)\u001b[21;134H\u001b[K\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m1\u001b[21;95H\u001b[?12l\u001b[?25h" + ], + [ + 0.036114, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\b\u001b[36m using its reference image\"\u001b[m\u001b[93m\u001b[107m, id, ctrID)\u001b[21;133H\u001b[K\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m0\u001b[21;94H\u001b[?12l\u001b[?25h" + ], + [ + 0.119662, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\b\u001b[36m using its reference image\"\u001b[m\u001b[93m\u001b[107m, id, ctrID)\u001b[21;132H\u001b[K\u001b[51;209H\u001b[38;5;22m\u001b[48;5;117m89\u001b[21;93H\u001b[?12l\u001b[?25h" + ], + [ + 0.150503, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\b\u001b[36m using its reference image\"\u001b[m\u001b[93m\u001b[107m, id, ctrID)\u001b[21;131H\u001b[K\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m8\u001b[21;92H\u001b[?12l\u001b[?25h" + ], + [ + 0.162647, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\b\u001b[36m using its reference image\"\u001b[m\u001b[93m\u001b[107m, id, ctrID)\u001b[21;130H\u001b[K\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m7\u001b[21;91H\u001b[?12l\u001b[?25h" + ], + [ + 0.143355, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\b\u001b[36m using its reference image\"\u001b[m\u001b[93m\u001b[107m, id, ctrID)\u001b[21;129H\u001b[K\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m6\u001b[21;90H\u001b[?12l\u001b[?25h" + ], + [ + 0.152961, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\b\u001b[36m using its reference image\"\u001b[m\u001b[93m\u001b[107m, id, ctrID)\u001b[21;128H\u001b[K\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m5\u001b[21;89H\u001b[?12l\u001b[?25h" + ], + [ + 0.214499, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[36mo using its reference image\"\u001b[m\u001b[93m\u001b[107m, id, ctrID)\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m6\u001b[21;90H\u001b[?12l\u001b[?25h" + ], + [ + 0.118991, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[36mn using its reference image\"\u001b[m\u001b[93m\u001b[107m, id, ctrID)\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m7\u001b[21;91H\u001b[?12l\u001b[?25h" + ], + [ + 0.211947, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[36me using its reference image\"\u001b[m\u001b[93m\u001b[107m, id, ctrID)\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m8\u001b[21;92H\u001b[?12l\u001b[?25h" + ], + [ + 0.109298, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[1C\u001b[36m using its reference image\"\u001b[m\u001b[93m\u001b[107m, id, ctrID)\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m9\u001b[21;93H\u001b[?12l\u001b[?25h" + ], + [ + 0.165278, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[36mo using its reference image\"\u001b[m\u001b[93m\u001b[107m, id, ctrID)\u001b[51;209H\u001b[38;5;22m\u001b[48;5;117m90\u001b[21;94H\u001b[?12l\u001b[?25h" + ], + [ + 0.123492, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[36mr using its reference image\"\u001b[m\u001b[93m\u001b[107m, id, ctrID)\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m1\u001b[21;95H\u001b[?12l\u001b[?25h" + ], + [ + 0.096682, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[1C\u001b[36m using its reference image\"\u001b[m\u001b[93m\u001b[107m, id, ctrID)\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m2\u001b[21;96H\u001b[?12l\u001b[?25h" + ], + [ + 0.08435, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[36mm using its reference image\"\u001b[m\u001b[93m\u001b[107m, id, ctrID)\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m3\u001b[21;97H\u001b[?12l\u001b[?25h" + ], + [ + 0.130601, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[36mo using its reference image\"\u001b[m\u001b[93m\u001b[107m, id, ctrID)\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m4\u001b[21;98H\u001b[?12l\u001b[?25h" + ], + [ + 0.052001, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[36mr using its reference image\"\u001b[m\u001b[93m\u001b[107m, id, ctrID)\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m5\u001b[21;99H\u001b[?12l\u001b[?25h" + ], + [ + 0.075667, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[36me using its reference image\"\u001b[m\u001b[93m\u001b[107m, id, ctrID)\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m6\u001b[21;100H\u001b[?12l\u001b[?25h" + ], + [ + 0.06988, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[1C\u001b[36m using its reference image\"\u001b[m\u001b[93m\u001b[107m, id, ctrID)\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m7\u001b[21;101H\u001b[?12l\u001b[?25h" + ], + [ + 0.107312, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[36mc using its reference image\"\u001b[m\u001b[93m\u001b[107m, id, ctrID)\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m8\u001b[21;102H\u001b[?12l\u001b[?25h" + ], + [ + 0.052857, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[36mo using its reference image\"\u001b[m\u001b[93m\u001b[107m, id, ctrID)\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m9\u001b[21;103H\u001b[?12l\u001b[?25h" + ], + [ + 0.080952, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[36mn using its reference image\"\u001b[m\u001b[93m\u001b[107m, id, ctrID)\u001b[51;175H\u001b[38;5;117m\u001b[48;5;24munix\u001b[m\u001b[93m\u001b[107m\u001b[38;5;74m\u001b[48;5;24m \u001b[m\u001b[93m\u001b[107m\u001b[51;181H\u001b[38;5;117m\u001b[48;5;24m utf-8\u001b[m\u001b[93m\u001b[107m\u001b[38;5;74m\u001b[48;5;24m \u001b[m\u001b[93m\u001b[107m\u001b[51;189H\u001b[38;5;117m\u001b[48;5;24m go\u001b[m\u001b[93m\u001b[107m\u001b[38;5;31m\u001b[48;5;24m \u001b[m\u001b[93m\u001b[107m\u001b[51;194H\u001b[38;5;186m\u001b[48;5;31m \u001b[1C54%\u001b[m\u001b[93m\u001b[107m\u001b[38;5;117m\u001b[48;5;31m \u001b[m\u001b[93m\u001b[107m\u001b[51;201H\u001b[38;5;24m\u001b[48;5;117m \u001b[51;203H \u001b[m\u001b[93m\u001b[107m\u001b[1m\u001b[38;5;24m\u001b[48;5;117m 66\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;117m:100\u001b[21;104H\u001b[?12l\u001b[?25h" + ], + [ + 0.106035, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[36mt using its reference image\"\u001b[m\u001b[93m\u001b[107m, id, ctrID)\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m1\u001b[21;105H\u001b[?12l\u001b[?25h" + ], + [ + 0.069849, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[36ma using its reference image\"\u001b[m\u001b[93m\u001b[107m, id, ctrID)\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m2\u001b[21;106H\u001b[?12l\u001b[?25h" + ], + [ + 0.080188, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[36mi using its reference image\"\u001b[m\u001b[93m\u001b[107m, id, ctrID)\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m3\u001b[21;107H\u001b[?12l\u001b[?25h" + ], + [ + 0.053983, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[36mn using its reference image\"\u001b[m\u001b[93m\u001b[107m, id, ctrID)\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m4\u001b[21;108H\u001b[?12l\u001b[?25h" + ], + [ + 0.083169, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[36me using its reference image\"\u001b[m\u001b[93m\u001b[107m, id, ctrID)\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m5\u001b[21;109H\u001b[?12l\u001b[?25h" + ], + [ + 0.064025, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[36mr using its reference image\"\u001b[m\u001b[93m\u001b[107m, id, ctrID)\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m6\u001b[21;110H\u001b[?12l\u001b[?25h" + ], + [ + 0.114373, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[36ms using its reference image\"\u001b[m\u001b[93m\u001b[107m, id, ctrID)\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m7\u001b[21;111H\u001b[?12l\u001b[?25h" + ], + [ + 0.140141, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[1C\u001b[36m using its reference image\"\u001b[m\u001b[93m\u001b[107m, id, ctrID)\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m8\u001b[21;112H\u001b[?12l\u001b[?25h" + ], + [ + 0.178511, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[36ma using its reference image\"\u001b[m\u001b[93m\u001b[107m, id, ctrID)\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m9\u001b[21;113H\u001b[?12l\u001b[?25h" + ], + [ + 0.078589, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[36mr using its reference image\"\u001b[m\u001b[93m\u001b[107m, id, ctrID)\u001b[51;209H\u001b[38;5;22m\u001b[48;5;117m10\u001b[21;114H\u001b[?12l\u001b[?25h" + ], + [ + 0.088307, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[36me using its reference image\"\u001b[m\u001b[93m\u001b[107m, id, ctrID)\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m1\u001b[21;115H\u001b[?12l\u001b[?25h" + ], + [ + 0.270773, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[52;1H\u001b[K" + ], + [ + 0.007389, + "\u001b[51;1H\u001b[1m\u001b[38;5;22m\u001b[48;5;148m NORMAL \u001b[m\u001b[93m\u001b[107m\u001b[38;5;231m\u001b[48;5;31m\u001b[m\u001b[93m\u001b[107m\u001b[51;9H\u001b[38;5;148m\u001b[48;5;240m\u001b[51;10H \u001b[m\u001b[93m\u001b[107m\u001b[38;5;250m\u001b[48;5;240m\u001b[51;12H kpod-format-table \u001b[m\u001b[93m\u001b[107m\u001b[38;5;245m\u001b[48;5;240m\u001b[51;32H \u001b[m\u001b[93m\u001b[107m\u001b[38;5;250m\u001b[48;5;240mcmd/kpod/\u001b[m\u001b[93m\u001b[107m\u001b[1m\u001b[38;5;231m\u001b[48;5;240mrmi.go\u001b[m\u001b[93m\u001b[107m\u001b[1m\u001b[38;5;220m\u001b[48;5;31m \u001b[m\u001b[93m\u001b[107m\b\u001b[1m\u001b[38;5;220m\u001b[48;5;240m + \u001b[m\u001b[93m\u001b[107m\u001b[38;5;31m\u001b[48;5;24m\u001b[m\u001b[93m\u001b[107m\u001b[51;51H\u001b[38;5;240m\u001b[48;5;236m\u001b[51;52H \u001b[m\u001b[93m\u001b[107m\u001b[38;5;231m\u001b[48;5;236m                                                                                                                          \u001b[m\u001b[93m\u001b[107m\u001b[38;5;247m\u001b[48;5;236munix\u001b[m\u001b[93m\u001b[107m\u001b[38;5;244m\u001b[48;5;236m \u001b[m\u001b[93m\u001b[107m\u001b[51;181H\u001b[38;5;247m\u001b[48;5;236m utf-8\u001b[m\u001b[93m\u001b[107m\u001b[38;5;244m\u001b[48;5;236m \u001b[m\u001b[93m\u001b[107m\u001b[51;189H\u001b[38;5;247m\u001b[48;5;236m" + ], + [ + 3.4e-05, + " go\u001b[m\u001b[93m\u001b[107m\u001b[38;5;240m\u001b[48;5;236m \u001b[m\u001b[93m\u001b[107m\u001b[51;194H\u001b[38;5;107m\u001b[48;5;240m  54%\u001b[m\u001b[93m\u001b[107m\u001b[38;5;252m\u001b[48;5;240m \u001b[m\u001b[93m\u001b[107m\u001b[51;201H\u001b[38;5;235m\u001b[48;5;252m \u001b[51;203H \u001b[m\u001b[93m\u001b[107m\u001b[1m\u001b[38;5;235m\u001b[48;5;252m 66\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;117m:\u001b[m\u001b[93m\u001b[107m\b\u001b[38;5;22m\u001b[48;5;252m:110 \u001b[21;114H\u001b[?12l\u001b[?25h" + ], + [ + 0.232519, + "\u001b[?25l\u001b[52;1H\u001b[m\u001b[93m\u001b[107m:\u001b[?2004h\u001b[?12l\u001b[?25h" + ], + [ + 0.143782, + "w\u001b[?25l\u001b[?12l\u001b[?25h" + ], + [ + 0.064041, + "q\u001b[?25l\u001b[?12l\u001b[?25h" + ], + [ + 0.737175, + "\r\u001b[?25l\u001b[?2004l" + ], + [ + 0.022609, + "\"cmd/kpod/rmi.go\"" + ], + [ + 0.010737, + " 123L, 3107C written" + ], + [ + 0.01326, + "\r\r\r\n\u001b[39;49m\u001b[?2004l\u001b[?1l\u001b>\u001b[?12l\u001b[?25h\u001b[?1049l" + ], + [ + 0.002223, + "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r" + ], + [ + 0.022486, + "\r\n\u001b[34m\u001b[01mcri-o\u001b[22m \u001b[90mgit/kpod-format-table* \u001b[39m \u001b[33m54s\u001b[39m\r\n" + ], + [ + 0.001213, + "\u001b]7;file://localhost.localdomain/home/ryan/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007" + ], + [ + 8.7e-05, + "\u001b]2;ryan@localhost: ~/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007" + ], + [ + 2.3e-05, + "\u001b]1;..cubator/cri-o\u0007" + ], + [ + 0.000306, + "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[35m❯\u001b[39m \u001b[K\u001b[208C\u001b[90m\u001b[39m\u001b[208D" + ], + [ + 6.1e-05, + "\u001b[?1h\u001b=" + ], + [ + 2e-05, + "\u001b[?2004h" + ], + [ + 4.650947, + "s" + ], + [ + 0.114659, + "\bsu" + ], + [ + 0.136564, + "d" + ], + [ + 0.088137, + "o" + ], + [ + 0.111636, + " " + ], + [ + 0.12095, + "m" + ], + [ + 0.271219, + "\b \b" + ], + [ + 0.500424, + "\b" + ], + [ + 0.030636, + "\b \b" + ], + [ + 0.03127, + "\b \b" + ], + [ + 0.031598, + "\b\bs \b" + ], + [ + 0.029362, + "\b \b" + ], + [ + 0.153403, + "m" + ], + [ + 0.127382, + "\bma" + ], + [ + 0.14863, + "k" + ], + [ + 0.131117, + "e" + ], + [ + 0.088373, + " " + ], + [ + 0.064223, + "k" + ], + [ + 0.087523, + "p" + ], + [ + 0.096297, + "o" + ], + [ + 0.119679, + "d" + ], + [ + 0.112054, + "\u001b[?1l\u001b>" + ], + [ + 0.000159, + "\u001b[?2004l\r\r\n" + ], + [ + 0.00324, + "\u001b]2;make kpod\u0007\u001b]1;make\u0007" + ], + [ + 6.788264, + "go build -ldflags '-X main.gitCommit=99495909 -X main.buildInfo=1502916531' -tags \"selinux seccomp \" -o kpod github.com/kubernetes-incubator/cri-o/cmd/kpod\r\n" + ], + [ + 4.283762, + "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r" + ], + [ + 0.017721, + "\r\n\u001b[34m\u001b[01mcri-o\u001b[22m \u001b[90mgit/kpod-format-table* \u001b[39m \u001b[33m11s\u001b[39m\r\n" + ], + [ + 0.001236, + "\u001b]7;file://localhost.localdomain/home/ryan/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007" + ], + [ + 0.000128, + "\u001b]2;ryan@localhost: ~/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007" + ], + [ + 0.00018, + "\u001b]1;..cubator/cri-o\u0007" + ], + [ + 3.3e-05, + "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[35m❯\u001b[39m \u001b[K\u001b[208C\u001b[90m\u001b[39m\u001b[208D" + ], + [ + 8e-05, + "\u001b[?1h\u001b=" + ], + [ + 3.1e-05, + "\u001b[?2004h" + ], + [ + 168.290484, + "\r\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[35m❯\u001b[39m \u001b[K\u001b[208C\u001b[90m\u001b[39m\u001b[208D" + ], + [ + 2.584789, + "g" + ], + [ + 0.198102, + "\bgi" + ], + [ + 0.19998, + "t" + ], + [ + 0.600599, + "\b \b" + ], + [ + 0.127993, + "\b\bg \b" + ], + [ + 0.175966, + "\b \b" + ], + [ + 0.216044, + "s" + ], + [ + 0.112522, + "\bsu" + ], + [ + 0.135935, + "d" + ], + [ + 0.079322, + "o" + ], + [ + 0.14454, + " " + ], + [ + 0.079601, + "m" + ], + [ + 0.128569, + "a" + ], + [ + 0.08771, + "k" + ], + [ + 0.09614, + "e" + ], + [ + 0.095448, + " " + ], + [ + 0.056775, + "i" + ], + [ + 0.063421, + "n" + ], + [ + 0.072685, + "s" + ], + [ + 0.111636, + "t" + ], + [ + 0.080215, + "a" + ], + [ + 0.119661, + "l" + ], + [ + 0.135786, + "l" + ], + [ + 0.296278, + "\u001b[?1l\u001b>" + ], + [ + 8.3e-05, + "\u001b[?2004l\r\r\n" + ], + [ + 0.00983, + "\u001b]2;sudo make install\u0007\u001b]1;make\u0007" + ], + [ + 0.947581, + "[sudo] password for ryan: " + ], + [ + 2.602557, + "\r\n" + ], + [ + 2.991429, + "install -D -m 755 crio /usr/local/bin/crio\r\n" + ], + [ + 0.053259, + "install -D -m 755 crioctl /usr/local/bin/crioctl\r\n" + ], + [ + 0.030024, + "install -D -m 755 kpod /usr/local/bin/kpod\r\n" + ], + [ + 0.041823, + "install -D -m 755 conmon/conmon /usr/local/libexec/crio/conmon\r\n" + ], + [ + 0.002995, + "install -D -m 755 pause/pause /usr/local/libexec/crio/pause\r\n" + ], + [ + 0.005043, + "install -d -m 755 /usr/local/share/man/man1\r\n" + ], + [ + 0.001982, + "install -d -m 755 /usr/local/share/man/man5\r\n" + ], + [ + 0.000749, + "install -d -m 755 /usr/local/share/man/man8\r\n" + ], + [ + 0.000879, + "install -m 644 docs/kpod-diff.1 docs/kpod-push.1 docs/kpod-cp.1 docs/kpod.1 docs/kpod-export.1 docs/kpod-load.1 docs/kpod-logs.1 docs/kpod-images.1 docs/kpod-umount.1 docs/kpod-save.1 docs/kpod-mount.1 docs/kpod-info.1 docs/kpod-inspect.1 docs/kpod-history.1 docs/kpod-pull.1 docs/kpod-rmi.1 docs/kpod-version.1 docs/kpod-tag.1 -t /usr/local/share/man/man1\r\n" + ], + [ + 0.011056, + "install -m 644 docs/crio.conf.5 -t /usr/local/share/man/man5\r\n" + ], + [ + 0.002986, + "install -m 644 docs/crio.8 -t /usr/local/share/man/man8\r\n" + ], + [ + 0.004783, + "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r" + ], + [ + 0.019387, + "\r\n\u001b[34m\u001b[01mcri-o\u001b[22m \u001b[90mgit/kpod-format-table* \u001b[39m \u001b[33m7s\u001b[39m\r\n" + ], + [ + 0.002291, + "\u001b]7;file://localhost.localdomain/home/ryan/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007" + ], + [ + 9.3e-05, + "\u001b]2;ryan@localhost: ~/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007" + ], + [ + 2.1e-05, + "\u001b]1;..cubator/cri-o\u0007" + ], + [ + 8.8e-05, + "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[35m❯\u001b[39m \u001b[K\u001b[208C\u001b[90m\u001b[39m\u001b[208D" + ], + [ + 4.6e-05, + "\u001b[?1h\u001b=" + ], + [ + 2.6e-05, + "\u001b[?2004h" + ], + [ + 15.331424, + "g" + ], + [ + 0.398976, + "\b \b" + ], + [ + 0.536701, + "v" + ], + [ + 0.160554, + "\bvi" + ], + [ + 0.127435, + " " + ], + [ + 1.040078, + "\b" + ], + [ + 0.144093, + "\b\bv \b" + ], + [ + 0.167843, + "\b \b" + ], + [ + 0.448464, + "g" + ], + [ + 0.087315, + "\bgi" + ], + [ + 0.104665, + "t" + ], + [ + 0.119248, + " " + ], + [ + 0.176373, + "r" + ], + [ + 0.151944, + "e" + ], + [ + 0.080321, + "s" + ], + [ + 0.175774, + "e" + ], + [ + 0.120008, + "t" + ], + [ + 0.168118, + " " + ], + [ + 0.647723, + "c" + ], + [ + 0.11246, + "m" + ], + [ + 0.353225, + "\u0007" + ], + [ + 0.0001, + "k" + ], + [ + 0.225653, + "\u0007" + ], + [ + 0.388813, + "\b \b" + ], + [ + 0.152155, + "d" + ], + [ + 0.225421, + "\u0007" + ], + [ + 0.142048, + "m" + ], + [ + 0.448625, + "\b \b" + ], + [ + 0.248141, + "/" + ], + [ + 0.303478, + "m" + ], + [ + 0.415244, + "\b \b" + ], + [ + 0.501387, + "\b \b" + ], + [ + 0.030592, + "\b \b" + ], + [ + 0.031729, + "\b \b" + ], + [ + 0.276247, + "\b \b" + ], + [ + 0.296245, + "H" + ], + [ + 0.111636, + "E" + ], + [ + 0.128194, + "A" + ], + [ + 0.160328, + "D" + ], + [ + 0.216523, + " " + ], + [ + 0.160304, + "m" + ], + [ + 0.159999, + "e" + ], + [ + 0.22375, + "\b \b" + ], + [ + 0.159675, + "\b \b" + ], + [ + 0.088274, + "c" + ], + [ + 0.111635, + "m" + ], + [ + 0.178731, + "\u0007" + ], + [ + 0.05329, + "k" + ], + [ + 0.196815, + "\u0007" + ], + [ + 0.282938, + "\b \b" + ], + [ + 0.136923, + "d" + ], + [ + 0.239219, + "/" + ], + [ + 0.368537, + "c" + ], + [ + 0.319505, + "\b \b" + ], + [ + 0.232433, + "k" + ], + [ + 0.504033, + "p" + ], + [ + 0.176414, + "o" + ], + [ + 0.126785, + "d" + ], + [ + 0.864534, + "/" + ], + [ + 0.155176, + "r" + ], + [ + 0.109177, + "m" + ], + [ + 0.119347, + "i" + ], + [ + 0.24468, + "." + ], + [ + 0.195895, + "g" + ], + [ + 0.087415, + "o" + ], + [ + 1.588076, + "\u001b[?1l\u001b>" + ], + [ + 0.000131, + "\u001b[?2004l\r\r\n" + ], + [ + 0.003239, + "\u001b]2;git reset HEAD cmd/kpod/rmi.go\u0007\u001b]1;git\u0007" + ], + [ + 0.005443, + "Unstaged changes after reset:\r\nM\tcmd/kpod/images.go\r\n" + ], + [ + 0.000165, + "M\tcmd/kpod/rmi.go\r\n" + ], + [ + 0.010191, + "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r" + ], + [ + 0.023696, + "\r\n\u001b[34m\u001b[01mcri-o\u001b[22m \u001b[90mgit/kpod-format-table* \u001b[39m \u001b[33m\u001b[39m\r\n" + ], + [ + 0.001223, + "\u001b]7;file://localhost.localdomain/home/ryan/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007" + ], + [ + 0.000118, + "\u001b]2;ryan@localhost: ~/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007" + ], + [ + 2.3e-05, + "\u001b]1;..cubator/cri-o\u0007" + ], + [ + 0.000101, + "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[35m❯\u001b[39m \u001b[K\u001b[208C\u001b[90m\u001b[39m\u001b[208D" + ], + [ + 6.6e-05, + "\u001b[?1h\u001b=" + ], + [ + 3.3e-05, + "\u001b[?2004h" + ], + [ + 117.912011, + "v" + ], + [ + 0.072168, + "\bvi" + ], + [ + 0.13525, + " " + ], + [ + 0.224662, + "m" + ], + [ + 0.447667, + "\b \b" + ], + [ + 0.119783, + "c" + ], + [ + 0.096089, + "m" + ], + [ + 0.146517, + "d\u001b[1m/\u001b[0m" + ], + [ + 0.10283, + "\b\u001b[0m/k" + ], + [ + 0.110527, + "pod\u001b[1m/\u001b[0m" + ], + [ + 0.48823, + "\b\u001b[0m/r" + ], + [ + 0.176379, + "m" + ], + [ + 0.10899, + "i.go\u001b[1m \u001b[0m" + ], + [ + 0.387068, + "\b\u001b[0m \b" + ], + [ + 0.000493, + "\u001b[?1l\u001b>\u001b[?2004l\r\r\n" + ], + [ + 0.004413, + "\u001b]2;vim cmd/kpod/rmi.go\u0007\u001b]1;vi\u0007" + ], + [ + 0.139925, + "\u001b[?2004h\u001b[?1049h\u001b[?1h\u001b=\u001b[?2004h" + ], + [ + 0.000574, + "\u001b[1;54r\u001b[?12;25h\u001b[?12l\u001b[?25h\u001b[27m\u001b[23m\u001b[m\u001b[93m\u001b[107m\u001b[H\u001b[2J\u001b[?25l\u001b[54;1H\"cmd/kpod/rmi.go\"" + ], + [ + 0.000165, + " 123L, 3107C" + ], + [ + 0.009214, + "\u001b[2;1H▽\u001b[6n\u001b[2;1H \u001b[1;1H\u001b[>c" + ], + [ + 0.003104, + "\u001b[1;1H\u001b[96m\u001b[47m 18 \u001b[m\u001b[93m\u001b[107m\u001b[8C},\r\n\u001b[96m\u001b[47m 19 \u001b[m\u001b[93m\u001b[107m }\r\n\u001b[96m\u001b[47m 20 \u001b[m\u001b[93m\u001b[107m rmiCommand = cli.Command{\r\n\u001b[96m\u001b[47m 21 \u001b[m\u001b[93m\u001b[107m\u001b[8CName:\u001b[8C\u001b[36m\"rmi\"\u001b[m\u001b[93m\u001b[107m,\r\n\u001b[96m\u001b[47m 22 \u001b[m\u001b[93m\u001b[107m\u001b[8CUsage:\u001b[7C\u001b[36m\"removes one or more images from local storage\"\u001b[m\u001b[93m\u001b[107m,\r\n\u001b[96m\u001b[47m 23 \u001b[m\u001b[93m\u001b[107m\u001b[8CDescription: rmiDescription,\r\n\u001b[96m\u001b[47m 24 \u001b[m\u001b[93m\u001b[107m\u001b[8CAction: rmiCmd,\r\n\u001b[96m\u001b[47m 25 \u001b[m\u001b[93m\u001b[107m\u001b[8CArgsUsage: \u001b[36m\"IMAGE-NAME-OR-ID [...]\"\u001b[m\u001b[93m\u001b[107m,\r\n\u001b[96m\u001b[47m 26 \u001b[m\u001b[93m\u001b[107m\u001b[8CFlags:\u001b[7CrmiFlags,\r\n\u001b[96m\u001b[47m 27 \u001b[m\u001b[93m\u001b[107m }\r\n\u001b[96m\u001b[47m 28 \u001b[m\u001b[93m\u001b[107m)\r\n\u001b[96m\u001b[47m 29 \r\n 30 \u001b[m\u001b[93m\u001b[107m\u001b[32mfunc\u001b[m\u001b[93m\u001b[107m rmiCmd(c *cli.Context) \u001b[33merror\u001b[m\u001b[93m\u001b[107m {\r\n\u001b[96m\u001b[47m 31 \r\n 32 \u001b[m\u001b[93m\u001b[107m force := \u001b[36mfalse\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m 33 \u001b[m\u001b[93m\u001b[107m \u001b[32mif\u001b[m\u001b[93m\u001b[107m c.IsSet(\u001b[36m\"force\"\u001b[m\u001b[93m\u001b[107m) {\r\n\u001b[96m\u001b[47m 34 \u001b[m\u001b[93m\u001b[107m\u001b[8Cforce = c.Bool(\u001b[36m\"force\"\u001b[m\u001b[93m\u001b[107m)\r\n\u001b[96m\u001b[47m 35 \u001b[m\u001b[93m\u001b[107m " + ], + [ + 1.9e-05, + "}\r\n\u001b[96m\u001b[47m 36 \r\n 37 \u001b[m\u001b[93m\u001b[107m args := c.Args()\r\n\u001b[96m\u001b[47m 38 \u001b[m\u001b[93m\u001b[107m \u001b[32mif\u001b[m\u001b[93m\u001b[107m \u001b[32mlen\u001b[m\u001b[93m\u001b[107m(args) == \u001b[36m0\u001b[m\u001b[93m\u001b[107m {\r\n\u001b[96m\u001b[47m 39 \u001b[m\u001b[93m\u001b[107m\u001b[8C\u001b[32mreturn\u001b[m\u001b[93m\u001b[107m errors.Errorf(\u001b[36m\"image name or ID must be specified\"\u001b[m\u001b[93m\u001b[107m)\r\n\u001b[96m\u001b[47m 40 \u001b[m\u001b[93m\u001b[107m }\r\n\u001b[96m\u001b[47m 41 \r\n 42 \u001b[m\u001b[93m\u001b[107m config, err := getConfig(c)\r\n\u001b[96m\u001b[47m 43 \u001b[m\u001b[93m\u001b[107m \u001b[32mif\u001b[m\u001b[93m\u001b[107m err != \u001b[36mnil\u001b[m\u001b[93m\u001b[107m {\r\n\u001b[96m\u001b[47m 44 \u001b[m\u001b[93m\u001b[107m\u001b[8C\u001b[32mreturn\u001b[m\u001b[93m\u001b[107m errors.Wrapf(err, \u001b[36m\"Could not get config\"\u001b[m\u001b[93m\u001b[107m)\r\n\u001b[96m\u001b[47m 45 \u001b[m\u001b[93m\u001b[107m }\r\n\u001b[96m\u001b[47m 46 \u001b[m\u001b[93m\u001b[107m store, err := getStore(config)\r\n\u001b[96m\u001b[47m 47 \u001b[m\u001b[93m\u001b[107m \u001b[32mif\u001b[m\u001b[93m\u001b[107m err != \u001b[36mnil\u001b[m\u001b[93m\u001b[107m {\r\n\u001b[96m\u001b[47m 48 \u001b[m\u001b[93m\u001b[107m\u001b[8C\u001b[32mreturn\u001b[m\u001b[93m\u001b[107m err\r\n\u001b[96m\u001b[47m 49 \u001b[m\u001b[93m\u001b[107m }\r\n\u001b[96m\u001b[47m 50 \r\n 51 \u001b[m\u001b[93m\u001b[107m \u001b[32mfor\u001b[m\u001b[93m\u001b[107m _, id := \u001b[32mrange\u001b[m\u001b[93m\u001b[107m args {\r\n\u001b[96m\u001b[47m 52 " + ], + [ + 0.032096, + "\u001b[m\u001b[93m\u001b[107m\u001b[8Cimage, err := libkpodimage.FindImage(store, id)\r\n\u001b[96m\u001b[47m 53 \u001b[m\u001b[93m\u001b[107m\u001b[8C\u001b[32mif\u001b[m\u001b[93m\u001b[107m err != \u001b[36mnil\u001b[m\u001b[93m\u001b[107m {\r\n\u001b[96m\u001b[47m 54 \u001b[m\u001b[93m\u001b[107m\u001b[12C\u001b[32mreturn\u001b[m\u001b[93m\u001b[107m errors.Wrapf(err, \u001b[36m\"could not get image \u001b[m\u001b[93m\u001b[107m\u001b[31m%q\u001b[m\u001b[93m\u001b[107m\u001b[36m\"\u001b[m\u001b[93m\u001b[107m, id)\r\n\u001b[96m\u001b[47m 55 \u001b[m\u001b[93m\u001b[107m\u001b[8C}\r\n\u001b[96m\u001b[47m 56 \u001b[m\u001b[93m\u001b[107m\u001b[8C\u001b[32mif\u001b[m\u001b[93m\u001b[107m image != \u001b[36mnil\u001b[m\u001b[93m\u001b[107m {\r\n\u001b[96m\u001b[47m 57 \u001b[m\u001b[93m\u001b[107m\u001b[12CctrIDs, err := runningContainers(image, store)\r\n\u001b[96m\u001b[47m 58 \u001b[m\u001b[93m\u001b[107m\u001b[12C\u001b[32mif\u001b[m\u001b[93m\u001b[107m err != \u001b[36mnil\u001b[m\u001b[93m\u001b[107m {\r\n\u001b[96m\u001b[47m 59 \u001b[m\u001b[93m\u001b[107m\u001b[16C\u001b[32mreturn\u001b[m\u001b[93m\u001b[107m errors.Wrapf(err, \u001b[36m\"error getting running containers for image \u001b[m\u001b[93m\u001b[107m\u001b[31m%q\u001b[m\u001b[93m\u001b[107m\u001b[36m\"\u001b[m\u001b[93m\u001b[107m, id)\r\n\u001b[96m\u001b[47m 60 \u001b[m\u001b[93m\u001b[107m\u001b[12C}\r\n\u001b[96m\u001b[47m 61 \u001b[m\u001b[93m\u001b[107m\u001b[12C\u001b[32mif\u001b[m\u001b[93m\u001b[107m \u001b[32mlen\u001b[m\u001b[93m\u001b[107m(ctrIDs) > \u001b[36m0\u001b[m\u001b[93m\u001b[107m && \u001b[32mlen\u001b[m\u001b[93m\u001b[107m(image.Names) <= \u001b[36m1\u001b[m\u001b[93m\u001b[107m {\r\n\u001b[96m\u001b[47m 62" + ], + [ + 9.1e-05, + " \u001b[m\u001b[93m\u001b[107m\u001b[16C\u001b[32mif\u001b[m\u001b[93m\u001b[107m force {\r\n\u001b[96m\u001b[47m 63 \u001b[m\u001b[93m\u001b[107m\u001b[20CremoveContainers(ctrIDs, store)\r\n\u001b[96m\u001b[47m 64 \u001b[m\u001b[93m\u001b[107m\u001b[16C} \u001b[32melse\u001b[m\u001b[93m\u001b[107m {\r\n\u001b[96m\u001b[47m 65 \u001b[m\u001b[93m\u001b[107m\u001b[20C\u001b[32mfor\u001b[m\u001b[93m\u001b[107m ctrID := \u001b[32mrange\u001b[m\u001b[93m\u001b[107m ctrIDs {\r\n\u001b[96m\u001b[47m 66 \u001b[m\u001b[93m\u001b[107m\u001b[24C\u001b[32mreturn\u001b[m\u001b[93m\u001b[107m fmt.Errorf(\u001b[36m\"Could not remove image \u001b[m\u001b[93m\u001b[107m\u001b[31m%q\u001b[m\u001b[93m\u001b[107m\u001b[36m (\u001b[m\u001b[93m\u001b[107m\u001b[7m\u001b[33mmust force\u001b[m\u001b[93m\u001b[107m\u001b[36m) - one or more containers are using its reference image\"\u001b[m\u001b[93m\u001b[107m, id, ctrID)\r\n\u001b[96m\u001b[47m 67 \u001b[m\u001b[93m\u001b[107m\u001b[20C}\r\n\u001b[96m\u001b[47m 68 \u001b[m\u001b[93m\u001b[107m\u001b[16C}\r\n\u001b[96m\u001b[47m 69 \u001b[m\u001b[93m\u001b[107m\u001b[12C}\r\n\u001b[1m\u001b[38;5;22m\u001b[48;5;148m NORMAL \u001b[m\u001b[93m\u001b[107m\u001b[38;5;148m\u001b[48;5;240m\u001b[53;10H \u001b[m\u001b[93m\u001b[107m\u001b[38;5;250m\u001b[48;5;240m\u001b[53;12H kpod-format-table \u001b[m\u001b[93m\u001b[107m\u001b[38;5;245m\u001b[48;5;240m\u001b[53;32H \u001b[m\u001b[93m\u001b[107m\u001b[38;5;250m\u001b[48;5;240mcmd/kpod/\u001b[m\u001b[93m\u001b[107m\u001b[1m\u001b[38;5;231m\u001b[48;5;240mrmi.go\u001b[m\u001b[93m\u001b[107m\u001b[38;5;220m\u001b[48;5;240m M \u001b[m\u001b[93m" + ], + [ + 0.00914, + "\u001b[107m\u001b[38;5;240m\u001b[48;5;236m\u001b[53;52H \u001b[m\u001b[93m\u001b[107m\u001b[38;5;231m\u001b[48;5;236m                                                                                                                           \u001b[m\u001b[93m\u001b[107m\u001b[38;5;247m\u001b[48;5;236munix\u001b[m\u001b[93m\u001b[107m\u001b[38;5;244m\u001b[48;5;236m \u001b[m\u001b[93m\u001b[107m\u001b[53;182H\u001b[38;5;247m\u001b[48;5;236m utf-8\u001b[m\u001b[93m\u001b[107m\u001b[38;5;244m\u001b[48;5;236m \u001b[m\u001b[93m\u001b[107m\u001b[53;190H\u001b[38;5;247m\u001b[48;5;236m go\u001b[m\u001b[93m\u001b[107m\u001b[38;5;240m\u001b[48;5;236m \u001b[m\u001b[93m\u001b[107m\u001b[53;195H\u001b[38;5;107m\u001b[48;5;240m  54%\u001b[m\u001b[93m\u001b[107m\u001b[38;5;252m\u001b[48;5;240m \u001b[m\u001b[93m\u001b[107m\u001b[53;202H\u001b[38;5;235m\u001b[48;5;252m \u001b[53;204H \u001b[m\u001b[93m\u001b[107m\u001b[1m\u001b[38;5;235m\u001b[48;5;252m 66\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:25 \u001b[49;29H\u001b[?12l\u001b[?25h\u001bP+q436f\u001b\\\u001bP+q6b75\u001b\\\u001bP+q6b64\u001b\\\u001bP+q6b72\u001b\\\u001bP+q6b6c\u001b\\\u001bP+q2332\u001b\\\u001bP+q2334\u001b\\\u001bP+q2569\u001b\\\u001bP+q2a37\u001b\\\u001bP+q6b31\u001b\\" + ], + [ + 1.315626, + "\u001b[?25l\u001b[53;210H6\u001b[49;30H\u001b[?12l\u001b[?25h" + ], + [ + 0.490663, + "\u001b[53;210H7\u001b[49;31H" + ], + [ + 0.024219, + "\u001b[53;210H8\u001b[49;32H" + ], + [ + 0.030955, + "\u001b[53;210H9\u001b[49;33H" + ], + [ + 0.03195, + "\u001b[53;209H30\u001b[49;34H" + ], + [ + 0.028457, + "\u001b[53;210H1\u001b[49;35H" + ], + [ + 0.030479, + "\u001b[53;210H2\u001b[49;36H" + ], + [ + 0.031626, + "\u001b[53;210H3\u001b[49;37H" + ], + [ + 0.032067, + "\u001b[53;210H4\u001b[49;38H" + ], + [ + 0.026593, + "\u001b[53;210H5\u001b[49;39H" + ], + [ + 0.033566, + "\u001b[53;210H6\u001b[49;40H" + ], + [ + 0.027309, + "\u001b[53;210H7\u001b[49;41H" + ], + [ + 0.03294, + "\u001b[53;210H8\u001b[49;42H" + ], + [ + 0.030662, + "\u001b[53;210H9\u001b[49;43H" + ], + [ + 0.031394, + "\u001b[53;209H40\u001b[49;44H" + ], + [ + 0.032204, + "\u001b[53;210H1\u001b[49;45H" + ], + [ + 0.033628, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107mf\u001b[1m\u001b[31m\u001b[106m(\u001b[106C)\u001b[m\u001b[93m\u001b[107m\u001b[53;210H\u001b[38;5;22m\u001b[48;5;252m2\u001b[49;46H\u001b[?12l\u001b[?25h" + ], + [ + 0.026953, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m(\u001b[36m\"\u001b[m\u001b[93m\u001b[107m\u001b[105C)\u001b[53;210H\u001b[38;5;22m\u001b[48;5;252m3\u001b[49;47H\u001b[?12l\u001b[?25h" + ], + [ + 0.031767, + "\u001b[53;210H4\u001b[49;48H" + ], + [ + 0.026243, + "\u001b[53;210H5\u001b[49;49H" + ], + [ + 0.032594, + "\u001b[53;210H6\u001b[49;50H" + ], + [ + 0.02764, + "\u001b[53;210H7\u001b[49;51H" + ], + [ + 0.034964, + "\u001b[53;210H8\u001b[49;52H" + ], + [ + 0.026422, + "\u001b[53;210H9\u001b[49;53H" + ], + [ + 0.032607, + "\u001b[53;209H50\u001b[49;54H" + ], + [ + 0.028623, + "\u001b[53;210H1\u001b[49;55H" + ], + [ + 0.028244, + "\u001b[53;210H2\u001b[49;56H" + ], + [ + 0.033991, + "\u001b[53;210H3\u001b[49;57H" + ], + [ + 0.032985, + "\u001b[53;210H4\u001b[49;58H" + ], + [ + 0.027615, + "\u001b[53;210H5\u001b[49;59H" + ], + [ + 0.028609, + "\u001b[53;210H6\u001b[49;60H" + ], + [ + 0.02978, + "\u001b[53;210H7\u001b[49;61H" + ], + [ + 0.030592, + "\u001b[53;210H8\u001b[49;62H" + ], + [ + 0.030011, + "\u001b[53;210H9\u001b[49;63H" + ], + [ + 0.031518, + "\u001b[53;209H60\u001b[49;64H" + ], + [ + 0.030297, + "\u001b[53;210H1\u001b[49;65H" + ], + [ + 0.029334, + "\u001b[53;210H2\u001b[49;66H" + ], + [ + 0.031119, + "\u001b[53;210H3\u001b[49;67H" + ], + [ + 0.027634, + "\u001b[53;210H4\u001b[49;68H" + ], + [ + 0.031088, + "\u001b[53;210H5\u001b[49;69H" + ], + [ + 0.03047, + "\u001b[53;210H6\u001b[49;70H" + ], + [ + 0.03291, + "\u001b[53;210H7\u001b[49;71H" + ], + [ + 0.029259, + "\u001b[53;210H8\u001b[49;72H" + ], + [ + 0.034775, + "\u001b[53;210H9\u001b[49;73H" + ], + [ + 0.026392, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[1C\u001b[1m\u001b[31m\u001b[106m(\u001b[10C)\u001b[m\u001b[93m\u001b[107m\u001b[53;209H\u001b[38;5;22m\u001b[48;5;252m70\u001b[49;74H\u001b[?12l\u001b[?25h" + ], + [ + 0.031136, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[36m(\u001b[m\u001b[93m\u001b[107m\u001b[7m\u001b[33mm\u001b[m\u001b[93m\u001b[107m\u001b[9C\u001b[36m) \u001b[m\u001b[93m\u001b[107m\u001b[53;210H\u001b[38;5;22m\u001b[48;5;252m1\u001b[49;75H\u001b[?12l\u001b[?25h" + ], + [ + 0.02956, + "\u001b[53;210H2\u001b[49;76H" + ], + [ + 0.029258, + "\u001b[53;210H3\u001b[49;77H" + ], + [ + 0.032617, + "\u001b[53;210H4\u001b[49;78H" + ], + [ + 0.02963, + "\u001b[53;210H5\u001b[49;79H" + ], + [ + 0.027516, + "\u001b[53;210H6\u001b[49;80H" + ], + [ + 0.031034, + "\u001b[53;210H7\u001b[49;81H" + ], + [ + 0.0348, + "\u001b[53;210H8\u001b[49;82H" + ], + [ + 0.026686, + "\u001b[53;210H9\u001b[49;83H" + ], + [ + 0.031977, + "\u001b[53;209H80\u001b[49;84H" + ], + [ + 0.032521, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[49;74H\u001b[1m\u001b[31m\u001b[106m(\u001b[10C)\u001b[m\u001b[93m\u001b[107m\u001b[53;210H\u001b[38;5;22m\u001b[48;5;252m1\u001b[49;85H\u001b[?12l\u001b[?25h" + ], + [ + 0.027602, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[49;74H\u001b[36m(\u001b[m\u001b[93m\u001b[107m\u001b[7m\u001b[33mm\u001b[m\u001b[93m\u001b[107m\u001b[9C\u001b[36m) \u001b[m\u001b[93m\u001b[107m\u001b[53;210H\u001b[38;5;22m\u001b[48;5;252m2\u001b[49;86H\u001b[?12l\u001b[?25h" + ], + [ + 0.144764, + "\u001b[53;210H3\u001b[49;87H" + ], + [ + 0.167503, + "\u001b[53;210H4\u001b[49;88H" + ], + [ + 0.165071, + "\u001b[53;210H5\u001b[49;89H" + ], + [ + 0.254279, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[36mne or more containers are using its reference image\"\u001b[m\u001b[93m\u001b[107m, id, ctrID)\u001b[49;153H\u001b[K\u001b[53;50H\u001b[1m\u001b[38;5;220m\u001b[48;5;240m + \u001b[m\u001b[93m\u001b[107m\u001b[38;5;240m\u001b[48;5;236m\u001b[53;54H \u001b[49;89H\u001b[?12l\u001b[?25h" + ], + [ + 0.501147, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[36me or more containers are using its reference image\"\u001b[m\u001b[93m\u001b[107m, id, ctrID)\u001b[49;152H\u001b[K\u001b[49;89H\u001b[?12l\u001b[?25h" + ], + [ + 0.019148, + "\u001b[?25l\u001b[36m or more containers are using its reference image\"\u001b[m\u001b[93m\u001b[107m, id, ctrID)\u001b[49;151H\u001b[K\u001b[49;89H\u001b[?12l\u001b[?25h" + ], + [ + 0.032617, + "\u001b[?25l\u001b[36mor more containers are using its reference image\"\u001b[m\u001b[93m\u001b[107m, id, ctrID)\u001b[49;150H\u001b[K\u001b[49;89H\u001b[?12l\u001b[?25h" + ], + [ + 0.031692, + "\u001b[?25l\u001b[36mr more containers are using its reference image\"\u001b[m\u001b[93m\u001b[107m, id, ctrID)\u001b[49;149H\u001b[K\u001b[49;89H\u001b[?12l\u001b[?25h" + ], + [ + 0.030868, + "\u001b[?25l\u001b[36m more containers are using its reference image\"\u001b[m\u001b[93m\u001b[107m, id, ctrID)\u001b[49;148H\u001b[K\u001b[49;89H\u001b[?12l\u001b[?25h" + ], + [ + 0.03056, + "\u001b[?25l\u001b[36mmore containers are using its reference image\"\u001b[m\u001b[93m\u001b[107m, id, ctrID)\u001b[49;147H\u001b[K\u001b[49;89H\u001b[?12l\u001b[?25h" + ], + [ + 0.03168, + "\u001b[?25l\u001b[36more containers are using its reference image\"\u001b[m\u001b[93m\u001b[107m, id, ctrID)\u001b[49;146H\u001b[K\u001b[49;89H\u001b[?12l\u001b[?25h" + ], + [ + 0.027805, + "\u001b[?25l\u001b[36mre containers are using its reference image\"\u001b[m\u001b[93m\u001b[107m, id, ctrID)\u001b[49;145H\u001b[K\u001b[49;89H\u001b[?12l\u001b[?25h" + ], + [ + 0.031902, + "\u001b[?25l\u001b[36me containers are using its reference image\"\u001b[m\u001b[93m\u001b[107m, id, ctrID)\u001b[49;144H\u001b[K\u001b[49;89H\u001b[?12l\u001b[?25h" + ], + [ + 0.283191, + "\u001b[?25l\u001b[36m containers are using its reference image\"\u001b[m\u001b[93m\u001b[107m, id, ctrID)\u001b[49;143H\u001b[K\u001b[49;89H\u001b[?12l\u001b[?25h" + ], + [ + 0.178515, + "\u001b[?25l\u001b[36mcontainers are using its reference image\"\u001b[m\u001b[93m\u001b[107m, id, ctrID)\u001b[49;142H\u001b[K\u001b[49;89H\u001b[?12l\u001b[?25h" + ], + [ + 0.38466, + "\u001b[53;210H\u001b[38;5;22m\u001b[48;5;252m6\u001b[49;90H" + ], + [ + 0.501961, + "\u001b[53;210H7\u001b[49;91H" + ], + [ + 0.025949, + "\u001b[53;210H8\u001b[49;92H" + ], + [ + 0.029349, + "\u001b[53;210H9\u001b[49;93H" + ], + [ + 0.031181, + "\u001b[53;209H90\u001b[49;94H" + ], + [ + 0.030544, + "\u001b[53;210H1\u001b[49;95H" + ], + [ + 0.030634, + "\u001b[53;210H2\u001b[49;96H" + ], + [ + 0.030484, + "\u001b[53;210H3\u001b[49;97H" + ], + [ + 0.033104, + "\u001b[53;210H4\u001b[49;98H" + ], + [ + 0.024166, + "\u001b[53;210H5\u001b[49;99H" + ], + [ + 0.032752, + "\u001b[53;210H6\u001b[49;100H" + ], + [ + 0.030921, + "\u001b[53;210H7\u001b[49;101H" + ], + [ + 0.517314, + "\u001b[53;210H6\u001b[49;100H" + ], + [ + 3.312677, + "\u001b[53;210H7\u001b[49;101H" + ], + [ + 0.50269, + "\u001b[53;210H8\u001b[49;102H" + ], + [ + 0.030313, + "\u001b[53;210H9\u001b[49;103H" + ], + [ + 0.024339, + "\u001b[m\u001b[93m\u001b[107m\u001b[53;175H\u001b[38;5;247m\u001b[48;5;236munix\u001b[m\u001b[93m\u001b[107m\u001b[38;5;244m\u001b[48;5;236m \u001b[m\u001b[93m\u001b[107m\u001b[53;181H\u001b[38;5;247m\u001b[48;5;236m utf-8\u001b[m\u001b[93m\u001b[107m\u001b[38;5;244m\u001b[48;5;236m \u001b[m\u001b[93m\u001b[107m\u001b[53;189H\u001b[38;5;247m\u001b[48;5;236m go\u001b[m\u001b[93m\u001b[107m\u001b[38;5;240m\u001b[48;5;236m \u001b[m\u001b[93m\u001b[107m\u001b[53;194H\u001b[38;5;107m\u001b[48;5;240m \u001b[1C54%\u001b[m\u001b[93m\u001b[107m\u001b[38;5;252m\u001b[48;5;240m \u001b[m\u001b[93m\u001b[107m\u001b[53;201H\u001b[38;5;235m\u001b[48;5;252m \u001b[53;203H \u001b[m\u001b[93m\u001b[107m\u001b[1m\u001b[38;5;235m\u001b[48;5;252m 66\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:100\u001b[49;104H" + ], + [ + 0.033592, + "\u001b[53;210H1\u001b[49;105H" + ], + [ + 0.031721, + "\u001b[53;210H2\u001b[49;106H" + ], + [ + 0.02682, + "\u001b[53;210H3\u001b[49;107H" + ], + [ + 0.03135, + "\u001b[53;210H4\u001b[49;108H" + ], + [ + 0.029141, + "\u001b[53;210H5\u001b[49;109H" + ], + [ + 0.03261, + "\u001b[53;210H6\u001b[49;110H" + ], + [ + 0.028367, + "\u001b[53;210H7\u001b[49;111H" + ], + [ + 0.028863, + "\u001b[53;210H8\u001b[49;112H" + ], + [ + 0.032551, + "\u001b[53;210H9\u001b[49;113H" + ], + [ + 0.02896, + "\u001b[53;209H10\u001b[49;114H" + ], + [ + 0.029171, + "\u001b[53;210H1\u001b[49;115H" + ], + [ + 0.032167, + "\u001b[53;210H2\u001b[49;116H" + ], + [ + 0.029809, + "\u001b[53;210H3\u001b[49;117H" + ], + [ + 0.025445, + "\u001b[53;210H4\u001b[49;118H" + ], + [ + 0.020289, + "\u001b[53;210H3\u001b[49;117H" + ], + [ + 0.501457, + "\u001b[53;210H2\u001b[49;116H" + ], + [ + 0.033753, + "\u001b[53;210H1\u001b[49;115H" + ], + [ + 0.030371, + "\u001b[53;210H0\u001b[49;114H" + ], + [ + 0.026993, + "\u001b[53;209H09\u001b[49;113H" + ], + [ + 0.030967, + "\u001b[53;210H8\u001b[49;112H" + ], + [ + 0.026829, + "\u001b[53;210H7\u001b[49;111H" + ], + [ + 0.032439, + "\u001b[53;210H6\u001b[49;110H" + ], + [ + 0.03057, + "\u001b[53;210H5\u001b[49;109H" + ], + [ + 0.031109, + "\u001b[53;210H4\u001b[49;108H" + ], + [ + 0.032679, + "\u001b[53;210H3\u001b[49;107H" + ], + [ + 0.033994, + "\u001b[53;210H2\u001b[49;106H" + ], + [ + 0.025439, + "\u001b[53;210H1\u001b[49;105H" + ], + [ + 0.032603, + "\u001b[53;210H0\u001b[49;104H" + ], + [ + 0.028393, + "\u001b[m\u001b[93m\u001b[107m\u001b[53;175H\u001b[38;5;231m\u001b[48;5;236m \u001b[m\u001b[93m\u001b[107m\u001b[38;5;247m\u001b[48;5;236munix\u001b[m\u001b[93m\u001b[107m\u001b[38;5;244m\u001b[48;5;236m \u001b[m\u001b[93m\u001b[107m\u001b[53;182H\u001b[38;5;247m\u001b[48;5;236m utf-8\u001b[m\u001b[93m\u001b[107m\u001b[38;5;244m\u001b[48;5;236m \u001b[m\u001b[93m\u001b[107m\u001b[53;190H\u001b[38;5;247m\u001b[48;5;236m go\u001b[m\u001b[93m\u001b[107m\u001b[38;5;240m\u001b[48;5;236m \u001b[m\u001b[93m\u001b[107m\u001b[53;196H\u001b[38;5;107m\u001b[48;5;240m 54%\u001b[m\u001b[93m\u001b[107m\u001b[38;5;252m\u001b[48;5;240m \u001b[m\u001b[93m\u001b[107m\u001b[53;202H\u001b[38;5;235m\u001b[48;5;252m \u001b[53;204H \u001b[m\u001b[93m\u001b[107m\u001b[1m\u001b[38;5;235m\u001b[48;5;252m6\b 66\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:99\u001b[49;103H" + ], + [ + 0.136603, + "\u001b[53;210H8\u001b[49;102H" + ], + [ + 0.1836, + "\u001b[53;210H7\u001b[49;101H" + ], + [ + 0.185079, + "\u001b[53;210H6\u001b[49;100H" + ], + [ + 0.383613, + "\u001b[53;210H5\u001b[49;99H" + ], + [ + 0.161001, + "\u001b[53;210H4\u001b[49;98H" + ], + [ + 0.669446, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[36m are using its reference image\"\u001b[m\u001b[93m\u001b[107m, id, ctrID)\u001b[49;141H\u001b[K\u001b[49;98H\u001b[?12l\u001b[?25h" + ], + [ + 0.586565, + "\u001b[?25l\u001b[54;1H\u001b[34m-- INSERT --\u001b[m\u001b[93m\u001b[107m\u001b[54;13H\u001b[K" + ], + [ + 0.043535, + "\u001b[53;1H\u001b[1m\u001b[38;5;23m\u001b[48;5;231m INSERT \u001b[m\u001b[93m\u001b[107m\u001b[38;5;148m\u001b[48;5;240m\u001b[m\u001b[93m\u001b[107m\u001b[53;9H\u001b[38;5;231m\u001b[48;5;31m\u001b[53;10H \u001b[m\u001b[93m\u001b[107m\u001b[38;5;117m\u001b[48;5;31m\u001b[53;12H kpod-format-table \u001b[m\u001b[93m\u001b[107m\u001b[38;5;74m\u001b[48;5;31m\u001b[53;32H \u001b[m\u001b[93m\u001b[107m\u001b[38;5;117m\u001b[48;5;31mcmd/kpod/\u001b[m\u001b[93m\u001b[107m\u001b[1m\u001b[38;5;231m\u001b[48;5;31mrmi.go\u001b[m\u001b[93m\u001b[107m\u001b[38;5;220m\u001b[48;5;240m \u001b[m\u001b[93m\u001b[107m\b\u001b[38;5;220m\u001b[48;5;31m M\u001b[m\u001b[93m\u001b[107m\u001b[1m\u001b[38;5;220m\u001b[48;5;31m + \u001b[m\u001b[93m\u001b[107m\u001b[38;5;240m\u001b[48;5;236m\u001b[m\u001b[93m\u001b[107m\u001b[53;53H\u001b[38;5;31m\u001b[48;5;24m\u001b[53;54H \u001b[m\u001b[93m\u001b[107m\u001b[38;5;231m\u001b[48;5;24m                                                                                                                         \u001b[m\u001b[93m\u001b[107m\u001b[38;5;117m\u001b[48;5;24munix\u001b[m\u001b[93m\u001b[107m\u001b[38;5;74m\u001b[48;5;24m \u001b[m\u001b[93m\u001b[107m\u001b[53;182H\u001b[38;5;117m\u001b[48;5;24m utf-8\u001b[m\u001b[93m\u001b[107m\u001b[38;5;74m\u001b[48;5;24m \u001b[m\u001b[93m\u001b[107m\u001b[53;190H\u001b[" + ], + [ + 2.9e-05, + "38;5;117m\u001b[48;5;24m go\u001b[m\u001b[93m\u001b[107m\u001b[38;5;31m\u001b[48;5;24m \u001b[m\u001b[93m\u001b[107m\u001b[53;195H\u001b[38;5;186m\u001b[48;5;31m  54%\u001b[m\u001b[93m\u001b[107m\u001b[38;5;117m\u001b[48;5;31m \u001b[m\u001b[93m\u001b[107m\u001b[53;202H\u001b[38;5;24m\u001b[48;5;117m \u001b[53;204H \u001b[m\u001b[93m\u001b[107m\u001b[1m\u001b[38;5;24m\u001b[48;5;117m 66\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[m\u001b[93m\u001b[107m\b\u001b[38;5;22m\u001b[48;5;117m:94 \u001b[49;98H\u001b[?12l\u001b[?25h" + ], + [ + 0.189046, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[1C\u001b[36m are using its reference image\"\u001b[m\u001b[93m\u001b[107m, id, ctrID)\u001b[53;210H\u001b[38;5;22m\u001b[48;5;117m5\u001b[49;99H\u001b[?12l\u001b[?25h" + ], + [ + 1.150929, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[36m\"\u001b[m\u001b[93m\u001b[107m are using its reference image\u001b[36m\", id, ctrID)\u001b[50;5H }\u001b[51;5H }\u001b[52;5H }\u001b[m\u001b[93m\u001b[107m\u001b[53;210H\u001b[38;5;22m\u001b[48;5;117m6\u001b[49;100H\u001b[?12l\u001b[?25h" + ], + [ + 0.222856, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m% are using its reference image\u001b[36m\", id, ctrID)\u001b[m\u001b[93m\u001b[107m\u001b[53;210H\u001b[38;5;22m\u001b[48;5;117m7\u001b[49;101H\u001b[?12l\u001b[?25h" + ], + [ + 0.508774, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107mq are using its reference image\u001b[36m\", id, ctrID)\u001b[m\u001b[93m\u001b[107m\u001b[53;210H\u001b[38;5;22m\u001b[48;5;117m8\u001b[49;102H\u001b[?12l\u001b[?25h" + ], + [ + 0.429575, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[36m\" are using its reference image\"\u001b[m\u001b[93m\u001b[107m, id, ctrID)\u001b[50;5H }\u001b[51;5H }\u001b[52;5H }\u001b[53;210H\u001b[38;5;22m\u001b[48;5;117m9\u001b[49;103H\u001b[?12l\u001b[?25h" + ], + [ + 0.293573, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[1C\u001b[36m are using its reference image\"\u001b[m\u001b[93m\u001b[107m, id, ctrID)\u001b[53;175H\u001b[38;5;117m\u001b[48;5;24munix\u001b[m\u001b[93m\u001b[107m\u001b[38;5;74m\u001b[48;5;24m \u001b[m\u001b[93m\u001b[107m\u001b[53;181H\u001b[38;5;117m\u001b[48;5;24m utf-8\u001b[m\u001b[93m\u001b[107m\u001b[38;5;74m\u001b[48;5;24m \u001b[m\u001b[93m\u001b[107m\u001b[53;189H\u001b[38;5;117m\u001b[48;5;24m go\u001b[m\u001b[93m\u001b[107m\u001b[38;5;31m\u001b[48;5;24m \u001b[m\u001b[93m\u001b[107m\u001b[53;194H\u001b[38;5;186m\u001b[48;5;31m \u001b[1C54%\u001b[m\u001b[93m\u001b[107m\u001b[38;5;117m\u001b[48;5;31m \u001b[m\u001b[93m\u001b[107m\u001b[53;201H\u001b[38;5;24m\u001b[48;5;117m \u001b[53;203H \u001b[m\u001b[93m\u001b[107m\u001b[1m\u001b[38;5;24m\u001b[48;5;117m 66\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;117m:100\u001b[49;104H\u001b[?12l\u001b[?25h" + ], + [ + 1.664414, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[54;1H\u001b[K" + ], + [ + 0.007242, + "\u001b[53;1H\u001b[1m\u001b[38;5;22m\u001b[48;5;148m NORMAL \u001b[m\u001b[93m\u001b[107m\u001b[38;5;231m\u001b[48;5;31m\u001b[m\u001b[93m\u001b[107m\u001b[53;9H\u001b[38;5;148m\u001b[48;5;240m\u001b[53;10H \u001b[m\u001b[93m\u001b[107m\u001b[38;5;250m\u001b[48;5;240m\u001b[53;12H kpod-format-table \u001b[m\u001b[93m\u001b[107m\u001b[38;5;245m\u001b[48;5;240m\u001b[53;32H \u001b[m\u001b[93m\u001b[107m\u001b[38;5;250m\u001b[48;5;240mcmd/kpod/\u001b[m\u001b[93m\u001b[107m\u001b[1m\u001b[38;5;231m\u001b[48;5;240mrmi.go\u001b[m\u001b[93m\u001b[107m\u001b[38;5;220m\u001b[48;5;31m \u001b[m\u001b[93m\u001b[107m\b\u001b[38;5;220m\u001b[48;5;240m M\u001b[m\u001b[93m\u001b[107m\u001b[1m\u001b[38;5;220m\u001b[48;5;240m + \u001b[m\u001b[93m\u001b[107m\u001b[38;5;31m\u001b[48;5;24m\u001b[m\u001b[93m\u001b[107m\u001b[53;53H\u001b[38;5;240m\u001b[48;5;236m\u001b[53;54H \u001b[m\u001b[93m\u001b[107m\u001b[38;5;231m\u001b[48;5;236m                                                                                                                         \u001b[m\u001b[93m\u001b[107m\u001b[38;5;247m\u001b[48;5;236munix\u001b[m\u001b[93m\u001b[107m\u001b[38;5;244m\u001b[48;5;236m \u001b[m\u001b[93m\u001b[107m\u001b[53;182H\u001b[38;5;247m\u001b[48;5;236m utf-8\u001b[m\u001b[93m\u001b[107m\u001b[38;5;244m\u001b[48;5;236m \u001b[m\u001b[93m\u001b[10" + ], + [ + 3.7e-05, + "7m\u001b[53;190H\u001b[38;5;247m\u001b[48;5;236m go\u001b[m\u001b[93m\u001b[107m\u001b[38;5;240m\u001b[48;5;236m \u001b[m\u001b[93m\u001b[107m\u001b[53;195H\u001b[38;5;107m\u001b[48;5;240m  54%\u001b[m\u001b[93m\u001b[107m\u001b[38;5;252m\u001b[48;5;240m \u001b[m\u001b[93m\u001b[107m\u001b[53;202H\u001b[38;5;235m\u001b[48;5;252m \u001b[53;204H \u001b[m\u001b[93m\u001b[107m\u001b[1m\u001b[38;5;24m\u001b[48;5;117m6\u001b[m\u001b[93m\u001b[107m\b\u001b[1m\u001b[38;5;235m\u001b[48;5;252m 66\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:99 \u001b[49;103H\u001b[?12l\u001b[?25h" + ], + [ + 0.497524, + "\u001b[?25l\u001b[54;1H\u001b[m\u001b[93m\u001b[107m:\u001b[?2004h\u001b[?12l\u001b[?25h" + ], + [ + 0.127272, + "q\u001b[?25l\u001b[?12l\u001b[?25h" + ], + [ + 0.320956, + "!\u001b[?25l\u001b[?12l\u001b[?25h" + ], + [ + 1.072551, + "\r" + ], + [ + 0.015046, + "\u001b[?25l\u001b[?2004l\u001b[54;1H\u001b[K\u001b[54;1H\u001b[?2004l\u001b[?1l\u001b>\u001b[?12l\u001b[?25h\u001b[?1049l" + ], + [ + 0.002419, + "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r" + ], + [ + 0.020555, + "\r\n\u001b[34m\u001b[01mcri-o\u001b[22m \u001b[90mgit/kpod-format-table* \u001b[39m \u001b[33m22s\u001b[39m\r\n" + ], + [ + 0.001416, + "\u001b]7;file://localhost.localdomain/home/ryan/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007" + ], + [ + 7.6e-05, + "\u001b]2;ryan@localhost: ~/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007" + ], + [ + 3.1e-05, + "\u001b]1;..cubator/cri-o\u0007" + ], + [ + 0.000124, + "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[35m❯\u001b[39m \u001b[K\u001b[208C\u001b[90m\u001b[39m\u001b[208D" + ], + [ + 4.1e-05, + "\u001b[?1h\u001b=" + ], + [ + 3.2e-05, + "\u001b[?2004h" + ], + [ + 1.279799, + "g" + ], + [ + 0.167996, + "\bgi" + ], + [ + 0.128101, + "t" + ], + [ + 0.21601, + " " + ], + [ + 0.416115, + "s" + ], + [ + 0.11937, + "t" + ], + [ + 0.160387, + "a" + ], + [ + 0.128023, + "t" + ], + [ + 0.168159, + "u" + ], + [ + 0.127468, + "s" + ], + [ + 0.136345, + "\u001b[?1l\u001b>" + ], + [ + 0.000192, + "\u001b[?2004l\r\r\n" + ], + [ + 0.004674, + "\u001b]2;git status\u0007\u001b]1;git\u0007" + ], + [ + 0.017951, + "On branch kpod-format-table\r\nChanges not staged for commit:\r\n (use \"git add ...\" to update what will be committed)\r\n (use \"git checkout -- ...\" to discard changes in working directory)\r\n\r\n" + ], + [ + 3.6e-05, + "\t\u001b[31mmodified: cmd/kpod/images.go\u001b[m\r\n\t\u001b[31mmodified: cmd/kpod/rmi.go\u001b[m\r\n\r\nno changes added to commit (use \"git add\" and/or \"git commit -a\")\r\n" + ], + [ + 0.000309, + "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r" + ], + [ + 0.024514, + "\r\n\u001b[34m\u001b[01mcri-o\u001b[22m \u001b[90mgit/kpod-format-table* \u001b[39m \u001b[33m\u001b[39m\r\n" + ], + [ + 0.001388, + "\u001b]7;file://localhost.localdomain/home/ryan/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007" + ], + [ + 0.000102, + "\u001b]2;ryan@localhost: ~/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007" + ], + [ + 1.7e-05, + "\u001b]1;..cubator/cri-o\u0007" + ], + [ + 7.7e-05, + "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[35m❯\u001b[39m \u001b[K\u001b[208C\u001b[90m\u001b[39m\u001b[208D" + ], + [ + 7.1e-05, + "\u001b[?1h\u001b=" + ], + [ + 3.3e-05, + "\u001b[?2004h" + ], + [ + 10.906, + "e" + ], + [ + 0.233197, + "\bex" + ], + [ + 0.342482, + "\b\be \b" + ], + [ + 0.189249, + "\b \b" + ], + [ + 56220.893544, + "\u001b[?1l\u001b>" + ], + [ + 4.1e-05, + "\u001b[?2004l\r\r\n" + ], + [ + 0.001035, + "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r" + ], + [ + 0.020391, + "\r\n\u001b[34m\u001b[01mcri-o\u001b[22m \u001b[90mgit/kpod-format-table* \u001b[39m \u001b[33m56232s\u001b[39m\r\n" + ], + [ + 0.000897, + "\u001b]7;file://localhost.localdomain/home/ryan/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007" + ], + [ + 0.000111, + "\u001b]2;ryan@localhost: ~/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007" + ], + [ + 2.9e-05, + "\u001b]1;..cubator/cri-o\u0007" + ], + [ + 0.000461, + "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[35m❯\u001b[39m " + ], + [ + 1.5e-05, + "\u001b[K\u001b[208C\u001b[90m\u001b[39m\u001b[208D" + ], + [ + 5.1e-05, + "\u001b[?1h\u001b=" + ], + [ + 2.9e-05, + "\u001b[?2004h" + ], + [ + 5.901847, + "g" + ], + [ + 0.160227, + "\bgi" + ], + [ + 0.104667, + "t" + ], + [ + 0.055222, + " " + ], + [ + 0.127953, + "d" + ], + [ + 0.11279, + "i" + ], + [ + 0.078928, + "f" + ], + [ + 0.153039, + "f" + ], + [ + 0.1441, + "\u001b[?1l\u001b>" + ], + [ + 0.000244, + "\u001b[?2004l\r\r\n" + ], + [ + 0.005357, + "\u001b]2;git diff\u0007\u001b]1;git\u0007" + ], + [ + 0.005163, + "\u001b[?1049h\u001b[?1h\u001b=\r" + ], + [ + 0.003303, + "\u001b[1mdiff --git a/cmd/kpod/images.go b/cmd/kpod/images.go\u001b[m\u001b[m\r\n\u001b[1mindex 593c2b27..d6f2bda1 100644\u001b[m\u001b[m\r\n\u001b[1m--- a/cmd/kpod/images.go\u001b[m\u001b[m\r\n\u001b[1m+++ b/cmd/kpod/images.go\u001b[m\u001b[m\r\n\u001b[36m@@ -120,7 +120,7 @@\u001b[m \u001b[mfunc genImagesFormat(quiet, truncate, digests bool) (format string) {\u001b[m\u001b[m\r\n format += \"{{ .Name | printf \\\"%-56s\\\" }} \"\u001b[m\u001b[m\r\n \u001b[m\u001b[m\r\n if digests {\u001b[m\u001b[m\r\n\u001b[31m- format += \"{{ .DIGEST | printf \\\"%-71s \\\"}} \"\u001b[m\u001b[m\r\n\u001b[32m+\u001b[m \u001b[32mformat += \"{{ .Digest | printf \\\"%-71s \\\"}} \"\u001b[m\u001b[m\r\n }\u001b[m\u001b[m\r\n \u001b[m\u001b[m\r\n format += \"{{ .CreatedAt | printf \\\"%-22s\\\" }} {{.Size}}\"\u001b[m\u001b[m\r\n\u001b[1mdiff --git a/cmd/kpod/rmi.go b/cmd/kpod/rmi.go\u001b[m\u001b[m\r\n\u001b[1mindex c7752fc1..a8da7da6 100644\u001b[m\u001b[m\r\n\u001b[1m--- a/cmd/kpod/rmi.go\u001b[m\u001b[m\r\n\u001b[1m+++ b/cmd/kpod/rmi.go\u001b[m\u001b[m\r\n\u001b[36m@@ -63,7 +63,7 @@\u001b[m \u001b[mfunc rmiCmd(c *cli.Context) error {\u001b[m\u001b[m\r\n removeContainers(ctrIDs, store)\u001b[m\u001b[m\r\n } else {\u001b[m\u001b[m\r\n " + ], + [ + 2.9e-05, + " " + ], + [ + 0.000128, + " for ctrID := range ctrIDs {\u001b[m\u001b[m\r\n\u001b[31m- return fmt.Errorf(\"Could not remove image %q (must force) - container %q is using its reference image\", id, ctrID)\u001b[m\u001b[m\r\n\u001b[32m+\u001b[m \u001b[32mreturn fmt.Errorf(\"Could not remove image %q (must force) - one or more containers are using its reference image\", id, ctrID)\u001b[m\u001b[m\r\n }\u001b[m\u001b[m\r\n }\u001b[m\u001b[m\r\n }\u001b[m\u001b[m\r\n" + ], + [ + 2.2e-05, + "\u001b[7m(END)\u001b[27m\u001b[K" + ], + [ + 3.085748, + "\r\u001b[K\u001b[?1l\u001b>\u001b[?1049l" + ], + [ + 0.001753, + "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r" + ], + [ + 0.026198, + "\r\n\u001b[34m\u001b[01mcri-o\u001b[22m \u001b[90mgit/kpod-format-table* \u001b[39m \u001b[33m\u001b[39m\r\n" + ], + [ + 0.00165, + "\u001b]7;file://localhost.localdomain/home/ryan/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007" + ], + [ + 0.000111, + "\u001b]2;ryan@localhost: ~/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007" + ], + [ + 1.8e-05, + "\u001b]1;..cubator/cri-o\u0007" + ], + [ + 9e-05, + "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[35m❯\u001b[39m \u001b[K\u001b[208C\u001b[90m\u001b[39m\u001b[208D" + ], + [ + 6.8e-05, + "\u001b[?1h\u001b=" + ], + [ + 4.6e-05, + "\u001b[?2004h" + ], + [ + 0.198452, + "g" + ], + [ + 0.095541, + "\bgi" + ], + [ + 0.120141, + "t" + ], + [ + 0.087239, + " " + ], + [ + 0.295807, + "r" + ], + [ + 0.124741, + "e" + ], + [ + 0.107908, + "s" + ], + [ + 0.136109, + "e" + ], + [ + 0.099662, + "t" + ], + [ + 0.123811, + " " + ], + [ + 0.112331, + "-" + ], + [ + 0.143709, + "-" + ], + [ + 0.220177, + "h" + ], + [ + 0.084927, + "a" + ], + [ + 0.050956, + "r" + ], + [ + 0.116765, + "d" + ], + [ + 0.042884, + " " + ], + [ + 0.239721, + "H" + ], + [ + 0.068192, + "E" + ], + [ + 0.148337, + "A" + ], + [ + 0.280701, + "D\u001b[1m \u001b[0m" + ], + [ + 0.689919, + "\b\u001b[0m \b\u001b[?1l\u001b>\u001b[?2004l\r\r\n" + ], + [ + 0.004057, + "\u001b]2;git reset --hard HEAD\u0007\u001b]1;git\u0007" + ], + [ + 0.023549, + "HEAD is now at 99495909 Make kpod images use text/template by default\r\n" + ], + [ + 0.000466, + "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r" + ], + [ + 0.027615, + "\r\n\u001b[34m\u001b[01mcri-o\u001b[22m \u001b[90mgit/kpod-format-table \u001b[39m \u001b[33m\u001b[39m\r\n" + ], + [ + 0.001079, + "\u001b]7;file://localhost.localdomain/home/ryan/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007" + ], + [ + 9.4e-05, + "\u001b]2;ryan@localhost: ~/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007" + ], + [ + 1.6e-05, + "\u001b]1;..cubator/cri-o\u0007" + ], + [ + 8.1e-05, + "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[35m❯\u001b[39m \u001b[K\u001b[208C\u001b[90m\u001b[39m\u001b[208D" + ], + [ + 6.7e-05, + "\u001b[?1h\u001b=" + ], + [ + 2.3e-05, + "\u001b[?2004h" + ], + [ + 0.377121, + "v" + ], + [ + 0.083308, + "\bvi" + ], + [ + 0.079468, + " " + ], + [ + 0.080413, + "c" + ], + [ + 0.088276, + "m" + ], + [ + 0.144748, + "d\u001b[1m/\u001b[0m" + ], + [ + 0.074972, + "\b\u001b[0m/k" + ], + [ + 0.152342, + "pod\u001b[1m/\u001b[0m" + ], + [ + 0.396108, + "\b\u001b[0m/i" + ], + [ + 0.079857, + "m" + ], + [ + 0.074579, + "ages.go\u001b[1m \u001b[0m" + ], + [ + 0.548619, + "\b\u001b[0m \b" + ], + [ + 0.000101, + "\u001b[?1l\u001b>" + ], + [ + 0.000148, + "\u001b[?2004l\r\r\n" + ], + [ + 0.001987, + "\u001b]2;vim cmd/kpod/images.go\u0007\u001b]1;vi\u0007" + ], + [ + 0.161796, + "\u001b[?2004h\u001b[?1049h\u001b[?1h\u001b=\u001b[?2004h" + ], + [ + 0.000788, + "\u001b[1;54r\u001b[?12;25h\u001b[?12l\u001b[?25h\u001b[27m\u001b[23m\u001b[m\u001b[93m\u001b[107m\u001b[H\u001b[2J\u001b[?25l\u001b[54;1H\"cmd/kpod/images.go\"" + ], + [ + 7.9e-05, + " 203L, 4796C" + ], + [ + 0.011442, + "\u001b[2;1H▽\u001b[6n\u001b[2;1H \u001b[1;1H\u001b[>c" + ], + [ + 0.008169, + "\u001b[1;1H\u001b[96m\u001b[47m152 \u001b[m\u001b[93m\u001b[107m\u001b[12CName: name,\r\n\u001b[96m\u001b[47m153 \u001b[m\u001b[93m\u001b[107m\u001b[12CDigest: imageDigest,\r\n\u001b[96m\u001b[47m154 \u001b[m\u001b[93m\u001b[107m\u001b[12CCreatedAt: createdTime.Format(\u001b[36m\"Jan 2, 2006 15:04\"\u001b[m\u001b[93m\u001b[107m),\r\n\u001b[96m\u001b[47m155 \u001b[m\u001b[93m\u001b[107m\u001b[12CSize: libkpodimage.FormattedSize(size),\r\n\u001b[96m\u001b[47m156 \u001b[m\u001b[93m\u001b[107m\u001b[8C}\r\n\u001b[96m\u001b[47m157 \u001b[m\u001b[93m\u001b[107m\u001b[8CimageOutput = \u001b[32mappend\u001b[m\u001b[93m\u001b[107m(imageOutput, params)\r\n\u001b[96m\u001b[47m158 \u001b[m\u001b[93m\u001b[107m }\r\n\u001b[96m\u001b[47m159 \r\n160 \u001b[m\u001b[93m\u001b[107m \u001b[32mvar\u001b[m\u001b[93m\u001b[107m out formats.Writer\r\n\u001b[96m\u001b[47m161 \r\n162 \u001b[m\u001b[93m\u001b[107m \u001b[32mswitch\u001b[m\u001b[93m\u001b[107m outputFormat {\r\n\u001b[96m\u001b[47m163 \u001b[m\u001b[93m\u001b[107m \u001b[32mcase\u001b[m\u001b[93m\u001b[107m \u001b[36m\"json\"\u001b[m\u001b[93m\u001b[107m:\r\n\u001b[96m\u001b[47m164 \u001b[m\u001b[93m\u001b[107m\u001b[8Cout = formats.JSONstruct{Output: toGeneric(imageOutput)}\r\n\u001b[96m\u001b[47m165 \u001b[m\u001b[93m\u001b[107m \u001b[32mdefault\u001b[m\u001b[93m\u001b[107m:\r\n\u001b[96m\u001b[47m166 \u001b[m\u001b[93m\u001b[107m\u001b[8Cout = formats.StdoutTemplate{Output: toGeneric(imageOutput), Template: outputFormat, Fields: imageOutput[\u001b[36m0\u001b[m\u001b[93m\u001b[107m].header" + ], + [ + 3.1e-05, + "Map()}\r\n\u001b[96m\u001b[47m167 \u001b[m\u001b[93m\u001b[107m }\r\n\u001b[96m\u001b[47m168 \r\n169 \u001b[m\u001b[93m\u001b[107m formats.Writer(out).Out()\r\n\u001b[96m\u001b[47m170 \r\n171 \u001b[m\u001b[93m\u001b[107m \u001b[32mreturn\u001b[m\u001b[93m\u001b[107m \u001b[36mnil\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m172 \u001b[m\u001b[93m\u001b[107m}\r\n\u001b[96m\u001b[47m173 \r\n174 \u001b[m\u001b[93m\u001b[107m\u001b[32mtype\u001b[m\u001b[93m\u001b[107m imageOutputParams \u001b[32mstruct\u001b[m\u001b[93m\u001b[107m {\r\n\u001b[96m\u001b[47m175 \u001b[m\u001b[93m\u001b[107m ID\u001b[8C\u001b[33mstring\u001b[m\u001b[93m\u001b[107m\u001b[8C\u001b[36m`json:\"id\"`\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m176 \u001b[m\u001b[93m\u001b[107m Name \u001b[33mstring\u001b[m\u001b[93m\u001b[107m\u001b[8C\u001b[36m`json:\"names\"`\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m177 \u001b[m\u001b[93m\u001b[107m Digest digest.Digest \u001b[36m`json:\"digest\"`\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m178 \u001b[m\u001b[93m\u001b[107m CreatedAt \u001b[33mstring\u001b[m\u001b[93m\u001b[107m\u001b[8C\u001b[36m`json:\"created\"`\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m179 \u001b[m\u001b[93m\u001b[107m Size \u001b[33mstring\u001b[m\u001b[93m\u001b[107m\u001b[8C\u001b[36m`json:\"size\"`\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m180 \u001b[m\u001b[93m\u001b[107m}\r\n\u001b[96m\u001b[47m181 \r\n182 \u001b[m\u001b[93m\u001b[107m\u001b[32mfunc\u001b[m\u001b[93m\u001b[107m toGeneric(params []imageOutputParams) []\u001b[32minterface\u001b[m\u001b[93m\u001b[107m{} {\r\n" + ], + [ + 0.034447, + "\u001b[96m\u001b[47m183 \u001b[m\u001b[93m\u001b[107m genericParams := \u001b[32mmake\u001b[m\u001b[93m\u001b[107m([]\u001b[32minterface\u001b[m\u001b[93m\u001b[107m{}, \u001b[32mlen\u001b[m\u001b[93m\u001b[107m(params))\r\n\u001b[96m\u001b[47m184 \u001b[m\u001b[93m\u001b[107m \u001b[32mfor\u001b[m\u001b[93m\u001b[107m i, v := \u001b[32mrange\u001b[m\u001b[93m\u001b[107m params {\r\n\u001b[96m\u001b[47m185 \u001b[m\u001b[93m\u001b[107m\u001b[8CgenericParams[i] = \u001b[32minterface\u001b[m\u001b[93m\u001b[107m{}(v)\r\n\u001b[96m\u001b[47m186 \u001b[m\u001b[93m\u001b[107m }\r\n\u001b[96m\u001b[47m187 \u001b[m\u001b[93m\u001b[107m \u001b[32mreturn\u001b[m\u001b[93m\u001b[107m genericParams\r\n\u001b[96m\u001b[47m188 \u001b[m\u001b[93m\u001b[107m}\r\n\u001b[96m\u001b[47m189 \r\n190 \u001b[m\u001b[93m\u001b[107m\u001b[32mfunc\u001b[m\u001b[93m\u001b[107m (i *imageOutputParams) headerMap() \u001b[33mmap\u001b[m\u001b[93m\u001b[107m[\u001b[33mstring\u001b[m\u001b[93m\u001b[107m]\u001b[33mstring\u001b[m\u001b[93m\u001b[107m {\r\n\u001b[96m\u001b[47m191 \u001b[m\u001b[93m\u001b[107m v := reflect.Indirect(reflect.ValueOf(i))\r\n\u001b[96m\u001b[47m192 \u001b[m\u001b[93m\u001b[107m values := \u001b[32mmake\u001b[m\u001b[93m\u001b[107m(\u001b[33mmap\u001b[m\u001b[93m\u001b[107m[\u001b[33mstring\u001b[m\u001b[93m\u001b[107m]\u001b[33mstring\u001b[m\u001b[93m\u001b[107m)\r\n\u001b[96m\u001b[47m193 \r\n194 \u001b[m\u001b[93m\u001b[107m \u001b[32mfor\u001b[m\u001b[93m\u001b[107m i := \u001b[36m0\u001b[m\u001b[93m\u001b[107m; i < v.NumField(); i++ {\r\n\u001b[96m\u001b[47m195 \u001b[m\u001b[93m\u001b[107m\u001b[8Ckey := v.Type().Field(i).Na" + ], + [ + 5.7e-05, + "me\r\n\u001b[96m\u001b[47m196 \u001b[m\u001b[93m\u001b[107m\u001b[8Cvalue := key\r\n\u001b[96m\u001b[47m197 \u001b[m\u001b[93m\u001b[107m\u001b[8C\u001b[32mif\u001b[m\u001b[93m\u001b[107m value == \u001b[36m\"ID\"\u001b[m\u001b[93m\u001b[107m || value == \u001b[36m\"Name\"\u001b[m\u001b[93m\u001b[107m {\r\n\u001b[96m\u001b[47m198 \u001b[m\u001b[93m\u001b[107m\u001b[12Cvalue = \u001b[36m\"Image\"\u001b[m\u001b[93m\u001b[107m + value\r\n\u001b[96m\u001b[47m199 \u001b[m\u001b[93m\u001b[107m\u001b[8C}\r\n\u001b[96m\u001b[47m200 \u001b[m\u001b[93m\u001b[107m\u001b[8Cvalues[key] = fmt.Sprintf(\u001b[36m\"\u001b[m\u001b[93m\u001b[107m\u001b[31m%s\u001b[m\u001b[93m\u001b[107m\u001b[36m \"\u001b[m\u001b[93m\u001b[107m, strings.ToUpper(splitCamelCase(value)))\r\n\u001b[96m\u001b[47m201 \u001b[m\u001b[93m\u001b[107m }\r\n\u001b[96m\u001b[47m202 \u001b[m\u001b[93m\u001b[107m \u001b[32mreturn\u001b[m\u001b[93m\u001b[107m values\r\n\u001b[96m\u001b[47m203 \u001b[m\u001b[93m\u001b[107m}\r\n\u001b[1m\u001b[38;5;22m\u001b[48;5;148m NORMAL \u001b[m\u001b[93m\u001b[107m\u001b[38;5;148m\u001b[48;5;240m\u001b[53;10H \u001b[m\u001b[93m\u001b[107m\u001b[38;5;250m\u001b[48;5;240m\u001b[53;12H kpod-format-table \u001b[m\u001b[93m\u001b[107m\u001b[38;5;245m\u001b[48;5;240m\u001b[53;32H \u001b[m\u001b[93m\u001b[107m\u001b[38;5;250m\u001b[48;5;240mcmd/kpod/\u001b[m\u001b[93m\u001b[107m\u001b[1m\u001b[38;5;231m\u001b[48;5;240mimages.go \u001b[m\u001b[93m\u001b[107m\u001b[38;5;240m\u001b[48;5;236m\u001b[53;53H \u001b[m\u001b[93m\u001b[107m\u001b[38;5;231m\u001b[48;5;236m               " + ], + [ + 0.01263, + "                                                                                                           \u001b[m\u001b[93m\u001b[107m\u001b[38;5;247m\u001b[48;5;236munix\u001b[m\u001b[93m\u001b[107m\u001b[38;5;244m\u001b[48;5;236m \u001b[m\u001b[93m\u001b[107m\u001b[53;182H\u001b[38;5;247m\u001b[48;5;236m utf-8\u001b[m\u001b[93m\u001b[107m\u001b[38;5;244m\u001b[48;5;236m \u001b[m\u001b[93m\u001b[107m\u001b[53;190H\u001b[38;5;247m\u001b[48;5;236m go\u001b[m\u001b[93m\u001b[107m\u001b[38;5;240m\u001b[48;5;236m \u001b[m\u001b[93m\u001b[107m\u001b[53;195H\u001b[38;5;144m\u001b[48;5;240m  87%\u001b[m\u001b[93m\u001b[107m\u001b[38;5;252m\u001b[48;5;240m \u001b[m\u001b[93m\u001b[107m\u001b[53;202H\u001b[38;5;235m\u001b[48;5;252m \u001b[53;204H \u001b[m\u001b[93m\u001b[107m\u001b[1m\u001b[38;5;235m\u001b[48;5;252m177\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:5  \u001b[26;9H\u001b[?12l\u001b[?25h" + ], + [ + 2.3e-05, + "\u001bP+q436f\u001b\\\u001bP+q6b75\u001b\\\u001bP+q6b64\u001b\\\u001bP+q6b72\u001b\\\u001bP+q6b6c\u001b\\\u001bP+q2332\u001b\\\u001bP+q2334\u001b\\\u001bP+q2569\u001b\\\u001bP+q2a37\u001b\\\u001bP+q6b31\u001b\\" + ], + [ + 0.07219, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[54;1H\u001b[K\u001b[54;1H/" + ], + [ + 6.3e-05, + "\u001b[?2004h\u001b[?12l\u001b[?25h" + ], + [ + 0.376099, + "D" + ], + [ + 8.8e-05, + "\u001b[?25l" + ], + [ + 0.008132, + "\u001b[26;26H\u001b[7m\u001b[91mD\u001b[27m\u001b[m\u001b[93m\u001b[107m\u001b[53;2H\u001b[1m\u001b[38;5;22m\u001b[48;5;148mCOMMND \u001b[m\u001b[93m\u001b[107m\u001b[200C\u001b[38;5;22m\u001b[48;5;252m22\r\n\u001b[m\u001b[93m\u001b[107m/D" + ], + [ + 6.3e-05, + "\u001b[?12l\u001b[?25h" + ], + [ + 0.127597, + "I" + ], + [ + 6e-05, + "\u001b[?25l" + ], + [ + 0.001462, + "\u001b[27m\u001b[23m\u001b[m\u001b[93m\u001b[107m\u001b[H\u001b[2J\u001b[1;1H\u001b[96m\u001b[47m 98 \u001b[m\u001b[93m\u001b[107m\u001b[8C}\r\n\u001b[96m\u001b[47m 99 \u001b[m\u001b[93m\u001b[107m } \u001b[32melse\u001b[m\u001b[93m\u001b[107m {\r\n\u001b[96m\u001b[47m100 \u001b[m\u001b[93m\u001b[107m\u001b[8Cparams = \u001b[36mnil\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m101 \u001b[m\u001b[93m\u001b[107m }\r\n\u001b[96m\u001b[47m102 \r\n103 \u001b[m\u001b[93m\u001b[107m imageList, err := libkpodimage.GetImagesMatchingFilter(store, params, name)\r\n\u001b[96m\u001b[47m104 \u001b[m\u001b[93m\u001b[107m \u001b[32mif\u001b[m\u001b[93m\u001b[107m err != \u001b[36mnil\u001b[m\u001b[93m\u001b[107m {\r\n\u001b[96m\u001b[47m105 \u001b[m\u001b[93m\u001b[107m\u001b[8C\u001b[32mreturn\u001b[m\u001b[93m\u001b[107m errors.Wrapf(err, \u001b[36m\"could not get list of images matching filter\"\u001b[m\u001b[93m\u001b[107m)\r\n\u001b[96m\u001b[47m106 \u001b[m\u001b[93m\u001b[107m }\r\n\u001b[96m\u001b[47m107 \r\n108 \u001b[m\u001b[93m\u001b[107m \u001b[32mreturn\u001b[m\u001b[93m\u001b[107m outputImages(store, imageList, truncate, digests, quiet, outputFormat, noheading)\r\n\u001b[96m\u001b[47m109 \u001b[m\u001b[93m\u001b[107m}\r\n\u001b[96m\u001b[47m110 \r\n111 \u001b[m\u001b[93m\u001b[107m\u001b[32mfunc\u001b[m\u001b[93m\u001b[107m genImagesFormat(quiet, truncate, digests \u001b[33mbool\u001b[m\u001b[93m\u001b[107m) (format \u001b[33mstring\u001b[m\u001b[93m\u001b[107m) {\r\n\u001b[96m\u001b[47m112 \u001b[m\u001b[93m\u001b[107m \u001b[32mif\u001b[m\u001b[93m\u001b[107m quiet {\r\n\u001b[96m\u001b[" + ], + [ + 1.7e-05, + "47m113 \u001b[m\u001b[93m\u001b[107m\u001b[8C\u001b[32mreturn\u001b[m\u001b[93m\u001b[107m \u001b[36m\"{{.ID}}\"\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m114 \u001b[m\u001b[93m\u001b[107m }\r\n\u001b[96m\u001b[47m115 \u001b[m\u001b[93m\u001b[107m \u001b[32mif\u001b[m\u001b[93m\u001b[107m truncate {\r\n\u001b[96m\u001b[47m116 \u001b[m\u001b[93m\u001b[107m\u001b[8Cformat = \u001b[36m\"table {{ .ID | printf \u001b[m\u001b[93m\u001b[107m\u001b[31m\\\"%-20.12s\\\"\u001b[m\u001b[93m\u001b[107m\u001b[36m }} \"\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m117 \u001b[m\u001b[93m\u001b[107m } \u001b[32melse\u001b[m\u001b[93m\u001b[107m {\r\n\u001b[96m\u001b[47m118 \u001b[m\u001b[93m\u001b[107m\u001b[8Cformat = \u001b[36m\"table {{ .ID | printf \u001b[m\u001b[93m\u001b[107m\u001b[31m\\\"%-64s\\\"\u001b[m\u001b[93m\u001b[107m\u001b[36m }} \"\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m119 \u001b[m\u001b[93m\u001b[107m }\r\n\u001b[96m\u001b[47m120 \u001b[m\u001b[93m\u001b[107m format += \u001b[36m\"{{ .Name | printf \u001b[m\u001b[93m\u001b[107m\u001b[31m\\\"%-56s\\\"\u001b[m\u001b[93m\u001b[107m\u001b[36m }} \"\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m121 \r\n122 \u001b[m\u001b[93m\u001b[107m \u001b[32mif\u001b[m\u001b[93m\u001b[107m digests {\r\n\u001b[96m\u001b[47m123 \u001b[m\u001b[93m\u001b[107m\u001b[8Cformat += \u001b[36m\"{{ .\u001b[m\u001b[93m\u001b[107m\u001b[7m\u001b[91mDI\u001b[27m\u001b[m\u001b[93m\u001b[107m\u001b[36mGEST | printf \u001b[m\u001b[93m\u001b[107m\u001b[31m\\\"%-71s\u001b[m\u001b[93m\u001b[107m\u001b[36m \u001b[m\u001b[93m\u001b[107m\u001b[31m\\\"\u001b[m\u001b[93m\u001b[107m\u001b[36m}} \"\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m124 \u001b[m\u001b[93m\u001b[107m }\r\n" + ], + [ + 0.006692, + "\u001b[96m\u001b[47m125 \r\n126 \u001b[m\u001b[93m\u001b[107m format += \u001b[36m\"{{ .CreatedAt | printf \u001b[m\u001b[93m\u001b[107m\u001b[31m\\\"%-22s\\\"\u001b[m\u001b[93m\u001b[107m\u001b[36m }} {{.Size}}\"\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m127 \u001b[m\u001b[93m\u001b[107m \u001b[32mreturn\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m128 \u001b[m\u001b[93m\u001b[107m}\r\n\u001b[96m\u001b[47m129 \r\n130 \u001b[m\u001b[93m\u001b[107m\u001b[32mfunc\u001b[m\u001b[93m\u001b[107m outputImages(store storage.Store, images []storage.Image, truncate, digests, quiet \u001b[33mbool\u001b[m\u001b[93m\u001b[107m, outputFormat \u001b[33mstring\u001b[m\u001b[93m\u001b[107m, noheading \u001b[33mbool\u001b[m\u001b[93m\u001b[107m) \u001b[33merror\u001b[m\u001b[93m\u001b[107m {\r\n\u001b[96m\u001b[47m131 \u001b[m\u001b[93m\u001b[107m imageOutput := []imageOutputParams{}\r\n\u001b[96m\u001b[47m132 \r\n133 \u001b[m\u001b[93m\u001b[107m lastID := \u001b[36m\"\"\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m134 \u001b[m\u001b[93m\u001b[107m \u001b[32mfor\u001b[m\u001b[93m\u001b[107m _, img := \u001b[32mrange\u001b[m\u001b[93m\u001b[107m images {\r\n\u001b[96m\u001b[47m135 \u001b[m\u001b[93m\u001b[107m\u001b[8C\u001b[32mif\u001b[m\u001b[93m\u001b[107m quiet && lastID == img.ID {\r\n\u001b[96m\u001b[47m136 \u001b[m\u001b[93m\u001b[107m\u001b[12C\u001b[32mcontinue\u001b[m\u001b[93m\u001b[107m \u001b[96m// quiet should not show the same ID multiple times\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m137 \u001b[m\u001b[93m\u001b[107m\u001b[8C}\r\n\u001b[96m\u001b[47m138 \u001b[m\u001b[" + ], + [ + 3e-05, + "93m\u001b[107m\u001b[8CcreatedTime := img.Created\r\n\u001b[96m\u001b[47m139 \r\n140 \u001b[m\u001b[93m\u001b[107m\u001b[8Cname := \u001b[36m\"\"\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m141 \u001b[m\u001b[93m\u001b[107m\u001b[8C\u001b[32mif\u001b[m\u001b[93m\u001b[107m \u001b[32mlen\u001b[m\u001b[93m\u001b[107m(img.Names) > \u001b[36m0\u001b[m\u001b[93m\u001b[107m {\r\n\u001b[96m\u001b[47m142 \u001b[m\u001b[93m\u001b[107m\u001b[12Cname = img.Names[\u001b[36m0\u001b[m\u001b[93m\u001b[107m]\r\n\u001b[96m\u001b[47m143 \u001b[m\u001b[93m\u001b[107m\u001b[8C}\r\n\u001b[96m\u001b[47m144 \r\n145 \u001b[m\u001b[93m\u001b[107m\u001b[8Cinfo, imageDigest, size, _ := libkpodimage.InfoAndDigestAndSize(store, img)\r\n\u001b[96m\u001b[47m146 \u001b[m\u001b[93m\u001b[107m\u001b[8C\u001b[32mif\u001b[m\u001b[93m\u001b[107m info != \u001b[36mnil\u001b[m\u001b[93m\u001b[107m {\r\n\u001b[96m\u001b[47m147 \u001b[m\u001b[93m\u001b[107m\u001b[12CcreatedTime = info.Created\r\n\u001b[96m\u001b[47m148 \u001b[m\u001b[93m\u001b[107m\u001b[8C}\r\n\u001b[96m\u001b[47m149 \u001b[m\u001b[93m\u001b[107m\r\n\u001b[1m\u001b[38;5;22m\u001b[48;5;148m COMMND \u001b[m\u001b[93m\u001b[107m\u001b[38;5;148m\u001b[48;5;240m\u001b[53;10H \u001b[m\u001b[93m\u001b[107m\u001b[38;5;250m\u001b[48;5;240m\u001b[53;12H kpod-format-table \u001b[m\u001b[93m\u001b[107m\u001b[38;5;245m\u001b[48;5;240m\u001b[53;32H \u001b[m\u001b[93m\u001b[107m\u001b[38;5;250m\u001b[48;5;240mcmd/kpod/\u001b[m\u001b[93m\u001b[107m\u001b[1m\u001b[38;5;231m\u001b[48;5;240mimages.go \u001b[m\u001b[93m\u001b[107m\u001b[38;5;240m\u001b[48;5;236m\u001b[53;53H" + ], + [ + 6.1e-05, + " \u001b[m\u001b[93m\u001b[107m\u001b[38;5;231m\u001b[48;5;236m                                                                                                                          \u001b[m\u001b[93m\u001b[107m\u001b[38;5;247m\u001b[48;5;236munix\u001b[m\u001b[93m\u001b[107m\u001b[38;5;244m\u001b[48;5;236m \u001b[m\u001b[93m\u001b[107m\u001b[53;182H\u001b[38;5;247m\u001b[48;5;236m utf-8\u001b[m\u001b[93m\u001b[107m\u001b[38;5;244m\u001b[48;5;236m \u001b[m\u001b[93m\u001b[107m\u001b[53;190H\u001b[38;5;247m\u001b[48;5;236m go\u001b[m\u001b[93m\u001b[107m\u001b[38;5;240m\u001b[48;5;236m \u001b[m\u001b[93m\u001b[107m\u001b[53;195H\u001b[38;5;107m\u001b[48;5;240m  61%\u001b[m\u001b[93m\u001b[107m\u001b[38;5;252m\u001b[48;5;240m \u001b[m\u001b[93m\u001b[107m\u001b[53;202H\u001b[38;5;235m\u001b[48;5;252m \u001b[53;204H \u001b[m\u001b[93m\u001b[107m\u001b[1m\u001b[38;5;235m\u001b[48;5;252m123\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:24 \u001b[m\u001b[93m\u001b[107m\u001b[54;1H/DI\u001b[?12l\u001b[?25h" + ], + [ + 0.104778, + "G\u001b[?25l" + ], + [ + 0.004039, + "\u001b[26;30H\u001b[7m\u001b[91mG\u001b[54;5H\u001b[?12l\u001b[?25h" + ], + [ + 0.202824, + "\u001b[27m\u001b[m\u001b[93m\u001b[107mE\u001b[?25l" + ], + [ + 0.005173, + "\u001b[26;31H\u001b[7m\u001b[91mE\u001b[54;6H\u001b[?12l\u001b[?25h" + ], + [ + 0.122869, + "\u001b[27m\u001b[m\u001b[93m\u001b[107mS\u001b[?25l" + ], + [ + 0.005278, + "\u001b[26;32H\u001b[7m\u001b[91mS\u001b[54;7H\u001b[?12l\u001b[?25h" + ], + [ + 0.090915, + "\u001b[27m\u001b[m\u001b[93m\u001b[107mT\u001b[?25l" + ], + [ + 0.005887, + "\u001b[26;33H\u001b[7m\u001b[91mT\u001b[54;8H\u001b[?12l\u001b[?25h" + ], + [ + 0.154865, + "\r\u001b[?25l\u001b[27m\u001b[m\u001b[93m\u001b[107m\u001b[1m\u001b[31msearch hit BOTTOM, continuing at TOP" + ], + [ + 0.001958, + "\u001b[m\u001b[93m\u001b[107m\u001b[26;28H\u001b[7m\u001b[33mDIGEST" + ], + [ + 0.0027, + "\u001b[m\u001b[93m\u001b[107m\u001b[53;2H\u001b[1m\u001b[38;5;22m\u001b[48;5;148mNORMAL \u001b[26;28H\u001b[?12l\u001b[?25h" + ], + [ + 0.713596, + "\u001b[m\u001b[93m\u001b[107m\u001b[53;210H\u001b[38;5;22m\u001b[48;5;252m5\u001b[26;29H" + ], + [ + 0.44085, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\b\u001b[36mDGEST | printf \u001b[m\u001b[93m\u001b[107m\u001b[31m\\\"%-71s\u001b[m\u001b[93m\u001b[107m\u001b[36m \u001b[m\u001b[93m\u001b[107m\u001b[31m\\\"\u001b[m\u001b[93m\u001b[107m\u001b[36m}} \"\u001b[m\u001b[93m\u001b[107m\u001b[26;57H\u001b[K\u001b[53;51H\u001b[1m\u001b[38;5;220m\u001b[48;5;240m + \u001b[m\u001b[93m\u001b[107m\u001b[38;5;240m\u001b[48;5;236m\u001b[53;55H \u001b[26;29H\u001b[?12l\u001b[?25h" + ], + [ + 0.166708, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[36mEST | printf \u001b[m\u001b[93m\u001b[107m\u001b[31m\\\"%-71s\u001b[m\u001b[93m\u001b[107m\u001b[36m \u001b[m\u001b[93m\u001b[107m\u001b[31m\\\"\u001b[m\u001b[93m\u001b[107m\u001b[36m}} \"\u001b[m\u001b[93m\u001b[107m\u001b[26;56H\u001b[K\u001b[26;29H\u001b[?12l\u001b[?25h" + ], + [ + 0.169515, + "\u001b[?25l\u001b[36mST | printf \u001b[m\u001b[93m\u001b[107m\u001b[31m\\\"%-71s\u001b[m\u001b[93m\u001b[107m\u001b[36m \u001b[m\u001b[93m\u001b[107m\u001b[31m\\\"\u001b[m\u001b[93m\u001b[107m\u001b[36m}} \"\u001b[m\u001b[93m\u001b[107m\u001b[26;55H\u001b[K\u001b[26;29H\u001b[?12l\u001b[?25h" + ], + [ + 0.174197, + "\u001b[?25l\u001b[36mT | printf \u001b[m\u001b[93m\u001b[107m\u001b[31m\\\"%-71s\u001b[m\u001b[93m\u001b[107m\u001b[36m \u001b[m\u001b[93m\u001b[107m\u001b[31m\\\"\u001b[m\u001b[93m\u001b[107m\u001b[36m}} \"\u001b[m\u001b[93m\u001b[107m\u001b[26;54H\u001b[K\u001b[26;29H\u001b[?12l\u001b[?25h" + ], + [ + 0.401145, + "\u001b[?25l\u001b[36m | printf \u001b[m\u001b[93m\u001b[107m\u001b[31m\\\"%-71s\u001b[m\u001b[93m\u001b[107m\u001b[36m \u001b[m\u001b[93m\u001b[107m\u001b[31m\\\"\u001b[m\u001b[93m\u001b[107m\u001b[36m}} \"\u001b[m\u001b[93m\u001b[107m\u001b[26;53H\u001b[K\u001b[26;29H\u001b[?12l\u001b[?25h" + ], + [ + 0.176906, + "\u001b[?25l\u001b[54;1H\u001b[34m--\u001b[m\u001b[93m\u001b[107m\u001b[1m\u001b[31ma\u001b[m\u001b[93m\u001b[107m\b\u001b[34m INSERT\u001b[m\u001b[93m\u001b[107m\u001b[1m\u001b[31mt\u001b[m\u001b[93m\u001b[107m\b\u001b[34m --\u001b[m\u001b[93m\u001b[107m\u001b[1m\u001b[31mO\u001b[m\u001b[93m\u001b[107m\u001b[54;13H\u001b[K" + ], + [ + 0.042519, + "\u001b[53;1H\u001b[1m\u001b[38;5;23m\u001b[48;5;231m INSERT \u001b[m\u001b[93m\u001b[107m\u001b[38;5;148m\u001b[48;5;240m\u001b[m\u001b[93m\u001b[107m\u001b[53;9H\u001b[38;5;231m\u001b[48;5;31m\u001b[53;10H \u001b[m\u001b[93m\u001b[107m\u001b[38;5;117m\u001b[48;5;31m\u001b[53;12H kpod-format-table \u001b[m\u001b[93m\u001b[107m\u001b[38;5;74m\u001b[48;5;31m\u001b[53;32H \u001b[m\u001b[93m\u001b[107m\u001b[38;5;117m\u001b[48;5;31mcmd/kpod/\u001b[m\u001b[93m\u001b[107m\u001b[1m\u001b[38;5;231m\u001b[48;5;31mimages.go\u001b[m\u001b[93m\u001b[107m\u001b[1m\u001b[38;5;220m\u001b[48;5;240m \u001b[m\u001b[93m\u001b[107m\b\u001b[1m\u001b[38;5;220m\u001b[48;5;31m + \u001b[m\u001b[93m\u001b[107m\u001b[38;5;240m\u001b[48;5;236m\u001b[m\u001b[93m\u001b[107m\u001b[53;54H\u001b[38;5;31m\u001b[48;5;24m\u001b[53;55H \u001b[m\u001b[93m\u001b[107m\u001b[38;5;231m\u001b[48;5;24m                                                                                                                        \u001b[m\u001b[93m\u001b[107m\u001b[38;5;117m\u001b[48;5;24munix\u001b[m\u001b[93m\u001b[107m\u001b[38;5;74m\u001b[48;5;24m \u001b[m\u001b[93m\u001b[107m\u001b[53;182H\u001b[38;5;117m\u001b[48;5;24m utf-8\u001b[m\u001b[93m\u001b[107m\u001b[38;5;74m\u001b[48;5;24m \u001b[m\u001b[93m\u001b[107m\u001b[53;190H\u001b[38;5;117m\u001b[48;5;24m go\u001b[m\u001b[93m\u001b[" + ], + [ + 3.8e-05, + "107m\u001b[38;5;31m\u001b[48;5;24m \u001b[m\u001b[93m\u001b[107m\u001b[53;195H\u001b[38;5;186m\u001b[48;5;31m  61%\u001b[m\u001b[93m\u001b[107m\u001b[38;5;117m\u001b[48;5;31m \u001b[m\u001b[93m\u001b[107m\u001b[53;202H\u001b[38;5;24m\u001b[48;5;117m \u001b[53;204H \u001b[m\u001b[93m\u001b[107m\u001b[1m\u001b[38;5;24m\u001b[48;5;117m123\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[m\u001b[93m\u001b[107m\b\u001b[38;5;22m\u001b[48;5;117m:25 \u001b[26;29H\u001b[?12l\u001b[?25h" + ], + [ + 0.163842, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[36mg | printf \u001b[m\u001b[93m\u001b[107m\u001b[31m\\\"%-71s\u001b[m\u001b[93m\u001b[107m\u001b[36m \u001b[m\u001b[93m\u001b[107m\u001b[31m\\\"\u001b[m\u001b[93m\u001b[107m\u001b[1C\u001b[36m} \"\u001b[m\u001b[93m\u001b[107m\u001b[53;210H\u001b[38;5;22m\u001b[48;5;117m6\u001b[26;30H\u001b[?12l\u001b[?25h" + ], + [ + 0.172451, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[36me | printf \u001b[m\u001b[93m\u001b[107m\u001b[31m\\\"%-71s\u001b[m\u001b[93m\u001b[107m\u001b[36m \u001b[m\u001b[93m\u001b[107m\u001b[31m\\\"\u001b[m\u001b[93m\u001b[107m\u001b[1C\u001b[36m} \"\u001b[m\u001b[93m\u001b[107m\u001b[53;210H\u001b[38;5;22m\u001b[48;5;117m7\u001b[26;31H\u001b[?12l\u001b[?25h" + ], + [ + 0.331326, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\b\u001b[36m | printf \u001b[m\u001b[93m\u001b[107m\u001b[31m\\\"%-71s\u001b[m\u001b[93m\u001b[107m\u001b[36m \u001b[m\u001b[93m\u001b[107m\u001b[31m\\\"\u001b[m\u001b[93m\u001b[107m\u001b[36m}} \"\u001b[m\u001b[93m\u001b[107m\u001b[26;54H\u001b[K\u001b[53;210H\u001b[38;5;22m\u001b[48;5;117m6\u001b[26;30H\u001b[?12l\u001b[?25h" + ], + [ + 0.13664, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\b\u001b[36m | printf \u001b[m\u001b[93m\u001b[107m\u001b[31m\\\"%-71s\u001b[m\u001b[93m\u001b[107m\u001b[36m \u001b[m\u001b[93m\u001b[107m\u001b[31m\\\"\u001b[m\u001b[93m\u001b[107m\u001b[36m}} \"\u001b[m\u001b[93m\u001b[107m\u001b[26;53H\u001b[K\u001b[53;210H\u001b[38;5;22m\u001b[48;5;117m5\u001b[26;29H\u001b[?12l\u001b[?25h" + ], + [ + 0.177579, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[36mi | printf \u001b[m\u001b[93m\u001b[107m\u001b[31m\\\"%-71s\u001b[m\u001b[93m\u001b[107m\u001b[36m \u001b[m\u001b[93m\u001b[107m\u001b[31m\\\"\u001b[m\u001b[93m\u001b[107m\u001b[1C\u001b[36m} \"\u001b[m\u001b[93m\u001b[107m\u001b[53;210H\u001b[38;5;22m\u001b[48;5;117m6\u001b[26;30H\u001b[?12l\u001b[?25h" + ], + [ + 0.174307, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[36mg | printf \u001b[m\u001b[93m\u001b[107m\u001b[31m\\\"%-71s\u001b[m\u001b[93m\u001b[107m\u001b[36m \u001b[m\u001b[93m\u001b[107m\u001b[31m\\\"\u001b[m\u001b[93m\u001b[107m\u001b[1C\u001b[36m} \"\u001b[m\u001b[93m\u001b[107m\u001b[53;210H\u001b[38;5;22m\u001b[48;5;117m7\u001b[26;31H\u001b[?12l\u001b[?25h" + ], + [ + 0.131684, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[36me | printf \u001b[m\u001b[93m\u001b[107m\u001b[31m\\\"%-71s\u001b[m\u001b[93m\u001b[107m\u001b[36m \u001b[m\u001b[93m\u001b[107m\u001b[31m\\\"\u001b[m\u001b[93m\u001b[107m\u001b[1C\u001b[36m} \"\u001b[m\u001b[93m\u001b[107m\u001b[53;210H\u001b[38;5;22m\u001b[48;5;117m8\u001b[26;32H\u001b[?12l\u001b[?25h" + ], + [ + 0.086181, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[36ms | printf \u001b[m\u001b[93m\u001b[107m\u001b[31m\\\"%-71s\u001b[m\u001b[93m\u001b[107m\u001b[36m \u001b[m\u001b[93m\u001b[107m\u001b[31m\\\"\u001b[m\u001b[93m\u001b[107m\u001b[1C\u001b[36m} \"\u001b[m\u001b[93m\u001b[107m\u001b[53;210H\u001b[38;5;22m\u001b[48;5;117m9\u001b[26;33H\u001b[?12l\u001b[?25h" + ], + [ + 0.037497, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[36mt | printf \u001b[m\u001b[93m\u001b[107m\u001b[31m\\\"%-71s\u001b[m\u001b[93m\u001b[107m\u001b[36m \u001b[m\u001b[93m\u001b[107m\u001b[31m\\\"\u001b[m\u001b[93m\u001b[107m\u001b[1C\u001b[36m} \"\u001b[m\u001b[93m\u001b[107m\u001b[53;209H\u001b[38;5;22m\u001b[48;5;117m30\u001b[26;34H\u001b[?12l\u001b[?25h" + ], + [ + 0.329898, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[54;1H\u001b[K" + ], + [ + 0.005721, + "\u001b[53;1H\u001b[1m\u001b[38;5;22m\u001b[48;5;148m NORMAL \u001b[m\u001b[93m\u001b[107m\u001b[38;5;231m\u001b[48;5;31m\u001b[m\u001b[93m\u001b[107m\u001b[53;9H\u001b[38;5;148m\u001b[48;5;240m\u001b[53;10H \u001b[m\u001b[93m\u001b[107m\u001b[38;5;250m\u001b[48;5;240m\u001b[53;12H kpod-format-table \u001b[m\u001b[93m\u001b[107m\u001b[38;5;245m\u001b[48;5;240m\u001b[53;32H \u001b[m\u001b[93m\u001b[107m\u001b[38;5;250m\u001b[48;5;240mcmd/kpod/\u001b[m\u001b[93m\u001b[107m\u001b[1m\u001b[38;5;231m\u001b[48;5;240mimages.go\u001b[m\u001b[93m\u001b[107m\u001b[1m\u001b[38;5;220m\u001b[48;5;31m \u001b[m\u001b[93m\u001b[107m\b\u001b[1m\u001b[38;5;220m\u001b[48;5;240m + \u001b[m\u001b[93m\u001b[107m\u001b[38;5;31m\u001b[48;5;24m\u001b[m\u001b[93m\u001b[107m\u001b[53;54H\u001b[38;5;240m\u001b[48;5;236m\u001b[53;55H \u001b[m\u001b[93m\u001b[107m\u001b[38;5;231m\u001b[48;5;236m                                                                                                                        \u001b[m\u001b[93m\u001b[107m\u001b[38;5;247m\u001b[48;5;236munix\u001b[m\u001b[93m\u001b[107m\u001b[38;5;244m\u001b[48;5;236m \u001b[m\u001b[93m\u001b[107m\u001b[53;182H\u001b[38;5;247m\u001b[48;5;236m utf-8\u001b[m\u001b[93m\u001b[107m\u001b[38;5;244m\u001b[48;5;236m \u001b[m\u001b[93m\u001b[107m\u001b[53;190H\u001b[38;5;247m\u001b[48;5;236m" + ], + [ + 2.8e-05, + " go\u001b[m\u001b[93m\u001b[107m\u001b[38;5;240m\u001b[48;5;236m \u001b[m\u001b[93m\u001b[107m\u001b[53;195H\u001b[38;5;107m\u001b[48;5;240m  61%\u001b[m\u001b[93m\u001b[107m\u001b[38;5;252m\u001b[48;5;240m \u001b[m\u001b[93m\u001b[107m\u001b[53;202H\u001b[38;5;235m\u001b[48;5;252m \u001b[53;204H \u001b[m\u001b[93m\u001b[107m\u001b[1m\u001b[38;5;235m\u001b[48;5;252m123\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;117m:\u001b[m\u001b[93m\u001b[107m\b\u001b[38;5;22m\u001b[48;5;252m:29 \u001b[26;33H\u001b[?12l\u001b[?25h" + ], + [ + 0.282806, + "\u001b[?25l\u001b[54;1H\u001b[m\u001b[93m\u001b[107m:\u001b[?2004h\u001b[?12l\u001b[?25h" + ], + [ + 0.320108, + "w" + ], + [ + 0.00016, + "\u001b[?25l\u001b[?12l\u001b[?25h" + ], + [ + 0.09557, + "q\u001b[?25l\u001b[?12l\u001b[?25h" + ], + [ + 0.080523, + "\r\u001b[?25l\u001b[?2004l" + ], + [ + 0.015569, + "\"cmd/kpod/images.go\"" + ], + [ + 0.005889, + " 203L, 4796C written" + ], + [ + 0.015946, + "\r\r\r\n\u001b[39;49m\u001b[?2004l\u001b[?1l\u001b>\u001b[?12l\u001b[?25h\u001b[?1049l" + ], + [ + 0.003478, + "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r" + ], + [ + 0.034812, + "\r\n\u001b[34m\u001b[01mcri-o\u001b[22m \u001b[90mgit/kpod-format-table* \u001b[39m \u001b[33m7s\u001b[39m\r\n" + ], + [ + 0.00239, + "\u001b]7;file://localhost.localdomain/home/ryan/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007" + ], + [ + 9.2e-05, + "\u001b]2;ryan@localhost: ~/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007" + ], + [ + 2.3e-05, + "\u001b]1;..cubator/cri-o\u0007" + ], + [ + 0.000169, + "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[35m❯\u001b[39m \u001b[K\u001b[208C\u001b[90m\u001b[39m\u001b[208D\u001b[?1h\u001b=" + ], + [ + 3.6e-05, + "\u001b[?2004h" + ], + [ + 0.906176, + "g" + ], + [ + 0.11065, + "\bgi" + ], + [ + 0.064415, + "t" + ], + [ + 0.143259, + " " + ], + [ + 0.080894, + "c" + ], + [ + 0.048032, + "o" + ], + [ + 0.103375, + "m" + ], + [ + 0.337522, + "i" + ], + [ + 0.287202, + "\b \b" + ], + [ + 0.191689, + "m" + ], + [ + 0.127496, + "i" + ], + [ + 0.096447, + "t" + ], + [ + 0.055022, + " " + ], + [ + 0.128991, + "-" + ], + [ + 0.136055, + "a" + ], + [ + 0.119988, + " " + ], + [ + 0.135881, + "-" + ], + [ + 0.159957, + "-" + ], + [ + 0.120583, + "a" + ], + [ + 0.087513, + "m" + ], + [ + 0.111928, + "e" + ], + [ + 0.104033, + "n" + ], + [ + 0.088352, + "d" + ], + [ + 0.127489, + "\u001b[?1l\u001b>" + ], + [ + 0.0001, + "\u001b[?2004l\r\r\n" + ], + [ + 0.002622, + "\u001b]2;git commit -a --amend\u0007\u001b]1;git\u0007" + ], + [ + 0.026245, + "\u001b[?2004h\u001b[?1049h\u001b[?1h\u001b=\u001b[?2004h" + ], + [ + 0.000861, + "\u001b[1;54r\u001b[?12;25h\u001b[?12l\u001b[?25h\u001b[27m\u001b[23m\u001b[m\u001b[H\u001b[2J\u001b[?25l\u001b[54;1H\"~/Development/Go/src/github.com/kubernetes-incubator/cri-o/.git/COMMIT_EDITMSG\"" + ], + [ + 0.000158, + " 15L, 455C" + ], + [ + 0.00016, + "\u001b[1;1HMake kpod images use text/template by default\r\n\r\nSigned-off-by: Ryan Cole \r\n\r\n# Please enter the commit message for your changes. Lines starting\r\n# with '#' will be ignored, and an empty message aborts the commit.\r\n#\r\n# Date: Tue Aug 15 22:23:40 2017 -0400\r\n#\r\n# On branch kpod-format-table\r\n# Changes to be committed:\r\n#\u001b[7Cmodified: cmd/kpod/formats/formats.go\r\n#\u001b[7Cmodified: cmd/kpod/formats/templates.go\r\n#\u001b[7Cmodified: cmd/kpod/images.go\r\n#\r\n\u001b[94m~ \u001b[17;1H~ \u001b[18;1H~ " + ], + [ + 2e-05, + " \u001b[19;1H~ \u001b[20;1H~ \u001b[21;1H~ \u001b[22;1H~ \u001b[23;1H~ " + ], + [ + 5.1e-05, + " \u001b[24;1H~ \u001b[25;1H~ \u001b[26;1H~ \u001b[27;1H~ " + ], + [ + 1.5e-05, + " \u001b[28;1H~ \u001b[29;1H~ \u001b[30;1H~ \u001b[31;1H~ \u001b[32;1H~ " + ], + [ + 5e-05, + " \u001b[33;1H~ \u001b[34;1H~ \u001b[35;1H~ \u001b[36;1H~ \u001b[37;1H~ " + ], + [ + 1.5e-05, + " \u001b[38;1H~ \u001b[39;1H~ \u001b[40;1H~ \u001b[41;1H~ " + ], + [ + 7.1e-05, + " \u001b[42;1H~ \u001b[43;1H~ \u001b[44;1H~ \u001b[45;1H~ \u001b[46;1H~ " + ], + [ + 1.6e-05, + " \u001b[47;1H~ \u001b[48;1H~ \u001b[49;1H~ \u001b[50;1H~ \u001b[51;1H~ " + ], + [ + 1.6e-05, + " \u001b[52;1H~ \u001b[53;1H~ \u001b[1;1H\u001b[?12l\u001b[?25h" + ], + [ + 0.297423, + "\u001b[?25l\u001b[m\u001b[54;1H\u001b[K\u001b[54;1H:\u001b[?2004h" + ], + [ + 0.000258, + "\u001b[?12l\u001b[?25h" + ], + [ + 0.143378, + "w" + ], + [ + 0.072145, + "q" + ], + [ + 0.095864, + "\r\u001b[?25l\u001b[?2004l" + ], + [ + 6e-05, + "\".git/COMMIT_EDITMSG\"" + ], + [ + 0.0116, + " 15L, 455C written\r\r\r\n\u001b[?2004l\u001b[?1l\u001b>\u001b[?12l\u001b[?25h\u001b[?1049l" + ], + [ + 0.002475, + "[kpod-format-table ba07bfb9] Make kpod images use text/template by default\r\n Date: Tue Aug 15 22:23:40 2017 -0400\r\n" + ], + [ + 0.000465, + " 3 files changed, 36 insertions(+), 61 deletions(-)\r\n" + ], + [ + 0.000403, + "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r" + ], + [ + 0.026137, + "\r\n\u001b[34m\u001b[01mcri-o\u001b[22m \u001b[90mgit/kpod-format-table \u001b[39m \u001b[33m\u001b[39m\r\n" + ], + [ + 0.001205, + "\u001b]7;file://localhost.localdomain/home/ryan/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007" + ], + [ + 0.000102, + "\u001b]2;ryan@localhost: ~/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007" + ], + [ + 0.000115, + "\u001b]1;..cubator/cri-o\u0007" + ], + [ + 2.9e-05, + "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[35m❯\u001b[39m \u001b[K\u001b[208C\u001b[90m\u001b[39m\u001b[208D" + ], + [ + 7.6e-05, + "\u001b[?1h\u001b=" + ], + [ + 2e-05, + "\u001b[?2004h" + ], + [ + 14.9661, + "g" + ], + [ + 0.136155, + "\bgi" + ], + [ + 0.079381, + "t" + ], + [ + 0.080921, + " " + ], + [ + 0.047606, + "p" + ], + [ + 0.09957, + "u" + ], + [ + 0.13683, + "s" + ], + [ + 0.083539, + "h" + ], + [ + 0.111539, + " " + ], + [ + 0.11253, + "-" + ], + [ + 0.159311, + "f" + ], + [ + 0.132344, + " " + ], + [ + 0.132514, + "o" + ], + [ + 0.144066, + "r" + ], + [ + 0.143563, + "i" + ], + [ + 0.155326, + "g" + ], + [ + 0.128262, + "i" + ], + [ + 0.112524, + "n" + ], + [ + 0.035327, + " " + ], + [ + 0.184803, + "k" + ], + [ + 0.120956, + "pod-" + ], + [ + 0.139448, + "f" + ], + [ + 0.127973, + "o" + ], + [ + 0.134993, + "rmat-table\u001b[1m \u001b[0m" + ], + [ + 0.600821, + "\b\u001b[0m \b\u001b[?1l\u001b>\u001b[?2004l\r\r\n" + ], + [ + 0.002119, + "\u001b]2;git push -f origin kpod-format-table\u0007\u001b]1;git\u0007" + ], + [ + 1.180562, + "Counting objects: 8, done.\r\n" + ], + [ + 0.000119, + "Delta compression using up to 4 threads.\r\n" + ], + [ + 4.1e-05, + "Compressing objects: 12% (1/8) \r" + ], + [ + 9.2e-05, + "Compressing objects: 25% (2/8) \r" + ], + [ + 7.4e-05, + "Compressing objects: 37% (3/8) \r" + ], + [ + 0.000131, + "Compressing objects: 50% (4/8) \r" + ], + [ + 1.4e-05, + "Compressing objects: 62% (5/8) \r" + ], + [ + 3.3e-05, + "Compressing objects: 75% (6/8) \r" + ], + [ + 2.2e-05, + "Compressing objects: 87% (7/8) \r" + ], + [ + 3.6e-05, + "Compressing objects: 100% (8/8) \r" + ], + [ + 4e-05, + "Compressing objects: 100% (8/8), done.\r\n" + ], + [ + 0.000193, + "Writing objects: 12% (1/8) \r" + ], + [ + 4.3e-05, + "Writing objects: 25% (2/8) \r" + ], + [ + 4.2e-05, + "Writing objects: 37% (3/8) \r" + ], + [ + 4.4e-05, + "Writing objects: 50% (4/8) \r" + ], + [ + 6.2e-05, + "Writing objects: 62% (5/8) \r" + ], + [ + 4e-05, + "Writing objects: 75% (6/8) \r" + ], + [ + 3.9e-05, + "Writing objects: 87% (7/8) \r" + ], + [ + 7.2e-05, + "Writing objects: 100% (8/8) \r" + ], + [ + 2.3e-05, + "Writing objects: 100% (8/8), 1.02 KiB | 1.02 MiB/s, done.\r\nTotal 8 (delta 6), reused 0 (delta 0)\r\n" + ], + [ + 0.089402, + "remote: Resolving deltas: 0% (0/6) \u001b[K\r" + ], + [ + 0.036283, + "remote: Resolving deltas: 16% (1/6) \u001b[K\rremote: Resolving deltas: 33% (2/6) \u001b[K\rremote: Resolving deltas: 50% (3/6) \u001b[K\rremote: Resolving deltas: 66% (4/6) \u001b[K\rremote: Resolving deltas: 83% (5/6) \u001b[K\rremote: Resolving deltas: 100% (6/6) \u001b[K\rremote: Resolving deltas: 100% (6/6), completed with 6 local objects.\u001b[K\r\n" + ], + [ + 1.955619, + "To github.com:14rcole/cri-o\r\n + 99495909...ba07bfb9 kpod-format-table -> kpod-format-table (forced update" + ], + [ + 7.3e-05, + ")\r\n" + ], + [ + 0.001606, + "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r" + ], + [ + 0.029351, + "\r\n\u001b[34m\u001b[01mcri-o\u001b[22m \u001b[90mgit/kpod-format-table \u001b[39m \u001b[33m\u001b[39m\r\n" + ], + [ + 0.001026, + "\u001b]7;file://localhost.localdomain/home/ryan/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007" + ], + [ + 8.9e-05, + "\u001b]2;ryan@localhost: ~/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007" + ], + [ + 2.1e-05, + "\u001b]1;..cubator/cri-o\u0007" + ], + [ + 0.000163, + "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[35m❯\u001b[39m \u001b[K\u001b[208C\u001b[90m\u001b[39m\u001b[208D" + ], + [ + 6.6e-05, + "\u001b[?1h\u001b=" + ], + [ + 2e-05, + "\u001b[?2004h" + ], + [ + 330.270968, + "v" + ], + [ + 0.119343, + "\bvi" + ], + [ + 0.103605, + " " + ], + [ + 0.088799, + "t" + ], + [ + 0.080179, + "e" + ], + [ + 0.198952, + "st\u001b[1m/\u001b[0m" + ], + [ + 0.353296, + "\b\u001b[0m \b" + ], + [ + 0.499203, + "\b \b" + ], + [ + 0.02974, + "\b \b" + ], + [ + 0.031437, + "\b \b" + ], + [ + 0.029177, + "\b \b" + ], + [ + 0.030945, + "\b" + ], + [ + 0.029122, + "\b\bv \b" + ], + [ + 0.029942, + "\b \b" + ], + [ + 0.136039, + "g" + ], + [ + 0.071775, + "\bgi" + ], + [ + 0.112776, + "t" + ], + [ + 0.063244, + " " + ], + [ + 0.144384, + "c" + ], + [ + 0.055871, + "h" + ], + [ + 0.144103, + "e" + ], + [ + 0.080216, + "c" + ], + [ + 0.07079, + "k" + ], + [ + 0.112014, + "o" + ], + [ + 0.064547, + "u" + ], + [ + 0.080139, + "t" + ], + [ + 0.095908, + " " + ], + [ + 0.104077, + "k" + ], + [ + 0.138478, + "pod-" + ], + [ + 0.117535, + "s" + ], + [ + 0.128338, + "t" + ], + [ + 0.259432, + "a" + ], + [ + 0.522987, + "\u0007" + ], + [ + 0.000167, + "\r\r\n" + ], + [ + 8.2e-05, + "\u001b[J\u001b[0mkpod-start \u001b[Jkpod-stats\u001b[J\u001b[A\u001b[0m\u001b[27m\u001b[24m\u001b[39m\r\u001b[2Cgit checkout kpod-sta\u001b[K\u001b[187C\u001b[90m\u001b[39m\u001b[39m\u001b[187D" + ], + [ + 0.225726, + "t" + ], + [ + 0.239644, + "s\u001b[1m \u001b[0m" + ], + [ + 0.327637, + "\b\u001b[0m \b" + ], + [ + 0.000136, + "\u001b[?1l\u001b>" + ], + [ + 0.000445, + "\u001b[?2004l\r\r\n\u001b[J" + ], + [ + 0.004978, + "\u001b]2;git checkout kpod-stats\u0007\u001b]1;git\u0007" + ], + [ + 0.041451, + "Switched to branch 'kpod-stats'\r\n" + ], + [ + 6.6e-05, + "Your branch is up-to-date with 'origin/kpod-stats'.\r\n" + ], + [ + 0.000587, + "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r" + ], + [ + 0.035434, + "\r\n\u001b[34m\u001b[01mcri-o\u001b[22m \u001b[90mgit/kpod-stats \u001b[39m \u001b[33m\u001b[39m\r\n" + ], + [ + 0.001297, + "\u001b]7;file://localhost.localdomain/home/ryan/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007" + ], + [ + 7.4e-05, + "\u001b]2;ryan@localhost: ~/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007" + ], + [ + 2.1e-05, + "\u001b]1;..cubator/cri-o\u0007" + ], + [ + 0.000329, + "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[35m❯\u001b[39m \u001b[K\u001b[208C\u001b[90m\u001b[39m\u001b[208D" + ], + [ + 6.6e-05, + "\u001b[?1h\u001b=" + ], + [ + 2.2e-05, + "\u001b[?2004h" + ], + [ + 2.822658, + "v" + ], + [ + 0.107877, + "\bvi" + ], + [ + 0.28439, + " " + ], + [ + 0.083967, + "l" + ], + [ + 0.064538, + "i" + ], + [ + 0.100026, + "b" + ], + [ + 0.167219, + "kpod\u001b[1m/\u001b[0m" + ], + [ + 0.572222, + "\b\u001b[0m/c" + ], + [ + 0.09244, + "o" + ], + [ + 0.118682, + "\u0007" + ], + [ + 0.000448, + "\r\r\n" + ], + [ + 0.000186, + "\u001b[J\u001b[38;5;33mcommon\u001b[0m/ \u001b[Jconfig.go \u001b[Jcontainer_data.go \u001b[Jcontainer.go \u001b[Jcontainer_server.go\u001b[J\u001b[A\u001b[0m\u001b[27m\u001b[24m\u001b[39m\r\u001b[2Cvi libkpod/co\u001b[K\u001b[195C\u001b[90m\u001b[39m\u001b[39m\u001b[195D" + ], + [ + 0.632962, + "t" + ], + [ + 0.209392, + "\u0007\r\r\n\u001b[J\u001b[A\u001b[16C" + ], + [ + 0.694432, + "\b \b" + ], + [ + 0.159374, + "n" + ], + [ + 0.086549, + "\u0007" + ], + [ + 0.000211, + "\r\r\n\u001b[J" + ], + [ + 9.9e-05, + "\u001b[J\u001b[0mconfig.go \u001b[Jcontainer_data.go \u001b[Jcontainer.go \u001b[Jcontainer_server.go\u001b[J\u001b[A\u001b[0m\u001b[27m\u001b[24m\u001b[39m\r\u001b[2Cvi libkpod/con\u001b[K\u001b[194C\u001b[90m\u001b[39m\u001b[39m\u001b[194D" + ], + [ + 0.481713, + "t" + ], + [ + 0.111125, + "a" + ], + [ + 0.180888, + "\r\r\n\u001b[J\u001b[A\u001b[18Ciner" + ], + [ + 0.492502, + "_" + ], + [ + 0.206735, + "s" + ], + [ + 0.024184, + "e" + ], + [ + 0.325519, + "rver.go\u001b[1m \u001b[0m" + ], + [ + 0.3706, + "\b\u001b[0m \b" + ], + [ + 0.0002, + "\u001b[?1l\u001b>\u001b[?2004l\r\r\n\u001b[J" + ], + [ + 0.00447, + "\u001b]2;vim libkpod/container_server.go\u0007\u001b]1;vi\u0007" + ], + [ + 0.135276, + "\u001b[?2004h\u001b[?1049h\u001b[?1h\u001b=\u001b[?2004h" + ], + [ + 0.000662, + "\u001b[1;54r\u001b[?12;25h\u001b[?12l\u001b[?25h\u001b[27m\u001b[23m\u001b[m\u001b[93m\u001b[107m\u001b[H\u001b[2J\u001b[?25l\u001b[54;1H\"libkpod/container_server.go\"" + ], + [ + 0.00017, + " 684L, 20532C" + ], + [ + 0.008173, + "\u001b[2;1H▽\u001b[6n\u001b[2;1H \u001b[1;1H\u001b[>c" + ], + [ + 0.025784, + "\u001b[1;1H\u001b[96m\u001b[47m586 \u001b[m\u001b[93m\u001b[107m \u001b[32mdefer\u001b[m\u001b[93m\u001b[107m c.stateLock.Unlock()\r\n\u001b[96m\u001b[47m587 \u001b[m\u001b[93m\u001b[107m sbID := ctr.Sandbox()\r\n\u001b[96m\u001b[47m588 \u001b[m\u001b[93m\u001b[107m sb := c.state.sandboxes[sbID]\r\n\u001b[96m\u001b[47m589 \u001b[m\u001b[93m\u001b[107m sb.RemoveContainer(ctr)\r\n\u001b[96m\u001b[47m590 \u001b[m\u001b[93m\u001b[107m c.state.containers.Delete(ctr.ID())\r\n\u001b[96m\u001b[47m591 \u001b[m\u001b[93m\u001b[107m}\r\n\u001b[96m\u001b[47m592 \r\n593 \u001b[m\u001b[93m\u001b[107m\u001b[96m// listContainers returns a list of all containers stored by the server state\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m594 \u001b[m\u001b[93m\u001b[107m\u001b[32mfunc\u001b[m\u001b[93m\u001b[107m (c *ContainerServer) listContainers() []*oci.Container {\r\n\u001b[96m\u001b[47m595 \u001b[m\u001b[93m\u001b[107m c.stateLock.Lock()\r\n\u001b[96m\u001b[47m596 \u001b[m\u001b[93m\u001b[107m \u001b[32mdefer\u001b[m\u001b[93m\u001b[107m c.stateLock.Unlock()\r\n\u001b[96m\u001b[47m597 \u001b[m\u001b[93m\u001b[107m \u001b[32mreturn\u001b[m\u001b[93m\u001b[107m c.state.containers.List()\r\n\u001b[96m\u001b[47m598 \u001b[m\u001b[93m\u001b[107m}\r\n\u001b[96m\u001b[47m599 \r\n600 \u001b[m\u001b[93m\u001b[107m\u001b[96m// ListContainers returns a list of all containers stored by the server state that match the given filter function\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b" + ], + [ + 2.9e-05, + "[47m601 \u001b[m\u001b[93m\u001b[107m\u001b[32mfunc\u001b[m\u001b[93m\u001b[107m (c *ContainerServer) ListContainers(filters ...\u001b[32mfunc\u001b[m\u001b[93m\u001b[107m(*oci.Container) \u001b[33mbool\u001b[m\u001b[93m\u001b[107m) ([]*oci.Container, \u001b[33merror\u001b[m\u001b[93m\u001b[107m) {\r\n\u001b[96m\u001b[47m602 \u001b[m\u001b[93m\u001b[107m containers := c.listContainers()\r\n\u001b[96m\u001b[47m603 \u001b[m\u001b[93m\u001b[107m \u001b[32mif\u001b[m\u001b[93m\u001b[107m \u001b[32mlen\u001b[m\u001b[93m\u001b[107m(filters) == \u001b[36m0\u001b[m\u001b[93m\u001b[107m {\r\n\u001b[96m\u001b[47m604 \u001b[m\u001b[93m\u001b[107m\u001b[8C\u001b[32mreturn\u001b[m\u001b[93m\u001b[107m containers, \u001b[36mnil\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m605 \u001b[m\u001b[93m\u001b[107m }\r\n\u001b[96m\u001b[47m606 \u001b[m\u001b[93m\u001b[107m filteredContainers := \u001b[32mmake\u001b[m\u001b[93m\u001b[107m([]*oci.Container, \u001b[36m0\u001b[m\u001b[93m\u001b[107m, \u001b[32mlen\u001b[m\u001b[93m\u001b[107m(containers))\r\n\u001b[96m\u001b[47m607 \u001b[m\u001b[93m\u001b[107m \u001b[32mfor\u001b[m\u001b[93m\u001b[107m _, container := \u001b[32mrange\u001b[m\u001b[93m\u001b[107m containers {\r\n\u001b[96m\u001b[47m608 \u001b[m\u001b[93m\u001b[107m\u001b[8C\u001b[32mfor\u001b[m\u001b[93m\u001b[107m _, filter := \u001b[32mrange\u001b[m\u001b[93m\u001b[107m filters {\r\n\u001b[96m\u001b[47m609 \u001b[m\u001b[93m\u001b[107m\u001b[12C\u001b[32mif\u001b[m\u001b[93m\u001b[107m filter(container) \u001b[1m\u001b[31m\u001b[106m{\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m610 \u001b[m" + ], + [ + 0.027894, + "\u001b[93m\u001b[107m\u001b[16CfilteredContainers = \u001b[32mappend\u001b[m\u001b[93m\u001b[107m(filteredContainers, container)\r\n\u001b[96m\u001b[47m611 \u001b[m\u001b[93m\u001b[107m\u001b[12C\u001b[1m\u001b[31m\u001b[106m}\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m612 \u001b[m\u001b[93m\u001b[107m\u001b[8C}\r\n\u001b[96m\u001b[47m613 \u001b[m\u001b[93m\u001b[107m }\r\n\u001b[96m\u001b[47m614 \u001b[m\u001b[93m\u001b[107m \u001b[32mreturn\u001b[m\u001b[93m\u001b[107m filteredContainers, \u001b[36mnil\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m615 \u001b[m\u001b[93m\u001b[107m}\r\n\u001b[96m\u001b[47m616 \r\n617 \u001b[m\u001b[93m\u001b[107m\u001b[96m// AddSandbox adds a sandbox to the sandbox state store\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m618 \u001b[m\u001b[93m\u001b[107m\u001b[32mfunc\u001b[m\u001b[93m\u001b[107m (c *ContainerServer) AddSandbox(sb *sandbox.Sandbox) {\r\n\u001b[96m\u001b[47m619 \u001b[m\u001b[93m\u001b[107m c.stateLock.Lock()\r\n\u001b[96m\u001b[47m620 \u001b[m\u001b[93m\u001b[107m \u001b[32mdefer\u001b[m\u001b[93m\u001b[107m c.stateLock.Unlock()\r\n\u001b[96m\u001b[47m621 \u001b[m\u001b[93m\u001b[107m c.state.sandboxes[sb.ID()] = sb\r\n\u001b[96m\u001b[47m622 \u001b[m\u001b[93m\u001b[107m}\r\n\u001b[96m\u001b[47m623 \r\n624 \u001b[m\u001b[93m\u001b[107m\u001b[96m// GetSandbox returns a sandbox by its ID\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m625 \u001b[m\u001b[93m\u001b[107m\u001b[32mfunc\u001b[m\u001b[93m\u001b[107m (c *ContainerServer) GetSandbox(id \u001b[33mstring\u001b[m\u001b[93m\u001b[107m) *sandb" + ], + [ + 2.9e-05, + "ox.Sandbox {\r\n\u001b[96m\u001b[47m626 \u001b[m\u001b[93m\u001b[107m c.stateLock.Lock()\r\n\u001b[96m\u001b[47m627 \u001b[m\u001b[93m\u001b[107m \u001b[32mdefer\u001b[m\u001b[93m\u001b[107m c.stateLock.Unlock()\r\n\u001b[96m\u001b[47m628 \u001b[m\u001b[93m\u001b[107m \u001b[32mreturn\u001b[m\u001b[93m\u001b[107m c.state.sandboxes[id]\r\n\u001b[96m\u001b[47m629 \u001b[m\u001b[93m\u001b[107m}\r\n\u001b[96m\u001b[47m630 \r\n631 \u001b[m\u001b[93m\u001b[107m\u001b[96m// GetSandboxContainer returns a sandbox's infra container\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m632 \u001b[m\u001b[93m\u001b[107m\u001b[32mfunc\u001b[m\u001b[93m\u001b[107m (c *ContainerServer) GetSandboxContainer(id \u001b[33mstring\u001b[m\u001b[93m\u001b[107m) *oci.Container {\r\n\u001b[96m\u001b[47m633 \u001b[m\u001b[93m\u001b[107m c.stateLock.Lock()\r\n\u001b[96m\u001b[47m634 \u001b[m\u001b[93m\u001b[107m \u001b[32mdefer\u001b[m\u001b[93m\u001b[107m c.stateLock.Unlock()\r\n\u001b[96m\u001b[47m635 \u001b[m\u001b[93m\u001b[107m sb, ok := c.state.sandboxes[id]\r\n\u001b[96m\u001b[47m636 \u001b[m\u001b[93m\u001b[107m \u001b[32mif\u001b[m\u001b[93m\u001b[107m !ok {\r\n\u001b[96m\u001b[47m637 \u001b[m\u001b[93m\u001b[107m\u001b[8C\u001b[32mreturn\u001b[m\u001b[93m\u001b[107m \u001b[36mnil\u001b[m\u001b[93m\u001b[107m\r\n\u001b[1m\u001b[38;5;22m\u001b[48;5;148m NORMAL \u001b[m\u001b[93m\u001b[107m\u001b[38;5;148m\u001b[48;5;240m\u001b[53;10H \u001b[m\u001b[93m\u001b[107m\u001b[38;5;250m\u001b[48;5;240m\u001b[53;12H kpod-stats \u001b[m\u001b[93m\u001b[107m" + ], + [ + 0.00922, + "\u001b[38;5;245m\u001b[48;5;240m\u001b[53;25H \u001b[m\u001b[93m\u001b[107m\u001b[38;5;250m\u001b[48;5;240mlibkpod/\u001b[m\u001b[93m\u001b[107m\u001b[1m\u001b[38;5;231m\u001b[48;5;240mcontainer_server.go \u001b[m\u001b[93m\u001b[107m\u001b[38;5;240m\u001b[48;5;236m\u001b[53;55H \u001b[m\u001b[93m\u001b[107m\u001b[38;5;231m\u001b[48;5;236m                                                                                                                        \u001b[m\u001b[93m\u001b[107m\u001b[38;5;247m\u001b[48;5;236munix\u001b[m\u001b[93m\u001b[107m\u001b[38;5;244m\u001b[48;5;236m \u001b[m\u001b[93m\u001b[107m\u001b[53;182H\u001b[38;5;247m\u001b[48;5;236m utf-8\u001b[m\u001b[93m\u001b[107m\u001b[38;5;244m\u001b[48;5;236m \u001b[m\u001b[93m\u001b[107m\u001b[53;190H\u001b[38;5;247m\u001b[48;5;236m go\u001b[m\u001b[93m\u001b[107m\u001b[38;5;240m\u001b[48;5;236m \u001b[m\u001b[93m\u001b[107m\u001b[53;195H\u001b[38;5;144m\u001b[48;5;240m  89%\u001b[m\u001b[93m\u001b[107m\u001b[38;5;252m\u001b[48;5;240m \u001b[m\u001b[93m\u001b[107m\u001b[53;202H\u001b[38;5;235m\u001b[48;5;252m \u001b[53;204H \u001b[m\u001b[93m\u001b[107m\u001b[1m\u001b[38;5;235m\u001b[48;5;252m611\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:13 \u001b[26;17H\u001b[?12l\u001b[?25h" + ], + [ + 2e-05, + "\u001bP+q436f\u001b\\\u001bP+q6b75\u001b\\\u001bP+q6b64\u001b\\\u001bP+q6b72\u001b\\\u001bP+q6b6c\u001b\\\u001bP+q2332\u001b\\\u001bP+q2334\u001b\\\u001bP+q2569\u001b\\\u001bP+q2a37\u001b\\\u001bP+q6b31\u001b\\" + ], + [ + 3.500046, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[54;1H\u001b[K\u001b[54;1H/\u001b[?2004h\u001b[?12l\u001b[?25h" + ], + [ + 0.32149, + "L\u001b[?25l" + ], + [ + 0.014673, + "\u001b[34;16H\u001b[7m\u001b[91mL\u001b[27m\u001b[m\u001b[93m\u001b[107m\u001b[53;2H\u001b[1m\u001b[38;5;22m\u001b[48;5;148mCOMMND \u001b[m\u001b[93m\u001b[107m\u001b[186C\u001b[38;5;247m\u001b[48;5;240m  90%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m9\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:12\r\n\u001b[m\u001b[93m\u001b[107m/L\u001b[?12l\u001b[?25h" + ], + [ + 0.16782, + "i\u001b[?25l" + ], + [ + 0.004265, + "\u001b[1;1H\u001b[96m\u001b[47m609\u001b[m\u001b[93m\u001b[107m\u001b[5C \u001b[32mif\u001b[m\u001b[93m\u001b[107m filter(container) \u001b[1m\u001b[31m\u001b[106m{\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m610\u001b[m\u001b[93m\u001b[107m\u001b[5C filteredContainers = \u001b[32mappend\u001b[m\u001b[93m\u001b[107m(filteredContainers, container)\r\n\u001b[96m\u001b[47m611\u001b[m\u001b[93m\u001b[107m\u001b[5C \u001b[1m\u001b[31m\u001b[106m}\u001b[m\u001b[93m\u001b[107m\u001b[3;18H\u001b[K\u001b[4;1H\u001b[96m\u001b[47m612\u001b[m\u001b[93m\u001b[107m\u001b[5C }\u001b[4;14H\u001b[K\u001b[5;1H\u001b[96m\u001b[47m613\u001b[m\u001b[93m\u001b[107m\u001b[5C}\u001b[5;10H\u001b[K\u001b[6;1H\u001b[96m\u001b[47m614\u001b[m\u001b[93m\u001b[107m\u001b[1C \u001b[32mreturn\u001b[m\u001b[93m\u001b[107m filteredContainers, \u001b[36mnil\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m615\u001b[m\u001b[93m\u001b[107m\u001b[1C}\r\n\u001b[96m\u001b[47m616\u001b[m\u001b[93m\u001b[107m\u001b[8;5H\u001b[K\u001b[9;1H\u001b[96m\u001b[47m617\u001b[m\u001b[93m\u001b[107m\u001b[1C\u001b[96m// AddSandbox adds a sandbox to the sandbox state store\u001b[m\u001b[93m\u001b[107m\u001b[9;60H\u001b[K\u001b[10;1H\u001b[96m\u001b[47m618\u001b[m\u001b[93m\u001b[107m\u001b[1C\u001b[32mfunc\u001b[m\u001b[93m\u001b[107m (c *ContainerServer) AddSandbox(sb *sandbox.Sandbox) {\r\n\u001b[96m\u001b[47m619\u001b[m\u001b[93m\u001b[107m\u001b[5Cc.stateLock.Lock()\u001b[11;27H\u001b[K\u001b[12;1H\u001b[96m\u001b[47m620\u001b[m\u001b[93m\u001b[107m\u001b[5C\u001b[32mdefe\u001b[m\u001b[93m\u001b[107m\u001b[1C c.stateLock.Unlock()\u001b[12;35H\u001b[K\u001b[13;1H\u001b[96m\u001b[47m621\u001b[m\u001b[93m\u001b" + ], + [ + 5.4e-05, + "[107m\u001b[1C c.state.sandboxes[sb.ID()] = sb\r\n\u001b[96m\u001b[47m622\u001b[m\u001b[93m\u001b[107m\u001b[1C}\u001b[15;2H\u001b[96m\u001b[47m23\u001b[m\u001b[93m\u001b[107m\u001b[15;5H\u001b[K\u001b[16;2H\u001b[96m\u001b[47m24\u001b[m\u001b[93m\u001b[107m\u001b[1C\u001b[96m// GetSandbox returns a sandbox by its ID\u001b[m\u001b[93m\u001b[107m\u001b[16;46H\u001b[K\u001b[17;2H\u001b[96m\u001b[47m25\u001b[m\u001b[93m\u001b[107m\u001b[1C\u001b[32mfunc\u001b[m\u001b[93m\u001b[107m (c *ContainerServer) GetSandbox(id \u001b[33mstring\u001b[m\u001b[93m\u001b[107m) *sandbox.Sandbox {\u001b[18;2H\u001b[96m\u001b[47m26\u001b[m\u001b[93m\u001b[107m\u001b[5Cc.stateLock.Lock()\u001b[18;28H\u001b[K\u001b[19;2H\u001b[96m\u001b[47m27\u001b[m\u001b[93m\u001b[107m\u001b[5C\u001b[32mdefe\u001b[m\u001b[93m\u001b[107m\u001b[1C c.stateLock.Unlock()\u001b[20;2H\u001b[96m\u001b[47m28\u001b[m\u001b[93m\u001b[107m\u001b[5C\u001b[32mreturn\u001b[m\u001b[93m\u001b[107m c.state.sandboxes[id]\u001b[21;2H\u001b[96m\u001b[47m29\u001b[m\u001b[93m\u001b[107m\u001b[1C}\u001b[21;9H\u001b[K\u001b[22;2H\u001b[96m\u001b[47m30\u001b[m\u001b[93m\u001b[107m\u001b[22;9H\u001b[K\u001b[23;2H\u001b[96m\u001b[47m31\u001b[m\u001b[93m\u001b[107m\u001b[1C\u001b[96m// GetSandboxContainer returns a sandbox's infra container\u001b[m\u001b[93m\u001b[107m\u001b[24;2H\u001b[96m\u001b[47m32\u001b[m\u001b[93m\u001b[107m\u001b[1C\u001b[32mfunc\u001b[m\u001b[93m\u001b[107m (c *ContainerServer) GetSandboxContainer(id \u001b[33mstring\u001b[m\u001b[93m\u001b[107m) *oci.Container {\u001b[25;2H\u001b[96m\u001b[47m33\u001b[m\u001b[93m\u001b[107m\u001b[5Cc.stateLock.Lock()" + ], + [ + 0.003162, + "\u001b[25;27H\u001b[K\u001b[26;2H\u001b[96m\u001b[47m34\u001b[m\u001b[93m\u001b[107m\u001b[5C\u001b[32mdefer\u001b[m\u001b[93m\u001b[107m c.stateLock.Unlock()\u001b[27;2H\u001b[96m\u001b[47m35\u001b[m\u001b[93m\u001b[107m\u001b[5Csb, ok := c.state.sandboxes[id]\u001b[28;2H\u001b[96m\u001b[47m36\u001b[m\u001b[93m\u001b[107m\u001b[5C\u001b[32mif\u001b[m\u001b[93m\u001b[107m !ok {\u001b[29;2H\u001b[96m\u001b[47m37\u001b[m\u001b[93m\u001b[107m\u001b[5C \u001b[1C\u001b[32meturn\u001b[m\u001b[93m\u001b[107m \u001b[36mnil\u001b[m\u001b[93m\u001b[107m\u001b[29;23H\u001b[K\u001b[30;2H\u001b[96m\u001b[47m38\u001b[m\u001b[93m\u001b[107m\u001b[1C }\u001b[31;2H\u001b[96m\u001b[47m39\u001b[m\u001b[93m\u001b[107m\u001b[5C\u001b[32mreturn\u001b[m\u001b[93m\u001b[107m sb.InfraContainer()\u001b[32;2H\u001b[96m\u001b[47m40\u001b[m\u001b[93m\u001b[107m\u001b[1C}\u001b[32;6H\u001b[K\u001b[33;2H\u001b[96m\u001b[47m41\u001b[m\u001b[93m\u001b[107m\u001b[33;5H\u001b[K\u001b[34;2H\u001b[96m\u001b[47m42\u001b[m\u001b[93m\u001b[107m\u001b[1C\u001b[96m// HasSandbox checks if a sandbox exists in the state\u001b[m\u001b[93m\u001b[107m\u001b[35;2H\u001b[96m\u001b[47m43\u001b[m\u001b[93m\u001b[107m\u001b[1C\u001b[32mfunc\u001b[m\u001b[93m\u001b[107m (c *ContainerServer) HasSandbox(id \u001b[33mstring\u001b[m\u001b[93m\u001b[107m) \u001b[33mbool\u001b[m\u001b[93m\u001b[107m {\u001b[36;2H\u001b[96m\u001b[47m44\u001b[m\u001b[93m\u001b[107m\u001b[12CLock.Lock()\u001b[36;27H\u001b[K\u001b[37;2H\u001b[96m\u001b[47m45\u001b[m\u001b[93m\u001b[107m\u001b[1C \u001b[32mdefer\u001b[m\u001b[93m\u001b[107m c.stateLock.Unlock()\u001b[38;2H\u001b[96m\u001b[47m46\u001b[m\u001b[93m\u001b[107m\u001b[5C_, ok := c.state.sandboxes[id]\u001b[39;2H\u001b[96" + ], + [ + 6.1e-05, + "m\u001b[47m47\u001b[m\u001b[93m\u001b[107m\u001b[1C \u001b[32mreturn\u001b[m\u001b[93m\u001b[107m ok\u001b[39;18H\u001b[K\u001b[40;2H\u001b[96m\u001b[47m48\u001b[m\u001b[93m\u001b[107m\u001b[1C}\u001b[40;6H\u001b[K\u001b[41;2H\u001b[96m\u001b[47m49\u001b[m\u001b[93m\u001b[107m\u001b[41;9H\u001b[K\u001b[42;2H\u001b[96m\u001b[47m50\u001b[m\u001b[93m\u001b[107m\u001b[1C\u001b[96m// RemoveSandbox removes a sandbox from the state store\u001b[m\u001b[93m\u001b[107m\u001b[43;2H\u001b[96m\u001b[47m51\u001b[m\u001b[93m\u001b[107m\u001b[1C\u001b[32mfunc\u001b[m\u001b[93m\u001b[107m (c *ContainerServer) RemoveSandbox(id \u001b[33mstring\u001b[m\u001b[93m\u001b[107m) {\u001b[44;2H\u001b[96m\u001b[47m52\u001b[m\u001b[93m\u001b[107m\u001b[1C c.stateLock.Lock()\u001b[45;2H\u001b[96m\u001b[47m53\u001b[m\u001b[93m\u001b[107m\u001b[5C\u001b[32mdefer\u001b[m\u001b[93m\u001b[107m c.stateLock.Unlock()\u001b[46;2H\u001b[96m\u001b[47m54\u001b[m\u001b[93m\u001b[107m\u001b[1C \u001b[32mdelete\u001b[m\u001b[93m\u001b[107m(c.state.sandboxes, id)\u001b[46;38H\u001b[K\u001b[47;2H\u001b[96m\u001b[47m55\u001b[m\u001b[93m\u001b[107m\u001b[1C}\u001b[47;6H\u001b[K\u001b[48;2H\u001b[96m\u001b[47m56\u001b[m\u001b[93m\u001b[107m\u001b[48;9H\u001b[K\u001b[49;2H\u001b[96m\u001b[47m57\u001b[m\u001b[93m\u001b[107m\u001b[1C\u001b[96m// \u001b[m\u001b[93m\u001b[107m\u001b[7m\u001b[91mLi\u001b[27m\u001b[m\u001b[93m\u001b[107m\u001b[96mstSandboxes lists all sandboxes in the state store\u001b[m\u001b[93m\u001b[107m\u001b[50;2H\u001b[96m\u001b[47m58\u001b[m\u001b[93m\u001b[107m\u001b[1C\u001b[32mfunc\u001b[m\u001b[93m\u001b[107m (c *ContainerServer) ListSandboxes() []*sandbox.Sandbox {" + ], + [ + 0.008005, + "\u001b[51;2H\u001b[96m\u001b[47m59\u001b[m\u001b[93m\u001b[107m\u001b[5Cc.stateLock.Lock()\u001b[52;2H\u001b[96m\u001b[47m60\u001b[m\u001b[93m\u001b[107m\u001b[5C\u001b[32mdefe\u001b[m\u001b[93m\u001b[107m\u001b[1C c.stateLock.Unlock()\u001b[53;195H\u001b[38;5;247m\u001b[48;5;240m  96%\u001b[m\u001b[93m\u001b[107m\u001b[6C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m57\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:4 \r\n\u001b[m\u001b[93m\u001b[107m/Li\u001b[?12l\u001b[?25h" + ], + [ + 0.064191, + "s\u001b[?25l" + ], + [ + 0.009148, + "\u001b[49;10H\u001b[7m\u001b[91ms\u001b[54;5H\u001b[?12l\u001b[?25h" + ], + [ + 0.063177, + "\u001b[27m\u001b[m\u001b[93m\u001b[107mt\u001b[?25l" + ], + [ + 0.011092, + "\u001b[49;11H\u001b[7m\u001b[91mt\u001b[54;6H\u001b[?12l\u001b[?25h" + ], + [ + 0.22857, + "\u001b[27m\u001b[m\u001b[93m\u001b[107mC\u001b[?25l" + ], + [ + 0.012394, + "\u001b[1;52r\u001b[1;1H\u001b[23L\u001b[1;54r\u001b[1;1H\u001b[96m\u001b[47m586 \u001b[m\u001b[93m\u001b[107m \u001b[32mdefer\u001b[m\u001b[93m\u001b[107m c.stateLock.Unlock()\r\n\u001b[96m\u001b[47m587 \u001b[m\u001b[93m\u001b[107m sbID := ctr.Sandbox()\r\n\u001b[96m\u001b[47m588 \u001b[m\u001b[93m\u001b[107m sb := c.state.sandboxes[sbID]\r\n\u001b[96m\u001b[47m589 \u001b[m\u001b[93m\u001b[107m sb.RemoveContainer(ctr)\r\n\u001b[96m\u001b[47m590 \u001b[m\u001b[93m\u001b[107m c.state.containers.Delete(ctr.ID())\r\n\u001b[96m\u001b[47m591 \u001b[m\u001b[93m\u001b[107m}\r\n\u001b[96m\u001b[47m592 \r\n593 \u001b[m\u001b[93m\u001b[107m\u001b[96m// listContainers returns a list of all containers stored by the server state\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m594 \u001b[m\u001b[93m\u001b[107m\u001b[32mfunc\u001b[m\u001b[93m\u001b[107m (c *ContainerServer) listContainers() []*oci.Container {\r\n\u001b[96m\u001b[47m595 \u001b[m\u001b[93m\u001b[107m c.stateLock.Lock()\r\n\u001b[96m\u001b[47m596 \u001b[m\u001b[93m\u001b[107m \u001b[32mdefer\u001b[m\u001b[93m\u001b[107m c.stateLock.Unlock()\r\n\u001b[96m\u001b[47m597 \u001b[m\u001b[93m\u001b[107m \u001b[32mreturn\u001b[m\u001b[93m\u001b[107m c.state.containers.List()\r\n\u001b[96m\u001b[47m598 \u001b[m\u001b[93m\u001b[107m}\r\n\u001b[96m\u001b[47m599 \r\n600 \u001b[m\u001b[93m\u001b[107m\u001b[96m// \u001b[m\u001b[93m\u001b[107m\u001b[7m\u001b[91mListC\u001b[27m\u001b[m\u001b[93m\u001b[107m\u001b[96montainers returns a list of all containers stored by the" + ], + [ + 3.7e-05, + " server state that match the given filter function\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m601 \u001b[m\u001b[93m\u001b[107m\u001b[32mfunc\u001b[m\u001b[93m\u001b[107m (c *ContainerServer) ListContainers(filters ...\u001b[32mfunc\u001b[m\u001b[93m\u001b[107m(*oci.Container) \u001b[33mbool\u001b[m\u001b[93m\u001b[107m) ([]*oci.Container, \u001b[33merror\u001b[m\u001b[93m\u001b[107m) {\r\n\u001b[96m\u001b[47m602 \u001b[m\u001b[93m\u001b[107m containers := c.listContainers()\r\n\u001b[96m\u001b[47m603 \u001b[m\u001b[93m\u001b[107m \u001b[32mif\u001b[m\u001b[93m\u001b[107m \u001b[32mlen\u001b[m\u001b[93m\u001b[107m(filters) == \u001b[36m0\u001b[m\u001b[93m\u001b[107m {\r\n\u001b[96m\u001b[47m604 \u001b[m\u001b[93m\u001b[107m\u001b[8C\u001b[32mreturn\u001b[m\u001b[93m\u001b[107m containers, \u001b[36mnil\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m605 \u001b[m\u001b[93m\u001b[107m }\r\n\u001b[96m\u001b[47m606 \u001b[m\u001b[93m\u001b[107m filteredContainers := \u001b[32mmake\u001b[m\u001b[93m\u001b[107m([]*oci.Container, \u001b[36m0\u001b[m\u001b[93m\u001b[107m, \u001b[32mlen\u001b[m\u001b[93m\u001b[107m(containers))\r\n\u001b[96m\u001b[47m607 \u001b[m\u001b[93m\u001b[107m \u001b[32mfor\u001b[m\u001b[93m\u001b[107m _, container := \u001b[32mrange\u001b[m\u001b[93m\u001b[107m containers {\r\n\u001b[96m\u001b[47m608 \u001b[m\u001b[93m\u001b[107m\u001b[8C\u001b[32mfor\u001b[m\u001b[93m\u001b[107m _, filter := \u001b[32mrange\u001b[m\u001b[93m\u001b[107m filters {\u001b[53;195H\u001b[38;5;144m\u001b[48;5;240m  88%\u001b[m\u001b[93m\u001b[107m\u001b[6C\u001b[1m\u001b[38;5;235m" + ], + [ + 1.8e-05, + "\u001b[48;5;252m00\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[m\u001b[93m\u001b[107m\u001b[54;1H\u001b[K\u001b[54;1H/ListC\u001b[?12l\u001b[?25h" + ], + [ + 0.108051, + "o\u001b[?25l" + ], + [ + 0.010669, + "\u001b[15;13H\u001b[7m\u001b[91mo\u001b[54;8H\u001b[?12l\u001b[?25h" + ], + [ + 0.076559, + "\u001b[27m\u001b[m\u001b[93m\u001b[107mn\u001b[?25l" + ], + [ + 0.010612, + "\u001b[15;14H\u001b[7m\u001b[91mn\u001b[54;9H\u001b[?12l\u001b[?25h" + ], + [ + 0.109997, + "\u001b[27m\u001b[m\u001b[93m\u001b[107mt\u001b[?25l" + ], + [ + 0.011985, + "\u001b[15;15H\u001b[7m\u001b[91mt\u001b[54;10H\u001b[?12l\u001b[?25h" + ], + [ + 0.059787, + "\u001b[27m\u001b[m\u001b[93m\u001b[107ma\u001b[?25l" + ], + [ + 0.01275, + "\u001b[15;16H\u001b[7m\u001b[91ma\u001b[54;11H\u001b[?12l\u001b[?25h" + ], + [ + 0.075246, + "\u001b[27m\u001b[m\u001b[93m\u001b[107mi\u001b[?25l" + ], + [ + 0.008912, + "\u001b[15;17H\u001b[7m\u001b[91mi\u001b[54;12H\u001b[?12l\u001b[?25h" + ], + [ + 0.063432, + "\u001b[27m\u001b[m\u001b[93m\u001b[107mn\u001b[?25l" + ], + [ + 0.01195, + "\u001b[15;18H\u001b[7m\u001b[91mn\u001b[54;13H\u001b[?12l\u001b[?25h" + ], + [ + 0.075708, + "\u001b[27m\u001b[m\u001b[93m\u001b[107me\u001b[?25l" + ], + [ + 0.012727, + "\u001b[15;19H\u001b[7m\u001b[91me\u001b[54;14H\u001b[?12l\u001b[?25h" + ], + [ + 0.035347, + "\u001b[27m\u001b[m\u001b[93m\u001b[107mr\u001b[?25l" + ], + [ + 0.012424, + "\u001b[15;20H\u001b[7m\u001b[91mr\u001b[54;15H\u001b[?12l\u001b[?25h" + ], + [ + 0.124381, + "\u001b[27m\u001b[m\u001b[93m\u001b[107ms\u001b[?25l" + ], + [ + 0.010815, + "\u001b[15;21H\u001b[7m\u001b[91ms\u001b[54;16H\u001b[?12l\u001b[?25h" + ], + [ + 0.180264, + "\r" + ], + [ + 5.1e-05, + "\u001b[?25l" + ], + [ + 0.00018, + "\u001b[27m\u001b[m\u001b[93m\u001b[107m\u001b[1m\u001b[31msearch hit BOTTOM, continuing at TOP" + ], + [ + 0.005654, + "\u001b[m\u001b[93m\u001b[107m\u001b[15;8H\u001b[7m\u001b[33mListContainers\u001b[m\u001b[93m\u001b[107m\u001b[16;31H\u001b[7m\u001b[33mListContainers\u001b[m\u001b[93m\u001b[107m\u001b[24;38H{\u001b[26;17H}" + ], + [ + 0.00472, + "\u001b[53;2H\u001b[1m\u001b[38;5;22m\u001b[48;5;148mNORMAL \u001b[15;8H\u001b[?12l\u001b[?25h" + ], + [ + 1.144572, + "\u001b[m\u001b[93m\u001b[107m\u001b[53;209H\u001b[38;5;22m\u001b[48;5;252m5\u001b[15;9H" + ], + [ + 0.50187, + "\u001b[53;209H6\u001b[15;10H" + ], + [ + 0.032501, + "\u001b[53;209H7\u001b[15;11H" + ], + [ + 0.027726, + "\u001b[53;209H8\u001b[15;12H" + ], + [ + 0.031165, + "\u001b[53;209H9\u001b[15;13H" + ], + [ + 0.027591, + "\u001b[53;209H10\u001b[15;14H" + ], + [ + 0.033383, + "\u001b[53;210H1\u001b[15;15H" + ], + [ + 0.031794, + "\u001b[53;210H2\u001b[15;16H" + ], + [ + 0.029702, + "\u001b[53;210H3\u001b[15;17H" + ], + [ + 0.031021, + "\u001b[53;210H4\u001b[15;18H" + ], + [ + 0.028265, + "\u001b[53;210H5\u001b[15;19H" + ], + [ + 0.030334, + "\u001b[53;210H6\u001b[15;20H" + ], + [ + 0.033667, + "\u001b[53;210H7\u001b[15;21H" + ], + [ + 0.029757, + "\u001b[53;210H8\u001b[15;22H" + ], + [ + 0.028472, + "\u001b[53;210H9\u001b[15;23H" + ], + [ + 0.029385, + "\u001b[53;209H20\u001b[15;24H" + ], + [ + 0.030816, + "\u001b[53;210H1\u001b[15;25H" + ], + [ + 0.030044, + "\u001b[53;210H2\u001b[15;26H" + ], + [ + 0.028015, + "\u001b[53;210H3\u001b[15;27H" + ], + [ + 0.031825, + "\u001b[53;210H4\u001b[15;28H" + ], + [ + 0.029947, + "\u001b[53;210H5\u001b[15;29H" + ], + [ + 0.027564, + "\u001b[53;210H6\u001b[15;30H" + ], + [ + 0.03206, + "\u001b[53;210H7\u001b[15;31H" + ], + [ + 0.032422, + "\u001b[53;210H8\u001b[15;32H" + ], + [ + 0.030352, + "\u001b[53;210H9\u001b[15;33H" + ], + [ + 0.030131, + "\u001b[53;209H30\u001b[15;34H" + ], + [ + 0.031966, + "\u001b[53;210H1\u001b[15;35H" + ], + [ + 0.028785, + "\u001b[53;210H2\u001b[15;36H" + ], + [ + 0.030353, + "\u001b[53;210H3\u001b[15;37H" + ], + [ + 0.0284, + "\u001b[53;210H4\u001b[15;38H" + ], + [ + 0.032354, + "\u001b[53;210H5\u001b[15;39H" + ], + [ + 0.031925, + "\u001b[53;210H6\u001b[15;40H" + ], + [ + 0.027402, + "\u001b[53;210H7\u001b[15;41H" + ], + [ + 0.028353, + "\u001b[53;210H8\u001b[15;42H" + ], + [ + 0.033363, + "\u001b[53;210H9\u001b[15;43H" + ], + [ + 0.030492, + "\u001b[53;209H40\u001b[15;44H" + ], + [ + 0.029102, + "\u001b[53;210H1\u001b[15;45H" + ], + [ + 0.028712, + "\u001b[53;210H2\u001b[15;46H" + ], + [ + 0.031899, + "\u001b[53;210H3\u001b[15;47H" + ], + [ + 0.028425, + "\u001b[53;210H4\u001b[15;48H" + ], + [ + 0.031288, + "\u001b[53;210H5\u001b[15;49H" + ], + [ + 0.030582, + "\u001b[53;210H6\u001b[15;50H" + ], + [ + 0.030863, + "\u001b[53;210H7\u001b[15;51H" + ], + [ + 0.029856, + "\u001b[53;210H8\u001b[15;52H" + ], + [ + 0.03183, + "\u001b[53;210H9\u001b[15;53H" + ], + [ + 0.027287, + "\u001b[53;209H50\u001b[15;54H" + ], + [ + 0.030571, + "\u001b[53;210H1\u001b[15;55H" + ], + [ + 0.027721, + "\u001b[53;210H2\u001b[15;56H" + ], + [ + 0.034507, + "\u001b[53;210H3\u001b[15;57H" + ], + [ + 0.026321, + "\u001b[53;210H4\u001b[15;58H" + ], + [ + 0.033001, + "\u001b[53;210H5\u001b[15;59H" + ], + [ + 0.03007, + "\u001b[53;210H6\u001b[15;60H" + ], + [ + 0.031121, + "\u001b[53;210H7\u001b[15;61H" + ], + [ + 0.028288, + "\u001b[53;210H8\u001b[15;62H" + ], + [ + 0.032991, + "\u001b[53;210H9\u001b[15;63H" + ], + [ + 0.030687, + "\u001b[53;209H60\u001b[15;64H" + ], + [ + 0.031504, + "\u001b[53;210H1\u001b[15;65H" + ], + [ + 0.03011, + "\u001b[53;210H2\u001b[15;66H" + ], + [ + 0.029317, + "\u001b[53;210H3\u001b[15;67H" + ], + [ + 0.034275, + "\u001b[53;210H4\u001b[15;68H" + ], + [ + 0.59524, + "\u001b[53;210H5\u001b[15;69H" + ], + [ + 0.497159, + "\u001b[53;210H6\u001b[15;70H" + ], + [ + 0.033269, + "\u001b[53;210H7\u001b[15;71H" + ], + [ + 0.030617, + "\u001b[53;210H8\u001b[15;72H" + ], + [ + 0.028412, + "\u001b[53;210H9\u001b[15;73H" + ], + [ + 0.030755, + "\u001b[53;209H70\u001b[15;74H" + ], + [ + 0.031182, + "\u001b[53;210H1\u001b[15;75H" + ], + [ + 0.030179, + "\u001b[53;210H2\u001b[15;76H" + ], + [ + 0.469875, + "\u001b[53;210H3\u001b[15;77H" + ], + [ + 0.197619, + "\u001b[53;210H4\u001b[15;78H" + ], + [ + 0.324244, + "\u001b[53;210H3\u001b[15;77H" + ], + [ + 0.746299, + "\u001b[53;210H4\u001b[15;78H" + ], + [ + 0.177222, + "\u001b[53;210H5\u001b[15;79H" + ], + [ + 0.16103, + "\u001b[53;210H6\u001b[15;80H" + ], + [ + 0.178906, + "\u001b[53;210H7\u001b[15;81H" + ], + [ + 0.176875, + "\u001b[53;210H8\u001b[15;82H" + ], + [ + 0.168167, + "\u001b[53;210H9\u001b[15;83H" + ], + [ + 0.945125, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[54;1H\u001b[34m--\u001b[m\u001b[93m\u001b[107m\u001b[1m\u001b[31ma\u001b[m\u001b[93m\u001b[107m\b\u001b[34m INSERT\u001b[m\u001b[93m\u001b[107m\u001b[1m\u001b[31mt\u001b[m\u001b[93m\u001b[107m\b\u001b[34m --\u001b[m\u001b[93m\u001b[107m\u001b[1m\u001b[31mO\u001b[m\u001b[93m\u001b[107m\u001b[54;13H\u001b[K" + ], + [ + 0.044251, + "\u001b[53;1H\u001b[1m\u001b[38;5;23m\u001b[48;5;231m INSERT \u001b[m\u001b[93m\u001b[107m\u001b[38;5;148m\u001b[48;5;240m\u001b[m\u001b[93m\u001b[107m\u001b[53;9H\u001b[38;5;231m\u001b[48;5;31m\u001b[53;10H \u001b[m\u001b[93m\u001b[107m\u001b[38;5;117m\u001b[48;5;31m\u001b[53;12H kpod-stats \u001b[m\u001b[93m\u001b[107m\u001b[38;5;74m\u001b[48;5;31m\u001b[53;25H \u001b[m\u001b[93m\u001b[107m\u001b[38;5;117m\u001b[48;5;31mlibkpod/\u001b[m\u001b[93m\u001b[107m\u001b[1m\u001b[38;5;231m\u001b[48;5;31mcontainer_server.go \u001b[m\u001b[93m\u001b[107m\u001b[38;5;240m\u001b[48;5;236m\u001b[m\u001b[93m\u001b[107m\u001b[53;54H\u001b[38;5;31m\u001b[48;5;24m\u001b[53;55H \u001b[m\u001b[93m\u001b[107m\u001b[38;5;231m\u001b[48;5;24m                                                                                                                        \u001b[m\u001b[93m\u001b[107m\u001b[38;5;117m\u001b[48;5;24munix\u001b[m\u001b[93m\u001b[107m\u001b[38;5;74m\u001b[48;5;24m \u001b[m\u001b[93m\u001b[107m\u001b[53;182H\u001b[38;5;117m\u001b[48;5;24m utf-8\u001b[m\u001b[93m\u001b[107m\u001b[38;5;74m\u001b[48;5;24m \u001b[m\u001b[93m\u001b[107m\u001b[53;190H\u001b[38;5;117m\u001b[48;5;24m go\u001b[m\u001b[93m\u001b[107m\u001b[38;5;31m\u001b[48;5;24m \u001b[m\u001b[93m\u001b[107m\u001b[53;195H\u001b[38;5;144m\u001b[48;5;31m  88%\u001b[m" + ], + [ + 5.4e-05, + "\u001b[93m\u001b[107m\u001b[38;5;117m\u001b[48;5;31m \u001b[m\u001b[93m\u001b[107m\u001b[53;202H\u001b[38;5;24m\u001b[48;5;117m \u001b[53;204H \u001b[m\u001b[93m\u001b[107m\u001b[1m\u001b[38;5;24m\u001b[48;5;117m600\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[m\u001b[93m\u001b[107m\b\u001b[38;5;22m\u001b[48;5;117m:79 \u001b[15;83H\u001b[?12l\u001b[?25h" + ], + [ + 0.275463, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\b\u001b[96mthat match the given filter function\u001b[m\u001b[93m\u001b[107m\u001b[15;118H\u001b[K\u001b[53;53H\u001b[1m\u001b[38;5;220m\u001b[48;5;31m + \u001b[m\u001b[93m\u001b[107m\u001b[38;5;31m\u001b[48;5;24m\u001b[53;57H \u001b[m\u001b[93m\u001b[107m\u001b[152C\u001b[38;5;22m\u001b[48;5;117m8\u001b[15;82H\u001b[?12l\u001b[?25h" + ], + [ + 0.268424, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[15;82H\u001b[K\u001b[16;5Hthat match the given filter function\u001b[16;41H\u001b[K\u001b[17;5H\u001b[32mfunc\u001b[m\u001b[93m\u001b[107m (c *ContainerServer) \u001b[7m\u001b[33mListContainers\u001b[m\u001b[93m\u001b[107m(filters ...\u001b[32mfunc\u001b[m\u001b[93m\u001b[107m(*oci.Container) \u001b[33mbool\u001b[m\u001b[93m\u001b[107m) ([]*oci.Container, \u001b[33merror\u001b[m\u001b[93m\u001b[107m) {\u001b[18;9Hcontainers := c.listContainers()\u001b[19;9H\u001b[32mif\u001b[m\u001b[93m\u001b[107m \u001b[32mlen\u001b[m\u001b[93m\u001b[107m(filters) == \u001b[36m0\u001b[m\u001b[93m\u001b[107m {\u001b[19;32H\u001b[K\u001b[20;9H \u001b[32mreturn\u001b[m\u001b[93m\u001b[107m containers, \u001b[36mnil\u001b[m\u001b[93m\u001b[107m\u001b[21;9H}\u001b[21;10H\u001b[K\u001b[22;9HfilteredContainers := \u001b[32mmake\u001b[m\u001b[93m\u001b[107m([]*oci.Container, \u001b[36m0\u001b[m\u001b[93m\u001b[107m, \u001b[32mlen\u001b[m\u001b[93m\u001b[107m(containers))\u001b[23;9H\u001b[32mfor\u001b[m\u001b[93m\u001b[107m _, container := \u001b[32mrange\u001b[m\u001b[93m\u001b[107m containers {\u001b[24;13H\u001b[32mfor\u001b[m\u001b[93m\u001b[107m _,\u001b[7C := \u001b[32mrange\u001b[m\u001b[93m\u001b[107m filters {\u001b[25;17H\u001b[32mif\u001b[m\u001b[93m\u001b[107m filter(container) {\u001b[25;40H\u001b[K\u001b[26;17H filteredContainers = \u001b[32mappend\u001b[m\u001b[93m\u001b[107m(filteredContainers, container)\u001b[27;13H }\u001b[28;9H }\u001b[29;9H}\u001b[29;10H\u001b[K\u001b[30;5H \u001b[32mreturn" + ], + [ + 5.2e-05, + "\u001b[m\u001b[93m\u001b[107m filteredContainers, \u001b[36mnil\u001b[m\u001b[93m\u001b[107m\u001b[31;5H}\u001b[32;5H\u001b[K\u001b[33;5H\u001b[96m// AddSandbox adds a sandbox to the sandbox state store\u001b[m\u001b[93m\u001b[107m\u001b[33;60H\u001b[K\u001b[34;5H\u001b[32mfunc\u001b[m\u001b[93m\u001b[107m (c *ContainerServer) AddSandbox(sb *sandbox.Sandbox) {\u001b[35;9Hc.stateLock.Lock()\u001b[35;27H\u001b[K\u001b[36;9H\u001b[32mdefer\u001b[m\u001b[93m\u001b[107m c.stateLock.Unlock()\u001b[36;36H\u001b[K\u001b[37;5H c.state.sandboxes[sb.ID()] = sb\u001b[38;5H}\u001b[39;5H\u001b[K\u001b[40;5H\u001b[96m// GetSandbox returns a sandbox by its ID\u001b[m\u001b[93m\u001b[107m\u001b[40;46H\u001b[K\u001b[41;5H\u001b[32mfunc\u001b[m\u001b[93m\u001b[107m (c *ContainerServer) GetSandbox(id \u001b[33mstring\u001b[m\u001b[93m\u001b[107m) *sandbox.Sandbox {\u001b[42;9Hc.stateLock.Lock()\u001b[42;27H\u001b[K\u001b[43;9H\u001b[32mdefe\u001b[m\u001b[93m\u001b[107m\u001b[1C c.stateLock.Unlock()\u001b[43;35H\u001b[K\u001b[44;5H \u001b[32mreturn\u001b[m\u001b[93m\u001b[107m c.state.sandboxes[id]\u001b[45;5H}\u001b[46;5H\u001b[K\u001b[47;5H\u001b[96m// GetSandboxContainer returns a sandbox's infra container\u001b[m\u001b[93m\u001b[107m\u001b[47;63H\u001b[K\u001b[48;5H\u001b[32mfunc\u001b[m\u001b[93m\u001b[107m (c *ContainerServer) GetSandboxContainer(id \u001b[33mstring\u001b[m\u001b[93m\u001b[107m) *oci.Container {\u001b[49;9Hc.stateLock.Lock()" + ], + [ + 0.005517, + "\u001b[49;27H\u001b[K\u001b[50;9H\u001b[32mdefer\u001b[m\u001b[93m\u001b[107m c.stateLock.Unlock()\u001b[50;35H\u001b[K\u001b[51;9Hsb, ok := c.state.sandboxes[id]\u001b[52;9H\u001b[32mif\u001b[m\u001b[93m\u001b[107m !ok {\u001b[52;17H\u001b[K\u001b[53;207H\u001b[1m\u001b[38;5;24m\u001b[48;5;117m1\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;117m:1 \u001b[16;5H\u001b[?12l\u001b[?25h" + ], + [ + 0.829866, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m/that match the given filter function\u001b[53;209H\u001b[38;5;22m\u001b[48;5;117m2\u001b[16;6H\u001b[?12l\u001b[?25h" + ], + [ + 0.150054, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\b\u001b[96m//that match the given filter function\u001b[m\u001b[93m\u001b[107m\u001b[53;209H\u001b[38;5;22m\u001b[48;5;117m3\u001b[16;7H\u001b[?12l\u001b[?25h" + ], + [ + 0.080887, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[96m that match the given filter function\u001b[m\u001b[93m\u001b[107m\u001b[53;209H\u001b[38;5;22m\u001b[48;5;117m4\u001b[16;8H\u001b[?12l\u001b[?25h" + ], + [ + 0.385382, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[54;1H\u001b[K" + ], + [ + 0.014625, + "\u001b[53;1H\u001b[1m\u001b[38;5;22m\u001b[48;5;148m NORMAL \u001b[m\u001b[93m\u001b[107m\u001b[38;5;231m\u001b[48;5;31m\u001b[m\u001b[93m\u001b[107m\u001b[53;9H\u001b[38;5;148m\u001b[48;5;240m\u001b[53;10H \u001b[m\u001b[93m\u001b[107m\u001b[38;5;250m\u001b[48;5;240m\u001b[53;12H kpod-stats \u001b[m\u001b[93m\u001b[107m\u001b[38;5;245m\u001b[48;5;240m\u001b[53;25H \u001b[m\u001b[93m\u001b[107m\u001b[38;5;250m\u001b[48;5;240mlibkpod/\u001b[m\u001b[93m\u001b[107m\u001b[1m\u001b[38;5;231m\u001b[48;5;240mcontainer_server.go\u001b[m\u001b[93m\u001b[107m\u001b[1m\u001b[38;5;220m\u001b[48;5;31m \u001b[m\u001b[93m\u001b[107m\b\u001b[1m\u001b[38;5;220m\u001b[48;5;240m + \u001b[m\u001b[93m\u001b[107m\u001b[38;5;31m\u001b[48;5;24m\u001b[m\u001b[93m\u001b[107m\u001b[53;56H\u001b[38;5;240m\u001b[48;5;236m\u001b[53;57H \u001b[m\u001b[93m\u001b[107m\u001b[38;5;231m\u001b[48;5;236m                                                                                                                      \u001b[m\u001b[93m\u001b[107m\u001b[38;5;247m\u001b[48;5;236munix\u001b[m\u001b[93m\u001b[107m\u001b[38;5;244m\u001b[48;5;236m \u001b[m\u001b[93m\u001b[107m\u001b[53;182H\u001b[38;5;247m\u001b[48;5;236m utf-8\u001b[m\u001b[93m\u001b[107m\u001b[38;5;244m\u001b[48;5;236m \u001b[m\u001b[93m\u001b[107m\u001b[53;190H\u001b[38;5;247m\u001b[48;5;236m g" + ], + [ + 2.4e-05, + "o\u001b[m\u001b[93m\u001b[107m\u001b[38;5;240m\u001b[48;5;236m \u001b[m\u001b[93m\u001b[107m\u001b[53;195H\u001b[38;5;144m\u001b[48;5;240m  88%\u001b[m\u001b[93m\u001b[107m\u001b[38;5;252m\u001b[48;5;240m \u001b[m\u001b[93m\u001b[107m\u001b[53;202H\u001b[38;5;235m\u001b[48;5;252m \u001b[53;204H \u001b[m\u001b[93m\u001b[107m\u001b[1m\u001b[38;5;235m\u001b[48;5;252m601\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;117m:\u001b[m\u001b[93m\u001b[107m\b\u001b[38;5;22m\u001b[48;5;252m:3  \u001b[16;7H\u001b[?12l\u001b[?25h" + ], + [ + 0.26471, + "\u001b[?25l\u001b[54;1H\u001b[m\u001b[93m\u001b[107m:\u001b[?2004h" + ], + [ + 7e-05, + "\u001b[?12l\u001b[?25h" + ], + [ + 0.184441, + "w" + ], + [ + 9.6e-05, + "\u001b[?25l\u001b[?12l\u001b[?25h" + ], + [ + 0.039251, + "q\u001b[?25l\u001b[?12l\u001b[?25h" + ], + [ + 0.104195, + "\r" + ], + [ + 5.6e-05, + "\u001b[?25l" + ], + [ + 0.00018, + "\u001b[?2004l" + ], + [ + 0.022882, + "\"libkpod/container_server.go\"" + ], + [ + 0.006415, + " 685L, 20535C written" + ], + [ + 0.012113, + "\r\r\r\n\u001b[39;49m\u001b[?2004l\u001b[?1l\u001b>\u001b[?12l\u001b[?25h\u001b[?1049l" + ], + [ + 0.002425, + "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r" + ], + [ + 0.019671, + "\r\n\u001b[34m\u001b[01mcri-o\u001b[22m \u001b[90mgit/kpod-stats* \u001b[39m \u001b[33m17s\u001b[39m\r\n" + ], + [ + 0.002255, + "\u001b]7;file://localhost.localdomain/home/ryan/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007" + ], + [ + 0.000189, + "\u001b]2;ryan@localhost: ~/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007" + ], + [ + 8.5e-05, + "\u001b]1;..cubator/cri-o\u0007" + ], + [ + 0.000208, + "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[35m❯\u001b[39m \u001b[K\u001b[208C\u001b[90m\u001b[39m\u001b[208D" + ], + [ + 0.000116, + "\u001b[?1h\u001b=" + ], + [ + 0.000101, + "\u001b[?2004h" + ], + [ + 11.704887, + "\u001b[?2004l\r\r\n" + ], + [ + 0.000651, + "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r" + ], + [ + 0.025893, + "\r\n\u001b[34m\u001b[01mcri-o\u001b[22m \u001b[90mgit/kpod-stats* \u001b[39m \u001b[33m29s\u001b[39m\r\n" + ], + [ + 0.001689, + "\u001b]7;file://localhost.localdomain/home/ryan/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007" + ], + [ + 7.2e-05, + "\u001b]2;ryan@localhost: ~/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007" + ], + [ + 2.3e-05, + "\u001b]1;..cubator/cri-o\u0007" + ], + [ + 7.5e-05, + "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[31m❯\u001b[39m \u001b[K\u001b[208C\u001b[90m\u001b[39m\u001b[208D" + ], + [ + 0.000263, + "\u001b[?1h\u001b=\u001b[?2004h" + ], + [ + 0.604019, + ":" + ], + [ + 0.41525, + "\b \b" + ], + [ + 24.413263, + "v" + ], + [ + 0.123238, + "\bvi" + ], + [ + 0.096701, + " " + ], + [ + 0.103904, + "s" + ], + [ + 0.040009, + "e" + ], + [ + 0.056539, + "r" + ], + [ + 0.196367, + "ver\u001b[1m/\u001b[0m" + ], + [ + 0.158628, + "\b\u001b[0m/c" + ], + [ + 0.107515, + "o" + ], + [ + 0.072945, + "n" + ], + [ + 0.122494, + "\u0007" + ], + [ + 0.000289, + "\r\r\n" + ], + [ + 0.000116, + "\u001b[0mconfig.go container_create.go container_execsync.go container_portforward.go container_start.go container_stop.go \r\n\u001b[Jcontainer_attach.go \u001b[Jcontainer_exec.go \u001b[Jcontainer_list.go \u001b[Jcontainer_remove.go \u001b[Jcontainer_status.go \u001b[Jcontainer_updateruntimeconfig.go\u001b[J\u001b[A\u001b[A\u001b[0m\u001b[27m\u001b[24m\u001b[39m\r\u001b[2Cvi server/con\u001b[K\u001b[195C\u001b[90m\u001b[39m\u001b[39m\u001b[195D" + ], + [ + 0.477329, + "t" + ], + [ + 0.11174, + "a" + ], + [ + 0.211254, + "\r\r\n\u001b[J\u001b[A\u001b[17Ciner_" + ], + [ + 0.68805, + "l" + ], + [ + 0.124985, + "i" + ], + [ + 0.138637, + "st.go\u001b[1m \u001b[0m" + ], + [ + 0.548537, + "\b\u001b[0m \b" + ], + [ + 0.000176, + "\u001b[?1l\u001b>\u001b[?2004l\r\r\n\u001b[J" + ], + [ + 0.003295, + "\u001b]2;vim server/container_list.go\u0007\u001b]1;vi\u0007" + ], + [ + 0.135184, + "\u001b[?2004h\u001b[?1049h\u001b[?1h\u001b=\u001b[?2004h" + ], + [ + 0.000569, + "\u001b[1;54r\u001b[?12;25h\u001b[?12l\u001b[?25h\u001b[27m\u001b[23m\u001b[m\u001b[93m\u001b[107m\u001b[H\u001b[2J\u001b[?25l\u001b[54;1H\"server/container_list.go\"" + ], + [ + 0.000171, + " 108L, 2729C" + ], + [ + 0.008118, + "\u001b[2;1H▽\u001b[6n\u001b[2;1H \u001b[1;1H\u001b[>c" + ], + [ + 0.001699, + "\u001b[1;1H\u001b[96m\u001b[47m 1 \u001b[m\u001b[93m\u001b[107m\u001b[32mpackage\u001b[m\u001b[93m\u001b[107m server\r\n\u001b[96m\u001b[47m 2 \r\n 3 \u001b[m\u001b[93m\u001b[107m\u001b[32mimport\u001b[m\u001b[93m\u001b[107m (\r\n\u001b[96m\u001b[47m 4 \u001b[m\u001b[93m\u001b[107m \u001b[36m\"github.com/kubernetes-incubator/cri-o/oci\"\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m 5 \u001b[m\u001b[93m\u001b[107m \u001b[36m\"github.com/sirupsen/logrus\"\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m 6 \u001b[m\u001b[93m\u001b[107m \u001b[36m\"golang.org/x/net/context\"\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m 7 \u001b[m\u001b[93m\u001b[107m \u001b[36m\"k8s.io/apimachinery/pkg/fields\"\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m 8 \u001b[m\u001b[93m\u001b[107m pb \u001b[36m\"k8s.io/kubernetes/pkg/kubelet/api/v1alpha1/runtime\"\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m 9 \u001b[m\u001b[93m\u001b[107m)\r\n\u001b[96m\u001b[47m 10 \r\n 11 \u001b[m\u001b[93m\u001b[107m\u001b[96m// filterContainer returns whether passed container matches filtering criteria\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m 12 \u001b[m\u001b[93m\u001b[107m\u001b[32mfunc\u001b[m\u001b[93m\u001b[107m filterContainer(c *pb.Container, filter *pb.ContainerFilter) \u001b[33mbool\u001b[m\u001b[93m\u001b[107m {\r\n\u001b[96m\u001b[47m 13 \u001b[m\u001b[93m\u001b[107m \u001b[32mif\u001b[m\u001b[93m\u001b[107m filter != \u001b[36mnil\u001b[m\u001b[93m\u001b[107m {\r\n\u001b[96m\u001b[47m 14 \u001b[m\u001b[93m\u001b[107m\u001b[8C\u001b[32mif\u001b[m\u001b[93m\u001b[" + ], + [ + 1.6e-05, + "107m filter.State != \u001b[36mnil\u001b[m\u001b[93m\u001b[107m {\r\n\u001b[96m\u001b[47m 15 \u001b[m\u001b[93m\u001b[107m\u001b[12C\u001b[32mif\u001b[m\u001b[93m\u001b[107m c.State != filter.State.State {\r\n\u001b[96m\u001b[47m 16 \u001b[m\u001b[93m\u001b[107m\u001b[16C\u001b[32mreturn\u001b[m\u001b[93m\u001b[107m \u001b[36mfalse\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m 17 \u001b[m\u001b[93m\u001b[107m\u001b[12C}\r\n\u001b[96m\u001b[47m 18 \u001b[m\u001b[93m\u001b[107m\u001b[8C}\r\n\u001b[96m\u001b[47m 19 \u001b[m\u001b[93m\u001b[107m\u001b[8C\u001b[32mif\u001b[m\u001b[93m\u001b[107m filter.LabelSelector != \u001b[36mnil\u001b[m\u001b[93m\u001b[107m {\r\n\u001b[96m\u001b[47m 20 \u001b[m\u001b[93m\u001b[107m\u001b[12Csel := fields.SelectorFromSet(filter.LabelSelector)\r\n\u001b[96m\u001b[47m 21 \u001b[m\u001b[93m\u001b[107m\u001b[12C\u001b[32mif\u001b[m\u001b[93m\u001b[107m !sel.Matches(fields.Set(c.Labels)) {\r\n\u001b[96m\u001b[47m 22 \u001b[m\u001b[93m\u001b[107m\u001b[16C\u001b[32mreturn\u001b[m\u001b[93m\u001b[107m \u001b[36mfalse\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m 23 \u001b[m\u001b[93m\u001b[107m\u001b[12C}\r\n\u001b[96m\u001b[47m 24 \u001b[m\u001b[93m\u001b[107m\u001b[8C}\r\n\u001b[96m\u001b[47m 25 \u001b[m\u001b[93m\u001b[107m }\r\n\u001b[96m\u001b[47m 26 \u001b[m\u001b[93m\u001b[107m \u001b[32mreturn\u001b[m\u001b[93m\u001b[107m \u001b[36mtrue\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m 27 \u001b[m\u001b[93m\u001b[107m}\r\n\u001b[96m\u001b[47m 28 \r\n 29 \u001b[m\u001b[93m\u001b[107m\u001b[96m// \u001b[m\u001b[93m\u001b[107m\u001b[7m\u001b[33mListContainers\u001b[m\u001b[93m\u001b[107m\u001b[96m lists all containers by filters." + ], + [ + 0.033458, + "\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m 30 \u001b[m\u001b[93m\u001b[107m\u001b[32mfunc\u001b[m\u001b[93m\u001b[107m (s *Server) \u001b[7m\u001b[33mListContainers\u001b[m\u001b[93m\u001b[107m(ctx context.Context, req *pb.\u001b[7m\u001b[33mListContainers\u001b[m\u001b[93m\u001b[107mRequest) (*pb.\u001b[7m\u001b[33mListContainers\u001b[m\u001b[93m\u001b[107mResponse, \u001b[33merror\u001b[m\u001b[93m\u001b[107m) {\r\n\u001b[96m\u001b[47m 31 \u001b[m\u001b[93m\u001b[107m logrus.Debugf(\u001b[36m\"\u001b[m\u001b[93m\u001b[107m\u001b[7m\u001b[33mListContainers\u001b[m\u001b[93m\u001b[107m\u001b[36mRequest \u001b[m\u001b[93m\u001b[107m\u001b[31m%+v\u001b[m\u001b[93m\u001b[107m\u001b[36m\"\u001b[m\u001b[93m\u001b[107m, req)\r\n\u001b[96m\u001b[47m 32 \u001b[m\u001b[93m\u001b[107m \u001b[32mvar\u001b[m\u001b[93m\u001b[107m ctrs []*pb.Container\r\n\u001b[96m\u001b[47m 33 \u001b[m\u001b[93m\u001b[107m filter := req.Filter\r\n\u001b[96m\u001b[47m 34 \u001b[m\u001b[93m\u001b[107m ctrList := s.ContainerServer.\u001b[7m\u001b[33mListContainers\u001b[m\u001b[93m\u001b[107m()\r\n\u001b[96m\u001b[47m 35 \r\n 36 \u001b[m\u001b[93m\u001b[107m \u001b[96m// Filter using container id and pod id first.\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m 37 \u001b[m\u001b[93m\u001b[107m \u001b[32mif\u001b[m\u001b[93m\u001b[107m filter != \u001b[36mnil\u001b[m\u001b[93m\u001b[107m {\r\n\u001b[96m\u001b[47m 38 \u001b[m\u001b[93m\u001b[107m\u001b[8C\u001b[32mif\u001b[m\u001b[93m\u001b[107m filter.Id != \u001b[36m\"\"\u001b[m\u001b[93m\u001b[107m {\r\n\u001b[96m\u001b[47m 39 \u001b[m\u001b[93m\u001b[107m\u001b[12Cid, err := s.CtrI" + ], + [ + 3.2e-05, + "DIndex().Get(filter.Id)\r\n\u001b[96m\u001b[47m 40 \u001b[m\u001b[93m\u001b[107m\u001b[12C\u001b[32mif\u001b[m\u001b[93m\u001b[107m err != \u001b[36mnil\u001b[m\u001b[93m\u001b[107m {\r\n\u001b[96m\u001b[47m 41 \u001b[m\u001b[93m\u001b[107m\u001b[16C\u001b[32mreturn\u001b[m\u001b[93m\u001b[107m \u001b[36mnil\u001b[m\u001b[93m\u001b[107m, err\r\n\u001b[96m\u001b[47m 42 \u001b[m\u001b[93m\u001b[107m\u001b[12C}\r\n\u001b[96m\u001b[47m 43 \u001b[m\u001b[93m\u001b[107m\u001b[12Cc := s.ContainerServer.GetContainer(id)\r\n\u001b[96m\u001b[47m 44 \u001b[m\u001b[93m\u001b[107m\u001b[12C\u001b[32mif\u001b[m\u001b[93m\u001b[107m c != \u001b[36mnil\u001b[m\u001b[93m\u001b[107m {\r\n\u001b[96m\u001b[47m 45 \u001b[m\u001b[93m\u001b[107m\u001b[16C\u001b[32mif\u001b[m\u001b[93m\u001b[107m filter.PodSandboxId != \u001b[36m\"\"\u001b[m\u001b[93m\u001b[107m {\r\n\u001b[96m\u001b[47m 46 \u001b[m\u001b[93m\u001b[107m\u001b[20C\u001b[32mif\u001b[m\u001b[93m\u001b[107m c.Sandbox() == filter.PodSandboxId {\r\n\u001b[96m\u001b[47m 47 \u001b[m\u001b[93m\u001b[107m\u001b[24CctrList = []*oci.Container{c}\r\n\u001b[96m\u001b[47m 48 \u001b[m\u001b[93m\u001b[107m\u001b[20C} \u001b[32melse\u001b[m\u001b[93m\u001b[107m {\r\n\u001b[96m\u001b[47m 49 \u001b[m\u001b[93m\u001b[107m\u001b[24CctrList = []*oci.Container{}\r\n\u001b[96m\u001b[47m 50 \u001b[m\u001b[93m\u001b[107m\u001b[20C}\r\n\u001b[96m\u001b[47m 51 \r\n 52 \u001b[m\u001b[93m\u001b[107m\u001b[16C} \u001b[32melse\u001b[m\u001b[93m\u001b[107m {\r\n\u001b[1m\u001b[38;5;22m\u001b[48;5;148m NORMAL \u001b[m\u001b[93m\u001b[107m\u001b[38;5;148m\u001b[48;5;240m\u001b[53;10H \u001b[m\u001b[93m\u001b[107m\u001b[38;5;250m\u001b[48;5;240m" + ], + [ + 0.009216, + "\u001b[53;12H kpod-stats \u001b[m\u001b[93m\u001b[107m\u001b[38;5;245m\u001b[48;5;240m\u001b[53;25H \u001b[m\u001b[93m\u001b[107m\u001b[38;5;250m\u001b[48;5;240mserver/\u001b[m\u001b[93m\u001b[107m\u001b[1m\u001b[38;5;231m\u001b[48;5;240mcontainer_list.go \u001b[m\u001b[93m\u001b[107m\u001b[38;5;240m\u001b[48;5;236m\u001b[53;52H \u001b[m\u001b[93m\u001b[107m\u001b[38;5;231m\u001b[48;5;236m                                                                                                                           \u001b[m\u001b[93m\u001b[107m\u001b[38;5;247m\u001b[48;5;236munix\u001b[m\u001b[93m\u001b[107m\u001b[38;5;244m\u001b[48;5;236m \u001b[m\u001b[93m\u001b[107m\u001b[53;182H\u001b[38;5;247m\u001b[48;5;236m utf-8\u001b[m\u001b[93m\u001b[107m\u001b[38;5;244m\u001b[48;5;236m \u001b[m\u001b[93m\u001b[107m\u001b[53;190H\u001b[38;5;247m\u001b[48;5;236m go\u001b[m\u001b[93m\u001b[107m\u001b[38;5;240m\u001b[48;5;236m \u001b[m\u001b[93m\u001b[107m\u001b[53;195H\u001b[38;5;70m\u001b[48;5;240m   1%\u001b[m\u001b[93m\u001b[107m\u001b[38;5;252m\u001b[48;5;240m \u001b[m\u001b[93m\u001b[107m\u001b[53;202H\u001b[38;5;235m\u001b[48;5;252m \u001b[53;204H \u001b[m\u001b[93m\u001b[107m\u001b[1m\u001b[38;5;235m\u001b[48;5;252m  1\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:1  \u001b[1;5H\u001b[?12l\u001b" + ], + [ + 2e-05, + "[?25h\u001bP+q436f\u001b\\\u001bP+q6b75\u001b\\\u001bP+q6b64\u001b\\\u001bP+q6b72\u001b\\\u001bP+q6b6c\u001b\\\u001bP+q2332\u001b\\\u001bP+q2334\u001b\\\u001bP+q2569\u001b\\\u001bP+q2a37\u001b\\\u001bP+q6b31\u001b\\" + ], + [ + 0.527381, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[53;195H\u001b[38;5;70m\u001b[48;5;240m   2%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m2\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[2;5H\u001b[?12l\u001b[?25h" + ], + [ + 0.495163, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[53;195H\u001b[38;5;70m\u001b[48;5;240m   3%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m3\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[3;5H\u001b[?12l\u001b[?25h" + ], + [ + 0.025763, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[53;195H\u001b[38;5;70m\u001b[48;5;240m   4%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m4\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:4\u001b[4;8H\u001b[?12l\u001b[?25h" + ], + [ + 0.025962, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[53;195H\u001b[38;5;70m\u001b[48;5;240m   5%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m5\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[5;8H\u001b[?12l\u001b[?25h" + ], + [ + 0.035885, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[53;195H\u001b[38;5;70m\u001b[48;5;240m   6%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m6\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[6;8H\u001b[?12l\u001b[?25h" + ], + [ + 0.03159, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[53;207H\u001b[1m\u001b[38;5;235m\u001b[48;5;252m7\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[7;8H\u001b[?12l\u001b[?25h" + ], + [ + 0.027692, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[53;195H\u001b[38;5;70m\u001b[48;5;240m   7%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m8\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[8;8H\u001b[?12l\u001b[?25h" + ], + [ + 0.030541, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[3;12H\u001b[1m\u001b[31m\u001b[106m(\u001b[9;5H)\u001b[m\u001b[93m\u001b[107m\u001b[53;195H\u001b[38;5;70m\u001b[48;5;240m   8%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m9\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:1\u001b[9;5H\u001b[?12l\u001b[?25h" + ], + [ + 0.031712, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[3;12H(\u001b[9;5H)\u001b[53;195H\u001b[38;5;70m\u001b[48;5;240m   9%\u001b[m\u001b[93m\u001b[107m\u001b[6C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m10\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[10;5H\u001b[?12l\u001b[?25h" + ], + [ + 0.031153, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[53;195H\u001b[38;5;70m\u001b[48;5;240m  10%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m1\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[11;5H\u001b[?12l\u001b[?25h" + ], + [ + 0.026845, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[53;195H\u001b[38;5;70m\u001b[48;5;240m  11%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m2\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[12;5H\u001b[?12l\u001b[?25h" + ], + [ + 0.030542, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[53;195H\u001b[38;5;70m\u001b[48;5;240m  12%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m3\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:4\u001b[13;8H\u001b[?12l\u001b[?25h" + ], + [ + 0.032914, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[53;195H\u001b[38;5;70m\u001b[48;5;240m  13%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m4\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[14;8H\u001b[?12l\u001b[?25h" + ], + [ + 0.032993, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[53;195H\u001b[38;5;70m\u001b[48;5;240m  14%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m5\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[15;8H\u001b[?12l\u001b[?25h" + ], + [ + 0.026882, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[53;195H\u001b[38;5;70m\u001b[48;5;240m  15%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m6\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[16;8H\u001b[?12l\u001b[?25h" + ], + [ + 0.032257, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[53;195H\u001b[38;5;70m\u001b[48;5;240m  16%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m7\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[17;8H\u001b[?12l\u001b[?25h" + ], + [ + 0.031522, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[53;195H\u001b[38;5;70m\u001b[48;5;240m  17%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m8\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[18;8H\u001b[?12l\u001b[?25h" + ], + [ + 0.288102, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[53;195H\u001b[38;5;70m\u001b[48;5;240m  18%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m9\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[19;8H\u001b[?12l\u001b[?25h" + ], + [ + 0.496038, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[53;195H\u001b[38;5;70m\u001b[48;5;240m  19%\u001b[m\u001b[93m\u001b[107m\u001b[6C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m20\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[20;8H\u001b[?12l\u001b[?25h" + ], + [ + 0.024987, + "\u001b[m\u001b[93m\u001b[107m\u001b[53;207H\u001b[1m\u001b[38;5;235m\u001b[48;5;252m1\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[21;8H" + ], + [ + 0.034118, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[53;195H\u001b[38;5;70m\u001b[48;5;240m  20%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m2\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[22;8H\u001b[?12l\u001b[?25h" + ], + [ + 0.029418, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[53;195H\u001b[38;5;70m\u001b[48;5;240m  21%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m3\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[23;8H\u001b[?12l\u001b[?25h" + ], + [ + 0.031726, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[53;195H\u001b[38;5;70m\u001b[48;5;240m  22%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m4\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[24;8H\u001b[?12l\u001b[?25h" + ], + [ + 0.026646, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[53;195H\u001b[38;5;70m\u001b[48;5;240m  23%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m5\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[25;8H\u001b[?12l\u001b[?25h" + ], + [ + 0.038387, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[53;195H\u001b[38;5;70m\u001b[48;5;240m  24%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m6\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[26;8H\u001b[?12l\u001b[?25h" + ], + [ + 0.02789, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[12;76H\u001b[1m\u001b[31m\u001b[106m{\u001b[27;5H}\u001b[m\u001b[93m\u001b[107m\u001b[53;195H\u001b[38;5;70m\u001b[48;5;240m  25%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m7\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:1\u001b[27;5H\u001b[?12l\u001b[?25h" + ], + [ + 0.027891, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[12;76H{\u001b[27;5H}\u001b[53;195H\u001b[38;5;107m\u001b[48;5;240m  26%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m8\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[28;5H\u001b[?12l\u001b[?25h" + ], + [ + 0.025499, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[53;195H\u001b[38;5;107m\u001b[48;5;240m  27%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m9\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[29;5H\u001b[?12l\u001b[?25h" + ], + [ + 0.032868, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[53;195H\u001b[38;5;107m\u001b[48;5;240m  28%\u001b[m\u001b[93m\u001b[107m\u001b[6C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m30\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[30;5H\u001b[?12l\u001b[?25h" + ], + [ + 0.034132, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[53;195H\u001b[38;5;107m\u001b[48;5;240m  29%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m1\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:4\u001b[31;8H\u001b[?12l\u001b[?25h" + ], + [ + 0.734937, + "\u001b[m\u001b[93m\u001b[107m\u001b[53;195H\u001b[38;5;107m\u001b[48;5;240m  28%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m0\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:1\u001b[30;5H" + ], + [ + 0.244963, + "\u001b[m\u001b[93m\u001b[107m\u001b[53;195H\u001b[38;5;107m\u001b[48;5;240m  29%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m1\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:4\u001b[31;8H" + ], + [ + 1.147152, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[53;195H\u001b[38;5;107m\u001b[48;5;240m  30%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m2\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[32;8H\u001b[?12l\u001b[?25h" + ], + [ + 0.507676, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[53;195H\u001b[38;5;107m\u001b[48;5;240m  31%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m3\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[33;8H\u001b[?12l\u001b[?25h" + ], + [ + 0.021376, + "\u001b[m\u001b[93m\u001b[107m\u001b[53;207H\u001b[1m\u001b[38;5;235m\u001b[48;5;252m4\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[34;8H" + ], + [ + 0.52311, + "\u001b[53;209H5\u001b[34;9H" + ], + [ + 0.501301, + "\u001b[53;209H6\u001b[34;10H" + ], + [ + 0.026664, + "\u001b[53;209H7\u001b[34;11H" + ], + [ + 0.029294, + "\u001b[53;209H8\u001b[34;12H" + ], + [ + 0.029763, + "\u001b[53;209H9\u001b[34;13H" + ], + [ + 0.029935, + "\u001b[53;209H10\u001b[34;14H" + ], + [ + 0.030764, + "\u001b[53;210H1\u001b[34;15H" + ], + [ + 0.028666, + "\u001b[53;210H2\u001b[34;16H" + ], + [ + 0.031328, + "\u001b[53;210H3\u001b[34;17H" + ], + [ + 0.031664, + "\u001b[53;210H4\u001b[34;18H" + ], + [ + 0.027038, + "\u001b[53;210H5\u001b[34;19H" + ], + [ + 0.033849, + "\u001b[53;210H6\u001b[34;20H" + ], + [ + 0.028053, + "\u001b[53;210H7\u001b[34;21H" + ], + [ + 0.031407, + "\u001b[53;210H8\u001b[34;22H" + ], + [ + 0.029045, + "\u001b[53;210H9\u001b[34;23H" + ], + [ + 0.031094, + "\u001b[53;209H20\u001b[34;24H" + ], + [ + 0.030714, + "\u001b[53;210H1\u001b[34;25H" + ], + [ + 0.030843, + "\u001b[53;210H2\u001b[34;26H" + ], + [ + 0.029335, + "\u001b[53;210H3\u001b[34;27H" + ], + [ + 0.03625, + "\u001b[53;210H4\u001b[34;28H" + ], + [ + 0.02287, + "\u001b[53;210H5\u001b[34;29H" + ], + [ + 0.031991, + "\u001b[53;210H6\u001b[34;30H" + ], + [ + 0.026648, + "\u001b[53;210H7\u001b[34;31H" + ], + [ + 0.032914, + "\u001b[53;210H8\u001b[34;32H" + ], + [ + 0.030082, + "\u001b[53;210H9\u001b[34;33H" + ], + [ + 0.03302, + "\u001b[53;209H30\u001b[34;34H" + ], + [ + 0.029673, + "\u001b[53;210H1\u001b[34;35H" + ], + [ + 0.029969, + "\u001b[53;210H2\u001b[34;36H" + ], + [ + 0.030958, + "\u001b[53;210H3\u001b[34;37H" + ], + [ + 0.032073, + "\u001b[53;210H4\u001b[34;38H" + ], + [ + 0.029162, + "\u001b[53;210H5\u001b[34;39H" + ], + [ + 0.030591, + "\u001b[53;210H6\u001b[34;40H" + ], + [ + 0.02993, + "\u001b[53;210H7\u001b[34;41H" + ], + [ + 0.032535, + "\u001b[53;210H8\u001b[34;42H" + ], + [ + 0.029006, + "\u001b[53;210H9\u001b[34;43H" + ], + [ + 0.031122, + "\u001b[53;209H40\u001b[34;44H" + ], + [ + 0.027152, + "\u001b[53;210H1\u001b[34;45H" + ], + [ + 0.030614, + "\u001b[53;210H2\u001b[34;46H" + ], + [ + 0.030056, + "\u001b[53;210H3\u001b[34;47H" + ], + [ + 0.031423, + "\u001b[53;210H4\u001b[34;48H" + ], + [ + 0.03265, + "\u001b[53;210H5\u001b[34;49H" + ], + [ + 0.026915, + "\u001b[53;210H6\u001b[34;50H" + ], + [ + 0.032032, + "\u001b[53;210H7\u001b[34;51H" + ], + [ + 0.22945, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[1C\u001b[1m\u001b[31m\u001b[106m()\u001b[m\u001b[93m\u001b[107m\u001b[53;210H\u001b[38;5;22m\u001b[48;5;252m8\u001b[34;52H\u001b[?12l\u001b[?25h" + ], + [ + 0.516968, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[54;1H\u001b[34m-- INSERT --\u001b[m\u001b[93m\u001b[107m\u001b[54;13H\u001b[K" + ], + [ + 0.039223, + "\u001b[53;1H\u001b[1m\u001b[38;5;23m\u001b[48;5;231m INSERT \u001b[m\u001b[93m\u001b[107m\u001b[38;5;148m\u001b[48;5;240m\u001b[m\u001b[93m\u001b[107m\u001b[53;9H\u001b[38;5;231m\u001b[48;5;31m\u001b[53;10H \u001b[m\u001b[93m\u001b[107m\u001b[38;5;117m\u001b[48;5;31m\u001b[53;12H kpod-stats \u001b[m\u001b[93m\u001b[107m\u001b[38;5;74m\u001b[48;5;31m\u001b[53;25H \u001b[m\u001b[93m\u001b[107m\u001b[38;5;117m\u001b[48;5;31mserver/\u001b[m\u001b[93m\u001b[107m\u001b[1m\u001b[38;5;231m\u001b[48;5;31mcontainer_list.go \u001b[m\u001b[93m\u001b[107m\u001b[38;5;240m\u001b[48;5;236m\u001b[m\u001b[93m\u001b[107m\u001b[53;51H\u001b[38;5;31m\u001b[48;5;24m\u001b[53;52H \u001b[m\u001b[93m\u001b[107m\u001b[38;5;231m\u001b[48;5;24m                                                                                                                           \u001b[m\u001b[93m\u001b[107m\u001b[38;5;117m\u001b[48;5;24munix\u001b[m\u001b[93m\u001b[107m\u001b[38;5;74m\u001b[48;5;24m \u001b[m\u001b[93m\u001b[107m\u001b[53;182H\u001b[38;5;117m\u001b[48;5;24m utf-8\u001b[m\u001b[93m\u001b[107m\u001b[38;5;74m\u001b[48;5;24m \u001b[m\u001b[93m\u001b[107m\u001b[53;190H\u001b[38;5;117m\u001b[48;5;24m go\u001b[m\u001b[93m\u001b[107m\u001b[38;5;31m\u001b[48;5;24m \u001b[m\u001b[93m\u001b[107m\u001b[53;195H\u001b[38;5;149m\u001b[48;5;31m  31%" + ], + [ + 2.7e-05, + "\u001b[m\u001b[93m\u001b[107m\u001b[38;5;117m\u001b[48;5;31m \u001b[m\u001b[93m\u001b[107m\u001b[53;202H\u001b[38;5;24m\u001b[48;5;117m \u001b[53;204H \u001b[m\u001b[93m\u001b[107m\u001b[1m\u001b[38;5;24m\u001b[48;5;117m 34\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[m\u001b[93m\u001b[107m\b\u001b[38;5;22m\u001b[48;5;117m:48 \u001b[34;52H\u001b[?12l\u001b[?25h" + ], + [ + 1.114697, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[1m\u001b[31m\u001b[106mj(\u001b[m\u001b[93m\u001b[107m)\u001b[53;50H\u001b[1m\u001b[38;5;220m\u001b[48;5;31m + \u001b[m\u001b[93m\u001b[107m\u001b[38;5;31m\u001b[48;5;24m\u001b[53;54H \u001b[m\u001b[93m\u001b[107m\u001b[155C\u001b[38;5;22m\u001b[48;5;117m9\u001b[m\u001b[93m\u001b[107m\u001b[34;52Hj\u001b[1m\u001b[31m\u001b[106m()\b\b\u001b[?12l\u001b[?25h" + ], + [ + 0.616695, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\b(\u001b[1m\u001b[31m\u001b[106m)\u001b[m\u001b[93m\u001b[107m\u001b[34;54H\u001b[K\u001b[34;52H\u001b[1m\u001b[31m\u001b[106m(\u001b[m\u001b[93m\u001b[107m\u001b[53;210H\u001b[38;5;22m\u001b[48;5;117m8\u001b[34;52H\u001b[?12l\u001b[?25h" + ], + [ + 0.440354, + "\u001b[?25l\u001b[53;210H9\u001b[34;53H\u001b[?12l\u001b[?25h" + ], + [ + 8.949745, + "\u001b[?25l\u001b[53;210H8\u001b[34;52H\u001b[?12l\u001b[?25h" + ], + [ + 0.496969, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m()\u001b[53;210H\u001b[38;5;22m\u001b[48;5;117m7\u001b[34;51H\u001b[?12l\u001b[?25h" + ], + [ + 0.032523, + "\u001b[53;210H6\u001b[34;50H" + ], + [ + 0.025768, + "\u001b[53;210H5\u001b[34;49H" + ], + [ + 0.032765, + "\u001b[53;210H4\u001b[34;48H" + ], + [ + 0.031191, + "\u001b[53;210H3\u001b[34;47H" + ], + [ + 0.030756, + "\u001b[53;210H2\u001b[34;46H" + ], + [ + 0.029399, + "\u001b[53;210H1\u001b[34;45H" + ], + [ + 0.338294, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[53;195H\u001b[38;5;149m\u001b[48;5;31m  32%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;24m\u001b[48;5;117m5\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;117m:1 \u001b[35;5H\u001b[?12l\u001b[?25h" + ], + [ + 0.473917, + "\u001b[m\u001b[93m\u001b[107m\u001b[53;195H\u001b[38;5;149m\u001b[48;5;31m  31%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;24m\u001b[48;5;117m4\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;117m:41\u001b[34;45H" + ], + [ + 113.574346, + "\u001b[27m\u001b[23m\u001b[m\u001b[93m\u001b[107m\u001b[H\u001b[2J\u001b[?25l\u001b[1;1H\u001b[96m\u001b[47m 2 \r\n 3 \u001b[m\u001b[93m\u001b[107m\u001b[32mimport\u001b[m\u001b[93m\u001b[107m (\r\n\u001b[96m\u001b[47m 4 \u001b[m\u001b[93m\u001b[107m \u001b[36m\"github.com/kubernetes-incubator/cri-o/oci\"\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m 5 \u001b[m\u001b[93m\u001b[107m \u001b[36m\"github.com/sirupsen/logrus\"\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m 6 \u001b[m\u001b[93m\u001b[107m \u001b[36m\"golang.org/x/net/context\"\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m 7 \u001b[m\u001b[93m\u001b[107m \u001b[36m\"k8s.io/apimachinery/pkg/fields\"\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m 8 \u001b[m\u001b[93m\u001b[107m pb \u001b[36m\"k8s.io/kubernetes/pkg/kubelet/api/v1alpha1/runtime\"\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m 9 \u001b[m\u001b[93m\u001b[107m)\r\n\u001b[96m\u001b[47m 10 \r\n 11 \u001b[m\u001b[93m\u001b[107m\u001b[96m// filterContainer returns whether passed container matches filtering criteria\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m 12 \u001b[m\u001b[93m\u001b[107m\u001b[32mfunc\u001b[m\u001b[93m\u001b[107m filterContainer(c *pb.Container, filter *pb.ContainerFilter) \u001b[33mbool\u001b[m\u001b[93m\u001b[107m {\r\n\u001b[96m\u001b[47m 13 \u001b[m\u001b[93m\u001b[107m \u001b[32mif\u001b[m\u001b[93m\u001b[107m filter != \u001b[36mnil\u001b[m\u001b[93m\u001b[107m {\r\n\u001b[96m\u001b[47m 14 \u001b[m\u001b[93m\u001b[107m\u001b[8C\u001b[32mif\u001b[m\u001b[93m\u001b[107m filter.State != \u001b[36m" + ], + [ + 2.7e-05, + "nil\u001b[m\u001b[93m\u001b[107m {\r\n\u001b[96m\u001b[47m 15 \u001b[m\u001b[93m\u001b[107m\u001b[12C\u001b[32mif\u001b[m\u001b[93m\u001b[107m c.State != filter.State.State {\r\n\u001b[96m\u001b[47m 16 \u001b[m\u001b[93m\u001b[107m\u001b[16C\u001b[32mreturn\u001b[m\u001b[93m\u001b[107m \u001b[36mfalse\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m 17 \u001b[m\u001b[93m\u001b[107m\u001b[12C}\r\n\u001b[96m\u001b[47m 18 \u001b[m\u001b[93m\u001b[107m\u001b[8C}\r\n\u001b[96m\u001b[47m 19 \u001b[m\u001b[93m\u001b[107m\u001b[8C\u001b[32mif\u001b[m\u001b[93m\u001b[107m filter.LabelSelector != \u001b[36mnil\u001b[m\u001b[93m\u001b[107m {\r\n\u001b[96m\u001b[47m 20 \u001b[m\u001b[93m\u001b[107m\u001b[12Csel := fields.SelectorFromSet(filter.LabelSelector)\r\n\u001b[96m\u001b[47m 21 \u001b[m\u001b[93m\u001b[107m\u001b[12C\u001b[32mif\u001b[m\u001b[93m\u001b[107m !sel.Matches(fields.Set(c.Labels)) {\r\n\u001b[96m\u001b[47m 22 \u001b[m\u001b[93m\u001b[107m\u001b[16C\u001b[32mreturn\u001b[m\u001b[93m\u001b[107m \u001b[36mfalse\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m 23 \u001b[m\u001b[93m\u001b[107m\u001b[12C}\r\n\u001b[96m\u001b[47m 24 \u001b[m\u001b[93m\u001b[107m\u001b[8C}\r\n\u001b[96m\u001b[47m 25 \u001b[m\u001b[93m\u001b[107m }\r\n\u001b[96m\u001b[47m 26 \u001b[m\u001b[93m\u001b[107m \u001b[32mreturn\u001b[m\u001b[93m\u001b[107m \u001b[36mtrue\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m 27 \u001b[m\u001b[93m\u001b[107m}\r\n\u001b[96m\u001b[47m 28 \r\n 29 \u001b[m\u001b[93m\u001b[107m\u001b[96m// \u001b[m\u001b[93m\u001b[107m\u001b[7m\u001b[33mListContainers\u001b[m\u001b[93m\u001b[107m\u001b[96m lists all containers by filters.\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m" + ], + [ + 0.005724, + "\u001b[47m 30 \u001b[m\u001b[93m\u001b[107m\u001b[32mfunc\u001b[m\u001b[93m\u001b[107m (s *Server) \u001b[7m\u001b[33mListContainers\u001b[m\u001b[93m\u001b[107m(ctx context.Context, req *pb.\u001b[7m\u001b[33mListContainers\u001b[m\u001b[93m\u001b[107mRequest) (*pb.\u001b[7m\u001b[33mListContainers\u001b[m\u001b[93m\u001b[107mResponse, \u001b[33merror\u001b[m\u001b[93m\u001b[107m) {\r\n\u001b[96m\u001b[47m 31 \u001b[m\u001b[93m\u001b[107m logrus.Debugf(\u001b[36m\"\u001b[m\u001b[93m\u001b[107m\u001b[7m\u001b[33mListContainers\u001b[m\u001b[93m\u001b[107m\u001b[36mRequest \u001b[m\u001b[93m\u001b[107m\u001b[31m%+v\u001b[m\u001b[93m\u001b[107m\u001b[36m\"\u001b[m\u001b[93m\u001b[107m, req)\r\n\u001b[96m\u001b[47m 32 \u001b[m\u001b[93m\u001b[107m \u001b[32mvar\u001b[m\u001b[93m\u001b[107m ctrs []*pb.Container\r\n\u001b[96m\u001b[47m 33 \u001b[m\u001b[93m\u001b[107m filter := req.Filter\r\n\u001b[96m\u001b[47m 34 \u001b[m\u001b[93m\u001b[107m ctrList := s.ContainerServer.\u001b[7m\u001b[33mListContainers\u001b[m\u001b[93m\u001b[107m()\r\n\u001b[96m\u001b[47m 35 \r\n 36 \u001b[m\u001b[93m\u001b[107m \u001b[96m// Filter using container id and pod id first.\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m 37 \u001b[m\u001b[93m\u001b[107m \u001b[32mif\u001b[m\u001b[93m\u001b[107m filter != \u001b[36mnil\u001b[m\u001b[93m\u001b[107m {\r\n\u001b[96m\u001b[47m 38 \u001b[m\u001b[93m\u001b[107m\u001b[8C\u001b[32mif\u001b[m\u001b[93m\u001b[107m filter.Id != \u001b[36m\"\"\u001b[m\u001b[93m\u001b[107m {\r\n\u001b[96m\u001b[47m 39 \u001b[m\u001b[93m\u001b[107m\u001b[12Cid, err := s.CtrIDIndex().Get(filter.I" + ], + [ + 3.6e-05, + "d)\r\n\u001b[96m\u001b[47m 40 \u001b[m\u001b[93m\u001b[107m\u001b[12C\u001b[32mif\u001b[m\u001b[93m\u001b[107m err != \u001b[36mnil\u001b[m\u001b[93m\u001b[107m {\r\n\u001b[96m\u001b[47m 41 \u001b[m\u001b[93m\u001b[107m\u001b[16C\u001b[32mreturn\u001b[m\u001b[93m\u001b[107m \u001b[36mnil\u001b[m\u001b[93m\u001b[107m, err\r\n\u001b[96m\u001b[47m 42 \u001b[m\u001b[93m\u001b[107m\u001b[12C}\r\n\u001b[96m\u001b[47m 43 \u001b[m\u001b[93m\u001b[107m\u001b[12Cc := s.ContainerServer.GetContainer(id)\r\n\u001b[96m\u001b[47m 44 \u001b[m\u001b[93m\u001b[107m\u001b[12C\u001b[32mif\u001b[m\u001b[93m\u001b[107m c != \u001b[36mnil\u001b[m\u001b[93m\u001b[107m {\r\n\u001b[96m\u001b[47m 45 \u001b[m\u001b[93m\u001b[107m\u001b[16C\u001b[32mif\u001b[m\u001b[93m\u001b[107m filter.PodSandboxId != \u001b[36m\"\"\u001b[m\u001b[93m\u001b[107m {\r\n\u001b[96m\u001b[47m 46 \u001b[m\u001b[93m\u001b[107m\u001b[20C\u001b[32mif\u001b[m\u001b[93m\u001b[107m c.Sandbox() == filter.PodSandboxId {\r\n\u001b[96m\u001b[47m 47 \u001b[m\u001b[93m\u001b[107m\u001b[24CctrList = []*oci.Container{c}\r\n\u001b[96m\u001b[47m 48 \u001b[m\u001b[93m\u001b[107m\u001b[20C} \u001b[32melse\u001b[m\u001b[93m\u001b[107m {\r\n\u001b[96m\u001b[47m 49 \u001b[m\u001b[93m\u001b[107m\u001b[24CctrList = []*oci.Container{}\r\n\u001b[96m\u001b[47m 50 \u001b[m\u001b[93m\u001b[107m\u001b[20C}\r\n\u001b[96m\u001b[47m 51 \u001b[m\u001b[93m\u001b[107m\r\n\u001b[1m\u001b[38;5;23m\u001b[48;5;231m INSERT \u001b[m\u001b[93m\u001b[107m\u001b[38;5;231m\u001b[48;5;31m\u001b[51;10H \u001b[m\u001b[93m\u001b[107m\u001b[38;5;117m\u001b[48;5;31m\u001b[51;12H kpod-stats \u001b[m\u001b[93m\u001b[107m\u001b[38;5;74m\u001b[48;5;31m" + ], + [ + 1.9e-05, + "\u001b[51;25H \u001b[m\u001b[93m\u001b[107m\u001b[38;5;117m\u001b[48;5;31mserver/\u001b[m\u001b[93m\u001b[107m\u001b[1m\u001b[38;5;231m\u001b[48;5;31mcontainer_list.go\u001b[m\u001b[93m\u001b[107m\u001b[1m\u001b[38;5;220m\u001b[48;5;31m + \u001b[m\u001b[93m\u001b[107m\u001b[38;5;31m\u001b[48;5;24m\u001b[51;54H \u001b[m\u001b[93m\u001b[107m\u001b[38;5;231m\u001b[48;5;24m                                                                                                                         \u001b[m\u001b[93m\u001b[107m\u001b[38;5;117m\u001b[48;5;24munix\u001b[m\u001b[93m\u001b[107m\u001b[38;5;74m\u001b[48;5;24m \u001b[m\u001b[93m\u001b[107m\u001b[51;182H\u001b[38;5;117m\u001b[48;5;24m utf-8\u001b[m\u001b[93m\u001b[107m\u001b[38;5;74m\u001b[48;5;24m \u001b[m\u001b[93m\u001b[107m\u001b[51;190H\u001b[38;5;117m\u001b[48;5;24m go\u001b[m\u001b[93m\u001b[107m\u001b[38;5;31m\u001b[48;5;24m \u001b[m\u001b[93m\u001b[107m\u001b[51;195H\u001b[38;5;149m\u001b[48;5;31m  31%\u001b[m\u001b[93m\u001b[107m\u001b[38;5;117m\u001b[48;5;31m \u001b[m\u001b[93m\u001b[107m\u001b[51;202H\u001b[38;5;24m\u001b[48;5;117m \u001b[51;204H \u001b[m\u001b[93m\u001b[107m\u001b[1m\u001b[38;5;24m\u001b[48;5;117m 34\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;117m:41 \u001b[m\u001b[93m\u001b[107m\u001b[52;1H\u001b[34m-- INSERT --\u001b[33;45H\u001b[?12l\u001b[?2" + ], + [ + 1.4e-05, + "5h" + ], + [ + 0.903658, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[33;38HListCon:tainers()\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m2\u001b[33;46H\u001b[?12l\u001b[?25h" + ], + [ + 0.265128, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107mqtainers()\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m3\u001b[33;47H\u001b[?12l\u001b[?25h" + ], + [ + 0.194087, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[33;47H\u001b[K\u001b[34;9Htainers()\u001b[35;9H\u001b[K\u001b[36;9H\u001b[96m// Filter using container id and pod id first.\u001b[m\u001b[93m\u001b[107m\u001b[37;9H\u001b[32mif\u001b[m\u001b[93m\u001b[107m filter != \u001b[36mnil\u001b[m\u001b[93m\u001b[107m {\u001b[37;27H\u001b[K\u001b[38;13H\u001b[32mif\u001b[m\u001b[93m\u001b[107m filter.Id != \u001b[36m\"\"\u001b[m\u001b[93m\u001b[107m {\u001b[38;33H\u001b[K\u001b[39;17Hid, err := s.CtrIDIndex().Get(filter.Id)\u001b[40;17H\u001b[32mif\u001b[m\u001b[93m\u001b[107m err != \u001b[36mnil\u001b[m\u001b[93m\u001b[107m {\u001b[40;33H\u001b[K\u001b[41;17H \u001b[32mreturn\u001b[m\u001b[93m\u001b[107m \u001b[36mnil\u001b[m\u001b[93m\u001b[107m, err\u001b[42;17H}\u001b[42;19H\u001b[K\u001b[43;17Hc := s.ContainerServer.GetContainer(id)\u001b[44;17H\u001b[32mif\u001b[m\u001b[93m\u001b[107m c != \u001b[36mnil\u001b[m\u001b[93m\u001b[107m {\u001b[44;30H\u001b[K\u001b[45;21H\u001b[32mif\u001b[m\u001b[93m\u001b[107m filter.PodSandboxId != \u001b[36m\"\"\u001b[m\u001b[93m\u001b[107m {\u001b[45;51H\u001b[K\u001b[46;25H\u001b[32mif\u001b[m\u001b[93m\u001b[107m c.Sandbox() == filter.PodSandboxId {\u001b[47;25H ctrList = []*oci.Container{c}\u001b[48;25H} \u001b[32melse\u001b[m\u001b[93m\u001b[107m {\u001b[48;33H\u001b[K\u001b[49;25H ctrList = []*oci.Container{}\u001b[50;25H}\u001b[51;195H\u001b[38;5;149m\u001b[48;5;31m  32%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;24m\u001b[48;5;117m5\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;117m:5 \u001b[34;9H\u001b[?12l" + ], + [ + 2.1e-05, + "\u001b[?25h" + ], + [ + 0.588871, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[52;1H\u001b[K" + ], + [ + 0.015698, + "\u001b[51;1H\u001b[1m\u001b[38;5;22m\u001b[48;5;148m NORMAL \u001b[m\u001b[93m\u001b[107m\u001b[38;5;231m\u001b[48;5;31m\u001b[m\u001b[93m\u001b[107m\u001b[51;9H\u001b[38;5;148m\u001b[48;5;240m\u001b[51;10H \u001b[m\u001b[93m\u001b[107m\u001b[38;5;250m\u001b[48;5;240m\u001b[51;12H kpod-stats \u001b[m\u001b[93m\u001b[107m\u001b[38;5;245m\u001b[48;5;240m\u001b[51;25H \u001b[m\u001b[93m\u001b[107m\u001b[38;5;250m\u001b[48;5;240mserver/\u001b[m\u001b[93m\u001b[107m\u001b[1m\u001b[38;5;231m\u001b[48;5;240mcontainer_list.go\u001b[m\u001b[93m\u001b[107m\u001b[1m\u001b[38;5;220m\u001b[48;5;31m \u001b[m\u001b[93m\u001b[107m\b\u001b[1m\u001b[38;5;220m\u001b[48;5;240m + \u001b[m\u001b[93m\u001b[107m\u001b[38;5;31m\u001b[48;5;24m\u001b[m\u001b[93m\u001b[107m\u001b[51;53H\u001b[38;5;240m\u001b[48;5;236m\u001b[51;54H \u001b[m\u001b[93m\u001b[107m\u001b[38;5;231m\u001b[48;5;236m                                                                                                                         \u001b[m\u001b[93m\u001b[107m\u001b[38;5;247m\u001b[48;5;236munix\u001b[m\u001b[93m\u001b[107m\u001b[38;5;244m\u001b[48;5;236m \u001b[m\u001b[93m\u001b[107m\u001b[51;182H\u001b[38;5;247m\u001b[48;5;236m utf-8\u001b[m\u001b[93m\u001b[107m\u001b[38;5;244m\u001b[48;5;236m \u001b[m\u001b[93m\u001b[107m\u001b[51;190H\u001b[38;5;247m\u001b[48;5;236m" + ], + [ + 4.7e-05, + " go\u001b[m\u001b[93m\u001b[107m\u001b[38;5;240m\u001b[48;5;236m \u001b[m\u001b[93m\u001b[107m\u001b[51;195H\u001b[38;5;107m\u001b[48;5;240m  32%\u001b[m\u001b[93m\u001b[107m\u001b[38;5;252m\u001b[48;5;240m \u001b[m\u001b[93m\u001b[107m\u001b[51;202H\u001b[38;5;235m\u001b[48;5;252m \u001b[51;204H \u001b[m\u001b[93m\u001b[107m\u001b[1m\u001b[38;5;235m\u001b[48;5;252m 35\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;117m:\u001b[m\u001b[93m\u001b[107m\b\u001b[38;5;22m\u001b[48;5;252m:4  \u001b[34;8H\u001b[?12l\u001b[?25h" + ], + [ + 0.392274, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[52;1H1 line less; before #2 2 seconds ago" + ], + [ + 0.004898, + "\u001b[33;38H\u001b[7m\u001b[33mListContainers\u001b[m\u001b[93m\u001b[107m()\u001b[34;9H\u001b[K\u001b[35;9H\u001b[96m// Filter using container id and pod id first.\u001b[m\u001b[93m\u001b[107m\u001b[36;9H\u001b[32mif\u001b[m\u001b[93m\u001b[107m filter != \u001b[36mnil\u001b[m\u001b[93m\u001b[107m {\u001b[36;27H\u001b[K\u001b[37;9H \u001b[32mif\u001b[m\u001b[93m\u001b[107m filter.Id != \u001b[36m\"\"\u001b[m\u001b[93m\u001b[107m {\u001b[38;13H id, err := s.CtrIDIndex().Get(filter.Id)\u001b[39;17H\u001b[32mif\u001b[m\u001b[93m\u001b[107m err != \u001b[36mnil\u001b[m\u001b[93m\u001b[107m {\u001b[39;32H\u001b[K\u001b[40;17H \u001b[32mreturn\u001b[m\u001b[93m\u001b[107m \u001b[36mnil\u001b[m\u001b[93m\u001b[107m, err\u001b[41;17H}\u001b[41;21H\u001b[K\u001b[42;17Hc := s.ContainerServer.GetContainer(id)\u001b[43;17H\u001b[32mif\u001b[m\u001b[93m\u001b[107m c != \u001b[36mnil\u001b[m\u001b[93m\u001b[107m {\u001b[43;30H\u001b[K\u001b[44;17H \u001b[32mif\u001b[m\u001b[93m\u001b[107m filter.PodSandboxId != \u001b[36m\"\"\u001b[m\u001b[93m\u001b[107m {\u001b[45;21H \u001b[32mif\u001b[m\u001b[93m\u001b[107m c.Sandbox() == filter.PodSandboxId {\u001b[46;25H ctrList = []*oci.Container{c}\u001b[46;58H\u001b[K\u001b[47;25H} \u001b[32melse\u001b[m\u001b[93m\u001b[107m {\u001b[47;33H\u001b[K\u001b[48;25H ctrList = []*oci.Container{}\u001b[49;25H}\u001b[49;29H\u001b[K\u001b[50;25H\u001b[K\u001b[51;195H\u001b[38;5;107m\u001b[48;5;240m  31%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m4\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m" + ], + [ + 3e-05, + "\u001b[48;5;252m:41\u001b[33;45H\u001b[?12l\u001b[?25h" + ], + [ + 0.603268, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[52;1HType :qa! and press to abandon all changes and exit Vim\u001b[?5h\u001b[?12l\u001b[?25h" + ], + [ + 0.008041, + "\u001b[?5l\u001b[33;45H" + ], + [ + 0.319799, + "\u001b[?25l\u001b[52;1H\u001b[K\u001b[52;1H:\u001b[?2004h\u001b[?12l\u001b[?25h" + ], + [ + 0.127623, + "q\u001b[?25l\u001b[?12l\u001b[?25h" + ], + [ + 0.201264, + "\r\u001b[?25l\u001b[7m\u001b[31mE37: No write since last change (add ! to override)\u001b[?2004h" + ], + [ + 0.008793, + "\u001b[33;45H\u001b[?12l\u001b[?25h" + ], + [ + 0.638602, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[52;1H\u001b[K\u001b[52;1H:\u001b[?2004h\u001b[?12l\u001b[?25h" + ], + [ + 0.175644, + "q" + ], + [ + 7.5e-05, + "\u001b[?25l\u001b[?12l\u001b[?25h" + ], + [ + 0.256365, + "!\u001b[?25l\u001b[?12l\u001b[?25h" + ], + [ + 0.232366, + "\r" + ], + [ + 0.014901, + "\u001b[?25l\u001b[?2004l\u001b[52;1H\u001b[K\u001b[52;1H\u001b[?2004l\u001b[?1l\u001b>\u001b[?12l\u001b[?25h\u001b[?1049l" + ], + [ + 0.00252, + "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r" + ], + [ + 0.024247, + "\r\n\u001b[34m\u001b[01mcri-o\u001b[22m \u001b[90mgit/kpod-stats* \u001b[39m \u001b[33m139s\u001b[39m\r\n" + ], + [ + 0.00148, + "\u001b]7;file://localhost.localdomain/home/ryan/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007" + ], + [ + 0.00016, + "\u001b]2;ryan@localhost: ~/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007" + ], + [ + 6.8e-05, + "\u001b]1;..cubator/cri-o\u0007" + ], + [ + 0.000192, + "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[35m❯\u001b[39m \u001b[K\u001b[208C\u001b[90m\u001b[39m\u001b[208D" + ], + [ + 0.000106, + "\u001b[?1h\u001b=" + ], + [ + 5e-05, + "\u001b[?2004h" + ], + [ + 0.340214, + "m" + ], + [ + 0.09551, + "\bma" + ], + [ + 0.120447, + "k" + ], + [ + 0.087296, + "e" + ], + [ + 0.071368, + " " + ], + [ + 0.089098, + "k" + ], + [ + 0.1039, + "p" + ], + [ + 0.071636, + "o" + ], + [ + 0.087901, + "d" + ], + [ + 0.136844, + "\u001b[?1l\u001b>" + ], + [ + 0.000113, + "\u001b[?2004l\r\r\n" + ], + [ + 0.012133, + "\u001b]2;make kpod\u0007\u001b]1;make\u0007" + ], + [ + 8.491971, + "go build -ldflags '-X main.gitCommit=1fd05c35 -X main.buildInfo=1502973722' -tags \"selinux seccomp \" -o kpod github.com/kubernetes-incubator/cri-o/cmd/kpod\r\n" + ], + [ + 6.307507, + "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r" + ], + [ + 0.020575, + "\r\n\u001b[34m\u001b[01mcri-o\u001b[22m \u001b[90mgit/kpod-stats* \u001b[39m \u001b[33m15s\u001b[39m\r\n" + ], + [ + 0.001077, + "\u001b]7;file://localhost.localdomain/home/ryan/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007" + ], + [ + 0.000118, + "\u001b]2;ryan@localhost: ~/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007" + ], + [ + 2.6e-05, + "\u001b]1;..cubator/cri-o\u0007" + ], + [ + 9.3e-05, + "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[35m❯\u001b[39m \u001b[K\u001b[208C\u001b[90m\u001b[39m\u001b[208D" + ], + [ + 6.5e-05, + "\u001b[?1h\u001b=" + ], + [ + 3e-05, + "\u001b[?2004h" + ], + [ + 146.677024, + "c" + ], + [ + 0.396395, + "\b \b" + ], + [ + 0.096947, + "g" + ], + [ + 0.119491, + "\bgi" + ], + [ + 0.065073, + "t" + ], + [ + 0.119305, + " " + ], + [ + 0.064229, + "s" + ], + [ + 0.367919, + "t" + ], + [ + 0.167391, + "a" + ], + [ + 0.088279, + "t" + ], + [ + 0.136684, + "u" + ], + [ + 0.111874, + "s" + ], + [ + 0.167915, + "\u001b[?1l\u001b>" + ], + [ + 0.000214, + "\u001b[?2004l\r\r\n" + ], + [ + 0.003677, + "\u001b]2;git status\u0007\u001b]1;git\u0007" + ], + [ + 0.018619, + "On branch kpod-stats\r\n" + ], + [ + 3.2e-05, + "Your branch is up-to-date with 'origin/kpod-stats'.\r\nChanges not staged for commit:\r\n (use \"git add ...\" to update what will be committed)\r\n (use \"git checkout -- ...\" to discard changes in working directory)\r\n\r\n\t\u001b[31mmodified: libkpod/container_server.go\u001b[m\r\n" + ], + [ + 1.3e-05, + "\t\u001b[31mmodified: server/container_list.go\u001b[m\r\n\r\nno changes added to commit (use \"git add\" and/or \"git commit -a\")\r\n" + ], + [ + 0.000564, + "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r" + ], + [ + 0.024004, + "\r\n\u001b[34m\u001b[01mcri-o\u001b[22m \u001b[90mgit/kpod-stats* \u001b[39m \u001b[33m\u001b[39m\r\n" + ], + [ + 0.003289, + "\u001b]7;file://localhost.localdomain/home/ryan/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007" + ], + [ + 0.000146, + "\u001b]2;ryan@localhost: ~/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007" + ], + [ + 0.000144, + "\u001b]1;..cubator/cri-o\u0007" + ], + [ + 0.000112, + "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[35m❯\u001b[39m \u001b[K\u001b[208C\u001b[90m\u001b[39m\u001b[208D" + ], + [ + 0.000113, + "\u001b[?1h\u001b=" + ], + [ + 4.6e-05, + "\u001b[?2004h" + ], + [ + 0.157568, + "g" + ], + [ + 0.150725, + "\bgi" + ], + [ + 0.088758, + "t" + ], + [ + 0.191523, + " " + ], + [ + 0.703489, + "\b" + ], + [ + 0.499958, + "\b \b" + ], + [ + 0.031738, + "\b\bg \b" + ], + [ + 0.030624, + "\b \b" + ], + [ + 0.302685, + "m" + ], + [ + 0.143773, + "\bma" + ], + [ + 0.132383, + "k" + ], + [ + 0.13996, + "e" + ], + [ + 0.031734, + " " + ], + [ + 0.100103, + "k" + ], + [ + 0.13186, + "p" + ], + [ + 0.09625, + "o" + ], + [ + 0.135131, + "d" + ], + [ + 1.224544, + "\u001b[?1l\u001b>" + ], + [ + 0.0002, + "\u001b[?2004l" + ], + [ + 0.000282, + "\r\r\n" + ], + [ + 0.003861, + "\u001b]2;make kpod\u0007\u001b]1;make\u0007" + ], + [ + 7.767101, + "make: 'kpod' is up to date.\r\n" + ], + [ + 0.000406, + "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r" + ], + [ + 0.024134, + "\r\n\u001b[34m\u001b[01mcri-o\u001b[22m \u001b[90mgit/kpod-stats* \u001b[39m \u001b[33m8s\u001b[39m\r\n" + ], + [ + 0.001383, + "\u001b]7;file://localhost.localdomain/home/ryan/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007" + ], + [ + 0.000122, + "\u001b]2;ryan@localhost: ~/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007" + ], + [ + 2.6e-05, + "\u001b]1;..cubator/cri-o\u0007" + ], + [ + 0.00011, + "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[35m❯\u001b[39m \u001b[K\u001b[208C\u001b[90m\u001b[39m\u001b[208D" + ], + [ + 7.5e-05, + "\u001b[?1h\u001b=" + ], + [ + 2.4e-05, + "\u001b[?2004h" + ], + [ + 11.517218, + " " + ], + [ + 4.345309, + "\b\b\b\b\b\b" + ], + [ + 0.359649, + "s" + ], + [ + 0.087548, + "\bsu" + ], + [ + 0.097684, + "d" + ], + [ + 0.086354, + "o" + ], + [ + 0.096813, + " " + ], + [ + 0.09598, + "m" + ], + [ + 0.095724, + "a" + ], + [ + 0.112142, + "k" + ], + [ + 0.095568, + "e" + ], + [ + 0.079489, + " " + ], + [ + 0.121036, + "c" + ], + [ + 0.06424, + "l" + ], + [ + 0.160013, + "e" + ], + [ + 0.078814, + "a" + ], + [ + 0.088993, + "n" + ], + [ + 0.198984, + "\u001b[?1l\u001b>" + ], + [ + 4.7e-05, + "\u001b[?2004l\r\r\n" + ], + [ + 0.002964, + "\u001b]2;sudo make clean\u0007\u001b]1;make\u0007" + ], + [ + 0.970251, + "[sudo] password for ryan: " + ], + [ + 1.949557, + "\r\n" + ], + [ + 3.091473, + "rm -f \"/home/ryan/Development/Go/src/github.com/kubernetes-incubator/cri-o/_output/.gopathok\"\r\n" + ], + [ + 0.001076, + "rm -rf _output\r\n" + ], + [ + 0.000525, + "rm -f docs/*.1 docs/*.5 docs/*.8\r\n" + ], + [ + 0.001472, + "rm -fr test/testdata/redis-image\r\n" + ], + [ + 0.000452, + "find . -name \\*~ -delete\r\n" + ], + [ + 0.015501, + "find . -name \\#\\* -delete\r\n" + ], + [ + 0.01696, + "rm -f crioctl crio kpod\r\n" + ], + [ + 0.025533, + "make -C conmon clean\r\n" + ], + [ + 0.002621, + "make[1]: Entering directory '/home/ryan/Development/Go/src/github.com/kubernetes-incubator/cri-o/conmon'\r\nrm -f conmon.o cmsg.o conmon\r\n" + ], + [ + 0.001734, + "make[1]: Leaving directory '/home/ryan/Development/Go/src/github.com/kubernetes-incubator/cri-o/conmon'\r\nmake -C pause clean\r\n" + ], + [ + 0.003556, + "make[1]: Entering directory '/home/ryan/Development/Go/src/github.com/kubernetes-incubator/cri-o/pause'\r\nrm -f pause.o pause\r\n" + ], + [ + 0.000983, + "make[1]: Leaving directory '/home/ryan/Development/Go/src/github.com/kubernetes-incubator/cri-o/pause'\r\n" + ], + [ + 0.000224, + "rm -f test/bin2img/bin2img\r\n" + ], + [ + 0.002959, + "rm -f test/copyimg/copyimg\r\n" + ], + [ + 0.004744, + "rm -f test/checkseccomp/checkseccomp\r\n" + ], + [ + 0.002614, + "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r" + ], + [ + 0.024046, + "\r\n\u001b[34m\u001b[01mcri-o\u001b[22m \u001b[90mgit/kpod-stats* \u001b[39m \u001b[33m6s\u001b[39m\r\n" + ], + [ + 0.00245, + "\u001b]7;file://localhost.localdomain/home/ryan/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007" + ], + [ + 0.000119, + "\u001b]2;ryan@localhost: ~/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007" + ], + [ + 2.6e-05, + "\u001b]1;..cubator/cri-o\u0007" + ], + [ + 8e-05, + "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[35m❯\u001b[39m " + ], + [ + 2.4e-05, + "\u001b[K\u001b[208C\u001b[90m\u001b[39m\u001b[208D" + ], + [ + 4.6e-05, + "\u001b[?1h\u001b=" + ], + [ + 2.6e-05, + "\u001b[?2004h" + ], + [ + 2.73537, + "g" + ], + [ + 0.063396, + "\bgi" + ], + [ + 0.128086, + "t" + ], + [ + 0.095837, + " " + ], + [ + 0.144554, + "c" + ], + [ + 0.083684, + "o" + ], + [ + 0.083361, + "m" + ], + [ + 0.165205, + "m" + ], + [ + 0.159495, + "i" + ], + [ + 0.108285, + "t" + ], + [ + 0.098609, + " " + ], + [ + 0.145308, + "-" + ], + [ + 0.099243, + "a" + ], + [ + 0.10427, + " " + ], + [ + 0.117066, + "-" + ], + [ + 0.131033, + "-" + ], + [ + 0.095675, + "a" + ], + [ + 0.112554, + "m" + ], + [ + 0.075379, + "e" + ], + [ + 0.108006, + "n" + ], + [ + 0.111673, + "d" + ], + [ + 0.121036, + "\u001b[?1l\u001b>" + ], + [ + 0.000282, + "\u001b[?2004l\r\r\n" + ], + [ + 0.006629, + "\u001b]2;git commit -a --amend\u0007\u001b]1;git\u0007" + ], + [ + 0.033575, + "\u001b[?2004h\u001b[?1049h\u001b[?1h\u001b=\u001b[?2004h" + ], + [ + 0.000393, + "\u001b[1;52r\u001b[?12;25h\u001b[?12l\u001b[?25h\u001b[27m\u001b[23m\u001b[m\u001b[H\u001b[2J\u001b[?25l\u001b[52;1H\"~/Development/Go/src/github.com/kubernetes-incubator/cri-o/.git/COMMIT_EDITMSG\"" + ], + [ + 8.2e-05, + " 107L, 6228C" + ], + [ + 0.000173, + "\u001b[1;1Hadd kpod stats function\r\n\r\nSigned-off-by: Ryan Cole \r\n\r\n# Please enter the commit message for your changes. Lines starting\r\n# with '#' will be ignored, and an empty message aborts the commit.\r\n#\r\n# Date: Tue Jul 25 09:56:23 2017 -0400\r\n#\r\n# On branch kpod-stats\r\n# Your branch is up-to-date with 'origin/kpod-stats'.\r\n#\r\n# Changes to be committed:\r\n#\u001b[7Cmodified: README.md\r\n#\u001b[7Cmodified: cmd/kpod/images.go\r\n#\u001b[7Cmodified: cmd/kpod/main.go\r\n#\u001b[7Cnew file: cmd/kpod/stats.go\r\n#\u001b[7Cmodified: completions/bash/kpod\r\n#\u001b[7Cnew file: docs/kpod-stats.1.md\r\n#\u001b[7Cmodified: libkpod/container_server.go\r\n#\u001b[7Cmodified: libkpod/image/image.go\r\n#\u001b[7Cnew file: libkpod/stats.go\r\n#\u001b[7Cmodified: server/container_list.go\r\n#\u001b[7Cnew file: test/kpod_stats.bats\r\n#\u001b[7Cmodified: vendor.conf\r\n#\u001b[7Cdeleted: vendor/github.com/Microsoft/hcsshim/mksyscall_windows.go\r\n#\u001b[7Cnew file: vendor/github.com/buger/goterm/README.md\r\n#\u001b[7Cnew file: vendor/github.com/buger/goterm/box.go\r\n#\u001b[7C" + ], + [ + 1.9e-05, + "new file: vendor/github.com/buger/goterm/plot.go\r\n#\u001b[7Cnew file: vendor/github.com/buger/goterm/table.go\r\n#\u001b[7Cnew file: vendor/github.com/buger/goterm/terminal.go\r\n#\u001b[7Cnew file: vendor/github.com/buger/goterm/terminal_nosysioctl.go\r\n#\u001b[7Cnew file: vendor/github.com/buger/goterm/terminal_sysioctl.go\r\n#\u001b[7Cdeleted: vendor/github.com/containers/storage/pkg/archive/example_changes.go\r\n#\u001b[7Cnew file: vendor/github.com/mrunalp/fileutils/LICENSE\r\n#\u001b[7Cnew file: vendor/github.com/mrunalp/fileutils/README.md\r\n#\u001b[7Cnew file: vendor/github.com/mrunalp/fileutils/fileutils.go\r\n#\u001b[7Cnew file: vendor/github.com/mrunalp/fileutils/idtools.go\r\n#\u001b[7Cmodified: vendor/github.com/opencontainers/runc/libcontainer/container_linux.go\r\n#\u001b[7Cmodified: vendor/github.com/opencontainers/runc/libcontainer/criurpc/criurpc.pb.go\r\n#\u001b[7Cmodified: vendor/github.com/opencontainers/runc/libcontainer/criurpc/criurpc.proto\r\n#\u001b[7Cmodified: vendor/github.com/opencontainers/runc/libcontainer/init_linux.go\r\n#" + ], + [ + 1.7e-05, + "\u001b[7Cmodified: vendor/github.com/opencontainers/runc/libcontainer/state_linux.go\r\n#\u001b[7Cnew file: vendor/github.com/vishvananda/netlink/LICENSE\r\n#\u001b[7Cnew file: vendor/github.com/vishvananda/netlink/README.md\r\n#\u001b[7Cnew file: vendor/github.com/vishvananda/netlink/addr.go\r\n#\u001b[7Cnew file: vendor/github.com/vishvananda/netlink/addr_linux.go\r\n#\u001b[7Cnew file: vendor/github.com/vishvananda/netlink/bpf_linux.go\r\n#\u001b[7Cnew file: vendor/github.com/vishvananda/netlink/bridge_linux.go\r\n#\u001b[7Cnew file: vendor/github.com/vishvananda/netlink/class.go\r\n#\u001b[7Cnew file: vendor/github.com/vishvananda/netlink/class_linux.go\u001b[1;1H\u001b[?12l\u001b[?25h" + ], + [ + 0.318498, + "\u001b[?25l\u001b[52;1H\u001b[K\u001b[52;1H:\u001b[?2004h" + ], + [ + 0.000184, + "\u001b[?12l\u001b[?25h" + ], + [ + 0.194901, + "w" + ], + [ + 0.048866, + "q" + ], + [ + 0.079626, + "\r" + ], + [ + 6.7e-05, + "\u001b[?25l\u001b[?2004l" + ], + [ + 0.000842, + "\".git/COMMIT_EDITMSG\"" + ], + [ + 0.018643, + " 107L, 6228C written" + ], + [ + 0.000239, + "\r\r\r\n\u001b[?2004l\u001b[?1l\u001b>\u001b[?12l\u001b[?25h\u001b[?1049l" + ], + [ + 0.012196, + "[kpod-stats 51fe5a83] add kpod stats function\r\n Date: Tue Jul 25 09:56:23 2017 -0400\r\n" + ], + [ + 0.005388, + " 93 files changed, 15781 insertions(+), 1249 deletions(-)\r\n create mode 100644 cmd/kpod/stats.go\r\n create mode 100644 docs/kpod-stats.1.md\r\n create mode 100644 libkpod/stats.go\r\n create mode 100644 test/kpod_stats.bats\r\n delete mode 100644 vendor/github.com/Microsoft/hcsshim/mksyscall_windows.go\r\n create mode 100644 vendor/github.com/buger/goterm/README.md\r\n create mode 100644 vendor/github.com/buger/goterm/box.go\r\n create mode 100644 vendor/github.com/buger/goterm/plot.go\r\n create mode 100644 vendor/github.com/buger/goterm/table.go\r\n create mode 100644 vendor/github.com/buger/goterm/terminal.go\r\n create mode 100644 vendor/github.com/buger/goterm/terminal_nosysioctl.go\r\n create mode 100644 vendor/github.com/buger/goterm/terminal_sysioctl.go\r\n delete mode 100644 vendor/github.com/containers/storage/pkg/archive/example_changes.go\r\n create mode 100644 vendor/github.com/mrunalp/fileutils/LICENSE\r\n create mode 100644 vendor/github.com/mrunalp/fileutils/README.md\r\n create mode 100644 vendor/github.com/mrunalp/fileu" + ], + [ + 3.1e-05, + "tils/fileutils.go\r\n create mode 100644 vendor/github.com/mrunalp/fileutils/idtools.go\r\n create mode 100644 vendor/github.com/vishvananda/netlink/LICENSE\r\n create mode 100644 vendor/github.com/vishvananda/netlink/README.md\r\n create mode 100644 vendor/github.com/vishvananda/netlink/addr.go\r\n create mode 100644 vendor/github.com/vishvananda/netlink/addr_linux.go\r\n create mode 100644 vendor/github.com/vishvananda/netlink/bpf_linux.go\r\n create mode 100644 vendor/github.com/vishvananda/netlink/bridge_linux.go\r\n create mode 100644 vendor/github.com/vishvananda/netlink/class.go\r\n create mode 100644 vendor/github.com/vishvananda/netlink/class_linux.go\r\n create mode 100644 vendor/github.com/vishvananda/netlink/conntrack_linux.go\r\n create mode 100644 vendor/github.com/vishvananda/netlink/conntrack_unspecified.go\r\n create mode 100644 vendor/github.com/vishvananda/netlink/filter.go\r\n create mode 100644 vendor/github.com/vishvananda/netlink/filter_linux.go\r\n create mode 100644 vendor/github.com/vishvananda/netlink/genetlin" + ], + [ + 1.9e-05, + "k_linux.go\r\n create mode 100644 vendor/github.com/vishvananda/netlink/genetlink_unspecified.go\r\n create mode 100644 vendor/github.com/vishvananda/netlink/gtp_linux.go\r\n create mode 100644 vendor/github.com/vishvananda/netlink/handle_linux.go\r\n create mode 100644 vendor/github.com/vishvananda/netlink/handle_unspecified.go\r\n create mode 100644 vendor/github.com/vishvananda/netlink/link.go\r\n create mode 100644 vendor/github.com/vishvananda/netlink/link_linux.go\r\n create mode 100644 vendor/github.com/vishvananda/netlink/link_tuntap_linux.go\r\n create mode 100644 vendor/github.com/vishvananda/netlink/neigh.go\r\n create mode 100644 vendor/github.com/vishvananda/netlink/neigh_linux.go\r\n create mode 100644 vendor/github.com/vishvananda/netlink/netlink.go\r\n create mode 100644 vendor/github.com/vishvananda/netlink/netlink_linux.go\r\n create mode 100644 vendor/github.com/vishvananda/netlink/netlink_unspecified.go\r\n create mode 100644 vendor/github.com/vishvananda/netlink/nl/addr_linux.go\r\n create mode 100644 vendor/github." + ], + [ + 1.7e-05, + "com/vishvananda/netlink/nl/bridge_linux.go\r\n create mode 100644 vendor/github.com/vishvananda/netlink/nl/conntrack_linux.go\r\n create mode 100644 vendor/github.com/vishvananda/netlink/nl/genetlink_linux.go\r\n create mode 100644 vendor/github.com/vishvananda/netlink/nl/link_linux.go\r\n create mode 100644 vendor/github.com/vishvananda/netlink/nl/mpls_linux.go\r\n create mode 100644 vendor/github.com/vishvananda/netlink/nl/nl_linux.go\r\n create mode 100644 vendor/github.com/vishvananda/netlink/nl/nl_unspecified.go\r\n create mode 100644 vendor/github.com/vishvananda/netlink/nl/route_linux.go\r\n create mode 100644 vendor/github.com/vishvananda/netlink/nl/syscall.go\r\n create mode 100644 vendor/github.com/vishvananda/netlink/nl/tc_linux.go\r\n create mode 100644 vendor/github.com/vishvananda/netlink/nl/xfrm_linux.go\r\n create mode 100644 vendor/github.com/vishvananda/netlink/nl/xfrm_monitor_linux.go\r\n create mode 100644 vendor/github.com/vishvananda/netlink/nl/xfrm_policy_linux.go\r\n" + ], + [ + 1.6e-05, + " create mode 100644 vendor/github.com/vishvananda/netlink/nl/xfrm_state_linux.go\r\n create mode 100644 vendor/github.com/vishvananda/netlink/order.go\r\n create mode 100644 vendor/github.com/vishvananda/netlink/protinfo.go\r\n create mode 100644 vendor/github.com/vishvananda/netlink/protinfo_linux.go\r\n" + ], + [ + 1.9e-05, + " create mode 100644 vendor/github.com/vishvananda/netlink/qdisc.go\r\n create mode 100644 vendor/github.com/vishvananda/netlink/qdisc_linux.go\r\n create mode 100644 vendor/github.com/vishvananda/netlink/route.go\r\n create mode 100644 vendor/github.com/vishvananda/netlink/route_linux.go\r\n create mode 100644 vendor/github.com/vishvananda/netlink/route_unspecified.go\r\n create mode 100644 vendor/github.com/vishvananda/netlink/rule.go\r\n" + ], + [ + 1.5e-05, + " create mode 100644 vendor/github.com/vishvananda/netlink/rule_linux.go\r\n create mode 100644 vendor/github.com/vishvananda/netlink/socket.go\r\n create mode 100644 vendor/github.com/vishvananda/netlink/socket_linux.go\r\n create mode 100644 vendor/github.com/vishvananda/netlink/xfrm.go\r\n create mode 100644 vendor/github.com/vishvananda/netlink/xfrm_monitor_linux.go\r\n create mode 100644 vendor/github.com/vishvananda/netlink/xfrm_policy.go\r\n create mode 100644 vendor/github.com/vishvananda/netlink/xfrm_policy_linux.go\r\n" + ], + [ + 1.3e-05, + " create mode 100644 vendor/github.com/vishvananda/netlink/xfrm_state.go\r\n create mode 100644 vendor/github.com/vishvananda/netlink/xfrm_state_linux.go\r\n create mode 100644 vendor/github.com/vishvananda/netns/LICENSE\r\n create mode 100644 vendor/github.com/vishvananda/netns/README.md\r\n create mode 100644 vendor/github.com/vishvananda/netns/netns.go\r\n create mode 100644 vendor/github.com/vishvananda/netns/netns_linux.go" + ], + [ + 1.3e-05, + "\r\n create mode 100644 vendor/github.com/vishvananda/netns/netns_unspecified.go\r\n" + ], + [ + 0.00046, + "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r" + ], + [ + 0.023729, + "\r\n\u001b[34m\u001b[01mcri-o\u001b[22m \u001b[90mgit/kpod-stats \u001b[39m \u001b[33m\u001b[39m\r\n" + ], + [ + 0.001064, + "\u001b]7;file://localhost.localdomain/home/ryan/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007" + ], + [ + 7.6e-05, + "\u001b]2;ryan@localhost: ~/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007" + ], + [ + 1.9e-05, + "\u001b]1;..cubator/cri-o\u0007" + ], + [ + 7.5e-05, + "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[35m❯\u001b[39m \u001b[K\u001b[208C\u001b[90m\u001b[39m\u001b[208D" + ], + [ + 6.4e-05, + "\u001b[?1h\u001b=" + ], + [ + 1.7e-05, + "\u001b[?2004h" + ], + [ + 0.093363, + "g" + ], + [ + 0.116444, + "\bgi" + ], + [ + 0.09112, + "t" + ], + [ + 0.140489, + " " + ], + [ + 0.295456, + "\b" + ], + [ + 0.148558, + "\b \b" + ], + [ + 0.151794, + "\b\bg \b" + ], + [ + 0.143687, + "\b \b" + ], + [ + 0.1717, + "m" + ], + [ + 0.113167, + "\bma" + ], + [ + 0.071539, + "k" + ], + [ + 0.151864, + "e" + ], + [ + 0.068538, + " " + ], + [ + 0.051546, + "k" + ], + [ + 0.136138, + "p" + ], + [ + 0.087532, + "o" + ], + [ + 0.136608, + "d" + ], + [ + 0.107472, + "\u001b[?1l\u001b>" + ], + [ + 0.000279, + "\u001b[?2004l\r\r\n" + ], + [ + 0.003576, + "\u001b]2;make kpod\u0007\u001b]1;make\u0007" + ], + [ + 7.566279, + "go build -ldflags '-X main.gitCommit=51fe5a83 -X main.buildInfo=1502973930' -tags \"selinux seccomp \" -o kpod github.com/kubernetes-incubator/cri-o/cmd/kpod\r\n" + ], + [ + 5.528396, + "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r" + ], + [ + 0.025808, + "\r\n\u001b[34m\u001b[01mcri-o\u001b[22m \u001b[90mgit/kpod-stats \u001b[39m \u001b[33m13s\u001b[39m\r\n" + ], + [ + 0.002211, + "\u001b]7;file://localhost.localdomain/home/ryan/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007\u001b]2;ryan@localhost: ~/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007\u001b]1;..cubator/cri-o\u0007\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[35m❯\u001b[39m \u001b[K\u001b[208C\u001b[90m\u001b[39m\u001b[208D\u001b[?1h\u001b=\u001b[?2004h" + ], + [ + 64.301943, + "g" + ], + [ + 0.072172, + "\bgi" + ], + [ + 0.104359, + "t" + ], + [ + 0.079837, + " " + ], + [ + 0.080135, + "p" + ], + [ + 0.055427, + "u" + ], + [ + 0.119911, + "s" + ], + [ + 0.104008, + "h" + ], + [ + 0.111595, + " " + ], + [ + 0.112396, + "-" + ], + [ + 0.112504, + "f" + ], + [ + 0.143522, + " " + ], + [ + 0.191507, + "o" + ], + [ + 0.120131, + "r" + ], + [ + 0.096379, + "i" + ], + [ + 0.127918, + "g" + ], + [ + 0.063437, + "i" + ], + [ + 0.056858, + "n" + ], + [ + 0.104321, + " " + ], + [ + 0.095939, + "k" + ], + [ + 0.192254, + "pod-" + ], + [ + 0.303579, + "s" + ], + [ + 0.088135, + "t" + ], + [ + 0.179185, + "a" + ], + [ + 0.580721, + "t" + ], + [ + 0.182035, + "s\u001b[1m \u001b[0m" + ], + [ + 0.393146, + "\b\u001b[0m \b" + ], + [ + 0.000296, + "\u001b[?1l\u001b>\u001b[?2004l\r\r\n" + ], + [ + 0.003558, + "\u001b]2;git push -f origin kpod-stats\u0007\u001b]1;git\u0007" + ], + [ + 0.735535, + "Counting objects: 120, done.\r\n" + ], + [ + 0.001739, + "Delta compression using up to 4 threads.\r\n" + ], + [ + 0.000228, + "Compressing objects: 0% (1/105) \r" + ], + [ + 0.000124, + "Compressing objects: 1% (2/105) \rCompressing objects: 2% (3/105) \r" + ], + [ + 4.3e-05, + "Compressing objects: 3% (4/105) \rCompressing objects: 4% (5/105) \rCompressing objects: 5% (6/105) \rCompressing objects: 6% (7/105) \r" + ], + [ + 2e-05, + "Compressing objects: 7% (8/105) \rCompressing objects: 8% (9/105) \rCompressing objects: 9% (10/105) \r" + ], + [ + 4.8e-05, + "Compressing objects: 10% (11/105) \rCompressing objects: 11% (12/105) \rCompressing objects: 12% (13/105) \r" + ], + [ + 0.000331, + "Compressing objects: 13% (14/105) \r" + ], + [ + 4.3e-05, + "Compressing objects: 14% (15/105) \r" + ], + [ + 4e-05, + "Compressing objects: 15% (16/105) \rCompressing objects: 16% (17/105) \r" + ], + [ + 1.5e-05, + "Compressing objects: 17% (18/105) \r" + ], + [ + 5.3e-05, + "Compressing objects: 18% (19/105) \rCompressing objects: 19% (20/105) \r" + ], + [ + 2e-05, + "Compressing objects: 20% (21/105) \r" + ], + [ + 0.000375, + "Compressing objects: 21% (23/105) \r" + ], + [ + 2e-05, + "Compressing objects: 22% (24/105) \r" + ], + [ + 4.8e-05, + "Compressing objects: 23% (25/105) \r" + ], + [ + 3.7e-05, + "Compressing objects: 24% (26/105) \r" + ], + [ + 3.7e-05, + "Compressing objects: 25% (27/105) \r" + ], + [ + 7.7e-05, + "Compressing objects: 26% (28/105) \r" + ], + [ + 1.7e-05, + "Compressing objects: 27% (29/105) \rCompressing objects: 28% (30/105) \r" + ], + [ + 3.7e-05, + "Compressing objects: 29% (31/105) \r" + ], + [ + 7.1e-05, + "Compressing objects: 30% (32/105) \rCompressing objects: 31% (33/105) \rCompressing objects: 32% (34/105) \r" + ], + [ + 4.1e-05, + "Compressing objects: 33% (35/105) \rCompressing objects: 34% (36/105) \r" + ], + [ + 6.3e-05, + "Compressing objects: 35% (37/105) \r" + ], + [ + 0.00012, + "Compressing objects: 36% (38/105) \r" + ], + [ + 0.000158, + "Compressing objects: 37% (39/105) \r" + ], + [ + 1.2e-05, + "Compressing objects: 38% (40/105) \r" + ], + [ + 0.000264, + "Compressing objects: 39% (41/105) \r" + ], + [ + 3.5e-05, + "Compressing objects: 40% (42/105) \r" + ], + [ + 0.000137, + "Compressing objects: 41% (44/105) \r" + ], + [ + 8.9e-05, + "Compressing objects: 42% (45/105) \r" + ], + [ + 8.5e-05, + "Compressing objects: 43% (46/105) \r" + ], + [ + 1e-05, + "Compressing objects: 44% (47/105) \r" + ], + [ + 6.8e-05, + "Compressing objects: 45% (48/105) \r" + ], + [ + 1.4e-05, + "Compressing objects: 46% (49/105) \r" + ], + [ + 0.000117, + "Compressing objects: 47% (50/105) \r" + ], + [ + 3.1e-05, + "Compressing objects: 48% (51/105) \r" + ], + [ + 3.1e-05, + "Compressing objects: 49% (52/105) \rCompressing objects: 50% (53/105) \r" + ], + [ + 4e-05, + "Compressing objects: 51% (54/105) \r" + ], + [ + 6.3e-05, + "Compressing objects: 52% (55/105) \r" + ], + [ + 9.2e-05, + "Compressing objects: 53% (56/105) \r" + ], + [ + 4.3e-05, + "Compressing objects: 54% (57/105) \r" + ], + [ + 7.9e-05, + "Compressing objects: 55% (58/105) \r" + ], + [ + 4.1e-05, + "Compressing objects: 56% (59/105) \r" + ], + [ + 6.3e-05, + "Compressing objects: 57% (60/105) \r" + ], + [ + 5e-05, + "Compressing objects: 58% (61/105) \r" + ], + [ + 0.000414, + "Compressing objects: 59% (62/105) \r" + ], + [ + 7.8e-05, + "Compressing objects: 60% (63/105) \r" + ], + [ + 5.6e-05, + "Compressing objects: 61% (65/105) \r" + ], + [ + 0.000113, + "Compressing objects: 62% (66/105) \r" + ], + [ + 9.4e-05, + "Compressing objects: 63% (67/105) \r" + ], + [ + 0.000101, + "Compressing objects: 64% (68/105) \r" + ], + [ + 8.3e-05, + "Compressing objects: 65% (69/105) \r" + ], + [ + 3.4e-05, + "Compressing objects: 66% (70/105) \r" + ], + [ + 9.2e-05, + "Compressing objects: 67% (71/105) \r" + ], + [ + 0.000266, + "Compressing objects: 68% (72/105) \r" + ], + [ + 2.2e-05, + "Compressing objects: 69% (73/105) \rCompressing objects: 70% (74/105) \rCompressing objects: 71% (75/105) \r" + ], + [ + 4.2e-05, + "Compressing objects: 72% (76/105) \r" + ], + [ + 3e-05, + "Compressing objects: 73% (77/105) \rCompressing objects: 74% (78/105) \r" + ], + [ + 0.000171, + "Compressing objects: 75% (79/105) \r" + ], + [ + 6.2e-05, + "Compressing objects: 76% (80/105) \r" + ], + [ + 2.4e-05, + "Compressing objects: 77% (81/105) \r" + ], + [ + 6.7e-05, + "Compressing objects: 78% (82/105) \rCompressing objects: 79% (83/105) \r" + ], + [ + 0.000233, + "Compressing objects: 80% (84/105) \r" + ], + [ + 0.00016, + "Compressing objects: 81% (86/105) \r" + ], + [ + 0.000135, + "Compressing objects: 82% (87/105) \r" + ], + [ + 0.000101, + "Compressing objects: 83% (88/105) \rCompressing objects: 84% (89/105) \r" + ], + [ + 2.1e-05, + "Compressing objects: 85% (90/105) \r" + ], + [ + 1.3e-05, + "Compressing objects: 86% (91/105) \r" + ], + [ + 0.000128, + "Compressing objects: 87% (92/105) \r" + ], + [ + 3.5e-05, + "Compressing objects: 88% (93/105) \r" + ], + [ + 0.000118, + "Compressing objects: 89% (94/105) \r" + ], + [ + 5.7e-05, + "Compressing objects: 90% (95/105) \rCompressing objects: 91% (96/105) \r" + ], + [ + 0.000429, + "Compressing objects: 92% (97/105) \rCompressing objects: 93% (98/105) \rCompressing objects: 94% (99/105) \r" + ], + [ + 1.5e-05, + "Compressing objects: 95% (100/105) \rCompressing objects: 96% (101/105) \rCompressing objects: 97% (102/105) \r" + ], + [ + 0.000944, + "Compressing objects: 98% (103/105) \r" + ], + [ + 0.000609, + "Compressing objects: 99% (104/105) \r" + ], + [ + 0.000117, + "Compressing objects: 100% (105/105) \r" + ], + [ + 7.5e-05, + "Compressing objects: 100% (105/105), done.\r\n" + ], + [ + 0.000147, + "Writing objects: 0% (1/120) \r" + ], + [ + 4.5e-05, + "Writing objects: 1% (2/120) \r" + ], + [ + 2.2e-05, + "Writing objects: 2% (3/120) \r" + ], + [ + 1.6e-05, + "Writing objects: 3% (4/120) \r" + ], + [ + 2.2e-05, + "Writing objects: 4% (5/120) \r" + ], + [ + 1.2e-05, + "Writing objects: 5% (6/120) \r" + ], + [ + 0.000344, + "Writing objects: 6% (8/120) \r" + ], + [ + 0.000106, + "Writing objects: 7% (9/120) \r" + ], + [ + 3.4e-05, + "Writing objects: 8% (10/120) \r" + ], + [ + 3.1e-05, + "Writing objects: 9% (11/120) \r" + ], + [ + 2.3e-05, + "Writing objects: 10% (12/120) \r" + ], + [ + 3.4e-05, + "Writing objects: 11% (14/120) \r" + ], + [ + 0.000662, + "Writing objects: 12% (15/120) \r" + ], + [ + 3.1e-05, + "Writing objects: 13% (16/120) \rWriting objects: 14% (17/120) \r" + ], + [ + 0.000202, + "Writing objects: 15% (18/120) \r" + ], + [ + 4.8e-05, + "Writing objects: 16% (20/120) \r" + ], + [ + 1.7e-05, + "Writing objects: 17% (21/120) \rWriting objects: 18% (22/120) \r" + ], + [ + 2.2e-05, + "Writing objects: 19% (23/120) \r" + ], + [ + 1.1e-05, + "Writing objects: 20% (24/120) \r" + ], + [ + 4.3e-05, + "Writing objects: 21% (26/120) \rWriting objects: 22% (27/120) \r" + ], + [ + 1.1e-05, + "Writing objects: 23% (28/120) \rWriting objects: 24% (29/120) \r" + ], + [ + 7.8e-05, + "Writing objects: 25% (30/120) \r" + ], + [ + 2.3e-05, + "Writing objects: 26% (32/120) \rWriting objects: 27% (33/120) \rWriting objects: 28% (34/120) \rWriting objects: 29% (35/120) \rWriting objects: 30% (36/120) \rWriting objects: 31% (38/120) \rWriting objects: 32% (39/120) \rWriting objects: 33% (40/120) \rWriting objects: 34% (41/120) \r" + ], + [ + 3.9e-05, + "Writing objects: 35% (42/120) \r" + ], + [ + 7.2e-05, + "Writing objects: 36% (44/120) \rWriting objects: 37% (45/120) \r" + ], + [ + 1.9e-05, + "Writing objects: 38% (46/120) \r" + ], + [ + 1.8e-05, + "Writing objects: 39% (47/120) \r" + ], + [ + 2.5e-05, + "Writing objects: 40% (48/120) \rWriting objects: 41% (50/120) \rWriting objects: 42% (51/120) \rWriting objects: 43% (52/120) \r" + ], + [ + 1e-05, + "Writing objects: 44% (53/120) \rWriting objects: 45% (54/120) \r" + ], + [ + 7.1e-05, + "Writing objects: 46% (56/120) \r" + ], + [ + 0.000534, + "Writing objects: 47% (57/120) \r" + ], + [ + 9.6e-05, + "Writing objects: 48% (58/120) \r" + ], + [ + 0.000193, + "Writing objects: 49% (59/120) \rWriting objects: 50% (60/120) \rWriting objects: 51% (62/120) \r" + ], + [ + 1.3e-05, + "Writing objects: 52% (63/120) \rWriting objects: 53% (64/120) \r" + ], + [ + 6e-05, + "Writing objects: 54% (65/120) \rWriting objects: 55% (66/120) \rWriting objects: 56% (68/120) \r" + ], + [ + 7e-05, + "Writing objects: 57% (69/120) \rWriting objects: 58% (70/120) \rWriting objects: 59% (71/120) \rWriting objects: 60% (72/120) \r" + ], + [ + 0.000191, + "Writing objects: 61% (74/120) \r" + ], + [ + 6.2e-05, + "Writing objects: 62% (75/120) \rWriting objects: 63% (76/120) \rWriting objects: 64% (77/120) \r" + ], + [ + 0.00023, + "Writing objects: 65% (78/120) \r" + ], + [ + 8.5e-05, + "Writing objects: 66% (80/120) \rWriting objects: 67% (81/120) \rWriting objects: 68% (82/120) \r" + ], + [ + 0.000103, + "Writing objects: 69% (83/120) \rWriting objects: 70% (84/120) \r" + ], + [ + 0.000194, + "Writing objects: 71% (86/120) \rWriting objects: 72% (87/120) \rWriting objects: 73% (88/120) \r" + ], + [ + 0.000514, + "Writing objects: 74% (89/120) \rWriting objects: 75% (90/120) \r" + ], + [ + 2.9e-05, + "Writing objects: 76% (92/120) \r" + ], + [ + 0.000844, + "Writing objects: 77% (93/120) \r" + ], + [ + 3.5e-05, + "Writing objects: 78% (94/120) \rWriting objects: 79% (95/120) \rWriting objects: 80% (96/120) \r" + ], + [ + 9.9e-05, + "Writing objects: 81% (98/120) \r" + ], + [ + 0.000116, + "Writing objects: 82% (99/120) \r" + ], + [ + 4.6e-05, + "Writing objects: 83% (100/120) \r" + ], + [ + 0.000493, + "Writing objects: 84% (101/120) \rWriting objects: 85% (102/120) \rWriting objects: 86% (104/120) \rWriting objects: 87% (105/120) \rWriting objects: 88% (106/120) \rWriting objects: 89% (107/120) \rWriting objects: 90% (108/120) \r" + ], + [ + 0.020626, + "Writing objects: 91% (110/120) \rWriting objects: 92% (111/120) \rWriting objects: 93% (112/120) \rWriting objects: 94% (113/120) \rWriting objects: 95% (114/120) \rWriting objects: 96% (116/120) \rWriting objects: 97% (117/120) \rWriting objects: 98% (118/120) \rWriting objects: 99% (119/120) \rWriting objects: 100% (120/120) \r" + ], + [ + 0.000125, + "Writing objects: 100% (120/120), 116.02 KiB | 4.30 MiB/s, done.\r\nTotal 120 (delta 31), reused 78 (delta 11)\r\n" + ], + [ + 0.145058, + "remote: Resolving deltas: 0% (0/31) \u001b[K\r" + ], + [ + 0.038865, + "remote: Resolving deltas: 3% (1/31) \u001b[K\rremote: Resolving deltas: 6% (2/31) \u001b[K\rremote: Resolving deltas: 9% (3/31) \u001b[K\r" + ], + [ + 0.000148, + "remote: Resolving deltas: 12% (4/31) \u001b[K\rremote: Resolving deltas: 16% (5/31) \u001b[K\r" + ], + [ + 4.8e-05, + "remote: Resolving deltas: 19% (6/31) \u001b[K\rremote: Resolving deltas: 22% (7/31) \u001b[K\rremote: Resolving deltas: 25% (8/31) \u001b[K\r" + ], + [ + 9.1e-05, + "remote: Resolving deltas: 29% (9/31) \u001b[K\rremote: Resolving deltas: 32% (10/31) \u001b[K\rremote: Resolving deltas: 35% (11/31) \u001b[K\rremote: Resolving deltas: 38% (12/31) \u001b[K\rremote: Resolving deltas: 41% (13/31) \u001b[K\rremote: Resolving deltas: 45% (14/31) \u001b[K\r" + ], + [ + 3.7e-05, + "remote: Resolving deltas: 48% (15/31) \u001b[K\rremote: Resolving deltas: 51% (16/31) \u001b[K\rremote: Resolving deltas: 54% (17/31) \u001b[K\rremote: Resolving deltas: 58% (18/31) \u001b[K\rremote: Resolving deltas: 61% (19/31) \u001b[K\rremote: Resolving deltas: 64% (20/31) \u001b[K\rremote: Resolving deltas: 67% (21/31) \u001b[K\r" + ], + [ + 0.000346, + "remote: Resolving deltas: 70% (22/31) \u001b[K\rremote: Resolving deltas: 74% (23/31) \u001b[K\rremote: Resolving deltas: 77% (24/31) \u001b[K\rremote: Resolving deltas: 80% (25/31) \u001b[K\rremote: Resolving deltas: 83% (26/31) \u001b[K\rremote: Resolving deltas: 87% (27/31) \u001b[K\rremote: Resolving deltas: 90% (28/31) \u001b[K\rremote: Resolving deltas: 93% (29/31) \u001b[K\rremote: Resolving deltas: 96% (30/31) \u001b[K\rremote: Resolving deltas: 100% (31/31) \u001b[K\rremote: Resolving deltas: 100% (31/31), completed with 30 local objects.\u001b[K\r\n" + ], + [ + 1.631427, + "To github.com:14rcole/cri-o\r\n + 1fd05c35...51fe5a83 kpod-stats -> kpod-stats (forced update)\r\n" + ], + [ + 0.001344, + "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r" + ], + [ + 0.027627, + "\r\n\u001b[34m\u001b[01mcri-o\u001b[22m \u001b[90mgit/kpod-stats \u001b[39m \u001b[33m\u001b[39m\r\n" + ], + [ + 0.001274, + "\u001b]7;file://localhost.localdomain/home/ryan/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007" + ], + [ + 9.1e-05, + "\u001b]2;ryan@localhost: ~/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007" + ], + [ + 1.9e-05, + "\u001b]1;..cubator/cri-o\u0007" + ], + [ + 0.000387, + "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[35m❯\u001b[39m \u001b[K\u001b[208C\u001b[90m\u001b[39m\u001b[208D\u001b[?1h\u001b=" + ], + [ + 2.1e-05, + "\u001b[?2004h" + ], + [ + 291.306849, + "s" + ], + [ + 0.143831, + "\bsu" + ], + [ + 0.09576, + "d" + ], + [ + 0.079837, + "o" + ], + [ + 0.056313, + " " + ], + [ + 0.09608, + "d" + ], + [ + 0.071913, + "o" + ], + [ + 0.175697, + "k" + ], + [ + 0.11164, + "c" + ], + [ + 0.344681, + "\b \b" + ], + [ + 0.143002, + "\b \b" + ], + [ + 0.353439, + "c" + ], + [ + 0.087928, + "k" + ], + [ + 0.127562, + "e" + ], + [ + 0.064111, + "r" + ], + [ + 0.095364, + " " + ], + [ + 0.103965, + "p" + ], + [ + 0.153227, + "s" + ], + [ + 0.119176, + "\u001b[?1l\u001b>" + ], + [ + 0.000192, + "\u001b[?2004l\r\r\n" + ], + [ + 0.004251, + "\u001b]2;sudo docker ps\u0007\u001b]1;docker\u0007" + ], + [ + 0.951818, + "[sudo] password for ryan: " + ], + [ + 2.123737, + "\r\n" + ], + [ + 0.050254, + "CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES\r\n" + ], + [ + 0.00261, + "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r" + ], + [ + 0.027572, + "\r\n\u001b[34m\u001b[01mcri-o\u001b[22m \u001b[90mgit/kpod-stats \u001b[39m \u001b[33m\u001b[39m\r\n" + ], + [ + 0.000953, + "\u001b]7;file://localhost.localdomain/home/ryan/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007" + ], + [ + 0.000219, + "\u001b]2;ryan@localhost: ~/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007" + ], + [ + 2.6e-05, + "\u001b]1;..cubator/cri-o\u0007" + ], + [ + 6.4e-05, + "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[35m❯\u001b[39m \u001b[K\u001b[208C\u001b[90m\u001b[39m\u001b[208D" + ], + [ + 7.4e-05, + "\u001b[?1h\u001b=" + ], + [ + 2.9e-05, + "\u001b[?2004h" + ], + [ + 1.758608, + "s" + ], + [ + 0.079496, + "\bsu" + ], + [ + 0.160361, + "d" + ], + [ + 0.111675, + "o" + ], + [ + 0.576293, + "\b \b" + ], + [ + 0.159908, + "\b \b" + ], + [ + 0.168126, + "\b\bs \b" + ], + [ + 0.159654, + "\b \b" + ], + [ + 0.11212, + "s" + ], + [ + 0.127338, + "\bsu" + ], + [ + 0.080917, + "d" + ], + [ + 0.215883, + " " + ], + [ + 0.103841, + "o" + ], + [ + 0.256261, + "\b \b" + ], + [ + 0.136045, + "\b" + ], + [ + 0.191849, + "o" + ], + [ + 0.143304, + " " + ], + [ + 0.0082, + "d" + ], + [ + 0.096655, + "o" + ], + [ + 0.127223, + "c" + ], + [ + 0.08778, + "k" + ], + [ + 0.072448, + "e" + ], + [ + 0.064418, + "r" + ], + [ + 0.08791, + " " + ], + [ + 0.10463, + "r" + ], + [ + 0.111928, + "u" + ], + [ + 0.175632, + "n" + ], + [ + 0.127848, + " " + ], + [ + 0.401299, + "=" + ], + [ + 0.358516, + "\b \b" + ], + [ + 0.119353, + "-" + ], + [ + 0.128809, + "d" + ], + [ + 0.208134, + " " + ], + [ + 0.57505, + "r" + ], + [ + 0.13708, + "y" + ], + [ + 0.295931, + "\b \b" + ], + [ + 0.151706, + "\b \b" + ], + [ + 0.128648, + "r" + ], + [ + 0.087732, + "y" + ], + [ + 0.128014, + "a" + ], + [ + 0.223742, + "\b \b" + ], + [ + 0.143667, + "\b \b" + ], + [ + 0.151936, + "\b \b" + ], + [ + 0.688079, + "r" + ], + [ + 0.080579, + "e" + ], + [ + 0.151405, + "d" + ], + [ + 0.08859, + "i" + ], + [ + 0.127706, + "s" + ], + [ + 0.223311, + ":" + ], + [ + 0.225389, + "a" + ], + [ + 0.119256, + "l" + ], + [ + 0.167568, + "p" + ], + [ + 0.136311, + "i" + ], + [ + 0.064759, + "n" + ], + [ + 0.519447, + "e" + ], + [ + 2.207743, + "\u001b[?1l\u001b>" + ], + [ + 7.9e-05, + "\u001b[?2004l\r\r\n" + ], + [ + 0.004381, + "\u001b]2;sudo docker run -d redis:alpine\u0007\u001b]1;docker\u0007" + ], + [ + 0.156868, + "7e7a6dcecb2a803420db5e51e50289160869d387d5fe002c1f968c9c5e0aff47\r\n" + ], + [ + 0.331473, + "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r" + ], + [ + 0.02536, + "\r\n\u001b[34m\u001b[01mcri-o\u001b[22m \u001b[90mgit/kpod-stats \u001b[39m \u001b[33m\u001b[39m\r\n" + ], + [ + 0.001087, + "\u001b]7;file://localhost.localdomain/home/ryan/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007" + ], + [ + 0.000141, + "\u001b]2;ryan@localhost: ~/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007" + ], + [ + 2.9e-05, + "\u001b]1;..cubator/cri-o\u0007" + ], + [ + 8.7e-05, + "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[35m❯\u001b[39m \u001b[K\u001b[208C\u001b[90m\u001b[39m\u001b[208D" + ], + [ + 8.6e-05, + "\u001b[?1h\u001b=" + ], + [ + 0.00014, + "\u001b[?2004h" + ], + [ + 1.408725, + "s" + ], + [ + 0.072298, + "\bsu" + ], + [ + 0.120191, + "d" + ], + [ + 0.070475, + "o" + ], + [ + 0.104883, + " " + ], + [ + 0.224668, + "d" + ], + [ + 0.140195, + "o" + ], + [ + 0.083514, + "c" + ], + [ + 0.087764, + "k" + ], + [ + 0.159229, + "e" + ], + [ + 0.032016, + "r" + ], + [ + 0.145043, + " " + ], + [ + 0.079616, + "p" + ], + [ + 0.17546, + "s" + ], + [ + 0.095711, + "\u001b[?1l\u001b>" + ], + [ + 3.8e-05, + "\u001b[?2004l\r\r\n" + ], + [ + 0.002462, + "\u001b]2;sudo docker ps\u0007\u001b]1;docker\u0007" + ], + [ + 0.040773, + "CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES\r\n7e7a6dcecb2a " + ], + [ + 2.8e-05, + "redis:alpine \"docker-entrypoint...\" 4 seconds ago Up 3 seconds 6379/tcp angry_sammet\r\n" + ], + [ + 0.002288, + "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r" + ], + [ + 0.023578, + "\r\n\u001b[34m\u001b[01mcri-o\u001b[22m \u001b[90mgit/kpod-stats \u001b[39m \u001b[33m\u001b[39m\r\n" + ], + [ + 0.00174, + "\u001b]7;file://localhost.localdomain/home/ryan/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007" + ], + [ + 0.00025, + "\u001b]2;ryan@localhost: ~/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007" + ], + [ + 5.7e-05, + "\u001b]1;..cubator/cri-o\u0007" + ], + [ + 0.000111, + "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[35m❯\u001b[39m " + ], + [ + 2.5e-05, + "\u001b[K\u001b[208C\u001b[90m\u001b[39m\u001b[208D" + ], + [ + 5.5e-05, + "\u001b[?1h\u001b=" + ], + [ + 2.7e-05, + "\u001b[?2004h" + ], + [ + 2.400936, + "s" + ], + [ + 0.152528, + "\bsu" + ], + [ + 0.11187, + "d" + ], + [ + 0.104125, + "o" + ], + [ + 0.095533, + " " + ], + [ + 0.048573, + "d" + ], + [ + 0.103791, + "o" + ], + [ + 0.280474, + "c" + ], + [ + 0.375565, + "k" + ], + [ + 0.096108, + "e" + ], + [ + 0.07174, + "r" + ], + [ + 0.143903, + " " + ], + [ + 0.088133, + "p" + ], + [ + 0.136279, + "s" + ], + [ + 0.087682, + " " + ], + [ + 0.128367, + "-" + ], + [ + 0.095693, + "-" + ], + [ + 0.199987, + "n" + ], + [ + 0.095887, + "o" + ], + [ + 0.231909, + "-" + ], + [ + 0.192349, + "t" + ], + [ + 0.144555, + "r" + ], + [ + 0.079249, + "u" + ], + [ + 0.167991, + "n" + ], + [ + 0.104447, + "c" + ], + [ + 0.103816, + "\u001b[?1l\u001b>" + ], + [ + 0.000465, + "\u001b[?2004l\r\r\n" + ], + [ + 0.004264, + "\u001b]2;sudo docker ps --no-trunc\u0007\u001b]1;docker\u0007" + ], + [ + 0.037936, + "CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES\r\n7e7a6dcecb2a803420db5e51e50289160869d387d5fe002c1f968c9c5e0aff47 redis:alpine \"docker-entrypoint.sh redis-server\" 10 seconds ago Up 8 seconds 6379/tcp angry_sammet\r\n" + ], + [ + 0.003831, + "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r" + ], + [ + 0.025231, + "\r\n\u001b[34m\u001b[01mcri-o\u001b[22m \u001b[90mgit/kpod-stats \u001b[39m \u001b[33m\u001b[39m\r\n" + ], + [ + 0.001942, + "\u001b]7;file://localhost.localdomain/home/ryan/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007" + ], + [ + 0.000107, + "\u001b]2;ryan@localhost: ~/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007" + ], + [ + 2e-05, + "\u001b]1;..cubator/cri-o\u0007" + ], + [ + 0.000109, + "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[35m❯\u001b[39m \u001b[K\u001b[208C\u001b[90m\u001b[39m\u001b[208D" + ], + [ + 8.2e-05, + "\u001b[?1h\u001b=" + ], + [ + 2.2e-05, + "\u001b[?2004h" + ], + [ + 266.219062, + "g" + ], + [ + 0.16768, + "\bgi" + ], + [ + 0.095185, + "t" + ], + [ + 0.088157, + " " + ], + [ + 0.14361, + "c" + ], + [ + 0.072124, + "h" + ], + [ + 0.080042, + "e" + ], + [ + 0.08789, + "c" + ], + [ + 0.161802, + "k" + ], + [ + 0.438173, + "o" + ], + [ + 0.122346, + "ut" + ], + [ + 0.445633, + " " + ], + [ + 0.145215, + "k" + ], + [ + 0.171124, + "pod-" + ], + [ + 0.332988, + "t" + ], + [ + 0.282934, + "est-refactor\u001b[1m \u001b[0m" + ], + [ + 5.748889, + "\b\u001b[0m \b" + ], + [ + 0.000105, + "\u001b[?1l\u001b>" + ], + [ + 0.000463, + "\u001b[?2004l\r\r\n" + ], + [ + 0.005657, + "\u001b]2;git checkout kpod-test-refactor\u0007\u001b]1;git\u0007" + ], + [ + 0.037888, + "Switched to branch 'kpod-test-refactor'\r\n" + ], + [ + 0.001679, + "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r" + ], + [ + 0.035158, + "\r\n\u001b[34m\u001b[01mcri-o\u001b[22m \u001b[90mgit/kpod-test-refactor \u001b[39m \u001b[33m\u001b[39m\r\n" + ], + [ + 0.002249, + "\u001b]7;file://localhost.localdomain/home/ryan/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007" + ], + [ + 7.2e-05, + "\u001b]2;ryan@localhost: ~/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007" + ], + [ + 7e-05, + "\u001b]1;..cubator/cri-o\u0007" + ], + [ + 0.000272, + "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[35m❯\u001b[39m \u001b[K\u001b[208C\u001b[90m\u001b[39m\u001b[208D" + ], + [ + 6.4e-05, + "\u001b[?1h\u001b=" + ], + [ + 1.9e-05, + "\u001b[?2004h" + ], + [ + 49.127527, + "g" + ], + [ + 0.324522, + "\b \b" + ], + [ + 0.279967, + "v" + ], + [ + 0.192132, + "\bv " + ], + [ + 0.07975, + "t" + ], + [ + 0.07264, + "e" + ], + [ + 0.164523, + "st\u001b[1m/\u001b[0m" + ], + [ + 0.330897, + "\b\u001b[0m \b" + ], + [ + 0.136168, + "\b \b" + ], + [ + 0.152143, + "\b \b" + ], + [ + 0.500013, + "\b \b" + ], + [ + 0.030003, + "\b \b" + ], + [ + 0.029676, + "\b" + ], + [ + 0.028834, + "\b \b" + ], + [ + 0.171506, + "v" + ], + [ + 0.119953, + "\bvi" + ], + [ + 0.111174, + " " + ], + [ + 0.080497, + "t" + ], + [ + 0.064222, + "e" + ], + [ + 0.174426, + "st\u001b[1m/\u001b[0m" + ], + [ + 0.314489, + "\b\u001b[0m/k" + ], + [ + 0.079352, + "pod_" + ], + [ + 0.695495, + "p" + ], + [ + 0.0322, + "u" + ], + [ + 0.141247, + "\u0007" + ], + [ + 0.000165, + "\r\r\n" + ], + [ + 5.7e-05, + "\u001b[J\u001b[0mkpod_pull.bats \u001b[Jkpod_push.bats\u001b[J\u001b[A\u001b[0m\u001b[27m\u001b[24m\u001b[39m\r\u001b[2Cvi test/kpod_pu\u001b[K\u001b[193C\u001b[90m\u001b[39m\u001b[39m\u001b[193D" + ], + [ + 0.577866, + "s" + ], + [ + 0.192123, + "h.bats\u001b[1m \u001b[0m" + ], + [ + 2.609562, + "\b\u001b[0m \b\u001b[?1l\u001b>\u001b[?2004l\r\r\n\u001b[J" + ], + [ + 0.005239, + "\u001b]2;vim test/kpod_push.bats\u0007\u001b]1;vi\u0007" + ], + [ + 0.142495, + "\u001b[?2004h\u001b[?1049h\u001b[?1h\u001b=\u001b[?2004h" + ], + [ + 0.000713, + "\u001b[1;52r\u001b[?12;25h\u001b[?12l\u001b[?25h\u001b[27m\u001b[23m\u001b[m\u001b[93m\u001b[107m\u001b[H\u001b[2J\u001b[?25l\u001b[52;1H\"test/kpod_push.bats\"" + ], + [ + 9.6e-05, + " 87L, 2371C" + ], + [ + 0.003372, + "\u001b[2;1H▽\u001b[6n\u001b[2;1H \u001b[1;1H\u001b[>c" + ], + [ + 0.000718, + "\u001b[1;1H\u001b[96m\u001b[47m 38 \u001b[m\u001b[93m\u001b[107m run ${KPOD_BINARY} $KPOD_OPTIONS rmi \u001b[36m\"$IMAGE\"\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m 39 \u001b[m\u001b[93m\u001b[107m [ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\r\n\u001b[96m\u001b[47m 40 \u001b[m\u001b[93m\u001b[107m rm -rf /tmp/busybox\r\n\u001b[96m\u001b[47m 41 \u001b[m\u001b[93m\u001b[107m stop_crio\r\n\u001b[96m\u001b[47m 42 \u001b[m\u001b[93m\u001b[107m}\r\n\u001b[96m\u001b[47m 43 \r\n 44 \u001b[m\u001b[93m\u001b[107m@test \u001b[36m\"kpod push to docker archive\"\u001b[m\u001b[93m\u001b[107m {\r\n\u001b[96m\u001b[47m 45 \u001b[m\u001b[93m\u001b[107m run ${KPOD_BINARY} $KPOD_OPTIONS pull \u001b[36m\"$IMAGE\"\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m 46 \u001b[m\u001b[93m\u001b[107m echo \u001b[36m\"$output\"\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m 47 \u001b[m\u001b[93m\u001b[107m [ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\r\n\u001b[96m\u001b[47m 48 \u001b[m\u001b[93m\u001b[107m run ${KPOD_BINARY} $KPOD_OPTIONS push \u001b[36m\"$IMAGE\"\u001b[m\u001b[93m\u001b[107m docker-archive:/tmp/busybox-archive:1.26\r\n\u001b[96m\u001b[47m 49 \u001b[m\u001b[93m\u001b[107m echo \u001b[36m\"$output\"\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m 50 \u001b[m\u001b[93m\u001b[107m [ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\r\n\u001b[96m\u001b[47m 51 \u001b[m\u001b[93m\u001b[107m rm /tmp/busybox-archive\r\n\u001b[96m\u001b[47m 52 \u001b[m\u001b[93m\u001b[107m run ${KPOD_BINARY} $KPO" + ], + [ + 2.1e-05, + "D_OPTIONS rmi \u001b[36m\"$IMAGE\"\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m 53 \u001b[m\u001b[93m\u001b[107m [ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\r\n\u001b[96m\u001b[47m 54 \u001b[m\u001b[93m\u001b[107m stop_crio\r\n\u001b[96m\u001b[47m 55 \u001b[m\u001b[93m\u001b[107m}\r\n\u001b[96m\u001b[47m 56 \r\n 57 \u001b[m\u001b[93m\u001b[107m@test \u001b[36m\"kpod push to oci without compression\"\u001b[m\u001b[93m\u001b[107m {\r\n\u001b[96m\u001b[47m 58 \u001b[m\u001b[93m\u001b[107m run ${KPOD_BINARY} $KPOD_OPTIONS pull \u001b[36m\"$IMAGE\"\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m 59 \u001b[m\u001b[93m\u001b[107m echo \u001b[36m\"$output\"\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m 60 \u001b[m\u001b[93m\u001b[107m [ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\r\n\u001b[96m\u001b[47m 61 \u001b[m\u001b[93m\u001b[107m run mkdir /tmp/oci-busybox\r\n\u001b[96m\u001b[47m 62 \u001b[m\u001b[93m\u001b[107m echo \u001b[36m\"$output\"\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m 63 \u001b[m\u001b[93m\u001b[107m [ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\r\n\u001b[96m\u001b[47m 64 \u001b[m\u001b[93m\u001b[107m run ${KPOD_BINARY} $KPOD_OPTIONS push --disable-compression \u001b[36m\"$IMAGE\"\u001b[m\u001b[93m\u001b[107m oci:/tmp/oci-busybox\r\n\u001b[96m\u001b[47m 65 \u001b[m\u001b[93m\u001b[107m echo \u001b[36m\"$output\"\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m 66 \u001b[m\u001b[93m\u001b[107m [ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\r\n" + ], + [ + 0.033108, + "\u001b[96m\u001b[47m 67 \u001b[m\u001b[93m\u001b[107m rm -rf /tmp/oci-busybox\r\n\u001b[96m\u001b[47m 68 \u001b[m\u001b[93m\u001b[107m run ${KPOD_BINARY} $KPOD_OPTIONS rmi \u001b[36m\"$IMAGE\"\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m 69 \u001b[m\u001b[93m\u001b[107m [ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\r\n\u001b[96m\u001b[47m 70 \u001b[m\u001b[93m\u001b[107m stop_crio\r\n\u001b[96m\u001b[47m 71 \u001b[m\u001b[93m\u001b[107m}\r\n\u001b[96m\u001b[47m 72 \r\n 73 \u001b[m\u001b[93m\u001b[107m@test \u001b[36m\"kpod push without signatures\"\u001b[m\u001b[93m\u001b[107m {\r\n\u001b[96m\u001b[47m 74 \u001b[m\u001b[93m\u001b[107m run ${KPOD_BINARY} $KPOD_OPTIONS pull \u001b[36m\"$IMAGE\"\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m 75 \u001b[m\u001b[93m\u001b[107m echo \u001b[36m\"$output\"\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m 76 \u001b[m\u001b[93m\u001b[107m [ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\r\n\u001b[96m\u001b[47m 77 \u001b[m\u001b[93m\u001b[107m run mkdir /tmp/busybox\r\n\u001b[96m\u001b[47m 78 \u001b[m\u001b[93m\u001b[107m echo \u001b[36m\"$output\"\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m 79 \u001b[m\u001b[93m\u001b[107m [ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\r\n\u001b[96m\u001b[47m 80 \u001b[m\u001b[93m\u001b[107m run ${KPOD_BINARY} $KPOD_OPTIONS push --remove-signatures \u001b[36m\"$IMAGE\"\u001b[m\u001b[93m\u001b[107m dir:/tmp/busybox\r\n\u001b[96m\u001b[47m 81 \u001b[m\u001b[93m\u001b[107m echo \u001b[36m\"$output\"\u001b[m\u001b[93m\u001b[" + ], + [ + 3.3e-05, + "107m\r\n\u001b[96m\u001b[47m 82 \u001b[m\u001b[93m\u001b[107m [ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\r\n\u001b[96m\u001b[47m 83 \u001b[m\u001b[93m\u001b[107m rm -rf /tmp/busybox\r\n\u001b[96m\u001b[47m 84 \u001b[m\u001b[93m\u001b[107m run ${KPOD_BINARY} $KPOD_OPTIONS rmi \u001b[36m\"$IMAGE\"\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m 85 \u001b[m\u001b[93m\u001b[107m [ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\r\n\u001b[96m\u001b[47m 86 \u001b[m\u001b[93m\u001b[107m stop_crio\r\n\u001b[96m\u001b[47m 87 \u001b[m\u001b[93m\u001b[107m}\r\n\u001b[1m\u001b[38;5;22m\u001b[48;5;148m NORMAL \u001b[m\u001b[93m\u001b[107m\u001b[38;5;148m\u001b[48;5;240m\u001b[51;10H \u001b[m\u001b[93m\u001b[107m\u001b[38;5;250m\u001b[48;5;240m\u001b[51;12H kpod-test-refactor \u001b[m\u001b[93m\u001b[107m\u001b[38;5;245m\u001b[48;5;240m\u001b[51;33H \u001b[m\u001b[93m\u001b[107m\u001b[38;5;250m\u001b[48;5;240mtest/\u001b[m\u001b[93m\u001b[107m\u001b[1m\u001b[38;5;231m\u001b[48;5;240mkpod_push.bats \u001b[m\u001b[93m\u001b[107m\u001b[38;5;240m\u001b[48;5;236m\u001b[51;55H \u001b[m\u001b[93m\u001b[107m\u001b[38;5;231m\u001b[48;5;236m                                                                                                                      \u001b[m\u001b[93m\u001b[107m" + ], + [ + 0.010668, + "\u001b[38;5;247m\u001b[48;5;236munix\u001b[m\u001b[93m\u001b[107m\u001b[38;5;244m\u001b[48;5;236m \u001b[m\u001b[93m\u001b[107m\u001b[51;180H\u001b[38;5;247m\u001b[48;5;236m utf-8\u001b[m\u001b[93m\u001b[107m\u001b[38;5;244m\u001b[48;5;236m \u001b[m\u001b[93m\u001b[107m\u001b[51;188H\u001b[38;5;247m\u001b[48;5;236m conf\u001b[m\u001b[93m\u001b[107m\u001b[38;5;240m\u001b[48;5;236m \u001b[m\u001b[93m\u001b[107m\u001b[51;195H\u001b[38;5;247m\u001b[48;5;240m  97%\u001b[m\u001b[93m\u001b[107m\u001b[38;5;252m\u001b[48;5;240m \u001b[m\u001b[93m\u001b[107m\u001b[51;202H\u001b[38;5;235m\u001b[48;5;252m \u001b[51;204H \u001b[m\u001b[93m\u001b[107m\u001b[1m\u001b[38;5;235m\u001b[48;5;252m 84\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:5  \u001b[47;9H\u001b[?12l\u001b[?25h\u001bP+q436f\u001b\\\u001bP+q6b75\u001b\\\u001bP+q6b64\u001b\\\u001bP+q6b72\u001b\\\u001bP+q6b6c\u001b\\\u001bP+q2332\u001b\\\u001bP+q2334\u001b\\\u001bP+q2569\u001b\\\u001bP+q2a37\u001b\\\u001bP+q6b31\u001b\\" + ], + [ + 3.900157, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[1;2H\u001b[96m\u001b[47m21\r\n 22\r\n 23\u001b[m\u001b[93m\u001b[107m\u001b[6Cun ${OCIC_BINARY} image remove busybox:test\u001b[4;2H\u001b[96m\u001b[47m24\u001b[m\u001b[93m\u001b[107m\u001b[5C\u001b[1m\u001b[31m\u001b[106m[\u001b[m\u001b[93m\u001b[107m \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 \u001b[1m\u001b[31m\u001b[106m]\u001b[m\u001b[93m\u001b[107m\u001b[5;2H\u001b[96m\u001b[47m25\u001b[m\u001b[93m\u001b[107m\u001b[1C stop_crio\u001b[6;2H\u001b[96m\u001b[47m26\u001b[m\u001b[93m\u001b[107m\u001b[1C}\u001b[7;2H\u001b[96m\u001b[47m27\u001b[m\u001b[93m\u001b[107m\u001b[7;5H\u001b[K\u001b[8;2H\u001b[96m\u001b[47m28\u001b[m\u001b[93m\u001b[107m\u001b[1C@test \u001b[36m\"kpod push to directory\"\u001b[m\u001b[93m\u001b[107m {\u001b[8;37H\u001b[K\u001b[9;2H\u001b[96m\u001b[47m29\u001b[m\u001b[93m\u001b[107m\u001b[5Crun ${KPOD_BINARY} $KPOD_OPTIONS pull \u001b[36m\"$IMAGE\"\u001b[m\u001b[93m\u001b[107m\u001b[10;2H\u001b[96m\u001b[47m30\u001b[m\u001b[93m\u001b[107m\u001b[5Cecho \u001b[36m\"$output\"\u001b[m\u001b[93m\u001b[107m\u001b[10;23H\u001b[K\u001b[11;2H\u001b[96m\u001b[47m31\u001b[m\u001b[93m\u001b[107m\u001b[5C[ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\u001b[11;28H\u001b[K\u001b[12;2H\u001b[96m\u001b[47m32\u001b[m\u001b[93m\u001b[107m\u001b[5Crun mkdir /tmp/busybox\u001b[13;2H\u001b[96m\u001b[47m33\u001b[m\u001b[93m\u001b[107m\u001b[5Cecho \u001b[36m\"$output\"\u001b[m\u001b[93m\u001b[107m\u001b[13;23H\u001b[K\u001b[14;2H\u001b[96m\u001b[47m34\u001b[m\u001b[93m\u001b[107m\u001b[5C[ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\u001b[14;28H\u001b[K\u001b[15;2H\u001b[96m\u001b[47m35\u001b[m\u001b[93m\u001b[107m\u001b[38Cpush \u001b[36m\"$IMAGE\"\u001b[m\u001b[93m\u001b" + ], + [ + 6e-05, + "[107m dir:/tmp/busybox\u001b[16;2H\u001b[96m\u001b[47m36\u001b[m\u001b[93m\u001b[107m\u001b[5Cecho \u001b[36m\"$output\"\u001b[m\u001b[93m\u001b[107m\u001b[16;23H\u001b[K\u001b[17;2H\u001b[96m\u001b[47m37\u001b[m\u001b[93m\u001b[107m\u001b[5C[ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\u001b[18;2H\u001b[96m\u001b[47m38\u001b[m\u001b[93m\u001b[107m\u001b[1C run ${KPOD_BINARY} $KPOD_OPTIONS rmi \u001b[36m\"$IMAGE\"\u001b[m\u001b[93m\u001b[107m\u001b[19;2H\u001b[96m\u001b[47m39\u001b[m\u001b[93m\u001b[107m\u001b[5C[ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\u001b[20;2H\u001b[96m\u001b[47m40\u001b[m\u001b[93m\u001b[107m\u001b[1C rm -rf /tmp/busybox\u001b[20;28H\u001b[K\u001b[21;2H\u001b[96m\u001b[47m41\u001b[m\u001b[93m\u001b[107m\u001b[5Cstop_crio\u001b[21;18H\u001b[K\u001b[22;2H\u001b[96m\u001b[47m42\u001b[m\u001b[93m\u001b[107m\u001b[1C}\u001b[22;9H\u001b[K\u001b[23;2H\u001b[96m\u001b[47m43\u001b[m\u001b[93m\u001b[107m\u001b[23;9H\u001b[K\u001b[24;2H\u001b[96m\u001b[47m44\u001b[m\u001b[93m\u001b[107m\u001b[1C@test \u001b[36m\"kpod push to docker archive\"\u001b[m\u001b[93m\u001b[107m {\u001b[25;2H\u001b[96m\u001b[47m45\u001b[m\u001b[93m\u001b[107m\u001b[5Crun ${KPOD_BINARY} $KPOD_OPTIONS pull \u001b[36m\"$IMAGE\"\u001b[m\u001b[93m\u001b[107m\u001b[26;2H\u001b[96m\u001b[47m46\u001b[m\u001b[93m\u001b[107m\u001b[5Cecho \u001b[36m\"$output\"\u001b[m\u001b[93m\u001b[107m\u001b[26;23H\u001b[K\u001b[27;2H\u001b[96m\u001b[47m47\u001b[m\u001b[93m\u001b[107m\u001b[5C[ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\u001b[27;28H\u001b[K\u001b[28;2H\u001b[96m\u001b[47m48\u001b[m\u001b[93m\u001b[107m\u001b[5Crun ${KPOD_BINARY} $KPOD_OPTIONS push " + ], + [ + 0.016615, + "\u001b[36m\"$IMAGE\"\u001b[m\u001b[93m\u001b[107m docker-archive:/tmp/busybox-archive:1.26\u001b[29;2H\u001b[96m\u001b[47m49\u001b[m\u001b[93m\u001b[107m\u001b[5Cecho \u001b[36m\"$output\"\u001b[m\u001b[93m\u001b[107m\u001b[29;23H\u001b[K\u001b[30;2H\u001b[96m\u001b[47m50\u001b[m\u001b[93m\u001b[107m\u001b[5C[ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\u001b[30;28H\u001b[K\u001b[31;2H\u001b[96m\u001b[47m51\u001b[m\u001b[93m\u001b[107m\u001b[6Cm /tmp/busybox-archive\u001b[31;32H\u001b[K\u001b[32;2H\u001b[96m\u001b[47m52\u001b[m\u001b[93m\u001b[107m\u001b[5Crun ${KPOD_BINARY} $KPOD_OPTIONS rmi \u001b[36m\"$IMAGE\"\u001b[m\u001b[93m\u001b[107m\u001b[33;2H\u001b[96m\u001b[47m53\u001b[m\u001b[93m\u001b[107m\u001b[5C[ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\u001b[34;2H\u001b[96m\u001b[47m54\u001b[m\u001b[93m\u001b[107m\u001b[1C stop_crio\u001b[35;2H\u001b[96m\u001b[47m55\u001b[m\u001b[93m\u001b[107m\u001b[1C}\u001b[36;2H\u001b[96m\u001b[47m56\u001b[m\u001b[93m\u001b[107m\u001b[36;5H\u001b[K\u001b[37;2H\u001b[96m\u001b[47m57\u001b[m\u001b[93m\u001b[107m\u001b[1C@test \u001b[36m\"kpod push to oci without compression\"\u001b[m\u001b[93m\u001b[107m {\u001b[37;51H\u001b[K\u001b[38;2H\u001b[96m\u001b[47m58\u001b[m\u001b[93m\u001b[107m\u001b[5Crun ${KPOD_BINARY} $KPOD_OPTIONS pull \u001b[36m\"$IMAGE\"\u001b[m\u001b[93m\u001b[107m\u001b[39;2H\u001b[96m\u001b[47m59\u001b[m\u001b[93m\u001b[107m\u001b[5Cecho \u001b[36m\"$output\"\u001b[m\u001b[93m\u001b[107m\u001b[39;23H\u001b[K\u001b[40;2H\u001b[96m\u001b[47m60\u001b[m\u001b[93m\u001b[107m\u001b[5C[ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\u001b[40;28H\u001b[K\u001b[41;2H\u001b[96m\u001b[47m61\u001b[m\u001b[93m\u001b[1" + ], + [ + 5.1e-05, + "07m\u001b[5Crun mkdir /tmp/oci-busybox\u001b[42;2H\u001b[96m\u001b[47m62\u001b[m\u001b[93m\u001b[107m\u001b[5Cecho \u001b[36m\"$output\"\u001b[m\u001b[93m\u001b[107m\u001b[42;23H\u001b[K\u001b[43;2H\u001b[96m\u001b[47m63\u001b[m\u001b[93m\u001b[107m\u001b[5C[ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\u001b[43;28H\u001b[K\u001b[44;2H\u001b[96m\u001b[47m64\u001b[m\u001b[93m\u001b[107m\u001b[5Crun ${KPOD_BINARY} $KPOD_OPTIONS push --disable-compression \u001b[36m\"$IMAGE\"\u001b[m\u001b[93m\u001b[107m oci:/tmp/oci-busybox\u001b[45;2H\u001b[96m\u001b[47m65\u001b[m\u001b[93m\u001b[107m\u001b[5Cecho \u001b[36m\"$output\"\u001b[m\u001b[93m\u001b[107m\u001b[45;23H\u001b[K\u001b[46;2H\u001b[96m\u001b[47m66\u001b[m\u001b[93m\u001b[107m\u001b[5C[ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\u001b[47;2H\u001b[96m\u001b[47m67\u001b[m\u001b[93m\u001b[107m\u001b[6Cm -rf /tmp/oci-busybox\u001b[47;32H\u001b[K\u001b[48;2H\u001b[96m\u001b[47m68\u001b[m\u001b[93m\u001b[107m\u001b[5Crun ${KPOD_BINARY} $KPOD_OPTIONS rmi \u001b[36m\"$IMAGE\"\u001b[m\u001b[93m\u001b[107m\u001b[49;2H\u001b[96m\u001b[47m69\u001b[m\u001b[93m\u001b[107m\u001b[5C[ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\u001b[50;2H\u001b[96m\u001b[47m70\u001b[m\u001b[93m\u001b[107m\u001b[1C stop_crio\u001b[51;195H\u001b[38;5;107m\u001b[48;5;240m  28%\u001b[m\u001b[93m\u001b[107m\u001b[6C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m24\u001b[4;9H\u001b[?12l\u001b[?25h" + ], + [ + 1.049793, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[1;3H\u001b[96m\u001b[47m0\u001b[m\u001b[93m\u001b[107m\u001b[5C[ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\u001b[1;28H\u001b[K\u001b[2;3H\u001b[96m\u001b[47m1\u001b[m\u001b[93m\u001b[107m\u001b[5Crun ${KPOD_BINARY} $KPOD_OPTIONS rmi \u001b[36m\"$IMAGE\"\u001b[m\u001b[93m\u001b[107m\u001b[3;3H\u001b[96m\u001b[47m2\u001b[m\u001b[93m\u001b[107m\u001b[5C[ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\u001b[3;28H\u001b[K\u001b[4;3H\u001b[96m\u001b[47m3\u001b[m\u001b[93m\u001b[107m\u001b[5Crun ${OCIC_BINARY} image remove busybox:test\u001b[5;3H\u001b[96m\u001b[47m4\u001b[m\u001b[93m\u001b[107m\u001b[5C[ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\u001b[6;3H\u001b[96m\u001b[47m5\u001b[m\u001b[93m\u001b[107m\u001b[1C stop_crio\u001b[7;3H\u001b[96m\u001b[47m6\u001b[m\u001b[93m\u001b[107m\u001b[1C}\u001b[8;3H\u001b[96m\u001b[47m7\u001b[m\u001b[93m\u001b[107m\u001b[8;5H\u001b[K\u001b[9;3H\u001b[96m\u001b[47m8\u001b[m\u001b[93m\u001b[107m\u001b[1C@test \u001b[36m\"kpod push to directory\"\u001b[m\u001b[93m\u001b[107m {\u001b[9;37H\u001b[K\u001b[10;2H\u001b[96m\u001b[47m29\u001b[m\u001b[93m\u001b[107m\u001b[5Crun ${KPOD_BINARY} $KPOD_OPTIONS pull \u001b[36m\"$IMAGE\"\u001b[m\u001b[93m\u001b[107m\u001b[11;3H\u001b[96m\u001b[47m0\u001b[m\u001b[93m\u001b[107m\u001b[5Cecho \u001b[36m\"$output\"\u001b[m\u001b[93m\u001b[107m\u001b[11;23H\u001b[K\u001b[12;3H\u001b[96m\u001b[47m1\u001b[m\u001b[93m\u001b[107m\u001b[5C[ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\u001b[12;28H\u001b[K\u001b[13;3H\u001b[96m\u001b[47m2\u001b[m\u001b[93m\u001b[107m\u001b[5Crun mkdir /tmp/busybox\u001b[14;3H\u001b[96m\u001b[47m3\u001b[m\u001b[93m\u001b[107m\u001b[5Cecho \u001b" + ], + [ + 0.000196, + "[36m\"$output\"\u001b[m\u001b[93m\u001b[107m\u001b[14;23H\u001b[K\u001b[15;3H\u001b[96m\u001b[47m4\u001b[m\u001b[93m\u001b[107m\u001b[5C[ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\u001b[15;28H\u001b[K\u001b[16;3H\u001b[96m\u001b[47m5\u001b[m\u001b[93m\u001b[107m\u001b[5Crun ${KPOD_BINARY} $KPOD_OPTIONS push \u001b[36m\"$IMAGE\"\u001b[m\u001b[93m\u001b[107m dir:/tmp/busybox\u001b[17;3H\u001b[96m\u001b[47m6\u001b[m\u001b[93m\u001b[107m\u001b[5Cecho \u001b[36m\"$output\"\u001b[m\u001b[93m\u001b[107m\u001b[17;23H\u001b[K\u001b[18;3H\u001b[96m\u001b[47m7\u001b[m\u001b[93m\u001b[107m\u001b[5C[ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\u001b[18;28H\u001b[K\u001b[19;3H\u001b[96m\u001b[47m8\u001b[m\u001b[93m\u001b[107m\u001b[5Crun ${KPOD_BINARY} $KPOD_OPTIONS rmi \u001b[36m\"$IMAGE\"\u001b[m\u001b[93m\u001b[107m\u001b[20;2H\u001b[96m\u001b[47m39\u001b[m\u001b[93m\u001b[107m\u001b[5C[ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\u001b[21;3H\u001b[96m\u001b[47m0\u001b[m\u001b[93m\u001b[107m\u001b[5Crm -rf /tmp/busybox\u001b[22;3H\u001b[96m\u001b[47m1\u001b[m\u001b[93m\u001b[107m\u001b[1C stop_crio\u001b[23;3H\u001b[96m\u001b[47m2\u001b[m\u001b[93m\u001b[107m\u001b[1C}\u001b[24;3H\u001b[96m\u001b[47m3\u001b[m\u001b[93m\u001b[107m\u001b[24;5H\u001b[K\u001b[25;3H\u001b[96m\u001b[47m4\u001b[m\u001b[93m\u001b[107m\u001b[1C@test \u001b[36m\"kpod push to docker archive\"\u001b[m\u001b[93m\u001b[107m {\u001b[25;42H\u001b[K\u001b[26;3H\u001b[96m\u001b[47m5\u001b[m\u001b[93m\u001b[107m\u001b[5Crun ${KPOD_BINARY} $KPOD_OPTIONS pull \u001b[36m\"$IMAGE\"\u001b[m\u001b[93m\u001b[107m\u001b[27;3H\u001b[96m\u001b[47m6\u001b[m\u001b[93m\u001b[107m\u001b[5Cecho " + ], + [ + 0.004649, + "\u001b[36m\"$output\"\u001b[m\u001b[93m\u001b[107m\u001b[27;23H\u001b[K\u001b[28;3H\u001b[96m\u001b[47m7\u001b[m\u001b[93m\u001b[107m\u001b[5C[ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\u001b[28;28H\u001b[K\u001b[29;3H\u001b[96m\u001b[47m8\u001b[m\u001b[93m\u001b[107m\u001b[5Crun ${KPOD_BINARY} $KPOD_OPTIONS push \u001b[36m\"$IMAGE\"\u001b[m\u001b[93m\u001b[107m docker-archive:/tmp/busybox-archive:1.26\u001b[30;2H\u001b[96m\u001b[47m49\u001b[m\u001b[93m\u001b[107m\u001b[5Cecho \u001b[36m\"$output\"\u001b[m\u001b[93m\u001b[107m\u001b[30;23H\u001b[K\u001b[31;3H\u001b[96m\u001b[47m0\u001b[m\u001b[93m\u001b[107m\u001b[5C[ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\u001b[31;28H\u001b[K\u001b[32;3H\u001b[96m\u001b[47m1\u001b[m\u001b[93m\u001b[107m\u001b[6Cm /tmp/busybox-archive\u001b[32;32H\u001b[K\u001b[33;3H\u001b[96m\u001b[47m2\u001b[m\u001b[93m\u001b[107m\u001b[5Crun ${KPOD_BINARY} $KPOD_OPTIONS rmi \u001b[36m\"$IMAGE\"\u001b[m\u001b[93m\u001b[107m\u001b[34;3H\u001b[96m\u001b[47m3\u001b[m\u001b[93m\u001b[107m\u001b[5C[ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\u001b[35;3H\u001b[96m\u001b[47m4\u001b[m\u001b[93m\u001b[107m\u001b[1C stop_crio\u001b[36;3H\u001b[96m\u001b[47m5\u001b[m\u001b[93m\u001b[107m\u001b[1C}\u001b[37;3H\u001b[96m\u001b[47m6\u001b[m\u001b[93m\u001b[107m\u001b[37;5H\u001b[K\u001b[38;3H\u001b[96m\u001b[47m7\u001b[m\u001b[93m\u001b[107m\u001b[1C@test \u001b[36m\"kpod push to oci without compression\"\u001b[m\u001b[93m\u001b[107m {\u001b[38;51H\u001b[K\u001b[39;3H\u001b[96m\u001b[47m8\u001b[m\u001b[93m\u001b[107m\u001b[5Crun ${KPOD_BINARY} $KPOD_OPTIONS pull \u001b[36m\"$IMAGE\"\u001b[m\u001b[93m\u001b[107m\u001b[40;2H\u001b" + ], + [ + 3e-05, + "[96m\u001b[47m59\u001b[m\u001b[93m\u001b[107m\u001b[5Cecho \u001b[36m\"$output\"\u001b[m\u001b[93m\u001b[107m\u001b[40;23H\u001b[K\u001b[41;3H\u001b[96m\u001b[47m0\u001b[m\u001b[93m\u001b[107m\u001b[5C[ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\u001b[41;28H\u001b[K\u001b[42;3H\u001b[96m\u001b[47m1\u001b[m\u001b[93m\u001b[107m\u001b[5Crun mkdir /tmp/oci-busybox\u001b[43;3H\u001b[96m\u001b[47m2\u001b[m\u001b[93m\u001b[107m\u001b[5Cecho \u001b[36m\"$output\"\u001b[m\u001b[93m\u001b[107m\u001b[43;23H\u001b[K\u001b[44;3H\u001b[96m\u001b[47m3\u001b[m\u001b[93m\u001b[107m\u001b[5C[ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\u001b[44;28H\u001b[K\u001b[45;3H\u001b[96m\u001b[47m4\u001b[m\u001b[93m\u001b[107m\u001b[5Crun ${KPOD_BINARY} $KPOD_OPTIONS push --disable-compression \u001b[36m\"$IMAGE\"\u001b[m\u001b[93m\u001b[107m oci:/tmp/oci-busybox\u001b[46;3H\u001b[96m\u001b[47m5\u001b[m\u001b[93m\u001b[107m\u001b[5Cecho \u001b[36m\"$output\"\u001b[m\u001b[93m\u001b[107m\u001b[46;23H\u001b[K\u001b[47;3H\u001b[96m\u001b[47m6\u001b[m\u001b[93m\u001b[107m\u001b[5C[ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\u001b[47;28H\u001b[K\u001b[48;3H\u001b[96m\u001b[47m7\u001b[m\u001b[93m\u001b[107m\u001b[6Cm -rf /tmp/oci-busybox\u001b[48;32H\u001b[K\u001b[49;3H\u001b[96m\u001b[47m8\u001b[m\u001b[93m\u001b[107m\u001b[5Crun ${KPOD_BINARY} $KPOD_OPTIONS rmi \u001b[36m\"$IMAGE\"\u001b[m\u001b[93m\u001b[107m\u001b[50;2H\u001b[96m\u001b[47m69\u001b[m\u001b[93m\u001b[107m\u001b[5C[ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\u001b[51;195H\u001b[38;5;107m\u001b[48;5;240m  26%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m" + ], + [ + 0.002097, + "\u001b[48;5;252m3\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[4;9H\u001b[?12l\u001b[?25h" + ], + [ + 0.206758, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[1;2H\u001b[96m\u001b[47m19\u001b[m\u001b[93m\u001b[107m\u001b[5Cecho \u001b[36m\"$output\"\u001b[m\u001b[93m\u001b[107m\u001b[1;23H\u001b[K\u001b[2;3H\u001b[96m\u001b[47m0\u001b[m\u001b[93m\u001b[107m\u001b[5C[ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\u001b[2;28H\u001b[K\u001b[3;3H\u001b[96m\u001b[47m1\u001b[m\u001b[93m\u001b[107m\u001b[5Crun ${KPOD_BINARY} $KPOD_OPTIONS rmi \u001b[36m\"$IMAGE\"\u001b[m\u001b[93m\u001b[107m\u001b[4;3H\u001b[96m\u001b[47m2\u001b[m\u001b[93m\u001b[107m\u001b[5C\u001b[1m\u001b[31m\u001b[106m[\u001b[m\u001b[93m\u001b[107m \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 \u001b[1m\u001b[31m\u001b[106m]\u001b[m\u001b[93m\u001b[107m\u001b[4;28H\u001b[K\u001b[5;3H\u001b[96m\u001b[47m3\u001b[m\u001b[93m\u001b[107m\u001b[5Crun ${OCIC_BINARY} image remove busybox:test\u001b[6;3H\u001b[96m\u001b[47m4\u001b[m\u001b[93m\u001b[107m\u001b[5C[ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\u001b[7;3H\u001b[96m\u001b[47m5\u001b[m\u001b[93m\u001b[107m\u001b[1C stop_crio\u001b[8;3H\u001b[96m\u001b[47m6\u001b[m\u001b[93m\u001b[107m\u001b[1C}\u001b[9;3H\u001b[96m\u001b[47m7\u001b[m\u001b[93m\u001b[107m\u001b[9;5H\u001b[K\u001b[10;3H\u001b[96m\u001b[47m8\u001b[m\u001b[93m\u001b[107m\u001b[1C@test \u001b[36m\"kpod push to directory\"\u001b[m\u001b[93m\u001b[107m {\u001b[10;37H\u001b[K\u001b[11;2H\u001b[96m\u001b[47m29\u001b[m\u001b[93m\u001b[107m\u001b[5Crun ${KPOD_BINARY} $KPOD_OPTIONS pull \u001b[36m\"$IMAGE\"\u001b[m\u001b[93m\u001b[107m\u001b[12;3H\u001b[96m\u001b[47m0\u001b[m\u001b[93m\u001b[107m\u001b[5Cecho \u001b[36m\"$output\"\u001b[m\u001b[93m\u001b[107m\u001b[12;23H\u001b[K\u001b[13;3H\u001b[96m\u001b[47m1\u001b[m\u001b[93m\u001b[107m\u001b[5C[ \u001b[36m\"$s" + ], + [ + 5.7e-05, + "tatus\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\u001b[13;28H\u001b[K\u001b[14;3H\u001b[96m\u001b[47m2\u001b[m\u001b[93m\u001b[107m\u001b[5Crun mkdir /tmp/busybox\u001b[15;3H\u001b[96m\u001b[47m3\u001b[m\u001b[93m\u001b[107m\u001b[5Cecho \u001b[36m\"$output\"\u001b[m\u001b[93m\u001b[107m\u001b[15;23H\u001b[K\u001b[16;3H\u001b[96m\u001b[47m4\u001b[m\u001b[93m\u001b[107m\u001b[5C[ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\u001b[16;28H\u001b[K\u001b[17;3H\u001b[96m\u001b[47m5\u001b[m\u001b[93m\u001b[107m\u001b[5Crun ${KPOD_BINARY} $KPOD_OPTIONS push \u001b[36m\"$IMAGE\"\u001b[m\u001b[93m\u001b[107m dir:/tmp/busybox\u001b[18;3H\u001b[96m\u001b[47m6\u001b[m\u001b[93m\u001b[107m\u001b[5Cecho \u001b[36m\"$output\"\u001b[m\u001b[93m\u001b[107m\u001b[18;23H\u001b[K\u001b[19;3H\u001b[96m\u001b[47m7\u001b[m\u001b[93m\u001b[107m\u001b[5C[ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\u001b[19;28H\u001b[K\u001b[20;3H\u001b[96m\u001b[47m8\u001b[m\u001b[93m\u001b[107m\u001b[5Crun ${KPOD_BINARY} $KPOD_OPTIONS rmi \u001b[36m\"$IMAGE\"\u001b[m\u001b[93m\u001b[107m\u001b[21;2H\u001b[96m\u001b[47m39\u001b[m\u001b[93m\u001b[107m\u001b[5C[ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\u001b[22;3H\u001b[96m\u001b[47m0\u001b[m\u001b[93m\u001b[107m\u001b[5Crm -rf /tmp/busybox\u001b[23;3H\u001b[96m\u001b[47m1\u001b[m\u001b[93m\u001b[107m\u001b[1C stop_crio\u001b[24;3H\u001b[96m\u001b[47m2\u001b[m\u001b[93m\u001b[107m\u001b[1C}\u001b[25;3H\u001b[96m\u001b[47m3\u001b[m\u001b[93m\u001b[107m\u001b[25;5H\u001b[K\u001b[26;3H\u001b[96m\u001b[47m4\u001b[m\u001b[93m\u001b[107m\u001b[1C@test \u001b[36m\"kpod push to docker archive\"\u001b[m\u001b[93m\u001b[107m {\u001b[26;42H\u001b[K" + ], + [ + 0.006686, + "\u001b[27;3H\u001b[96m\u001b[47m5\u001b[m\u001b[93m\u001b[107m\u001b[5Crun ${KPOD_BINARY} $KPOD_OPTIONS pull \u001b[36m\"$IMAGE\"\u001b[m\u001b[93m\u001b[107m\u001b[28;3H\u001b[96m\u001b[47m6\u001b[m\u001b[93m\u001b[107m\u001b[5Cecho \u001b[36m\"$output\"\u001b[m\u001b[93m\u001b[107m\u001b[28;23H\u001b[K\u001b[29;3H\u001b[96m\u001b[47m7\u001b[m\u001b[93m\u001b[107m\u001b[5C[ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\u001b[29;28H\u001b[K\u001b[30;3H\u001b[96m\u001b[47m8\u001b[m\u001b[93m\u001b[107m\u001b[5Crun ${KPOD_BINARY} $KPOD_OPTIONS push \u001b[36m\"$IMAGE\"\u001b[m\u001b[93m\u001b[107m docker-archive:/tmp/busybox-archive:1.26\u001b[31;2H\u001b[96m\u001b[47m49\u001b[m\u001b[93m\u001b[107m\u001b[5Cecho \u001b[36m\"$output\"\u001b[m\u001b[93m\u001b[107m\u001b[31;23H\u001b[K\u001b[32;3H\u001b[96m\u001b[47m0\u001b[m\u001b[93m\u001b[107m\u001b[5C[ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\u001b[32;28H\u001b[K\u001b[33;3H\u001b[96m\u001b[47m1\u001b[m\u001b[93m\u001b[107m\u001b[6Cm /tmp/busybox-archive\u001b[33;32H\u001b[K\u001b[34;3H\u001b[96m\u001b[47m2\u001b[m\u001b[93m\u001b[107m\u001b[5Crun ${KPOD_BINARY} $KPOD_OPTIONS rmi \u001b[36m\"$IMAGE\"\u001b[m\u001b[93m\u001b[107m\u001b[35;3H\u001b[96m\u001b[47m3\u001b[m\u001b[93m\u001b[107m\u001b[5C[ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\u001b[36;3H\u001b[96m\u001b[47m4\u001b[m\u001b[93m\u001b[107m\u001b[1C stop_crio\u001b[37;3H\u001b[96m\u001b[47m5\u001b[m\u001b[93m\u001b[107m\u001b[1C}\u001b[38;3H\u001b[96m\u001b[47m6\u001b[m\u001b[93m\u001b[107m\u001b[38;5H\u001b[K\u001b[39;3H\u001b[96m\u001b[47m7\u001b[m\u001b[93m\u001b[107m\u001b[1C@test \u001b[36m\"kpod push to oci without compre" + ], + [ + 0.000129, + "ssion\"\u001b[m\u001b[93m\u001b[107m {\u001b[39;51H\u001b[K\u001b[40;3H\u001b[96m\u001b[47m8\u001b[m\u001b[93m\u001b[107m\u001b[5Crun ${KPOD_BINARY} $KPOD_OPTIONS pull \u001b[36m\"$IMAGE\"\u001b[m\u001b[93m\u001b[107m\u001b[41;2H\u001b[96m\u001b[47m59\u001b[m\u001b[93m\u001b[107m\u001b[5Cecho \u001b[36m\"$output\"\u001b[m\u001b[93m\u001b[107m\u001b[41;23H\u001b[K\u001b[42;3H\u001b[96m\u001b[47m0\u001b[m\u001b[93m\u001b[107m\u001b[5C[ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\u001b[42;28H\u001b[K\u001b[43;3H\u001b[96m\u001b[47m1\u001b[m\u001b[93m\u001b[107m\u001b[5Crun mkdir /tmp/oci-busybox\u001b[44;3H\u001b[96m\u001b[47m2\u001b[m\u001b[93m\u001b[107m\u001b[5Cecho \u001b[36m\"$output\"\u001b[m\u001b[93m\u001b[107m\u001b[44;23H\u001b[K\u001b[45;3H\u001b[96m\u001b[47m3\u001b[m\u001b[93m\u001b[107m\u001b[5C[ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\u001b[45;28H\u001b[K\u001b[46;3H\u001b[96m\u001b[47m4\u001b[m\u001b[93m\u001b[107m\u001b[5Crun ${KPOD_BINARY} $KPOD_OPTIONS push --disable-compression \u001b[36m\"$IMAGE\"\u001b[m\u001b[93m\u001b[107m oci:/tmp/oci-busybox\u001b[47;3H\u001b[96m\u001b[47m5\u001b[m\u001b[93m\u001b[107m\u001b[5Cecho \u001b[36m\"$output\"\u001b[m\u001b[93m\u001b[107m\u001b[47;23H\u001b[K\u001b[48;3H\u001b[96m\u001b[47m6\u001b[m\u001b[93m\u001b[107m\u001b[5C[ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\u001b[48;28H\u001b[K\u001b[49;3H\u001b[96m\u001b[47m7\u001b[m\u001b[93m\u001b[107m\u001b[6Cm -rf /tmp/oci-busybox\u001b[49;32H\u001b[K\u001b[50;3H\u001b[96m\u001b[47m8\u001b[m\u001b[93m\u001b[107m\u001b[5Crun ${KPOD_BINARY} $KPOD_OPTIONS rmi \u001b[36m\"$IMAGE\"\u001b[m\u001b[93m\u001b[107m" + ], + [ + 0.006076, + "\u001b[51;195H\u001b[38;5;70m\u001b[48;5;240m  25%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m2\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[4;9H\u001b[?12l\u001b[?25h" + ], + [ + 0.163845, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[1;3H\u001b[96m\u001b[47m8\u001b[m\u001b[93m\u001b[107m\u001b[5Crun ${KPOD_BINARY} $KPOD_OPTIONS push \u001b[36m\"$IMAGE\"\u001b[m\u001b[93m\u001b[107m containers-storage:[$ROOT]busybox:test\u001b[2;2H\u001b[96m\u001b[47m19\u001b[m\u001b[93m\u001b[107m\u001b[5Cecho \u001b[36m\"$output\"\u001b[m\u001b[93m\u001b[107m\u001b[2;23H\u001b[K\u001b[3;3H\u001b[96m\u001b[47m0\u001b[m\u001b[93m\u001b[107m\u001b[5C[ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\u001b[3;28H\u001b[K\u001b[4;3H\u001b[96m\u001b[47m1\u001b[m\u001b[93m\u001b[107m\u001b[5Crun ${KPOD_BINARY} $KPOD_OPTIONS rmi \u001b[36m\"$IMAGE\"\u001b[m\u001b[93m\u001b[107m\u001b[5;3H\u001b[96m\u001b[47m2\u001b[m\u001b[93m\u001b[107m\u001b[5C[ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\u001b[5;28H\u001b[K\u001b[6;3H\u001b[96m\u001b[47m3\u001b[m\u001b[93m\u001b[107m\u001b[5Crun ${OCIC_BINARY} image remove busybox:test\u001b[7;3H\u001b[96m\u001b[47m4\u001b[m\u001b[93m\u001b[107m\u001b[5C[ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\u001b[8;3H\u001b[96m\u001b[47m5\u001b[m\u001b[93m\u001b[107m\u001b[1C stop_crio\u001b[9;3H\u001b[96m\u001b[47m6\u001b[m\u001b[93m\u001b[107m\u001b[1C}\u001b[10;3H\u001b[96m\u001b[47m7\u001b[m\u001b[93m\u001b[107m\u001b[10;5H\u001b[K\u001b[11;3H\u001b[96m\u001b[47m8\u001b[m\u001b[93m\u001b[107m\u001b[1C@test \u001b[36m\"kpod push to directory\"\u001b[m\u001b[93m\u001b[107m {\u001b[11;37H\u001b[K\u001b[12;2H\u001b[96m\u001b[47m29\u001b[m\u001b[93m\u001b[107m\u001b[5Crun ${KPOD_BINARY} $KPOD_OPTIONS pull \u001b[36m\"$IMAGE\"\u001b[m\u001b[93m\u001b[107m\u001b[13;3H\u001b[96m\u001b[47m0\u001b[m\u001b[93m\u001b[107m\u001b[5Cecho \u001b[" + ], + [ + 8.3e-05, + "36m\"$output\"\u001b[m\u001b[93m\u001b[107m\u001b[13;23H\u001b[K\u001b[14;3H\u001b[96m\u001b[47m1\u001b[m\u001b[93m\u001b[107m\u001b[5C[ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\u001b[14;28H\u001b[K\u001b[15;3H\u001b[96m\u001b[47m2\u001b[m\u001b[93m\u001b[107m\u001b[5Crun mkdir /tmp/busybox\u001b[16;3H\u001b[96m\u001b[47m3\u001b[m\u001b[93m\u001b[107m\u001b[5Cecho \u001b[36m\"$output\"\u001b[m\u001b[93m\u001b[107m\u001b[16;23H\u001b[K\u001b[17;3H\u001b[96m\u001b[47m4\u001b[m\u001b[93m\u001b[107m\u001b[5C[ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\u001b[17;28H\u001b[K\u001b[18;3H\u001b[96m\u001b[47m5\u001b[m\u001b[93m\u001b[107m\u001b[5Crun ${KPOD_BINARY} $KPOD_OPTIONS push \u001b[36m\"$IMAGE\"\u001b[m\u001b[93m\u001b[107m dir:/tmp/busybox\u001b[19;3H\u001b[96m\u001b[47m6\u001b[m\u001b[93m\u001b[107m\u001b[5Cecho \u001b[36m\"$output\"\u001b[m\u001b[93m\u001b[107m\u001b[19;23H\u001b[K\u001b[20;3H\u001b[96m\u001b[47m7\u001b[m\u001b[93m\u001b[107m\u001b[5C[ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\u001b[20;28H\u001b[K\u001b[21;3H\u001b[96m\u001b[47m8\u001b[m\u001b[93m\u001b[107m\u001b[5Crun ${KPOD_BINARY} $KPOD_OPTIONS rmi \u001b[36m\"$IMAGE\"\u001b[m\u001b[93m\u001b[107m\u001b[22;2H\u001b[96m\u001b[47m39\u001b[m\u001b[93m\u001b[107m\u001b[5C[ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\u001b[23;3H\u001b[96m\u001b[47m0\u001b[m\u001b[93m\u001b[107m\u001b[5Crm -rf /tmp/busybox\u001b[24;3H\u001b[96m\u001b[47m1\u001b[m\u001b[93m\u001b[107m\u001b[1C stop_crio\u001b[25;3H\u001b[96m\u001b[47m2\u001b[m\u001b[93m\u001b[107m\u001b[1C}\u001b[26;3H\u001b[96m\u001b[47m3\u001b[m\u001b[93m\u001b[107m\u001b[26;5H\u001b[K\u001b[27;3H\u001b[96m\u001b[47m4" + ], + [ + 0.007793, + "\u001b[m\u001b[93m\u001b[107m\u001b[1C@test \u001b[36m\"kpod push to docker archive\"\u001b[m\u001b[93m\u001b[107m {\u001b[27;42H\u001b[K\u001b[28;3H\u001b[96m\u001b[47m5\u001b[m\u001b[93m\u001b[107m\u001b[5Crun ${KPOD_BINARY} $KPOD_OPTIONS pull \u001b[36m\"$IMAGE\"\u001b[m\u001b[93m\u001b[107m\u001b[29;3H\u001b[96m\u001b[47m6\u001b[m\u001b[93m\u001b[107m\u001b[5Cecho \u001b[36m\"$output\"\u001b[m\u001b[93m\u001b[107m\u001b[29;23H\u001b[K\u001b[30;3H\u001b[96m\u001b[47m7\u001b[m\u001b[93m\u001b[107m\u001b[5C[ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\u001b[30;28H\u001b[K\u001b[31;3H\u001b[96m\u001b[47m8\u001b[m\u001b[93m\u001b[107m\u001b[5Crun ${KPOD_BINARY} $KPOD_OPTIONS push \u001b[36m\"$IMAGE\"\u001b[m\u001b[93m\u001b[107m docker-archive:/tmp/busybox-archive:1.26\u001b[32;2H\u001b[96m\u001b[47m49\u001b[m\u001b[93m\u001b[107m\u001b[5Cecho \u001b[36m\"$output\"\u001b[m\u001b[93m\u001b[107m\u001b[32;23H\u001b[K\u001b[33;3H\u001b[96m\u001b[47m0\u001b[m\u001b[93m\u001b[107m\u001b[5C[ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\u001b[33;28H\u001b[K\u001b[34;3H\u001b[96m\u001b[47m1\u001b[m\u001b[93m\u001b[107m\u001b[6Cm /tmp/busybox-archive\u001b[34;32H\u001b[K\u001b[35;3H\u001b[96m\u001b[47m2\u001b[m\u001b[93m\u001b[107m\u001b[5Crun ${KPOD_BINARY} $KPOD_OPTIONS rmi \u001b[36m\"$IMAGE\"\u001b[m\u001b[93m\u001b[107m\u001b[36;3H\u001b[96m\u001b[47m3\u001b[m\u001b[93m\u001b[107m\u001b[5C[ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\u001b[37;3H\u001b[96m\u001b[47m4\u001b[m\u001b[93m\u001b[107m\u001b[1C stop_crio\u001b[38;3H\u001b[96m\u001b[47m5\u001b[m\u001b[93m\u001b[107m\u001b[1C}\u001b[39;3H\u001b[96m\u001b[47m6\u001b[m\u001b[93m\u001b[107m\u001b[39" + ], + [ + 3.1e-05, + ";5H\u001b[K\u001b[40;3H\u001b[96m\u001b[47m7\u001b[m\u001b[93m\u001b[107m\u001b[1C@test \u001b[36m\"kpod push to oci without compression\"\u001b[m\u001b[93m\u001b[107m {\u001b[40;51H\u001b[K\u001b[41;3H\u001b[96m\u001b[47m8\u001b[m\u001b[93m\u001b[107m\u001b[5Crun ${KPOD_BINARY} $KPOD_OPTIONS pull \u001b[36m\"$IMAGE\"\u001b[m\u001b[93m\u001b[107m\u001b[42;2H\u001b[96m\u001b[47m59\u001b[m\u001b[93m\u001b[107m\u001b[5Cecho \u001b[36m\"$output\"\u001b[m\u001b[93m\u001b[107m\u001b[42;23H\u001b[K\u001b[43;3H\u001b[96m\u001b[47m0\u001b[m\u001b[93m\u001b[107m\u001b[5C[ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\u001b[43;28H\u001b[K\u001b[44;3H\u001b[96m\u001b[47m1\u001b[m\u001b[93m\u001b[107m\u001b[5Crun mkdir /tmp/oci-busybox\u001b[45;3H\u001b[96m\u001b[47m2\u001b[m\u001b[93m\u001b[107m\u001b[5Cecho \u001b[36m\"$output\"\u001b[m\u001b[93m\u001b[107m\u001b[45;23H\u001b[K\u001b[46;3H\u001b[96m\u001b[47m3\u001b[m\u001b[93m\u001b[107m\u001b[5C[ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\u001b[46;28H\u001b[K\u001b[47;3H\u001b[96m\u001b[47m4\u001b[m\u001b[93m\u001b[107m\u001b[5Crun ${KPOD_BINARY} $KPOD_OPTIONS push --disable-compression \u001b[36m\"$IMAGE\"\u001b[m\u001b[93m\u001b[107m oci:/tmp/oci-busybox\u001b[48;3H\u001b[96m\u001b[47m5\u001b[m\u001b[93m\u001b[107m\u001b[5Cecho \u001b[36m\"$output\"\u001b[m\u001b[93m\u001b[107m\u001b[48;23H\u001b[K\u001b[49;3H\u001b[96m\u001b[47m6\u001b[m\u001b[93m\u001b[107m\u001b[5C[ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\u001b[49;28H\u001b[K\u001b[50;3H\u001b[96m\u001b[47m7\u001b[m\u001b[93m\u001b[107m\u001b[6Cm -rf /tmp/oci-busybox\u001b[50;32H\u001b[K\u001b[51;195H\u001b[38;5;70m" + ], + [ + 0.002123, + "\u001b[48;5;240m  24%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m1\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[4;9H\u001b[?12l\u001b[?25h" + ], + [ + 0.19883, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[1;3H\u001b[96m\u001b[47m7\u001b[m\u001b[93m\u001b[107m\u001b[5C[ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\u001b[1;28H\u001b[K\u001b[2;3H\u001b[96m\u001b[47m8\u001b[m\u001b[93m\u001b[107m\u001b[5Crun ${KPOD_BINARY} $KPOD_OPTIONS push \u001b[36m\"$IMAGE\"\u001b[m\u001b[93m\u001b[107m containers-storage:[$ROOT]busybox:test\u001b[3;2H\u001b[96m\u001b[47m19\u001b[m\u001b[93m\u001b[107m\u001b[5Cecho \u001b[36m\"$output\"\u001b[m\u001b[93m\u001b[107m\u001b[3;23H\u001b[K\u001b[4;3H\u001b[96m\u001b[47m0\u001b[m\u001b[93m\u001b[107m\u001b[5C\u001b[1m\u001b[31m\u001b[106m[\u001b[m\u001b[93m\u001b[107m \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 \u001b[1m\u001b[31m\u001b[106m]\u001b[m\u001b[93m\u001b[107m\u001b[4;28H\u001b[K\u001b[5;3H\u001b[96m\u001b[47m1\u001b[m\u001b[93m\u001b[107m\u001b[5Crun ${KPOD_BINARY} $KPOD_OPTIONS rmi \u001b[36m\"$IMAGE\"\u001b[m\u001b[93m\u001b[107m\u001b[6;3H\u001b[96m\u001b[47m2\u001b[m\u001b[93m\u001b[107m\u001b[5C[ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\u001b[6;28H\u001b[K\u001b[7;3H\u001b[96m\u001b[47m3\u001b[m\u001b[93m\u001b[107m\u001b[5Crun ${OCIC_BINARY} image remove busybox:test\u001b[8;3H\u001b[96m\u001b[47m4\u001b[m\u001b[93m\u001b[107m\u001b[5C[ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\u001b[9;3H\u001b[96m\u001b[47m5\u001b[m\u001b[93m\u001b[107m\u001b[1C stop_crio\u001b[10;3H\u001b[96m\u001b[47m6\u001b[m\u001b[93m\u001b[107m\u001b[1C}\u001b[11;3H\u001b[96m\u001b[47m7\u001b[m\u001b[93m\u001b[107m\u001b[11;5H\u001b[K\u001b[12;3H\u001b[96m\u001b[47m8\u001b[m\u001b[93m\u001b[107m\u001b[1C@test \u001b[36m\"kpod push to directory\"\u001b[m\u001b[93m\u001b[107m {\u001b[12;37H\u001b[K\u001b[1" + ], + [ + 0.000124, + "3;2H\u001b[96m\u001b[47m29\u001b[m\u001b[93m\u001b[107m\u001b[5Crun ${KPOD_BINARY} $KPOD_OPTIONS pull \u001b[36m\"$IMAGE\"\u001b[m\u001b[93m\u001b[107m\u001b[14;3H\u001b[96m\u001b[47m0\u001b[m\u001b[93m\u001b[107m\u001b[5Cecho \u001b[36m\"$output\"\u001b[m\u001b[93m\u001b[107m\u001b[14;23H\u001b[K\u001b[15;3H\u001b[96m\u001b[47m1\u001b[m\u001b[93m\u001b[107m\u001b[5C[ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\u001b[15;28H\u001b[K\u001b[16;3H\u001b[96m\u001b[47m2\u001b[m\u001b[93m\u001b[107m\u001b[5Crun mkdir /tmp/busybox\u001b[17;3H\u001b[96m\u001b[47m3\u001b[m\u001b[93m\u001b[107m\u001b[5Cecho \u001b[36m\"$output\"\u001b[m\u001b[93m\u001b[107m\u001b[17;23H\u001b[K\u001b[18;3H\u001b[96m\u001b[47m4\u001b[m\u001b[93m\u001b[107m\u001b[5C[ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\u001b[18;28H\u001b[K\u001b[19;3H\u001b[96m\u001b[47m5\u001b[m\u001b[93m\u001b[107m\u001b[5Crun ${KPOD_BINARY} $KPOD_OPTIONS push \u001b[36m\"$IMAGE\"\u001b[m\u001b[93m\u001b[107m dir:/tmp/busybox\u001b[20;3H\u001b[96m\u001b[47m6\u001b[m\u001b[93m\u001b[107m\u001b[5Cecho \u001b[36m\"$output\"\u001b[m\u001b[93m\u001b[107m\u001b[20;23H\u001b[K\u001b[21;3H\u001b[96m\u001b[47m7\u001b[m\u001b[93m\u001b[107m\u001b[5C[ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\u001b[21;28H\u001b[K\u001b[22;3H\u001b[96m\u001b[47m8\u001b[m\u001b[93m\u001b[107m\u001b[5Crun ${KPOD_BINARY} $KPOD_OPTIONS rmi \u001b[36m\"$IMAGE\"\u001b[m\u001b[93m\u001b[107m\u001b[23;2H\u001b[96m\u001b[47m39\u001b[m\u001b[93m\u001b[107m\u001b[5C[ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\u001b[24;3H\u001b[96m\u001b[47m0\u001b[m\u001b[93m\u001b[107m\u001b[5Crm -rf /tmp/busybox\u001b[25;3H" + ], + [ + 0.001207, + "\u001b[96m\u001b[47m1\u001b[m\u001b[93m\u001b[107m\u001b[1C stop_crio\u001b[26;3H\u001b[96m\u001b[47m2\u001b[m\u001b[93m\u001b[107m\u001b[1C}\u001b[27;3H\u001b[96m\u001b[47m3\u001b[m\u001b[93m\u001b[107m\u001b[27;5H\u001b[K\u001b[28;3H\u001b[96m\u001b[47m4\u001b[m\u001b[93m\u001b[107m\u001b[1C@test \u001b[36m\"kpod push to docker archive\"\u001b[m\u001b[93m\u001b[107m {\u001b[28;42H\u001b[K\u001b[29;3H\u001b[96m\u001b[47m5\u001b[m\u001b[93m\u001b[107m\u001b[5Crun ${KPOD_BINARY} $KPOD_OPTIONS pull \u001b[36m\"$IMAGE\"\u001b[m\u001b[93m\u001b[107m\u001b[30;3H\u001b[96m\u001b[47m6\u001b[m\u001b[93m\u001b[107m\u001b[5Cecho \u001b[36m\"$output\"\u001b[m\u001b[93m\u001b[107m\u001b[30;23H\u001b[K\u001b[31;3H\u001b[96m\u001b[47m7\u001b[m\u001b[93m\u001b[107m\u001b[5C[ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\u001b[31;28H\u001b[K\u001b[32;3H\u001b[96m\u001b[47m8\u001b[m\u001b[93m\u001b[107m\u001b[5Crun ${KPOD_BINARY} $KPOD_OPTIONS push \u001b[36m\"$IMAGE\"\u001b[m\u001b[93m\u001b[107m docker-archive:/tmp/busybox-archive:1.26\u001b[33;2H\u001b[96m\u001b[47m49\u001b[m\u001b[93m\u001b[107m\u001b[5Cecho \u001b[36m\"$output\"\u001b[m\u001b[93m\u001b[107m\u001b[33;23H\u001b[K\u001b[34;3H\u001b[96m\u001b[47m0\u001b[m\u001b[93m\u001b[107m\u001b[5C[ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\u001b[34;28H\u001b[K\u001b[35;3H\u001b[96m\u001b[47m1\u001b[m\u001b[93m\u001b[107m\u001b[6Cm /tmp/busybox-archive\u001b[35;32H\u001b[K\u001b[36;3H\u001b[96m\u001b[47m2\u001b[m\u001b[93m\u001b[107m\u001b[5Crun ${KPOD_BINARY} $KPOD_OPTIONS rmi \u001b[36m\"$IMAGE\"\u001b[m\u001b[93m\u001b[107m\u001b[37;3H\u001b[96m\u001b[47m3\u001b[m\u001b[93m\u001b[107m\u001b[5C[ \u001b[36m\"$status\"\u001b[m\u001b[" + ], + [ + 0.000194, + "93m\u001b[107m -eq 0 ]\u001b[38;3H\u001b[96m\u001b[47m4\u001b[m\u001b[93m\u001b[107m\u001b[1C stop_crio\u001b[39;3H\u001b[96m\u001b[47m5\u001b[m\u001b[93m\u001b[107m\u001b[1C}\u001b[40;3H\u001b[96m\u001b[47m6\u001b[m\u001b[93m\u001b[107m\u001b[40;5H\u001b[K\u001b[41;3H\u001b[96m\u001b[47m7\u001b[m\u001b[93m\u001b[107m\u001b[1C@test \u001b[36m\"kpod push to oci without compression\"\u001b[m\u001b[93m\u001b[107m {\u001b[41;51H\u001b[K\u001b[42;3H\u001b[96m\u001b[47m8\u001b[m\u001b[93m\u001b[107m\u001b[5Crun ${KPOD_BINARY} $KPOD_OPTIONS pull \u001b[36m\"$IMAGE\"\u001b[m\u001b[93m\u001b[107m\u001b[43;2H\u001b[96m\u001b[47m59\u001b[m\u001b[93m\u001b[107m\u001b[5Cecho \u001b[36m\"$output\"\u001b[m\u001b[93m\u001b[107m\u001b[43;23H\u001b[K\u001b[44;3H\u001b[96m\u001b[47m0\u001b[m\u001b[93m\u001b[107m\u001b[5C[ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\u001b[44;28H\u001b[K\u001b[45;3H\u001b[96m\u001b[47m1\u001b[m\u001b[93m\u001b[107m\u001b[5Crun mkdir /tmp/oci-busybox\u001b[46;3H\u001b[96m\u001b[47m2\u001b[m\u001b[93m\u001b[107m\u001b[5Cecho \u001b[36m\"$output\"\u001b[m\u001b[93m\u001b[107m\u001b[46;23H\u001b[K\u001b[47;3H\u001b[96m\u001b[47m3\u001b[m\u001b[93m\u001b[107m\u001b[5C[ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\u001b[47;28H\u001b[K\u001b[48;3H\u001b[96m\u001b[47m4\u001b[m\u001b[93m\u001b[107m\u001b[5Crun ${KPOD_BINARY} $KPOD_OPTIONS push --disable-compression \u001b[36m\"$IMAGE\"\u001b[m\u001b[93m\u001b[107m oci:/tmp/oci-busybox\u001b[49;3H\u001b[96m\u001b[47m5\u001b[m\u001b[93m\u001b[107m\u001b[5Cecho \u001b[36m\"$output\"\u001b[m\u001b[93m\u001b[107m\u001b[49;23H\u001b[K\u001b[50;3H\u001b[96m\u001b[47m6\u001b[m\u001b[93m\u001b[107m" + ], + [ + 0.007907, + "\u001b[5C[ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\u001b[50;28H\u001b[K\u001b[51;195H\u001b[38;5;70m\u001b[48;5;240m  23%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m0\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[4;9H\u001b[?12l\u001b[?25h" + ], + [ + 0.157382, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[1;3H\u001b[96m\u001b[47m6\u001b[m\u001b[93m\u001b[107m\u001b[5Cecho \u001b[36m\"$output\"\u001b[m\u001b[93m\u001b[107m\u001b[1;23H\u001b[K\u001b[2;3H\u001b[96m\u001b[47m7\u001b[m\u001b[93m\u001b[107m\u001b[5C[ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\u001b[2;28H\u001b[K\u001b[3;3H\u001b[96m\u001b[47m8\u001b[m\u001b[93m\u001b[107m\u001b[5Crun ${KPOD_BINARY} $KPOD_OPTIONS push \u001b[36m\"$IMAGE\"\u001b[m\u001b[93m\u001b[107m containers-storage:[$ROOT]busybox:test\u001b[4;2H\u001b[96m\u001b[47m19\u001b[m\u001b[93m\u001b[107m\u001b[5Cecho \u001b[36m\"$output\"\u001b[m\u001b[93m\u001b[107m\u001b[4;23H\u001b[K\u001b[5;3H\u001b[96m\u001b[47m0\u001b[m\u001b[93m\u001b[107m\u001b[5C[ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\u001b[5;28H\u001b[K\u001b[6;3H\u001b[96m\u001b[47m1\u001b[m\u001b[93m\u001b[107m\u001b[5Crun ${KPOD_BINARY} $KPOD_OPTIONS rmi \u001b[36m\"$IMAGE\"\u001b[m\u001b[93m\u001b[107m\u001b[7;3H\u001b[96m\u001b[47m2\u001b[m\u001b[93m\u001b[107m\u001b[5C[ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\u001b[7;28H\u001b[K\u001b[8;3H\u001b[96m\u001b[47m3\u001b[m\u001b[93m\u001b[107m\u001b[5Crun ${OCIC_BINARY} image remove busybox:test\u001b[9;3H\u001b[96m\u001b[47m4\u001b[m\u001b[93m\u001b[107m\u001b[5C[ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\u001b[10;3H\u001b[96m\u001b[47m5\u001b[m\u001b[93m\u001b[107m\u001b[1C stop_crio\u001b[11;3H\u001b[96m\u001b[47m6\u001b[m\u001b[93m\u001b[107m\u001b[1C}\u001b[12;3H\u001b[96m\u001b[47m7\u001b[m\u001b[93m\u001b[107m\u001b[12;5H\u001b[K\u001b[13;3H\u001b[96m\u001b[47m8\u001b[m\u001b[93m\u001b[107m\u001b[1C@test \u001b[36m\"kpod push to directory\"\u001b[m\u001b[93m\u001b" + ], + [ + 7.7e-05, + "[107m {\u001b[13;37H\u001b[K\u001b[14;2H\u001b[96m\u001b[47m29\u001b[m\u001b[93m\u001b[107m\u001b[5Crun ${KPOD_BINARY} $KPOD_OPTIONS pull \u001b[36m\"$IMAGE\"\u001b[m\u001b[93m\u001b[107m\u001b[15;3H\u001b[96m\u001b[47m0\u001b[m\u001b[93m\u001b[107m\u001b[5Cecho \u001b[36m\"$output\"\u001b[m\u001b[93m\u001b[107m\u001b[15;23H\u001b[K\u001b[16;3H\u001b[96m\u001b[47m1\u001b[m\u001b[93m\u001b[107m\u001b[5C[ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\u001b[16;28H\u001b[K\u001b[17;3H\u001b[96m\u001b[47m2\u001b[m\u001b[93m\u001b[107m\u001b[5Crun mkdir /tmp/busybox\u001b[18;3H\u001b[96m\u001b[47m3\u001b[m\u001b[93m\u001b[107m\u001b[5Cecho \u001b[36m\"$output\"\u001b[m\u001b[93m\u001b[107m\u001b[18;23H\u001b[K\u001b[19;3H\u001b[96m\u001b[47m4\u001b[m\u001b[93m\u001b[107m\u001b[5C[ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\u001b[19;28H\u001b[K\u001b[20;3H\u001b[96m\u001b[47m5\u001b[m\u001b[93m\u001b[107m\u001b[5Crun ${KPOD_BINARY} $KPOD_OPTIONS push \u001b[36m\"$IMAGE\"\u001b[m\u001b[93m\u001b[107m dir:/tmp/busybox\u001b[21;3H\u001b[96m\u001b[47m6\u001b[m\u001b[93m\u001b[107m\u001b[5Cecho \u001b[36m\"$output\"\u001b[m\u001b[93m\u001b[107m\u001b[21;23H\u001b[K\u001b[22;3H\u001b[96m\u001b[47m7\u001b[m\u001b[93m\u001b[107m\u001b[5C[ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\u001b[22;28H\u001b[K\u001b[23;3H\u001b[96m\u001b[47m8\u001b[m\u001b[93m\u001b[107m\u001b[5Crun ${KPOD_BINARY} $KPOD_OPTIONS rmi \u001b[36m\"$IMAGE\"\u001b[m\u001b[93m\u001b[107m\u001b[24;2H\u001b[96m\u001b[47m39\u001b[m\u001b[93m\u001b[107m\u001b[5C[ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\u001b[25;3H\u001b[96m\u001b[47m0\u001b[m\u001b[93m\u001b[107m\u001b[5Crm -rf /tmp/busybox" + ], + [ + 0.004633, + "\u001b[26;3H\u001b[96m\u001b[47m1\u001b[m\u001b[93m\u001b[107m\u001b[1C stop_crio\u001b[27;3H\u001b[96m\u001b[47m2\u001b[m\u001b[93m\u001b[107m\u001b[1C}\u001b[28;3H\u001b[96m\u001b[47m3\u001b[m\u001b[93m\u001b[107m\u001b[28;5H\u001b[K\u001b[29;3H\u001b[96m\u001b[47m4\u001b[m\u001b[93m\u001b[107m\u001b[1C@test \u001b[36m\"kpod push to docker archive\"\u001b[m\u001b[93m\u001b[107m {\u001b[29;42H\u001b[K\u001b[30;3H\u001b[96m\u001b[47m5\u001b[m\u001b[93m\u001b[107m\u001b[5Crun ${KPOD_BINARY} $KPOD_OPTIONS pull \u001b[36m\"$IMAGE\"\u001b[m\u001b[93m\u001b[107m\u001b[31;3H\u001b[96m\u001b[47m6\u001b[m\u001b[93m\u001b[107m\u001b[5Cecho \u001b[36m\"$output\"\u001b[m\u001b[93m\u001b[107m\u001b[31;23H\u001b[K\u001b[32;3H\u001b[96m\u001b[47m7\u001b[m\u001b[93m\u001b[107m\u001b[5C[ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\u001b[32;28H\u001b[K\u001b[33;3H\u001b[96m\u001b[47m8\u001b[m\u001b[93m\u001b[107m\u001b[5Crun ${KPOD_BINARY} $KPOD_OPTIONS push \u001b[36m\"$IMAGE\"\u001b[m\u001b[93m\u001b[107m docker-archive:/tmp/busybox-archive:1.26\u001b[34;2H\u001b[96m\u001b[47m49\u001b[m\u001b[93m\u001b[107m\u001b[5Cecho \u001b[36m\"$output\"\u001b[m\u001b[93m\u001b[107m\u001b[34;23H\u001b[K\u001b[35;3H\u001b[96m\u001b[47m0\u001b[m\u001b[93m\u001b[107m\u001b[5C[ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\u001b[35;28H\u001b[K\u001b[36;3H\u001b[96m\u001b[47m1\u001b[m\u001b[93m\u001b[107m\u001b[6Cm /tmp/busybox-archive\u001b[36;32H\u001b[K\u001b[37;3H\u001b[96m\u001b[47m2\u001b[m\u001b[93m\u001b[107m\u001b[5Crun ${KPOD_BINARY} $KPOD_OPTIONS rmi \u001b[36m\"$IMAGE\"\u001b[m\u001b[93m\u001b[107m\u001b[38;3H\u001b[96m\u001b[47m3\u001b[m\u001b[93m\u001b[107m\u001b[5C[ \u001b[36m\"$statu" + ], + [ + 2.3e-05, + "s\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\u001b[39;3H\u001b[96m\u001b[47m4\u001b[m\u001b[93m\u001b[107m\u001b[1C stop_crio\u001b[40;3H\u001b[96m\u001b[47m5\u001b[m\u001b[93m\u001b[107m\u001b[1C}\u001b[41;3H\u001b[96m\u001b[47m6\u001b[m\u001b[93m\u001b[107m\u001b[41;5H\u001b[K\u001b[42;3H\u001b[96m\u001b[47m7\u001b[m\u001b[93m\u001b[107m\u001b[1C@test \u001b[36m\"kpod push to oci without compression\"\u001b[m\u001b[93m\u001b[107m {\u001b[42;51H\u001b[K\u001b[43;3H\u001b[96m\u001b[47m8\u001b[m\u001b[93m\u001b[107m\u001b[5Crun ${KPOD_BINARY} $KPOD_OPTIONS pull \u001b[36m\"$IMAGE\"\u001b[m\u001b[93m\u001b[107m\u001b[44;2H\u001b[96m\u001b[47m59\u001b[m\u001b[93m\u001b[107m\u001b[5Cecho \u001b[36m\"$output\"\u001b[m\u001b[93m\u001b[107m\u001b[44;23H\u001b[K\u001b[45;3H\u001b[96m\u001b[47m0\u001b[m\u001b[93m\u001b[107m\u001b[5C[ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\u001b[45;28H\u001b[K\u001b[46;3H\u001b[96m\u001b[47m1\u001b[m\u001b[93m\u001b[107m\u001b[5Crun mkdir /tmp/oci-busybox\u001b[47;3H\u001b[96m\u001b[47m2\u001b[m\u001b[93m\u001b[107m\u001b[5Cecho \u001b[36m\"$output\"\u001b[m\u001b[93m\u001b[107m\u001b[47;23H\u001b[K\u001b[48;3H\u001b[96m\u001b[47m3\u001b[m\u001b[93m\u001b[107m\u001b[5C[ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\u001b[48;28H\u001b[K\u001b[49;3H\u001b[96m\u001b[47m4\u001b[m\u001b[93m\u001b[107m\u001b[5Crun ${KPOD_BINARY} $KPOD_OPTIONS push --disable-compression \u001b[36m\"$IMAGE\"\u001b[m\u001b[93m\u001b[107m oci:/tmp/oci-busybox\u001b[50;3H\u001b[96m\u001b[47m5\u001b[m\u001b[93m\u001b[107m\u001b[5Cecho \u001b[36m\"$output\"\u001b[m\u001b[93m\u001b[107m\u001b[50;23H\u001b[K\u001b[51;195H\u001b[38;5;70m\u001b[48;5;240m" + ], + [ + 0.002017, + "  22%\u001b[m\u001b[93m\u001b[107m\u001b[6C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m19\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[4;9H\u001b[?12l\u001b[?25h" + ], + [ + 0.216601, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[1;3H\u001b[96m\u001b[47m5\u001b[m\u001b[93m\u001b[107m\u001b[5Crun ${KPOD_BINARY} $KPOD_OPTIONS pull \u001b[36m\"$IMAGE\"\u001b[m\u001b[93m\u001b[107m\u001b[2;3H\u001b[96m\u001b[47m6\u001b[m\u001b[93m\u001b[107m\u001b[5Cecho \u001b[36m\"$output\"\u001b[m\u001b[93m\u001b[107m\u001b[2;23H\u001b[K\u001b[3;3H\u001b[96m\u001b[47m7\u001b[m\u001b[93m\u001b[107m\u001b[5C[ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\u001b[3;28H\u001b[K\u001b[4;3H\u001b[96m\u001b[47m8\u001b[m\u001b[93m\u001b[107m\u001b[5Crun ${KPOD_BINARY} $KPOD_OPTIONS push \u001b[36m\"$IMAGE\"\u001b[m\u001b[93m\u001b[107m containers-storage:[$ROOT]busybox:test\u001b[5;2H\u001b[96m\u001b[47m19\u001b[m\u001b[93m\u001b[107m\u001b[5Cecho \u001b[36m\"$output\"\u001b[m\u001b[93m\u001b[107m\u001b[5;23H\u001b[K\u001b[6;3H\u001b[96m\u001b[47m0\u001b[m\u001b[93m\u001b[107m\u001b[5C[ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\u001b[6;28H\u001b[K\u001b[7;3H\u001b[96m\u001b[47m1\u001b[m\u001b[93m\u001b[107m\u001b[5Crun ${KPOD_BINARY} $KPOD_OPTIONS rmi \u001b[36m\"$IMAGE\"\u001b[m\u001b[93m\u001b[107m\u001b[8;3H\u001b[96m\u001b[47m2\u001b[m\u001b[93m\u001b[107m\u001b[5C[ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\u001b[8;28H\u001b[K\u001b[9;3H\u001b[96m\u001b[47m3\u001b[m\u001b[93m\u001b[107m\u001b[5Crun ${OCIC_BINARY} image remove busybox:test\u001b[10;3H\u001b[96m\u001b[47m4\u001b[m\u001b[93m\u001b[107m\u001b[5C[ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\u001b[11;3H\u001b[96m\u001b[47m5\u001b[m\u001b[93m\u001b[107m\u001b[1C stop_crio\u001b[12;3H\u001b[96m\u001b[47m6\u001b[m\u001b[93m\u001b[107m\u001b[1C}\u001b[13;3H\u001b[96m\u001b[47m7\u001b[m" + ], + [ + 0.000101, + "\u001b[93m\u001b[107m\u001b[13;5H\u001b[K\u001b[14;3H\u001b[96m\u001b[47m8\u001b[m\u001b[93m\u001b[107m\u001b[1C@test \u001b[36m\"kpod push to directory\"\u001b[m\u001b[93m\u001b[107m {\u001b[14;37H\u001b[K\u001b[15;2H\u001b[96m\u001b[47m29\u001b[m\u001b[93m\u001b[107m\u001b[5Crun ${KPOD_BINARY} $KPOD_OPTIONS pull \u001b[36m\"$IMAGE\"\u001b[m\u001b[93m\u001b[107m\u001b[16;3H\u001b[96m\u001b[47m0\u001b[m\u001b[93m\u001b[107m\u001b[5Cecho \u001b[36m\"$output\"\u001b[m\u001b[93m\u001b[107m\u001b[16;23H\u001b[K\u001b[17;3H\u001b[96m\u001b[47m1\u001b[m\u001b[93m\u001b[107m\u001b[5C[ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\u001b[17;28H\u001b[K\u001b[18;3H\u001b[96m\u001b[47m2\u001b[m\u001b[93m\u001b[107m\u001b[5Crun mkdir /tmp/busybox\u001b[19;3H\u001b[96m\u001b[47m3\u001b[m\u001b[93m\u001b[107m\u001b[5Cecho \u001b[36m\"$output\"\u001b[m\u001b[93m\u001b[107m\u001b[19;23H\u001b[K\u001b[20;3H\u001b[96m\u001b[47m4\u001b[m\u001b[93m\u001b[107m\u001b[5C[ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\u001b[20;28H\u001b[K\u001b[21;3H\u001b[96m\u001b[47m5\u001b[m\u001b[93m\u001b[107m\u001b[5Crun ${KPOD_BINARY} $KPOD_OPTIONS push \u001b[36m\"$IMAGE\"\u001b[m\u001b[93m\u001b[107m dir:/tmp/busybox\u001b[22;3H\u001b[96m\u001b[47m6\u001b[m\u001b[93m\u001b[107m\u001b[5Cecho \u001b[36m\"$output\"\u001b[m\u001b[93m\u001b[107m\u001b[22;23H\u001b[K\u001b[23;3H\u001b[96m\u001b[47m7\u001b[m\u001b[93m\u001b[107m\u001b[5C[ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\u001b[23;28H\u001b[K\u001b[24;3H\u001b[96m\u001b[47m8\u001b[m\u001b[93m\u001b[107m\u001b[5Crun ${KPOD_BINARY} $KPOD_OPTIONS rmi \u001b[36m\"$IMAGE\"\u001b[m\u001b[93m\u001b[107m\u001b[25;2H\u001b[96m" + ], + [ + 0.00763, + "\u001b[47m39\u001b[m\u001b[93m\u001b[107m\u001b[5C[ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\u001b[26;3H\u001b[96m\u001b[47m0\u001b[m\u001b[93m\u001b[107m\u001b[5Crm -rf /tmp/busybox\u001b[27;3H\u001b[96m\u001b[47m1\u001b[m\u001b[93m\u001b[107m\u001b[1C stop_crio\u001b[28;3H\u001b[96m\u001b[47m2\u001b[m\u001b[93m\u001b[107m\u001b[1C}\u001b[29;3H\u001b[96m\u001b[47m3\u001b[m\u001b[93m\u001b[107m\u001b[29;5H\u001b[K\u001b[30;3H\u001b[96m\u001b[47m4\u001b[m\u001b[93m\u001b[107m\u001b[1C@test \u001b[36m\"kpod push to docker archive\"\u001b[m\u001b[93m\u001b[107m {\u001b[30;42H\u001b[K\u001b[31;3H\u001b[96m\u001b[47m5\u001b[m\u001b[93m\u001b[107m\u001b[5Crun ${KPOD_BINARY} $KPOD_OPTIONS pull \u001b[36m\"$IMAGE\"\u001b[m\u001b[93m\u001b[107m\u001b[32;3H\u001b[96m\u001b[47m6\u001b[m\u001b[93m\u001b[107m\u001b[5Cecho \u001b[36m\"$output\"\u001b[m\u001b[93m\u001b[107m\u001b[32;23H\u001b[K\u001b[33;3H\u001b[96m\u001b[47m7\u001b[m\u001b[93m\u001b[107m\u001b[5C[ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\u001b[33;28H\u001b[K\u001b[34;3H\u001b[96m\u001b[47m8\u001b[m\u001b[93m\u001b[107m\u001b[5Crun ${KPOD_BINARY} $KPOD_OPTIONS push \u001b[36m\"$IMAGE\"\u001b[m\u001b[93m\u001b[107m docker-archive:/tmp/busybox-archive:1.26\u001b[35;2H\u001b[96m\u001b[47m49\u001b[m\u001b[93m\u001b[107m\u001b[5Cecho \u001b[36m\"$output\"\u001b[m\u001b[93m\u001b[107m\u001b[35;23H\u001b[K\u001b[36;3H\u001b[96m\u001b[47m0\u001b[m\u001b[93m\u001b[107m\u001b[5C[ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\u001b[36;28H\u001b[K\u001b[37;3H\u001b[96m\u001b[47m1\u001b[m\u001b[93m\u001b[107m\u001b[6Cm /tmp/busybox-archive\u001b[37;32H\u001b[K\u001b[38;3H\u001b[96m\u001b[47m2\u001b[m\u001b[93m\u001b[107m" + ], + [ + 0.000247, + "\u001b[5Crun ${KPOD_BINARY} $KPOD_OPTIONS rmi \u001b[36m\"$IMAGE\"\u001b[m\u001b[93m\u001b[107m\u001b[39;3H\u001b[96m\u001b[47m3\u001b[m\u001b[93m\u001b[107m\u001b[5C[ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\u001b[40;3H\u001b[96m\u001b[47m4\u001b[m\u001b[93m\u001b[107m\u001b[1C stop_crio\u001b[41;3H\u001b[96m\u001b[47m5\u001b[m\u001b[93m\u001b[107m\u001b[1C}\u001b[42;3H\u001b[96m\u001b[47m6\u001b[m\u001b[93m\u001b[107m\u001b[42;5H\u001b[K\u001b[43;3H\u001b[96m\u001b[47m7\u001b[m\u001b[93m\u001b[107m\u001b[1C@test \u001b[36m\"kpod push to oci without compression\"\u001b[m\u001b[93m\u001b[107m {\u001b[43;51H\u001b[K\u001b[44;3H\u001b[96m\u001b[47m8\u001b[m\u001b[93m\u001b[107m\u001b[5Crun ${KPOD_BINARY} $KPOD_OPTIONS pull \u001b[36m\"$IMAGE\"\u001b[m\u001b[93m\u001b[107m\u001b[45;2H\u001b[96m\u001b[47m59\u001b[m\u001b[93m\u001b[107m\u001b[5Cecho \u001b[36m\"$output\"\u001b[m\u001b[93m\u001b[107m\u001b[45;23H\u001b[K\u001b[46;3H\u001b[96m\u001b[47m0\u001b[m\u001b[93m\u001b[107m\u001b[5C[ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\u001b[46;28H\u001b[K\u001b[47;3H\u001b[96m\u001b[47m1\u001b[m\u001b[93m\u001b[107m\u001b[5Crun mkdir /tmp/oci-busybox\u001b[48;3H\u001b[96m\u001b[47m2\u001b[m\u001b[93m\u001b[107m\u001b[5Cecho \u001b[36m\"$output\"\u001b[m\u001b[93m\u001b[107m\u001b[48;23H\u001b[K\u001b[49;3H\u001b[96m\u001b[47m3\u001b[m\u001b[93m\u001b[107m\u001b[5C[ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\u001b[49;28H\u001b[K\u001b[50;3H\u001b[96m\u001b[47m4\u001b[m\u001b[93m\u001b[107m\u001b[5Crun ${KPOD_BINARY} $KPOD_OPTIONS push --disable-compression \u001b[36m\"$IMAGE\"\u001b[m\u001b[93m\u001b[107m oci:/tmp/oci-busybox" + ], + [ + 0.003544, + "\u001b[51;195H\u001b[38;5;70m\u001b[48;5;240m  21%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m8\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[4;9H\u001b[?12l\u001b[?25h" + ], + [ + 0.174049, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[1;3H\u001b[96m\u001b[47m4\u001b[m\u001b[93m\u001b[107m\u001b[1C@test \u001b[36m\"kpod push to containers/storage\"\u001b[m\u001b[93m\u001b[107m {\u001b[1;47H\u001b[K\u001b[2;3H\u001b[96m\u001b[47m5\u001b[m\u001b[93m\u001b[107m\u001b[5Crun ${KPOD_BINARY} $KPOD_OPTIONS pull \u001b[36m\"$IMAGE\"\u001b[m\u001b[93m\u001b[107m\u001b[3;3H\u001b[96m\u001b[47m6\u001b[m\u001b[93m\u001b[107m\u001b[5Cecho \u001b[36m\"$output\"\u001b[m\u001b[93m\u001b[107m\u001b[3;23H\u001b[K\u001b[4;3H\u001b[96m\u001b[47m7\u001b[m\u001b[93m\u001b[107m\u001b[5C\u001b[1m\u001b[31m\u001b[106m[\u001b[m\u001b[93m\u001b[107m \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 \u001b[1m\u001b[31m\u001b[106m]\u001b[m\u001b[93m\u001b[107m\u001b[4;28H\u001b[K\u001b[5;3H\u001b[96m\u001b[47m8\u001b[m\u001b[93m\u001b[107m\u001b[5Crun ${KPOD_BINARY} $KPOD_OPTIONS push \u001b[36m\"$IMAGE\"\u001b[m\u001b[93m\u001b[107m containers-storage:[$ROOT]busybox:test\u001b[6;2H\u001b[96m\u001b[47m19\u001b[m\u001b[93m\u001b[107m\u001b[5Cecho \u001b[36m\"$output\"\u001b[m\u001b[93m\u001b[107m\u001b[6;23H\u001b[K\u001b[7;3H\u001b[96m\u001b[47m0\u001b[m\u001b[93m\u001b[107m\u001b[5C[ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\u001b[7;28H\u001b[K\u001b[8;3H\u001b[96m\u001b[47m1\u001b[m\u001b[93m\u001b[107m\u001b[5Crun ${KPOD_BINARY} $KPOD_OPTIONS rmi \u001b[36m\"$IMAGE\"\u001b[m\u001b[93m\u001b[107m\u001b[9;3H\u001b[96m\u001b[47m2\u001b[m\u001b[93m\u001b[107m\u001b[5C[ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\u001b[9;28H\u001b[K\u001b[10;3H\u001b[96m\u001b[47m3\u001b[m\u001b[93m\u001b[107m\u001b[5Crun ${OCIC_BINARY} image remove busybox:test\u001b[11;3H\u001b[96m\u001b[47m" + ], + [ + 5.9e-05, + "4\u001b[m\u001b[93m\u001b[107m\u001b[5C[ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\u001b[12;3H\u001b[96m\u001b[47m5\u001b[m\u001b[93m\u001b[107m\u001b[1C stop_crio\u001b[13;3H\u001b[96m\u001b[47m6\u001b[m\u001b[93m\u001b[107m\u001b[1C}\u001b[14;3H\u001b[96m\u001b[47m7\u001b[m\u001b[93m\u001b[107m\u001b[14;5H\u001b[K\u001b[15;3H\u001b[96m\u001b[47m8\u001b[m\u001b[93m\u001b[107m\u001b[1C@test \u001b[36m\"kpod push to directory\"\u001b[m\u001b[93m\u001b[107m {\u001b[15;37H\u001b[K\u001b[16;2H\u001b[96m\u001b[47m29\u001b[m\u001b[93m\u001b[107m\u001b[5Crun ${KPOD_BINARY} $KPOD_OPTIONS pull \u001b[36m\"$IMAGE\"\u001b[m\u001b[93m\u001b[107m\u001b[17;3H\u001b[96m\u001b[47m0\u001b[m\u001b[93m\u001b[107m\u001b[5Cecho \u001b[36m\"$output\"\u001b[m\u001b[93m\u001b[107m\u001b[17;23H\u001b[K\u001b[18;3H\u001b[96m\u001b[47m1\u001b[m\u001b[93m\u001b[107m\u001b[5C[ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\u001b[18;28H\u001b[K\u001b[19;3H\u001b[96m\u001b[47m2\u001b[m\u001b[93m\u001b[107m\u001b[5Crun mkdir /tmp/busybox\u001b[20;3H\u001b[96m\u001b[47m3\u001b[m\u001b[93m\u001b[107m\u001b[5Cecho \u001b[36m\"$output\"\u001b[m\u001b[93m\u001b[107m\u001b[20;23H\u001b[K\u001b[21;3H\u001b[96m\u001b[47m4\u001b[m\u001b[93m\u001b[107m\u001b[5C[ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\u001b[21;28H\u001b[K\u001b[22;3H\u001b[96m\u001b[47m5\u001b[m\u001b[93m\u001b[107m\u001b[5Crun ${KPOD_BINARY} $KPOD_OPTIONS push \u001b[36m\"$IMAGE\"\u001b[m\u001b[93m\u001b[107m dir:/tmp/busybox\u001b[23;3H\u001b[96m\u001b[47m6\u001b[m\u001b[93m\u001b[107m\u001b[5Cecho \u001b[36m\"$output\"\u001b[m\u001b[93m\u001b[107m\u001b[23;23H\u001b[K\u001b[24;3H\u001b[96m\u001b[47m7\u001b[m\u001b[93m\u001b[107m\u001b[5C[ " + ], + [ + 0.001075, + "\u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\u001b[24;28H\u001b[K\u001b[25;3H\u001b[96m\u001b[47m8\u001b[m\u001b[93m\u001b[107m\u001b[5Crun ${KPOD_BINARY} $KPOD_OPTIONS rmi \u001b[36m\"$IMAGE\"\u001b[m\u001b[93m\u001b[107m\u001b[26;2H\u001b[96m\u001b[47m39\u001b[m\u001b[93m\u001b[107m\u001b[5C[ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\u001b[27;3H\u001b[96m\u001b[47m0\u001b[m\u001b[93m\u001b[107m\u001b[5Crm -rf /tmp/busybox\u001b[28;3H\u001b[96m\u001b[47m1\u001b[m\u001b[93m\u001b[107m\u001b[1C stop_crio\u001b[29;3H\u001b[96m\u001b[47m2\u001b[m\u001b[93m\u001b[107m\u001b[1C}\u001b[30;3H\u001b[96m\u001b[47m3\u001b[m\u001b[93m\u001b[107m\u001b[30;5H\u001b[K\u001b[31;3H\u001b[96m\u001b[47m4\u001b[m\u001b[93m\u001b[107m\u001b[1C@test \u001b[36m\"kpod push to docker archive\"\u001b[m\u001b[93m\u001b[107m {\u001b[31;42H\u001b[K\u001b[32;3H\u001b[96m\u001b[47m5\u001b[m\u001b[93m\u001b[107m\u001b[5Crun ${KPOD_BINARY} $KPOD_OPTIONS pull \u001b[36m\"$IMAGE\"\u001b[m\u001b[93m\u001b[107m\u001b[33;3H\u001b[96m\u001b[47m6\u001b[m\u001b[93m\u001b[107m\u001b[5Cecho \u001b[36m\"$output\"\u001b[m\u001b[93m\u001b[107m\u001b[33;23H\u001b[K\u001b[34;3H\u001b[96m\u001b[47m7\u001b[m\u001b[93m\u001b[107m\u001b[5C[ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\u001b[34;28H\u001b[K\u001b[35;3H\u001b[96m\u001b[47m8\u001b[m\u001b[93m\u001b[107m\u001b[5Crun ${KPOD_BINARY} $KPOD_OPTIONS push \u001b[36m\"$IMAGE\"\u001b[m\u001b[93m\u001b[107m docker-archive:/tmp/busybox-archive:1.26\u001b[36;2H\u001b[96m\u001b[47m49\u001b[m\u001b[93m\u001b[107m\u001b[5Cecho \u001b[36m\"$output\"\u001b[m\u001b[93m\u001b[107m\u001b[36;23H\u001b[K\u001b[37;3H\u001b[96m\u001b[47m0\u001b[m\u001b[93m\u001b" + ], + [ + 5.3e-05, + "[107m\u001b[5C[ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\u001b[37;28H\u001b[K\u001b[38;3H\u001b[96m\u001b[47m1\u001b[m\u001b[93m\u001b[107m\u001b[6Cm /tmp/busybox-archive\u001b[38;32H\u001b[K\u001b[39;3H\u001b[96m\u001b[47m2\u001b[m\u001b[93m\u001b[107m\u001b[5Crun ${KPOD_BINARY} $KPOD_OPTIONS rmi \u001b[36m\"$IMAGE\"\u001b[m\u001b[93m\u001b[107m\u001b[40;3H\u001b[96m\u001b[47m3\u001b[m\u001b[93m\u001b[107m\u001b[5C[ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\u001b[41;3H\u001b[96m\u001b[47m4\u001b[m\u001b[93m\u001b[107m\u001b[1C stop_crio\u001b[42;3H\u001b[96m\u001b[47m5\u001b[m\u001b[93m\u001b[107m\u001b[1C}\u001b[43;3H\u001b[96m\u001b[47m6\u001b[m\u001b[93m\u001b[107m\u001b[43;5H\u001b[K\u001b[44;3H\u001b[96m\u001b[47m7\u001b[m\u001b[93m\u001b[107m\u001b[1C@test \u001b[36m\"kpod push to oci without compression\"\u001b[m\u001b[93m\u001b[107m {\u001b[44;51H\u001b[K\u001b[45;3H\u001b[96m\u001b[47m8\u001b[m\u001b[93m\u001b[107m\u001b[5Crun ${KPOD_BINARY} $KPOD_OPTIONS pull \u001b[36m\"$IMAGE\"\u001b[m\u001b[93m\u001b[107m\u001b[46;2H\u001b[96m\u001b[47m59\u001b[m\u001b[93m\u001b[107m\u001b[5Cecho \u001b[36m\"$output\"\u001b[m\u001b[93m\u001b[107m\u001b[46;23H\u001b[K\u001b[47;3H\u001b[96m\u001b[47m0\u001b[m\u001b[93m\u001b[107m\u001b[5C[ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\u001b[47;28H\u001b[K\u001b[48;3H\u001b[96m\u001b[47m1\u001b[m\u001b[93m\u001b[107m\u001b[5Crun mkdir /tmp/oci-busybox\u001b[49;3H\u001b[96m\u001b[47m2\u001b[m\u001b[93m\u001b[107m\u001b[5Cecho \u001b[36m\"$output\"\u001b[m\u001b[93m\u001b[107m\u001b[49;23H\u001b[K\u001b[50;3H\u001b[96m\u001b[47m3\u001b[m\u001b[93m\u001b[107m\u001b[5C[ \u001b[36m\"$status\"\u001b[m" + ], + [ + 0.008247, + "\u001b[93m\u001b[107m -eq 0 ]\u001b[50;28H\u001b[K\u001b[51;195H\u001b[38;5;70m\u001b[48;5;240m  20%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m7\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[4;9H\u001b[?12l\u001b[?25h" + ], + [ + 2.125968, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[1;3H\u001b[96m\u001b[47m3\u001b[m\u001b[93m\u001b[107m\u001b[1;5H\u001b[K\u001b[2;3H\u001b[96m\u001b[47m4\u001b[m\u001b[93m\u001b[107m\u001b[1C@test \u001b[36m\"kpod push to containers/storage\"\u001b[m\u001b[93m\u001b[107m {\u001b[2;47H\u001b[K\u001b[3;3H\u001b[96m\u001b[47m5\u001b[m\u001b[93m\u001b[107m\u001b[5Crun ${KPOD_BINARY} $KPOD_OPTIONS pull \u001b[36m\"$IMAGE\"\u001b[m\u001b[93m\u001b[107m\u001b[4;3H\u001b[96m\u001b[47m6\u001b[m\u001b[93m\u001b[107m\u001b[5Cecho \u001b[36m\"$output\"\u001b[m\u001b[93m\u001b[107m\u001b[4;23H\u001b[K\u001b[5;3H\u001b[96m\u001b[47m7\u001b[m\u001b[93m\u001b[107m\u001b[5C[ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\u001b[5;28H\u001b[K\u001b[6;3H\u001b[96m\u001b[47m8\u001b[m\u001b[93m\u001b[107m\u001b[5Crun ${KPOD_BINARY} $KPOD_OPTIONS push \u001b[36m\"$IMAGE\"\u001b[m\u001b[93m\u001b[107m containers-storage:[$ROOT]busybox:test\u001b[7;2H\u001b[96m\u001b[47m19\u001b[m\u001b[93m\u001b[107m\u001b[5Cecho \u001b[36m\"$output\"\u001b[m\u001b[93m\u001b[107m\u001b[7;23H\u001b[K\u001b[8;3H\u001b[96m\u001b[47m0\u001b[m\u001b[93m\u001b[107m\u001b[5C[ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\u001b[8;28H\u001b[K\u001b[9;3H\u001b[96m\u001b[47m1\u001b[m\u001b[93m\u001b[107m\u001b[5Crun ${KPOD_BINARY} $KPOD_OPTIONS rmi \u001b[36m\"$IMAGE\"\u001b[m\u001b[93m\u001b[107m\u001b[10;3H\u001b[96m\u001b[47m2\u001b[m\u001b[93m\u001b[107m\u001b[5C[ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\u001b[10;28H\u001b[K\u001b[11;3H\u001b[96m\u001b[47m3\u001b[m\u001b[93m\u001b[107m\u001b[5Crun ${OCIC_BINARY} image remove busybox:test\u001b[12;3H\u001b[96m\u001b[47m4\u001b[m\u001b[93m\u001b[107m\u001b" + ], + [ + 7.1e-05, + "[5C[ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\u001b[13;3H\u001b[96m\u001b[47m5\u001b[m\u001b[93m\u001b[107m\u001b[1C stop_crio\u001b[14;3H\u001b[96m\u001b[47m6\u001b[m\u001b[93m\u001b[107m\u001b[1C}\u001b[15;3H\u001b[96m\u001b[47m7\u001b[m\u001b[93m\u001b[107m\u001b[15;5H\u001b[K\u001b[16;3H\u001b[96m\u001b[47m8\u001b[m\u001b[93m\u001b[107m\u001b[1C@test \u001b[36m\"kpod push to directory\"\u001b[m\u001b[93m\u001b[107m {\u001b[16;37H\u001b[K\u001b[17;2H\u001b[96m\u001b[47m29\u001b[m\u001b[93m\u001b[107m\u001b[5Crun ${KPOD_BINARY} $KPOD_OPTIONS pull \u001b[36m\"$IMAGE\"\u001b[m\u001b[93m\u001b[107m\u001b[18;3H\u001b[96m\u001b[47m0\u001b[m\u001b[93m\u001b[107m\u001b[5Cecho \u001b[36m\"$output\"\u001b[m\u001b[93m\u001b[107m\u001b[18;23H\u001b[K\u001b[19;3H\u001b[96m\u001b[47m1\u001b[m\u001b[93m\u001b[107m\u001b[5C[ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\u001b[19;28H\u001b[K\u001b[20;3H\u001b[96m\u001b[47m2\u001b[m\u001b[93m\u001b[107m\u001b[5Crun mkdir /tmp/busybox\u001b[21;3H\u001b[96m\u001b[47m3\u001b[m\u001b[93m\u001b[107m\u001b[5Cecho \u001b[36m\"$output\"\u001b[m\u001b[93m\u001b[107m\u001b[21;23H\u001b[K\u001b[22;3H\u001b[96m\u001b[47m4\u001b[m\u001b[93m\u001b[107m\u001b[5C[ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\u001b[22;28H\u001b[K\u001b[23;3H\u001b[96m\u001b[47m5\u001b[m\u001b[93m\u001b[107m\u001b[5Crun ${KPOD_BINARY} $KPOD_OPTIONS push \u001b[36m\"$IMAGE\"\u001b[m\u001b[93m\u001b[107m dir:/tmp/busybox\u001b[24;3H\u001b[96m\u001b[47m6\u001b[m\u001b[93m\u001b[107m\u001b[5Cecho \u001b[36m\"$output\"\u001b[m\u001b[93m\u001b[107m\u001b[24;23H\u001b[K\u001b[25;3H\u001b[96m\u001b[47m7\u001b[m\u001b[93m\u001b[107m\u001b[5C[ \u001b[36m\"$status\"" + ], + [ + 0.007072, + "\u001b[m\u001b[93m\u001b[107m -eq 0 ]\u001b[25;28H\u001b[K\u001b[26;3H\u001b[96m\u001b[47m8\u001b[m\u001b[93m\u001b[107m\u001b[5Crun ${KPOD_BINARY} $KPOD_OPTIONS rmi \u001b[36m\"$IMAGE\"\u001b[m\u001b[93m\u001b[107m\u001b[27;2H\u001b[96m\u001b[47m39\u001b[m\u001b[93m\u001b[107m\u001b[5C[ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\u001b[28;3H\u001b[96m\u001b[47m0\u001b[m\u001b[93m\u001b[107m\u001b[5Crm -rf /tmp/busybox\u001b[29;3H\u001b[96m\u001b[47m1\u001b[m\u001b[93m\u001b[107m\u001b[1C stop_crio\u001b[30;3H\u001b[96m\u001b[47m2\u001b[m\u001b[93m\u001b[107m\u001b[1C}\u001b[31;3H\u001b[96m\u001b[47m3\u001b[m\u001b[93m\u001b[107m\u001b[31;5H\u001b[K\u001b[32;3H\u001b[96m\u001b[47m4\u001b[m\u001b[93m\u001b[107m\u001b[1C@test \u001b[36m\"kpod push to docker archive\"\u001b[m\u001b[93m\u001b[107m {\u001b[32;42H\u001b[K\u001b[33;3H\u001b[96m\u001b[47m5\u001b[m\u001b[93m\u001b[107m\u001b[5Crun ${KPOD_BINARY} $KPOD_OPTIONS pull \u001b[36m\"$IMAGE\"\u001b[m\u001b[93m\u001b[107m\u001b[34;3H\u001b[96m\u001b[47m6\u001b[m\u001b[93m\u001b[107m\u001b[5Cecho \u001b[36m\"$output\"\u001b[m\u001b[93m\u001b[107m\u001b[34;23H\u001b[K\u001b[35;3H\u001b[96m\u001b[47m7\u001b[m\u001b[93m\u001b[107m\u001b[5C[ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\u001b[35;28H\u001b[K\u001b[36;3H\u001b[96m\u001b[47m8\u001b[m\u001b[93m\u001b[107m\u001b[5Crun ${KPOD_BINARY} $KPOD_OPTIONS push \u001b[36m\"$IMAGE\"\u001b[m\u001b[93m\u001b[107m docker-archive:/tmp/busybox-archive:1.26\u001b[37;2H\u001b[96m\u001b[47m49\u001b[m\u001b[93m\u001b[107m\u001b[5Cecho \u001b[36m\"$output\"\u001b[m\u001b[93m\u001b[107m\u001b[37;23H\u001b[K\u001b[38;3H\u001b[96m\u001b[47m0\u001b[m\u001b[93m\u001b[107m\u001b[5C[ \u001b[3" + ], + [ + 4.4e-05, + "6m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\u001b[38;28H\u001b[K\u001b[39;3H\u001b[96m\u001b[47m1\u001b[m\u001b[93m\u001b[107m\u001b[6Cm /tmp/busybox-archive\u001b[39;32H\u001b[K\u001b[40;3H\u001b[96m\u001b[47m2\u001b[m\u001b[93m\u001b[107m\u001b[5Crun ${KPOD_BINARY} $KPOD_OPTIONS rmi \u001b[36m\"$IMAGE\"\u001b[m\u001b[93m\u001b[107m\u001b[41;3H\u001b[96m\u001b[47m3\u001b[m\u001b[93m\u001b[107m\u001b[5C[ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\u001b[42;3H\u001b[96m\u001b[47m4\u001b[m\u001b[93m\u001b[107m\u001b[1C stop_crio\u001b[43;3H\u001b[96m\u001b[47m5\u001b[m\u001b[93m\u001b[107m\u001b[1C}\u001b[44;3H\u001b[96m\u001b[47m6\u001b[m\u001b[93m\u001b[107m\u001b[44;5H\u001b[K\u001b[45;3H\u001b[96m\u001b[47m7\u001b[m\u001b[93m\u001b[107m\u001b[1C@test \u001b[36m\"kpod push to oci without compression\"\u001b[m\u001b[93m\u001b[107m {\u001b[45;51H\u001b[K\u001b[46;3H\u001b[96m\u001b[47m8\u001b[m\u001b[93m\u001b[107m\u001b[5Crun ${KPOD_BINARY} $KPOD_OPTIONS pull \u001b[36m\"$IMAGE\"\u001b[m\u001b[93m\u001b[107m\u001b[47;2H\u001b[96m\u001b[47m59\u001b[m\u001b[93m\u001b[107m\u001b[5Cecho \u001b[36m\"$output\"\u001b[m\u001b[93m\u001b[107m\u001b[47;23H\u001b[K\u001b[48;3H\u001b[96m\u001b[47m0\u001b[m\u001b[93m\u001b[107m\u001b[5C[ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\u001b[48;28H\u001b[K\u001b[49;3H\u001b[96m\u001b[47m1\u001b[m\u001b[93m\u001b[107m\u001b[5Crun mkdir /tmp/oci-busybox\u001b[50;3H\u001b[96m\u001b[47m2\u001b[m\u001b[93m\u001b[107m\u001b[5Cecho \u001b[36m\"$output\"\u001b[m\u001b[93m\u001b[107m\u001b[50;23H\u001b[K\u001b[51;195H\u001b[38;5;70m\u001b[48;5;240m  18%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m" + ], + [ + 0.002085, + "\u001b[48;5;252m6\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[4;9H\u001b[?12l\u001b[?25h" + ], + [ + 0.16733, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[1;3H\u001b[96m\u001b[47m2\u001b[m\u001b[93m\u001b[107m\u001b[1C}\u001b[2;3H\u001b[96m\u001b[47m3\u001b[m\u001b[93m\u001b[107m\u001b[2;5H\u001b[K\u001b[3;3H\u001b[96m\u001b[47m4\u001b[m\u001b[93m\u001b[107m\u001b[1C@test \u001b[36m\"kpod push to containers/storage\"\u001b[m\u001b[93m\u001b[107m {\u001b[3;47H\u001b[K\u001b[4;3H\u001b[96m\u001b[47m5\u001b[m\u001b[93m\u001b[107m\u001b[5Crun ${KPOD_BINARY} $KPOD_OPTIONS pull \u001b[36m\"$IMAGE\"\u001b[m\u001b[93m\u001b[107m\u001b[5;3H\u001b[96m\u001b[47m6\u001b[m\u001b[93m\u001b[107m\u001b[5Cecho \u001b[36m\"$output\"\u001b[m\u001b[93m\u001b[107m\u001b[5;23H\u001b[K\u001b[6;3H\u001b[96m\u001b[47m7\u001b[m\u001b[93m\u001b[107m\u001b[5C[ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\u001b[6;28H\u001b[K\u001b[7;3H\u001b[96m\u001b[47m8\u001b[m\u001b[93m\u001b[107m\u001b[5Crun ${KPOD_BINARY} $KPOD_OPTIONS push \u001b[36m\"$IMAGE\"\u001b[m\u001b[93m\u001b[107m containers-storage:[$ROOT]busybox:test\u001b[8;2H\u001b[96m\u001b[47m19\u001b[m\u001b[93m\u001b[107m\u001b[5Cecho \u001b[36m\"$output\"\u001b[m\u001b[93m\u001b[107m\u001b[8;23H\u001b[K\u001b[9;3H\u001b[96m\u001b[47m0\u001b[m\u001b[93m\u001b[107m\u001b[5C[ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\u001b[9;28H\u001b[K\u001b[10;3H\u001b[96m\u001b[47m1\u001b[m\u001b[93m\u001b[107m\u001b[5Crun ${KPOD_BINARY} $KPOD_OPTIONS rmi \u001b[36m\"$IMAGE\"\u001b[m\u001b[93m\u001b[107m\u001b[11;3H\u001b[96m\u001b[47m2\u001b[m\u001b[93m\u001b[107m\u001b[5C[ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\u001b[11;28H\u001b[K\u001b[12;3H\u001b[96m\u001b[47m3\u001b[m\u001b[93m\u001b[107m\u001b[5Crun ${OCIC_BINARY} image remove busybox:" + ], + [ + 8.8e-05, + "test\u001b[13;3H\u001b[96m\u001b[47m4\u001b[m\u001b[93m\u001b[107m\u001b[5C[ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\u001b[14;3H\u001b[96m\u001b[47m5\u001b[m\u001b[93m\u001b[107m\u001b[1C stop_crio\u001b[15;3H\u001b[96m\u001b[47m6\u001b[m\u001b[93m\u001b[107m\u001b[1C}\u001b[16;3H\u001b[96m\u001b[47m7\u001b[m\u001b[93m\u001b[107m\u001b[16;5H\u001b[K\u001b[17;3H\u001b[96m\u001b[47m8\u001b[m\u001b[93m\u001b[107m\u001b[1C@test \u001b[36m\"kpod push to directory\"\u001b[m\u001b[93m\u001b[107m {\u001b[17;37H\u001b[K\u001b[18;2H\u001b[96m\u001b[47m29\u001b[m\u001b[93m\u001b[107m\u001b[5Crun ${KPOD_BINARY} $KPOD_OPTIONS pull \u001b[36m\"$IMAGE\"\u001b[m\u001b[93m\u001b[107m\u001b[19;3H\u001b[96m\u001b[47m0\u001b[m\u001b[93m\u001b[107m\u001b[5Cecho \u001b[36m\"$output\"\u001b[m\u001b[93m\u001b[107m\u001b[19;23H\u001b[K\u001b[20;3H\u001b[96m\u001b[47m1\u001b[m\u001b[93m\u001b[107m\u001b[5C[ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\u001b[20;28H\u001b[K\u001b[21;3H\u001b[96m\u001b[47m2\u001b[m\u001b[93m\u001b[107m\u001b[5Crun mkdir /tmp/busybox\u001b[22;3H\u001b[96m\u001b[47m3\u001b[m\u001b[93m\u001b[107m\u001b[5Cecho \u001b[36m\"$output\"\u001b[m\u001b[93m\u001b[107m\u001b[22;23H\u001b[K\u001b[23;3H\u001b[96m\u001b[47m4\u001b[m\u001b[93m\u001b[107m\u001b[5C[ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\u001b[23;28H\u001b[K\u001b[24;3H\u001b[96m\u001b[47m5\u001b[m\u001b[93m\u001b[107m\u001b[5Crun ${KPOD_BINARY} $KPOD_OPTIONS push \u001b[36m\"$IMAGE\"\u001b[m\u001b[93m\u001b[107m dir:/tmp/busybox\u001b[25;3H\u001b[96m\u001b[47m6\u001b[m\u001b[93m\u001b[107m\u001b[5Cecho \u001b[36m\"$output\"\u001b[m\u001b[93m\u001b[107m\u001b[25;23H\u001b[K\u001b[26;3H\u001b[96m" + ], + [ + 0.007373, + "\u001b[47m7\u001b[m\u001b[93m\u001b[107m\u001b[5C[ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\u001b[26;28H\u001b[K\u001b[27;3H\u001b[96m\u001b[47m8\u001b[m\u001b[93m\u001b[107m\u001b[5Crun ${KPOD_BINARY} $KPOD_OPTIONS rmi \u001b[36m\"$IMAGE\"\u001b[m\u001b[93m\u001b[107m\u001b[28;2H\u001b[96m\u001b[47m39\u001b[m\u001b[93m\u001b[107m\u001b[5C[ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\u001b[29;3H\u001b[96m\u001b[47m0\u001b[m\u001b[93m\u001b[107m\u001b[5Crm -rf /tmp/busybox\u001b[30;3H\u001b[96m\u001b[47m1\u001b[m\u001b[93m\u001b[107m\u001b[1C stop_crio\u001b[31;3H\u001b[96m\u001b[47m2\u001b[m\u001b[93m\u001b[107m\u001b[1C}\u001b[32;3H\u001b[96m\u001b[47m3\u001b[m\u001b[93m\u001b[107m\u001b[32;5H\u001b[K\u001b[33;3H\u001b[96m\u001b[47m4\u001b[m\u001b[93m\u001b[107m\u001b[1C@test \u001b[36m\"kpod push to docker archive\"\u001b[m\u001b[93m\u001b[107m {\u001b[33;42H\u001b[K\u001b[34;3H\u001b[96m\u001b[47m5\u001b[m\u001b[93m\u001b[107m\u001b[5Crun ${KPOD_BINARY} $KPOD_OPTIONS pull \u001b[36m\"$IMAGE\"\u001b[m\u001b[93m\u001b[107m\u001b[35;3H\u001b[96m\u001b[47m6\u001b[m\u001b[93m\u001b[107m\u001b[5Cecho \u001b[36m\"$output\"\u001b[m\u001b[93m\u001b[107m\u001b[35;23H\u001b[K\u001b[36;3H\u001b[96m\u001b[47m7\u001b[m\u001b[93m\u001b[107m\u001b[5C[ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\u001b[36;28H\u001b[K\u001b[37;3H\u001b[96m\u001b[47m8\u001b[m\u001b[93m\u001b[107m\u001b[5Crun ${KPOD_BINARY} $KPOD_OPTIONS push \u001b[36m\"$IMAGE\"\u001b[m\u001b[93m\u001b[107m docker-archive:/tmp/busybox-archive:1.26\u001b[38;2H\u001b[96m\u001b[47m49\u001b[m\u001b[93m\u001b[107m\u001b[5Cecho \u001b[36m\"$output\"\u001b[m\u001b[93m\u001b[107m\u001b[38;23H\u001b[K\u001b" + ], + [ + 2.1e-05, + "[39;3H\u001b[96m\u001b[47m0\u001b[m\u001b[93m\u001b[107m\u001b[5C[ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\u001b[39;28H\u001b[K\u001b[40;3H\u001b[96m\u001b[47m1\u001b[m\u001b[93m\u001b[107m\u001b[6Cm /tmp/busybox-archive\u001b[40;32H\u001b[K\u001b[41;3H\u001b[96m\u001b[47m2\u001b[m\u001b[93m\u001b[107m\u001b[5Crun ${KPOD_BINARY} $KPOD_OPTIONS rmi \u001b[36m\"$IMAGE\"\u001b[m\u001b[93m\u001b[107m\u001b[42;3H\u001b[96m\u001b[47m3\u001b[m\u001b[93m\u001b[107m\u001b[5C[ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\u001b[43;3H\u001b[96m\u001b[47m4\u001b[m\u001b[93m\u001b[107m\u001b[1C stop_crio\u001b[44;3H\u001b[96m\u001b[47m5\u001b[m\u001b[93m\u001b[107m\u001b[1C}\u001b[45;3H\u001b[96m\u001b[47m6\u001b[m\u001b[93m\u001b[107m\u001b[45;5H\u001b[K\u001b[46;3H\u001b[96m\u001b[47m7\u001b[m\u001b[93m\u001b[107m\u001b[1C@test \u001b[36m\"kpod push to oci without compression\"\u001b[m\u001b[93m\u001b[107m {\u001b[46;51H\u001b[K\u001b[47;3H\u001b[96m\u001b[47m8\u001b[m\u001b[93m\u001b[107m\u001b[5Crun ${KPOD_BINARY} $KPOD_OPTIONS pull \u001b[36m\"$IMAGE\"\u001b[m\u001b[93m\u001b[107m\u001b[48;2H\u001b[96m\u001b[47m59\u001b[m\u001b[93m\u001b[107m\u001b[5Cecho \u001b[36m\"$output\"\u001b[m\u001b[93m\u001b[107m\u001b[48;23H\u001b[K\u001b[49;3H\u001b[96m\u001b[47m0\u001b[m\u001b[93m\u001b[107m\u001b[5C[ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\u001b[49;28H\u001b[K\u001b[50;3H\u001b[96m\u001b[47m1\u001b[m\u001b[93m\u001b[107m\u001b[5Crun mkdir /tmp/oci-busybox\u001b[51;195H\u001b[38;5;70m\u001b[48;5;240m  17%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m5\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[4;9H\u001b[?1" + ], + [ + 1e-05, + "2l\u001b[?25h" + ], + [ + 0.244303, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[51;195H\u001b[38;5;70m\u001b[48;5;240m  18%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m6\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[5;9H\u001b[?12l\u001b[?25h" + ], + [ + 0.495597, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[6;9H\u001b[1m\u001b[31m\u001b[106m[\u001b[17C]\u001b[m\u001b[93m\u001b[107m\u001b[51;195H\u001b[38;5;70m\u001b[48;5;240m  20%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m7\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[6;9H\u001b[?12l\u001b[?25h" + ], + [ + 0.0243, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m[ \u001b[16C]\u001b[51;195H\u001b[38;5;70m\u001b[48;5;240m  21%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m8\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[7;9H\u001b[?12l\u001b[?25h" + ], + [ + 0.030791, + "\u001b[m\u001b[93m\u001b[107m\u001b[51;195H\u001b[38;5;70m\u001b[48;5;240m  22%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m9\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[8;9H" + ], + [ + 0.034862, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[9;9H\u001b[1m\u001b[31m\u001b[106m[\u001b[17C]\u001b[m\u001b[93m\u001b[107m\u001b[51;195H\u001b[38;5;70m\u001b[48;5;240m  23%\u001b[m\u001b[93m\u001b[107m\u001b[6C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m20\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[9;9H\u001b[?12l\u001b[?25h" + ], + [ + 0.025609, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m[ \u001b[16C]\u001b[51;195H\u001b[38;5;70m\u001b[48;5;240m  24%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m1\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[10;9H\u001b[?12l\u001b[?25h" + ], + [ + 0.03403, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[11;9H\u001b[1m\u001b[31m\u001b[106m[\u001b[17C]\u001b[m\u001b[93m\u001b[107m\u001b[51;195H\u001b[38;5;70m\u001b[48;5;240m  25%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m2\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[11;9H\u001b[?12l\u001b[?25h" + ], + [ + 0.346484, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m[ \u001b[16C]\u001b[51;195H\u001b[38;5;107m\u001b[48;5;240m  26%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m3\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[12;9H\u001b[?12l\u001b[?25h" + ], + [ + 0.422162, + "\u001b[51;209H48\u001b[12;52H" + ], + [ + 0.227309, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[52;1H\u001b[34m-- INSERT --\u001b[m\u001b[93m\u001b[107m\u001b[52;13H\u001b[K" + ], + [ + 0.018402, + "\u001b[51;1H\u001b[1m\u001b[38;5;23m\u001b[48;5;231m INSERT \u001b[m\u001b[93m\u001b[107m\u001b[38;5;148m\u001b[48;5;240m\u001b[m\u001b[93m\u001b[107m\u001b[51;9H\u001b[38;5;231m\u001b[48;5;31m\u001b[51;10H \u001b[m\u001b[93m\u001b[107m\u001b[38;5;117m\u001b[48;5;31m\u001b[51;12H kpod-test-refactor \u001b[m\u001b[93m\u001b[107m\u001b[38;5;74m\u001b[48;5;31m\u001b[51;33H \u001b[m\u001b[93m\u001b[107m\u001b[38;5;117m\u001b[48;5;31mtest/\u001b[m\u001b[93m\u001b[107m\u001b[1m\u001b[38;5;231m\u001b[48;5;31mkpod_push.bats \u001b[m\u001b[93m\u001b[107m\u001b[38;5;240m\u001b[48;5;236m\u001b[m\u001b[93m\u001b[107m\u001b[51;54H\u001b[38;5;31m\u001b[48;5;24m\u001b[51;55H \u001b[m\u001b[93m\u001b[107m\u001b[38;5;231m\u001b[48;5;24m                                                                                                                      \u001b[m\u001b[93m\u001b[107m\u001b[38;5;117m\u001b[48;5;24munix\u001b[m\u001b[93m\u001b[107m\u001b[38;5;74m\u001b[48;5;24m \u001b[m\u001b[93m\u001b[107m\u001b[51;180H\u001b[38;5;117m\u001b[48;5;24m utf-8\u001b[m\u001b[93m\u001b[107m\u001b[38;5;74m\u001b[48;5;24m \u001b[m\u001b[93m\u001b[107m\u001b[51;188H\u001b[38;5;117m\u001b[48;5;24m conf\u001b[m\u001b[93m\u001b[107m\u001b[38;5;31m\u001b[48;5;24m \u001b[m\u001b[93m\u001b[107m\u001b[51;195H\u001b[38;5;149m\u001b[48;5;31m  26%\u001b[m\u001b[" + ], + [ + 2.9e-05, + "93m\u001b[107m\u001b[38;5;117m\u001b[48;5;31m \u001b[m\u001b[93m\u001b[107m\u001b[51;202H\u001b[38;5;24m\u001b[48;5;117m \u001b[51;204H \u001b[m\u001b[93m\u001b[107m\u001b[1m\u001b[38;5;24m\u001b[48;5;117m 23\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[m\u001b[93m\u001b[107m\b\u001b[38;5;22m\u001b[48;5;117m:49 \u001b[12;53H\u001b[?12l\u001b[?25h" + ], + [ + 0.11896, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[12;52H\u001b[K\u001b[51;53H\u001b[1m\u001b[38;5;220m\u001b[48;5;31m + \u001b[m\u001b[93m\u001b[107m\u001b[38;5;31m\u001b[48;5;24m\u001b[51;57H \u001b[m\u001b[93m\u001b[107m\u001b[152C\u001b[38;5;22m\u001b[48;5;117m8\u001b[12;52H\u001b[?12l\u001b[?25h" + ], + [ + 0.496088, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[12;51H\u001b[K\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m7\u001b[12;51H\u001b[?12l\u001b[?25h" + ], + [ + 0.031493, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[12;50H\u001b[K\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m6\u001b[12;50H\u001b[?12l\u001b[?25h" + ], + [ + 0.027468, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[12;49H\u001b[K\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m5\u001b[12;49H\u001b[?12l\u001b[?25h" + ], + [ + 0.033381, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[12;48H\u001b[K\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m4\u001b[12;48H\u001b[?12l\u001b[?25h" + ], + [ + 0.034028, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[12;47H\u001b[K\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m3\u001b[12;47H\u001b[?12l\u001b[?25h" + ], + [ + 0.027933, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[12;46H\u001b[K\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m2\u001b[12;46H\u001b[?12l\u001b[?25h" + ], + [ + 0.032743, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[12;45H\u001b[K\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m1\u001b[12;45H\u001b[?12l\u001b[?25h" + ], + [ + 0.030113, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[12;44H\u001b[K\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m0\u001b[12;44H\u001b[?12l\u001b[?25h" + ], + [ + 0.034589, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[12;43H\u001b[K\u001b[51;209H\u001b[38;5;22m\u001b[48;5;117m39\u001b[12;43H\u001b[?12l\u001b[?25h" + ], + [ + 0.023953, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[12;42H\u001b[K\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m8\u001b[12;42H\u001b[?12l\u001b[?25h" + ], + [ + 0.192014, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[12;41H\u001b[K\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m7\u001b[12;41H\u001b[?12l\u001b[?25h" + ], + [ + 0.74866, + "\u001b[?25l\u001b[51;210H6\u001b[12;40H\u001b[?12l\u001b[?25h" + ], + [ + 0.498543, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[12;39H\u001b[K\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m5\u001b[12;39H\u001b[?12l\u001b[?25h" + ], + [ + 0.025782, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[12;38H\u001b[K\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m4\u001b[12;38H\u001b[?12l\u001b[?25h" + ], + [ + 0.031784, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[12;37H\u001b[K\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m3\u001b[12;37H\u001b[?12l\u001b[?25h" + ], + [ + 0.03173, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[12;36H\u001b[K\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m2\u001b[12;36H\u001b[?12l\u001b[?25h" + ], + [ + 0.029779, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[12;35H\u001b[K\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m1\u001b[12;35H\u001b[?12l\u001b[?25h" + ], + [ + 0.034013, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[12;34H\u001b[K\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m0\u001b[12;34H\u001b[?12l\u001b[?25h" + ], + [ + 0.028916, + "\u001b[?25l\u001b[51;209H29\u001b[12;33H\u001b[?12l\u001b[?25h" + ], + [ + 0.028505, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[12;32H\u001b[K\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m8\u001b[12;32H\u001b[?12l\u001b[?25h" + ], + [ + 0.029212, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[12;31H\u001b[K\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m7\u001b[12;31H\u001b[?12l\u001b[?25h" + ], + [ + 0.035421, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[12;30H\u001b[K\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m6\u001b[12;30H\u001b[?12l\u001b[?25h" + ], + [ + 0.030293, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[12;29H\u001b[K\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m5\u001b[12;29H\u001b[?12l\u001b[?25h" + ], + [ + 0.030509, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[12;28H\u001b[K\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m4\u001b[12;28H\u001b[?12l\u001b[?25h" + ], + [ + 0.029979, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[12;14H\u001b[1m\u001b[31m\u001b[106m{\u001b[11C}\u001b[m\u001b[93m\u001b[107m\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m3\u001b[12;27H\u001b[?12l\u001b[?25h" + ], + [ + 0.03119, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[12;26H\u001b[K\u001b[12;14H{O\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m2\u001b[12;26H\u001b[?12l\u001b[?25h" + ], + [ + 0.032258, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[12;25H\u001b[K\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m1\u001b[12;25H\u001b[?12l\u001b[?25h" + ], + [ + 0.02545, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[12;24H\u001b[K\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m0\u001b[12;24H\u001b[?12l\u001b[?25h" + ], + [ + 0.035798, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[12;23H\u001b[K\u001b[51;209H\u001b[38;5;22m\u001b[48;5;117m19\u001b[12;23H\u001b[?12l\u001b[?25h" + ], + [ + 0.02867, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[12;22H\u001b[K\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m8\u001b[12;22H\u001b[?12l\u001b[?25h" + ], + [ + 0.031704, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[12;21H\u001b[K\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m7\u001b[12;21H\u001b[?12l\u001b[?25h" + ], + [ + 0.0333, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[12;20H\u001b[K\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m6\u001b[12;20H\u001b[?12l\u001b[?25h" + ], + [ + 0.024988, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[12;19H\u001b[K\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m5\u001b[12;19H\u001b[?12l\u001b[?25h" + ], + [ + 0.02881, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[12;18H\u001b[K\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m4\u001b[12;18H\u001b[?12l\u001b[?25h" + ], + [ + 0.033247, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[12;17H\u001b[K\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m3\u001b[12;17H\u001b[?12l\u001b[?25h" + ], + [ + 0.032484, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[12;16H\u001b[K\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m2\u001b[12;16H\u001b[?12l\u001b[?25h" + ], + [ + 0.031784, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[12;15H\u001b[K\u001b[12;14H\u001b[1m\u001b[31m\u001b[106m{\u001b[15;5H}\u001b[m\u001b[93m\u001b[107m\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m1\u001b[12;15H\u001b[?12l\u001b[?25h" + ], + [ + 0.453651, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[12;14H\u001b[K\u001b[15;5H}\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m0\u001b[12;14H\u001b[?12l\u001b[?25h" + ], + [ + 0.192402, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[12;13H\u001b[K\u001b[51;209H\u001b[38;5;22m\u001b[48;5;117m9 \u001b[12;13H\u001b[?12l\u001b[?25h" + ], + [ + 0.437798, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107mk\u001b[51;209H\u001b[38;5;22m\u001b[48;5;117m10\u001b[12;14H\u001b[?12l\u001b[?25h" + ], + [ + 0.254702, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107mp\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m1\u001b[12;15H\u001b[?12l\u001b[?25h" + ], + [ + 0.30839, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[12;14H\u001b[K\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m0\u001b[12;14H\u001b[?12l\u001b[?25h" + ], + [ + 0.132923, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[12;13H\u001b[K\u001b[51;209H\u001b[38;5;22m\u001b[48;5;117m9 \u001b[12;13H\u001b[?12l\u001b[?25h" + ], + [ + 0.318686, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m$\u001b[51;209H\u001b[38;5;22m\u001b[48;5;117m10\u001b[12;14H\u001b[?12l\u001b[?25h" + ], + [ + 0.283056, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m(\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m1\u001b[12;15H\u001b[?12l\u001b[?25h" + ], + [ + 0.330165, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[12;14H\u001b[K\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m0\u001b[12;14H\u001b[?12l\u001b[?25h" + ], + [ + 0.516215, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m{\b\u001b[1m\u001b[31m\u001b[106m{\u001b[15;5H}\u001b[m\u001b[93m\u001b[107m\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m1\u001b[12;15H\u001b[?12l\u001b[?25h" + ], + [ + 0.658201, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107mK\b\b{K\u001b[15;5H}\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m2\u001b[12;16H\u001b[?12l\u001b[?25h" + ], + [ + 0.143261, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107mP\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m3\u001b[12;17H\u001b[?12l\u001b[?25h" + ], + [ + 0.123887, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107mO\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m4\u001b[12;18H\u001b[?12l\u001b[?25h" + ], + [ + 0.169592, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107mD\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m5\u001b[12;19H\u001b[?12l\u001b[?25h" + ], + [ + 0.345485, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m_\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m6\u001b[12;20H\u001b[?12l\u001b[?25h" + ], + [ + 0.181625, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107mB\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m7\u001b[12;21H\u001b[?12l\u001b[?25h" + ], + [ + 0.084398, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107mI\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m8\u001b[12;22H\u001b[?12l\u001b[?25h" + ], + [ + 0.111056, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107mN\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m9\u001b[12;23H\u001b[?12l\u001b[?25h" + ], + [ + 0.128088, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107mA\u001b[51;209H\u001b[38;5;22m\u001b[48;5;117m20\u001b[12;24H\u001b[?12l\u001b[?25h" + ], + [ + 0.131002, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107mR\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m1\u001b[12;25H\u001b[?12l\u001b[?25h" + ], + [ + 0.165526, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107mY\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m2\u001b[12;26H\u001b[?12l\u001b[?25h" + ], + [ + 0.657525, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m}\u001b[12;14H\u001b[1m\u001b[31m\u001b[106m{\u001b[11C}\u001b[m\u001b[93m\u001b[107m\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m3\u001b[12;27H\u001b[?12l\u001b[?25h" + ], + [ + 0.183629, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[12;14H{K\u001b[10C} \u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m4\u001b[12;28H\u001b[?12l\u001b[?25h" + ], + [ + 0.447484, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m$\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m5\u001b[12;29H\u001b[?12l\u001b[?25h" + ], + [ + 0.17344, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107mK\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m6\u001b[12;30H\u001b[?12l\u001b[?25h" + ], + [ + 0.115871, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107mP\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m7\u001b[12;31H\u001b[?12l\u001b[?25h" + ], + [ + 0.090564, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107mO\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m8\u001b[12;32H\u001b[?12l\u001b[?25h" + ], + [ + 0.114158, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107mD\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m9\u001b[12;33H\u001b[?12l\u001b[?25h" + ], + [ + 0.141443, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m_\u001b[51;209H\u001b[38;5;22m\u001b[48;5;117m30\u001b[12;34H\u001b[?12l\u001b[?25h" + ], + [ + 0.23065, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107mO\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m1\u001b[12;35H\u001b[?12l\u001b[?25h" + ], + [ + 0.144279, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107mP\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m2\u001b[12;36H\u001b[?12l\u001b[?25h" + ], + [ + 0.096025, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107mT\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m3\u001b[12;37H\u001b[?12l\u001b[?25h" + ], + [ + 0.093663, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107mI\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m4\u001b[12;38H\u001b[?12l\u001b[?25h" + ], + [ + 0.079633, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107mO\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m5\u001b[12;39H\u001b[?12l\u001b[?25h" + ], + [ + 0.081562, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107mN\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m6\u001b[12;40H\u001b[?12l\u001b[?25h" + ], + [ + 0.084293, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107mS\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m7\u001b[12;41H\u001b[?12l\u001b[?25h" + ], + [ + 0.137772, + "\u001b[?25l\u001b[51;210H8\u001b[12;42H\u001b[?12l\u001b[?25h" + ], + [ + 0.094796, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107mr\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m9\u001b[12;43H\u001b[?12l\u001b[?25h" + ], + [ + 0.14112, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107mm\u001b[51;209H\u001b[38;5;22m\u001b[48;5;117m40\u001b[12;44H\u001b[?12l\u001b[?25h" + ], + [ + 0.100405, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107mi\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m1\u001b[12;45H\u001b[?12l\u001b[?25h" + ], + [ + 0.104584, + "\u001b[?25l\u001b[51;210H2\u001b[12;46H\u001b[?12l\u001b[?25h" + ], + [ + 0.138653, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m$\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m3\u001b[12;47H\u001b[?12l\u001b[?25h" + ], + [ + 0.344074, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[12;46H\u001b[K\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m2\u001b[12;46H\u001b[?12l\u001b[?25h" + ], + [ + 0.199704, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\"\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m3\u001b[12;47H\u001b[?12l\u001b[?25h" + ], + [ + 0.127088, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m$\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m4\u001b[12;48H\u001b[?12l\u001b[?25h" + ], + [ + 0.143183, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107mK\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m5\u001b[12;49H\u001b[?12l\u001b[?25h" + ], + [ + 0.328141, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[12;48H\u001b[K\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m4\u001b[12;48H\u001b[?12l\u001b[?25h" + ], + [ + 0.170702, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107mI\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m5\u001b[12;49H\u001b[?12l\u001b[?25h" + ], + [ + 0.084435, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107mM\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m6\u001b[12;50H\u001b[?12l\u001b[?25h" + ], + [ + 0.098537, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107mA\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m7\u001b[12;51H\u001b[?12l\u001b[?25h" + ], + [ + 0.163497, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107mG\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m8\u001b[12;52H\u001b[?12l\u001b[?25h" + ], + [ + 0.105928, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107mE\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m9\u001b[12;53H\u001b[?12l\u001b[?25h" + ], + [ + 0.145464, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[12;46H\u001b[36m\"$IMAGE\"\u001b[m\u001b[93m\u001b[107m\u001b[51;209H\u001b[38;5;22m\u001b[48;5;117m50\u001b[12;54H\u001b[?12l\u001b[?25h" + ], + [ + 0.391443, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[52;1H\u001b[K" + ], + [ + 0.007246, + "\u001b[51;1H\u001b[1m\u001b[38;5;22m\u001b[48;5;148m NORMAL \u001b[m\u001b[93m\u001b[107m\u001b[38;5;231m\u001b[48;5;31m\u001b[m\u001b[93m\u001b[107m\u001b[51;9H\u001b[38;5;148m\u001b[48;5;240m\u001b[51;10H \u001b[m\u001b[93m\u001b[107m\u001b[38;5;250m\u001b[48;5;240m\u001b[51;12H kpod-test-refactor \u001b[m\u001b[93m\u001b[107m\u001b[38;5;245m\u001b[48;5;240m\u001b[51;33H \u001b[m\u001b[93m\u001b[107m\u001b[38;5;250m\u001b[48;5;240mtest/\u001b[m\u001b[93m\u001b[107m\u001b[1m\u001b[38;5;231m\u001b[48;5;240mkpod_push.bats\u001b[m\u001b[93m\u001b[107m\u001b[1m\u001b[38;5;220m\u001b[48;5;31m \u001b[m\u001b[93m\u001b[107m\b\u001b[1m\u001b[38;5;220m\u001b[48;5;240m + \u001b[m\u001b[93m\u001b[107m\u001b[38;5;31m\u001b[48;5;24m\u001b[m\u001b[93m\u001b[107m\u001b[51;56H\u001b[38;5;240m\u001b[48;5;236m\u001b[51;57H \u001b[m\u001b[93m\u001b[107m\u001b[38;5;231m\u001b[48;5;236m                                                                                                                    \u001b[m\u001b[93m\u001b[107m\u001b[38;5;247m\u001b[48;5;236munix\u001b[m\u001b[93m\u001b[107m\u001b[38;5;244m\u001b[48;5;236m \u001b[m\u001b[93m\u001b[107m\u001b[51;180H\u001b[38;5;247m\u001b[48;5;236m utf-8\u001b[m\u001b[93m\u001b[107m\u001b[38;5;244m\u001b[48;5;236m \u001b[m\u001b[93m\u001b[107m\u001b[51;188H\u001b[38;5;247m\u001b[48;5;236m conf\u001b" + ], + [ + 2.4e-05, + "[m\u001b[93m\u001b[107m\u001b[38;5;240m\u001b[48;5;236m \u001b[m\u001b[93m\u001b[107m\u001b[51;195H\u001b[38;5;107m\u001b[48;5;240m  26%\u001b[m\u001b[93m\u001b[107m\u001b[38;5;252m\u001b[48;5;240m \u001b[m\u001b[93m\u001b[107m\u001b[51;202H\u001b[38;5;235m\u001b[48;5;252m \u001b[51;204H \u001b[m\u001b[93m\u001b[107m\u001b[1m\u001b[38;5;235m\u001b[48;5;252m 23\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;117m:\u001b[m\u001b[93m\u001b[107m\b\u001b[38;5;22m\u001b[48;5;252m:49 \u001b[12;53H\u001b[?12l\u001b[?25h" + ], + [ + 0.297107, + "\u001b[?25l\u001b[52;1H\u001b[m\u001b[93m\u001b[107m:\u001b[?2004h\u001b[?12l\u001b[?25h" + ], + [ + 0.311391, + "w\u001b[?25l\u001b[?12l\u001b[?25h" + ], + [ + 0.071982, + "q" + ], + [ + 7.5e-05, + "\u001b[?25l\u001b[?12l\u001b[?25h" + ], + [ + 0.127973, + "\r" + ], + [ + 0.000142, + "\u001b[?25l\u001b[?2004l" + ], + [ + 0.000165, + "\"test/kpod_push.bats\"" + ], + [ + 0.006449, + " 87L, 2372C written" + ], + [ + 0.013487, + "\r\r\r\n\u001b[39;49m\u001b[?2004l\u001b[?1l\u001b>\u001b[?12l\u001b[?25h\u001b[?1049l" + ], + [ + 0.002115, + "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r" + ], + [ + 0.022207, + "\r\n\u001b[34m\u001b[01mcri-o\u001b[22m \u001b[90mgit/kpod-test-refactor* \u001b[39m \u001b[33m25s\u001b[39m\r\n" + ], + [ + 0.000932, + "\u001b]7;file://localhost.localdomain/home/ryan/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007" + ], + [ + 0.000102, + "\u001b]2;ryan@localhost: ~/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007\u001b]1;..cubator/cri-o\u0007" + ], + [ + 0.000173, + "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[35m❯\u001b[39m \u001b[K\u001b[208C\u001b[90m\u001b[39m\u001b[208D" + ], + [ + 6.1e-05, + "\u001b[?1h\u001b=" + ], + [ + 1.9e-05, + "\u001b[?2004h" + ], + [ + 0.394575, + "g" + ], + [ + 0.216017, + "\bgi" + ], + [ + 0.088382, + "t" + ], + [ + 0.103545, + " " + ], + [ + 0.128191, + "c" + ], + [ + 0.000178, + "o" + ], + [ + 0.079694, + "m" + ], + [ + 0.279792, + "m" + ], + [ + 0.248528, + "i" + ], + [ + 0.111816, + "t" + ], + [ + 0.087626, + " " + ], + [ + 0.128727, + "-" + ], + [ + 0.095251, + "a" + ], + [ + 0.096123, + " " + ], + [ + 0.104484, + "-" + ], + [ + 0.143571, + "-" + ], + [ + 0.087942, + "a" + ], + [ + 0.104175, + "m" + ], + [ + 0.112113, + "e" + ], + [ + 0.103848, + "n" + ], + [ + 0.112584, + "d" + ], + [ + 0.247762, + "\u001b[?1l\u001b>" + ], + [ + 0.000208, + "\u001b[?2004l\r\r\n" + ], + [ + 0.005064, + "\u001b]2;git commit -a --amend\u0007\u001b]1;git\u0007" + ], + [ + 0.032749, + "\u001b[?2004h\u001b[?1049h\u001b[?1h\u001b=\u001b[?2004h" + ], + [ + 0.000317, + "\u001b[1;52r\u001b[?12;25h\u001b[?12l\u001b[?25h\u001b[27m\u001b[23m\u001b[m\u001b[H\u001b[2J\u001b[?25l\u001b[52;1H\"~/Development/Go/src/github.com/kubernetes-incubator/cri-o/.git/COMMIT_EDITMSG\"" + ], + [ + 5.3e-05, + " 24L, 716C" + ], + [ + 0.000154, + "\u001b[1;1HRefactor kpod tests\r\n\r\nMove kpod tests from kpod.bats to kpod_[commandname].bats\r\n\r\nSigned-off-by: Ryan Cole \r\n\r\n# Please enter the commit message for your changes. Lines starting\r\n# with '#' will be ignored, and an empty message aborts the commit.\r\n#\r\n# Date: Mon Aug 14 09:15:22 2017 -0400\r\n#\r\n# On branch kpod-test-refactor\r\n# Changes to be committed:\r\n#\u001b[7Cdeleted: test/kpod.bats\r\n#\u001b[7Cmodified: test/kpod_diff.bats\r\n#\u001b[7Cnew file: test/kpod_history.bats\r\n#\u001b[7Cnew file: test/kpod_images.bats\r\n#\u001b[7Cnew file: test/kpod_inspect.bats\r\n#\u001b[7Cmodified: test/kpod_load.bats\r\n#\u001b[7Cnew file: test/kpod_pull.bats\r\n#\u001b[7Cnew file: test/kpod_push.bats\r\n#\u001b[7Cmodified: test/kpod_save.bats\r\n#\u001b[7Cnew file: test/kpod_version.bats\r\n#\r\n\u001b[94m~ \u001b[26;1H~ " + ], + [ + 2.5e-05, + " \u001b[27;1H~ \u001b[28;1H~ \u001b[29;1H~ \u001b[30;1H~ " + ], + [ + 5.1e-05, + " \u001b[31;1H~ \u001b[32;1H~ \u001b[33;1H~ \u001b[34;1H~ \u001b[35;1H~ " + ], + [ + 1.9e-05, + " \u001b[36;1H~ \u001b[37;1H~ \u001b[38;1H~ \u001b[39;1H~ \u001b[40;1H~ " + ], + [ + 1.7e-05, + " \u001b[41;1H~ \u001b[42;1H~ \u001b[43;1H~ \u001b[44;1H~ " + ], + [ + 1.6e-05, + " \u001b[45;1H~ \u001b[46;1H~ \u001b[47;1H~ \u001b[48;1H~ \u001b[49;1H~ " + ], + [ + 1.8e-05, + " \u001b[50;1H~ \u001b[51;1H~ \u001b[1;1H\u001b[?12l\u001b[?25h" + ], + [ + 0.25699, + "\u001b[?25l\u001b[m\u001b[52;1H\u001b[K\u001b[52;1H:\u001b[?2004h\u001b[?12l\u001b[?25h" + ], + [ + 0.159615, + "w" + ], + [ + 0.06399, + "q" + ], + [ + 0.072292, + "\r\u001b[?25l\u001b[?2004l\".git/COMMIT_EDITMSG\"" + ], + [ + 0.006984, + " 24L, 716C written" + ], + [ + 0.000191, + "\r\r\r\n\u001b[?2004l\u001b[?1l\u001b>\u001b[?12l\u001b[?25h\u001b[?1049l" + ], + [ + 0.004761, + "[kpod-test-refactor 72c6c49b] Refactor kpod tests\r\n Date: Mon Aug 14 09:15:22 2017 -0400\r\n 10 files changed, 335 insertions(+), 253 deletions(-)\r\n delete mode 100644 test/kpod.bats\r\n create mode 100644 test/kpod_history.bats\r\n create mode 100644 test/kpod_images.bats\r\n create mode 100644 test/kpod_inspect.bats\r\n create mode 100644 test/kpod_pull.bats\r\n create mode 100644 test/kpod_push.bats\r\n create mode 100644 test/kpod_version.bats\r\n\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r" + ], + [ + 0.02706, + "\r\n\u001b[34m\u001b[01mcri-o\u001b[22m \u001b[90mgit/kpod-test-refactor \u001b[39m \u001b[33m\u001b[39m\r\n" + ], + [ + 0.003213, + "\u001b]7;file://localhost.localdomain/home/ryan/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007" + ], + [ + 0.000199, + "\u001b]2;ryan@localhost: ~/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007" + ], + [ + 1.9e-05, + "\u001b]1;..cubator/cri-o\u0007" + ], + [ + 0.000122, + "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[35m❯\u001b[39m \u001b[K\u001b[208C\u001b[90m\u001b[39m\u001b[208D" + ], + [ + 5.3e-05, + "\u001b[?1h\u001b=" + ], + [ + 2.6e-05, + "\u001b[?2004h" + ], + [ + 0.141189, + "g" + ], + [ + 0.128024, + "\bgi" + ], + [ + 0.071759, + "t" + ], + [ + 0.10427, + " " + ], + [ + 0.096092, + "p" + ], + [ + 0.09589, + "u" + ], + [ + 0.112424, + "s" + ], + [ + 0.1201, + "h" + ], + [ + 0.111109, + " " + ], + [ + 0.088607, + "-" + ], + [ + 0.119704, + "f" + ], + [ + 0.128014, + " " + ], + [ + 0.11191, + "o" + ], + [ + 0.112657, + "r" + ], + [ + 0.103811, + "i" + ], + [ + 0.119689, + "g" + ], + [ + 0.096661, + "i" + ], + [ + 0.039472, + "n" + ], + [ + 0.095541, + " " + ], + [ + 0.12086, + "k" + ], + [ + 0.085614, + "pod-" + ], + [ + 0.185148, + "t" + ], + [ + 0.048017, + "e" + ], + [ + 0.205899, + "st-refactor\u001b[1m \u001b[0m" + ], + [ + 0.179325, + "\b\u001b[0m r" + ], + [ + 0.112012, + "e" + ], + [ + 0.271558, + "\b \b" + ], + [ + 0.127775, + "\b \b" + ], + [ + 0.160077, + "\b" + ], + [ + 0.144317, + "\b \b" + ], + [ + 0.455941, + "r" + ], + [ + 0.336133, + "\u001b[?1l\u001b>" + ], + [ + 0.001355, + "\u001b[?2004l\r\r\n" + ], + [ + 0.003918, + "\u001b]2;git push -f origin kpod-test-refactor\u0007\u001b]1;git\u0007" + ], + [ + 1.183521, + "Counting objects: 12, done.\r\n" + ], + [ + 0.000161, + "Delta compression using up to 4 threads.\r\n" + ], + [ + 8.9e-05, + "Compressing objects: 8% (1/12) \rCompressing objects: 16% (2/12) \r" + ], + [ + 0.00016, + "Compressing objects: 25% (3/12) \r" + ], + [ + 2.3e-05, + "Compressing objects: 33% (4/12) \r" + ], + [ + 3.7e-05, + "Compressing objects: 41% (5/12) \r" + ], + [ + 6.9e-05, + "Compressing objects: 50% (6/12) \r" + ], + [ + 0.000102, + "Compressing objects: 58% (7/12) \r" + ], + [ + 5.4e-05, + "Compressing objects: 66% (8/12) \r" + ], + [ + 8.2e-05, + "Compressing objects: 75% (9/12) \r" + ], + [ + 5.7e-05, + "Compressing objects: 83% (10/12) \r" + ], + [ + 5.8e-05, + "Compressing objects: 91% (11/12) \r" + ], + [ + 5.4e-05, + "Compressing objects: 100% (12/12) \r" + ], + [ + 4.4e-05, + "Compressing objects: 100% (12/12), done.\r\n" + ], + [ + 0.000167, + "Writing objects: 8% (1/12) \r" + ], + [ + 5.7e-05, + "Writing objects: 16% (2/12) \r" + ], + [ + 0.000171, + "Writing objects: 25% (3/12) \r" + ], + [ + 5e-05, + "Writing objects: 33% (4/12) \r" + ], + [ + 0.000129, + "Writing objects: 41% (5/12) \r" + ], + [ + 0.000182, + "Writing objects: 58% (7/12) \r" + ], + [ + 5.9e-05, + "Writing objects: 66% (8/12) \r" + ], + [ + 7e-05, + "Writing objects: 75% (9/12) \r" + ], + [ + 7.9e-05, + "Writing objects: 83% (10/12) \r" + ], + [ + 3.8e-05, + "Writing objects: 91% (11/12) \r" + ], + [ + 4.3e-05, + "Writing objects: 100% (12/12) \r" + ], + [ + 4.1e-05, + "Writing objects: 100% (12/12), 2.57 KiB | 2.57 MiB/s, done.\r\nTotal 12 (delta 9), reused 0 (delta 0)\r\n" + ], + [ + 0.086353, + "remote: Resolving deltas: 0% (0/9) \u001b[K\r" + ], + [ + 0.040457, + "remote: Resolving deltas: 22% (2/9) \u001b[K\rremote: Resolving deltas: 44% (4/9) \u001b[K\rremote: Resolving deltas: 55% (5/9) \u001b[K\rremote: Resolving deltas: 66% (6/9) \u001b[K\rremote: Resolving deltas: 77% (7/9) \u001b[K\rremote: Resolving deltas: 88% (8/9) \u001b[K\rremote: Resolving deltas: 100% (9/9) \u001b[K\rremote: Resolving deltas: 100% (9/9), completed with 5 local objects.\u001b[K\r\n" + ], + [ + 1.343638, + "To github.com:14rcole/cri-o\r\n + 9327604d...72c6c49b kpod-test-refactor -> kpod-test-refactor (forced update)\r\n" + ], + [ + 0.003519, + "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r" + ], + [ + 0.027554, + "\r\n\u001b[34m\u001b[01mcri-o\u001b[22m \u001b[90mgit/kpod-test-refactor \u001b[39m \u001b[33m\u001b[39m\r\n" + ], + [ + 0.002119, + "\u001b]7;file://localhost.localdomain/home/ryan/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007" + ], + [ + 0.000223, + "\u001b]2;ryan@localhost: ~/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007\u001b]1;..cubator/cri-o\u0007" + ], + [ + 2.1e-05, + "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[35m❯\u001b[39m \u001b[K\u001b[208C\u001b[90m\u001b[39m\u001b[208D" + ], + [ + 8.9e-05, + "\u001b[?1h\u001b=" + ], + [ + 3.1e-05, + "\u001b[?2004h" + ], + [ + 73.029405, + "g" + ], + [ + 0.116068, + "\bgi" + ], + [ + 0.083652, + "t" + ], + [ + 0.111933, + " " + ], + [ + 0.116198, + "c" + ], + [ + 0.095668, + "h" + ], + [ + 0.100371, + "e" + ], + [ + 0.075276, + "c" + ], + [ + 0.069067, + "k" + ], + [ + 0.155349, + "o" + ], + [ + 0.080863, + "u" + ], + [ + 0.107261, + "t" + ], + [ + 0.143931, + " " + ], + [ + 6.94391, + "k" + ], + [ + 0.367099, + "pod-" + ], + [ + 0.46577, + "r" + ], + [ + 0.096061, + "e" + ], + [ + 0.095387, + "n" + ], + [ + 0.18511, + "ame\u001b[1m \u001b[0m" + ], + [ + 0.335066, + "\b\u001b[0m \b" + ], + [ + 0.00018, + "\u001b[?1l\u001b>" + ], + [ + 8.1e-05, + "\u001b[?2004l\r\r\n" + ], + [ + 0.004082, + "\u001b]2;git checkout kpod-rename\u0007\u001b]1;git\u0007" + ], + [ + 0.040772, + "Switched to branch 'kpod-rename'\r\n" + ], + [ + 0.000659, + "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r" + ], + [ + 0.028625, + "\r\n\u001b[34m\u001b[01mcri-o\u001b[22m \u001b[90mgit/kpod-rename \u001b[39m \u001b[33m\u001b[39m\r\n" + ], + [ + 0.002148, + "\u001b]7;file://localhost.localdomain/home/ryan/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007" + ], + [ + 8.7e-05, + "\u001b]2;ryan@localhost: ~/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007\u001b]1;..cubator/cri-o\u0007" + ], + [ + 0.000293, + "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[35m❯\u001b[39m \u001b[K\u001b[208C\u001b[90m\u001b[39m\u001b[208D" + ], + [ + 5.1e-05, + "\u001b[?1h\u001b=" + ], + [ + 2.6e-05, + "\u001b[?2004h" + ], + [ + 2.266962, + "2" + ], + [ + 0.199874, + "\b27" + ], + [ + 0.248374, + "G" + ], + [ + 0.479833, + "\b \b" + ], + [ + 0.151084, + "\b\b2 \b" + ], + [ + 0.168998, + "\b \b" + ], + [ + 0.976089, + "v" + ], + [ + 0.102867, + "\bvi" + ], + [ + 0.05621, + " " + ], + [ + 0.096671, + "t" + ], + [ + 0.072195, + "e" + ], + [ + 0.167866, + "t" + ], + [ + 0.199366, + "k" + ], + [ + 0.351527, + "\b \b" + ], + [ + 0.113612, + "\u0007" + ], + [ + 0.454797, + "\b \b" + ], + [ + 0.11181, + "s" + ], + [ + 0.178442, + "t\u001b[1m/\u001b[0m" + ], + [ + 0.39881, + "\b\u001b[0m/k" + ], + [ + 0.096645, + "pod" + ], + [ + 0.622458, + "\b \b" + ], + [ + 0.616269, + "f" + ], + [ + 0.424159, + "\b \b" + ], + [ + 0.136035, + "d" + ], + [ + 0.191761, + "_" + ], + [ + 0.255541, + "r" + ], + [ + 0.096112, + "e" + ], + [ + 0.224777, + "n" + ], + [ + 0.139367, + "ame.bats\u001b[1m \u001b[0m" + ], + [ + 0.909463, + "\b\u001b[0m \b\u001b[?1l\u001b>\u001b[?2004l\r\r\n" + ], + [ + 0.001881, + "\u001b]2;vim test/kpod_rename.bats\u0007\u001b]1;vi\u0007" + ], + [ + 0.132692, + "\u001b[?2004h\u001b[?1049h\u001b[?1h\u001b=\u001b[?2004h" + ], + [ + 0.000558, + "\u001b[1;52r\u001b[?12;25h\u001b[?12l\u001b[?25h\u001b[27m\u001b[23m\u001b[m\u001b[93m\u001b[107m\u001b[H\u001b[2J\u001b[?25l\u001b[52;1H\"test/kpod_rename.bats\"" + ], + [ + 0.000156, + " 35L, 907C" + ], + [ + 0.003097, + "\u001b[2;1H▽\u001b[6n\u001b[2;1H \u001b[1;1H\u001b[>c" + ], + [ + 0.000674, + "\u001b[1;1H\u001b[96m\u001b[47m 1 \u001b[m\u001b[93m\u001b[107m\u001b[96m#!/usr/bin/env bats\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m 2 \r\n 3 \u001b[m\u001b[93m\u001b[107mload helpers\r\n\u001b[96m\u001b[47m 4 \r\n 5 \u001b[m\u001b[93m\u001b[107mIMAGE=\u001b[36m\"redis:alpine\"\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m 6 \u001b[m\u001b[93m\u001b[107mROOT=\u001b[36m\"$TESTDIR/crio\"\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m 7 \u001b[m\u001b[93m\u001b[107mRUNROOT=\u001b[36m\"$TESTDIR/crio-run\"\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m 8 \u001b[m\u001b[93m\u001b[107mKPOD_OPTIONS=\u001b[36m\"--root $ROOT --runroot $RUNROOT $STORAGE_OPTS\"\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m 9 \u001b[m\u001b[93m\u001b[107mNEW_NAME=\u001b[36m\"rename-test\"\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m 10 \r\n 11 \u001b[m\u001b[93m\u001b[107mfunction teardown() {\r\n\u001b[96m\u001b[47m 12 \u001b[m\u001b[93m\u001b[107m cleanup_test\r\n\u001b[96m\u001b[47m 13 \u001b[m\u001b[93m\u001b[107m}\r\n\u001b[96m\u001b[47m 14 \r\n 15 \u001b[m\u001b[93m\u001b[107m@test \u001b[36m\"kpod rename successful\"\u001b[m\u001b[93m\u001b[107m {\r\n\u001b[96m\u001b[47m 16 \u001b[m\u001b[93m\u001b[107m start_crio\r\n\u001b[96m\u001b[47m 17 \u001b[m\u001b[93m\u001b[107m run ${KPOD_BINARY} ${KPOD_OPTIONS} pull $IMAGE\r\n\u001b[96m\u001b[47m 18 \u001b[m\u001b[93m\u001b[107m [ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\r\n\u001b[96m\u001b[47m 19 \u001b[m\u001b[93m\u001b[107m run crioctl pod run --config \u001b[36m\"$TESTDATA\"\u001b[m\u001b[93m" + ], + [ + 1.2e-05, + "\u001b[107m/sandbox_config.json\r\n\u001b[96m\u001b[47m 20 \u001b[m\u001b[93m\u001b[107m echo \u001b[36m\"$output\"\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m 21 \u001b[m\u001b[93m\u001b[107m pod_id=\u001b[36m\"$output\"\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m 22 \u001b[m\u001b[93m\u001b[107m [ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\r\n\u001b[96m\u001b[47m 23 \u001b[m\u001b[93m\u001b[107m run ${OCIC_BINARY} ctr create --config \u001b[36m\"$TESTDATA\"\u001b[m\u001b[93m\u001b[107m/container_config.json --pod \u001b[36m\"$pod_id\"\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m 24 \u001b[m\u001b[93m\u001b[107m ctr_id=\u001b[36m\"$output\"\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m 25 \u001b[m\u001b[93m\u001b[107m run ${KPOD_BINARY} $KPOD_OPTIONS rename \u001b[36m\"$ctr_id\"\u001b[m\u001b[93m\u001b[107m \u001b[36m\"$NEW_NAME\"\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m 26 \u001b[m\u001b[93m\u001b[107m echo \u001b[36m\"$output\"\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m 27 \u001b[m\u001b[93m\u001b[107m [ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\r\n\u001b[96m\u001b[47m 28 \u001b[m\u001b[93m\u001b[107m run ${KPOD_BINARY} $KPOD_OPTIONS inspect \u001b[36m\"$ctr_id\"\u001b[m\u001b[93m\u001b[107m --format {{.Name}}\r\n\u001b[96m\u001b[47m 29 \u001b[m\u001b[93m\u001b[107m echo \u001b[36m\"$output\"\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m 30 \u001b[m\u001b[93m\u001b[107m [ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\r\n\u001b[96m\u001b[47m 31 " + ], + [ + 7.9e-05, + "\u001b[m\u001b[93m\u001b[107m [ \u001b[36m\"$output\"\u001b[m\u001b[93m\u001b[107m == \u001b[36m\"$NEW_NAME\"\u001b[m\u001b[93m\u001b[107m ]\r\n\u001b[96m\u001b[47m 32 \u001b[m\u001b[93m\u001b[107m cleanup_ctrs\r\n\u001b[96m\u001b[47m 33 \u001b[m\u001b[93m\u001b[107m cleanup_pods\r\n\u001b[96m\u001b[47m 34 \u001b[m\u001b[93m\u001b[107m stop_crio\r\n\u001b[96m\u001b[47m 35 \u001b[m\u001b[93m\u001b[107m}\r\n\u001b[1m\u001b[94m~ \u001b[37;1H~ \u001b[38;1H~ \u001b[39;1H~ " + ], + [ + 1.1e-05, + " \u001b[40;1H~ \u001b[41;1H~ \u001b[42;1H~ \u001b[43;1H~ \u001b[44;1H~ " + ], + [ + 0.029235, + " \u001b[45;1H~ \u001b[46;1H~ \u001b[47;1H~ \u001b[48;1H~ " + ], + [ + 9.4e-05, + " \u001b[49;1H~ \u001b[50;1H~ \u001b[m\u001b[93m\u001b[107m\u001b[51;1H\u001b[1m\u001b[38;5;22m\u001b[48;5;148m NORMAL \u001b[m\u001b[93m\u001b[107m\u001b[38;5;148m\u001b[48;5;240m\u001b[51;10H \u001b[m\u001b[93m\u001b[107m\u001b[38;5;250m\u001b[48;5;240m\u001b[51;12H kpod-rename \u001b[m\u001b[93m\u001b[107m\u001b[38;5;245m\u001b[48;5;240m\u001b[51;26H \u001b[m\u001b[93m\u001b[107m\u001b[38;5;250m\u001b[48;5;240mtest/\u001b[m\u001b[93m\u001b[107m\u001b[1m\u001b[38;5;231m\u001b[48;5;240mkpod_rename.bats \u001b[m\u001b[93m\u001b[107m\u001b[38;5;240m\u001b[48;5;236m\u001b[51;50H \u001b[m\u001b[93m\u001b[107m\u001b[38;5;231m\u001b[48;5;236m                                                                            " + ], + [ + 0.011325, + "                                               \u001b[m\u001b[93m\u001b[107m\u001b[38;5;247m\u001b[48;5;236munix\u001b[m\u001b[93m\u001b[107m\u001b[38;5;244m\u001b[48;5;236m \u001b[m\u001b[93m\u001b[107m\u001b[51;180H\u001b[38;5;247m\u001b[48;5;236m utf-8\u001b[m\u001b[93m\u001b[107m\u001b[38;5;244m\u001b[48;5;236m \u001b[m\u001b[93m\u001b[107m\u001b[51;188H\u001b[38;5;247m\u001b[48;5;236m conf\u001b[m\u001b[93m\u001b[107m\u001b[38;5;240m\u001b[48;5;236m \u001b[m\u001b[93m\u001b[107m\u001b[51;195H\u001b[38;5;107m\u001b[48;5;240m  54%\u001b[m\u001b[93m\u001b[107m\u001b[38;5;252m\u001b[48;5;240m \u001b[m\u001b[93m\u001b[107m\u001b[51;202H\u001b[38;5;235m\u001b[48;5;252m \u001b[51;204H \u001b[m\u001b[93m\u001b[107m\u001b[1m\u001b[38;5;235m\u001b[48;5;252m 19\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:5  \u001b[19;9H\u001b[?12l\u001b[?25h\u001bP+q436f\u001b\\\u001bP+q6b75\u001b\\\u001bP+q6b64\u001b\\\u001bP+q6b72\u001b\\\u001bP+q6b6c\u001b\\\u001bP+q2332\u001b\\\u001bP+q2334\u001b\\\u001bP+q2569\u001b\\\u001bP+q2a37\u001b\\\u001bP+q6b31\u001b\\" + ], + [ + 2.388427, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[27;9H\u001b[1m\u001b[31m\u001b[106m[\u001b[17C]\u001b[m\u001b[93m\u001b[107m\u001b[51;195H\u001b[38;5;108m\u001b[48;5;240m  77%\u001b[m\u001b[93m\u001b[107m\u001b[6C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m27\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[27;9H\u001b[?12l\u001b[?25h" + ], + [ + 2.299389, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m[ \u001b[16C]\u001b[51;195H\u001b[38;5;108m\u001b[48;5;240m  74%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m6\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[26;9H\u001b[?12l\u001b[?25h" + ], + [ + 0.528255, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[27;9H\u001b[1m\u001b[31m\u001b[106m[\u001b[17C]\u001b[m\u001b[93m\u001b[107m\u001b[51;195H\u001b[38;5;108m\u001b[48;5;240m  77%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m7\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[27;9H\u001b[?12l\u001b[?25h" + ], + [ + 0.321714, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m[ \u001b[16C]\u001b[51;195H\u001b[38;5;108m\u001b[48;5;240m  74%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m6\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[26;9H\u001b[?12l\u001b[?25h" + ], + [ + 0.403252, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[51;195H\u001b[38;5;108m\u001b[48;5;240m  71%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m5\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[25;9H\u001b[?12l\u001b[?25h" + ], + [ + 0.215177, + "\u001b[m\u001b[93m\u001b[107m\u001b[51;195H\u001b[38;5;108m\u001b[48;5;240m  74%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m6\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[26;9H" + ], + [ + 27.227284, + "\u001b[m\u001b[93m\u001b[107m\u001b[51;195H\u001b[38;5;108m\u001b[48;5;240m  71%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m5\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[25;9H" + ], + [ + 0.172124, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[51;195H\u001b[38;5;108m\u001b[48;5;240m  69%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m4\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[24;9H\u001b[?12l\u001b[?25h" + ], + [ + 0.422664, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[51;195H\u001b[38;5;108m\u001b[48;5;240m  66%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m3\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[23;9H\u001b[?12l\u001b[?25h" + ], + [ + 0.245489, + "\u001b[51;209H4\u001b[23;8H" + ], + [ + 0.280877, + "\u001b[51;209H5\u001b[23;9H" + ], + [ + 0.495366, + "\u001b[51;209H6\u001b[23;10H" + ], + [ + 0.032687, + "\u001b[51;209H7\u001b[23;11H" + ], + [ + 0.030514, + "\u001b[51;209H8\u001b[23;12H" + ], + [ + 0.031651, + "\u001b[51;209H9\u001b[23;13H" + ], + [ + 0.033388, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m$\u001b[1m\u001b[31m\u001b[106m{\u001b[11C}\u001b[m\u001b[93m\u001b[107m\u001b[51;209H\u001b[38;5;22m\u001b[48;5;252m10\u001b[23;14H\u001b[?12l\u001b[?25h" + ], + [ + 0.027913, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m{O\u001b[10C} \u001b[51;210H\u001b[38;5;22m\u001b[48;5;252m1\u001b[23;15H\u001b[?12l\u001b[?25h" + ], + [ + 0.155223, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\b\u001b[1m\u001b[31m\u001b[106m{\u001b[11C}\u001b[m\u001b[93m\u001b[107m\u001b[51;210H\u001b[38;5;22m\u001b[48;5;252m0\u001b[23;14H\u001b[?12l\u001b[?25h" + ], + [ + 0.174127, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m{O\u001b[10C} \u001b[51;209H\u001b[38;5;22m\u001b[48;5;252m9 \u001b[23;13H\u001b[?12l\u001b[?25h" + ], + [ + 0.191338, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[1m\u001b[31m\u001b[106m{\u001b[m\u001b[93m\u001b[107mOCIC_BINARY\u001b[1m\u001b[31m\u001b[106m}\u001b[m\u001b[93m\u001b[107m ctr create --config \u001b[36m\"$TESTDATA\"\u001b[m\u001b[93m\u001b[107m/container_config.json --pod \u001b[36m\"$pod_id\"\u001b[m\u001b[93m\u001b[107m\u001b[23;96H\u001b[K\u001b[51;48H\u001b[1m\u001b[38;5;220m\u001b[48;5;240m + \u001b[m\u001b[93m\u001b[107m\u001b[38;5;240m\u001b[48;5;236m\u001b[51;52H \u001b[23;13H\u001b[?12l\u001b[?25h" + ], + [ + 0.500617, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107mOCIC_BINARY} ctr create --config \u001b[36m\"$TESTDATA\"\u001b[m\u001b[93m\u001b[107m/container_config.json --pod \u001b[36m\"$pod_id\"\u001b[m\u001b[93m\u001b[107m\u001b[23;95H\u001b[K\u001b[23;13H\u001b[?12l\u001b[?25h" + ], + [ + 0.021176, + "\u001b[?25lCIC_BINARY} ctr create --config \u001b[36m\"$TESTDATA\"\u001b[m\u001b[93m\u001b[107m/container_config.json --pod \u001b[36m\"$pod_id\"\u001b[m\u001b[93m\u001b[107m\u001b[23;94H\u001b[K\u001b[23;13H\u001b[?12l\u001b[?25h" + ], + [ + 0.035102, + "\u001b[?25lIC_BINARY} ctr create --config \u001b[36m\"$TESTDATA\"\u001b[m\u001b[93m\u001b[107m/container_config.json --pod \u001b[36m\"$pod_id\"\u001b[m\u001b[93m\u001b[107m\u001b[23;93H\u001b[K\u001b[23;13H\u001b[?12l\u001b[?25h" + ], + [ + 0.028745, + "\u001b[?25lC_BINARY} ctr create --config \u001b[36m\"$TESTDATA\"\u001b[m\u001b[93m\u001b[107m/container_config.json --pod \u001b[36m\"$pod_id\"\u001b[m\u001b[93m\u001b[107m\u001b[23;92H\u001b[K\u001b[23;13H\u001b[?12l\u001b[?25h" + ], + [ + 0.026326, + "\u001b[?25l_BINARY} ctr create --config \u001b[36m\"$TESTDATA\"\u001b[m\u001b[93m\u001b[107m/container_config.json --pod \u001b[36m\"$pod_id\"\u001b[m\u001b[93m\u001b[107m\u001b[23;91H\u001b[K\u001b[23;13H\u001b[?12l\u001b[?25h" + ], + [ + 0.034424, + "\u001b[?25lBINARY} ctr create --config \u001b[36m\"$TESTDATA\"\u001b[m\u001b[93m\u001b[107m/container_config.json --pod \u001b[36m\"$pod_id\"\u001b[m\u001b[93m\u001b[107m\u001b[23;90H\u001b[K\u001b[23;13H\u001b[?12l\u001b[?25h" + ], + [ + 0.029844, + "\u001b[?25lINARY} ctr create --config \u001b[36m\"$TESTDATA\"\u001b[m\u001b[93m\u001b[107m/container_config.json --pod \u001b[36m\"$pod_id\"\u001b[m\u001b[93m\u001b[107m\u001b[23;89H\u001b[K\u001b[23;13H\u001b[?12l\u001b[?25h" + ], + [ + 0.031125, + "\u001b[?25lNARY} ctr create --config \u001b[36m\"$TESTDATA\"\u001b[m\u001b[93m\u001b[107m/container_config.json --pod \u001b[36m\"$pod_id\"\u001b[m\u001b[93m\u001b[107m\u001b[23;88H\u001b[K\u001b[23;13H\u001b[?12l\u001b[?25h" + ], + [ + 0.03287, + "\u001b[?25lARY} ctr create --config \u001b[36m\"$TESTDATA\"\u001b[m\u001b[93m\u001b[107m/container_config.json --pod \u001b[36m\"$pod_id\"\u001b[m\u001b[93m\u001b[107m\u001b[23;87H\u001b[K\u001b[23;13H\u001b[?12l\u001b[?25h" + ], + [ + 0.196796, + "\u001b[?25lRY} ctr create --config \u001b[36m\"$TESTDATA\"\u001b[m\u001b[93m\u001b[107m/container_config.json --pod \u001b[36m\"$pod_id\"\u001b[m\u001b[93m\u001b[107m\u001b[23;86H\u001b[K\u001b[23;13H\u001b[?12l\u001b[?25h" + ], + [ + 0.182819, + "\u001b[?25lY} ctr create --config \u001b[36m\"$TESTDATA\"\u001b[m\u001b[93m\u001b[107m/container_config.json --pod \u001b[36m\"$pod_id\"\u001b[m\u001b[93m\u001b[107m\u001b[23;85H\u001b[K\u001b[23;13H\u001b[?12l\u001b[?25h" + ], + [ + 0.433786, + "\u001b[?25l\u001b[15;36H\u001b[1m\u001b[31m\u001b[106m{\u001b[23;13H}\u001b[m\u001b[93m\u001b[107m ctr create --config \u001b[36m\"$TESTDATA\"\u001b[m\u001b[93m\u001b[107m/container_config.json --pod \u001b[36m\"$pod_id\"\u001b[m\u001b[93m\u001b[107m\u001b[23;84H\u001b[K\u001b[23;13H\u001b[?12l\u001b[?25h" + ], + [ + 0.196117, + "\u001b[?25l\u001b[52;1H\u001b[34m-- INSERT --\u001b[m\u001b[93m\u001b[107m\u001b[52;13H\u001b[K" + ], + [ + 0.015372, + "\u001b[23;13H\u001b[1m\u001b[31m\u001b[106m \u001b[m\u001b[93m\u001b[107mctr create --config \u001b[36m\"$TESTDATA\"\u001b[m\u001b[93m\u001b[107m/container_config.json --pod \u001b[36m\"$pod_id\"\u001b[m\u001b[93m\u001b[107m\u001b[23;83H\u001b[K\u001b[15;36H{\u001b[23;13H c\u001b[51;1H\u001b[1m\u001b[38;5;23m\u001b[48;5;231m INSERT \u001b[m\u001b[93m\u001b[107m\u001b[38;5;148m\u001b[48;5;240m\u001b[m\u001b[93m\u001b[107m\u001b[51;9H\u001b[38;5;231m\u001b[48;5;31m\u001b[51;10H \u001b[m\u001b[93m\u001b[107m\u001b[38;5;117m\u001b[48;5;31m\u001b[51;12H kpod-rename \u001b[m\u001b[93m\u001b[107m\u001b[38;5;74m\u001b[48;5;31m\u001b[51;26H \u001b[m\u001b[93m\u001b[107m\u001b[38;5;117m\u001b[48;5;31mtest/\u001b[m\u001b[93m\u001b[107m\u001b[1m\u001b[38;5;231m\u001b[48;5;31mkpod_rename.bats\u001b[m\u001b[93m\u001b[107m\u001b[1m\u001b[38;5;220m\u001b[48;5;240m \u001b[m\u001b[93m\u001b[107m\b\u001b[1m\u001b[38;5;220m\u001b[48;5;31m + \u001b[m\u001b[93m\u001b[107m\u001b[38;5;240m\u001b[48;5;236m\u001b[m\u001b[93m\u001b[107m\u001b[51;51H\u001b[38;5;31m\u001b[48;5;24m\u001b[51;52H \u001b[m\u001b[93m\u001b[107m\u001b[38;5;231m\u001b[48;5;24m                                                                                                                         \u001b[m\u001b[93m\u001b[107m\u001b[38;5;117m\u001b[48;5;24munix\u001b[m\u001b[93m\u001b[107" + ], + [ + 4.8e-05, + "m\u001b[38;5;74m\u001b[48;5;24m \u001b[m\u001b[93m\u001b[107m\u001b[51;180H\u001b[38;5;117m\u001b[48;5;24m utf-8\u001b[m\u001b[93m\u001b[107m\u001b[38;5;74m\u001b[48;5;24m \u001b[m\u001b[93m\u001b[107m\u001b[51;188H\u001b[38;5;117m\u001b[48;5;24m conf\u001b[m\u001b[93m\u001b[107m\u001b[38;5;31m\u001b[48;5;24m \u001b[m\u001b[93m\u001b[107m\u001b[51;195H\u001b[38;5;186m\u001b[48;5;31m  66%\u001b[m\u001b[93m\u001b[107m\u001b[38;5;117m\u001b[48;5;31m \u001b[m\u001b[93m\u001b[107m\u001b[51;202H\u001b[38;5;24m\u001b[48;5;117m \u001b[51;204H \u001b[m\u001b[93m\u001b[107m\u001b[1m\u001b[38;5;24m\u001b[48;5;117m 23\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[m\u001b[93m\u001b[107m\b\u001b[38;5;22m\u001b[48;5;117m:9  \u001b[23;13H\u001b[?12l\u001b[?25h" + ], + [ + 0.860848, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107mc ctr create --config \u001b[36m\"$TESTDATA\"\u001b[m\u001b[93m\u001b[107m/container_config.json --pod \u001b[36m\"$pod_id\"\u001b[m\u001b[93m\u001b[107m\u001b[51;209H\u001b[38;5;22m\u001b[48;5;117m10\u001b[23;14H\u001b[?12l\u001b[?25h" + ], + [ + 0.195551, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107mr ctr create --config \u001b[36m\"$TESTDATA\"\u001b[m\u001b[93m\u001b[107m/container_config.json --pod \u001b[36m\"$pod_id\"\u001b[m\u001b[93m\u001b[107m\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m1\u001b[23;15H\u001b[?12l\u001b[?25h" + ], + [ + 0.048944, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107mi ctr create --config \u001b[36m\"$TESTDATA\"\u001b[m\u001b[93m\u001b[107m/container_config.json --pod \u001b[36m\"$pod_id\"\u001b[m\u001b[93m\u001b[107m\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m2\u001b[23;16H\u001b[?12l\u001b[?25h" + ], + [ + 0.106817, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107mo ctr create --config \u001b[36m\"$TESTDATA\"\u001b[m\u001b[93m\u001b[107m/container_config.json --pod \u001b[36m\"$pod_id\"\u001b[m\u001b[93m\u001b[107m\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m3\u001b[23;17H\u001b[?12l\u001b[?25h" + ], + [ + 0.070042, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107mc ctr create --config \u001b[36m\"$TESTDATA\"\u001b[m\u001b[93m\u001b[107m/container_config.json --pod \u001b[36m\"$pod_id\"\u001b[m\u001b[93m\u001b[107m\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m4\u001b[23;18H\u001b[?12l\u001b[?25h" + ], + [ + 0.207299, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107mt ctr create --config \u001b[36m\"$TESTDATA\"\u001b[m\u001b[93m\u001b[107m/container_config.json --pod \u001b[36m\"$pod_id\"\u001b[m\u001b[93m\u001b[107m\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m5\u001b[23;19H\u001b[?12l\u001b[?25h" + ], + [ + 0.084867, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107ml ctr create --config \u001b[36m\"$TESTDATA\"\u001b[m\u001b[93m\u001b[107m/container_config.json --pod \u001b[36m\"$pod_id\"\u001b[m\u001b[93m\u001b[107m\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m6\u001b[23;20H\u001b[?12l\u001b[?25h" + ], + [ + 0.230817, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[52;1H\u001b[K" + ], + [ + 0.005085, + "\u001b[51;1H\u001b[1m\u001b[38;5;22m\u001b[48;5;148m NORMAL \u001b[m\u001b[93m\u001b[107m\u001b[38;5;231m\u001b[48;5;31m\u001b[m\u001b[93m\u001b[107m\u001b[51;9H\u001b[38;5;148m\u001b[48;5;240m\u001b[51;10H \u001b[m\u001b[93m\u001b[107m\u001b[38;5;250m\u001b[48;5;240m\u001b[51;12H kpod-rename \u001b[m\u001b[93m\u001b[107m\u001b[38;5;245m\u001b[48;5;240m\u001b[51;26H \u001b[m\u001b[93m\u001b[107m\u001b[38;5;250m\u001b[48;5;240mtest/\u001b[m\u001b[93m\u001b[107m\u001b[1m\u001b[38;5;231m\u001b[48;5;240mkpod_rename.bats\u001b[m\u001b[93m\u001b[107m\u001b[1m\u001b[38;5;220m\u001b[48;5;31m \u001b[m\u001b[93m\u001b[107m\b\u001b[1m\u001b[38;5;220m\u001b[48;5;240m + \u001b[m\u001b[93m\u001b[107m\u001b[38;5;31m\u001b[48;5;24m\u001b[m\u001b[93m\u001b[107m\u001b[51;51H\u001b[38;5;240m\u001b[48;5;236m\u001b[51;52H \u001b[m\u001b[93m\u001b[107m\u001b[38;5;231m\u001b[48;5;236m                                                                                                                         \u001b[m\u001b[93m\u001b[107m\u001b[38;5;247m\u001b[48;5;236munix\u001b[m\u001b[93m\u001b[107m\u001b[38;5;244m\u001b[48;5;236m \u001b[m\u001b[93m\u001b[107m\u001b[51;180H\u001b[38;5;247m\u001b[48;5;236m utf-8\u001b[m\u001b[93m\u001b[107m\u001b[38;5;244m\u001b[48;5;236m \u001b[m\u001b[93m\u001b[107m\u001b[51;188H\u001b[38;5;247m\u001b[48;5;236m " + ], + [ + 4.1e-05, + "conf\u001b[m\u001b[93m\u001b[107m\u001b[38;5;240m\u001b[48;5;236m \u001b[m\u001b[93m\u001b[107m\u001b[51;195H\u001b[38;5;108m\u001b[48;5;240m  66%\u001b[m\u001b[93m\u001b[107m\u001b[38;5;252m\u001b[48;5;240m \u001b[m\u001b[93m\u001b[107m\u001b[51;202H\u001b[38;5;235m\u001b[48;5;252m \u001b[51;204H \u001b[m\u001b[93m\u001b[107m\u001b[1m\u001b[38;5;235m\u001b[48;5;252m 23\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;117m:\u001b[m\u001b[93m\u001b[107m\b\u001b[38;5;22m\u001b[48;5;252m:15 \u001b[23;19H\u001b[?12l\u001b[?25h" + ], + [ + 0.30678, + "\u001b[?25l\u001b[52;1H\u001b[m\u001b[93m\u001b[107m:\u001b[?2004h\u001b[?12l\u001b[?25h" + ], + [ + 0.127132, + "w" + ], + [ + 3.3e-05, + "\u001b[?25l\u001b[?12l\u001b[?25h" + ], + [ + 0.056701, + "q\u001b[?25l\u001b[?12l\u001b[?25h" + ], + [ + 0.079826, + "\r" + ], + [ + 0.000364, + "\u001b[?25l\u001b[?2004l\"test/kpod_rename.bats\"" + ], + [ + 0.012084, + " 35L, 900C written" + ], + [ + 0.014515, + "\r\r\r\n\u001b[39;49m\u001b[?2004l\u001b[?1l\u001b>\u001b[?12l\u001b[?25h\u001b[?1049l" + ], + [ + 0.002629, + "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r" + ], + [ + 0.024698, + "\r\n\u001b[34m\u001b[01mcri-o\u001b[22m \u001b[90mgit/kpod-rename* \u001b[39m \u001b[33m40s\u001b[39m\r\n" + ], + [ + 0.000938, + "\u001b]7;file://localhost.localdomain/home/ryan/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007" + ], + [ + 0.000106, + "\u001b]2;ryan@localhost: ~/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007\u001b]1;..cubator/cri-o\u0007" + ], + [ + 9.8e-05, + "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[35m❯\u001b[39m \u001b[K\u001b[208C\u001b[90m\u001b[39m\u001b[208D" + ], + [ + 4.6e-05, + "\u001b[?1h\u001b=" + ], + [ + 1.6e-05, + "\u001b[?2004h" + ], + [ + 1.169246, + "g" + ], + [ + 0.271442, + "\bgi" + ], + [ + 0.079187, + "t" + ], + [ + 0.145049, + " " + ], + [ + 0.112281, + "c" + ], + [ + 0.048316, + "o" + ], + [ + 0.091902, + "m" + ], + [ + 0.743999, + "m" + ], + [ + 0.143304, + "i" + ], + [ + 0.107889, + "t" + ], + [ + 0.096264, + " " + ], + [ + 0.132679, + "-" + ], + [ + 0.103518, + "a" + ], + [ + 0.107512, + " " + ], + [ + 0.131904, + "-" + ], + [ + 0.116215, + "-" + ], + [ + 0.115981, + "a" + ], + [ + 0.204267, + "e" + ], + [ + 0.163917, + "n" + ], + [ + 0.392189, + "\b \b" + ], + [ + 0.151483, + "\b \b" + ], + [ + 0.176794, + "m" + ], + [ + 0.103142, + "e" + ], + [ + 0.111978, + "n" + ], + [ + 0.119562, + "d" + ], + [ + 0.112961, + "\u001b[?1l\u001b>" + ], + [ + 0.001554, + "\u001b[?2004l\r\r\n" + ], + [ + 0.00586, + "\u001b]2;git commit -a --amend\u0007\u001b]1;git\u0007" + ], + [ + 0.024458, + "\u001b[?2004h\u001b[?1049h\u001b[?1h\u001b=\u001b[?2004h" + ], + [ + 0.003473, + "\u001b[1;52r\u001b[?12;25h\u001b[?12l\u001b[?25h\u001b[27m\u001b[23m\u001b[m\u001b[H\u001b[2J\u001b[?25l\u001b[52;1H\"~/Development/Go/src/github.com/kubernetes-incubator/cri-o/.git/COMMIT_EDITMSG\"" + ], + [ + 0.000192, + " 23L, 623C" + ], + [ + 0.000113, + "\u001b[1;1Himplement kpod rename\r\n\r\nrename a container\r\n\r\nSigned-off-by: Ryan Cole \r\n\r\n# Please enter the commit message for your changes. Lines starting\r\n# with '#' will be ignored, and an empty message aborts the commit.\r\n#\r\n# Date: Mon Aug 14 13:30:24 2017 -0400\r\n#\r\n# On branch kpod-rename\r\n# Changes to be committed:\r\n#\u001b[7Cmodified: cmd/kpod/common.go\r\n#\u001b[7Cmodified: cmd/kpod/main.go\r\n#\u001b[7Cnew file: cmd/kpod/rename.go\r\n#\u001b[7Cmodified: completions/bash/kpod\r\n#\u001b[7Cnew file: docs/kpod-rename.1.md\r\n#\u001b[7Cmodified: docs/kpod.1.md\r\n#\u001b[7Cnew file: libkpod/rename.go\r\n#\u001b[7Cmodified: oci/container.go\r\n#\u001b[7Cnew file: test/kpod_rename.bats\r\n#\r\n\u001b[94m~ \u001b[25;1H~ " + ], + [ + 5.1e-05, + " \u001b[26;1H~ \u001b[27;1H~ \u001b[28;1H~ \u001b[29;1H~ \u001b[30;1H~ " + ], + [ + 3.6e-05, + " \u001b[31;1H~ \u001b[32;1H~ \u001b[33;1H~ \u001b[34;1H~ " + ], + [ + 3.3e-05, + " \u001b[35;1H~ \u001b[36;1H~ \u001b[37;1H~ \u001b[38;1H~ \u001b[39;1H~ " + ], + [ + 9.6e-05, + " \u001b[40;1H~ \u001b[41;1H~ \u001b[42;1H~ \u001b[43;1H~ \u001b[44;1H~ " + ], + [ + 2.8e-05, + " \u001b[45;1H~ \u001b[46;1H~ \u001b[47;1H~ \u001b[48;1H~ \u001b[49;1H~ " + ], + [ + 1.7e-05, + " \u001b[50;1H~ \u001b[51;1H~ \u001b[1;1H\u001b[?12l\u001b[?25h" + ], + [ + 0.324118, + "\u001b[?25l\u001b[m\u001b[52;1H\u001b[K\u001b[52;1H:\u001b[?2004h" + ], + [ + 0.000183, + "\u001b[?12l\u001b[?25h" + ], + [ + 0.183, + "w" + ], + [ + 0.056247, + "q" + ], + [ + 0.073571, + "\r\u001b[?25l\u001b[?2004l\".git/COMMIT_EDITMSG\"" + ], + [ + 0.012337, + " 23L, 623C written" + ], + [ + 9.6e-05, + "\r\r\r\n\u001b[?2004l\u001b[?1l\u001b>\u001b[?12l\u001b[?25h\u001b[?1049l" + ], + [ + 0.003601, + "[kpod-rename 1eb21f8e] implement kpod rename\r\n Date: Mon Aug 14 13:30:24 2017 -0400\r\n" + ], + [ + 0.000896, + " 9 files changed, 261 insertions(+), 1 deletion(-)\r\n create mode 100644 cmd/kpod/rename.go\r\n create mode 100644 docs/kpod-rename.1.md\r\n create mode 100644 libkpod/rename.go\r\n create mode 100644 test/kpod_rename.bats\r\n" + ], + [ + 0.000559, + "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r" + ], + [ + 0.027462, + "\r\n\u001b[34m\u001b[01mcri-o\u001b[22m \u001b[90mgit/kpod-rename \u001b[39m \u001b[33m\u001b[39m\r\n" + ], + [ + 0.001241, + "\u001b]7;file://localhost.localdomain/home/ryan/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007" + ], + [ + 0.000117, + "\u001b]2;ryan@localhost: ~/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007" + ], + [ + 2.4e-05, + "\u001b]1;..cubator/cri-o\u0007" + ], + [ + 9.9e-05, + "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[35m❯\u001b[39m \u001b[K\u001b[208C\u001b[90m\u001b[39m\u001b[208D" + ], + [ + 6.3e-05, + "\u001b[?1h\u001b=" + ], + [ + 2.7e-05, + "\u001b[?2004h" + ], + [ + 0.12051, + "g" + ], + [ + 0.119913, + "\bgi" + ], + [ + 0.112417, + "t" + ], + [ + 0.143512, + " " + ], + [ + 0.095889, + "p" + ], + [ + 0.079922, + "u" + ], + [ + 0.088511, + "s" + ], + [ + 0.127486, + "h" + ], + [ + 0.087736, + " " + ], + [ + 0.151933, + "-" + ], + [ + 0.128526, + "f" + ], + [ + 0.112515, + " " + ], + [ + 0.06351, + "o" + ], + [ + 0.136509, + "r" + ], + [ + 0.103539, + "i" + ], + [ + 0.128398, + "g" + ], + [ + 0.063485, + "i" + ], + [ + 0.080165, + "n" + ], + [ + 0.064001, + " " + ], + [ + 0.1677, + "k" + ], + [ + 0.091269, + "pod-" + ], + [ + 0.293058, + "r" + ], + [ + 0.11185, + "e" + ], + [ + 0.135834, + "n" + ], + [ + 0.171262, + "ame\u001b[1m \u001b[0m" + ], + [ + 0.164965, + "\b\u001b[0m \b" + ], + [ + 0.000197, + "\u001b[?1l\u001b>" + ], + [ + 0.000188, + "\u001b[?2004l\r\r\n" + ], + [ + 0.004459, + "\u001b]2;git push -f origin kpod-rename\u0007\u001b]1;git\u0007" + ], + [ + 0.74388, + "Counting objects: 19, done.\r\n" + ], + [ + 0.000183, + "Delta compression using up to 4 threads.\r\n" + ], + [ + 3.8e-05, + "Compressing objects: 5% (1/17) \rCompressing objects: 11% (2/17) \r" + ], + [ + 0.000177, + "Compressing objects: 17% (3/17) \r" + ], + [ + 8.9e-05, + "Compressing objects: 23% (4/17) \r" + ], + [ + 4.7e-05, + "Compressing objects: 29% (5/17) \r" + ], + [ + 0.000114, + "Compressing objects: 35% (6/17) \r" + ], + [ + 0.000132, + "Compressing objects: 41% (7/17) \r" + ], + [ + 9.1e-05, + "Compressing objects: 47% (8/17) \r" + ], + [ + 9.3e-05, + "Compressing objects: 52% (9/17) \r" + ], + [ + 6.5e-05, + "Compressing objects: 58% (10/17) \r" + ], + [ + 3.6e-05, + "Compressing objects: 64% (11/17) \r" + ], + [ + 3.2e-05, + "Compressing objects: 70% (12/17) \r" + ], + [ + 3e-05, + "Compressing objects: 76% (13/17) \r" + ], + [ + 3.8e-05, + "Compressing objects: 82% (14/17) \r" + ], + [ + 3e-05, + "Compressing objects: 88% (15/17) \r" + ], + [ + 2.4e-05, + "Compressing objects: 94% (16/17) \r" + ], + [ + 4.1e-05, + "Compressing objects: 100% (17/17) \r" + ], + [ + 3.5e-05, + "Compressing objects: 100% (17/17), done.\r\n" + ], + [ + 0.000128, + "Writing objects: 5% (1/19) \r" + ], + [ + 6.2e-05, + "Writing objects: 10% (2/19) \r" + ], + [ + 4.2e-05, + "Writing objects: 15% (3/19) \r" + ], + [ + 4.8e-05, + "Writing objects: 21% (4/19) \r" + ], + [ + 4.5e-05, + "Writing objects: 26% (5/19) \r" + ], + [ + 4.6e-05, + "Writing objects: 31% (6/19) \r" + ], + [ + 0.000103, + "Writing objects: 36% (7/19) \r" + ], + [ + 5.3e-05, + "Writing objects: 42% (8/19) \r" + ], + [ + 5.2e-05, + "Writing objects: 47% (9/19) \r" + ], + [ + 8.6e-05, + "Writing objects: 52% (10/19) \r" + ], + [ + 1.7e-05, + "Writing objects: 57% (11/19) \r" + ], + [ + 8.1e-05, + "Writing objects: 63% (12/19) \r" + ], + [ + 4.6e-05, + "Writing objects: 68% (13/19) \r" + ], + [ + 4.2e-05, + "Writing objects: 73% (14/19) \r" + ], + [ + 0.000145, + "Writing objects: 78% (15/19) \r" + ], + [ + 4.1e-05, + "Writing objects: 84% (16/19) \r" + ], + [ + 4.9e-05, + "Writing objects: 89% (17/19) \r" + ], + [ + 3.8e-05, + "Writing objects: 94% (18/19) \r" + ], + [ + 9.1e-05, + "Writing objects: 100% (19/19) \r" + ], + [ + 4.5e-05, + "Writing objects: 100% (19/19), 3.69 KiB | 3.69 MiB/s, done.\r\nTotal 19 (delta 12), reused 0 (delta 0)\r\n" + ], + [ + 0.04705, + "remote: Resolving deltas: 0% (0/12) \u001b[K\r" + ], + [ + 0.038152, + "remote: Resolving deltas: 8% (1/12) \u001b[K\rremote: Resolving deltas: 16% (2/12) \u001b[K\rremote: Resolving deltas: 25% (3/12) \u001b[K\rremote: Resolving deltas: 33% (4/12) \u001b[K\rremote: Resolving deltas: 41% (5/12) \u001b[K\rremote: Resolving deltas: 50% (6/12) \u001b[K\rremote: Resolving deltas: 58% (7/12) \u001b[K\rremote: Resolving deltas: 66% (8/12) \u001b[K\rremote: Resolving deltas: 75% (9/12) \u001b[K\rremote: Resolving deltas: 83% (10/12) \u001b[K\rremote: Resolving deltas: 91% (11/12) \u001b[K\rremote: Resolving deltas: 100% (12/12) \u001b[K\rremote: Resolving deltas: 100% (12/12), completed with 12 local objects.\u001b[K\r\n" + ], + [ + 1.420422, + "To github.com:14rcole/cri-o\r\n + 2a874565...1eb21f8e kpod-rename -> kpod-rename (forced update)\r\n" + ], + [ + 0.002366, + "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r" + ], + [ + 0.029573, + "\r\n\u001b[34m\u001b[01mcri-o\u001b[22m \u001b[90mgit/kpod-rename \u001b[39m \u001b[33m\u001b[39m\r\n" + ], + [ + 0.002048, + "\u001b]7;file://localhost.localdomain/home/ryan/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007" + ], + [ + 0.00012, + "\u001b]2;ryan@localhost: ~/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007" + ], + [ + 3.3e-05, + "\u001b]1;..cubator/cri-o\u0007" + ], + [ + 0.000179, + "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[35m❯\u001b[39m \u001b[K\u001b[208C\u001b[90m\u001b[39m\u001b[208D" + ], + [ + 0.000127, + "\u001b[?1h\u001b=" + ], + [ + 3.6e-05, + "\u001b[?2004h" + ], + [ + 1969.422781, + "k" + ], + [ + 0.16807, + "\bkp" + ], + [ + 0.09268, + "o" + ], + [ + 0.156049, + "d" + ], + [ + 0.087661, + " " + ], + [ + 3.123898, + "r" + ], + [ + 0.360843, + "m" + ], + [ + 0.942902, + "\b \b" + ], + [ + 0.16075, + "\b \b" + ], + [ + 0.151174, + "\b" + ], + [ + 0.176905, + "\b \b" + ], + [ + 0.159513, + "\b \b" + ], + [ + 0.168379, + "\b\bk \b" + ], + [ + 0.15094, + "\b \b" + ], + [ + 0.128879, + "s" + ], + [ + 0.223768, + "\bsd" + ], + [ + 0.280126, + "\b\bs \b" + ], + [ + 0.247922, + "\bsu" + ], + [ + 0.144548, + "d" + ], + [ + 0.095353, + "o" + ], + [ + 0.063452, + " " + ], + [ + 0.073201, + "c" + ], + [ + 0.176123, + "r" + ], + [ + 0.10351, + "i" + ], + [ + 0.071248, + "o" + ], + [ + 0.056543, + "c" + ], + [ + 0.208591, + "t" + ], + [ + 0.071256, + "l" + ], + [ + 0.120819, + " " + ], + [ + 0.224225, + "c" + ], + [ + 0.215122, + "t" + ], + [ + 0.184575, + "r" + ], + [ + 0.199863, + " " + ], + [ + 0.223807, + "l" + ], + [ + 0.104351, + "i" + ], + [ + 0.031403, + "s" + ], + [ + 0.095857, + "t" + ], + [ + 0.176783, + "\u001b[?1l\u001b>" + ], + [ + 0.000303, + "\u001b[?2004l\r\r\n" + ], + [ + 0.006555, + "\u001b]2;sudo crioctl ctr list\u0007\u001b]1;crioctl\u0007" + ], + [ + 0.954158, + "[sudo] password for ryan: " + ], + [ + 1.966785, + "\r\n" + ], + [ + 0.091087, + "ID: d0ddf13569c69f6fed1934eb0e5e9d41b0cf37477c3d42c63931e9b9d2e8ab41\r\nPod: 75d9cdb9e450cd7b67e71136c35e6fa850edfd783b1893f61a69659e2eb8cb77\r\nName: podsandbox1-redis\r\nAttempt: 0\r\nStatus: CONTAINER_RUNNING\r\nImage: redis:alpine\r\nCreated: 2017-08-14 14:45:11.278672966 -0400 EDT\r\nLabels:\r\n\ttier -> backend\r\nAnnotations:\r\n" + ], + [ + 3.3e-05, + "\tpod -> podsandbox1\r\n\r\n" + ], + [ + 0.003294, + "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r" + ], + [ + 0.022039, + "\r\n\u001b[34m\u001b[01mcri-o\u001b[22m \u001b[90mgit/kpod-rename \u001b[39m \u001b[33m\u001b[39m\r\n" + ], + [ + 0.002127, + "\u001b]7;file://localhost.localdomain/home/ryan/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007" + ], + [ + 0.000384, + "\u001b]2;ryan@localhost: ~/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007" + ], + [ + 6.2e-05, + "\u001b]1;..cubator/cri-o\u0007" + ], + [ + 0.000872, + "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[35m❯\u001b[39m " + ], + [ + 5.3e-05, + "\u001b[K\u001b[208C\u001b[90m\u001b[39m\u001b[208D" + ], + [ + 3.6e-05, + "\u001b[?1h\u001b=" + ], + [ + 7.8e-05, + "\u001b[?2004h" + ], + [ + 0.48893, + "s" + ], + [ + 0.110979, + "\bsu" + ], + [ + 0.0795, + "d" + ], + [ + 0.080647, + "o" + ], + [ + 0.10398, + " " + ], + [ + 0.087979, + "k" + ], + [ + 0.103896, + "p" + ], + [ + 0.072293, + "o" + ], + [ + 0.063704, + "d" + ], + [ + 0.095893, + " " + ], + [ + 0.07231, + "r" + ], + [ + 0.08694, + "m" + ], + [ + 0.127982, + "i" + ], + [ + 0.072625, + " " + ], + [ + 0.087713, + "r" + ], + [ + 0.080339, + "e" + ], + [ + 0.151296, + "d" + ], + [ + 0.096924, + "i" + ], + [ + 0.119446, + "s" + ], + [ + 0.144858, + ":" + ], + [ + 0.232002, + "a" + ], + [ + 0.087086, + "l" + ], + [ + 0.152797, + "p" + ], + [ + 0.071877, + "i" + ], + [ + 0.080055, + "n" + ], + [ + 0.072073, + "e" + ], + [ + 0.104314, + "\u001b[?1l\u001b>" + ], + [ + 0.0004, + "\u001b[?2004l\r\r\n" + ], + [ + 0.002847, + "\u001b]2;sudo kpod rmi redis:alpine\u0007\u001b]1;kpod\u0007" + ], + [ + 0.089244, + "Could not remove image \"redis:alpine\" (must force) - one or more containers are using its reference image%!(EXTRA int=0)\r\n" + ], + [ + 0.003327, + "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r" + ], + [ + 0.023875, + "\r\n\u001b[34m\u001b[01mcri-o\u001b[22m \u001b[90mgit/kpod-rename \u001b[39m \u001b[33m\u001b[39m\r\n" + ], + [ + 0.002907, + "\u001b]7;file://localhost.localdomain/home/ryan/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007" + ], + [ + 0.000104, + "\u001b]2;ryan@localhost: ~/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007" + ], + [ + 2e-05, + "\u001b]1;..cubator/cri-o\u0007" + ], + [ + 6.8e-05, + "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[31m❯\u001b[39m " + ], + [ + 2.4e-05, + "\u001b[K\u001b[208C\u001b[90m\u001b[39m\u001b[208D" + ], + [ + 4.9e-05, + "\u001b[?1h\u001b=" + ], + [ + 2.6e-05, + "\u001b[?2004h" + ], + [ + 4.955818, + "g" + ], + [ + 0.128566, + "\bgi" + ], + [ + 0.064574, + "t" + ], + [ + 0.095493, + " " + ], + [ + 0.167938, + "c" + ], + [ + 0.112316, + "h" + ], + [ + 0.103897, + "e" + ], + [ + 0.072405, + "c" + ], + [ + 0.054921, + "k" + ], + [ + 0.120936, + "o" + ], + [ + 0.103471, + "u" + ], + [ + 0.063554, + "t" + ], + [ + 0.088583, + " " + ], + [ + 0.176206, + "m" + ], + [ + 0.104132, + "a" + ], + [ + 0.063023, + "s" + ], + [ + 0.251503, + "ter\u001b[1m \u001b[0m" + ], + [ + 0.341276, + "\b\u001b[0m \b" + ], + [ + 0.0001, + "\u001b[?1l\u001b>" + ], + [ + 0.000196, + "\u001b[?2004l" + ], + [ + 0.000167, + "\r\r\n" + ], + [ + 0.004807, + "\u001b]2;git checkout master\u0007\u001b]1;git\u0007" + ], + [ + 0.031022, + "Switched to branch 'master'\r\n" + ], + [ + 5.4e-05, + "Your branch is up-to-date with 'origin/master'.\r\n" + ], + [ + 0.000548, + "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r" + ], + [ + 0.02297, + "\r\n\u001b[34m\u001b[01mcri-o\u001b[22m \u001b[90mgit/master \u001b[39m \u001b[33m\u001b[39m\r\n" + ], + [ + 0.001023, + "\u001b]7;file://localhost.localdomain/home/ryan/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007" + ], + [ + 0.000111, + "\u001b]2;ryan@localhost: ~/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007" + ], + [ + 2.6e-05, + "\u001b]1;..cubator/cri-o\u0007" + ], + [ + 9.6e-05, + "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[35m❯\u001b[39m \u001b[K\u001b[208C\u001b[90m\u001b[39m\u001b[208D" + ], + [ + 6.7e-05, + "\u001b[?1h\u001b=" + ], + [ + 3.6e-05, + "\u001b[?2004h" + ], + [ + 0.154245, + "g" + ], + [ + 0.176512, + "\bgi" + ], + [ + 0.016088, + "t" + ], + [ + 0.104093, + " " + ], + [ + 0.032212, + "p" + ], + [ + 0.103747, + "u" + ], + [ + 0.903255, + "l" + ], + [ + 0.160769, + "l" + ], + [ + 0.118954, + " " + ], + [ + 0.104575, + "-" + ], + [ + 0.151817, + "-" + ], + [ + 0.088524, + "r" + ], + [ + 0.32749, + "\b \b" + ], + [ + 0.14449, + "\b \b" + ], + [ + 0.151997, + "\b \b" + ], + [ + 0.679562, + "u" + ], + [ + 0.05667, + "p" + ], + [ + 0.147276, + "stream\u001b[1m \u001b[0m" + ], + [ + 0.324463, + "\b\u001b[0m m" + ], + [ + 0.088344, + "a" + ], + [ + 0.096029, + "s" + ], + [ + 0.187689, + "ter\u001b[1m:\u001b[0m" + ], + [ + 0.091664, + "\b\u001b[0m \b" + ], + [ + 0.000172, + "\u001b[?1l\u001b>" + ], + [ + 0.000159, + "\u001b[?2004l\r\r\n" + ], + [ + 0.004194, + "\u001b]2;git pull upstream master\u0007\u001b]1;git\u0007" + ], + [ + 1.697902, + "From github.com:kubernetes-incubator/cri-o\r\n * branch master -> FETCH_HEAD\r\n" + ], + [ + 0.057748, + "Updating a69631c1..6ca462a3\r\n" + ], + [ + 0.026098, + "Fast-forward" + ], + [ + 4.3e-05, + "\r\n" + ], + [ + 0.005314, + " README.md | 3 \u001b[32m+\u001b[m\u001b[31m-\u001b[m\r\n cmd/kpod/logs.go | 88 \u001b[32m+++++++++++++++++++++++\u001b[m\r\n cmd/kpod/main.go | 1 \u001b[32m+\u001b[m\r\n code-of-conduct.md | 20 \u001b[32m+++\u001b[m\u001b[31m---\u001b[m\r\n" + ], + [ + 0.000167, + " completions/bash/kpod | 25 \u001b[32m+++++++\u001b[m\r\n docs/kpod-logs.1.md | 61 \u001b[32m++++++++++++++++\u001b[m\r\n libkpod/image/copy.go | 18 \u001b[32m++++\u001b[m\u001b[31m-\u001b[m\r\n libkpod/logs.go | 80 \u001b[32m+++++++++++++++++++++\u001b[m\r\n test/kpod_logs.bats | 77 \u001b[32m++++++++++++++++++++\u001b[m\r\n vendor.conf | 3 \u001b[32m+\u001b[m\r\n vendor/github.com/hpcloud/tail/LICENSE.txt | 21 \u001b[32m++++++\u001b[m\r\n vendor/github.com/hpcloud/tail/README.md | 28 \u001b[32m++++++++\u001b[m\r\n vendor/github.com/hpcloud/tail/ratelimiter/leakybucket.go | 97 \u001b[32m+++++++++++++++++++++++++\u001b[m\r\n vendor/github.com/hpcloud/tail/ratelimiter/memory.go | 58 \u001b[32m+++++++++++++++\u001b[m\r\n vendor/github.com/hpcloud/tail/ratelimiter/storage.go | 6 \u001b[32m++\u001b[m\r\n vendor/github.com/hpcloud/tail/tail.go | 438 " + ], + [ + 2.2e-05, + "\u001b[32m+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\u001b[m\r\n vendor/github.com/hpcloud/tail/tail_posix.go | 11 \u001b[32m+++\u001b[m\r\n vendor/github.com/hpcloud/tail/tail_windows.go | 12 \u001b[32m++++\u001b[m\r\n vendor/github.com/hpcloud/tail/util/util.go | 48 \u001b[32m+++++++++++++\u001b[m\r\n vendor/github.com/hpcloud/tail/watch/filechanges.go | 36 \u001b[32m++++++++++\u001b[m\r\n vendor/github.com/hpcloud/tail/watch/inotify.go | 128 \u001b[32m+++++++++++++++++++++++++++++++++\u001b[m\r\n vendor/github.com/hpcloud/tail/watch/inotify_tracker.go | 260 \u001b[32m+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\u001b[m\r\n vendor/github.com/hpcloud/tail/watch/polling.go | 118 \u001b[32m+++++++++++++++++++++++++++++++\u001b[m\r\n vendor/github.com/hpcloud/tail/watch/watch.go | 20 \u001b[32m++++++\u001b[m\r\n vendor/github.com/hpcloud/tail/winfile/winfile.go | 92 \u001b[32m++++++++++++++++++++++++\u001b[m\r\n vendor/gopkg.in/fsnotify.v1/LICENS" + ], + [ + 1.7e-05, + "E | 28 \u001b[32m++++++++\u001b[m\r\n vendor/gopkg.in/fsnotify.v1/README.md | 50 \u001b[32m+++++++++++++\u001b[m\r\n vendor/gopkg.in/fsnotify.v1/fen.go | 37 \u001b[32m++++++++++\u001b[m\r\n vendor/gopkg.in/fsnotify.v1/fsnotify.go | 62 \u001b[32m++++++++++++++++\u001b[m\r\n vendor/gopkg.in/fsnotify.v1/inotify.go | 325 \u001b[32m++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\u001b[m\r\n vendor/gopkg.in/fsnotify.v1/inotify_poller.go | 187 \u001b[32m+++++++++++++++++++++++++++++++++++++++++++++++++\u001b[m\r\n vendor/gopkg.in/fsnotify.v1/kqueue.go | 503 \u001b[32m++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\u001b[m\r\n vendor/gopkg.in/fsnotify.v1/open_mode_bsd.go | 11 \u001b[32m+++\u001b[m\r\n vendor/gopkg.in/fsnotify.v1/open_mode_darwin.go | 12 \u001b[32m++++\u001b[m\r\n vendor/gopkg.in/fsnotify.v1/windows.go | 561 \u001b[" + ], + [ + 1.6e-05, + "32m+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\u001b[m\r\n vendor/gopkg.in/tomb.v1/LICENSE | 29 \u001b[32m++++++++\u001b[m\r\n vendor/gopkg.in/tomb.v1/README.md | 4 \u001b[32m++\u001b[m\r\n vendor/gopkg.in/tomb.v1/tomb.go | 176 \u001b[32m++++++++++++++++++++++++++++++++++++++++++++++\u001b[m\r\n 38 files changed, 3722 insertions(+), 12 deletions(-)\r\n create mode 100644 cmd/kpod/logs.go\r\n create mode 100644 docs/kpod-logs.1.md\r\n create mode 100644 libkpod/logs.go\r\n create mode 100644 test/kpod_logs.bats\r\n create mode 100644 vendor/github.com/hpcloud/tail/LICENSE.txt\r\n create mode 100644 vendor/github.com/hpcloud/tail/README.md\r\n create mode 100644 vendor/github.com/hpcloud/tail/ratelimiter/leakybucket.go\r\n create mode 100644 vendor/github.com/hpcloud/tail/ratelimiter/memory.go\r\n create mode 100644 vendor/github.com/hpcloud/tail/ratelimiter/storage.go\r\n create mode 100644 ve" + ], + [ + 0.000117, + "ndor/github.com/hpcloud/tail/tail.go\r\n create mode 100644 vendor/github.com/hpcloud/tail/tail_posix.go\r\n create mode 100644 vendor/github.com/hpcloud/tail/tail_windows.go\r\n create mode 100644 vendor/github.com/hpcloud/tail/util/util.go\r\n create mode 100644 vendor/github.com/hpcloud/tail/watch/filechanges.go\r\n create mode 100644 vendor/github.com/hpcloud/tail/watch/inotify.go\r\n create mode 100644 vendor/github.com/hpcloud/tail/watch/inotify_tracker.go\r\n create mode 100644 vendor/github.com/hpcloud/tail/watch/polling.go\r\n create mode 100644 vendor/github.com/hpcloud/tail/watch/watch.go\r\n create mode 100644 vendor/github.com/hpcloud/tail/winfile/winfile.go\r\n create mode 100644 vendor/gopkg.in/fsnotify.v1/LICENSE\r\n create mode 100644 vendor/gopkg.in/fsnotify.v1/README.md\r\n create mode 100644 vendor/gopkg.in/fsnotify.v1/fen.go\r\n create mode 100644 vendor/gopkg.in/fsnotify.v1/fsnotify.go\r\n create mode 100644 vendor/gopkg.in/fsnotify.v1/inotify.go\r\n create mode 100644 vendor/gopkg.in/fsnotify.v1/inotify_poller.go\r\n " + ], + [ + 3.1e-05, + "create mode 100644 vendor/gopkg.in/fsnotify.v1/kqueue.go\r\n create mode 100644 vendor/gopkg.in/fsnotify.v1/open_mode_bsd.go\r\n create mode 100644 vendor/gopkg.in/fsnotify.v1/open_mode_darwin.go\r\n create mode 100644 vendor/gopkg.in/fsnotify.v1/windows.go\r\n create mode 100644 vendor/gopkg.in/tomb.v1/LICENSE\r\n create mode 100644 vendor/gopkg.in/tomb.v1/README.md\r\n create mode 100644 vendor/gopkg.in/tomb.v1/tomb.go\r\n" + ], + [ + 0.001059, + "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r" + ], + [ + 0.038598, + "\r\n\u001b[34m\u001b[01mcri-o\u001b[22m \u001b[90mgit/master \u001b[39m \u001b[33m\u001b[39m\r\n" + ], + [ + 0.001722, + "\u001b]7;file://localhost.localdomain/home/ryan/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007\u001b]2;ryan@localhost: ~/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007\u001b]1;..cubator/cri-o\u0007\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[35m❯\u001b[39m \u001b[K\u001b[208C\u001b[90m\u001b[39m\u001b[208D\u001b[?1h\u001b=\u001b[?2004h" + ], + [ + 1.798324, + "v" + ], + [ + 0.088099, + "\bvi" + ], + [ + 0.095471, + " " + ], + [ + 0.313127, + "m" + ], + [ + 0.239446, + "\b \b" + ], + [ + 0.103855, + "c" + ], + [ + 0.104993, + "m" + ], + [ + 0.117338, + "d\u001b[1m/\u001b[0m" + ], + [ + 0.07865, + "\b\u001b[0m/k" + ], + [ + 0.11481, + "pod\u001b[1m/\u001b[0m" + ], + [ + 0.137367, + "\b\u001b[0m/m" + ], + [ + 0.287656, + "\b \b" + ], + [ + 0.135144, + "r" + ], + [ + 0.068676, + "e" + ], + [ + 0.148163, + "n" + ], + [ + 0.157283, + "\u0007" + ], + [ + 0.706737, + "a" + ], + [ + 0.225253, + "\u0007" + ], + [ + 1.09834, + "\b \b" + ], + [ + 0.584105, + "\b \b" + ], + [ + 0.248355, + "m" + ], + [ + 0.259974, + "\b \b" + ], + [ + 0.123623, + "\b \b" + ], + [ + 0.144232, + "m" + ], + [ + 0.159494, + "i" + ], + [ + 0.154991, + ".go\u001b[1m \u001b[0m" + ], + [ + 0.373147, + "\b\u001b[0m \b" + ], + [ + 5.9e-05, + "\u001b[?1l\u001b>" + ], + [ + 0.000152, + "\u001b[?2004l\r\r\n" + ], + [ + 0.003812, + "\u001b]2;vim cmd/kpod/rmi.go\u0007\u001b]1;vi\u0007" + ], + [ + 0.140952, + "\u001b[?2004h\u001b[?1049h\u001b[?1h\u001b=\u001b[?2004h" + ], + [ + 0.000561, + "\u001b[1;52r\u001b[?12;25h\u001b[?12l\u001b[?25h\u001b[27m\u001b[23m\u001b[m\u001b[93m\u001b[107m\u001b[H\u001b[2J\u001b[?25l\u001b[52;1H\"cmd/kpod/rmi.go\"" + ], + [ + 0.000112, + " 123L, 3096C" + ], + [ + 0.007972, + "\u001b[2;1H▽\u001b[6n\u001b[2;1H \u001b[1;1H\u001b[>c" + ], + [ + 0.002019, + "\u001b[1;1H\u001b[96m\u001b[47m 20 \u001b[m\u001b[93m\u001b[107m rmiCommand = cli.Command{\r\n\u001b[96m\u001b[47m 21 \u001b[m\u001b[93m\u001b[107m\u001b[8CName:\u001b[8C\u001b[36m\"rmi\"\u001b[m\u001b[93m\u001b[107m,\r\n\u001b[96m\u001b[47m 22 \u001b[m\u001b[93m\u001b[107m\u001b[8CUsage:\u001b[7C\u001b[36m\"removes one or more images from local storage\"\u001b[m\u001b[93m\u001b[107m,\r\n\u001b[96m\u001b[47m 23 \u001b[m\u001b[93m\u001b[107m\u001b[8CDescription: rmiDescription,\r\n\u001b[96m\u001b[47m 24 \u001b[m\u001b[93m\u001b[107m\u001b[8CAction: rmiCmd,\r\n\u001b[96m\u001b[47m 25 \u001b[m\u001b[93m\u001b[107m\u001b[8CArgsUsage: \u001b[36m\"IMAGE-NAME-OR-ID [...]\"\u001b[m\u001b[93m\u001b[107m,\r\n\u001b[96m\u001b[47m 26 \u001b[m\u001b[93m\u001b[107m\u001b[8CFlags:\u001b[7CrmiFlags,\r\n\u001b[96m\u001b[47m 27 \u001b[m\u001b[93m\u001b[107m }\r\n\u001b[96m\u001b[47m 28 \u001b[m\u001b[93m\u001b[107m)\r\n\u001b[96m\u001b[47m 29 \r\n 30 \u001b[m\u001b[93m\u001b[107m\u001b[32mfunc\u001b[m\u001b[93m\u001b[107m rmiCmd(c *cli.Context) \u001b[33merror\u001b[m\u001b[93m\u001b[107m {\r\n\u001b[96m\u001b[47m 31 \r\n 32 \u001b[m\u001b[93m\u001b[107m force := \u001b[36mfalse\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m 33 \u001b[m\u001b[93m\u001b[107m \u001b[32mif\u001b[m\u001b[93m\u001b[107m c.IsSet(\u001b[36m\"force\"\u001b[m\u001b[93m\u001b[107m) {\r\n\u001b[96m\u001b[47m 34 \u001b[m\u001b[93m\u001b[107m\u001b[8Cforce = c.Bool(\u001b[36m\"force\"\u001b[m\u001b[93m\u001b[107m)\r\n\u001b[96m\u001b[47m 35 \u001b[m\u001b[93m\u001b[107m }\r\n\u001b[96m\u001b[47m 36 \r\n 37 \u001b[m\u001b[93m\u001b[107m args := c.Args()\r\n\u001b[96m\u001b[47m 3" + ], + [ + 2.1e-05, + "8 \u001b[m\u001b[93m\u001b[107m \u001b[32mif\u001b[m\u001b[93m\u001b[107m \u001b[32mlen\u001b[m\u001b[93m\u001b[107m(args) == \u001b[36m0\u001b[m\u001b[93m\u001b[107m {\r\n\u001b[96m\u001b[47m 39 \u001b[m\u001b[93m\u001b[107m\u001b[8C\u001b[32mreturn\u001b[m\u001b[93m\u001b[107m errors.Errorf(\u001b[36m\"image name or ID must be specified\"\u001b[m\u001b[93m\u001b[107m)\r\n\u001b[96m\u001b[47m 40 \u001b[m\u001b[93m\u001b[107m }\r\n\u001b[96m\u001b[47m 41 \r\n 42 \u001b[m\u001b[93m\u001b[107m config, err := getConfig(c)\r\n\u001b[96m\u001b[47m 43 \u001b[m\u001b[93m\u001b[107m \u001b[32mif\u001b[m\u001b[93m\u001b[107m err != \u001b[36mnil\u001b[m\u001b[93m\u001b[107m {\r\n\u001b[96m\u001b[47m 44 \u001b[m\u001b[93m\u001b[107m\u001b[8C\u001b[32mreturn\u001b[m\u001b[93m\u001b[107m errors.Wrapf(err, \u001b[36m\"Could not get config\"\u001b[m\u001b[93m\u001b[107m)\r\n\u001b[96m\u001b[47m 45 \u001b[m\u001b[93m\u001b[107m }\r\n\u001b[96m\u001b[47m 46 \u001b[m\u001b[93m\u001b[107m store, err := getStore(config)\r\n\u001b[96m\u001b[47m 47 \u001b[m\u001b[93m\u001b[107m \u001b[32mif\u001b[m\u001b[93m\u001b[107m err != \u001b[36mnil\u001b[m\u001b[93m\u001b[107m {\r\n\u001b[96m\u001b[47m 48 \u001b[m\u001b[93m\u001b[107m\u001b[8C\u001b[32mreturn\u001b[m\u001b[93m\u001b[107m err\r\n\u001b[96m\u001b[47m 49 \u001b[m\u001b[93m\u001b[107m }\r\n\u001b[96m\u001b[47m 50 \r\n 51 \u001b[m\u001b[93m\u001b[107m \u001b[32mfor\u001b[m\u001b[93m\u001b[107m _, id := \u001b[32mrange\u001b[m\u001b[93m\u001b[107m args {\r\n\u001b[96m\u001b[47m 52 \u001b[m\u001b[93m\u001b[107m\u001b[8Cimage, err := libkpodimage.FindImage(store, id)\r\n" + ], + [ + 0.032607, + "\u001b[96m\u001b[47m 53 \u001b[m\u001b[93m\u001b[107m\u001b[8C\u001b[32mif\u001b[m\u001b[93m\u001b[107m err != \u001b[36mnil\u001b[m\u001b[93m\u001b[107m {\r\n\u001b[96m\u001b[47m 54 \u001b[m\u001b[93m\u001b[107m\u001b[12C\u001b[32mreturn\u001b[m\u001b[93m\u001b[107m errors.Wrapf(err, \u001b[36m\"could not get image \u001b[m\u001b[93m\u001b[107m\u001b[31m%q\u001b[m\u001b[93m\u001b[107m\u001b[36m\"\u001b[m\u001b[93m\u001b[107m, id)\r\n\u001b[96m\u001b[47m 55 \u001b[m\u001b[93m\u001b[107m\u001b[8C}\r\n\u001b[96m\u001b[47m 56 \u001b[m\u001b[93m\u001b[107m\u001b[8C\u001b[32mif\u001b[m\u001b[93m\u001b[107m image != \u001b[36mnil\u001b[m\u001b[93m\u001b[107m {\r\n\u001b[96m\u001b[47m 57 \u001b[m\u001b[93m\u001b[107m\u001b[12CctrIDs, err := runningContainers(image, store)\r\n\u001b[96m\u001b[47m 58 \u001b[m\u001b[93m\u001b[107m\u001b[12C\u001b[32mif\u001b[m\u001b[93m\u001b[107m err != \u001b[36mnil\u001b[m\u001b[93m\u001b[107m {\r\n\u001b[96m\u001b[47m 59 \u001b[m\u001b[93m\u001b[107m\u001b[16C\u001b[32mreturn\u001b[m\u001b[93m\u001b[107m errors.Wrapf(err, \u001b[36m\"error getting running containers for image \u001b[m\u001b[93m\u001b[107m\u001b[31m%q\u001b[m\u001b[93m\u001b[107m\u001b[36m\"\u001b[m\u001b[93m\u001b[107m, id)\r\n\u001b[96m\u001b[47m 60 \u001b[m\u001b[93m\u001b[107m\u001b[12C}\r\n\u001b[96m\u001b[47m 61 \u001b[m\u001b[93m\u001b[107m\u001b[12C\u001b[32mif\u001b[m\u001b[93m\u001b[107m \u001b[32mlen\u001b[m\u001b[93m\u001b[107m(ctrIDs) > \u001b[36m0\u001b[m\u001b[93m\u001b[107m && \u001b[32mlen\u001b[m\u001b[93m\u001b[107m(image.Names) <= \u001b[36m1\u001b[m\u001b[93m\u001b[107m {\r\n\u001b[96m\u001b[47m 62 \u001b[m\u001b[93m\u001b[107m\u001b[16C\u001b[32mif\u001b[m\u001b[93m\u001b[107m force {\r\n\u001b[96m\u001b[47m 63 \u001b[" + ], + [ + 0.000108, + "m\u001b[93m\u001b[107m\u001b[20CremoveContainers(ctrIDs, store)\r\n\u001b[96m\u001b[47m 64 \u001b[m\u001b[93m\u001b[107m\u001b[16C} \u001b[32melse\u001b[m\u001b[93m\u001b[107m {\r\n\u001b[96m\u001b[47m 65 \u001b[m\u001b[93m\u001b[107m\u001b[20C\u001b[32mfor\u001b[m\u001b[93m\u001b[107m ctrID := \u001b[32mrange\u001b[m\u001b[93m\u001b[107m ctrIDs {\r\n\u001b[96m\u001b[47m 66 \u001b[m\u001b[93m\u001b[107m\u001b[24C\u001b[32mreturn\u001b[m\u001b[93m\u001b[107m fmt.Errorf(\u001b[36m\"Could not remove image \u001b[m\u001b[93m\u001b[107m\u001b[31m%q\u001b[m\u001b[93m\u001b[107m\u001b[36m (must force) - container \u001b[m\u001b[93m\u001b[107m\u001b[31m%q\u001b[m\u001b[93m\u001b[107m\u001b[36m is using its reference image\"\u001b[m\u001b[93m\u001b[107m, id, ctrID)\r\n\u001b[96m\u001b[47m 67 \u001b[m\u001b[93m\u001b[107m\u001b[20C}\r\n\u001b[96m\u001b[47m 68 \u001b[m\u001b[93m\u001b[107m\u001b[16C}\r\n\u001b[96m\u001b[47m 69 \u001b[m\u001b[93m\u001b[107m\u001b[12C}\r\n\u001b[1m\u001b[38;5;22m\u001b[48;5;148m NORMAL \u001b[m\u001b[93m\u001b[107m\u001b[38;5;148m\u001b[48;5;240m\u001b[51;10H \u001b[m\u001b[93m\u001b[107m\u001b[38;5;250m\u001b[48;5;240m\u001b[51;12H master \u001b[m\u001b[93m\u001b[107m\u001b[38;5;245m\u001b[48;5;240m\u001b[51;21H \u001b[m\u001b[93m\u001b[107m\u001b[38;5;250m\u001b[48;5;240mcmd/kpod/\u001b[m\u001b[93m\u001b[107m\u001b[1m\u001b[38;5;231m\u001b[48;5;240mrmi.go \u001b[m\u001b[93m\u001b[107m\u001b[38;5;240m\u001b[48;5;236m\u001b[51;39H \u001b[m\u001b[93m\u001b[107m\u001b[38;5;231m\u001b[48;5;236m                           " + ], + [ + 0.009234, + "                                                                                                             \u001b[m\u001b[93m\u001b[107m\u001b[38;5;247m\u001b[48;5;236munix\u001b[m\u001b[93m\u001b[107m\u001b[38;5;244m\u001b[48;5;236m \u001b[m\u001b[93m\u001b[107m\u001b[51;182H\u001b[38;5;247m\u001b[48;5;236m utf-8\u001b[m\u001b[93m\u001b[107m\u001b[38;5;244m\u001b[48;5;236m \u001b[m\u001b[93m\u001b[107m\u001b[51;190H\u001b[38;5;247m\u001b[48;5;236m go\u001b[m\u001b[93m\u001b[107m\u001b[38;5;240m\u001b[48;5;236m \u001b[m\u001b[93m\u001b[107m\u001b[51;195H\u001b[38;5;107m\u001b[48;5;240m  54%\u001b[m\u001b[93m\u001b[107m\u001b[38;5;252m\u001b[48;5;240m \u001b[m\u001b[93m\u001b[107m\u001b[51;202H\u001b[38;5;235m\u001b[48;5;252m \u001b[51;204H \u001b[m\u001b[93m\u001b[107m\u001b[1m\u001b[38;5;235m\u001b[48;5;252m 66\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:25 \u001b[47;29H\u001b[?12l\u001b[?25h\u001bP+q436f\u001b\\\u001bP+q6b75\u001b\\\u001bP+q6b64\u001b\\\u001bP+q6b72\u001b\\\u001bP+q6b6c\u001b\\\u001bP+q2332\u001b\\\u001bP+q2334\u001b\\\u001bP+q2569\u001b\\\u001bP+q2a37\u001b\\\u001bP+q6b31\u001b\\" + ], + [ + 1.74193, + "\u001b[?25l\u001b[51;210H4\u001b[47;28H\u001b[?12l\u001b[?25h" + ], + [ + 0.184955, + "\u001b[51;210H5\u001b[47;29H" + ], + [ + 0.501563, + "\u001b[51;210H6\u001b[47;30H" + ], + [ + 0.027652, + "\u001b[51;210H7\u001b[47;31H" + ], + [ + 0.031729, + "\u001b[51;210H8\u001b[47;32H" + ], + [ + 0.032977, + "\u001b[51;210H9\u001b[47;33H" + ], + [ + 0.028374, + "\u001b[51;209H30\u001b[47;34H" + ], + [ + 0.029832, + "\u001b[51;210H1\u001b[47;35H" + ], + [ + 0.032526, + "\u001b[51;210H2\u001b[47;36H" + ], + [ + 0.029166, + "\u001b[51;210H3\u001b[47;37H" + ], + [ + 0.031288, + "\u001b[51;210H4\u001b[47;38H" + ], + [ + 0.031594, + "\u001b[51;210H5\u001b[47;39H" + ], + [ + 0.030975, + "\u001b[51;210H6\u001b[47;40H" + ], + [ + 0.029298, + "\u001b[51;210H7\u001b[47;41H" + ], + [ + 0.029023, + "\u001b[51;210H8\u001b[47;42H" + ], + [ + 0.03314, + "\u001b[51;210H9\u001b[47;43H" + ], + [ + 0.031948, + "\u001b[51;209H40\u001b[47;44H" + ], + [ + 0.028742, + "\u001b[51;210H1\u001b[47;45H" + ], + [ + 0.034439, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107mf\u001b[1m\u001b[31m\u001b[106m(\u001b[95C)\u001b[m\u001b[93m\u001b[107m\u001b[51;210H\u001b[38;5;22m\u001b[48;5;252m2\u001b[47;46H\u001b[?12l\u001b[?25h" + ], + [ + 0.028925, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m(\u001b[36m\"\u001b[m\u001b[93m\u001b[107m\u001b[94C)\u001b[51;210H\u001b[38;5;22m\u001b[48;5;252m3\u001b[47;47H\u001b[?12l\u001b[?25h" + ], + [ + 0.030179, + "\u001b[51;210H4\u001b[47;48H" + ], + [ + 0.030092, + "\u001b[51;210H5\u001b[47;49H" + ], + [ + 0.03015, + "\u001b[51;210H6\u001b[47;50H" + ], + [ + 0.029603, + "\u001b[51;210H7\u001b[47;51H" + ], + [ + 0.032153, + "\u001b[51;210H8\u001b[47;52H" + ], + [ + 0.030144, + "\u001b[51;210H9\u001b[47;53H" + ], + [ + 0.03006, + "\u001b[51;209H50\u001b[47;54H" + ], + [ + 0.030687, + "\u001b[51;210H1\u001b[47;55H" + ], + [ + 0.02981, + "\u001b[51;210H2\u001b[47;56H" + ], + [ + 0.037596, + "\u001b[51;210H3\u001b[47;57H" + ], + [ + 0.027628, + "\u001b[51;210H4\u001b[47;58H" + ], + [ + 0.026376, + "\u001b[51;210H5\u001b[47;59H" + ], + [ + 0.031146, + "\u001b[51;210H6\u001b[47;60H" + ], + [ + 0.032485, + "\u001b[51;210H7\u001b[47;61H" + ], + [ + 0.026451, + "\u001b[51;210H8\u001b[47;62H" + ], + [ + 0.030128, + "\u001b[51;210H9\u001b[47;63H" + ], + [ + 0.031166, + "\u001b[51;209H60\u001b[47;64H" + ], + [ + 0.036072, + "\u001b[51;210H1\u001b[47;65H" + ], + [ + 0.024924, + "\u001b[51;210H2\u001b[47;66H" + ], + [ + 0.032987, + "\u001b[51;210H3\u001b[47;67H" + ], + [ + 0.029506, + "\u001b[51;210H4\u001b[47;68H" + ], + [ + 0.031373, + "\u001b[51;210H5\u001b[47;69H" + ], + [ + 0.033657, + "\u001b[51;210H6\u001b[47;70H" + ], + [ + 0.02801, + "\u001b[51;210H7\u001b[47;71H" + ], + [ + 0.031093, + "\u001b[51;210H8\u001b[47;72H" + ], + [ + 0.0306, + "\u001b[51;210H9\u001b[47;73H" + ], + [ + 0.034356, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[1C\u001b[1m\u001b[31m\u001b[106m(\u001b[10C)\u001b[m\u001b[93m\u001b[107m\u001b[51;209H\u001b[38;5;22m\u001b[48;5;252m70\u001b[47;74H\u001b[?12l\u001b[?25h" + ], + [ + 0.026368, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[36m(m\u001b[9C) \u001b[m\u001b[93m\u001b[107m\u001b[51;210H\u001b[38;5;22m\u001b[48;5;252m1\u001b[47;75H\u001b[?12l\u001b[?25h" + ], + [ + 0.031718, + "\u001b[51;210H2\u001b[47;76H" + ], + [ + 0.032486, + "\u001b[51;210H3\u001b[47;77H" + ], + [ + 0.025168, + "\u001b[51;210H4\u001b[47;78H" + ], + [ + 0.036429, + "\u001b[51;210H5\u001b[47;79H" + ], + [ + 0.028144, + "\u001b[51;210H6\u001b[47;80H" + ], + [ + 0.031687, + "\u001b[51;210H7\u001b[47;81H" + ], + [ + 0.031436, + "\u001b[51;210H8\u001b[47;82H" + ], + [ + 0.028164, + "\u001b[51;210H9\u001b[47;83H" + ], + [ + 0.033254, + "\u001b[51;209H80\u001b[47;84H" + ], + [ + 0.033571, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[47;74H\u001b[1m\u001b[31m\u001b[106m(\u001b[10C)\u001b[m\u001b[93m\u001b[107m\u001b[51;210H\u001b[38;5;22m\u001b[48;5;252m1\u001b[47;85H\u001b[?12l\u001b[?25h" + ], + [ + 0.028404, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[47;74H\u001b[36m(m\u001b[9C) \u001b[m\u001b[93m\u001b[107m\u001b[51;210H\u001b[38;5;22m\u001b[48;5;252m2\u001b[47;86H\u001b[?12l\u001b[?25h" + ], + [ + 0.029114, + "\u001b[51;210H3\u001b[47;87H" + ], + [ + 0.030981, + "\u001b[51;210H4\u001b[47;88H" + ], + [ + 0.034571, + "\u001b[51;210H5\u001b[47;89H" + ], + [ + 0.02456, + "\u001b[51;210H6\u001b[47;90H" + ], + [ + 0.424165, + "\u001b[51;210H5\u001b[47;89H" + ], + [ + 0.191612, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[36montainer \u001b[m\u001b[93m\u001b[107m\u001b[31m%q\u001b[m\u001b[93m\u001b[107m\u001b[36m is using its reference image\"\u001b[m\u001b[93m\u001b[107m, id, ctrID)\u001b[47;142H\u001b[K\u001b[51;37H\u001b[1m\u001b[38;5;220m\u001b[48;5;240m + \u001b[m\u001b[93m\u001b[107m\u001b[38;5;240m\u001b[48;5;236m\u001b[51;41H \u001b[47;89H\u001b[?12l\u001b[?25h" + ], + [ + 0.501563, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[36mntainer \u001b[m\u001b[93m\u001b[107m\u001b[31m%q\u001b[m\u001b[93m\u001b[107m\u001b[36m is using its reference image\"\u001b[m\u001b[93m\u001b[107m, id, ctrID)\u001b[47;141H\u001b[K\u001b[47;89H\u001b[?12l\u001b[?25h" + ], + [ + 0.019326, + "\u001b[?25l\u001b[36mtainer \u001b[m\u001b[93m\u001b[107m\u001b[31m%q\u001b[m\u001b[93m\u001b[107m\u001b[36m is using its reference image\"\u001b[m\u001b[93m\u001b[107m, id, ctrID)\u001b[47;140H\u001b[K\u001b[47;89H\u001b[?12l\u001b[?25h" + ], + [ + 0.032305, + "\u001b[?25l\u001b[36mainer \u001b[m\u001b[93m\u001b[107m\u001b[31m%q\u001b[m\u001b[93m\u001b[107m\u001b[36m is using its reference image\"\u001b[m\u001b[93m\u001b[107m, id, ctrID)\u001b[47;139H\u001b[K\u001b[47;89H\u001b[?12l\u001b[?25h" + ], + [ + 0.027042, + "\u001b[?25l\u001b[36miner \u001b[m\u001b[93m\u001b[107m\u001b[31m%q\u001b[m\u001b[93m\u001b[107m\u001b[36m is using its reference image\"\u001b[m\u001b[93m\u001b[107m, id, ctrID)\u001b[47;138H\u001b[K\u001b[47;89H\u001b[?12l\u001b[?25h" + ], + [ + 0.033786, + "\u001b[?25l\u001b[36mner \u001b[m\u001b[93m\u001b[107m\u001b[31m%q\u001b[m\u001b[93m\u001b[107m\u001b[36m is using its reference image\"\u001b[m\u001b[93m\u001b[107m, id, ctrID)\u001b[47;137H\u001b[K\u001b[47;89H\u001b[?12l\u001b[?25h" + ], + [ + 0.032065, + "\u001b[?25l\u001b[36mer \u001b[m\u001b[93m\u001b[107m\u001b[31m%q\u001b[m\u001b[93m\u001b[107m\u001b[36m is using its reference image\"\u001b[m\u001b[93m\u001b[107m, id, ctrID)\u001b[47;136H\u001b[K\u001b[47;89H\u001b[?12l\u001b[?25h" + ], + [ + 0.02938, + "\u001b[?25l\u001b[36mr \u001b[m\u001b[93m\u001b[107m\u001b[31m%q\u001b[m\u001b[93m\u001b[107m\u001b[36m is using its reference image\"\u001b[m\u001b[93m\u001b[107m, id, ctrID)\u001b[47;135H\u001b[K\u001b[47;89H\u001b[?12l\u001b[?25h" + ], + [ + 0.031174, + "\u001b[?25l\u001b[36m \u001b[m\u001b[93m\u001b[107m\u001b[31m%q\u001b[m\u001b[93m\u001b[107m\u001b[36m is using its reference image\"\u001b[m\u001b[93m\u001b[107m, id, ctrID)\u001b[47;134H\u001b[K\u001b[47;89H\u001b[?12l\u001b[?25h" + ], + [ + 0.032572, + "\u001b[?25l\u001b[31m%q\u001b[m\u001b[93m\u001b[107m\u001b[36m is using its reference image\"\u001b[m\u001b[93m\u001b[107m, id, ctrID)\u001b[47;133H\u001b[K\u001b[47;89H\u001b[?12l\u001b[?25h" + ], + [ + 0.025383, + "\u001b[?25l\u001b[36mq is using its reference image\"\u001b[m\u001b[93m\u001b[107m, id, ctrID)\u001b[47;132H\u001b[K\u001b[47;89H\u001b[?12l\u001b[?25h" + ], + [ + 0.209138, + "\u001b[?25l\u001b[36m is using its reference image\"\u001b[m\u001b[93m\u001b[107m, id, ctrID)\u001b[47;131H\u001b[K\u001b[47;89H\u001b[?12l\u001b[?25h" + ], + [ + 0.199764, + "\u001b[?25l\u001b[36mis using its reference image\"\u001b[m\u001b[93m\u001b[107m, id, ctrID)\u001b[47;130H\u001b[K\u001b[47;89H\u001b[?12l\u001b[?25h" + ], + [ + 0.172621, + "\u001b[?25l\u001b[36ms using its reference image\"\u001b[m\u001b[93m\u001b[107m, id, ctrID)\u001b[47;129H\u001b[K\u001b[47;89H\u001b[?12l\u001b[?25h" + ], + [ + 0.186391, + "\u001b[?25l\u001b[36m using its reference image\"\u001b[m\u001b[93m\u001b[107m, id, ctrID)\u001b[47;128H\u001b[K\u001b[47;89H\u001b[?12l\u001b[?25h" + ], + [ + 0.397295, + "\u001b[?25l\u001b[52;1H\u001b[34m-- INSERT --\u001b[m\u001b[93m\u001b[107m\u001b[52;13H\u001b[K" + ], + [ + 0.04224, + "\u001b[51;1H\u001b[1m\u001b[38;5;23m\u001b[48;5;231m INSERT \u001b[m\u001b[93m\u001b[107m\u001b[38;5;148m\u001b[48;5;240m\u001b[m\u001b[93m\u001b[107m\u001b[51;9H\u001b[38;5;231m\u001b[48;5;31m\u001b[51;10H \u001b[m\u001b[93m\u001b[107m\u001b[38;5;117m\u001b[48;5;31m\u001b[51;12H master \u001b[m\u001b[93m\u001b[107m\u001b[38;5;74m\u001b[48;5;31m\u001b[51;21H \u001b[m\u001b[93m\u001b[107m\u001b[38;5;117m\u001b[48;5;31mcmd/kpod/\u001b[m\u001b[93m\u001b[107m\u001b[1m\u001b[38;5;231m\u001b[48;5;31mrmi.go\u001b[m\u001b[93m\u001b[107m\u001b[1m\u001b[38;5;220m\u001b[48;5;240m \u001b[m\u001b[93m\u001b[107m\b\u001b[1m\u001b[38;5;220m\u001b[48;5;31m + \u001b[m\u001b[93m\u001b[107m\u001b[38;5;240m\u001b[48;5;236m\u001b[m\u001b[93m\u001b[107m\u001b[51;40H\u001b[38;5;31m\u001b[48;5;24m\u001b[51;41H \u001b[m\u001b[93m\u001b[107m\u001b[38;5;231m\u001b[48;5;24m                                                                                                                                      \u001b[m\u001b[93m\u001b[107m\u001b[38;5;117m\u001b[48;5;24munix\u001b[m\u001b[93m\u001b[107m\u001b[38;5;74m\u001b[48;5;24m \u001b[m\u001b[93m\u001b[107m\u001b[51;182H\u001b[38;5;117m\u001b[48;5;24m utf-8\u001b[m\u001b[93m\u001b[107m\u001b[38;5;74m\u001b[48;5;24m \u001b[m\u001b[93m\u001b[107m\u001b[51;190H\u001b[38;5;117m\u001b[48;5;24m" + ], + [ + 3.5e-05, + " go\u001b[m\u001b[93m\u001b[107m\u001b[38;5;31m\u001b[48;5;24m \u001b[m\u001b[93m\u001b[107m\u001b[51;195H\u001b[38;5;186m\u001b[48;5;31m  54%\u001b[m\u001b[93m\u001b[107m\u001b[38;5;117m\u001b[48;5;31m \u001b[m\u001b[93m\u001b[107m\u001b[51;202H\u001b[38;5;24m\u001b[48;5;117m \u001b[51;204H \u001b[m\u001b[93m\u001b[107m\u001b[1m\u001b[38;5;24m\u001b[48;5;117m 66\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[m\u001b[93m\u001b[107m\b\u001b[38;5;22m\u001b[48;5;117m:85 \u001b[47;89H\u001b[?12l\u001b[?25h" + ], + [ + 0.318684, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[36mo using its reference image\"\u001b[m\u001b[93m\u001b[107m, id, ctrID)\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m6\u001b[47;90H\u001b[?12l\u001b[?25h" + ], + [ + 0.085993, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[36mn using its reference image\"\u001b[m\u001b[93m\u001b[107m, id, ctrID)\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m7\u001b[47;91H\u001b[?12l\u001b[?25h" + ], + [ + 0.102417, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[36me using its reference image\"\u001b[m\u001b[93m\u001b[107m, id, ctrID)\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m8\u001b[47;92H\u001b[?12l\u001b[?25h" + ], + [ + 0.096152, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[1C\u001b[36m using its reference image\"\u001b[m\u001b[93m\u001b[107m, id, ctrID)\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m9\u001b[47;93H\u001b[?12l\u001b[?25h" + ], + [ + 0.172551, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[36mm using its reference image\"\u001b[m\u001b[93m\u001b[107m, id, ctrID)\u001b[51;209H\u001b[38;5;22m\u001b[48;5;117m90\u001b[47;94H\u001b[?12l\u001b[?25h" + ], + [ + 0.084589, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[36mo using its reference image\"\u001b[m\u001b[93m\u001b[107m, id, ctrID)\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m1\u001b[47;95H\u001b[?12l\u001b[?25h" + ], + [ + 0.266563, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\b\u001b[36m using its reference image\"\u001b[m\u001b[93m\u001b[107m, id, ctrID)\u001b[47;133H\u001b[K\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m0\u001b[47;94H\u001b[?12l\u001b[?25h" + ], + [ + 0.134027, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\b\u001b[36m using its reference image\"\u001b[m\u001b[93m\u001b[107m, id, ctrID)\u001b[47;132H\u001b[K\u001b[51;209H\u001b[38;5;22m\u001b[48;5;117m89\u001b[47;93H\u001b[?12l\u001b[?25h" + ], + [ + 0.160501, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[36mo using its reference image\"\u001b[m\u001b[93m\u001b[107m, id, ctrID)\u001b[51;209H\u001b[38;5;22m\u001b[48;5;117m90\u001b[47;94H\u001b[?12l\u001b[?25h" + ], + [ + 0.158121, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[36mr using its reference image\"\u001b[m\u001b[93m\u001b[107m, id, ctrID)\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m1\u001b[47;95H\u001b[?12l\u001b[?25h" + ], + [ + 0.064495, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[1C\u001b[36m using its reference image\"\u001b[m\u001b[93m\u001b[107m, id, ctrID)\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m2\u001b[47;96H\u001b[?12l\u001b[?25h" + ], + [ + 0.178203, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[36mm using its reference image\"\u001b[m\u001b[93m\u001b[107m, id, ctrID)\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m3\u001b[47;97H\u001b[?12l\u001b[?25h" + ], + [ + 0.070967, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[36mo using its reference image\"\u001b[m\u001b[93m\u001b[107m, id, ctrID)\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m4\u001b[47;98H\u001b[?12l\u001b[?25h" + ], + [ + 0.049728, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[36mr using its reference image\"\u001b[m\u001b[93m\u001b[107m, id, ctrID)\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m5\u001b[47;99H\u001b[?12l\u001b[?25h" + ], + [ + 0.085073, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[36me using its reference image\"\u001b[m\u001b[93m\u001b[107m, id, ctrID)\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m6\u001b[47;100H\u001b[?12l\u001b[?25h" + ], + [ + 0.064728, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[1C\u001b[36m using its reference image\"\u001b[m\u001b[93m\u001b[107m, id, ctrID)\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m7\u001b[47;101H\u001b[?12l\u001b[?25h" + ], + [ + 0.115396, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[36mc using its reference image\"\u001b[m\u001b[93m\u001b[107m, id, ctrID)\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m8\u001b[47;102H\u001b[?12l\u001b[?25h" + ], + [ + 0.109608, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[36mo using its reference image\"\u001b[m\u001b[93m\u001b[107m, id, ctrID)\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m9\u001b[47;103H\u001b[?12l\u001b[?25h" + ], + [ + 0.07234, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[36mn using its reference image\"\u001b[m\u001b[93m\u001b[107m, id, ctrID)\u001b[51;175H\u001b[38;5;117m\u001b[48;5;24munix\u001b[m\u001b[93m\u001b[107m\u001b[38;5;74m\u001b[48;5;24m \u001b[m\u001b[93m\u001b[107m\u001b[51;181H\u001b[38;5;117m\u001b[48;5;24m utf-8\u001b[m\u001b[93m\u001b[107m\u001b[38;5;74m\u001b[48;5;24m \u001b[m\u001b[93m\u001b[107m\u001b[51;189H\u001b[38;5;117m\u001b[48;5;24m go\u001b[m\u001b[93m\u001b[107m\u001b[38;5;31m\u001b[48;5;24m \u001b[m\u001b[93m\u001b[107m\u001b[51;194H\u001b[38;5;186m\u001b[48;5;31m \u001b[1C54%\u001b[m\u001b[93m\u001b[107m\u001b[38;5;117m\u001b[48;5;31m \u001b[m\u001b[93m\u001b[107m\u001b[51;201H\u001b[38;5;24m\u001b[48;5;117m \u001b[51;203H \u001b[m\u001b[93m\u001b[107m\u001b[1m\u001b[38;5;24m\u001b[48;5;117m 66\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;117m:100\u001b[47;104H\u001b[?12l\u001b[?25h" + ], + [ + 0.106017, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[36mt using its reference image\"\u001b[m\u001b[93m\u001b[107m, id, ctrID)\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m1\u001b[47;105H\u001b[?12l\u001b[?25h" + ], + [ + 0.037147, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[36ma using its reference image\"\u001b[m\u001b[93m\u001b[107m, id, ctrID)\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m2\u001b[47;106H\u001b[?12l\u001b[?25h" + ], + [ + 0.120393, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[36mi using its reference image\"\u001b[m\u001b[93m\u001b[107m, id, ctrID)\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m3\u001b[47;107H\u001b[?12l\u001b[?25h" + ], + [ + 0.054877, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[36mn using its reference image\"\u001b[m\u001b[93m\u001b[107m, id, ctrID)\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m4\u001b[47;108H\u001b[?12l\u001b[?25h" + ], + [ + 0.055511, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[36me using its reference image\"\u001b[m\u001b[93m\u001b[107m, id, ctrID)\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m5\u001b[47;109H\u001b[?12l\u001b[?25h" + ], + [ + 0.044523, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[36mr using its reference image\"\u001b[m\u001b[93m\u001b[107m, id, ctrID)\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m6\u001b[47;110H\u001b[?12l\u001b[?25h" + ], + [ + 0.164345, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[36ms using its reference image\"\u001b[m\u001b[93m\u001b[107m, id, ctrID)\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m7\u001b[47;111H\u001b[?12l\u001b[?25h" + ], + [ + 0.113242, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[1C\u001b[36m using its reference image\"\u001b[m\u001b[93m\u001b[107m, id, ctrID)\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m8\u001b[47;112H\u001b[?12l\u001b[?25h" + ], + [ + 0.065749, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[36ma using its reference image\"\u001b[m\u001b[93m\u001b[107m, id, ctrID)\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m9\u001b[47;113H\u001b[?12l\u001b[?25h" + ], + [ + 0.067013, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[36mr using its reference image\"\u001b[m\u001b[93m\u001b[107m, id, ctrID)\u001b[51;209H\u001b[38;5;22m\u001b[48;5;117m10\u001b[47;114H\u001b[?12l\u001b[?25h" + ], + [ + 0.082416, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[36me using its reference image\"\u001b[m\u001b[93m\u001b[107m, id, ctrID)\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m1\u001b[47;115H\u001b[?12l\u001b[?25h" + ], + [ + 0.391867, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[52;1H\u001b[K" + ], + [ + 0.002802, + "\u001b[51;1H\u001b[1m\u001b[38;5;22m\u001b[48;5;148m NORMAL \u001b[m\u001b[93m\u001b[107m\u001b[38;5;231m\u001b[48;5;31m\u001b[m\u001b[93m\u001b[107m\u001b[51;9H\u001b[38;5;148m\u001b[48;5;240m\u001b[51;10H \u001b[m\u001b[93m\u001b[107m\u001b[38;5;250m\u001b[48;5;240m\u001b[51;12H master \u001b[m\u001b[93m\u001b[107m\u001b[38;5;245m\u001b[48;5;240m\u001b[51;21H \u001b[m\u001b[93m\u001b[107m\u001b[38;5;250m\u001b[48;5;240mcmd/kpod/\u001b[m\u001b[93m\u001b[107m\u001b[1m\u001b[38;5;231m\u001b[48;5;240mrmi.go\u001b[m\u001b[93m\u001b[107m\u001b[1m\u001b[38;5;220m\u001b[48;5;31m \u001b[m\u001b[93m\u001b[107m\b\u001b[1m\u001b[38;5;220m\u001b[48;5;240m + \u001b[m\u001b[93m\u001b[107m\u001b[38;5;31m\u001b[48;5;24m\u001b[m\u001b[93m\u001b[107m\u001b[51;40H\u001b[38;5;240m\u001b[48;5;236m\u001b[51;41H \u001b[m\u001b[93m\u001b[107m\u001b[38;5;231m\u001b[48;5;236m                                                                                                                                     \u001b[m\u001b[93m\u001b[107m\u001b[38;5;247m\u001b[48;5;236munix\u001b[m\u001b[93m\u001b[107m\u001b[38;5;244m\u001b[48;5;236m \u001b[m\u001b[93m\u001b[107m\u001b[51;181H\u001b[38;5;247m\u001b[48;5;236m utf-8\u001b[m\u001b[93m\u001b[107m\u001b[38;5;244m\u001b[48;5;236m \u001b[m\u001b[93m\u001b[107m\u001b[51;189H\u001b[38;5;247m" + ], + [ + 4.4e-05, + "\u001b[48;5;236m go\u001b[m\u001b[93m\u001b[107m\u001b[38;5;240m\u001b[48;5;236m \u001b[m\u001b[93m\u001b[107m\u001b[51;194H\u001b[38;5;107m\u001b[48;5;240m  54%\u001b[m\u001b[93m\u001b[107m\u001b[38;5;252m\u001b[48;5;240m \u001b[m\u001b[93m\u001b[107m\u001b[51;201H\u001b[38;5;235m\u001b[48;5;252m \u001b[51;203H \u001b[m\u001b[93m\u001b[107m\u001b[1m\u001b[38;5;235m\u001b[48;5;252m 66\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;117m:\u001b[m\u001b[93m\u001b[107m\b\u001b[38;5;22m\u001b[48;5;252m:110 \u001b[47;114H\u001b[?12l\u001b[?25h" + ], + [ + 0.330025, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[47;46H\u001b[1m\u001b[31m\u001b[106m(\u001b[106C)\u001b[m\u001b[93m\u001b[107m\u001b[51;209H\u001b[38;5;22m\u001b[48;5;252m49\u001b[47;153H\u001b[?12l\u001b[?25h" + ], + [ + 0.483853, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[52;1H\u001b[34m-- INSERT --" + ], + [ + 0.009014, + "\u001b[m\u001b[93m\u001b[107m\u001b[51;1H\u001b[1m\u001b[38;5;23m\u001b[48;5;231m INSERT \u001b[m\u001b[93m\u001b[107m\u001b[38;5;148m\u001b[48;5;240m\u001b[m\u001b[93m\u001b[107m\u001b[51;9H\u001b[38;5;231m\u001b[48;5;31m\u001b[51;10H \u001b[m\u001b[93m\u001b[107m\u001b[38;5;117m\u001b[48;5;31m\u001b[51;12H master \u001b[m\u001b[93m\u001b[107m\u001b[38;5;74m\u001b[48;5;31m\u001b[51;21H \u001b[m\u001b[93m\u001b[107m\u001b[38;5;117m\u001b[48;5;31mcmd/kpod/\u001b[m\u001b[93m\u001b[107m\u001b[1m\u001b[38;5;231m\u001b[48;5;31mrmi.go\u001b[m\u001b[93m\u001b[107m\u001b[1m\u001b[38;5;220m\u001b[48;5;240m \u001b[m\u001b[93m\u001b[107m\b\u001b[1m\u001b[38;5;220m\u001b[48;5;31m + \u001b[m\u001b[93m\u001b[107m\u001b[38;5;240m\u001b[48;5;236m\u001b[m\u001b[93m\u001b[107m\u001b[51;40H\u001b[38;5;31m\u001b[48;5;24m\u001b[51;41H \u001b[m\u001b[93m\u001b[107m\u001b[38;5;231m\u001b[48;5;24m                                                                                                                                     \u001b[m\u001b[93m\u001b[107m\u001b[38;5;117m\u001b[48;5;24munix\u001b[m\u001b[93m\u001b[107m\u001b[38;5;74m\u001b[48;5;24m \u001b[m\u001b[93m\u001b[107m\u001b[51;181H\u001b[38;5;117m\u001b[48;5;24m utf-8\u001b[m\u001b[93m\u001b[107m\u001b[38;5;74m\u001b[48;5;24m \u001b[m\u001b[93m\u001b[107m\u001b[51;189H\u001b[38;5;11" + ], + [ + 8.4e-05, + "7m\u001b[48;5;24m go\u001b[m\u001b[93m\u001b[107m\u001b[38;5;31m\u001b[48;5;24m \u001b[m\u001b[93m\u001b[107m\u001b[51;194H\u001b[38;5;186m\u001b[48;5;31m  54%\u001b[m\u001b[93m\u001b[107m\u001b[38;5;117m\u001b[48;5;31m \u001b[m\u001b[93m\u001b[107m\u001b[51;201H\u001b[38;5;24m\u001b[48;5;117m \u001b[51;203H \u001b[m\u001b[93m\u001b[107m\u001b[1m\u001b[38;5;24m\u001b[48;5;117m 66\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[m\u001b[93m\u001b[107m\b\u001b[38;5;22m\u001b[48;5;117m:149 \u001b[47;153H\u001b[?12l\u001b[?25h" + ], + [ + 0.255014, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\b)\u001b[47;153H\u001b[K\u001b[47;152H\u001b[1m\u001b[31m\u001b[106m)\u001b[m\u001b[93m\u001b[107m\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m8\u001b[47;152H\u001b[?12l\u001b[?25h" + ], + [ + 0.143393, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\b)\u001b[47;152H\u001b[K\u001b[47;151H\u001b[1m\u001b[31m\u001b[106m)\u001b[m\u001b[93m\u001b[107m\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m7\u001b[47;151H\u001b[?12l\u001b[?25h" + ], + [ + 0.173726, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\b)\u001b[47;151H\u001b[K\u001b[47;150H\u001b[1m\u001b[31m\u001b[106m)\u001b[m\u001b[93m\u001b[107m\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m6\u001b[47;150H\u001b[?12l\u001b[?25h" + ], + [ + 0.151736, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\b)\u001b[47;150H\u001b[K\u001b[47;149H\u001b[1m\u001b[31m\u001b[106m)\u001b[m\u001b[93m\u001b[107m\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m5\u001b[47;149H\u001b[?12l\u001b[?25h" + ], + [ + 0.17734, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\b)\u001b[47;149H\u001b[K\u001b[47;148H\u001b[1m\u001b[31m\u001b[106m)\u001b[m\u001b[93m\u001b[107m\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m4\u001b[47;148H\u001b[?12l\u001b[?25h" + ], + [ + 0.158422, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\b)\u001b[47;148H\u001b[K\u001b[47;147H\u001b[1m\u001b[31m\u001b[106m)\u001b[m\u001b[93m\u001b[107m\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m3\u001b[47;147H\u001b[?12l\u001b[?25h" + ], + [ + 0.144092, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\b)\u001b[47;147H\u001b[K\u001b[47;146H\u001b[1m\u001b[31m\u001b[106m)\u001b[m\u001b[93m\u001b[107m\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m2\u001b[47;146H\u001b[?12l\u001b[?25h" + ], + [ + 0.211601, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[52;1H\u001b[K" + ], + [ + 0.009089, + "\u001b[47;46H(\u001b[36m\"\u001b[m\u001b[93m\u001b[107m\u001b[98C)\u001b[51;1H\u001b[1m\u001b[38;5;22m\u001b[48;5;148m NORMAL \u001b[m\u001b[93m\u001b[107m\u001b[38;5;231m\u001b[48;5;31m\u001b[m\u001b[93m\u001b[107m\u001b[51;9H\u001b[38;5;148m\u001b[48;5;240m\u001b[51;10H \u001b[m\u001b[93m\u001b[107m\u001b[38;5;250m\u001b[48;5;240m\u001b[51;12H master \u001b[m\u001b[93m\u001b[107m\u001b[38;5;245m\u001b[48;5;240m\u001b[51;21H \u001b[m\u001b[93m\u001b[107m\u001b[38;5;250m\u001b[48;5;240mcmd/kpod/\u001b[m\u001b[93m\u001b[107m\u001b[1m\u001b[38;5;231m\u001b[48;5;240mrmi.go\u001b[m\u001b[93m\u001b[107m\u001b[1m\u001b[38;5;220m\u001b[48;5;31m \u001b[m\u001b[93m\u001b[107m\b\u001b[1m\u001b[38;5;220m\u001b[48;5;240m + \u001b[m\u001b[93m\u001b[107m\u001b[38;5;31m\u001b[48;5;24m\u001b[m\u001b[93m\u001b[107m\u001b[51;40H\u001b[38;5;240m\u001b[48;5;236m\u001b[51;41H \u001b[m\u001b[93m\u001b[107m\u001b[38;5;231m\u001b[48;5;236m                                                                                                                                     \u001b[m\u001b[93m\u001b[107m\u001b[38;5;247m\u001b[48;5;236munix\u001b[m\u001b[93m\u001b[107m\u001b[38;5;244m\u001b[48;5;236m \u001b[m\u001b[93m\u001b[107m\u001b[51;181H\u001b[38;5;247m\u001b[48;5;236m utf-8\u001b[m\u001b[93m\u001b[107m\u001b[38;5;244m\u001b[48;5;236m " + ], + [ + 3.1e-05, + "\u001b[m\u001b[93m\u001b[107m\u001b[51;189H\u001b[38;5;247m\u001b[48;5;236m go\u001b[m\u001b[93m\u001b[107m\u001b[38;5;240m\u001b[48;5;236m \u001b[m\u001b[93m\u001b[107m\u001b[51;194H\u001b[38;5;107m\u001b[48;5;240m  54%\u001b[m\u001b[93m\u001b[107m\u001b[38;5;252m\u001b[48;5;240m \u001b[m\u001b[93m\u001b[107m\u001b[51;201H\u001b[38;5;235m\u001b[48;5;252m \u001b[51;203H \u001b[m\u001b[93m\u001b[107m\u001b[1m\u001b[38;5;235m\u001b[48;5;252m 66\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;117m:\u001b[m\u001b[93m\u001b[107m\b\u001b[38;5;22m\u001b[48;5;252m:141 \u001b[47;145H\u001b[?12l\u001b[?25h" + ], + [ + 0.214474, + "\u001b[?25l\u001b[52;1H\u001b[m\u001b[93m\u001b[107m:\u001b[?2004h\u001b[?12l\u001b[?25h" + ], + [ + 0.143718, + "w\u001b[?25l\u001b[?12l\u001b[?25h" + ], + [ + 0.056661, + "q" + ], + [ + 7.6e-05, + "\u001b[?25l\u001b[?12l\u001b[?25h" + ], + [ + 0.071657, + "\r" + ], + [ + 7.3e-05, + "\u001b[?25l\u001b[?2004l" + ], + [ + 0.023973, + "\"cmd/kpod/rmi.go\"" + ], + [ + 0.003962, + " 123L, 3100C written" + ], + [ + 0.012358, + "\r\r\r\n\u001b[39;49m\u001b[?2004l\u001b[?1l\u001b>\u001b[?12l\u001b[?25h\u001b[?1049l" + ], + [ + 0.001868, + "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r" + ], + [ + 0.016767, + "\r\n\u001b[34m\u001b[01mcri-o\u001b[22m \u001b[90mgit/master* \u001b[39m \u001b[33m13s\u001b[39m\r\n" + ], + [ + 0.001258, + "\u001b]7;file://localhost.localdomain/home/ryan/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007" + ], + [ + 5.2e-05, + "\u001b]2;ryan@localhost: ~/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007" + ], + [ + 1.6e-05, + "\u001b]1;..cubator/cri-o\u0007" + ], + [ + 7e-05, + "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[35m❯\u001b[39m \u001b[K\u001b[208C\u001b[90m\u001b[39m\u001b[208D" + ], + [ + 5.8e-05, + "\u001b[?1h\u001b=" + ], + [ + 2.4e-05, + "\u001b[?2004h" + ], + [ + 2.403767, + "s" + ], + [ + 0.072404, + "\bsu" + ], + [ + 0.087776, + "d" + ], + [ + 0.10411, + "o" + ], + [ + 0.103535, + " " + ], + [ + 0.112565, + "m" + ], + [ + 0.103814, + "a" + ], + [ + 0.127747, + "k" + ], + [ + 0.104285, + "e" + ], + [ + 0.055181, + " " + ], + [ + 0.096552, + "k" + ], + [ + 0.695888, + "\b \b" + ], + [ + 0.499894, + "\b" + ], + [ + 0.031116, + "\b \b" + ], + [ + 0.031334, + "\b \b" + ], + [ + 0.03129, + "\b \b" + ], + [ + 0.030503, + "\b \b" + ], + [ + 0.029752, + "\b" + ], + [ + 0.03046, + "\b \b" + ], + [ + 0.029619, + "\b \b" + ], + [ + 0.031117, + "\b\bs \b" + ], + [ + 0.030333, + "\b \b" + ], + [ + 0.143801, + "m" + ], + [ + 0.137018, + "\bma" + ], + [ + 0.127748, + "k" + ], + [ + 0.071257, + "e" + ], + [ + 0.112655, + " " + ], + [ + 0.103705, + "k" + ], + [ + 0.120423, + "p" + ], + [ + 0.088219, + "o" + ], + [ + 0.151337, + "d" + ], + [ + 0.144145, + "\u001b[?1l\u001b>" + ], + [ + 0.000245, + "\u001b[?2004l\r\r\n" + ], + [ + 0.003789, + "\u001b]2;make kpod\u0007\u001b]1;make\u0007" + ], + [ + 6.807666, + "go build -ldflags '-X main.gitCommit=6ca462a3 -X main.buildInfo=1502976873' -tags \"selinux seccomp \" -o kpod github.com/kubernetes-incubator/cri-o/cmd/kpod\r\n" + ], + [ + 2.098933, + "# github.com/kubernetes-incubator/cri-o/cmd/kpod\r\ncmd/kpod/rmi.go:65: ctrID declared and not used\r\n" + ], + [ + 0.002582, + "make: *** [Makefile:83: kpod] Error 2\r\n" + ], + [ + 0.000308, + "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r" + ], + [ + 0.020816, + "\r\n\u001b[34m\u001b[01mcri-o\u001b[22m \u001b[90mgit/master* \u001b[39m \u001b[33m9s\u001b[39m\r\n" + ], + [ + 0.001294, + "\u001b]7;file://localhost.localdomain/home/ryan/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007" + ], + [ + 0.000209, + "\u001b]2;ryan@localhost: ~/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007\u001b]1;..cubator/cri-o\u0007" + ], + [ + 3e-05, + "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[31m❯\u001b[39m " + ], + [ + 2.1e-05, + "\u001b[K\u001b[208C\u001b[90m\u001b[39m\u001b[208D" + ], + [ + 0.000157, + "\u001b[?1h\u001b=" + ], + [ + 3.1e-05, + "\u001b[?2004h" + ], + [ + 2.964102, + "v" + ], + [ + 0.136044, + "\bvu" + ], + [ + 0.095982, + " " + ], + [ + 0.088003, + "c" + ], + [ + 0.08868, + "n" + ], + [ + 0.154713, + "\u0007" + ], + [ + 0.10947, + "j" + ], + [ + 0.161602, + "\u0007" + ], + [ + 0.173494, + "\b \b" + ], + [ + 0.151719, + "\b \b" + ], + [ + 0.609085, + "m" + ], + [ + 0.167394, + "d\u001b[1m/\u001b[0m" + ], + [ + 0.840479, + "\b\u001b[0m/k" + ], + [ + 0.206026, + "pod\u001b[1m/\u001b[0m" + ], + [ + 0.257517, + "\b\u001b[0m/r" + ], + [ + 0.127635, + "m" + ], + [ + 0.103364, + "i.go\u001b[1m \u001b[0m" + ], + [ + 0.616305, + "\b\u001b[0m \b" + ], + [ + 0.000215, + "\u001b[?1l\u001b>" + ], + [ + 0.000236, + "\u001b[?2004l\r\r\n" + ], + [ + 0.004049, + "\u001b]2;vu cmd/kpod/rmi.go\u0007\u001b]1;vu\u0007" + ], + [ + 0.00938, + "zsh: vu: command not found..." + ], + [ + 6.4e-05, + "\r\n" + ], + [ + 0.171147, + "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r" + ], + [ + 0.017238, + "\r\n\u001b[34m\u001b[01mcri-o\u001b[22m \u001b[90mgit/master* \u001b[39m \u001b[33m\u001b[39m\r\n" + ], + [ + 0.001466, + "\u001b]7;file://localhost.localdomain/home/ryan/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007" + ], + [ + 0.00011, + "\u001b]2;ryan@localhost: ~/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007" + ], + [ + 1.7e-05, + "\u001b]1;..cubator/cri-o\u0007" + ], + [ + 8e-05, + "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[31m❯\u001b[39m \u001b[K\u001b[208C\u001b[90m\u001b[39m\u001b[208D" + ], + [ + 7.3e-05, + "\u001b[?1h\u001b=" + ], + [ + 3.2e-05, + "\u001b[?2004h" + ], + [ + 0.476196, + "6" + ], + [ + 0.080551, + "\b65" + ], + [ + 0.255454, + "G" + ], + [ + 0.432225, + "\b \b" + ], + [ + 0.159879, + "\b\b6 \b" + ], + [ + 0.1445, + "\b \b" + ], + [ + 0.384217, + "vu cmd/kpod/rmi.go" + ], + [ + 0.895489, + "\u001b[18D" + ], + [ + 0.176977, + "\u001b[1C" + ], + [ + 0.166725, + "\u001b[1C" + ], + [ + 0.256332, + "\b\bv cmd/kpod/rmi.go \u001b[17D" + ], + [ + 0.520213, + "\bvi cmd/kpod/rmi.go\u001b[16D" + ], + [ + 0.223669, + "\u001b[?1l\u001b>" + ], + [ + 0.000151, + "\u001b[?2004l\r\r\n" + ], + [ + 0.00446, + "\u001b]2;vim cmd/kpod/rmi.go\u0007\u001b]1;vi\u0007" + ], + [ + 0.138232, + "\u001b[?2004h\u001b[?1049h\u001b[?1h\u001b=\u001b[?2004h" + ], + [ + 0.000485, + "\u001b[1;52r\u001b[?12;25h\u001b[?12l\u001b[?25h\u001b[27m\u001b[23m\u001b[m\u001b[93m\u001b[107m\u001b[H\u001b[2J\u001b[?25l\u001b[52;1H\"cmd/kpod/rmi.go\"" + ], + [ + 0.000106, + " 123L, 3100C" + ], + [ + 0.008045, + "\u001b[2;1H▽\u001b[6n\u001b[2;1H \u001b[1;1H\u001b[>c" + ], + [ + 0.002005, + "\u001b[1;1H\u001b[96m\u001b[47m 20 \u001b[m\u001b[93m\u001b[107m rmiCommand = cli.Command{\r\n\u001b[96m\u001b[47m 21 \u001b[m\u001b[93m\u001b[107m\u001b[8CName:\u001b[8C\u001b[36m\"rmi\"\u001b[m\u001b[93m\u001b[107m,\r\n\u001b[96m\u001b[47m 22 \u001b[m\u001b[93m\u001b[107m\u001b[8CUsage:\u001b[7C\u001b[36m\"removes one or more images from local storage\"\u001b[m\u001b[93m\u001b[107m,\r\n\u001b[96m\u001b[47m 23 \u001b[m\u001b[93m\u001b[107m\u001b[8CDescription: rmiDescription,\r\n\u001b[96m\u001b[47m 24 \u001b[m\u001b[93m\u001b[107m\u001b[8CAction: rmiCmd,\r\n\u001b[96m\u001b[47m 25 \u001b[m\u001b[93m\u001b[107m\u001b[8CArgsUsage: \u001b[36m\"IMAGE-NAME-OR-ID [...]\"\u001b[m\u001b[93m\u001b[107m,\r\n\u001b[96m\u001b[47m 26 \u001b[m\u001b[93m\u001b[107m\u001b[8CFlags:\u001b[7CrmiFlags,\r\n\u001b[96m\u001b[47m 27 \u001b[m\u001b[93m\u001b[107m }\r\n\u001b[96m\u001b[47m 28 \u001b[m\u001b[93m\u001b[107m)\r\n\u001b[96m\u001b[47m 29 \r\n 30 \u001b[m\u001b[93m\u001b[107m\u001b[32mfunc\u001b[m\u001b[93m\u001b[107m rmiCmd(c *cli.Context) \u001b[33merror\u001b[m\u001b[93m\u001b[107m {\r\n\u001b[96m\u001b[47m 31 \r\n 32 \u001b[m\u001b[93m\u001b[107m force := \u001b[36mfalse\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m 33 \u001b[m\u001b[93m\u001b[107m \u001b[32mif\u001b[m\u001b[93m\u001b[107m c.IsSet(\u001b[36m\"force\"\u001b[m\u001b[93m\u001b[107m) {\r\n\u001b[96m\u001b[47m 34 \u001b[m\u001b[93m\u001b[107m\u001b[8Cforce = c.Bool(\u001b[36m\"force\"\u001b[m\u001b[93m\u001b[107m)\r\n\u001b[96m\u001b[47m 35 \u001b[m\u001b[93m\u001b[107m }\r\n\u001b[96m\u001b[47m 36 \r\n 37 \u001b[m\u001b[93m\u001b[107m args := c.Args()\r\n\u001b[96m\u001b[47m 3" + ], + [ + 1.9e-05, + "8 \u001b[m\u001b[93m\u001b[107m \u001b[32mif\u001b[m\u001b[93m\u001b[107m \u001b[32mlen\u001b[m\u001b[93m\u001b[107m(args) == \u001b[36m0\u001b[m\u001b[93m\u001b[107m {\r\n\u001b[96m\u001b[47m 39 \u001b[m\u001b[93m\u001b[107m\u001b[8C\u001b[32mreturn\u001b[m\u001b[93m\u001b[107m errors.Errorf(\u001b[36m\"image name or ID must be specified\"\u001b[m\u001b[93m\u001b[107m)\r\n\u001b[96m\u001b[47m 40 \u001b[m\u001b[93m\u001b[107m }\r\n\u001b[96m\u001b[47m 41 \r\n 42 \u001b[m\u001b[93m\u001b[107m config, err := getConfig(c)\r\n\u001b[96m\u001b[47m 43 \u001b[m\u001b[93m\u001b[107m \u001b[32mif\u001b[m\u001b[93m\u001b[107m err != \u001b[36mnil\u001b[m\u001b[93m\u001b[107m {\r\n\u001b[96m\u001b[47m 44 \u001b[m\u001b[93m\u001b[107m\u001b[8C\u001b[32mreturn\u001b[m\u001b[93m\u001b[107m errors.Wrapf(err, \u001b[36m\"Could not get config\"\u001b[m\u001b[93m\u001b[107m)\r\n\u001b[96m\u001b[47m 45 \u001b[m\u001b[93m\u001b[107m }\r\n\u001b[96m\u001b[47m 46 \u001b[m\u001b[93m\u001b[107m store, err := getStore(config)\r\n\u001b[96m\u001b[47m 47 \u001b[m\u001b[93m\u001b[107m \u001b[32mif\u001b[m\u001b[93m\u001b[107m err != \u001b[36mnil\u001b[m\u001b[93m\u001b[107m {\r\n\u001b[96m\u001b[47m 48 \u001b[m\u001b[93m\u001b[107m\u001b[8C\u001b[32mreturn\u001b[m\u001b[93m\u001b[107m err\r\n\u001b[96m\u001b[47m 49 \u001b[m\u001b[93m\u001b[107m }\r\n\u001b[96m\u001b[47m 50 \r\n 51 \u001b[m\u001b[93m\u001b[107m \u001b[32mfor\u001b[m\u001b[93m\u001b[107m _, id := \u001b[32mrange\u001b[m\u001b[93m\u001b[107m args {\r\n\u001b[96m\u001b[47m 52 \u001b[m\u001b[93m\u001b[107m\u001b[8Cimage, err := libkpodimage.FindImage(store, id)\r\n" + ], + [ + 0.031049, + "\u001b[96m\u001b[47m 53 \u001b[m\u001b[93m\u001b[107m\u001b[8C\u001b[32mif\u001b[m\u001b[93m\u001b[107m err != \u001b[36mnil\u001b[m\u001b[93m\u001b[107m {\r\n\u001b[96m\u001b[47m 54 \u001b[m\u001b[93m\u001b[107m\u001b[12C\u001b[32mreturn\u001b[m\u001b[93m\u001b[107m errors.Wrapf(err, \u001b[36m\"could not get image \u001b[m\u001b[93m\u001b[107m\u001b[31m%q\u001b[m\u001b[93m\u001b[107m\u001b[36m\"\u001b[m\u001b[93m\u001b[107m, id)\r\n\u001b[96m\u001b[47m 55 \u001b[m\u001b[93m\u001b[107m\u001b[8C}\r\n\u001b[96m\u001b[47m 56 \u001b[m\u001b[93m\u001b[107m\u001b[8C\u001b[32mif\u001b[m\u001b[93m\u001b[107m image != \u001b[36mnil\u001b[m\u001b[93m\u001b[107m {\r\n\u001b[96m\u001b[47m 57 \u001b[m\u001b[93m\u001b[107m\u001b[12CctrIDs, err := runningContainers(image, store)\r\n\u001b[96m\u001b[47m 58 \u001b[m\u001b[93m\u001b[107m\u001b[12C\u001b[32mif\u001b[m\u001b[93m\u001b[107m err != \u001b[36mnil\u001b[m\u001b[93m\u001b[107m {\r\n\u001b[96m\u001b[47m 59 \u001b[m\u001b[93m\u001b[107m\u001b[16C\u001b[32mreturn\u001b[m\u001b[93m\u001b[107m errors.Wrapf(err, \u001b[36m\"error getting running containers for image \u001b[m\u001b[93m\u001b[107m\u001b[31m%q\u001b[m\u001b[93m\u001b[107m\u001b[36m\"\u001b[m\u001b[93m\u001b[107m, id)\r\n\u001b[96m\u001b[47m 60 \u001b[m\u001b[93m\u001b[107m\u001b[12C}\r\n\u001b[96m\u001b[47m 61 \u001b[m\u001b[93m\u001b[107m\u001b[12C\u001b[32mif\u001b[m\u001b[93m\u001b[107m \u001b[32mlen\u001b[m\u001b[93m\u001b[107m(ctrIDs) > \u001b[36m0\u001b[m\u001b[93m\u001b[107m && \u001b[32mlen\u001b[m\u001b[93m\u001b[107m(image.Names) <= \u001b[36m1\u001b[m\u001b[93m\u001b[107m {\r\n\u001b[96m\u001b[47m 62 \u001b[m\u001b[93m\u001b[107m\u001b[16C\u001b[32mif\u001b[m\u001b[93m\u001b[107m force {\r\n\u001b[96m\u001b[47m 63 \u001b[" + ], + [ + 0.000197, + "m\u001b[93m\u001b[107m\u001b[20CremoveContainers(ctrIDs, store)\r\n\u001b[96m\u001b[47m 64 \u001b[m\u001b[93m\u001b[107m\u001b[16C} \u001b[32melse\u001b[m\u001b[93m\u001b[107m {\r\n\u001b[96m\u001b[47m 65 \u001b[m\u001b[93m\u001b[107m\u001b[20C\u001b[32mfor\u001b[m\u001b[93m\u001b[107m ctrID := \u001b[32mrange\u001b[m\u001b[93m\u001b[107m ctrIDs {\r\n\u001b[96m\u001b[47m 66 \u001b[m\u001b[93m\u001b[107m\u001b[24C\u001b[32mreturn\u001b[m\u001b[93m\u001b[107m fmt.Errorf(\u001b[36m\"Could not remove image \u001b[m\u001b[93m\u001b[107m\u001b[31m%q\u001b[m\u001b[93m\u001b[107m\u001b[36m (must force) - one or more containers are using its reference image\"\u001b[m\u001b[93m\u001b[107m, id)\r\n\u001b[96m\u001b[47m 67 \u001b[m\u001b[93m\u001b[107m\u001b[20C}\r\n\u001b[96m\u001b[47m 68 \u001b[m\u001b[93m\u001b[107m\u001b[16C}\r\n\u001b[96m\u001b[47m 69 \u001b[m\u001b[93m\u001b[107m\u001b[12C}\r\n\u001b[1m\u001b[38;5;22m\u001b[48;5;148m NORMAL \u001b[m\u001b[93m\u001b[107m\u001b[38;5;148m\u001b[48;5;240m\u001b[51;10H \u001b[m\u001b[93m\u001b[107m\u001b[38;5;250m\u001b[48;5;240m\u001b[51;12H master \u001b[m\u001b[93m\u001b[107m\u001b[38;5;245m\u001b[48;5;240m\u001b[51;21H \u001b[m\u001b[93m\u001b[107m\u001b[38;5;250m\u001b[48;5;240mcmd/kpod/\u001b[m\u001b[93m\u001b[107m\u001b[1m\u001b[38;5;231m\u001b[48;5;240mrmi.go\u001b[m\u001b[93m\u001b[107m\u001b[38;5;220m\u001b[48;5;240m M \u001b[m\u001b[93m\u001b[107m\u001b[38;5;240m\u001b[48;5;236m\u001b[51;41H \u001b[m\u001b[93m\u001b[107m\u001b[38;5;231m\u001b[48;5;236m                        " + ], + [ + 0.009393, + "                                                                                                              \u001b[m\u001b[93m\u001b[107m\u001b[38;5;247m\u001b[48;5;236munix\u001b[m\u001b[93m\u001b[107m\u001b[38;5;244m\u001b[48;5;236m \u001b[m\u001b[93m\u001b[107m\u001b[51;182H\u001b[38;5;247m\u001b[48;5;236m utf-8\u001b[m\u001b[93m\u001b[107m\u001b[38;5;244m\u001b[48;5;236m \u001b[m\u001b[93m\u001b[107m\u001b[51;190H\u001b[38;5;247m\u001b[48;5;236m go\u001b[m\u001b[93m\u001b[107m\u001b[38;5;240m\u001b[48;5;236m \u001b[m\u001b[93m\u001b[107m\u001b[51;195H\u001b[38;5;107m\u001b[48;5;240m  54%\u001b[m\u001b[93m\u001b[107m\u001b[38;5;252m\u001b[48;5;240m \u001b[m\u001b[93m\u001b[107m\u001b[51;202H\u001b[38;5;235m\u001b[48;5;252m \u001b[51;204H \u001b[m\u001b[93m\u001b[107m\u001b[1m\u001b[38;5;235m\u001b[48;5;252m 66\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:25 \u001b[47;29H\u001b[?12l\u001b[?25h" + ], + [ + 0.000186, + "\u001bP+q436f\u001b\\\u001bP+q6b75\u001b\\\u001bP+q6b64\u001b\\\u001bP+q6b72\u001b\\\u001bP+q6b6c\u001b\\\u001bP+q2332\u001b\\\u001bP+q2334\u001b\\\u001bP+q2569\u001b\\\u001bP+q2a37\u001b\\\u001bP+q6b31\u001b\\" + ], + [ + 0.894574, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[43;30H\u001b[1m\u001b[31m\u001b[106m{\u001b[45;21H}\u001b[m\u001b[93m\u001b[107m\u001b[51;195H\u001b[38;5;107m\u001b[48;5;240m  52%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m4\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:17\u001b[45;21H\u001b[?12l\u001b[?25h" + ], + [ + 0.755059, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[43;30H{\u001b[45;21H} \u001b[51;195H\u001b[38;5;107m\u001b[48;5;240m  53%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m5\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:20\u001b[46;24H\u001b[?12l\u001b[?25h" + ], + [ + 0.297693, + "\u001b[?25l\u001b[51;210H1\u001b[46;25H\u001b[?12l\u001b[?25h" + ], + [ + 0.494594, + "\u001b[51;210H2\u001b[46;26H" + ], + [ + 0.029144, + "\u001b[51;210H3\u001b[46;27H" + ], + [ + 0.189856, + "\u001b[51;210H4\u001b[46;28H" + ], + [ + 0.503162, + "\u001b[51;210H5\u001b[46;29H" + ], + [ + 0.02688, + "\u001b[51;210H6\u001b[46;30H" + ], + [ + 0.031882, + "\u001b[51;210H7\u001b[46;31H" + ], + [ + 0.031015, + "\u001b[51;210H8\u001b[46;32H" + ], + [ + 0.028268, + "\u001b[51;210H9\u001b[46;33H" + ], + [ + 0.725696, + "\u001b[51;209H30\u001b[46;34H" + ], + [ + 5.869681, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[52;1H\u001b[34m-- INSERT --\u001b[m\u001b[93m\u001b[107m\u001b[52;13H\u001b[K" + ], + [ + 0.040358, + "\u001b[51;1H\u001b[1m\u001b[38;5;23m\u001b[48;5;231m INSERT \u001b[m\u001b[93m\u001b[107m\u001b[38;5;148m\u001b[48;5;240m\u001b[m\u001b[93m\u001b[107m\u001b[51;9H\u001b[38;5;231m\u001b[48;5;31m\u001b[51;10H \u001b[m\u001b[93m\u001b[107m\u001b[38;5;117m\u001b[48;5;31m\u001b[51;12H master \u001b[m\u001b[93m\u001b[107m\u001b[38;5;74m\u001b[48;5;31m\u001b[51;21H \u001b[m\u001b[93m\u001b[107m\u001b[38;5;117m\u001b[48;5;31mcmd/kpod/\u001b[m\u001b[93m\u001b[107m\u001b[1m\u001b[38;5;231m\u001b[48;5;31mrmi.go\u001b[m\u001b[93m\u001b[107m\u001b[38;5;220m\u001b[48;5;240m \u001b[m\u001b[93m\u001b[107m\b\u001b[38;5;220m\u001b[48;5;31m M \u001b[m\u001b[93m\u001b[107m\u001b[38;5;31m\u001b[48;5;24m\u001b[51;41H \u001b[m\u001b[93m\u001b[107m\u001b[38;5;231m\u001b[48;5;24m                                                                                                                                      \u001b[m\u001b[93m\u001b[107m\u001b[38;5;117m\u001b[48;5;24munix\u001b[m\u001b[93m\u001b[107m\u001b[38;5;74m\u001b[48;5;24m \u001b[m\u001b[93m\u001b[107m\u001b[51;182H\u001b[38;5;117m\u001b[48;5;24m utf-8\u001b[m\u001b[93m\u001b[107m\u001b[38;5;74m\u001b[48;5;24m \u001b[m\u001b[93m\u001b[107m\u001b[51;190H\u001b[38;5;117m\u001b[48;5;24m go\u001b[m\u001b[93m\u001b[107m\u001b[38;5;31m\u001b[48;5;24m \u001b[m\u001b[93m\u001b[10" + ], + [ + 2.4e-05, + "7m\u001b[51;195H\u001b[38;5;186m\u001b[48;5;31m  53%\u001b[m\u001b[93m\u001b[107m\u001b[38;5;117m\u001b[48;5;31m \u001b[m\u001b[93m\u001b[107m\u001b[51;202H\u001b[38;5;24m\u001b[48;5;117m \u001b[51;204H \u001b[m\u001b[93m\u001b[107m\u001b[1m\u001b[38;5;24m\u001b[48;5;117m 65\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[m\u001b[93m\u001b[107m\b\u001b[38;5;22m\u001b[48;5;117m:30 \u001b[46;34H\u001b[?12l\u001b[?25h" + ], + [ + 0.274464, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\b := \u001b[32mrange\u001b[m\u001b[93m\u001b[107m ctrIDs {\u001b[46;51H\u001b[K\u001b[51;39H\u001b[1m\u001b[38;5;220m\u001b[48;5;31m + \u001b[m\u001b[93m\u001b[107m\u001b[38;5;31m\u001b[48;5;24m\u001b[51;43H \u001b[m\u001b[93m\u001b[107m\u001b[165C\u001b[38;5;22m\u001b[48;5;117m29\u001b[46;33H\u001b[?12l\u001b[?25h" + ], + [ + 0.151925, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\b := \u001b[32mrange\u001b[m\u001b[93m\u001b[107m ctrIDs {\u001b[46;50H\u001b[K\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m8\u001b[46;32H\u001b[?12l\u001b[?25h" + ], + [ + 0.167731, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\b := \u001b[32mrange\u001b[m\u001b[93m\u001b[107m ctrIDs {\u001b[46;49H\u001b[K\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m7\u001b[46;31H\u001b[?12l\u001b[?25h" + ], + [ + 0.184041, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\b := \u001b[32mrange\u001b[m\u001b[93m\u001b[107m ctrIDs {\u001b[46;48H\u001b[K\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m6\u001b[46;30H\u001b[?12l\u001b[?25h" + ], + [ + 0.156407, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\b := \u001b[32mrange\u001b[m\u001b[93m\u001b[107m ctrIDs {\u001b[46;47H\u001b[K\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m5\u001b[46;29H\u001b[?12l\u001b[?25h" + ], + [ + 1.347077, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m_ := \u001b[32mrange\u001b[m\u001b[93m\u001b[107m ctrIDs {\u001b[51;210H\u001b[38;5;22m\u001b[48;5;117m6\u001b[46;30H\u001b[?12l\u001b[?25h" + ], + [ + 0.334595, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[52;1H\u001b[K" + ], + [ + 0.014443, + "\u001b[51;1H\u001b[1m\u001b[38;5;22m\u001b[48;5;148m NORMAL \u001b[m\u001b[93m\u001b[107m\u001b[38;5;231m\u001b[48;5;31m\u001b[m\u001b[93m\u001b[107m\u001b[51;9H\u001b[38;5;148m\u001b[48;5;240m\u001b[51;10H \u001b[m\u001b[93m\u001b[107m\u001b[38;5;250m\u001b[48;5;240m\u001b[51;12H master \u001b[m\u001b[93m\u001b[107m\u001b[38;5;245m\u001b[48;5;240m\u001b[51;21H \u001b[m\u001b[93m\u001b[107m\u001b[38;5;250m\u001b[48;5;240mcmd/kpod/\u001b[m\u001b[93m\u001b[107m\u001b[1m\u001b[38;5;231m\u001b[48;5;240mrmi.go\u001b[m\u001b[93m\u001b[107m\u001b[38;5;220m\u001b[48;5;31m \u001b[m\u001b[93m\u001b[107m\b\u001b[38;5;220m\u001b[48;5;240m M\u001b[m\u001b[93m\u001b[107m\u001b[1m\u001b[38;5;220m\u001b[48;5;240m + \u001b[m\u001b[93m\u001b[107m\u001b[38;5;31m\u001b[48;5;24m\u001b[m\u001b[93m\u001b[107m\u001b[51;42H\u001b[38;5;240m\u001b[48;5;236m\u001b[51;43H \u001b[m\u001b[93m\u001b[107m\u001b[38;5;231m\u001b[48;5;236m                                                                                                                                    \u001b[m\u001b[93m\u001b[107m\u001b[38;5;247m\u001b[48;5;236munix\u001b[m\u001b[93m\u001b[107m\u001b[38;5;244m\u001b[48;5;236m \u001b[m\u001b[93m\u001b[107m\u001b[51;182H\u001b[38;5;247m\u001b[48;5;236m utf-8\u001b[m\u001b[93m\u001b[107m\u001b[38;5;244m\u001b[48;5;236m \u001b" + ], + [ + 2.9e-05, + "[m\u001b[93m\u001b[107m\u001b[51;190H\u001b[38;5;247m\u001b[48;5;236m go\u001b[m\u001b[93m\u001b[107m\u001b[38;5;240m\u001b[48;5;236m \u001b[m\u001b[93m\u001b[107m\u001b[51;195H\u001b[38;5;107m\u001b[48;5;240m  53%\u001b[m\u001b[93m\u001b[107m\u001b[38;5;252m\u001b[48;5;240m \u001b[m\u001b[93m\u001b[107m\u001b[51;202H\u001b[38;5;235m\u001b[48;5;252m \u001b[51;204H \u001b[m\u001b[93m\u001b[107m\u001b[1m\u001b[38;5;235m\u001b[48;5;252m 65\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;117m:\u001b[m\u001b[93m\u001b[107m\b\u001b[38;5;22m\u001b[48;5;252m:25 \u001b[46;29H\u001b[?12l\u001b[?25h" + ], + [ + 0.257293, + "\u001b[?25l\u001b[52;1H\u001b[m\u001b[93m\u001b[107m:\u001b[?2004h" + ], + [ + 8.6e-05, + "\u001b[?12l\u001b[?25h" + ], + [ + 0.135176, + "w\u001b[?25l\u001b[?12l\u001b[?25h" + ], + [ + 0.03633, + "q" + ], + [ + 0.000156, + "\u001b[?25l\u001b[?12l\u001b[?25h" + ], + [ + 0.124203, + "\r" + ], + [ + 0.0003, + "\u001b[?25l\u001b[?2004l" + ], + [ + 0.023972, + "\"cmd/kpod/rmi.go\"" + ], + [ + 0.012083, + " 123L, 3096C written" + ], + [ + 0.013278, + "\r\r\r\n\u001b[39;49m\u001b[?2004l\u001b[?1l\u001b>\u001b[?12l\u001b[?25h\u001b[?1049l" + ], + [ + 0.002006, + "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r" + ], + [ + 0.025275, + "\r\n\u001b[34m\u001b[01mcri-o\u001b[22m \u001b[90mgit/master* \u001b[39m \u001b[33m13s\u001b[39m\r\n" + ], + [ + 0.001052, + "\u001b]7;file://localhost.localdomain/home/ryan/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007" + ], + [ + 8.3e-05, + "\u001b]2;ryan@localhost: ~/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007" + ], + [ + 6.3e-05, + "\u001b]1;..cubator/cri-o\u0007" + ], + [ + 7e-05, + "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[35m❯\u001b[39m \u001b[K\u001b[208C\u001b[90m\u001b[39m\u001b[208D" + ], + [ + 6.4e-05, + "\u001b[?1h\u001b=" + ], + [ + 2e-05, + "\u001b[?2004h" + ], + [ + 0.122123, + "vi cmd/kpod/rmi.go" + ], + [ + 0.183865, + "\u001b[18Dvu\u001b[16C" + ], + [ + 0.8524, + "\u001b[18Dvi\u001b[16C" + ], + [ + 0.251769, + "\u001b[18D \u001b[18D" + ], + [ + 0.427799, + "vi cmd/kpod/rmi.go" + ], + [ + 0.996091, + "\u001b[?1l\u001b>" + ], + [ + 0.000117, + "\u001b[?2004l\r\r\n" + ], + [ + 0.004829, + "\u001b]2;vim cmd/kpod/rmi.go\u0007\u001b]1;vi\u0007" + ], + [ + 0.136844, + "\u001b[?2004h\u001b[?1049h\u001b[?1h\u001b=\u001b[?2004h" + ], + [ + 0.000622, + "\u001b[1;52r\u001b[?12;25h\u001b[?12l\u001b[?25h\u001b[27m\u001b[23m\u001b[m\u001b[93m\u001b[107m\u001b[H\u001b[2J\u001b[?25l\u001b[52;1H\"cmd/kpod/rmi.go\"" + ], + [ + 7.1e-05, + " 123L, 3096C" + ], + [ + 0.008554, + "\u001b[2;1H▽\u001b[6n\u001b[2;1H \u001b[1;1H\u001b[>c" + ], + [ + 0.002929, + "\u001b[1;1H\u001b[96m\u001b[47m 19 \u001b[m\u001b[93m\u001b[107m }\r\n\u001b[96m\u001b[47m 20 \u001b[m\u001b[93m\u001b[107m rmiCommand = cli.Command{\r\n\u001b[96m\u001b[47m 21 \u001b[m\u001b[93m\u001b[107m\u001b[8CName:\u001b[8C\u001b[36m\"rmi\"\u001b[m\u001b[93m\u001b[107m,\r\n\u001b[96m\u001b[47m 22 \u001b[m\u001b[93m\u001b[107m\u001b[8CUsage:\u001b[7C\u001b[36m\"removes one or more images from local storage\"\u001b[m\u001b[93m\u001b[107m,\r\n\u001b[96m\u001b[47m 23 \u001b[m\u001b[93m\u001b[107m\u001b[8CDescription: rmiDescription,\r\n\u001b[96m\u001b[47m 24 \u001b[m\u001b[93m\u001b[107m\u001b[8CAction: rmiCmd,\r\n\u001b[96m\u001b[47m 25 \u001b[m\u001b[93m\u001b[107m\u001b[8CArgsUsage: \u001b[36m\"IMAGE-NAME-OR-ID [...]\"\u001b[m\u001b[93m\u001b[107m,\r\n\u001b[96m\u001b[47m 26 \u001b[m\u001b[93m\u001b[107m\u001b[8CFlags:\u001b[7CrmiFlags,\r\n\u001b[96m\u001b[47m 27 \u001b[m\u001b[93m\u001b[107m }\r\n\u001b[96m\u001b[47m 28 \u001b[m\u001b[93m\u001b[107m)\r\n\u001b[96m\u001b[47m 29 \r\n 30 \u001b[m\u001b[93m\u001b[107m\u001b[32mfunc\u001b[m\u001b[93m\u001b[107m rmiCmd(c *cli.Context) \u001b[33merror\u001b[m\u001b[93m\u001b[107m {\r\n\u001b[96m\u001b[47m 31 \r\n 32 \u001b[m\u001b[93m\u001b[107m force := \u001b[36mfalse\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m 33 \u001b[m\u001b[93m\u001b[107m \u001b[32mif\u001b[m\u001b[93m\u001b[107m c.IsSet(\u001b[36m\"force\"\u001b[m\u001b[93m\u001b[107m) {\r\n\u001b[96m\u001b[47m 34 \u001b[m\u001b[93m\u001b[107m\u001b[8Cforce = c.Bool(\u001b[36m\"force\"\u001b[m\u001b[93m\u001b[107m)\r\n\u001b[96m\u001b[47m 35 \u001b[m\u001b[93m\u001b[107m }\r\n\u001b[96m\u001b[47m 36 \r\n 37 \u001b[m\u001b[93m\u001b[107" + ], + [ + 1.9e-05, + "m args := c.Args()\r\n\u001b[96m\u001b[47m 38 \u001b[m\u001b[93m\u001b[107m \u001b[32mif\u001b[m\u001b[93m\u001b[107m \u001b[32mlen\u001b[m\u001b[93m\u001b[107m(args) == \u001b[36m0\u001b[m\u001b[93m\u001b[107m {\r\n\u001b[96m\u001b[47m 39 \u001b[m\u001b[93m\u001b[107m\u001b[8C\u001b[32mreturn\u001b[m\u001b[93m\u001b[107m errors.Errorf(\u001b[36m\"image name or ID must be specified\"\u001b[m\u001b[93m\u001b[107m)\r\n\u001b[96m\u001b[47m 40 \u001b[m\u001b[93m\u001b[107m }\r\n\u001b[96m\u001b[47m 41 \r\n 42 \u001b[m\u001b[93m\u001b[107m config, err := getConfig(c)\r\n\u001b[96m\u001b[47m 43 \u001b[m\u001b[93m\u001b[107m \u001b[32mif\u001b[m\u001b[93m\u001b[107m err != \u001b[36mnil\u001b[m\u001b[93m\u001b[107m {\r\n\u001b[96m\u001b[47m 44 \u001b[m\u001b[93m\u001b[107m\u001b[8C\u001b[32mreturn\u001b[m\u001b[93m\u001b[107m errors.Wrapf(err, \u001b[36m\"Could not get config\"\u001b[m\u001b[93m\u001b[107m)\r\n\u001b[96m\u001b[47m 45 \u001b[m\u001b[93m\u001b[107m }\r\n\u001b[96m\u001b[47m 46 \u001b[m\u001b[93m\u001b[107m store, err := getStore(config)\r\n\u001b[96m\u001b[47m 47 \u001b[m\u001b[93m\u001b[107m \u001b[32mif\u001b[m\u001b[93m\u001b[107m err != \u001b[36mnil\u001b[m\u001b[93m\u001b[107m {\r\n\u001b[96m\u001b[47m 48 \u001b[m\u001b[93m\u001b[107m\u001b[8C\u001b[32mreturn\u001b[m\u001b[93m\u001b[107m err\r\n\u001b[96m\u001b[47m 49 \u001b[m\u001b[93m\u001b[107m }\r\n\u001b[96m\u001b[47m 50 \r\n 51 \u001b[m\u001b[93m\u001b[107m \u001b[32mfor\u001b[m\u001b[93m\u001b[107m _, id := \u001b[32mrange\u001b[m\u001b[93m\u001b[107m args {\r\n\u001b[96m\u001b[47m 52 \u001b[m\u001b[93m\u001b[107m\u001b[8Cimage, err := libkpodimage.FindI" + ], + [ + 0.030095, + "mage(store, id)\r\n\u001b[96m\u001b[47m 53 \u001b[m\u001b[93m\u001b[107m\u001b[8C\u001b[32mif\u001b[m\u001b[93m\u001b[107m err != \u001b[36mnil\u001b[m\u001b[93m\u001b[107m {\r\n\u001b[96m\u001b[47m 54 \u001b[m\u001b[93m\u001b[107m\u001b[12C\u001b[32mreturn\u001b[m\u001b[93m\u001b[107m errors.Wrapf(err, \u001b[36m\"could not get image \u001b[m\u001b[93m\u001b[107m\u001b[31m%q\u001b[m\u001b[93m\u001b[107m\u001b[36m\"\u001b[m\u001b[93m\u001b[107m, id)\r\n\u001b[96m\u001b[47m 55 \u001b[m\u001b[93m\u001b[107m\u001b[8C}\r\n\u001b[96m\u001b[47m 56 \u001b[m\u001b[93m\u001b[107m\u001b[8C\u001b[32mif\u001b[m\u001b[93m\u001b[107m image != \u001b[36mnil\u001b[m\u001b[93m\u001b[107m {\r\n\u001b[96m\u001b[47m 57 \u001b[m\u001b[93m\u001b[107m\u001b[12CctrIDs, err := runningContainers(image, store)\r\n\u001b[96m\u001b[47m 58 \u001b[m\u001b[93m\u001b[107m\u001b[12C\u001b[32mif\u001b[m\u001b[93m\u001b[107m err != \u001b[36mnil\u001b[m\u001b[93m\u001b[107m {\r\n\u001b[96m\u001b[47m 59 \u001b[m\u001b[93m\u001b[107m\u001b[16C\u001b[32mreturn\u001b[m\u001b[93m\u001b[107m errors.Wrapf(err, \u001b[36m\"error getting running containers for image \u001b[m\u001b[93m\u001b[107m\u001b[31m%q\u001b[m\u001b[93m\u001b[107m\u001b[36m\"\u001b[m\u001b[93m\u001b[107m, id)\r\n\u001b[96m\u001b[47m 60 \u001b[m\u001b[93m\u001b[107m\u001b[12C}\r\n\u001b[96m\u001b[47m 61 \u001b[m\u001b[93m\u001b[107m\u001b[12C\u001b[32mif\u001b[m\u001b[93m\u001b[107m \u001b[32mlen\u001b[m\u001b[93m\u001b[107m(ctrIDs) > \u001b[36m0\u001b[m\u001b[93m\u001b[107m && \u001b[32mlen\u001b[m\u001b[93m\u001b[107m(image.Names) <= \u001b[36m1\u001b[m\u001b[93m\u001b[107m {\r\n\u001b[96m\u001b[47m 62 \u001b[m\u001b[93m\u001b[107m\u001b[16C\u001b[32mif\u001b[m\u001b[93m\u001b[107m force {\r" + ], + [ + 3.7e-05, + "\n\u001b[96m\u001b[47m 63 \u001b[m\u001b[93m\u001b[107m\u001b[20CremoveContainers(ctrIDs, store)\r\n\u001b[96m\u001b[47m 64 \u001b[m\u001b[93m\u001b[107m\u001b[16C} \u001b[32melse\u001b[m\u001b[93m\u001b[107m {\r\n\u001b[96m\u001b[47m 65 \u001b[m\u001b[93m\u001b[107m\u001b[20C\u001b[32mfor\u001b[m\u001b[93m\u001b[107m _ := \u001b[32mrange\u001b[m\u001b[93m\u001b[107m ctrIDs {\r\n\u001b[96m\u001b[47m 66 \u001b[m\u001b[93m\u001b[107m\u001b[24C\u001b[32mreturn\u001b[m\u001b[93m\u001b[107m fmt.Errorf(\u001b[36m\"Could not remove image \u001b[m\u001b[93m\u001b[107m\u001b[31m%q\u001b[m\u001b[93m\u001b[107m\u001b[36m (must force) - one or more containers are using its reference image\"\u001b[m\u001b[93m\u001b[107m, id)\r\n\u001b[96m\u001b[47m 67 \u001b[m\u001b[93m\u001b[107m\u001b[20C}\r\n\u001b[96m\u001b[47m 68 \u001b[m\u001b[93m\u001b[107m\u001b[16C}\r\n\u001b[1m\u001b[38;5;22m\u001b[48;5;148m NORMAL \u001b[m\u001b[93m\u001b[107m\u001b[38;5;148m\u001b[48;5;240m\u001b[51;10H \u001b[m\u001b[93m\u001b[107m\u001b[38;5;250m\u001b[48;5;240m\u001b[51;12H master \u001b[m\u001b[93m\u001b[107m\u001b[38;5;245m\u001b[48;5;240m\u001b[51;21H \u001b[m\u001b[93m\u001b[107m\u001b[38;5;250m\u001b[48;5;240mcmd/kpod/\u001b[m\u001b[93m\u001b[107m\u001b[1m\u001b[38;5;231m\u001b[48;5;240mrmi.go\u001b[m\u001b[93m\u001b[107m\u001b[38;5;220m\u001b[48;5;240m M \u001b[m\u001b[93m\u001b[107m\u001b[38;5;240m\u001b[48;5;236m\u001b[51;41H \u001b[m\u001b[93m\u001b[107m\u001b[38;5;231m\u001b[48;5;236m                                    " + ], + [ + 0.011253, + "                                                                                                  \u001b[m\u001b[93m\u001b[107m\u001b[38;5;247m\u001b[48;5;236munix\u001b[m\u001b[93m\u001b[107m\u001b[38;5;244m\u001b[48;5;236m \u001b[m\u001b[93m\u001b[107m\u001b[51;182H\u001b[38;5;247m\u001b[48;5;236m utf-8\u001b[m\u001b[93m\u001b[107m\u001b[38;5;244m\u001b[48;5;236m \u001b[m\u001b[93m\u001b[107m\u001b[51;190H\u001b[38;5;247m\u001b[48;5;236m go\u001b[m\u001b[93m\u001b[107m\u001b[38;5;240m\u001b[48;5;236m \u001b[m\u001b[93m\u001b[107m\u001b[51;195H\u001b[38;5;107m\u001b[48;5;240m  53%\u001b[m\u001b[93m\u001b[107m\u001b[38;5;252m\u001b[48;5;240m \u001b[m\u001b[93m\u001b[107m\u001b[51;202H\u001b[38;5;235m\u001b[48;5;252m \u001b[51;204H \u001b[m\u001b[93m\u001b[107m\u001b[1m\u001b[38;5;235m\u001b[48;5;252m 65\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:21 \u001b[47;25H\u001b[?12l\u001b[?25h\u001bP+q436f\u001b\\\u001bP+q6b75\u001b\\\u001bP+q6b64\u001b\\\u001bP+q6b72\u001b\\\u001bP+q6b6c\u001b\\\u001bP+q2332\u001b\\\u001bP+q2334\u001b\\\u001bP+q2569\u001b\\\u001bP+q2a37\u001b\\\u001bP+q6b31\u001b\\" + ], + [ + 0.884291, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[52;1H\u001b[K\u001b[52;1H:\u001b[?2004h\u001b[?12l\u001b[?25h" + ], + [ + 0.175395, + "q\u001b[?25l\u001b[?12l\u001b[?25h" + ], + [ + 0.047934, + "\r" + ], + [ + 0.019314, + "\u001b[?25l\u001b[?2004l\u001b[52;1H\u001b[K\u001b[52;1H\u001b[?2004l\u001b[?1l\u001b>\u001b[?12l\u001b[?25h\u001b[?1049l" + ], + [ + 0.001837, + "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r" + ], + [ + 0.019156, + "\r\n\u001b[34m\u001b[01mcri-o\u001b[22m \u001b[90mgit/master* \u001b[39m \u001b[33m\u001b[39m\r\n" + ], + [ + 0.001205, + "\u001b]7;file://localhost.localdomain/home/ryan/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007" + ], + [ + 0.000106, + "\u001b]2;ryan@localhost: ~/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007" + ], + [ + 2.3e-05, + "\u001b]1;..cubator/cri-o\u0007" + ], + [ + 9.5e-05, + "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[35m❯\u001b[39m \u001b[K\u001b[208C\u001b[90m\u001b[39m\u001b[208D" + ], + [ + 6.6e-05, + "\u001b[?1h\u001b=" + ], + [ + 2.1e-05, + "\u001b[?2004h" + ], + [ + 0.22274, + "m" + ], + [ + 0.120257, + "\bma" + ], + [ + 0.087838, + "k" + ], + [ + 0.119717, + "e" + ], + [ + 0.055994, + " " + ], + [ + 0.103706, + "k" + ], + [ + 0.080698, + "p" + ], + [ + 0.051603, + "o" + ], + [ + 0.124175, + "d" + ], + [ + 0.076543, + "\u001b[?1l\u001b>\u001b[?2004l\r\r\n" + ], + [ + 0.004916, + "\u001b]2;make kpod\u0007\u001b]1;make\u0007" + ], + [ + 6.744424, + "go build -ldflags '-X main.gitCommit=6ca462a3 -X main.buildInfo=1502976912' -tags \"selinux seccomp \" -o kpod github.com/kubernetes-incubator/cri-o/cmd/kpod\r\n" + ], + [ + 1.99486, + "# github.com/kubernetes-incubator/cri-o/cmd/kpod\r\ncmd/kpod/rmi.go:65: no new variables on left side of :=\r\n" + ], + [ + 0.002634, + "make: *** [Makefile:83: kpod] Error 2\r\n" + ], + [ + 0.000711, + "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r" + ], + [ + 0.019707, + "\r\n\u001b[34m\u001b[01mcri-o\u001b[22m \u001b[90mgit/master* \u001b[39m \u001b[33m9s\u001b[39m\r\n" + ], + [ + 0.001352, + "\u001b]7;file://localhost.localdomain/home/ryan/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007" + ], + [ + 0.000124, + "\u001b]2;ryan@localhost: ~/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007\u001b]1;..cubator/cri-o\u0007" + ], + [ + 0.000112, + "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[31m❯\u001b[39m \u001b[K\u001b[208C\u001b[90m\u001b[39m\u001b[208D" + ], + [ + 4.6e-05, + "\u001b[?1h\u001b=" + ], + [ + 2.8e-05, + "\u001b[?2004h" + ], + [ + 12.559376, + "make kpod" + ], + [ + 0.160079, + "\u001b[9Dvi cmd/kpod/rmi.go" + ], + [ + 0.376119, + "\\" + ], + [ + 0.719352, + "\u001b[?1l\u001b>" + ], + [ + 0.000252, + "\u001b[?2004l\r\r\n" + ], + [ + 0.000889, + "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J> \u001b[K" + ], + [ + 0.000257, + "\u001b[?1h\u001b=" + ], + [ + 9e-05, + "\u001b[?2004h" + ], + [ + 0.814396, + "\u001b[?2004l\r\r\n" + ], + [ + 0.002088, + "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r" + ], + [ + 0.020752, + "\r\n\u001b[34m\u001b[01mcri-o\u001b[22m \u001b[90mgit/master* \u001b[39m \u001b[33m24s\u001b[39m\r\n" + ], + [ + 0.001027, + "\u001b]7;file://localhost.localdomain/home/ryan/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007" + ], + [ + 0.000116, + "\u001b]2;ryan@localhost: ~/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007" + ], + [ + 2.6e-05, + "\u001b]1;..cubator/cri-o\u0007" + ], + [ + 0.000109, + "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[31m❯\u001b[39m \u001b[K\u001b[208C\u001b[90m\u001b[39m\u001b[208D" + ], + [ + 7.1e-05, + "\u001b[?1h\u001b=" + ], + [ + 2.9e-05, + "\u001b[?2004h" + ], + [ + 0.191891, + "vi cmd/kpod/rmi.go\\" + ], + [ + 0.255869, + "\b \b" + ], + [ + 0.164227, + "\u001b[?1l\u001b>" + ], + [ + 0.000395, + "\u001b[?2004l\r\r\n" + ], + [ + 0.005085, + "\u001b]2;vim cmd/kpod/rmi.go\u0007\u001b]1;vi\u0007" + ], + [ + 0.139286, + "\u001b[?2004h\u001b[?1049h\u001b[?1h\u001b=\u001b[?2004h" + ], + [ + 0.000664, + "\u001b[1;52r\u001b[?12;25h\u001b[?12l\u001b[?25h\u001b[27m\u001b[23m\u001b[m\u001b[93m\u001b[107m\u001b[H\u001b[2J\u001b[?25l\u001b[52;1H\"cmd/kpod/rmi.go\" 123L, 3096C" + ], + [ + 0.007849, + "\u001b[2;1H▽\u001b[6n\u001b[2;1H \u001b[1;1H\u001b[>c" + ], + [ + 0.001971, + "\u001b[1;1H\u001b[96m\u001b[47m 19 \u001b[m\u001b[93m\u001b[107m }\r\n\u001b[96m\u001b[47m 20 \u001b[m\u001b[93m\u001b[107m rmiCommand = cli.Command{\r\n\u001b[96m\u001b[47m 21 \u001b[m\u001b[93m\u001b[107m\u001b[8CName:\u001b[8C\u001b[36m\"rmi\"\u001b[m\u001b[93m\u001b[107m,\r\n\u001b[96m\u001b[47m 22 \u001b[m\u001b[93m\u001b[107m\u001b[8CUsage:\u001b[7C\u001b[36m\"removes one or more images from local storage\"\u001b[m\u001b[93m\u001b[107m,\r\n\u001b[96m\u001b[47m 23 \u001b[m\u001b[93m\u001b[107m\u001b[8CDescription: rmiDescription,\r\n\u001b[96m\u001b[47m 24 \u001b[m\u001b[93m\u001b[107m\u001b[8CAction: rmiCmd,\r\n\u001b[96m\u001b[47m 25 \u001b[m\u001b[93m\u001b[107m\u001b[8CArgsUsage: \u001b[36m\"IMAGE-NAME-OR-ID [...]\"\u001b[m\u001b[93m\u001b[107m,\r\n\u001b[96m\u001b[47m 26 \u001b[m\u001b[93m\u001b[107m\u001b[8CFlags:\u001b[7CrmiFlags,\r\n\u001b[96m\u001b[47m 27 \u001b[m\u001b[93m\u001b[107m }\r\n\u001b[96m\u001b[47m 28 \u001b[m\u001b[93m\u001b[107m)\r\n\u001b[96m\u001b[47m 29 \r\n 30 \u001b[m\u001b[93m\u001b[107m\u001b[32mfunc\u001b[m\u001b[93m\u001b[107m rmiCmd(c *cli.Context) \u001b[33merror\u001b[m\u001b[93m\u001b[107m {\r\n\u001b[96m\u001b[47m 31 \r\n 32 \u001b[m\u001b[93m\u001b[107m force := \u001b[36mfalse\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m 33 \u001b[m\u001b[93m\u001b[107m \u001b[32mif\u001b[m\u001b[93m\u001b[107m c.IsSet(\u001b[36m\"force\"\u001b[m\u001b[93m\u001b[107m) {\r\n\u001b[96m\u001b[47m 34 \u001b[m\u001b[93m\u001b[107m\u001b[8Cforce = c.Bool(\u001b[36m\"force\"\u001b[m\u001b[93m\u001b[107m)\r\n\u001b[96m\u001b[47m 35 \u001b[m\u001b[93m\u001b[107m }\r\n\u001b[96m\u001b[47m 36 \r\n 37 \u001b[m\u001b[93m\u001b[107" + ], + [ + 2e-05, + "m args := c.Args()\r\n\u001b[96m\u001b[47m 38 \u001b[m\u001b[93m\u001b[107m \u001b[32mif\u001b[m\u001b[93m\u001b[107m \u001b[32mlen\u001b[m\u001b[93m\u001b[107m(args) == \u001b[36m0\u001b[m\u001b[93m\u001b[107m {\r\n\u001b[96m\u001b[47m 39 \u001b[m\u001b[93m\u001b[107m\u001b[8C\u001b[32mreturn\u001b[m\u001b[93m\u001b[107m errors.Errorf(\u001b[36m\"image name or ID must be specified\"\u001b[m\u001b[93m\u001b[107m)\r\n\u001b[96m\u001b[47m 40 \u001b[m\u001b[93m\u001b[107m }\r\n\u001b[96m\u001b[47m 41 \r\n 42 \u001b[m\u001b[93m\u001b[107m config, err := getConfig(c)\r\n\u001b[96m\u001b[47m 43 \u001b[m\u001b[93m\u001b[107m \u001b[32mif\u001b[m\u001b[93m\u001b[107m err != \u001b[36mnil\u001b[m\u001b[93m\u001b[107m {\r\n\u001b[96m\u001b[47m 44 \u001b[m\u001b[93m\u001b[107m\u001b[8C\u001b[32mreturn\u001b[m\u001b[93m\u001b[107m errors.Wrapf(err, \u001b[36m\"Could not get config\"\u001b[m\u001b[93m\u001b[107m)\r\n\u001b[96m\u001b[47m 45 \u001b[m\u001b[93m\u001b[107m }\r\n\u001b[96m\u001b[47m 46 \u001b[m\u001b[93m\u001b[107m store, err := getStore(config)\r\n\u001b[96m\u001b[47m 47 \u001b[m\u001b[93m\u001b[107m \u001b[32mif\u001b[m\u001b[93m\u001b[107m err != \u001b[36mnil\u001b[m\u001b[93m\u001b[107m {\r\n\u001b[96m\u001b[47m 48 \u001b[m\u001b[93m\u001b[107m\u001b[8C\u001b[32mreturn\u001b[m\u001b[93m\u001b[107m err\r\n\u001b[96m\u001b[47m 49 \u001b[m\u001b[93m\u001b[107m }\r\n\u001b[96m\u001b[47m 50 \r\n 51 \u001b[m\u001b[93m\u001b[107m \u001b[32mfor\u001b[m\u001b[93m\u001b[107m _, id := \u001b[32mrange\u001b[m\u001b[93m\u001b[107m args {\r\n\u001b[96m\u001b[47m 52 \u001b[m\u001b[93m\u001b[107m\u001b[8Cimage, err := libkpodimage.FindI" + ], + [ + 0.030785, + "mage(store, id)\r\n\u001b[96m\u001b[47m 53 \u001b[m\u001b[93m\u001b[107m\u001b[8C\u001b[32mif\u001b[m\u001b[93m\u001b[107m err != \u001b[36mnil\u001b[m\u001b[93m\u001b[107m {\r\n\u001b[96m\u001b[47m 54 \u001b[m\u001b[93m\u001b[107m\u001b[12C\u001b[32mreturn\u001b[m\u001b[93m\u001b[107m errors.Wrapf(err, \u001b[36m\"could not get image \u001b[m\u001b[93m\u001b[107m\u001b[31m%q\u001b[m\u001b[93m\u001b[107m\u001b[36m\"\u001b[m\u001b[93m\u001b[107m, id)\r\n\u001b[96m\u001b[47m 55 \u001b[m\u001b[93m\u001b[107m\u001b[8C}\r\n\u001b[96m\u001b[47m 56 \u001b[m\u001b[93m\u001b[107m\u001b[8C\u001b[32mif\u001b[m\u001b[93m\u001b[107m image != \u001b[36mnil\u001b[m\u001b[93m\u001b[107m {\r\n\u001b[96m\u001b[47m 57 \u001b[m\u001b[93m\u001b[107m\u001b[12CctrIDs, err := runningContainers(image, store)\r\n\u001b[96m\u001b[47m 58 \u001b[m\u001b[93m\u001b[107m\u001b[12C\u001b[32mif\u001b[m\u001b[93m\u001b[107m err != \u001b[36mnil\u001b[m\u001b[93m\u001b[107m {\r\n\u001b[96m\u001b[47m 59 \u001b[m\u001b[93m\u001b[107m\u001b[16C\u001b[32mreturn\u001b[m\u001b[93m\u001b[107m errors.Wrapf(err, \u001b[36m\"error getting running containers for image \u001b[m\u001b[93m\u001b[107m\u001b[31m%q\u001b[m\u001b[93m\u001b[107m\u001b[36m\"\u001b[m\u001b[93m\u001b[107m, id)\r\n\u001b[96m\u001b[47m 60 \u001b[m\u001b[93m\u001b[107m\u001b[12C}\r\n\u001b[96m\u001b[47m 61 \u001b[m\u001b[93m\u001b[107m\u001b[12C\u001b[32mif\u001b[m\u001b[93m\u001b[107m \u001b[32mlen\u001b[m\u001b[93m\u001b[107m(ctrIDs) > \u001b[36m0\u001b[m\u001b[93m\u001b[107m && \u001b[32mlen\u001b[m\u001b[93m\u001b[107m(image.Names) <= \u001b[36m1\u001b[m\u001b[93m\u001b[107m {\r\n\u001b[96m\u001b[47m 62 \u001b[m\u001b[93m\u001b[107m\u001b[16C\u001b[32mif\u001b[m\u001b[93m\u001b[107m force {\r" + ], + [ + 3e-05, + "\n\u001b[96m\u001b[47m 63 \u001b[m\u001b[93m\u001b[107m\u001b[20CremoveContainers(ctrIDs, store)\r\n\u001b[96m\u001b[47m 64 \u001b[m\u001b[93m\u001b[107m\u001b[16C} \u001b[32melse\u001b[m\u001b[93m\u001b[107m {\r\n\u001b[96m\u001b[47m 65 \u001b[m\u001b[93m\u001b[107m\u001b[20C\u001b[32mfor\u001b[m\u001b[93m\u001b[107m _ := \u001b[32mrange\u001b[m\u001b[93m\u001b[107m ctrIDs {\r\n\u001b[96m\u001b[47m 66 \u001b[m\u001b[93m\u001b[107m\u001b[24C\u001b[32mreturn\u001b[m\u001b[93m\u001b[107m fmt.Errorf(\u001b[36m\"Could not remove image \u001b[m\u001b[93m\u001b[107m\u001b[31m%q\u001b[m\u001b[93m\u001b[107m\u001b[36m (must force) - one or more containers are using its reference image\"\u001b[m\u001b[93m\u001b[107m, id)\r\n\u001b[96m\u001b[47m 67 \u001b[m\u001b[93m\u001b[107m\u001b[20C}\r\n\u001b[96m\u001b[47m 68 \u001b[m\u001b[93m\u001b[107m\u001b[16C}\r\n\u001b[1m\u001b[38;5;22m\u001b[48;5;148m NORMAL \u001b[m\u001b[93m\u001b[107m\u001b[38;5;148m\u001b[48;5;240m\u001b[51;10H \u001b[m\u001b[93m\u001b[107m\u001b[38;5;250m\u001b[48;5;240m\u001b[51;12H master \u001b[m\u001b[93m\u001b[107m\u001b[38;5;245m\u001b[48;5;240m\u001b[51;21H \u001b[m\u001b[93m\u001b[107m\u001b[38;5;250m\u001b[48;5;240mcmd/kpod/\u001b[m\u001b[93m\u001b[107m\u001b[1m\u001b[38;5;231m\u001b[48;5;240mrmi.go\u001b[m\u001b[93m\u001b[107m\u001b[38;5;220m\u001b[48;5;240m M \u001b[m\u001b[93m\u001b[107m\u001b[38;5;240m\u001b[48;5;236m\u001b[51;41H \u001b[m\u001b[93m\u001b[107m\u001b[38;5;231m\u001b[48;5;236m                                    " + ], + [ + 0.009791, + "                                                                                                  \u001b[m\u001b[93m\u001b[107m\u001b[38;5;247m\u001b[48;5;236munix\u001b[m\u001b[93m\u001b[107m\u001b[38;5;244m\u001b[48;5;236m \u001b[m\u001b[93m\u001b[107m\u001b[51;182H\u001b[38;5;247m\u001b[48;5;236m utf-8\u001b[m\u001b[93m\u001b[107m\u001b[38;5;244m\u001b[48;5;236m \u001b[m\u001b[93m\u001b[107m\u001b[51;190H\u001b[38;5;247m\u001b[48;5;236m go\u001b[m\u001b[93m\u001b[107m\u001b[38;5;240m\u001b[48;5;236m \u001b[m\u001b[93m\u001b[107m\u001b[51;195H\u001b[38;5;107m\u001b[48;5;240m  53%\u001b[m\u001b[93m\u001b[107m\u001b[38;5;252m\u001b[48;5;240m \u001b[m\u001b[93m\u001b[107m\u001b[51;202H\u001b[38;5;235m\u001b[48;5;252m \u001b[51;204H \u001b[m\u001b[93m\u001b[107m\u001b[1m\u001b[38;5;235m\u001b[48;5;252m 65\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:21 \u001b[47;25H\u001b[?12l\u001b[?25h" + ], + [ + 3.2e-05, + "\u001bP+q436f\u001b\\\u001bP+q6b75\u001b\\\u001bP+q6b64\u001b\\\u001bP+q6b72\u001b\\\u001bP+q6b6c\u001b\\\u001bP+q2332\u001b\\\u001bP+q2334\u001b\\\u001bP+q2569\u001b\\\u001bP+q2a37\u001b\\\u001bP+q6b31\u001b\\" + ], + [ + 0.549454, + "\u001b[?25l\u001b[51;210H2\u001b[47;26H\u001b[?12l\u001b[?25h" + ], + [ + 0.282227, + "\u001b[51;210H3\u001b[47;27H" + ], + [ + 0.500981, + "\u001b[51;210H4\u001b[47;28H" + ], + [ + 0.028181, + "\u001b[51;210H5\u001b[47;29H" + ], + [ + 0.120266, + "\u001b[51;210H6\u001b[47;30H" + ], + [ + 0.176334, + "\u001b[51;210H7\u001b[47;31H" + ], + [ + 0.332685, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m= \u001b[32mrange\u001b[m\u001b[93m\u001b[107m ctrIDs {\u001b[47;47H\u001b[K\u001b[51;39H\u001b[1m\u001b[38;5;220m\u001b[48;5;240m + \u001b[m\u001b[93m\u001b[107m\u001b[38;5;240m\u001b[48;5;236m\u001b[51;43H \u001b[47;31H\u001b[?12l\u001b[?25h" + ], + [ + 0.457865, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[52;1H\u001b[K\u001b[52;1H:\u001b[?2004h\u001b[?12l\u001b[?25h" + ], + [ + 0.16749, + "w\u001b[?25l\u001b[?12l\u001b[?25h" + ], + [ + 0.072064, + "q\u001b[?25l\u001b[?12l\u001b[?25h" + ], + [ + 0.096121, + "\r" + ], + [ + 0.000123, + "\u001b[?25l\u001b[?2004l" + ], + [ + 0.01842, + "\"cmd/kpod/rmi.go\"" + ], + [ + 0.012505, + " 123L, 3095C written" + ], + [ + 0.016238, + "\r\r\r\n\u001b[39;49m\u001b[?2004l\u001b[?1l\u001b>\u001b[?12l\u001b[?25h\u001b[?1049l" + ], + [ + 0.002512, + "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r" + ], + [ + 0.022671, + "\r\n\u001b[34m\u001b[01mcri-o\u001b[22m \u001b[90mgit/master* \u001b[39m \u001b[33m\u001b[39m\r\n" + ], + [ + 0.001565, + "\u001b]7;file://localhost.localdomain/home/ryan/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007" + ], + [ + 0.000124, + "\u001b]2;ryan@localhost: ~/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007" + ], + [ + 3e-05, + "\u001b]1;..cubator/cri-o\u0007" + ], + [ + 0.000106, + "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[35m❯\u001b[39m \u001b[K\u001b[208C\u001b[90m\u001b[39m\u001b[208D" + ], + [ + 7.2e-05, + "\u001b[?1h\u001b=" + ], + [ + 3.7e-05, + "\u001b[?2004h" + ], + [ + 0.334146, + "vi cmd/kpod/rmi.go" + ], + [ + 0.182947, + "\\" + ], + [ + 0.599976, + "\u001b[?1l\u001b>" + ], + [ + 5.2e-05, + "\u001b[?2004l\r\r\n" + ], + [ + 0.000542, + "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J> \u001b[K" + ], + [ + 0.000169, + "\u001b[?1h\u001b=\u001b[?2004h" + ], + [ + 1.143722, + "\u001b[?2004l\r\r\n" + ], + [ + 0.001295, + "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r" + ], + [ + 0.028119, + "\r\n\u001b[34m\u001b[01mcri-o\u001b[22m \u001b[90mgit/master* \u001b[39m \u001b[33m6s\u001b[39m\r\n" + ], + [ + 0.00136, + "\u001b]7;file://localhost.localdomain/home/ryan/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007" + ], + [ + 0.000114, + "\u001b]2;ryan@localhost: ~/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007" + ], + [ + 1.7e-05, + "\u001b]1;..cubator/cri-o\u0007" + ], + [ + 0.000126, + "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[31m❯\u001b[39m \u001b[K\u001b[208C\u001b[90m\u001b[39m\u001b[208D" + ], + [ + 6.9e-05, + "\u001b[?1h\u001b=" + ], + [ + 3.2e-05, + "\u001b[?2004h" + ], + [ + 0.193141, + "vi cmd/kpod/rmi.go\\" + ], + [ + 0.159626, + "\b \b" + ], + [ + 0.18457, + "\\" + ], + [ + 0.29669, + "\u001b[19Dmake kpod \u001b[10D" + ], + [ + 0.863034, + "\u001b[?1l\u001b>" + ], + [ + 0.000232, + "\u001b[?2004l\r\r\n" + ], + [ + 0.004368, + "\u001b]2;make kpod\u0007\u001b]1;make\u0007" + ], + [ + 6.733531, + "go build -ldflags '-X main.gitCommit=6ca462a3 -X main.buildInfo=1502976943' -tags \"selinux seccomp \" -o kpod github.com/kubernetes-incubator/cri-o/cmd/kpod\r\n" + ], + [ + 4.55149, + "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r" + ], + [ + 0.018009, + "\r\n\u001b[34m\u001b[01mcri-o\u001b[22m \u001b[90mgit/master* \u001b[39m \u001b[33m12s\u001b[39m\r\n" + ], + [ + 0.001122, + "\u001b]7;file://localhost.localdomain/home/ryan/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007" + ], + [ + 0.000105, + "\u001b]2;ryan@localhost: ~/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007\u001b]1;..cubator/cri-o\u0007" + ], + [ + 8.3e-05, + "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[35m❯\u001b[39m \u001b[K\u001b[208C\u001b[90m\u001b[39m\u001b[208D" + ], + [ + 6.1e-05, + "\u001b[?1h\u001b=" + ], + [ + 2e-05, + "\u001b[?2004h" + ], + [ + 20.811668, + "m" + ], + [ + 0.119573, + "\bma" + ], + [ + 0.111827, + "k" + ], + [ + 0.080357, + "e" + ], + [ + 0.103149, + " " + ], + [ + 0.084516, + "k" + ], + [ + 0.143968, + "p" + ], + [ + 0.079279, + "o" + ], + [ + 0.088902, + "d" + ], + [ + 0.135804, + "\u001b[?1l\u001b>" + ], + [ + 0.000119, + "\u001b[?2004l" + ], + [ + 0.000522, + "\r\r\n" + ], + [ + 0.003588, + "\u001b]2;make kpod\u0007\u001b]1;make\u0007" + ], + [ + 6.696294, + "make: 'kpod' is up to date.\r\n" + ], + [ + 0.000283, + "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r" + ], + [ + 0.020139, + "\r\n\u001b[34m\u001b[01mcri-o\u001b[22m \u001b[90mgit/master* \u001b[39m \u001b[33m7s\u001b[39m\r\n" + ], + [ + 0.001161, + "\u001b]7;file://localhost.localdomain/home/ryan/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007" + ], + [ + 9e-05, + "\u001b]2;ryan@localhost: ~/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007" + ], + [ + 2.8e-05, + "\u001b]1;..cubator/cri-o\u0007" + ], + [ + 0.000108, + "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[35m❯\u001b[39m \u001b[K\u001b[208C\u001b[90m\u001b[39m\u001b[208D" + ], + [ + 6.5e-05, + "\u001b[?1h\u001b=" + ], + [ + 7.7e-05, + "\u001b[?2004h" + ], + [ + 243.314771, + "s" + ], + [ + 0.111394, + "\bsu" + ], + [ + 0.096183, + "d" + ], + [ + 0.080041, + "o" + ], + [ + 0.128398, + " " + ], + [ + 0.119735, + "m" + ], + [ + 0.095922, + "a" + ], + [ + 0.088141, + "k" + ], + [ + 0.072233, + "e" + ], + [ + 0.095742, + " " + ], + [ + 0.087941, + "i" + ], + [ + 0.104278, + "n" + ], + [ + 0.032039, + "s" + ], + [ + 0.118983, + "t" + ], + [ + 0.072644, + "a" + ], + [ + 0.143994, + "l" + ], + [ + 0.168065, + "l" + ], + [ + 0.752715, + "\u001b[?1l\u001b>\u001b[?2004l\r\r\n" + ], + [ + 0.009834, + "\u001b]2;sudo make install\u0007\u001b]1;make\u0007" + ], + [ + 0.955201, + "[sudo] password for ryan: " + ], + [ + 20.245864, + "\r\n" + ], + [ + 0.045577, + "mkdir -p \"/home/ryan/Development/Go/src/github.com/kubernetes-incubator/cri-o/_output/src/github.com/kubernetes-incubator\"\r\n" + ], + [ + 0.001888, + "ln -s \"/home/ryan/Development/Go/src/github.com/kubernetes-incubator/cri-o\" \"/home/ryan/Development/Go/src/github.com/kubernetes-incubator/cri-o/_output/src/github.com/kubernetes-incubator\"\r\n" + ], + [ + 0.001297, + "touch \"/home/ryan/Development/Go/src/github.com/kubernetes-incubator/cri-o/_output/.gopathok\"\r\n" + ], + [ + 0.001197, + "install -D -m 755 crio /usr/local/bin/crio\r\n" + ], + [ + 0.000745, + "install: cannot stat 'crio': No such file or directory\r\n" + ], + [ + 0.000258, + "make: *** [Makefile:133: install] Error 1\r\n" + ], + [ + 0.002376, + "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r" + ], + [ + 0.025148, + "\r\n\u001b[34m\u001b[01mcri-o\u001b[22m \u001b[90mgit/master* \u001b[39m \u001b[33m21s\u001b[39m\r\n" + ], + [ + 0.001447, + "\u001b]7;file://localhost.localdomain/home/ryan/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007" + ], + [ + 0.000116, + "\u001b]2;ryan@localhost: ~/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007" + ], + [ + 3.1e-05, + "\u001b]1;..cubator/cri-o\u0007" + ], + [ + 0.000295, + "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[31m❯\u001b[39m \u001b[K\u001b[208C\u001b[90m\u001b[39m\u001b[208D" + ], + [ + 8.2e-05, + "\u001b[?1h\u001b=" + ], + [ + 2.9e-05, + "\u001b[?2004h" + ], + [ + 16.688284, + "s" + ], + [ + 0.136222, + "\bsu" + ], + [ + 0.119402, + "d" + ], + [ + 0.080011, + "o" + ], + [ + 0.135772, + " " + ], + [ + 0.088659, + "m" + ], + [ + 0.112281, + "a" + ], + [ + 0.118598, + "k" + ], + [ + 0.120387, + "e" + ], + [ + 0.104104, + " " + ], + [ + 0.248577, + "u" + ], + [ + 0.215792, + "n" + ], + [ + 0.140158, + "i" + ], + [ + 0.067519, + "n" + ], + [ + 0.071505, + "s" + ], + [ + 0.104231, + "t" + ], + [ + 0.08841, + "a" + ], + [ + 0.120753, + "l" + ], + [ + 0.111041, + "l" + ], + [ + 0.188244, + "\u001b[?1l\u001b>" + ], + [ + 0.000191, + "\u001b[?2004l\r\r\n" + ], + [ + 0.008904, + "\u001b]2;sudo make uninstall\u0007\u001b]1;make\u0007" + ], + [ + 2.992644, + "rm -f /usr/local/bin/crio\r\n" + ], + [ + 0.008835, + "rm -f /usr/local/bin/crioctl\r\n" + ], + [ + 0.006105, + "rm -f /usr/local/libexec/crio/conmon\r\n" + ], + [ + 0.001162, + "rm -f /usr/local/libexec/crio/pause" + ], + [ + 0.000104, + "\r\n" + ], + [ + 0.000807, + "for i in docs/kpod-diff.1 docs/kpod-push.1 docs/kpod.1 docs/kpod-export.1 docs/kpod-load.1 docs/kpod-images.1 docs/kpod-umount.1 docs/kpod-save.1 docs/kpod-cp.1 docs/kpod-info.1 docs/kpod-mount.1 docs/kpod-inspect.1 docs/kpod-logs.1 docs/kpod-history.1 docs/kpod-pull.1 docs/kpod-rmi.1 docs/kpod-version.1 docs/kpod-tag.1; do \\\r\n\trm -f /usr/local/share/man/man8/$(basename ${i}); \\\r\ndone\r\n" + ], + [ + 0.038238, + "for i in docs/crio.conf.5; do \\\r\n\trm -f /usr/local/share/man/man5/$(basename ${i}); \\\r\ndone\r\n" + ], + [ + 0.003095, + "for i in docs/crio.8; do \\\r\n\trm -f /usr/local/share/man/man8/$(basename ${i}); \\\r\ndone\r\n" + ], + [ + 0.006486, + "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r" + ], + [ + 0.024997, + "\r\n\u001b[34m\u001b[01mcri-o\u001b[22m \u001b[90mgit/master* \u001b[39m \u001b[33m\u001b[39m\r\n" + ], + [ + 0.001214, + "\u001b]7;file://localhost.localdomain/home/ryan/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007" + ], + [ + 8.9e-05, + "\u001b]2;ryan@localhost: ~/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007" + ], + [ + 2.5e-05, + "\u001b]1;..cubator/cri-o\u0007" + ], + [ + 8e-05, + "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[35m❯\u001b[39m \u001b[K\u001b[208C\u001b[90m\u001b[39m\u001b[208D" + ], + [ + 8e-05, + "\u001b[?1h\u001b=" + ], + [ + 3.1e-05, + "\u001b[?2004h" + ], + [ + 0.734872, + "m" + ], + [ + 0.09234, + "\bma" + ], + [ + 0.115606, + "k" + ], + [ + 0.060071, + "e" + ], + [ + 0.080073, + " " + ], + [ + 0.10406, + "a" + ], + [ + 0.055694, + "l" + ], + [ + 0.108501, + "l" + ], + [ + 0.199594, + "\u001b[?1l\u001b>" + ], + [ + 6.5e-05, + "\u001b[?2004l\r\r\n" + ], + [ + 0.00357, + "\u001b]2;make all\u0007" + ], + [ + 7.2e-05, + "\u001b]1;make\u0007" + ], + [ + 7.412593, + "go build -ldflags '-X main.gitCommit=6ca462a3 -X main.buildInfo=1502977274' -tags \"selinux seccomp \" -o crio github.com/kubernetes-incubator/cri-o/cmd/crio\r\n" + ], + [ + 6.928493, + "go build -ldflags '-X main.gitCommit=6ca462a3 -X main.buildInfo=1502977274' -tags \"selinux seccomp \" -o crioctl github.com/kubernetes-incubator/cri-o/cmd/crioctl\r\n" + ], + [ + 1.93333, + "make -C conmon\r\n" + ], + [ + 0.004362, + "make[1]: Entering directory '/home/ryan/Development/Go/src/github.com/kubernetes-incubator/cri-o/conmon'\r\n" + ], + [ + 0.000772, + "cc -std=c99 -Os -Wall -Wextra -I/usr/include/glib-2.0 -I/usr/lib64/glib-2.0/include -c -o conmon.o conmon.c\r\n" + ], + [ + 0.314835, + "cc -std=c99 -Os -Wall -Wextra -I/usr/include/glib-2.0 -I/usr/lib64/glib-2.0/include -c -o cmsg.o cmsg.c\r\n" + ], + [ + 0.040765, + "cc -o conmon conmon.o cmsg.o -std=c99 -Os -Wall -Wextra -I/usr/include/glib-2.0 -I/usr/lib64/glib-2.0/include -lglib-2.0 \r\n" + ], + [ + 0.01855, + "make[1]: Leaving directory '/home/ryan/Development/Go/src/github.com/kubernetes-incubator/cri-o/conmon'\r\n" + ], + [ + 0.000285, + "make -C pause\r\n" + ], + [ + 0.00317, + "make[1]: Entering directory '/home/ryan/Development/Go/src/github.com/kubernetes-incubator/cri-o/pause'\r\ncc -std=c99 -Os -Wall -Wextra -static -c -o pause.o pause.c\r\n" + ], + [ + 0.030319, + "cc -o pause pause.o -std=c99 -Os -Wall -Wextra -static \r\n" + ], + [ + 0.090802, + "strip pause\r\n" + ], + [ + 0.004286, + "make[1]: Leaving directory '/home/ryan/Development/Go/src/github.com/kubernetes-incubator/cri-o/pause'\r\n" + ], + [ + 0.068555, + "go build -ldflags '-X main.gitCommit=6ca462a3 -X main.buildInfo=1502977274' -tags \"selinux seccomp \" -o test/bin2img/bin2img github.com/kubernetes-incubator/cri-o/test/bin2img\r\n" + ], + [ + 2.210776, + "go build -ldflags '-X main.gitCommit=6ca462a3 -X main.buildInfo=1502977274' -tags \"selinux seccomp \" -o test/copyimg/copyimg github.com/kubernetes-incubator/cri-o/test/copyimg\r\n" + ], + [ + 2.412996, + "go build -ldflags '-X main.gitCommit=6ca462a3 -X main.buildInfo=1502977274' -tags \"selinux seccomp \" -o test/checkseccomp/checkseccomp github.com/kubernetes-incubator/cri-o/test/checkseccomp" + ], + [ + 6.7e-05, + "\r\n" + ], + [ + 0.162664, + "./crio --config=\"\" config --default > crio.conf\r\n" + ], + [ + 0.091642, + "(go-md2man -in docs/kpod-diff.1.md -out docs/kpod-diff.1.tmp && touch docs/kpod-diff.1.tmp && mv docs/kpod-diff.1.tmp docs/kpod-diff.1) || (/home/ryan/Development/Go/bin/go-md2man -in docs/kpod-diff.1.md -out docs/kpod-diff.1.tmp && touch docs/kpod-diff.1.tmp && mv docs/kpod-diff.1.tmp docs/kpod-diff.1)\r\n" + ], + [ + 0.006608, + "(go-md2man -in docs/kpod-push.1.md -out docs/kpod-push.1.tmp && touch docs/kpod-push.1.tmp && mv docs/kpod-push.1.tmp docs/kpod-push.1) || (/home/ryan/Development/Go/bin/go-md2man -in docs/kpod-push.1.md -out docs/kpod-push.1.tmp && touch docs/kpod-push.1.tmp && mv docs/kpod-push.1.tmp docs/kpod-push.1)\r\n" + ], + [ + 0.008204, + "(go-md2man -in docs/crio.conf.5.md -out docs/crio.conf.5.tmp && touch docs/crio.conf.5.tmp && mv docs/crio.conf.5.tmp docs/crio.conf.5) || (/home/ryan/Development/Go/bin/go-md2man -in docs/crio.conf.5.md -out docs/crio.conf.5.tmp && touch docs/crio.conf.5.tmp && mv docs/crio.conf.5.tmp docs/crio.conf.5)\r\n" + ], + [ + 0.00881, + "(go-md2man -in docs/kpod.1.md -out docs/kpod.1.tmp && touch docs/kpod.1.tmp && mv docs/kpod.1.tmp docs/kpod.1) || (/home/ryan/Development/Go/bin/go-md2man -in docs/kpod.1.md -out docs/kpod.1.tmp && touch docs/kpod.1.tmp && mv docs/kpod.1.tmp docs/kpod.1)\r\n" + ], + [ + 0.008192, + "(go-md2man -in docs/kpod-export.1.md -out docs/kpod-export.1.tmp && touch docs/kpod-export.1.tmp && mv docs/kpod-export.1.tmp docs/kpod-export.1) || (/home/ryan/Development/Go/bin/go-md2man -in docs/kpod-export.1.md -out docs/kpod-export.1.tmp && touch docs/kpod-export.1.tmp && mv docs/kpod-export.1.tmp docs/kpod-export.1)\r\n" + ], + [ + 0.0109, + "(go-md2man -in docs/kpod-load.1.md -out docs/kpod-load.1.tmp && touch docs/kpod-load.1.tmp && mv docs/kpod-load.1.tmp docs/kpod-load.1) || (/home/ryan/Development/Go/bin/go-md2man -in docs/kpod-load.1.md -out docs/kpod-load.1.tmp && touch docs/kpod-load.1.tmp && mv docs/kpod-load.1.tmp docs/kpod-load.1)\r\n" + ], + [ + 0.009389, + "(go-md2man -in docs/kpod-images.1.md -out docs/kpod-images.1.tmp && touch docs/kpod-images.1.tmp && mv docs/kpod-images.1.tmp docs/kpod-images.1) || (/home/ryan/Development/Go/bin/go-md2man -in docs/kpod-images.1.md -out docs/kpod-images.1.tmp && touch docs/kpod-images.1.tmp && mv docs/kpod-images.1.tmp docs/kpod-images.1)\r\n" + ], + [ + 0.005353, + "(go-md2man -in docs/kpod-umount.1.md -out docs/kpod-umount.1.tmp && touch docs/kpod-umount.1.tmp && mv docs/kpod-umount.1.tmp docs/kpod-umount.1) || (/home/ryan/Development/Go/bin/go-md2man -in docs/kpod-umount.1.md -out docs/kpod-umount.1.tmp && touch docs/kpod-umount.1.tmp && mv docs/kpod-umount.1.tmp docs/kpod-umount.1)\r\n" + ], + [ + 0.008716, + "(go-md2man -in docs/crio.8.md -out docs/crio.8.tmp && touch docs/crio.8.tmp && mv docs/crio.8.tmp docs/crio.8) || (/home/ryan/Development/Go/bin/go-md2man -in docs/crio.8.md -out docs/crio.8.tmp && touch docs/crio.8.tmp && mv docs/crio.8.tmp docs/crio.8)\r\n" + ], + [ + 0.010697, + "(go-md2man -in docs/kpod-save.1.md -out docs/kpod-save.1.tmp && touch docs/kpod-save.1.tmp && mv docs/kpod-save.1.tmp docs/kpod-save.1) || (/home/ryan/Development/Go/bin/go-md2man -in docs/kpod-save.1.md -out docs/kpod-save.1.tmp && touch docs/kpod-save.1.tmp && mv docs/kpod-save.1.tmp docs/kpod-save.1)\r\n" + ], + [ + 0.007561, + "(go-md2man -in docs/kpod-cp.1.md -out docs/kpod-cp.1.tmp && touch docs/kpod-cp.1.tmp && mv docs/kpod-cp.1.tmp docs/kpod-cp.1) || (/home/ryan/Development/Go/bin/go-md2man -in docs/kpod-cp.1.md -out docs/kpod-cp.1.tmp && touch docs/kpod-cp.1.tmp && mv docs/kpod-cp.1.tmp docs/kpod-cp.1)\r\n" + ], + [ + 0.005973, + "(go-md2man -in docs/kpod-info.1.md -out docs/kpod-info.1.tmp && touch docs/kpod-info.1.tmp && mv docs/kpod-info.1.tmp docs/kpod-info.1) || (/home/ryan/Development/Go/bin/go-md2man -in docs/kpod-info.1.md -out docs/kpod-info.1.tmp && touch docs/kpod-info.1.tmp && mv docs/kpod-info.1.tmp docs/kpod-info.1)\r\n" + ], + [ + 0.005551, + "(go-md2man -in docs/kpod-mount.1.md -out docs/kpod-mount.1.tmp && touch docs/kpod-mount.1.tmp && mv docs/kpod-mount.1.tmp docs/kpod-mount.1) || (/home/ryan/Development/Go/bin/go-md2man -in docs/kpod-mount.1.md -out docs/kpod-mount.1.tmp && touch docs/kpod-mount.1.tmp && mv docs/kpod-mount.1.tmp docs/kpod-mount.1)\r\n" + ], + [ + 0.009121, + "(go-md2man -in docs/kpod-inspect.1.md -out docs/kpod-inspect.1.tmp && touch docs/kpod-inspect.1.tmp && mv docs/kpod-inspect.1.tmp docs/kpod-inspect.1) || (/home/ryan/Development/Go/bin/go-md2man -in docs/kpod-inspect.1.md -out docs/kpod-inspect.1.tmp && touch docs/kpod-inspect.1.tmp && mv docs/kpod-inspect.1.tmp docs/kpod-inspect.1)\r\n" + ], + [ + 0.006826, + "(go-md2man -in docs/kpod-logs.1.md -out docs/kpod-logs.1.tmp && touch docs/kpod-logs.1.tmp && mv docs/kpod-logs.1.tmp docs/kpod-logs.1) || (/home/ryan/Development/Go/bin/go-md2man -in docs/kpod-logs.1.md -out docs/kpod-logs.1.tmp && touch docs/kpod-logs.1.tmp && mv docs/kpod-logs.1.tmp docs/kpod-logs.1)\r\n" + ], + [ + 0.007772, + "(go-md2man -in docs/kpod-history.1.md -out docs/kpod-history.1.tmp && touch docs/kpod-history.1.tmp && mv docs/kpod-history.1.tmp docs/kpod-history.1) || (/home/ryan/Development/Go/bin/go-md2man -in docs/kpod-history.1.md -out docs/kpod-history.1.tmp && touch docs/kpod-history.1.tmp && mv docs/kpod-history.1.tmp docs/kpod-history.1)\r\n" + ], + [ + 0.005003, + "(go-md2man -in docs/kpod-pull.1.md -out docs/kpod-pull.1.tmp && touch docs/kpod-pull.1.tmp && mv docs/kpod-pull.1.tmp docs/kpod-pull.1) || (/home/ryan/Development/Go/bin/go-md2man -in docs/kpod-pull.1.md -out docs/kpod-pull.1.tmp && touch docs/kpod-pull.1.tmp && mv docs/kpod-pull.1.tmp docs/kpod-pull.1)\r\n" + ], + [ + 0.010404, + "(go-md2man -in docs/kpod-rmi.1.md -out docs/kpod-rmi.1.tmp && touch docs/kpod-rmi.1.tmp && mv docs/kpod-rmi.1.tmp docs/kpod-rmi.1) || (/home/ryan/Development/Go/bin/go-md2man -in docs/kpod-rmi.1.md -out docs/kpod-rmi.1.tmp && touch docs/kpod-rmi.1.tmp && mv docs/kpod-rmi.1.tmp docs/kpod-rmi.1)\r\n" + ], + [ + 0.007878, + "(go-md2man -in docs/kpod-version.1.md -out docs/kpod-version.1.tmp && touch docs/kpod-version.1.tmp && mv docs/kpod-version.1.tmp docs/kpod-version.1) || (/home/ryan/Development/Go/bin/go-md2man -in docs/kpod-version.1.md -out docs/kpod-version.1.tmp && touch docs/kpod-version.1.tmp && mv docs/kpod-version.1.tmp docs/kpod-version.1)\r\n" + ], + [ + 0.006074, + "(go-md2man -in docs/kpod-tag.1.md -out docs/kpod-tag.1.tmp && touch docs/kpod-tag.1.tmp && mv docs/kpod-tag.1.tmp docs/kpod-tag.1) || (/home/ryan/Development/Go/bin/go-md2man -in docs/kpod-tag.1.md -out docs/kpod-tag.1.tmp && touch docs/kpod-tag.1.tmp && mv docs/kpod-tag.1.tmp docs/kpod-tag.1)\r\n" + ], + [ + 0.007358, + "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r" + ], + [ + 0.021811, + "\r\n\u001b[34m\u001b[01mcri-o\u001b[22m \u001b[90mgit/master* \u001b[39m \u001b[33m22s\u001b[39m\r\n" + ], + [ + 0.001102, + "\u001b]7;file://localhost.localdomain/home/ryan/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007" + ], + [ + 0.000118, + "\u001b]2;ryan@localhost: ~/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007" + ], + [ + 1.5e-05, + "\u001b]1;..cubator/cri-o\u0007" + ], + [ + 6.9e-05, + "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[35m❯\u001b[39m \u001b[K\u001b[208C\u001b[90m\u001b[39m\u001b[208D" + ], + [ + 0.000142, + "\u001b[?1h\u001b=" + ], + [ + 2.9e-05, + "\u001b[?2004h" + ], + [ + 22.687022, + "s" + ], + [ + 0.176986, + "\bsu" + ], + [ + 0.231668, + "d" + ], + [ + 0.167315, + "o" + ], + [ + 0.224159, + " " + ], + [ + 0.184546, + "m" + ], + [ + 0.111947, + "a" + ], + [ + 0.127867, + "k" + ], + [ + 0.07167, + "e" + ], + [ + 0.095736, + " " + ], + [ + 0.072818, + "i" + ], + [ + 0.071884, + "n" + ], + [ + 0.07219, + "s" + ], + [ + 0.088277, + "t" + ], + [ + 0.071516, + "a" + ], + [ + 0.14414, + "l" + ], + [ + 0.119615, + "l" + ], + [ + 0.239306, + "\u001b[?1l\u001b>" + ], + [ + 7.7e-05, + "\u001b[?2004l\r\r\n" + ], + [ + 0.001719, + "\u001b]2;sudo make install\u0007\u001b]1;make\u0007" + ], + [ + 3.018747, + "install -D -m 755 crio /usr/local/bin/crio\r\n" + ], + [ + 0.042567, + "install -D -m 755 crioctl /usr/local/bin/crioctl\r\n" + ], + [ + 0.026457, + "install -D -m 755 kpod /usr/local/bin/kpod" + ], + [ + 6.3e-05, + "\r\n" + ], + [ + 0.040019, + "install -D -m 755 conmon/conmon /usr/local/libexec/crio/conmon\r\n" + ], + [ + 0.003162, + "install -D -m 755 pause/pause /usr/local/libexec/crio/pause\r\n" + ], + [ + 0.003708, + "install -d -m 755 /usr/local/share/man/man1\r\n" + ], + [ + 0.00089, + "install -d -m 755 /usr/local/share/man/man5\r\n" + ], + [ + 0.000625, + "install -d -m 755 /usr/local/share/man/man8\r\n" + ], + [ + 0.000846, + "install -m 644 docs/kpod-diff.1 docs/kpod-push.1 docs/kpod-cp.1 docs/kpod.1 docs/kpod-export.1 docs/kpod-load.1 docs/kpod-logs.1 docs/kpod-images.1 docs/kpod-umount.1 docs/kpod-save.1 docs/kpod-mount.1 docs/kpod-info.1 docs/kpod-inspect.1 docs/kpod-history.1 docs/kpod-pull.1 docs/kpod-rmi.1 docs/kpod-version.1 docs/kpod-tag.1 -t /usr/local/share/man/man1\r\n" + ], + [ + 0.009723, + "install -m 644 docs/crio.conf.5 -t /usr/local/share/man/man5\r\n" + ], + [ + 0.002898, + "install -m 644 docs/crio.8 -t /usr/local/share/man/man8\r\n" + ], + [ + 0.006399, + "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r" + ], + [ + 0.021303, + "\r\n\u001b[34m\u001b[01mcri-o\u001b[22m \u001b[90mgit/master* \u001b[39m \u001b[33m\u001b[39m\r\n" + ], + [ + 0.001274, + "\u001b]7;file://localhost.localdomain/home/ryan/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007" + ], + [ + 0.0001, + "\u001b]2;ryan@localhost: ~/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007" + ], + [ + 7.9e-05, + "\u001b]1;..cubator/cri-o\u0007" + ], + [ + 7e-05, + "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[35m❯\u001b[39m \u001b[K\u001b[208C\u001b[90m\u001b[39m\u001b[208D" + ], + [ + 7.4e-05, + "\u001b[?1h\u001b=" + ], + [ + 3.4e-05, + "\u001b[?2004h" + ], + [ + 255.497514, + "v" + ], + [ + 0.111133, + "\bvi" + ], + [ + 0.096261, + " " + ], + [ + 0.055637, + "c" + ], + [ + 0.128288, + "m" + ], + [ + 0.295825, + "\b \b" + ], + [ + 0.499642, + "\b \b" + ], + [ + 0.03181, + "\b" + ], + [ + 0.030112, + "\b\bv \b" + ], + [ + 0.029886, + "\b \b" + ], + [ + 2470.181351, + "g" + ], + [ + 0.134982, + "\bgi" + ], + [ + 0.116687, + "t" + ], + [ + 0.248596, + " " + ], + [ + 0.091959, + "c" + ], + [ + 0.221434, + "h" + ], + [ + 0.511729, + "\b \b" + ], + [ + 0.149467, + "\b \b" + ], + [ + 0.180553, + "r" + ], + [ + 0.09336, + "e" + ], + [ + 0.118113, + "s" + ], + [ + 0.166341, + "e" + ], + [ + 0.101897, + "t" + ], + [ + 0.135639, + " " + ], + [ + 0.101112, + "-" + ], + [ + 0.133755, + "-" + ], + [ + 0.204129, + "h" + ], + [ + 0.087003, + "a" + ], + [ + 0.070922, + "r" + ], + [ + 0.107809, + "d" + ], + [ + 0.081233, + " " + ], + [ + 0.210727, + "H" + ], + [ + 0.08464, + "E" + ], + [ + 0.340797, + "AD\u001b[1m \u001b[0m" + ], + [ + 0.359977, + "\b\u001b[0m \b" + ], + [ + 0.000209, + "\u001b[?1l\u001b>" + ], + [ + 3.7e-05, + "\u001b[?2004l\r\r\n" + ], + [ + 0.00869, + "\u001b]2;git reset --hard HEAD\u0007\u001b]1;git\u0007" + ], + [ + 0.033935, + "HEAD is now at 6ca462a3 Merge pull request #718 from 14rcole/kpod-logs\r\n" + ], + [ + 0.000491, + "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r" + ], + [ + 0.039313, + "\r\n\u001b[34m\u001b[01mcri-o\u001b[22m \u001b[90mgit/master \u001b[39m \u001b[33m\u001b[39m\r\n" + ], + [ + 0.00621, + "\u001b]7;file://localhost.localdomain/home/ryan/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007" + ], + [ + 0.000838, + "\u001b]2;ryan@localhost: ~/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007\u001b]1;..cubator/cri-o\u0007\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[35m❯\u001b[39m \u001b[K\u001b[208C\u001b[90m\u001b[39m\u001b[208D\u001b[?1h\u001b=\u001b[?2004h" + ], + [ + 0.401122, + "g" + ], + [ + 0.143266, + "\bgi" + ], + [ + 0.141142, + "t" + ], + [ + 0.13335, + " " + ], + [ + 0.080629, + "p" + ], + [ + 0.068567, + "u" + ], + [ + 0.139439, + "s" + ], + [ + 0.111629, + "h" + ], + [ + 0.103453, + " " + ], + [ + 0.140922, + "o" + ], + [ + 0.09323, + "r" + ], + [ + 0.126723, + "i" + ], + [ + 0.116153, + "g" + ], + [ + 0.103085, + "i" + ], + [ + 0.110423, + "n" + ], + [ + 0.047839, + " " + ], + [ + 0.211066, + "m" + ], + [ + 0.140391, + "a" + ], + [ + 0.493452, + "s" + ], + [ + 0.228966, + "ter\u001b[1m \u001b[0m" + ], + [ + 0.433861, + "\b\u001b[0m \b" + ], + [ + 0.000112, + "\u001b[?1l\u001b>" + ], + [ + 3.1e-05, + "\u001b[?2004l" + ], + [ + 0.001239, + "\r\r\n" + ], + [ + 0.004134, + "\u001b]2;git push origin master\u0007\u001b]1;git\u0007" + ], + [ + 0.74689, + "Total 0 (delta 0), reused 0 (delta 0)\r\n" + ], + [ + 1.494101, + "To github.com:14rcole/cri-o\r\n a69631c1..6ca462a3 master -> master\r\n" + ], + [ + 0.000159, + "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r" + ], + [ + 0.046807, + "\r\n\u001b[34m\u001b[01mcri-o\u001b[22m \u001b[90mgit/master \u001b[39m \u001b[33m\u001b[39m\r\n" + ], + [ + 0.001056, + "\u001b]7;file://localhost.localdomain/home/ryan/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007" + ], + [ + 0.000155, + "\u001b]2;ryan@localhost: ~/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007" + ], + [ + 4e-05, + "\u001b]1;..cubator/cri-o\u0007" + ], + [ + 9.5e-05, + "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[35m❯\u001b[39m \u001b[K\u001b[208C\u001b[90m\u001b[39m\u001b[208D" + ], + [ + 7.1e-05, + "\u001b[?1h\u001b=" + ], + [ + 4.1e-05, + "\u001b[?2004h" + ], + [ + 7.372135, + "g" + ], + [ + 0.126302, + "\bgi" + ], + [ + 0.101424, + "t" + ], + [ + 0.42971, + "n" + ], + [ + 1.654559, + "\b \b" + ], + [ + 0.292926, + " " + ], + [ + 0.227087, + "c" + ], + [ + 0.127935, + "h" + ], + [ + 0.100042, + "e" + ], + [ + 0.081115, + "c" + ], + [ + 0.195682, + "k" + ], + [ + 0.505623, + "o" + ], + [ + 0.138216, + "ut" + ], + [ + 0.45806, + " " + ], + [ + 0.100148, + "m" + ], + [ + 0.335248, + "\b \b" + ], + [ + 0.188284, + "k" + ], + [ + 0.140606, + "pod-" + ], + [ + 0.287649, + "t" + ], + [ + 0.053698, + "e" + ], + [ + 0.304664, + "st-refactor\u001b[1m \u001b[0m" + ], + [ + 0.651671, + "\b\u001b[0m \b" + ], + [ + 9.4e-05, + "\u001b[?1l\u001b>" + ], + [ + 6.3e-05, + "\u001b[?2004l\r\r\n" + ], + [ + 0.002007, + "\u001b]2;git checkout kpod-test-refactor\u0007\u001b]1;git\u0007" + ], + [ + 0.048356, + "Switched to branch 'kpod-test-refactor'\r\n" + ], + [ + 0.001669, + "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r" + ], + [ + 0.055687, + "\r\n\u001b[34m\u001b[01mcri-o\u001b[22m \u001b[90mgit/kpod-test-refactor \u001b[39m \u001b[33m\u001b[39m\r\n" + ], + [ + 0.000911, + "\u001b]7;file://localhost.localdomain/home/ryan/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007" + ], + [ + 6.7e-05, + "\u001b]2;ryan@localhost: ~/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007" + ], + [ + 2.2e-05, + "\u001b]1;..cubator/cri-o\u0007" + ], + [ + 0.000112, + "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[35m❯\u001b[39m \u001b[K\u001b[208C\u001b[90m\u001b[39m\u001b[208D" + ], + [ + 4.9e-05, + "\u001b[?1h\u001b=" + ], + [ + 2.1e-05, + "\u001b[?2004h" + ], + [ + 101.519318, + "v" + ], + [ + 0.095071, + "\bvi" + ], + [ + 0.079201, + " " + ], + [ + 1.258215, + "c" + ], + [ + 0.126693, + "m" + ], + [ + 0.116773, + "d\u001b[1m/\u001b[0m" + ], + [ + 0.846315, + "\b\u001b[0m/t" + ], + [ + 0.047782, + "e" + ], + [ + 0.357957, + "\b \b" + ], + [ + 0.134026, + "\b \b" + ], + [ + 0.180238, + "k" + ], + [ + 0.084009, + "pod\u001b[1m/\u001b[0m" + ], + [ + 1.056429, + "\b\u001b[0m \b" + ], + [ + 0.500154, + "\b \b" + ], + [ + 0.0301, + "\b \b" + ], + [ + 0.031128, + "\b \b" + ], + [ + 0.030599, + "\b \b" + ], + [ + 0.029396, + "\b \b" + ], + [ + 0.031795, + "\b \b" + ], + [ + 0.120498, + "\b \b" + ], + [ + 0.173821, + "\b \b" + ], + [ + 0.155303, + "t" + ], + [ + 0.046457, + "e" + ], + [ + 0.208794, + "st\u001b[1m/\u001b[0m" + ], + [ + 0.115379, + "\b\u001b[0m/k" + ], + [ + 0.204258, + "pod_" + ], + [ + 0.686373, + "p" + ], + [ + 0.067817, + "s" + ], + [ + 0.535881, + "\b \b" + ], + [ + 0.187935, + "u" + ], + [ + 0.08672, + "\u0007" + ], + [ + 0.000211, + "\r\r\n" + ], + [ + 6.1e-05, + "\u001b[J\u001b[0mkpod_pull.bats \u001b[Jkpod_push.bats\u001b[J\u001b[A\u001b[0m\u001b[27m\u001b[24m\u001b[39m\r\u001b[2Cvi test/kpod_pu\u001b[K\u001b[193C\u001b[90m\u001b[39m\u001b[39m\u001b[193D" + ], + [ + 0.347316, + "s" + ], + [ + 0.191815, + "h.bats\u001b[1m \u001b[0m" + ], + [ + 0.247116, + "\b\u001b[0m \b\u001b[?1l\u001b>" + ], + [ + 0.001036, + "\u001b[?2004l\r\r\n\u001b[J" + ], + [ + 0.001089, + "\u001b]2;vim test/kpod_push.bats\u0007" + ], + [ + 4.6e-05, + "\u001b]1;vi\u0007" + ], + [ + 0.251946, + "\u001b[?2004h\u001b[?1049h\u001b[?1h\u001b=\u001b[?2004h" + ], + [ + 0.001597, + "\u001b[1;52r\u001b[?12;25h\u001b[?12l\u001b[?25h\u001b[27m\u001b[23m\u001b[m\u001b[93m\u001b[107m\u001b[H\u001b[2J\u001b[?25l\u001b[52;1H\"test/kpod_push.bats\"" + ], + [ + 0.000102, + " 87L, 2372C" + ], + [ + 0.003896, + "\u001b[2;1H▽\u001b[6n\u001b[2;1H \u001b[1;1H\u001b[>c" + ], + [ + 0.000853, + "\u001b[1;1H\u001b[96m\u001b[47m 1 \u001b[m\u001b[93m\u001b[107m\u001b[96m#!/usr/bin/env bats\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m 2 \r\n 3 \u001b[m\u001b[93m\u001b[107mload helpers\r\n\u001b[96m\u001b[47m 4 \r\n 5 \u001b[m\u001b[93m\u001b[107mIMAGE=\u001b[36m\"alpine:latest\"\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m 6 \u001b[m\u001b[93m\u001b[107mROOT=\u001b[36m\"$TESTDIR/crio\"\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m 7 \u001b[m\u001b[93m\u001b[107mRUNROOT=\u001b[36m\"$TESTDIR/crio-run\"\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m 8 \u001b[m\u001b[93m\u001b[107mKPOD_OPTIONS=\u001b[36m\"--root $ROOT --runroot $RUNROOT $STORAGE_OPTS\"\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m 9 \r\n 10 \u001b[m\u001b[93m\u001b[107mfunction teardown() {\r\n\u001b[96m\u001b[47m 11 \u001b[m\u001b[93m\u001b[107m cleanup_test\r\n\u001b[96m\u001b[47m 12 \u001b[m\u001b[93m\u001b[107m}\r\n\u001b[96m\u001b[47m 13 \r\n 14 \u001b[m\u001b[93m\u001b[107m@test \u001b[36m\"kpod push to containers/storage\"\u001b[m\u001b[93m\u001b[107m {\r\n\u001b[96m\u001b[47m 15 \u001b[m\u001b[93m\u001b[107m run ${KPOD_BINARY} $KPOD_OPTIONS pull \u001b[36m\"$IMAGE\"\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m 16 \u001b[m\u001b[93m\u001b[107m echo \u001b[36m\"$output\"\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m 17 \u001b[m\u001b[93m\u001b[107m [ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\r\n\u001b[96m\u001b[47m 18 \u001b[m\u001b[93m\u001b[107m run ${KPOD_BINARY} $KPOD_OPTIONS push \u001b[36m\"$IMAGE\"\u001b[m\u001b[93m\u001b[107m contai" + ], + [ + 3e-05, + "ners-storage:[$ROOT]busybox:test\r\n\u001b[96m\u001b[47m 19 \u001b[m\u001b[93m\u001b[107m echo \u001b[36m\"$output\"\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m 20 \u001b[m\u001b[93m\u001b[107m [ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\r\n\u001b[96m\u001b[47m 21 \u001b[m\u001b[93m\u001b[107m run ${KPOD_BINARY} $KPOD_OPTIONS rmi \u001b[36m\"$IMAGE\"\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m 22 \u001b[m\u001b[93m\u001b[107m [ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\r\n\u001b[96m\u001b[47m 23 \u001b[m\u001b[93m\u001b[107m run ${KPOD_BINARY} $KPOD_OPTIONS rmi \u001b[36m\"$IMAGE\"\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m 24 \u001b[m\u001b[93m\u001b[107m [ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\r\n\u001b[96m\u001b[47m 25 \u001b[m\u001b[93m\u001b[107m stop_crio\r\n\u001b[96m\u001b[47m 26 \u001b[m\u001b[93m\u001b[107m}\r\n\u001b[96m\u001b[47m 27 \r\n 28 \u001b[m\u001b[93m\u001b[107m@test \u001b[36m\"kpod push to directory\"\u001b[m\u001b[93m\u001b[107m {\r\n\u001b[96m\u001b[47m 29 \u001b[m\u001b[93m\u001b[107m run ${KPOD_BINARY} $KPOD_OPTIONS pull \u001b[36m\"$IMAGE\"\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m 30 \u001b[m\u001b[93m\u001b[107m echo \u001b[36m\"$output\"\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m 31 \u001b[m\u001b[93m\u001b[107m [ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\r\n\u001b[96m\u001b[47m 32 \u001b[m\u001b[93m\u001b[107m run mkdir /tmp/busybox\r\n\u001b[96m\u001b[47m 33 \u001b[m\u001b[93m\u001b[107m echo " + ], + [ + 0.059183, + "\u001b[36m\"$output\"\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m 34 \u001b[m\u001b[93m\u001b[107m [ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\r\n\u001b[96m\u001b[47m 35 \u001b[m\u001b[93m\u001b[107m run ${KPOD_BINARY} $KPOD_OPTIONS push \u001b[36m\"$IMAGE\"\u001b[m\u001b[93m\u001b[107m dir:/tmp/busybox\r\n\u001b[96m\u001b[47m 36 \u001b[m\u001b[93m\u001b[107m echo \u001b[36m\"$output\"\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m 37 \u001b[m\u001b[93m\u001b[107m [ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\r\n\u001b[96m\u001b[47m 38 \u001b[m\u001b[93m\u001b[107m run ${KPOD_BINARY} $KPOD_OPTIONS rmi \u001b[36m\"$IMAGE\"\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m 39 \u001b[m\u001b[93m\u001b[107m [ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\r\n\u001b[96m\u001b[47m 40 \u001b[m\u001b[93m\u001b[107m rm -rf /tmp/busybox\r\n\u001b[96m\u001b[47m 41 \u001b[m\u001b[93m\u001b[107m stop_crio\r\n\u001b[96m\u001b[47m 42 \u001b[m\u001b[93m\u001b[107m}\r\n\u001b[96m\u001b[47m 43 \r\n 44 \u001b[m\u001b[93m\u001b[107m@test \u001b[36m\"kpod push to docker archive\"\u001b[m\u001b[93m\u001b[107m {\r\n\u001b[96m\u001b[47m 45 \u001b[m\u001b[93m\u001b[107m run ${KPOD_BINARY} $KPOD_OPTIONS pull \u001b[36m\"$IMAGE\"\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m 46 \u001b[m\u001b[93m\u001b[107m echo \u001b[36m\"$output\"\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m 47 \u001b[m\u001b[93m\u001b[107m [ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\r\n\u001b[96m\u001b[47m 48 \u001b[m\u001b[93m\u001b[107m run ${KP" + ], + [ + 4.1e-05, + "OD_BINARY} $KPOD_OPTIONS push \u001b[36m\"$IMAGE\"\u001b[m\u001b[93m\u001b[107m docker-archive:/tmp/busybox-archive:1.26\r\n\u001b[96m\u001b[47m 49 \u001b[m\u001b[93m\u001b[107m echo \u001b[36m\"$output\"\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m 50 \u001b[m\u001b[93m\u001b[107m [ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\r\n\u001b[1m\u001b[38;5;22m\u001b[48;5;148m NORMAL \u001b[m\u001b[93m\u001b[107m\u001b[38;5;148m\u001b[48;5;240m\u001b[51;10H \u001b[m\u001b[93m\u001b[107m\u001b[38;5;250m\u001b[48;5;240m\u001b[51;12H kpod-test-refactor \u001b[m\u001b[93m\u001b[107m\u001b[38;5;245m\u001b[48;5;240m\u001b[51;33H \u001b[m\u001b[93m\u001b[107m\u001b[38;5;250m\u001b[48;5;240mtest/\u001b[m\u001b[93m\u001b[107m\u001b[1m\u001b[38;5;231m\u001b[48;5;240mkpod_push.bats \u001b[m\u001b[93m\u001b[107m\u001b[38;5;240m\u001b[48;5;236m\u001b[51;55H \u001b[m\u001b[93m\u001b[107m\u001b[38;5;231m\u001b[48;5;236m                                                                                                                      \u001b[m\u001b[93m\u001b[107m\u001b[38;5;247m\u001b[48;5;236munix\u001b[m\u001b[93m\u001b[107m\u001b[38;5;244m\u001b[48;5;236m \u001b[m\u001b[93m\u001b[107m\u001b[51;180H\u001b[38;5;247m\u001b[48;5;236m utf-8\u001b[m\u001b[93m\u001b[107m" + ], + [ + 0.013876, + "\u001b[38;5;244m\u001b[48;5;236m \u001b[m\u001b[93m\u001b[107m\u001b[51;188H\u001b[38;5;247m\u001b[48;5;236m conf\u001b[m\u001b[93m\u001b[107m\u001b[38;5;240m\u001b[48;5;236m \u001b[m\u001b[93m\u001b[107m\u001b[51;195H\u001b[38;5;107m\u001b[48;5;240m  26%\u001b[m\u001b[93m\u001b[107m\u001b[38;5;252m\u001b[48;5;240m \u001b[m\u001b[93m\u001b[107m\u001b[51;202H\u001b[38;5;235m\u001b[48;5;252m \u001b[51;204H \u001b[m\u001b[93m\u001b[107m\u001b[1m\u001b[38;5;235m\u001b[48;5;252m 23\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:5  \u001b[23;9H\u001b[?12l\u001b[?25h\u001bP+q436f\u001b\\\u001bP+q6b75\u001b\\\u001bP+q6b64\u001b\\\u001bP+q6b72\u001b\\\u001bP+q6b6c\u001b\\\u001bP+q2332\u001b\\\u001bP+q2334\u001b\\\u001bP+q2569\u001b\\\u001bP+q2a37\u001b\\\u001bP+q6b31\u001b\\" + ], + [ + 4.816904, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[24;9H\u001b[1m\u001b[31m\u001b[106m[\u001b[17C]\u001b[m\u001b[93m\u001b[107m\u001b[51;195H\u001b[38;5;107m\u001b[48;5;240m  28%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m4\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[24;9H\u001b[?12l\u001b[?25h" + ], + [ + 4.011791, + "\u001b[?25l\u001b[?12l\u001b[?25h" + ], + [ + 0.843663, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m[ \u001b[16C]\u001b[51;195H\u001b[38;5;107m\u001b[48;5;240m  26%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m3\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[23;9H\u001b[?12l\u001b[?25h" + ], + [ + 0.530257, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\b\b\b\b\u001b[7m\u001b[96m\u001b[107m \u001b[m\u001b[93m\u001b[107mr\u001b[7m\u001b[96m\u001b[107mun ${KPOD_BINARY} $KPOD_OPTIONS rmi \u001b[m\u001b[93m\u001b[107m\u001b[7m\u001b[96m\u001b[107m\"$IMAGE\"\u001b[m\u001b[93m\u001b[107m\u001b[7m\u001b[96m\u001b[107m " + ], + [ + 0.005375, + "\u001b[m\u001b[93m\u001b[107m\u001b[52;1H\u001b[34m-- VISUAL LINE --\u001b[m\u001b[93m\u001b[107m\u001b[52;18H\u001b[K\u001b[51;1H\u001b[1m\u001b[38;5;94m\u001b[48;5;214m V·\u001b[51;4HLINE \u001b[m\u001b[93m\u001b[107m\u001b[38;5;148m\u001b[48;5;240m\u001b[m\u001b[93m\u001b[107m\u001b[51;9H\u001b[38;5;214m\u001b[48;5;94m\u001b[51;10H \u001b[m\u001b[93m\u001b[107m\u001b[1m\u001b[38;5;214m\u001b[48;5;94m⇕1 \u001b[m\u001b[93m\u001b[107m\u001b[38;5;94m\u001b[48;5;240m\u001b[51;15H \u001b[m\u001b[93m\u001b[107m\u001b[38;5;250m\u001b[48;5;240m\u001b[51;17H kpod-test-refactor \u001b[m\u001b[93m\u001b[107m\u001b[38;5;245m\u001b[48;5;240m\u001b[51;38H \u001b[m\u001b[93m\u001b[107m\u001b[38;5;250m\u001b[48;5;240mtest/\u001b[m\u001b[93m\u001b[107m\u001b[1m\u001b[38;5;231m\u001b[48;5;240mp\bkpod_push.bats \u001b[m\u001b[93m\u001b[107m\u001b[38;5;240m\u001b[48;5;236m\u001b[51;60H \u001b[23;9H\u001b[?12l\u001b[?25h" + ], + [ + 0.187201, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[7m\u001b[96m\u001b[107mr\u001b[24;5H \u001b[m\u001b[93m\u001b[107m\u001b[1m\u001b[31m\u001b[106m[\u001b[m\u001b[93m\u001b[107m\u001b[7m\u001b[96m\u001b[107m \u001b[m\u001b[93m\u001b[107m\u001b[7m\u001b[96m\u001b[107m\"$status\"\u001b[m\u001b[93m\u001b[107m\u001b[7m\u001b[96m\u001b[107m -eq 0 ] \u001b[m\u001b[93m\u001b[107m\u001b[51;12H\u001b[1m\u001b[38;5;214m\u001b[48;5;94m2 \u001b[m\u001b[93m\u001b[107m\u001b[181C\u001b[38;5;107m\u001b[48;5;240m  28%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m4\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[24;9H\u001b[?12l\u001b[?25h" + ], + [ + 0.311219, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[23;5H stop_crio\u001b[23;18H\u001b[K\u001b[24;5H}\u001b[24;6H\u001b[K\u001b[25;9H\u001b[K\u001b[26;5H@test \u001b[36m\"kpod push to directory\"\u001b[m\u001b[93m\u001b[107m {\u001b[27;9Hrun ${KPOD_BINARY} $KPOD_OPTIONS pull \u001b[36m\"$IMAGE\"\u001b[m\u001b[93m\u001b[107m\u001b[28;5H echo \u001b[36m\"$output\"\u001b[m\u001b[93m\u001b[107m\u001b[28;23H\u001b[K\u001b[29;9H[ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\u001b[29;28H\u001b[K\u001b[30;9Hrun mkdir /tmp/busybox\u001b[31;9Hecho \u001b[36m\"$output\"\u001b[m\u001b[93m\u001b[107m\u001b[31;23H\u001b[K\u001b[32;9H[ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\u001b[32;28H\u001b[K\u001b[33;9Hrun ${KPOD_BINARY} $KPOD_OPTIONS push \u001b[36m\"$IMAGE\"\u001b[m\u001b[93m\u001b[107m dir:/tmp/busybox\u001b[34;9Hecho \u001b[36m\"$output\"\u001b[m\u001b[93m\u001b[107m\u001b[34;23H\u001b[K\u001b[35;9H[ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\u001b[35;28H\u001b[K\u001b[36;9Hrun ${KPOD_BINARY} $KPOD_OPTIONS rmi \u001b[36m\"$IMAGE\"\u001b[m\u001b[93m\u001b[107m\u001b[38;10Hm -rf /tmp/busybox\u001b[38;28H\u001b[K\u001b[39;9Hstop_crio\u001b[39;18H\u001b[K\u001b[40;5H}\u001b[40;9H\u001b[K\u001b[41;9H\u001b[K\u001b[42;5H@test \u001b[36m\"kpod push to docker archive\"\u001b[m\u001b[93m\u001b[107m {\u001b[43;9Hrun ${KPOD_BINARY} $KPOD_OPTIONS pull \u001b[36m\"$IMAGE\"\u001b[m\u001b[93m\u001b[107m\u001b[44;5H echo \u001b[36m\"$output\"\u001b[m\u001b[93m\u001b[107m\u001b[44;23H\u001b[K\u001b[45;9H[ \u001b[36m\"$sta" + ], + [ + 6.1e-05, + "tus\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\u001b[45;28H\u001b[K\u001b[46;9Hrun ${KPOD_BINARY} $KPOD_OPTIONS push \u001b[36m\"$IMAGE\"\u001b[m\u001b[93m\u001b[107m docker-archive:/tmp/busybox-archive:1.26\u001b[47;9Hecho \u001b[36m\"$output\"\u001b[m\u001b[93m\u001b[107m\u001b[47;23H\u001b[K\u001b[48;9H[ \u001b[36m\"$status\"\u001b[m\u001b[93m\u001b[107m -eq 0 ]\u001b[48;28H\u001b[K\u001b[49;9Hrm /tmp/busybox-archive\u001b[50;9Hrun ${KPOD_BINARY} $KPOD_OPTIONS rmi \u001b[36m\"$IMAGE\"\u001b[m\u001b[93m\u001b[107m\r\n\u001b[1m\u001b[38;5;22m\u001b[48;5;148m NORMAL \u001b[m\u001b[93m\u001b[107m\u001b[38;5;214m\u001b[48;5;94m\u001b[m\u001b[93m\u001b[107m\u001b[51;9H\u001b[38;5;148m\u001b[48;5;240m\u001b[51;10H \u001b[m\u001b[93m\u001b[107m\u001b[38;5;250m\u001b[48;5;240m\u001b[51;12H kpod-test-refactor \u001b[m\u001b[93m\u001b[107m\u001b[38;5;245m\u001b[48;5;240m\u001b[51;33H \u001b[m\u001b[93m\u001b[107m\u001b[38;5;250m\u001b[48;5;240mtest/\u001b[m\u001b[93m\u001b[107m\u001b[1m\u001b[38;5;231m\u001b[48;5;240mkpod_push.bats.\u001b[m\u001b[93m\u001b[107m\b\u001b[1m\u001b[38;5;220m\u001b[48;5;240m + \u001b[m\u001b[93m\u001b[107m\u001b[1m\u001b[38;5;231m\u001b[48;5;240mt\u001b[m\u001b[93m\u001b[107m\b\u001b[38;5;240m\u001b[48;5;236m\u001b[51;57H \u001b[m\u001b[93m\u001b[107m\u001b[1m\u001b[38;5;231m\u001b[48;5;240m \u001b[m\u001b[93m\u001b[107m\b\u001b[38;5;231m\u001b[48;5;236m   \u001b[m\u001b[93m\u001b[107m\u001b[134C\u001b[38;5;107m\u001b[48;5;240m  27%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m" + ], + [ + 0.003283, + "\u001b[48;5;252m3\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[m\u001b[93m\u001b[107m\u001b[52;1H\u001b[K\u001b[23;9H\u001b[?12l\u001b[?25h" + ], + [ + 4.012199, + "\u001b[?25l\u001b[?12l\u001b[?25h" + ], + [ + 2.525173, + "\u001b[?25l\u001b[52;1H:" + ], + [ + 3.9e-05, + "\u001b[?2004h\u001b[?12l\u001b[?25h" + ], + [ + 0.585401, + "w\u001b[?25l\u001b[?12l\u001b[?25h" + ], + [ + 0.118422, + "q\u001b[?25l\u001b[?12l\u001b[?25h" + ], + [ + 8.69039, + "\r\u001b[?25l\u001b[?2004l\"test/kpod_push.bats\"" + ], + [ + 0.005802, + " 85L, 2298C written" + ], + [ + 0.01652, + "\r\r\r\n\u001b[39;49m" + ], + [ + 0.000114, + "\u001b[?2004l\u001b[?1l\u001b>\u001b[?12l\u001b[?25h\u001b[?1049l" + ], + [ + 0.00281, + "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r" + ], + [ + 0.044965, + "\r\n\u001b[34m\u001b[01mcri-o\u001b[22m \u001b[90mgit/kpod-test-refactor* \u001b[39m \u001b[33m27s\u001b[39m\r\n" + ], + [ + 0.004489, + "\u001b]7;file://localhost.localdomain/home/ryan/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007" + ], + [ + 0.000232, + "\u001b]2;ryan@localhost: ~/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007" + ], + [ + 9.4e-05, + "\u001b]1;..cubator/cri-o\u0007" + ], + [ + 0.000151, + "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[35m❯\u001b[39m " + ], + [ + 5.2e-05, + "\u001b[K\u001b[208C\u001b[90m\u001b[39m\u001b[208D" + ], + [ + 4.3e-05, + "\u001b[?1h\u001b=" + ], + [ + 3e-05, + "\u001b[?2004h" + ], + [ + 1.0948, + "g" + ], + [ + 0.142791, + "\bgi" + ], + [ + 0.093165, + "t" + ], + [ + 0.104881, + " " + ], + [ + 0.146445, + "c" + ], + [ + 0.080499, + "o" + ], + [ + 0.116396, + "m" + ], + [ + 0.149451, + "m" + ], + [ + 0.126645, + "i" + ], + [ + 0.124885, + "t" + ], + [ + 0.057566, + " " + ], + [ + 0.196291, + "-" + ], + [ + 0.162575, + "a" + ], + [ + 0.097583, + " " + ], + [ + 0.118011, + "-" + ], + [ + 0.149342, + "-" + ], + [ + 0.046139, + "a" + ], + [ + 0.16449, + "m" + ], + [ + 0.100832, + "e" + ], + [ + 0.454585, + "n" + ], + [ + 0.157844, + "d" + ], + [ + 0.128767, + "\u001b[?1l\u001b>" + ], + [ + 6.4e-05, + "\u001b[?2004l\r\r\n" + ], + [ + 0.002817, + "\u001b]2;git commit -a --amend\u0007\u001b]1;git\u0007" + ], + [ + 0.030281, + "\u001b[?2004h\u001b[?1049h\u001b[?1h\u001b=\u001b[?2004h" + ], + [ + 0.003594, + "\u001b[1;52r\u001b[?12;25h\u001b[?12l\u001b[?25h\u001b[27m\u001b[23m\u001b[m\u001b[H\u001b[2J\u001b[?25l\u001b[52;1H\"~/Development/Go/src/github.com/kubernetes-incubator/cri-o/.git/COMMIT_EDITMSG\"" + ], + [ + 0.000205, + " 24L, 716C" + ], + [ + 0.000426, + "\u001b[1;1HRefactor kpod tests\r\n\r\nMove kpod tests from kpod.bats to kpod_[commandname].bats\r\n\r\nSigned-off-by: Ryan Cole \r\n\r\n# Please enter the commit message for your changes. Lines starting\r\n# with '#' will be ignored, and an empty message aborts the commit.\r\n#\r\n# Date: Mon Aug 14 09:15:22 2017 -0400\r\n#\r\n# On branch kpod-test-refactor\r\n# Changes to be committed:\r\n#\u001b[7Cdeleted: test/kpod.bats\r\n#\u001b[7Cmodified: test/kpod_diff.bats\r\n#\u001b[7Cnew file: test/kpod_history.bats\r\n#\u001b[7Cnew file: test/kpod_images.bats\r\n#\u001b[7Cnew file: test/kpod_inspect.bats\r\n#\u001b[7Cmodified: test/kpod_load.bats\r\n#\u001b[7Cnew file: test/kpod_pull.bats\r\n#\u001b[7Cnew file: test/kpod_push.bats\r\n#\u001b[7Cmodified: test/kpod_save.bats\r\n#\u001b[7Cnew file: test/kpod_version.bats\r\n#\r\n\u001b[94m~ \u001b[26;1H~ " + ], + [ + 3e-05, + " \u001b[27;1H~ \u001b[28;1H~ \u001b[29;1H~ \u001b[30;1H~ " + ], + [ + 0.000148, + " \u001b[31;1H~ \u001b[32;1H~ \u001b[33;1H~ \u001b[34;1H~ \u001b[35;1H~ " + ], + [ + 2.2e-05, + " \u001b[36;1H~ \u001b[37;1H~ \u001b[38;1H~ \u001b[39;1H~ \u001b[40;1H~ " + ], + [ + 0.000582, + " \u001b[41;1H~ \u001b[42;1H~ \u001b[43;1H~ \u001b[44;1H~ " + ], + [ + 3e-05, + " \u001b[45;1H~ \u001b[46;1H~ \u001b[47;1H~ \u001b[48;1H~ \u001b[49;1H~ " + ], + [ + 0.000162, + " \u001b[50;1H~ \u001b[51;1H~ \u001b[1;1H\u001b[?12l\u001b[?25h" + ], + [ + 0.276849, + "\u001b[?25l\u001b[m\u001b[52;1H\u001b[K\u001b[52;1H:" + ], + [ + 5e-05, + "\u001b[?2004h\u001b[?12l\u001b[?25h" + ], + [ + 0.161861, + "w" + ], + [ + 0.062363, + "q" + ], + [ + 0.113128, + "\r" + ], + [ + 7e-05, + "\u001b[?25l\u001b[?2004l\".git/COMMIT_EDITMSG\"" + ], + [ + 0.016122, + " 24L, 716C written\r\r\r\n\u001b[?2004l\u001b[?1l\u001b>\u001b[?12l\u001b[?25h\u001b[?1049l" + ], + [ + 0.001866, + "[kpod-test-refactor 9f5954a6] Refactor kpod tests\r\n Date: Mon Aug 14 09:15:22 2017 -0400\r\n 10 files changed, 333 insertions(+), 253 deletions(-)\r\n delete mode 100644 test/kpod.bats\r\n create mode 100644 test/kpod_history.bats\r\n create mode 100644 test/kpod_images.bats\r\n create mode 100644 test/kpod_inspect.bats\r\n create mode 100644 test/kpod_pull.bats\r\n create mode 100644 test/kpod_push.bats\r\n create mode 100644 test/kpod_version.bats\r\n\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r" + ], + [ + 0.046977, + "\r\n\u001b[34m\u001b[01mcri-o\u001b[22m \u001b[90mgit/kpod-test-refactor \u001b[39m \u001b[33m\u001b[39m\r\n" + ], + [ + 0.001287, + "\u001b]7;file://localhost.localdomain/home/ryan/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007" + ], + [ + 0.000166, + "\u001b]2;ryan@localhost: ~/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007\u001b]1;..cubator/cri-o\u0007" + ], + [ + 0.000157, + "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[35m❯\u001b[39m " + ], + [ + 2.7e-05, + "\u001b[K\u001b[208C\u001b[90m\u001b[39m\u001b[208D" + ], + [ + 0.000266, + "\u001b[?1h\u001b=" + ], + [ + 2.4e-05, + "\u001b[?2004h" + ], + [ + 0.08068, + "g" + ], + [ + 0.127014, + "\bgi" + ], + [ + 0.077769, + "t" + ], + [ + 0.07119, + " " + ], + [ + 0.125899, + "p" + ], + [ + 0.0933, + "u" + ], + [ + 0.107051, + "s" + ], + [ + 0.103696, + "h" + ], + [ + 0.079917, + " " + ], + [ + 0.173889, + "-" + ], + [ + 0.115307, + "f" + ], + [ + 0.080793, + " " + ], + [ + 0.077616, + "o" + ], + [ + 0.131483, + "r" + ], + [ + 0.1108, + "i" + ], + [ + 0.164739, + "g" + ], + [ + 0.119456, + "i" + ], + [ + 0.102232, + "n" + ], + [ + 0.064044, + " " + ], + [ + 0.163385, + "k" + ], + [ + 0.063896, + "pod-" + ], + [ + 0.226923, + "t" + ], + [ + 0.070106, + "e" + ], + [ + 0.236851, + "st-refactor\u001b[1m \u001b[0m" + ], + [ + 0.608419, + "\b\u001b[0m \b" + ], + [ + 5.6e-05, + "\u001b[?1l\u001b>" + ], + [ + 4.9e-05, + "\u001b[?2004l\r\r\n" + ], + [ + 0.002783, + "\u001b]2;git push -f origin kpod-test-refactor\u0007\u001b]1;git\u0007" + ], + [ + 0.779856, + "Counting objects: 12, done.\r\n" + ], + [ + 0.000105, + "Delta compression using up to 4 threads.\r\n" + ], + [ + 9.5e-05, + "Compressing objects: 8% (1/12) \rCompressing objects: 16% (2/12) \r" + ], + [ + 0.000129, + "Compressing objects: 25% (3/12) \r" + ], + [ + 0.00012, + "Compressing objects: 33% (4/12) \r" + ], + [ + 1.9e-05, + "Compressing objects: 41% (5/12) \r" + ], + [ + 4.6e-05, + "Compressing objects: 50% (6/12) \r" + ], + [ + 0.000177, + "Compressing objects: 58% (7/12) \rCompressing objects: 66% (8/12) \r" + ], + [ + 0.000199, + "Compressing objects: 75% (9/12) \r" + ], + [ + 3.8e-05, + "Compressing objects: 83% (10/12) \r" + ], + [ + 5.6e-05, + "Compressing objects: 91% (11/12) \r" + ], + [ + 5e-05, + "Compressing objects: 100% (12/12) \r" + ], + [ + 3.7e-05, + "Compressing objects: 100% (12/12), done.\r\n" + ], + [ + 0.000272, + "Writing objects: 8% (1/12) \rWriting objects: 16% (2/12) \rWriting objects: 25% (3/12) \r" + ], + [ + 2.8e-05, + "Writing objects: 33% (4/12) \r" + ], + [ + 0.0001, + "Writing objects: 41% (5/12) \r" + ], + [ + 0.00016, + "Writing objects: 58% (7/12) \r" + ], + [ + 4e-05, + "Writing objects: 66% (8/12) \r" + ], + [ + 6.7e-05, + "Writing objects: 75% (9/12) \r" + ], + [ + 0.000162, + "Writing objects: 83% (10/12) \r" + ], + [ + 3.9e-05, + "Writing objects: 91% (11/12) \r" + ], + [ + 4.4e-05, + "Writing objects: 100% (12/12) \r" + ], + [ + 5.8e-05, + "Writing objects: 100% (12/12), 2.56 KiB | 2.56 MiB/s, done.\r\n" + ], + [ + 3e-05, + "Total 12 (delta 9), reused 0 (delta 0)\r\n" + ], + [ + 0.054483, + "remote: Resolving deltas: 0% (0/9) \u001b[K\r" + ], + [ + 0.038253, + "remote: Resolving deltas: 22% (2/9) \u001b[K\rremote: Resolving deltas: 44% (4/9) \u001b[K\rremote: Resolving deltas: 55% (5/9) \u001b[K\rremote: Resolving deltas: 66% (6/9) \u001b[K\rremote: Resolving deltas: 77% (7/9) \u001b[K\rremote: Resolving deltas: 88% (8/9) \u001b[K\rremote: Resolving deltas: 100% (9/9) \u001b[K\rremote: Resolving deltas: 100% (9/9), completed with 5 local objects.\u001b[K\r\n" + ], + [ + 1.340424, + "To github.com:14rcole/cri-o\r\n + 72c6c49b...9f5954a6 kpod-test-refactor -> kpod-test-refactor" + ], + [ + 6.1e-05, + " (forced update)\r\n" + ], + [ + 0.00145, + "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r" + ], + [ + 0.03447, + "\r\n\u001b[34m\u001b[01mcri-o\u001b[22m \u001b[90mgit/kpod-test-refactor \u001b[39m \u001b[33m\u001b[39m\r\n" + ], + [ + 0.001176, + "\u001b]7;file://localhost.localdomain/home/ryan/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007" + ], + [ + 0.000105, + "\u001b]2;ryan@localhost: ~/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007" + ], + [ + 6.4e-05, + "\u001b]1;..cubator/cri-o\u0007" + ], + [ + 6.2e-05, + "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[35m❯\u001b[39m " + ], + [ + 4e-05, + "\u001b[K\u001b[208C\u001b[90m\u001b[39m\u001b[208D" + ], + [ + 0.000267, + "\u001b[?1h\u001b=" + ], + [ + 1.9e-05, + "\u001b[?2004h" + ], + [ + 0.606748, + "\r\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[35m❯\u001b[39m \u001b[K\u001b[208C\u001b[90m\u001b[39m\u001b[208D" + ], + [ + 1186.178261, + "g" + ], + [ + 0.102859, + "\bgi" + ], + [ + 0.126056, + "t" + ], + [ + 0.086902, + " " + ], + [ + 0.763198, + "c" + ], + [ + 0.110654, + "h" + ], + [ + 0.062485, + "e" + ], + [ + 0.087974, + "c" + ], + [ + 0.045368, + "k" + ], + [ + 0.149436, + "o" + ], + [ + 0.070017, + "u" + ], + [ + 0.062669, + "t" + ], + [ + 0.109796, + " " + ], + [ + 0.164267, + "m" + ], + [ + 0.26327, + "aster\u001b[1m \u001b[0m" + ], + [ + 0.456115, + "\b\u001b[0m \b" + ], + [ + 2.9e-05, + "\u001b[?1l\u001b>" + ], + [ + 0.000106, + "\u001b[?2004l\r\r\n" + ], + [ + 0.005237, + "\u001b]2;git checkout master\u0007\u001b]1;git\u0007" + ], + [ + 0.070788, + "Switched to branch 'master'\r\n" + ], + [ + 0.000203, + "Your branch is up-to-date with 'origin/master'.\r\n" + ], + [ + 0.000797, + "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r" + ], + [ + 0.074676, + "\r\n\u001b[34m\u001b[01mcri-o\u001b[22m \u001b[90mgit/master \u001b[39m \u001b[33m\u001b[39m\r\n" + ], + [ + 0.002717, + "\u001b]7;file://localhost.localdomain/home/ryan/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007\u001b]2;ryan@localhost: ~/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007\u001b]1;..cubator/cri-o\u0007\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[35m❯\u001b[39m \u001b[K\u001b[208C\u001b[90m\u001b[39m\u001b[208D\u001b[?1h\u001b=\u001b[?2004h" + ], + [ + 0.32787, + "g" + ], + [ + 0.126467, + "\bgi" + ], + [ + 0.072925, + "t" + ], + [ + 0.076466, + " " + ], + [ + 0.102271, + "p" + ], + [ + 0.068608, + "u" + ], + [ + 0.213672, + "l" + ], + [ + 0.142438, + "l" + ], + [ + 0.102593, + " " + ], + [ + 0.126466, + "u" + ], + [ + 0.110638, + "p" + ], + [ + 0.175053, + "stream\u001b[1m \u001b[0m" + ], + [ + 0.338118, + "\b\u001b[0m m" + ], + [ + 0.11582, + "a" + ], + [ + 0.071538, + "s" + ], + [ + 0.203225, + "ter\u001b[1m:\u001b[0m" + ], + [ + 0.396247, + "\b\u001b[0m \b\u001b[?1l\u001b>\u001b[?2004l\r\r\n" + ], + [ + 0.003149, + "\u001b]2;git pull upstream master\u0007" + ], + [ + 0.000119, + "\u001b]1;git\u0007" + ], + [ + 1.611391, + "remote: Counting objects: 1, done.\u001b[K\r\n" + ], + [ + 0.000939, + "remote: Total 1 (delta 0), reused 1 (delta 0), pack-reused 0\u001b[K\r\n" + ], + [ + 0.00237, + "Unpacking objects: 100% (1/1) \r" + ], + [ + 9.3e-05, + "Unpacking objects: 100% (1/1), done.\r\n" + ], + [ + 0.096361, + "From github.com:kubernetes-incubator/cri-o" + ], + [ + 0.000156, + "\r\n" + ], + [ + 8.9e-05, + " * branch master -> FETCH_HEAD" + ], + [ + 7.3e-05, + "\r\n" + ], + [ + 0.000902, + " 6ca462a3..8c496a10 master -> upstream/master" + ], + [ + 0.000108, + "\r\n" + ], + [ + 0.013153, + "Updating 6ca462a3..8c496a10" + ], + [ + 0.000529, + "\r\n" + ], + [ + 0.035506, + "Fast-forward" + ], + [ + 5.4e-05, + "\r\n" + ], + [ + 0.006117, + " cmd/kpod/common.go | 8 \u001b[32m++\u001b[m" + ], + [ + 5.2e-05, + "\r\n" + ], + [ + 4.4e-05, + " cmd/kpod/formats/formats.go | 23 \u001b[32m+++\u001b[m\u001b[31m-\u001b[m" + ], + [ + 3.6e-05, + "\r\n" + ], + [ + 3.8e-05, + " cmd/kpod/formats/templates.go | 78 \u001b[32m++++++++++++\u001b[m" + ], + [ + 3.3e-05, + "\r\n" + ], + [ + 3.9e-05, + " cmd/kpod/images.go | 126 \u001b[32m+++++++++\u001b[m\u001b[31m----------\u001b[m" + ], + [ + 3.5e-05, + "\r\n" + ], + [ + 3.9e-05, + " vendor.conf | 1 \u001b[32m+\u001b[m" + ], + [ + 3.3e-05, + "\r\n" + ], + [ + 4.4e-05, + " vendor/github.com/Microsoft/hcsshim/mksyscall_windows.go | 934 \u001b[31m---------------------------------------------------------------------------------------------------------------------------------------\u001b[m" + ], + [ + 3.5e-05, + "\r\n" + ], + [ + 3.7e-05, + " vendor/github.com/containers/storage/pkg/archive/example_changes.go | 97 \u001b[31m--------------\u001b[m" + ], + [ + 3e-05, + "\r\n" + ], + [ + 3.5e-05, + " vendor/github.com/fatih/camelcase/LICENSE.md | 20 \u001b[32m+++\u001b[m" + ], + [ + 3e-05, + "\r\n" + ], + [ + 3.6e-05, + " vendor/github.com/fatih/camelcase/README.md | 58 \u001b[32m+++++++++\u001b[m" + ], + [ + 3e-05, + "\r\n" + ], + [ + 4.2e-05, + " vendor/github.com/fatih/camelcase/camelcase.go | 90 \u001b[32m+++++++++++++\u001b[m" + ], + [ + 3.3e-05, + "\r\n" + ], + [ + 3.8e-05, + " 10 files changed, 331 insertions(+), 1104 deletions(-)" + ], + [ + 3e-05, + "\r\n" + ], + [ + 3.8e-05, + " create mode 100644 cmd/kpod/formats/templates.go" + ], + [ + 2.8e-05, + "\r\n" + ], + [ + 3.5e-05, + " delete mode 100644 vendor/github.com/Microsoft/hcsshim/mksyscall_windows.go" + ], + [ + 3.1e-05, + "\r\n" + ], + [ + 3.2e-05, + " delete mode 100644 vendor/github.com/containers/storage/pkg/archive/example_changes.go" + ], + [ + 2.6e-05, + "\r\n" + ], + [ + 3.1e-05, + " create mode 100644 vendor/github.com/fatih/camelcase/LICENSE.md" + ], + [ + 2.7e-05, + "\r\n" + ], + [ + 3.1e-05, + " create mode 100644 vendor/github.com/fatih/camelcase/README.md" + ], + [ + 2.7e-05, + "\r\n" + ], + [ + 3.3e-05, + " create mode 100644 vendor/github.com/fatih/camelcase/camelcase.go" + ], + [ + 2.7e-05, + "\r\n" + ], + [ + 0.000942, + "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r" + ], + [ + 0.058415, + "\r\n\u001b[34m\u001b[01mcri-o\u001b[22m \u001b[90mgit/master \u001b[39m \u001b[33m\u001b[39m\r\n" + ], + [ + 0.00259, + "\u001b]7;file://localhost.localdomain/home/ryan/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007" + ], + [ + 0.00032, + "\u001b]2;ryan@localhost: ~/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007" + ], + [ + 0.000152, + "\u001b]1;..cubator/cri-o\u0007" + ], + [ + 0.000223, + "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[35m❯\u001b[39m " + ], + [ + 8.5e-05, + "\u001b[K\u001b[208C\u001b[90m\u001b[39m\u001b[208D" + ], + [ + 0.000154, + "\u001b[?1h\u001b=" + ], + [ + 0.000119, + "\u001b[?2004h" + ], + [ + 29.505715, + "v" + ], + [ + 0.127766, + "\bvi" + ], + [ + 0.118693, + " " + ], + [ + 0.402967, + "c" + ], + [ + 0.134732, + "m" + ], + [ + 0.171696, + "d\u001b[1m/\u001b[0m" + ], + [ + 0.082566, + "\b\u001b[0m/k" + ], + [ + 0.141218, + "pod\u001b[1m/\u001b[0m" + ], + [ + 0.41599, + "\b\u001b[0m/i" + ], + [ + 0.051368, + "m" + ], + [ + 0.088439, + "a" + ], + [ + 0.170485, + "ges.go\u001b[1m \u001b[0m" + ], + [ + 0.319745, + "\b\u001b[0m \b" + ], + [ + 7.2e-05, + "\u001b[?1l\u001b>" + ], + [ + 4.7e-05, + "\u001b[?2004l\r" + ], + [ + 0.000136, + "\r\n" + ], + [ + 0.003148, + "\u001b]2;vim cmd/kpod/images.go\u0007\u001b]1;vi\u0007" + ], + [ + 0.330583, + "\u001b[?2004h\u001b[?1049h\u001b[?1h\u001b=\u001b[?2004h" + ], + [ + 0.000904, + "\u001b[1;54r\u001b[?12;25h\u001b[?12l\u001b[?25h\u001b[27m\u001b[23m\u001b[m\u001b[93m\u001b[107m\u001b[H\u001b[2J\u001b[?25l\u001b[54;1H\"cmd/kpod/images.go\"" + ], + [ + 8.4e-05, + " 203L, 4796C" + ], + [ + 0.019404, + "\u001b[2;1H▽\u001b[6n\u001b[2;1H \u001b[1;1H\u001b[>c" + ], + [ + 0.012968, + "\u001b[1;1H\u001b[96m\u001b[47m 98 \u001b[m\u001b[93m\u001b[107m\u001b[8C}\r\n\u001b[96m\u001b[47m 99 \u001b[m\u001b[93m\u001b[107m } \u001b[32melse\u001b[m\u001b[93m\u001b[107m {\r\n\u001b[96m\u001b[47m100 \u001b[m\u001b[93m\u001b[107m\u001b[8Cparams = \u001b[36mnil\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m101 \u001b[m\u001b[93m\u001b[107m }\r\n\u001b[96m\u001b[47m102 \r\n103 \u001b[m\u001b[93m\u001b[107m imageList, err := libkpodimage.GetImagesMatchingFilter(store, params, name)\r\n\u001b[96m\u001b[47m104 \u001b[m\u001b[93m\u001b[107m \u001b[32mif\u001b[m\u001b[93m\u001b[107m err != \u001b[36mnil\u001b[m\u001b[93m\u001b[107m {\r\n\u001b[96m\u001b[47m105 \u001b[m\u001b[93m\u001b[107m\u001b[8C\u001b[32mreturn\u001b[m\u001b[93m\u001b[107m errors.Wrapf(err, \u001b[36m\"could not get list of images matching filter\"\u001b[m\u001b[93m\u001b[107m)\r\n\u001b[96m\u001b[47m106 \u001b[m\u001b[93m\u001b[107m }\r\n\u001b[96m\u001b[47m107 \r\n108 \u001b[m\u001b[93m\u001b[107m \u001b[32mreturn\u001b[m\u001b[93m\u001b[107m outputImages(store, imageList, truncate, digests, quiet, outputFormat, noheading)\r\n\u001b[96m\u001b[47m109 \u001b[m\u001b[93m\u001b[107m}\r\n\u001b[96m\u001b[47m110 \r\n111 \u001b[m\u001b[93m\u001b[107m\u001b[32mfunc\u001b[m\u001b[93m\u001b[107m genImagesFormat(quiet, truncate, digests \u001b[33mbool\u001b[m\u001b[93m\u001b[107m) (format \u001b[33mstring\u001b[m\u001b[93m\u001b[107m) {\r\n\u001b[96m\u001b[47m112 \u001b[m\u001b[93m\u001b[107m \u001b[32mif\u001b[m\u001b[93m\u001b[107m quiet {\r\n\u001b[96m\u001b[47m113 \u001b[m\u001b[93m\u001b[107m\u001b[8C\u001b[32mr" + ], + [ + 4e-05, + "eturn\u001b[m\u001b[93m\u001b[107m \u001b[36m\"{{.ID}}\"\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m114 \u001b[m\u001b[93m\u001b[107m }\r\n\u001b[96m\u001b[47m115 \u001b[m\u001b[93m\u001b[107m \u001b[32mif\u001b[m\u001b[93m\u001b[107m truncate {\r\n\u001b[96m\u001b[47m116 \u001b[m\u001b[93m\u001b[107m\u001b[8Cformat = \u001b[36m\"table {{ .ID | printf \u001b[m\u001b[93m\u001b[107m\u001b[31m\\\"%-20.12s\\\"\u001b[m\u001b[93m\u001b[107m\u001b[36m }} \"\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m117 \u001b[m\u001b[93m\u001b[107m } \u001b[32melse\u001b[m\u001b[93m\u001b[107m {\r\n\u001b[96m\u001b[47m118 \u001b[m\u001b[93m\u001b[107m\u001b[8Cformat = \u001b[36m\"table {{ .ID | printf \u001b[m\u001b[93m\u001b[107m\u001b[31m\\\"%-64s\\\"\u001b[m\u001b[93m\u001b[107m\u001b[36m }} \"\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m119 \u001b[m\u001b[93m\u001b[107m }\r\n\u001b[96m\u001b[47m120 \u001b[m\u001b[93m\u001b[107m format += \u001b[36m\"{{ .Name | printf \u001b[m\u001b[93m\u001b[107m\u001b[31m\\\"%-56s\\\"\u001b[m\u001b[93m\u001b[107m\u001b[36m }} \"\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m121 \r\n122 \u001b[m\u001b[93m\u001b[107m \u001b[32mif\u001b[m\u001b[93m\u001b[107m digests {\r\n\u001b[96m\u001b[47m123 \u001b[m\u001b[93m\u001b[107m\u001b[8Cformat += \u001b[36m\"{{ .Digest | printf \u001b[m\u001b[93m\u001b[107m\u001b[31m\\\"%-71s\u001b[m\u001b[93m\u001b[107m\u001b[36m \u001b[m\u001b[93m\u001b[107m\u001b[31m\\\"\u001b[m\u001b[93m\u001b[107m\u001b[36m}} \"\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m124 \u001b[m\u001b[93m\u001b[107m }\r\n\u001b[96m\u001b[47m125 \r\n126 \u001b[m\u001b[93m\u001b[107m format += \u001b[36m\"{{ .CreatedAt | printf " + ], + [ + 0.073924, + "\u001b[m\u001b[93m\u001b[107m\u001b[31m\\\"%-22s\\\"\u001b[m\u001b[93m\u001b[107m\u001b[36m }} {{.Size}}\"\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m127 \u001b[m\u001b[93m\u001b[107m \u001b[32mreturn\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m128 \u001b[m\u001b[93m\u001b[107m}\r\n\u001b[96m\u001b[47m129 \r\n130 \u001b[m\u001b[93m\u001b[107m\u001b[32mfunc\u001b[m\u001b[93m\u001b[107m outputImages(store storage.Store, images []storage.Image, truncate, digests, quiet \u001b[33mbool\u001b[m\u001b[93m\u001b[107m, outputFormat \u001b[33mstring\u001b[m\u001b[93m\u001b[107m, noheading \u001b[33mbool\u001b[m\u001b[93m\u001b[107m) \u001b[33merror\u001b[m\u001b[93m\u001b[107m {\r\n\u001b[96m\u001b[47m131 \u001b[m\u001b[93m\u001b[107m imageOutput := []imageOutputParams{}\r\n\u001b[96m\u001b[47m132 \r\n133 \u001b[m\u001b[93m\u001b[107m lastID := \u001b[36m\"\"\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m134 \u001b[m\u001b[93m\u001b[107m \u001b[32mfor\u001b[m\u001b[93m\u001b[107m _, img := \u001b[32mrange\u001b[m\u001b[93m\u001b[107m images {\r\n\u001b[96m\u001b[47m135 \u001b[m\u001b[93m\u001b[107m\u001b[8C\u001b[32mif\u001b[m\u001b[93m\u001b[107m quiet && lastID == img.ID {\r\n\u001b[96m\u001b[47m136 \u001b[m\u001b[93m\u001b[107m\u001b[12C\u001b[32mcontinue\u001b[m\u001b[93m\u001b[107m \u001b[96m// quiet should not show the same ID multiple times\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m137 \u001b[m\u001b[93m\u001b[107m\u001b[8C}\r\n\u001b[96m\u001b[47m138 \u001b[m\u001b[93m\u001b[107m\u001b[8CcreatedTime := img.Created\r\n\u001b[96m\u001b[47m139 \r\n140 \u001b[m\u001b[93m\u001b[107m\u001b[" + ], + [ + 4e-05, + "8Cname := \u001b[36m\"\"\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m141 \u001b[m\u001b[93m\u001b[107m\u001b[8C\u001b[32mif\u001b[m\u001b[93m\u001b[107m \u001b[32mlen\u001b[m\u001b[93m\u001b[107m(img.Names) > \u001b[36m0\u001b[m\u001b[93m\u001b[107m {\r\n\u001b[96m\u001b[47m142 \u001b[m\u001b[93m\u001b[107m\u001b[12Cname = img.Names[\u001b[36m0\u001b[m\u001b[93m\u001b[107m]\r\n\u001b[96m\u001b[47m143 \u001b[m\u001b[93m\u001b[107m\u001b[8C}\r\n\u001b[96m\u001b[47m144 \r\n145 \u001b[m\u001b[93m\u001b[107m\u001b[8Cinfo, imageDigest, size, _ := libkpodimage.InfoAndDigestAndSize(store, img)\r\n\u001b[96m\u001b[47m146 \u001b[m\u001b[93m\u001b[107m\u001b[8C\u001b[32mif\u001b[m\u001b[93m\u001b[107m info != \u001b[36mnil\u001b[m\u001b[93m\u001b[107m {\r\n\u001b[96m\u001b[47m147 \u001b[m\u001b[93m\u001b[107m\u001b[12CcreatedTime = info.Created\r\n\u001b[96m\u001b[47m148 \u001b[m\u001b[93m\u001b[107m\u001b[8C}\r\n\u001b[96m\u001b[47m149 \u001b[m\u001b[93m\u001b[107m\r\n\u001b[1m\u001b[38;5;22m\u001b[48;5;148m NORMAL \u001b[m\u001b[93m\u001b[107m\u001b[38;5;148m\u001b[48;5;240m\u001b[53;10H \u001b[m\u001b[93m\u001b[107m\u001b[38;5;250m\u001b[48;5;240m\u001b[53;12H master \u001b[m\u001b[93m\u001b[107m\u001b[38;5;245m\u001b[48;5;240m\u001b[53;21H \u001b[m\u001b[93m\u001b[107m\u001b[38;5;250m\u001b[48;5;240mcmd/kpod/\u001b[m\u001b[93m\u001b[107m\u001b[1m\u001b[38;5;231m\u001b[48;5;240mimages.go \u001b[m\u001b[93m\u001b[107m\u001b[38;5;240m\u001b[48;5;236m\u001b[53;42H \u001b[m\u001b[93m\u001b[107m\u001b[38;5;231m\u001b[48;5;236m                         " + ], + [ + 0.028403, + "                                                                                                            \u001b[m\u001b[93m\u001b[107m\u001b[38;5;247m\u001b[48;5;236munix\u001b[m\u001b[93m\u001b[107m\u001b[38;5;244m\u001b[48;5;236m \u001b[m\u001b[93m\u001b[107m\u001b[53;182H\u001b[38;5;247m\u001b[48;5;236m utf-8\u001b[m\u001b[93m\u001b[107m\u001b[38;5;244m\u001b[48;5;236m \u001b[m\u001b[93m\u001b[107m\u001b[53;190H\u001b[38;5;247m\u001b[48;5;236m go\u001b[m\u001b[93m\u001b[107m\u001b[38;5;240m\u001b[48;5;236m \u001b[m\u001b[93m\u001b[107m\u001b[53;195H\u001b[38;5;107m\u001b[48;5;240m  61%\u001b[m\u001b[93m\u001b[107m\u001b[38;5;252m\u001b[48;5;240m \u001b[m\u001b[93m\u001b[107m\u001b[53;202H\u001b[38;5;235m\u001b[48;5;252m \u001b[53;204H \u001b[m\u001b[93m\u001b[107m\u001b[1m\u001b[38;5;235m\u001b[48;5;252m123\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:9  \u001b[26;13H\u001b[?12l\u001b[?25h" + ], + [ + 3.8e-05, + "\u001bP+q436f\u001b\\\u001bP+q6b75\u001b\\\u001bP+q6b64\u001b\\\u001bP+q6b72\u001b\\\u001bP+q6b6c\u001b\\\u001bP+q2332\u001b\\\u001bP+q2334\u001b\\\u001bP+q2569\u001b\\\u001bP+q2a37\u001b\\\u001bP+q6b31\u001b\\" + ], + [ + 2.1862, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[53;195H\u001b[38;5;107m\u001b[48;5;240m  60%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m2\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[25;13H\u001b[?12l\u001b[?25h" + ], + [ + 4.025378, + "\u001b[?25l\u001b[?12l\u001b[?25h" + ], + [ + 34.053856, + "\u001b[m\u001b[93m\u001b[107m\u001b[53;195H\u001b[38;5;107m\u001b[48;5;240m  61%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m3\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[26;13H\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[25;20H\u001b[1m\u001b[31m\u001b[106m{\u001b[27;9H}\u001b[m\u001b[93m\u001b[107m\u001b[53;207H\u001b[1m\u001b[38;5;235m\u001b[48;5;252m4\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:5\u001b[27;9H\u001b[?12l\u001b[?25h\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[25;20H{\u001b[27;9H}\u001b[53;195H\u001b[38;5;107m\u001b[48;5;240m  62%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m5\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:1\u001b[28;5H\u001b[?12l\u001b[?25h\u001b[m\u001b[93m\u001b[107m\u001b[53;207H\u001b[1m\u001b[38;5;235m\u001b[48;5;252m6\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:9\u001b[29;13H\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[53;195H\u001b[38;5;107m\u001b[48;5;240m  63%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m7\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[30;13H\u001b[?12l\u001b[?25h" + ], + [ + 0.081812, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[14;73H\u001b[1m\u001b[31m\u001b[106m{\u001b[31;5H}\u001b[m\u001b[93m\u001b[107m\u001b[53;207H\u001b[1m\u001b[38;5;235m\u001b[48;5;252m8\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:1\u001b[31;5H\u001b[?12l\u001b[?25h\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[14;73H{\u001b[31;5H}\u001b[53;195H\u001b[38;5;108m\u001b[48;5;240m  64%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m9\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[32;5H\u001b[?12l\u001b[?25h\u001b[m\u001b[93m\u001b[107m\u001b[53;206H\u001b[1m\u001b[38;5;235m\u001b[48;5;252m30\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:9\u001b[33;13H\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[53;195H\u001b[38;5;108m\u001b[48;5;240m  65%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m1\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[34;13H\u001b[?12l\u001b[?25h\u001b[m\u001b[93m\u001b[107m\u001b[53;207H\u001b[1m\u001b[38;5;235m\u001b[48;5;252m2\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:1\u001b[35;5H\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[53;195H\u001b[38;5;108m\u001b[48;5;240m  66%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m3\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:9\u001b[36;13H\u001b[?12l\u001b[?25h" + ], + [ + 0.035045, + "\u001b[m\u001b[93m\u001b[107m\u001b[53;207H\u001b[1m\u001b[38;5;235m\u001b[48;5;252m4\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[37;13H\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[53;195H\u001b[38;5;108m\u001b[48;5;240m  67%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m5\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[38;13H\u001b[?12l\u001b[?25h\u001b[m\u001b[93m\u001b[107m\u001b[53;207H\u001b[1m\u001b[38;5;235m\u001b[48;5;252m6\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:12\u001b[39;16H\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[38;42H\u001b[1m\u001b[31m\u001b[106m{\u001b[40;13H}\u001b[m\u001b[93m\u001b[107m\u001b[53;207H\u001b[1m\u001b[38;5;235m\u001b[48;5;252m7\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:9 \u001b[40;13H\u001b[?12l\u001b[?25h" + ], + [ + 0.014251, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[38;42H{\u001b[40;13H}\u001b[53;195H\u001b[38;5;108m\u001b[48;5;240m  68%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m8\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[41;13H\u001b[?12l\u001b[?25h" + ], + [ + 0.035294, + "\u001b[m\u001b[93m\u001b[107m\u001b[53;207H\u001b[1m\u001b[38;5;235m\u001b[48;5;252m9\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:1\u001b[42;5H" + ], + [ + 3.803564, + "\u001b[m\u001b[93m\u001b[107m\u001b[53;207H\u001b[1m\u001b[38;5;235m\u001b[48;5;252m8\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:9\u001b[41;13H" + ], + [ + 0.502126, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[38;42H\u001b[1m\u001b[31m\u001b[106m{\u001b[40;13H}\u001b[m\u001b[93m\u001b[107m\u001b[53;195H\u001b[38;5;108m\u001b[48;5;240m  67%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m7\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[40;13H\u001b[?12l\u001b[?25h" + ], + [ + 0.039219, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[38;42H{\u001b[40;13H}\u001b[53;207H\u001b[1m\u001b[38;5;235m\u001b[48;5;252m6\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:12\u001b[39;16H\u001b[?12l\u001b[?25h" + ], + [ + 0.022715, + "\u001b[m\u001b[93m\u001b[107m\u001b[53;207H\u001b[1m\u001b[38;5;235m\u001b[48;5;252m5\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:9 \u001b[38;13H" + ], + [ + 0.030883, + "\u001b[m\u001b[93m\u001b[107m\u001b[53;195H\u001b[38;5;108m\u001b[48;5;240m  66%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m4\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[37;13H" + ], + [ + 0.032199, + "\u001b[m\u001b[93m\u001b[107m\u001b[53;207H\u001b[1m\u001b[38;5;235m\u001b[48;5;252m3\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[36;13H" + ], + [ + 0.028523, + "\u001b[m\u001b[93m\u001b[107m\u001b[53;195H\u001b[38;5;108m\u001b[48;5;240m  65%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m2\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:1\u001b[35;5H" + ], + [ + 0.031179, + "\u001b[m\u001b[93m\u001b[107m\u001b[53;207H\u001b[1m\u001b[38;5;235m\u001b[48;5;252m1\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:9\u001b[34;13H" + ], + [ + 0.032779, + "\u001b[m\u001b[93m\u001b[107m\u001b[53;195H\u001b[38;5;108m\u001b[48;5;240m  64%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m0\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[33;13H" + ], + [ + 0.028555, + "\u001b[m\u001b[93m\u001b[107m\u001b[53;206H\u001b[1m\u001b[38;5;235m\u001b[48;5;252m29\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:1\u001b[32;5H" + ], + [ + 0.048269, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[14;73H\u001b[1m\u001b[31m\u001b[106m{\u001b[31;5H}\u001b[m\u001b[93m\u001b[107m\u001b[53;195H\u001b[38;5;107m\u001b[48;5;240m  63%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m8\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[31;5H\u001b[?12l\u001b[?25h" + ], + [ + 0.019915, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[14;73H{\u001b[31;5H}\u001b[53;207H\u001b[1m\u001b[38;5;235m\u001b[48;5;252m7\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:9\u001b[30;13H\u001b[?12l\u001b[?25h" + ], + [ + 0.028641, + "\u001b[m\u001b[93m\u001b[107m\u001b[53;195H\u001b[38;5;107m\u001b[48;5;240m  62%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m6\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[29;13H" + ], + [ + 0.027012, + "\u001b[m\u001b[93m\u001b[107m\u001b[53;207H\u001b[1m\u001b[38;5;235m\u001b[48;5;252m5\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:1\u001b[28;5H" + ], + [ + 0.033581, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[25;20H\u001b[1m\u001b[31m\u001b[106m{\u001b[27;9H}\u001b[m\u001b[93m\u001b[107m\u001b[53;195H\u001b[38;5;107m\u001b[48;5;240m  61%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m4\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:5\u001b[27;9H\u001b[?12l\u001b[?25h" + ], + [ + 0.02925, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[25;20H{\u001b[27;9H}\u001b[53;207H\u001b[1m\u001b[38;5;235m\u001b[48;5;252m3\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:9\u001b[26;13H\u001b[?12l\u001b[?25h" + ], + [ + 0.030751, + "\u001b[m\u001b[93m\u001b[107m\u001b[53;195H\u001b[38;5;107m\u001b[48;5;240m  60%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m2\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[25;13H" + ], + [ + 0.031339, + "\u001b[m\u001b[93m\u001b[107m\u001b[53;207H\u001b[1m\u001b[38;5;235m\u001b[48;5;252m1\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:1\u001b[24;5H" + ], + [ + 0.041524, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[53;195H\u001b[38;5;107m\u001b[48;5;240m  59%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m0\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:9\u001b[23;13H\u001b[?12l\u001b[?25h" + ], + [ + 0.022427, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[20;16H\u001b[1m\u001b[31m\u001b[106m{\u001b[22;9H}\u001b[m\u001b[93m\u001b[107m\u001b[53;206H\u001b[1m\u001b[38;5;235m\u001b[48;5;252m19\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:5\u001b[22;9H\u001b[?12l\u001b[?25h" + ], + [ + 0.033264, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[20;16H{\u001b[22;9H}\u001b[53;195H\u001b[38;5;107m\u001b[48;5;240m  58%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m8\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:9\u001b[21;13H\u001b[?12l\u001b[?25h" + ], + [ + 0.023387, + "\u001b[m\u001b[93m\u001b[107m\u001b[53;207H\u001b[1m\u001b[38;5;235m\u001b[48;5;252m7\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[20;13H" + ], + [ + 0.037125, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[53;195H\u001b[38;5;107m\u001b[48;5;240m  57%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m6\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[19;13H\u001b[?12l\u001b[?25h" + ], + [ + 0.026419, + "\u001b[m\u001b[93m\u001b[107m\u001b[53;207H\u001b[1m\u001b[38;5;235m\u001b[48;5;252m5\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[18;13H" + ], + [ + 0.040842, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[15;18H\u001b[1m\u001b[31m\u001b[106m{\u001b[17;9H}\u001b[m\u001b[93m\u001b[107m\u001b[53;195H\u001b[38;5;107m\u001b[48;5;240m  56%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m4\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:5\u001b[17;9H\u001b[?12l\u001b[?25h" + ], + [ + 0.023205, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[15;18H{\u001b[17;9H}\u001b[53;207H\u001b[1m\u001b[38;5;235m\u001b[48;5;252m3\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:9\u001b[16;13H\u001b[?12l\u001b[?25h" + ], + [ + 0.033995, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[53;195H\u001b[38;5;107m\u001b[48;5;240m  55%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m2\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[15;13H\u001b[?12l\u001b[?25h" + ], + [ + 0.023807, + "\u001b[m\u001b[93m\u001b[107m\u001b[53;207H\u001b[1m\u001b[38;5;235m\u001b[48;5;252m1\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[14;13H" + ], + [ + 0.037724, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[53;195H\u001b[38;5;107m\u001b[48;5;240m  54%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m0\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:1\u001b[13;5H\u001b[?12l\u001b[?25h" + ], + [ + 0.028157, + "\u001b[m\u001b[93m\u001b[107m\u001b[53;206H\u001b[1m\u001b[38;5;235m\u001b[48;5;252m09\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[12;5H" + ], + [ + 0.035934, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[53;195H\u001b[38;5;107m\u001b[48;5;240m  53%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m8\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:9\u001b[11;13H\u001b[?12l\u001b[?25h" + ], + [ + 0.027185, + "\u001b[m\u001b[93m\u001b[107m\u001b[53;207H\u001b[1m\u001b[38;5;235m\u001b[48;5;252m7\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:1\u001b[10;5H" + ], + [ + 0.036538, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[7;23H\u001b[1m\u001b[31m\u001b[106m{\u001b[9;9H}\u001b[m\u001b[93m\u001b[107m\u001b[53;195H\u001b[38;5;107m\u001b[48;5;240m  52%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m6\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:5\u001b[9;9H\u001b[?12l\u001b[?25h" + ], + [ + 0.029736, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[7;23H{\u001b[9;9H}\u001b[53;207H\u001b[1m\u001b[38;5;235m\u001b[48;5;252m5\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:9\u001b[8;13H\u001b[?12l\u001b[?25h" + ], + [ + 0.036535, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[53;195H\u001b[38;5;107m\u001b[48;5;240m  51%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m4\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[7;13H\u001b[?12l\u001b[?25h" + ], + [ + 0.023374, + "\u001b[m\u001b[93m\u001b[107m\u001b[53;207H\u001b[1m\u001b[38;5;235m\u001b[48;5;252m3\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[6;13H" + ], + [ + 0.033091, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[53;195H\u001b[38;5;107m\u001b[48;5;240m  50%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m2\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:1\u001b[5;5H\u001b[?12l\u001b[?25h" + ], + [ + 0.025945, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[2;16H\u001b[1m\u001b[31m\u001b[106m{\u001b[4;9H}\u001b[m\u001b[93m\u001b[107m\u001b[53;207H\u001b[1m\u001b[38;5;235m\u001b[48;5;252m1\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:5\u001b[4;9H\u001b[?12l\u001b[?25h" + ], + [ + 0.041382, + "\u001b[?25l\u001b[1;52r\u001b[m\u001b[93m\u001b[107m\u001b[1;1H\u001b[L\u001b[1;54r\u001b[1;1H\u001b[96m\u001b[47m 97 \u001b[m\u001b[93m\u001b[107m\u001b[12C\u001b[32mreturn\u001b[m\u001b[93m\u001b[107m errors.Wrapf(err, \u001b[36m\"error parsing filter\"\u001b[m\u001b[93m\u001b[107m)\u001b[3;16H{\u001b[5;9H}\u001b[54;1H\u001b[K\u001b[53;195H\u001b[38;5;107m\u001b[48;5;240m  49%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m0\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:9\u001b[4;13H\u001b[?12l\u001b[?25h" + ], + [ + 0.030519, + "\u001b[?25l\u001b[1;52r\u001b[m\u001b[93m\u001b[107m\u001b[1;1H\u001b[L\u001b[1;54r\u001b[1;1H\u001b[96m\u001b[47m 96 \u001b[m\u001b[93m\u001b[107m\u001b[8C\u001b[32mif\u001b[m\u001b[93m\u001b[107m err != \u001b[36mnil\u001b[m\u001b[93m\u001b[107m {\u001b[53;205H\u001b[1m\u001b[38;5;235m\u001b[48;5;252m 99\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[4;13H\u001b[?12l\u001b[?25h" + ], + [ + 0.048667, + "\u001b[?25l\u001b[1;52r\u001b[m\u001b[93m\u001b[107m\u001b[1;1H\u001b[L\u001b[1;54r\u001b[1;1H\u001b[96m\u001b[47m 95 \u001b[m\u001b[93m\u001b[107m\u001b[8Cparams, err = libkpodimage.ParseFilter(store, c.String(\u001b[36m\"filter\"\u001b[m\u001b[93m\u001b[107m))\u001b[2;27H\u001b[1m\u001b[31m\u001b[106m{\u001b[4;13H}\u001b[m\u001b[93m\u001b[107m\u001b[53;195H\u001b[38;5;107m\u001b[48;5;240m  48%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m8\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[4;13H\u001b[?12l\u001b[?25h" + ], + [ + 0.028735, + "\u001b[?25l\u001b[1;52r\u001b[m\u001b[93m\u001b[107m\u001b[1;1H\u001b[L\u001b[1;54r\u001b[1;1H\u001b[96m\u001b[47m 94 \u001b[m\u001b[93m\u001b[107m \u001b[32mif\u001b[m\u001b[93m\u001b[107m c.IsSet(\u001b[36m\"filter\"\u001b[m\u001b[93m\u001b[107m) {\u001b[3;27H{\u001b[5;13H}\u001b[53;207H\u001b[1m\u001b[38;5;235m\u001b[48;5;252m7\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:12\u001b[4;16H\u001b[?12l\u001b[?25h" + ], + [ + 0.048253, + "\u001b[?25l\u001b[1;52r\u001b[m\u001b[93m\u001b[107m\u001b[1;1H\u001b[L\u001b[1;54r\u001b[1;1H\u001b[96m\u001b[47m 93 \u001b[m\u001b[93m\u001b[107m \u001b[32mvar\u001b[m\u001b[93m\u001b[107m params *libkpodimage.FilterParams\u001b[53;195H\u001b[38;5;107m\u001b[48;5;240m  47%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m6\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:9 \u001b[4;13H\u001b[?12l\u001b[?25h" + ], + [ + 0.011542, + "\u001b[?25l\u001b[1;52r\u001b[m\u001b[93m\u001b[107m\u001b[1;1H\u001b[L\u001b[1;54r\u001b[1;1H\u001b[96m\u001b[47m 92 \u001b[m\u001b[93m\u001b[107m\u001b[53;207H\u001b[1m\u001b[38;5;235m\u001b[48;5;252m5\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[4;13H\u001b[?12l\u001b[?25h" + ], + [ + 0.035746, + "\u001b[?25l\u001b[1;52r\u001b[m\u001b[93m\u001b[107m\u001b[1;1H\u001b[L\u001b[1;54r\u001b[1;1H\u001b[96m\u001b[47m 91 \u001b[m\u001b[93m\u001b[107m }\u001b[53;195H\u001b[38;5;107m\u001b[48;5;240m  46%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m4\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[4;13H\u001b[?12l\u001b[?25h" + ], + [ + 0.039133, + "\u001b[?25l\u001b[1;52r\u001b[m\u001b[93m\u001b[107m\u001b[1;1H\u001b[L\u001b[1;54r\u001b[1;1H\u001b[96m\u001b[47m 90 \u001b[m\u001b[93m\u001b[107m\u001b[8C\u001b[32mreturn\u001b[m\u001b[93m\u001b[107m errors.New(\u001b[36m\"'kpod images' requires at most 1 argument\"\u001b[m\u001b[93m\u001b[107m)\u001b[53;207H\u001b[1m\u001b[38;5;235m\u001b[48;5;252m3\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[4;13H\u001b[?12l\u001b[?25h" + ], + [ + 0.033562, + "\u001b[?25l\u001b[1;52r\u001b[m\u001b[93m\u001b[107m\u001b[1;1H\u001b[L\u001b[1;54r\u001b[1;1H\u001b[96m\u001b[47m 89 \u001b[m\u001b[93m\u001b[107m } \u001b[32melse\u001b[m\u001b[93m\u001b[107m \u001b[32mif\u001b[m\u001b[93m\u001b[107m \u001b[32mlen\u001b[m\u001b[93m\u001b[107m(c.Args()) > \u001b[36m1\u001b[m\u001b[93m\u001b[107m {\u001b[53;195H\u001b[38;5;107m\u001b[48;5;240m  45%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m2\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:1\u001b[4;5H\u001b[?12l\u001b[?25h" + ], + [ + 0.423507, + "\u001b[?25l\u001b[54;1H\u001b[m\u001b[93m\u001b[107m/" + ], + [ + 8.6e-05, + "\u001b[?2004h\u001b[?12l\u001b[?25h" + ], + [ + 0.351895, + "h\u001b[?25l" + ], + [ + 0.0106, + "\u001b[15;53H\u001b[7m\u001b[91mh\u001b[27m\u001b[m\u001b[93m\u001b[107m\u001b[53;2H\u001b[1m\u001b[38;5;22m\u001b[48;5;148mCOMMND \u001b[m\u001b[93m\u001b[107m\u001b[186C\u001b[38;5;107m\u001b[48;5;240m  51%\u001b[m\u001b[93m\u001b[107m\u001b[5C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m103\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:49\r\n\u001b[m\u001b[93m\u001b[107m/h" + ], + [ + 6e-05, + "\u001b[?12l\u001b[?25h" + ], + [ + 0.063442, + "e" + ], + [ + 0.000104, + "\u001b[?25l" + ], + [ + 0.012164, + "\u001b[15;53Hh\u001b[20;89H\u001b[7m\u001b[91mhe\u001b[27m\u001b[m\u001b[93m\u001b[107m\u001b[53;195H\u001b[38;5;107m\u001b[48;5;240m  53%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m8\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:85\r\n\u001b[m\u001b[93m\u001b[107m/he" + ], + [ + 0.000532, + "\u001b[?12l\u001b[?25h" + ], + [ + 0.072256, + "a" + ], + [ + 7.1e-05, + "\u001b[?25l" + ], + [ + 0.00992, + "\u001b[20;91H\u001b[7m\u001b[91ma\u001b[54;5H" + ], + [ + 0.001459, + "\u001b[?12l\u001b[?25h" + ], + [ + 0.162629, + "\u001b[27m\u001b[m\u001b[93m\u001b[107md" + ], + [ + 8.2e-05, + "\u001b[?25l" + ], + [ + 0.009968, + "\u001b[20;92H\u001b[7m\u001b[91md\u001b[54;6H" + ], + [ + 0.00011, + "\u001b[?12l\u001b[?25h" + ], + [ + 0.147673, + "\u001b[27m\u001b[m\u001b[93m\u001b[107me\u001b[?25l" + ], + [ + 0.013264, + "\u001b[1;52r\u001b[1;1H\u001b[29M\u001b[1;54r\u001b[24;1H\u001b[96m\u001b[47m141 \u001b[m\u001b[93m\u001b[107m\u001b[8C\u001b[32mif\u001b[m\u001b[93m\u001b[107m \u001b[32mlen\u001b[m\u001b[93m\u001b[107m(img.Names) > \u001b[36m0\u001b[m\u001b[93m\u001b[107m {\r\n\u001b[96m\u001b[47m142 \u001b[m\u001b[93m\u001b[107m\u001b[12Cname = img.Names[\u001b[36m0\u001b[m\u001b[93m\u001b[107m]\r\n\u001b[96m\u001b[47m143 \u001b[m\u001b[93m\u001b[107m\u001b[8C}\r\n\u001b[96m\u001b[47m144 \r\n145 \u001b[m\u001b[93m\u001b[107m\u001b[8Cinfo, imageDigest, size, _ := libkpodimage.InfoAndDigestAndSize(store, img)\r\n\u001b[96m\u001b[47m146 \u001b[m\u001b[93m\u001b[107m\u001b[8C\u001b[32mif\u001b[m\u001b[93m\u001b[107m info != \u001b[36mnil\u001b[m\u001b[93m\u001b[107m {\r\n\u001b[96m\u001b[47m147 \u001b[m\u001b[93m\u001b[107m\u001b[12CcreatedTime = info.Created\r\n\u001b[96m\u001b[47m148 \u001b[m\u001b[93m\u001b[107m\u001b[8C}\r\n\u001b[96m\u001b[47m149 \r\n150 \u001b[m\u001b[93m\u001b[107m\u001b[8Cparams := imageOutputParams{\r\n\u001b[96m\u001b[47m151 \u001b[m\u001b[93m\u001b[107m\u001b[12CID:\u001b[8Cimg.ID,\r\n\u001b[96m\u001b[47m152 \u001b[m\u001b[93m\u001b[107m\u001b[12CName: name,\r\n\u001b[96m\u001b[47m153 \u001b[m\u001b[93m\u001b[107m\u001b[12CDigest: imageDigest,\r\n\u001b[96m\u001b[47m154 \u001b[m\u001b[93m\u001b[107m\u001b[12CCreatedAt: createdTime.Format(\u001b[36m\"Jan 2, 2006 15:04\"\u001b[m\u001b[93m\u001b[107m),\r\n\u001b[96m\u001b[47m155 \u001b[m\u001b[93m\u001b[107m\u001b[12CSize: libkpodimage.FormattedSize(size),\r\n\u001b[96m\u001b[47m156 \u001b[m\u001b[93m\u001b[107m\u001b[8C}\r\n\u001b[96m\u001b[47m157 \u001b[m\u001b[93m\u001b[10" + ], + [ + 6.2e-05, + "7m\u001b[8CimageOutput = \u001b[32mappend\u001b[m\u001b[93m\u001b[107m(imageOutput, params)\r\n\u001b[96m\u001b[47m158 \u001b[m\u001b[93m\u001b[107m }\r\n\u001b[96m\u001b[47m159 \r\n160 \u001b[m\u001b[93m\u001b[107m \u001b[32mvar\u001b[m\u001b[93m\u001b[107m out formats.Writer\r\n\u001b[96m\u001b[47m161 \r\n162 \u001b[m\u001b[93m\u001b[107m \u001b[32mswitch\u001b[m\u001b[93m\u001b[107m outputFormat {\r\n\u001b[96m\u001b[47m163 \u001b[m\u001b[93m\u001b[107m \u001b[32mcase\u001b[m\u001b[93m\u001b[107m \u001b[36m\"json\"\u001b[m\u001b[93m\u001b[107m:\r\n\u001b[96m\u001b[47m164 \u001b[m\u001b[93m\u001b[107m\u001b[8Cout = formats.JSONstruct{Output: toGeneric(imageOutput)}\r\n\u001b[96m\u001b[47m165 \u001b[m\u001b[93m\u001b[107m \u001b[32mdefault\u001b[m\u001b[93m\u001b[107m:\r\n\u001b[96m\u001b[47m166 \u001b[m\u001b[93m\u001b[107m\u001b[8Cout = formats.StdoutTemplate{Output: toGeneric(imageOutput), Template: outputFormat, Fields: imageOutput[\u001b[36m0\u001b[m\u001b[93m\u001b[107m].\u001b[7m\u001b[91mheade\u001b[27m\u001b[m\u001b[93m\u001b[107mrMap()}\r\n\u001b[96m\u001b[47m167 \u001b[m\u001b[93m\u001b[107m }\r\n\u001b[96m\u001b[47m168 \r\n169 \u001b[m\u001b[93m\u001b[107m formats.Writer(out).Out()\u001b[53;175H\u001b[38;5;247m\u001b[48;5;236munix\u001b[m\u001b[93m\u001b[107m\u001b[38;5;244m\u001b[48;5;236m \u001b[m\u001b[93m\u001b[107m\u001b[53;181H\u001b[38;5;247m\u001b[48;5;236m utf-8\u001b[m\u001b[93m\u001b[107m\u001b[38;5;244m\u001b[48;5;236m \u001b[m\u001b[93m\u001b[107m\u001b[53;189H\u001b[38;5;247m\u001b[48;5;236m" + ], + [ + 0.000184, + " go\u001b[m\u001b[93m\u001b[107m\u001b[38;5;240m\u001b[48;5;236m \u001b[m\u001b[93m\u001b[107m\u001b[53;194H\u001b[38;5;144m\u001b[48;5;240m  82%\u001b[m\u001b[93m\u001b[107m\u001b[38;5;252m\u001b[48;5;240m \u001b[m\u001b[93m\u001b[107m\u001b[53;201H\u001b[38;5;235m\u001b[48;5;252m \u001b[53;203H \u001b[m\u001b[93m\u001b[107m\u001b[1m\u001b[38;5;235m\u001b[48;5;252m1668\u001b[m\u001b[93m\u001b[107m\b\u001b[38;5;22m\u001b[48;5;252m:117\u001b[m\u001b[93m\u001b[107m\u001b[54;1H\u001b[K\u001b[54;1H/heade" + ], + [ + 6.2e-05, + "\u001b[?12l\u001b[?25h" + ], + [ + 0.090014, + "r\u001b[?25l" + ], + [ + 0.010578, + "\u001b[49;126H\u001b[7m\u001b[91mr\u001b[54;8H\u001b[?12l\u001b[?25h" + ], + [ + 0.242781, + "\u001b[27m\u001b[m\u001b[93m\u001b[107mM" + ], + [ + 6.5e-05, + "\u001b[?25l" + ], + [ + 0.018322, + "\u001b[49;127H\u001b[7m\u001b[91mM\u001b[54;9H" + ], + [ + 0.000103, + "\u001b[?12l\u001b[?25h" + ], + [ + 0.216526, + "\u001b[27m\u001b[m\u001b[93m\u001b[107ma\u001b[?25l" + ], + [ + 0.008316, + "\u001b[49;128H\u001b[7m\u001b[91ma\u001b[54;10H" + ], + [ + 0.000108, + "\u001b[?12l\u001b[?25h" + ], + [ + 0.164608, + "\u001b[27m\u001b[m\u001b[93m\u001b[107mp\u001b[?25l" + ], + [ + 0.010964, + "\u001b[49;129H\u001b[7m\u001b[91mp\u001b[54;11H" + ], + [ + 5.8e-05, + "\u001b[?12l\u001b[?25h" + ], + [ + 0.303811, + "\r" + ], + [ + 5.4e-05, + "\u001b[?25l" + ], + [ + 0.01537, + "\u001b[27m\u001b[m\u001b[93m\u001b[107m\u001b[49;121H\u001b[7m\u001b[33mheaderMap\u001b[m\u001b[93m\u001b[107m\u001b[53;2H\u001b[1m\u001b[38;5;22m\u001b[48;5;148mNORMAL \u001b[49;121H\u001b[?12l\u001b[?25h" + ], + [ + 0.613627, + "\u001b[?25l\u001b[54;1H" + ], + [ + 0.009249, + "\u001b[1;52r\u001b[m\u001b[93m\u001b[107m\u001b[1;1H\u001b[24M\u001b[1;54r\u001b[29;1H\u001b[96m\u001b[47m170 \r\n171 \u001b[m\u001b[93m\u001b[107m \u001b[32mreturn\u001b[m\u001b[93m\u001b[107m \u001b[36mnil\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m172 \u001b[m\u001b[93m\u001b[107m}\r\n\u001b[96m\u001b[47m173 \r\n174 \u001b[m\u001b[93m\u001b[107m\u001b[32mtype\u001b[m\u001b[93m\u001b[107m imageOutputParams \u001b[32mstruct\u001b[m\u001b[93m\u001b[107m {\r\n\u001b[96m\u001b[47m175 \u001b[m\u001b[93m\u001b[107m ID\u001b[8C\u001b[33mstring\u001b[m\u001b[93m\u001b[107m\u001b[8C\u001b[36m`json:\"id\"`\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m176 \u001b[m\u001b[93m\u001b[107m Name \u001b[33mstring\u001b[m\u001b[93m\u001b[107m\u001b[8C\u001b[36m`json:\"names\"`\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m177 \u001b[m\u001b[93m\u001b[107m Digest digest.Digest \u001b[36m`json:\"digest\"`\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m178 \u001b[m\u001b[93m\u001b[107m CreatedAt \u001b[33mstring\u001b[m\u001b[93m\u001b[107m\u001b[8C\u001b[36m`json:\"created\"`\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m179 \u001b[m\u001b[93m\u001b[107m Size \u001b[33mstring\u001b[m\u001b[93m\u001b[107m\u001b[8C\u001b[36m`json:\"size\"`\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m180 \u001b[m\u001b[93m\u001b[107m}\r\n\u001b[96m\u001b[47m181 \r\n182 \u001b[m\u001b[93m\u001b[107m\u001b[32mfunc\u001b[m\u001b[93m\u001b[107m toGeneric(params []imageOutputParams) []\u001b[32minterface\u001b[m\u001b[93m\u001b[107m{} {\r\n\u001b[96m\u001b[47m183 \u001b[m\u001b[93m\u001b[107m genericParams := \u001b[32mmake\u001b[m\u001b[93m\u001b[107m([]\u001b[32mi" + ], + [ + 4.4e-05, + "nterface\u001b[m\u001b[93m\u001b[107m{}, \u001b[32mlen\u001b[m\u001b[93m\u001b[107m(params))\r\n\u001b[96m\u001b[47m184 \u001b[m\u001b[93m\u001b[107m \u001b[32mfor\u001b[m\u001b[93m\u001b[107m i, v := \u001b[32mrange\u001b[m\u001b[93m\u001b[107m params {\r\n\u001b[96m\u001b[47m185 \u001b[m\u001b[93m\u001b[107m\u001b[8CgenericParams[i] = \u001b[32minterface\u001b[m\u001b[93m\u001b[107m{}(v)\r\n\u001b[96m\u001b[47m186 \u001b[m\u001b[93m\u001b[107m }\r\n\u001b[96m\u001b[47m187 \u001b[m\u001b[93m\u001b[107m \u001b[32mreturn\u001b[m\u001b[93m\u001b[107m genericParams\r\n\u001b[96m\u001b[47m188 \u001b[m\u001b[93m\u001b[107m}\r\n\u001b[96m\u001b[47m189 \r\n190 \u001b[m\u001b[93m\u001b[107m\u001b[32mfunc\u001b[m\u001b[93m\u001b[107m (i *imageOutputParams) \u001b[7m\u001b[33mheaderMap\u001b[m\u001b[93m\u001b[107m() \u001b[33mmap\u001b[m\u001b[93m\u001b[107m[\u001b[33mstring\u001b[m\u001b[93m\u001b[107m]\u001b[33mstring\u001b[m\u001b[93m\u001b[107m {\r\n\u001b[96m\u001b[47m191 \u001b[m\u001b[93m\u001b[107m v := reflect.Indirect(reflect.ValueOf(i))\r\n\u001b[96m\u001b[47m192 \u001b[m\u001b[93m\u001b[107m values := \u001b[32mmake\u001b[m\u001b[93m\u001b[107m(\u001b[33mmap\u001b[m\u001b[93m\u001b[107m[\u001b[33mstring\u001b[m\u001b[93m\u001b[107m]\u001b[33mstring\u001b[m\u001b[93m\u001b[107m)\r\n\u001b[96m\u001b[47m193 \u001b[m\u001b[93m\u001b[107m\u001b[54;1H\u001b[K\u001b[53;175H\u001b[38;5;231m\u001b[48;5;236m \u001b[m\u001b[93m\u001b[107m\u001b[38;5;247m\u001b[48;5;236munix\u001b[m\u001b[93m\u001b[107m\u001b[38;5;244m\u001b[48;5;236m \u001b[m\u001b[93m\u001b[107m\u001b[53;182H\u001b[38;5;247m\u001b[48;5;236m utf-8\u001b[m\u001b[93m\u001b[107m\u001b[38;5;244m\u001b" + ], + [ + 2.6e-05, + "[48;5;236m \u001b[m\u001b[93m\u001b[107m\u001b[53;190H\u001b[38;5;247m\u001b[48;5;236m go\u001b[m\u001b[93m\u001b[107m\u001b[38;5;240m\u001b[48;5;236m \u001b[m\u001b[93m\u001b[107m\u001b[53;195H\u001b[38;5;247m\u001b[48;5;240m  94%\u001b[m\u001b[93m\u001b[107m\u001b[38;5;252m\u001b[48;5;240m \u001b[m\u001b[93m\u001b[107m\u001b[53;202H\u001b[38;5;235m\u001b[48;5;252m \u001b[53;204H \u001b[m\u001b[93m\u001b[107m\u001b[1m\u001b[38;5;235m\u001b[48;5;252m6\b190\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:29\u001b[49;33H\u001b[?12l\u001b[?25h" + ], + [ + 2.596474, + "\u001b[?25l\u001b[1;52r\u001b[m\u001b[93m\u001b[107m\u001b[52;1H\r\n\u001b[1;54r\u001b[52;1H\u001b[96m\u001b[47m194 \u001b[m\u001b[93m\u001b[107m \u001b[32mfor\u001b[m\u001b[93m\u001b[107m i := \u001b[36m0\u001b[m\u001b[93m\u001b[107m; i < v.NumField(); i++ {\u001b[53;207H\u001b[1m\u001b[38;5;235m\u001b[48;5;252m1\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[49;33H\u001b[?12l\u001b[?25h" + ], + [ + 0.204651, + "\u001b[?25l\u001b[1;52r\u001b[m\u001b[93m\u001b[107m\u001b[52;1H\r\n\u001b[1;54r\u001b[52;1H\u001b[96m\u001b[47m195 \u001b[m\u001b[93m\u001b[107m\u001b[8Ckey := v.Type().Field(i).Name\u001b[53;195H\u001b[38;5;247m\u001b[48;5;240m  95%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m2\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[49;33H\u001b[?12l\u001b[?25h" + ], + [ + 0.176184, + "\u001b[?25l\u001b[1;52r\u001b[m\u001b[93m\u001b[107m\u001b[52;1H\r\n\u001b[1;54r\u001b[52;1H\u001b[96m\u001b[47m196 \u001b[m\u001b[93m\u001b[107m\u001b[8Cvalue := key\u001b[53;207H\u001b[1m\u001b[38;5;235m\u001b[48;5;252m3\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:1 \u001b[49;5H\u001b[?12l\u001b[?25h" + ], + [ + 0.187364, + "\u001b[?25l\u001b[1;52r\u001b[m\u001b[93m\u001b[107m\u001b[52;1H\r\n\u001b[1;54r\u001b[52;1H\u001b[96m\u001b[47m197 \u001b[m\u001b[93m\u001b[107m\u001b[8C\u001b[32mif\u001b[m\u001b[93m\u001b[107m value == \u001b[36m\"ID\"\u001b[m\u001b[93m\u001b[107m || value == \u001b[36m\"Name\"\u001b[m\u001b[93m\u001b[107m {\u001b[53;195H\u001b[38;5;247m\u001b[48;5;240m  96%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m4\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:29\u001b[49;33H\u001b[?12l\u001b[?25h" + ], + [ + 0.159818, + "\u001b[?25l\u001b[1;52r\u001b[m\u001b[93m\u001b[107m\u001b[52;1H\r\n\u001b[1;54r\u001b[52;1H\u001b[96m\u001b[47m198 \u001b[m\u001b[93m\u001b[107m\u001b[12Cvalue = \u001b[36m\"Image\"\u001b[m\u001b[93m\u001b[107m + value\u001b[53;207H\u001b[1m\u001b[38;5;235m\u001b[48;5;252m5\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[49;33H\u001b[?12l\u001b[?25h" + ], + [ + 0.510264, + "\u001b[?25l\u001b[1;52r\u001b[m\u001b[93m\u001b[107m\u001b[52;1H\r\n\u001b[1;54r\u001b[52;1H\u001b[96m\u001b[47m199 \u001b[m\u001b[93m\u001b[107m\u001b[8C}\u001b[53;195H\u001b[38;5;247m\u001b[48;5;240m  97%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m6\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:20\u001b[49;24H\u001b[?12l\u001b[?25h" + ], + [ + 0.025799, + "\u001b[?25l\u001b[1;52r\u001b[m\u001b[93m\u001b[107m\u001b[52;1H\r\n\u001b[1;54r\u001b[52;1H\u001b[96m\u001b[47m200 \u001b[m\u001b[93m\u001b[107m\u001b[8Cvalues[key] = fmt.Sprintf(\u001b[36m\"\u001b[m\u001b[93m\u001b[107m\u001b[31m%s\u001b[m\u001b[93m\u001b[107m\u001b[36m \"\u001b[m\u001b[93m\u001b[107m, strings.ToUpper(splitCamelCase(value)))\u001b[53;207H\u001b[1m\u001b[38;5;235m\u001b[48;5;252m7\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:29\u001b[49;33H\u001b[?12l\u001b[?25h" + ], + [ + 0.03976, + "\u001b[?25l\u001b[1;52r\u001b[m\u001b[93m\u001b[107m\u001b[52;1H\r\n\u001b[1;54r\u001b[52;1H\u001b[96m\u001b[47m201 \u001b[m\u001b[93m\u001b[107m }\u001b[53;195H\u001b[38;5;247m\u001b[48;5;240m  98%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m8\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[49;33H\u001b[?12l\u001b[?25h" + ], + [ + 0.024833, + "\u001b[?25l\u001b[1;52r\u001b[m\u001b[93m\u001b[107m\u001b[52;1H\r\n\u001b[1;54r\u001b[47;49H\u001b[1m\u001b[31m\u001b[106m{\u001b[49;13H}\u001b[m\u001b[93m\u001b[107m\r\n\r\n\r\n\u001b[96m\u001b[47m202 \u001b[m\u001b[93m\u001b[107m \u001b[32mreturn\u001b[m\u001b[93m\u001b[107m values\u001b[53;207H\u001b[1m\u001b[38;5;235m\u001b[48;5;252m9\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:9 \u001b[49;13H\u001b[?12l\u001b[?25h" + ], + [ + 0.052706, + "\u001b[?25l\u001b[1;52r\u001b[m\u001b[93m\u001b[107m\u001b[52;1H\r\n\u001b[1;54r\u001b[46;49H{\u001b[48;13H}\u001b[52;1H\u001b[96m\u001b[47m203 \u001b[m\u001b[93m\u001b[107m}\u001b[53;195H\u001b[38;5;247m\u001b[48;5;240m  99%\u001b[m\u001b[93m\u001b[107m\u001b[5C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m200\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:29\u001b[49;33H\u001b[?12l\u001b[?25h" + ], + [ + 0.031789, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[43;43H\u001b[1m\u001b[31m\u001b[106m{\u001b[50;9H}\u001b[m\u001b[93m\u001b[107m\u001b[53;207H\u001b[1m\u001b[38;5;235m\u001b[48;5;252m1\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:5 \u001b[50;9H\u001b[?12l\u001b[?25h" + ], + [ + 0.028149, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[43;43H{\u001b[50;9H}\u001b[53;195H\u001b[38;5;247m\u001b[48;5;240m 100%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m2\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:17\u001b[51;21H\u001b[?12l\u001b[?25h" + ], + [ + 0.030014, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[39;63H\u001b[1m\u001b[31m\u001b[106m{\u001b[52;5H}\u001b[m\u001b[93m\u001b[107m\u001b[53;207H\u001b[1m\u001b[38;5;235m\u001b[48;5;252m3\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:1 \u001b[52;5H\u001b[?12l\u001b[?25h" + ], + [ + 0.018881, + "\u001b[?5h" + ], + [ + 0.000174, + "\u001b[?2004l" + ], + [ + 0.100098, + "\u001b[?2004h" + ], + [ + 0.031161, + "\u001b[?5l" + ], + [ + 0.340032, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[39;63H{\u001b[52;5H}\u001b[53;207H\u001b[1m\u001b[38;5;235m\u001b[48;5;252m2\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:17\u001b[51;21H\u001b[?12l\u001b[?25h" + ], + [ + 47.126026, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[43;43H\u001b[1m\u001b[31m\u001b[106m{\u001b[50;9H}\u001b[m\u001b[93m\u001b[107m\u001b[53;195H\u001b[38;5;247m\u001b[48;5;240m  99%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m1\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:5 \u001b[50;9H\u001b[?12l\u001b[?25h" + ], + [ + 0.49885, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[43;43H{\u001b[50;9H}\u001b[53;207H\u001b[1m\u001b[38;5;235m\u001b[48;5;252m0\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:29\u001b[49;33H\u001b[?12l\u001b[?25h" + ], + [ + 0.03165, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[46;49H\u001b[1m\u001b[31m\u001b[106m{\u001b[48;13H}\u001b[m\u001b[93m\u001b[107m\u001b[53;195H\u001b[38;5;247m\u001b[48;5;240m  98%\u001b[m\u001b[93m\u001b[107m\u001b[5C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m199\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:9 \u001b[48;13H\u001b[?12l\u001b[?25h" + ], + [ + 0.030139, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[46;49H{\u001b[48;13H}\u001b[53;207H\u001b[1m\u001b[38;5;235m\u001b[48;5;252m8\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:29\u001b[47;33H\u001b[?12l\u001b[?25h" + ], + [ + 0.029042, + "\u001b[m\u001b[93m\u001b[107m\u001b[53;195H\u001b[38;5;247m\u001b[48;5;240m  97%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m7\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[46;33H" + ], + [ + 0.029773, + "\u001b[m\u001b[93m\u001b[107m\u001b[53;207H\u001b[1m\u001b[38;5;235m\u001b[48;5;252m6\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:20\u001b[45;24H" + ], + [ + 0.031993, + "\u001b[m\u001b[93m\u001b[107m\u001b[53;195H\u001b[38;5;247m\u001b[48;5;240m  96%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m5\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:29\u001b[44;33H" + ], + [ + 0.03237, + "\u001b[m\u001b[93m\u001b[107m\u001b[53;207H\u001b[1m\u001b[38;5;235m\u001b[48;5;252m4\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[43;33H" + ], + [ + 0.195643, + "\u001b[m\u001b[93m\u001b[107m\u001b[53;195H\u001b[38;5;247m\u001b[48;5;240m  95%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m3\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:1 \u001b[42;5H" + ], + [ + 0.210797, + "\u001b[m\u001b[93m\u001b[107m\u001b[53;207H\u001b[1m\u001b[38;5;235m\u001b[48;5;252m2\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:29\u001b[41;33H" + ], + [ + 0.517507, + "\u001b[m\u001b[93m\u001b[107m\u001b[53;195H\u001b[38;5;247m\u001b[48;5;240m  94%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m1\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[40;33H" + ], + [ + 0.244061, + "\u001b[53;210H8\u001b[40;32H" + ], + [ + 0.216928, + "\u001b[53;210H7\u001b[40;31H" + ], + [ + 0.181163, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\b\u001b[1m\u001b[31m\u001b[106m(\u001b[18C)\u001b[m\u001b[93m\u001b[107m\u001b[53;210H\u001b[38;5;22m\u001b[48;5;252m6\u001b[40;30H\u001b[?12l\u001b[?25h" + ], + [ + 315.572339, + "\u001b[?25l\u001b[54;1H\u001b[m\u001b[93m\u001b[107m:" + ], + [ + 4.9e-05, + "\u001b[?2004h\u001b[?12l\u001b[?25h" + ], + [ + 0.220904, + "\b" + ], + [ + 0.002635, + "\u001b[?25l\u001b[40;30H\u001b[?12l\u001b[?25h" + ], + [ + 0.335899, + "\u001b[?25l" + ], + [ + 0.0299, + "\u001b[54;1H\u001b[34m-- VISUAL --\u001b[m\u001b[93m\u001b[107m\u001b[53;1H\u001b[1m\u001b[38;5;94m\u001b[48;5;214m VISUAL \u001b[m\u001b[93m\u001b[107m\u001b[38;5;148m\u001b[48;5;240m\u001b[m\u001b[93m\u001b[107m\u001b[53;9H\u001b[38;5;214m\u001b[48;5;94m\u001b[53;10H \u001b[m\u001b[93m\u001b[107m\u001b[1m\u001b[38;5;214m\u001b[48;5;94m↔\u001b[53;12H1 \u001b[m\u001b[93m\u001b[107m\u001b[38;5;94m\u001b[48;5;240m\u001b[53;15H \u001b[m\u001b[93m\u001b[107m\u001b[38;5;250m\u001b[48;5;240m\u001b[53;17H master \u001b[m\u001b[93m\u001b[107m\u001b[38;5;245m\u001b[48;5;240m\u001b[53;26H \u001b[m\u001b[93m\u001b[107m\u001b[38;5;250m\u001b[48;5;240mcmd/kpod/\u001b[m\u001b[93m\u001b[107m\u001b[1m\u001b[38;5;231m\u001b[48;5;240ms\bimages.go \u001b[m\u001b[93m\u001b[107m\u001b[38;5;240m\u001b[48;5;236m\u001b[53;47H \u001b[40;30H\u001b[?12l\u001b[?25h" + ], + [ + 0.729109, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[54;1H\u001b[K\u001b[54;1H:\u001b[?2004h'<,'>\u001b[?12l\u001b[?25h" + ], + [ + 0.225295, + "q\u001b[?25l\u001b[?12l\u001b[?25h" + ], + [ + 0.582167, + "\u001b[?25l\u001b[54;1H\u001b[K" + ], + [ + 0.007677, + "\u001b[53;1H\u001b[1m\u001b[38;5;22m\u001b[48;5;148m NORMAL \u001b[m\u001b[93m\u001b[107m\u001b[38;5;214m\u001b[48;5;94m\u001b[m\u001b[93m\u001b[107m\u001b[53;9H\u001b[38;5;148m\u001b[48;5;240m\u001b[53;10H \u001b[m\u001b[93m\u001b[107m\u001b[38;5;250m\u001b[48;5;240m\u001b[53;12H master \u001b[m\u001b[93m\u001b[107m\u001b[38;5;245m\u001b[48;5;240m\u001b[53;21H \u001b[m\u001b[93m\u001b[107m\u001b[38;5;250m\u001b[48;5;240mcmd/kpo\u001b[m\u001b[93m\u001b[107m\u001b[2C\u001b[1m\u001b[38;5;231m\u001b[48;5;240mimages.go s\u001b[m\u001b[93m\u001b[107m\b\u001b[38;5;240m\u001b[48;5;236m\u001b[53;42H \u001b[m\u001b[93m\u001b[107m\u001b[1m\u001b[38;5;231m\u001b[48;5;240mg\u001b[m\u001b[93m\u001b[107m\b\u001b[38;5;231m\u001b[48;5;236m     \u001b[40;30H\u001b[?12l\u001b[?25h" + ], + [ + 0.719145, + "\u001b[?25l\u001b[54;1H\u001b[m\u001b[93m\u001b[107m:\u001b[?2004h\u001b[?12l\u001b[?25h" + ], + [ + 0.136951, + "q\u001b[?25l\u001b[?12l\u001b[?25h" + ], + [ + 0.082665, + "\r" + ], + [ + 0.02936, + "\u001b[?25l" + ], + [ + 0.000147, + "\u001b[?2004l" + ], + [ + 9.5e-05, + "\u001b[54;1H\u001b[K\u001b[54;1H" + ], + [ + 5.5e-05, + "\u001b[?2004l\u001b[?1l\u001b>" + ], + [ + 6.2e-05, + "\u001b[?12l\u001b[?25h\u001b[?1049l" + ], + [ + 0.003739, + "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r" + ], + [ + 0.062587, + "\r\n\u001b[34m\u001b[01mcri-o\u001b[22m \u001b[90mgit/master \u001b[39m \u001b[33m422s\u001b[39m\r\n" + ], + [ + 0.003799, + "\u001b]7;file://localhost.localdomain/home/ryan/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007\u001b]2;ryan@localhost: ~/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007\u001b]1;..cubator/cri-o\u0007\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[35m❯\u001b[39m \u001b[K\u001b[208C\u001b[90m\u001b[39m\u001b[208D\u001b[?1h\u001b=\u001b[?2004h" + ], + [ + 0.263929, + "v" + ], + [ + 0.112167, + "\bvi" + ], + [ + 0.109735, + " " + ], + [ + 0.650955, + "c" + ], + [ + 0.088996, + "m" + ], + [ + 0.11713, + "d\u001b[1m/\u001b[0m" + ], + [ + 0.07719, + "\b\u001b[0m/k" + ], + [ + 0.528816, + "\b \b" + ], + [ + 0.145274, + "\b \b" + ], + [ + 0.153621, + "\b \b" + ], + [ + 0.165982, + "\b \b" + ], + [ + 0.149926, + "\b \b" + ], + [ + 0.099378, + "c" + ], + [ + 0.113919, + "m" + ], + [ + 0.124791, + "d\u001b[1m/\u001b[0m" + ], + [ + 0.076941, + "\b\u001b[0m/k" + ], + [ + 0.118135, + "pod\u001b[1m/\u001b[0m" + ], + [ + 0.453118, + "\b\u001b[0m/f" + ], + [ + 0.087524, + "o" + ], + [ + 0.110424, + "rmats\u001b[1m/\u001b[0m" + ], + [ + 0.196023, + "\b\u001b[0m/f" + ], + [ + 0.110967, + "o" + ], + [ + 0.110584, + "rmats.go\u001b[1m \u001b[0m" + ], + [ + 0.502681, + "\b\u001b[0m \b\u001b[?1l\u001b>" + ], + [ + 3e-05, + "\u001b[?2004l\r\r\n" + ], + [ + 0.007009, + "\u001b]2;vim cmd/kpod/formats/formats.go\u0007\u001b]1;vi\u0007" + ], + [ + 0.333483, + "\u001b[?2004h\u001b[?1049h\u001b[?1h\u001b=\u001b[?2004h" + ], + [ + 0.000971, + "\u001b[1;54r\u001b[?12;25h\u001b[?12l\u001b[?25h\u001b[27m\u001b[23m\u001b[m\u001b[93m\u001b[107m\u001b[H\u001b[2J\u001b[?25l\u001b[54;1H\"cmd/kpod/formats/formats.go\"" + ], + [ + 8.5e-05, + " 69L, 1356C" + ], + [ + 0.020264, + "\u001b[2;1H▽\u001b[6n\u001b[2;1H \u001b[1;1H" + ], + [ + 9.3e-05, + "\u001b[>c" + ], + [ + 0.007943, + "\u001b[1;1H\u001b[96m\u001b[47m 9 \r\n 10 \u001b[m\u001b[93m\u001b[107m \u001b[36m\"github.com/pkg/errors\"\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m 11 \u001b[m\u001b[93m\u001b[107m)\r\n\u001b[96m\u001b[47m 12 \r\n 13 \u001b[m\u001b[93m\u001b[107m\u001b[96m// Writer interface for outputs\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m 14 \u001b[m\u001b[93m\u001b[107m\u001b[32mtype\u001b[m\u001b[93m\u001b[107m Writer \u001b[32minterface\u001b[m\u001b[93m\u001b[107m {\r\n\u001b[96m\u001b[47m 15 \u001b[m\u001b[93m\u001b[107m Out() \u001b[33merror\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m 16 \u001b[m\u001b[93m\u001b[107m}\r\n\u001b[96m\u001b[47m 17 \r\n 18 \u001b[m\u001b[93m\u001b[107m\u001b[96m// JSONstruct for JSON output\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m 19 \u001b[m\u001b[93m\u001b[107m\u001b[32mtype\u001b[m\u001b[93m\u001b[107m JSONstruct \u001b[32mstruct\u001b[m\u001b[93m\u001b[107m {\r\n\u001b[96m\u001b[47m 20 \u001b[m\u001b[93m\u001b[107m Output []\u001b[32minterface\u001b[m\u001b[93m\u001b[107m{}\r\n\u001b[96m\u001b[47m 21 \u001b[m\u001b[93m\u001b[107m}\r\n\u001b[96m\u001b[47m 22 \r\n 23 \u001b[m\u001b[93m\u001b[107m\u001b[96m// StdoutTemplate for Go template output\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m 24 \u001b[m\u001b[93m\u001b[107m\u001b[32mtype\u001b[m\u001b[93m\u001b[107m StdoutTemplate \u001b[32mstruct\u001b[m\u001b[93m\u001b[107m {\r\n\u001b[96m\u001b[47m 25 \u001b[m\u001b[93m\u001b[107m Output []\u001b[32minterface\u001b[m\u001b[93m\u001b[107m{}\r\n\u001b[96m\u001b[47m 26 \u001b[m\u001b[93m\u001b[107m Template \u001b[33mstring\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m 27 \u001b[m\u001b[" + ], + [ + 4.3e-05, + "93m\u001b[107m Fields \u001b[33mmap\u001b[m\u001b[93m\u001b[107m[\u001b[33mstring\u001b[m\u001b[93m\u001b[107m]\u001b[33mstring\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m 28 \u001b[m\u001b[93m\u001b[107m}\r\n\u001b[96m\u001b[47m 29 \r\n 30 \u001b[m\u001b[93m\u001b[107m\u001b[96m// Out method for JSON\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m 31 \u001b[m\u001b[93m\u001b[107m\u001b[32mfunc\u001b[m\u001b[93m\u001b[107m (j JSONstruct) Out() \u001b[33merror\u001b[m\u001b[93m\u001b[107m {\r\n\u001b[96m\u001b[47m 32 \u001b[m\u001b[93m\u001b[107m data, err := json.MarshalIndent(j.Output, \u001b[36m\"\"\u001b[m\u001b[93m\u001b[107m, \u001b[36m\" \"\u001b[m\u001b[93m\u001b[107m)\r\n\u001b[96m\u001b[47m 33 \u001b[m\u001b[93m\u001b[107m \u001b[32mif\u001b[m\u001b[93m\u001b[107m err != \u001b[36mnil\u001b[m\u001b[93m\u001b[107m {\r\n\u001b[96m\u001b[47m 34 \u001b[m\u001b[93m\u001b[107m\u001b[8C\u001b[32mreturn\u001b[m\u001b[93m\u001b[107m err\r\n\u001b[96m\u001b[47m 35 \u001b[m\u001b[93m\u001b[107m }\r\n\u001b[96m\u001b[47m 36 \u001b[m\u001b[93m\u001b[107m fmt.Printf(\u001b[36m\"\u001b[m\u001b[93m\u001b[107m\u001b[31m%s\\n\u001b[m\u001b[93m\u001b[107m\u001b[36m\"\u001b[m\u001b[93m\u001b[107m, data)\r\n\u001b[96m\u001b[47m 37 \u001b[m\u001b[93m\u001b[107m \u001b[32mreturn\u001b[m\u001b[93m\u001b[107m \u001b[36mnil\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m 38 \u001b[m\u001b[93m\u001b[107m}\r\n\u001b[96m\u001b[47m 39 \r\n 40 \u001b[m\u001b[93m\u001b[107m\u001b[96m// Out method for Go templates\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m 41 \u001b[m\u001b[93m\u001b[107m\u001b[32mfunc\u001b[m\u001b[93m\u001b[107m (t StdoutTemplate) Out() " + ], + [ + 0.071435, + "\u001b[33merror\u001b[m\u001b[93m\u001b[107m {\r\n\u001b[96m\u001b[47m 42 \u001b[m\u001b[93m\u001b[107m \u001b[32mif\u001b[m\u001b[93m\u001b[107m strings.HasPrefix(t.Template, \u001b[36m\"table\"\u001b[m\u001b[93m\u001b[107m) {\r\n\u001b[96m\u001b[47m 43 \u001b[m\u001b[93m\u001b[107m\u001b[8Ct.Template = strings.TrimSpace(t.Template[\u001b[36m5\u001b[m\u001b[93m\u001b[107m:])\r\n\u001b[96m\u001b[47m 44 \u001b[m\u001b[93m\u001b[107m\u001b[8CheaderTmpl, err := template.New(\u001b[36m\"header\"\u001b[m\u001b[93m\u001b[107m).Funcs(headerFunctions).Parse(t.Template)\r\n\u001b[96m\u001b[47m 45 \u001b[m\u001b[93m\u001b[107m\u001b[8C\u001b[32mif\u001b[m\u001b[93m\u001b[107m err != \u001b[36mnil\u001b[m\u001b[93m\u001b[107m {\r\n\u001b[96m\u001b[47m 46 \u001b[m\u001b[93m\u001b[107m\u001b[12C\u001b[32mreturn\u001b[m\u001b[93m\u001b[107m errors.Wrapf(err, \u001b[36m\"Template parsing error\"\u001b[m\u001b[93m\u001b[107m)\r\n\u001b[96m\u001b[47m 47 \u001b[m\u001b[93m\u001b[107m\u001b[8C}\r\n\u001b[96m\u001b[47m 48 \u001b[m\u001b[93m\u001b[107m\u001b[8Cerr = headerTmpl.Execute(os.Stdout, t.Fields)\r\n\u001b[96m\u001b[47m 49 \u001b[m\u001b[93m\u001b[107m\u001b[8C\u001b[32mif\u001b[m\u001b[93m\u001b[107m err != \u001b[36mnil\u001b[m\u001b[93m\u001b[107m {\r\n\u001b[96m\u001b[47m 50 \u001b[m\u001b[93m\u001b[107m\u001b[12C\u001b[32mreturn\u001b[m\u001b[93m\u001b[107m err\r\n\u001b[96m\u001b[47m 51 \u001b[m\u001b[93m\u001b[107m\u001b[8C}\r\n\u001b[96m\u001b[47m 52 \u001b[m\u001b[93m\u001b[107m\u001b[8Cfmt.Println()\r\n\u001b[96m\u001b[47m 53 \u001b[m\u001b[93m\u001b[107m }\r\n\u001b[96m\u001b[47m 54 \u001b[m\u001b[93m\u001b[107m tmpl, err := template.N" + ], + [ + 4.8e-05, + "ew(\u001b[36m\"image\"\u001b[m\u001b[93m\u001b[107m).Funcs(basicFunctions).Parse(t.Template)\r\n\u001b[96m\u001b[47m 55 \u001b[m\u001b[93m\u001b[107m \u001b[32mif\u001b[m\u001b[93m\u001b[107m err != \u001b[36mnil\u001b[m\u001b[93m\u001b[107m \u001b[1m\u001b[31m\u001b[106m{\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m 56 \u001b[m\u001b[93m\u001b[107m\u001b[8C\u001b[32mreturn\u001b[m\u001b[93m\u001b[107m errors.Wrapf(err, \u001b[36m\"Template parsing error\"\u001b[m\u001b[93m\u001b[107m)\r\n\u001b[96m\u001b[47m 57 \u001b[m\u001b[93m\u001b[107m \u001b[1m\u001b[31m\u001b[106m}\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m 58 \r\n 59 \u001b[m\u001b[93m\u001b[107m \u001b[32mfor\u001b[m\u001b[93m\u001b[107m _, img := \u001b[32mrange\u001b[m\u001b[93m\u001b[107m t.Output {\r\n\u001b[96m\u001b[47m 60 \u001b[m\u001b[93m\u001b[107m\u001b[8CbasicTmpl := tmpl.Funcs(basicFunctions)\r\n\u001b[1m\u001b[38;5;22m\u001b[48;5;148m NORMAL \u001b[m\u001b[93m\u001b[107m\u001b[38;5;148m\u001b[48;5;240m\u001b[53;10H \u001b[m\u001b[93m\u001b[107m\u001b[38;5;250m\u001b[48;5;240m\u001b[53;12H master \u001b[m\u001b[93m\u001b[107m\u001b[38;5;245m\u001b[48;5;240m\u001b[53;21H \u001b[m\u001b[93m\u001b[107m\u001b[38;5;250m\u001b[48;5;240mcmd/kpod/formats/\u001b[m\u001b[93m\u001b[107m\u001b[1m\u001b[38;5;231m\u001b[48;5;240mformats.go \u001b[m\u001b[93m\u001b[107m\u001b[38;5;240m\u001b[48;5;236m\u001b[53;51H \u001b[m\u001b[93m\u001b[107m\u001b[38;5;231m\u001b[48;5;236m                                   " + ], + [ + 0.027914, + "                                                                                         \u001b[m\u001b[93m\u001b[107m\u001b[38;5;247m\u001b[48;5;236munix\u001b[m\u001b[93m\u001b[107m\u001b[38;5;244m\u001b[48;5;236m \u001b[m\u001b[93m\u001b[107m\u001b[53;182H\u001b[38;5;247m\u001b[48;5;236m utf-8\u001b[m\u001b[93m\u001b[107m\u001b[38;5;244m\u001b[48;5;236m \u001b[m\u001b[93m\u001b[107m\u001b[53;190H\u001b[38;5;247m\u001b[48;5;236m go\u001b[m\u001b[93m\u001b[107m\u001b[38;5;240m\u001b[48;5;236m \u001b[m\u001b[93m\u001b[107m\u001b[53;195H\u001b[38;5;144m\u001b[48;5;240m  83%\u001b[m\u001b[93m\u001b[107m\u001b[38;5;252m\u001b[48;5;240m \u001b[m\u001b[93m\u001b[107m\u001b[53;202H\u001b[38;5;235m\u001b[48;5;252m \u001b[53;204H \u001b[m\u001b[93m\u001b[107m\u001b[1m\u001b[38;5;235m\u001b[48;5;252m 57\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:5  \u001b[49;9H\u001b[?12l\u001b[?25h" + ], + [ + 6.6e-05, + "\u001bP+q436f\u001b\\\u001bP+q6b75\u001b\\\u001bP+q6b64\u001b\\\u001bP+q6b72\u001b\\\u001bP+q6b6c\u001b\\\u001bP+q2332\u001b\\\u001bP+q2334\u001b\\\u001bP+q2569\u001b\\\u001bP+q2a37\u001b\\\u001bP+q6b31\u001b\\" + ], + [ + 0.752985, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[1;2H\u001b[96m\u001b[47m10\u001b[m\u001b[93m\u001b[107m\u001b[5C\u001b[36m\"github.com/pkg/errors\"\u001b[m\u001b[93m\u001b[107m\u001b[2;3H\u001b[96m\u001b[47m1\u001b[m\u001b[93m\u001b[107m\u001b[1C)\u001b[2;9H\u001b[K\u001b[3;3H\u001b[96m\u001b[47m2\u001b[m\u001b[93m\u001b[107m\u001b[3;5H\u001b[K\u001b[4;3H\u001b[96m\u001b[47m3\u001b[m\u001b[93m\u001b[107m\u001b[1C\u001b[96m// Writer interface for outputs\u001b[m\u001b[93m\u001b[107m\u001b[5;3H\u001b[96m\u001b[47m4\u001b[m\u001b[93m\u001b[107m\u001b[1C\u001b[32mtype\u001b[m\u001b[93m\u001b[107m Writer \u001b[32minterface\u001b[m\u001b[93m\u001b[107m {\u001b[5;28H\u001b[K\u001b[6;3H\u001b[96m\u001b[47m5\u001b[m\u001b[93m\u001b[107m\u001b[1C Out() \u001b[33merror\u001b[m\u001b[93m\u001b[107m\u001b[6;20H\u001b[K\u001b[7;3H\u001b[96m\u001b[47m6\u001b[m\u001b[93m\u001b[107m\u001b[1C}\u001b[7;9H\u001b[K\u001b[8;3H\u001b[96m\u001b[47m7\u001b[m\u001b[93m\u001b[107m\u001b[8;5H\u001b[K\u001b[9;3H\u001b[96m\u001b[47m8\u001b[m\u001b[93m\u001b[107m\u001b[1C\u001b[96m// JSONstruct for JSON output\u001b[m\u001b[93m\u001b[107m\u001b[10;3H\u001b[96m\u001b[47m9\u001b[m\u001b[93m\u001b[107m\u001b[1C\u001b[32mtype\u001b[m\u001b[93m\u001b[107m JSONstruct \u001b[32mstruct\u001b[m\u001b[93m\u001b[107m {\u001b[10;29H\u001b[K\u001b[11;2H\u001b[96m\u001b[47m20\u001b[m\u001b[93m\u001b[107m\u001b[1C Output []\u001b[32minterface\u001b[m\u001b[93m\u001b[107m{}\u001b[12;3H\u001b[96m\u001b[47m1\u001b[m\u001b[93m\u001b[107m\u001b[1C}\u001b[12;9H\u001b[K\u001b[13;3H\u001b[96m\u001b[47m2\u001b[m\u001b[93m\u001b[107m\u001b[13;5H\u001b[K\u001b[14;3H\u001b[96m\u001b[47m3\u001b[m\u001b[93m\u001b[107m\u001b[1C\u001b[96m// StdoutTemplate for Go template output\u001b[m\u001b[93m\u001b[107m\u001b[15;3H\u001b[96m\u001b[47m4\u001b[m\u001b[93m\u001b[10" + ], + [ + 2.7e-05, + "7m\u001b[1C\u001b[32mtype\u001b[m\u001b[93m\u001b[107m StdoutTemplate \u001b[32mstruct\u001b[m\u001b[93m\u001b[107m {\u001b[15;33H\u001b[K\u001b[16;3H\u001b[96m\u001b[47m5\u001b[m\u001b[93m\u001b[107m\u001b[1C Output []\u001b[32minterface\u001b[m\u001b[93m\u001b[107m{}\u001b[16;32H\u001b[K\u001b[17;3H\u001b[96m\u001b[47m6\u001b[m\u001b[93m\u001b[107m\u001b[5CTemplate \u001b[33mstring\u001b[m\u001b[93m\u001b[107m\u001b[17;24H\u001b[K\u001b[18;3H\u001b[96m\u001b[47m7\u001b[m\u001b[93m\u001b[107m\u001b[5CFields \u001b[33mmap\u001b[m\u001b[93m\u001b[107m[\u001b[33mstring\u001b[m\u001b[93m\u001b[107m]\u001b[33mstring\u001b[m\u001b[93m\u001b[107m\u001b[19;3H\u001b[96m\u001b[47m8\u001b[m\u001b[93m\u001b[107m\u001b[1C}\u001b[19;9H\u001b[K\u001b[20;3H\u001b[96m\u001b[47m9\u001b[m\u001b[93m\u001b[107m\u001b[20;5H\u001b[K\u001b[21;2H\u001b[96m\u001b[47m30\u001b[m\u001b[93m\u001b[107m\u001b[1C\u001b[96m// Out method for JSON\u001b[m\u001b[93m\u001b[107m\u001b[22;3H\u001b[96m\u001b[47m1\u001b[m\u001b[93m\u001b[107m\u001b[1C\u001b[32mfunc\u001b[m\u001b[93m\u001b[107m (j JSONstruct) Out() \u001b[33merror\u001b[m\u001b[93m\u001b[107m {\u001b[23;3H\u001b[96m\u001b[47m2\u001b[m\u001b[93m\u001b[107m\u001b[1C data, err := json.MarshalIndent(j.Output, \u001b[36m\"\"\u001b[m\u001b[93m\u001b[107m, \u001b[36m\" \"\u001b[m\u001b[93m\u001b[107m)\u001b[24;3H\u001b[96m\u001b[47m3\u001b[m\u001b[93m\u001b[107m\u001b[5C\u001b[32mif\u001b[m\u001b[93m\u001b[107m err != \u001b[36mnil\u001b[m\u001b[93m\u001b[107m {\u001b[24;24H\u001b[K\u001b[25;3H\u001b[96m\u001b[47m4\u001b[m\u001b[93m\u001b[107m\u001b[5C \u001b[32mreturn\u001b[m\u001b[93m\u001b[107m err\u001b[25;23H\u001b[K\u001b[26;3H\u001b[96m\u001b[47m5\u001b[m\u001b[93m\u001b[107m\u001b[5C}\u001b[26;13H" + ], + [ + 0.002588, + "\u001b[K\u001b[27;3H\u001b[96m\u001b[47m6\u001b[m\u001b[93m\u001b[107m\u001b[5Cfmt.Printf(\u001b[36m\"\u001b[m\u001b[93m\u001b[107m\u001b[31m%s\\n\u001b[m\u001b[93m\u001b[107m\u001b[36m\"\u001b[m\u001b[93m\u001b[107m, data)\u001b[28;3H\u001b[96m\u001b[47m7\u001b[m\u001b[93m\u001b[107m\u001b[5C\u001b[32mreturn\u001b[m\u001b[93m\u001b[107m \u001b[36mnil\u001b[m\u001b[93m\u001b[107m\u001b[28;19H\u001b[K\u001b[29;3H\u001b[96m\u001b[47m8\u001b[m\u001b[93m\u001b[107m\u001b[1C}\u001b[29;9H\u001b[K\u001b[30;3H\u001b[96m\u001b[47m9\u001b[m\u001b[93m\u001b[107m\u001b[30;5H\u001b[K\u001b[31;2H\u001b[96m\u001b[47m40\u001b[m\u001b[93m\u001b[107m\u001b[1C\u001b[96m// Out method for Go templates\u001b[m\u001b[93m\u001b[107m\u001b[32;3H\u001b[96m\u001b[47m1\u001b[m\u001b[93m\u001b[107m\u001b[1C\u001b[32mfunc\u001b[m\u001b[93m\u001b[107m (t StdoutTemplate) Out() \u001b[33merror\u001b[m\u001b[93m\u001b[107m {\u001b[33;3H\u001b[96m\u001b[47m2\u001b[m\u001b[93m\u001b[107m\u001b[1C \u001b[32mif\u001b[m\u001b[93m\u001b[107m strings.HasPrefix(t.Template, \u001b[36m\"table\"\u001b[m\u001b[93m\u001b[107m) {\u001b[34;3H\u001b[96m\u001b[47m3\u001b[m\u001b[93m\u001b[107m\u001b[5C t.Template = strings.TrimSpace(t.Template[\u001b[36m5\u001b[m\u001b[93m\u001b[107m:])\u001b[35;3H\u001b[96m\u001b[47m4\u001b[m\u001b[93m\u001b[107m\u001b[9CheaderTmpl, err := template.New(\u001b[36m\"header\"\u001b[m\u001b[93m\u001b[107m).Funcs(headerFunctions).Parse(t.Template)\u001b[36;3H\u001b[96m\u001b[47m5\u001b[m\u001b[93m\u001b[107m\u001b[9C\u001b[32mif\u001b[m\u001b[93m\u001b[107m err != \u001b[36mnil\u001b[m\u001b[93m\u001b[107m {\u001b[36;29H\u001b[K\u001b[37;3H\u001b[96m\u001b[47m6\u001b[m\u001b[93m\u001b[107m\u001b[9C \u001b[32mreturn\u001b[m\u001b[93m\u001b" + ], + [ + 3.4e-05, + "[107m errors.Wrapf(err, \u001b[36m\"Template parsing error\"\u001b[m\u001b[93m\u001b[107m)\u001b[38;3H\u001b[96m\u001b[47m7\u001b[m\u001b[93m\u001b[107m\u001b[9C}\u001b[38;17H\u001b[K\u001b[39;3H\u001b[96m\u001b[47m8\u001b[m\u001b[93m\u001b[107m\u001b[9Cerr = headerTmpl.Execute(os.Stdout, t.Fields)\u001b[40;3H\u001b[96m\u001b[47m9\u001b[m\u001b[93m\u001b[107m\u001b[9C\u001b[32mif\u001b[m\u001b[93m\u001b[107m err != \u001b[36mnil\u001b[m\u001b[93m\u001b[107m {\u001b[40;28H\u001b[K\u001b[41;2H\u001b[96m\u001b[47m50\u001b[m\u001b[93m\u001b[107m\u001b[9C \u001b[32mreturn\u001b[m\u001b[93m\u001b[107m err\u001b[41;27H\u001b[K\u001b[42;3H\u001b[96m\u001b[47m1\u001b[m\u001b[93m\u001b[107m\u001b[9C}\u001b[42;17H\u001b[K\u001b[43;3H\u001b[96m\u001b[47m2\u001b[m\u001b[93m\u001b[107m\u001b[9Cfmt.Println()\u001b[44;3H\u001b[96m\u001b[47m3\u001b[m\u001b[93m\u001b[107m\u001b[5C}\u001b[44;13H\u001b[K\u001b[45;3H\u001b[96m\u001b[47m4\u001b[m\u001b[93m\u001b[107m\u001b[5Ctmpl, err := template.New(\u001b[36m\"image\"\u001b[m\u001b[93m\u001b[107m).Funcs(basicFunctions).Parse(t.Template)\u001b[46;3H\u001b[96m\u001b[47m5\u001b[m\u001b[93m\u001b[107m\u001b[5C\u001b[32mif\u001b[m\u001b[93m\u001b[107m err != \u001b[36mnil\u001b[m\u001b[93m\u001b[107m {\u001b[46;24H\u001b[K\u001b[47;3H\u001b[96m\u001b[47m6\u001b[m\u001b[93m\u001b[107m\u001b[5C \u001b[32mreturn\u001b[m\u001b[93m\u001b[107m errors.Wrapf(err, \u001b[36m\"Template parsing error\"\u001b[m\u001b[93m\u001b[107m)\u001b[48;3H\u001b[96m\u001b[47m7\u001b[m\u001b[93m\u001b[107m\u001b[5C}\u001b[48;13H\u001b[K\u001b[49;3H\u001b[96m\u001b[47m8\u001b[m\u001b[93m\u001b[107m\u001b[49;9H\u001b[K\u001b[50;3H\u001b[96m\u001b[47m9\u001b[m\u001b[93m\u001b[107m\u001b[5C" + ], + [ + 0.033553, + "\u001b[32mfor\u001b[m\u001b[93m\u001b[107m _, img := \u001b[32mrange\u001b[m\u001b[93m\u001b[107m t.Output {\u001b[51;2H\u001b[96m\u001b[47m60\u001b[m\u001b[93m\u001b[107m\u001b[5C basicTmpl := tmpl.Funcs(basicFunctions)\u001b[52;3H\u001b[96m\u001b[47m1\u001b[m\u001b[93m\u001b[107m\u001b[9Cerr = basicTmpl.Execute(os.Stdout, img\u001b[53;195H\u001b[38;5;144m\u001b[48;5;240m  84%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m8\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:1\u001b[49;5H\u001b[?12l\u001b[?25h" + ], + [ + 0.379256, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[46;23H\u001b[1m\u001b[31m\u001b[106m{\u001b[48;9H}\u001b[m\u001b[93m\u001b[107m\u001b[53;195H\u001b[38;5;144m\u001b[48;5;240m  83%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m7\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:5\u001b[48;9H\u001b[?12l\u001b[?25h" + ], + [ + 0.137128, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[46;23H{\u001b[48;9H}\u001b[53;195H\u001b[38;5;144m\u001b[48;5;240m  84%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m8\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:1\u001b[49;5H\u001b[?12l\u001b[?25h" + ], + [ + 0.501192, + "\u001b[?25l\u001b[1;52r\u001b[m\u001b[93m\u001b[107m\u001b[52;1H\r\n\u001b[1;54r\u001b[52;1H\u001b[96m\u001b[47m 62 \u001b[m\u001b[93m\u001b[107m\u001b[8C\u001b[32mif\u001b[m\u001b[93m\u001b[107m err != \u001b[36mnil\u001b[m\u001b[93m\u001b[107m {\u001b[54;1H\u001b[K\u001b[53;195H\u001b[38;5;144m\u001b[48;5;240m  86%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m9\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:5\u001b[49;9H\u001b[?12l\u001b[?25h" + ], + [ + 0.045304, + "\u001b[?25l\u001b[1;52r\u001b[m\u001b[93m\u001b[107m\u001b[52;1H\r\n\u001b[1;54r\u001b[52;1H\u001b[96m\u001b[47m 63 \u001b[m\u001b[93m\u001b[107m\u001b[12C\u001b[32mreturn\u001b[m\u001b[93m\u001b[107m err\u001b[53;195H\u001b[38;5;144m\u001b[48;5;240m  87%\u001b[m\u001b[93m\u001b[107m\u001b[6C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m60\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:8\u001b[49;12H\u001b[?12l\u001b[?25h" + ], + [ + 0.024223, + "\u001b[?25l\u001b[1;52r\u001b[m\u001b[93m\u001b[107m\u001b[52;1H\r\n\u001b[1;54r\u001b[52;1H\u001b[96m\u001b[47m 64 \u001b[m\u001b[93m\u001b[107m\u001b[8C}\u001b[53;195H\u001b[38;5;144m\u001b[48;5;240m  88%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m1\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[49;12H\u001b[?12l\u001b[?25h" + ], + [ + 0.040877, + "\u001b[?25l\u001b[1;52r\u001b[m\u001b[93m\u001b[107m\u001b[52;1H\r\n\u001b[1;54r\u001b[52;1H\u001b[96m\u001b[47m 65 \u001b[m\u001b[93m\u001b[107m\u001b[8Cfmt.Println()\u001b[53;195H\u001b[38;5;247m\u001b[48;5;240m  90%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m2\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[49;12H\u001b[?12l\u001b[?25h" + ], + [ + 0.038981, + "\u001b[?25l\u001b[1;52r\u001b[m\u001b[93m\u001b[107m\u001b[52;1H\r\n\u001b[1;54r\u001b[52;1H\u001b[96m\u001b[47m 66 \u001b[m\u001b[93m\u001b[107m }\u001b[53;195H\u001b[38;5;247m\u001b[48;5;240m  91%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m3\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[49;12H\u001b[?12l\u001b[?25h" + ], + [ + 0.022814, + "\u001b[?25l\u001b[1;52r\u001b[m\u001b[93m\u001b[107m\u001b[52;1H\r\n\u001b[1;54r\u001b[52;1H\u001b[96m\u001b[47m 67 \u001b[m\u001b[93m\u001b[107m \u001b[32mreturn\u001b[m\u001b[93m\u001b[107m \u001b[36mnil\u001b[m\u001b[93m\u001b[107m\u001b[53;195H\u001b[38;5;247m\u001b[48;5;240m  93%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m4\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[49;12H\u001b[?12l\u001b[?25h" + ], + [ + 0.03284, + "\u001b[?25l\u001b[1;52r\u001b[m\u001b[93m\u001b[107m\u001b[52;1H\r\n\u001b[1;54r\u001b[52;1H\u001b[96m\u001b[47m 68 \u001b[m\u001b[93m\u001b[107m\u001b[53;195H\u001b[38;5;247m\u001b[48;5;240m  94%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m5\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[49;12H\u001b[?12l\u001b[?25h" + ], + [ + 0.045318, + "\u001b[?25l\u001b[1;52r\u001b[m\u001b[93m\u001b[107m\u001b[52;1H\r\n\u001b[1;54r\u001b[42;38H\u001b[1m\u001b[31m\u001b[106m{\u001b[49;9H}\u001b[m\u001b[93m\u001b[107m\r\n\r\n\r\n\u001b[96m\u001b[47m 69 \u001b[m\u001b[93m\u001b[107m}\u001b[53;195H\u001b[38;5;247m\u001b[48;5;240m  96%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m6\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:5\u001b[49;9H\u001b[?12l\u001b[?25h" + ], + [ + 0.028648, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[42;38H{\u001b[49;9H}\u001b[53;195H\u001b[38;5;247m\u001b[48;5;240m  97%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m7\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[50;9H\u001b[?12l\u001b[?25h" + ], + [ + 0.022824, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[53;195H\u001b[38;5;247m\u001b[48;5;240m  99%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m8\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:1\u001b[51;5H\u001b[?12l\u001b[?25h" + ], + [ + 0.137956, + "\u001b[m\u001b[93m\u001b[107m\u001b[53;195H\u001b[38;5;247m\u001b[48;5;240m  97%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m7\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:5\u001b[50;9H" + ], + [ + 0.507979, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[42;38H\u001b[1m\u001b[31m\u001b[106m{\u001b[49;9H}\u001b[m\u001b[93m\u001b[107m\u001b[53;195H\u001b[38;5;247m\u001b[48;5;240m  96%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m6\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[49;9H\u001b[?12l\u001b[?25h" + ], + [ + 0.024442, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[42;38H{\u001b[49;9H}\u001b[53;195H\u001b[38;5;247m\u001b[48;5;240m  94%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m5\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:8\u001b[48;12H\u001b[?12l\u001b[?25h" + ], + [ + 0.037304, + "\u001b[m\u001b[93m\u001b[107m\u001b[53;195H\u001b[38;5;247m\u001b[48;5;240m  93%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m4\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[47;12H" + ], + [ + 0.030234, + "\u001b[m\u001b[93m\u001b[107m\u001b[53;195H\u001b[38;5;247m\u001b[48;5;240m  91%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m3\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[46;12H" + ], + [ + 0.035803, + "\u001b[m\u001b[93m\u001b[107m\u001b[53;195H\u001b[38;5;247m\u001b[48;5;240m  90%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m2\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[45;12H" + ], + [ + 0.027875, + "\u001b[m\u001b[93m\u001b[107m\u001b[53;195H\u001b[38;5;144m\u001b[48;5;240m  88%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m1\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[44;12H" + ], + [ + 0.031294, + "\u001b[m\u001b[93m\u001b[107m\u001b[53;195H\u001b[38;5;144m\u001b[48;5;240m  87%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m0\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[43;12H" + ], + [ + 0.028909, + "\u001b[m\u001b[93m\u001b[107m\u001b[53;195H\u001b[38;5;144m\u001b[48;5;240m  86%\u001b[m\u001b[93m\u001b[107m\u001b[6C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m59\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:5\u001b[42;9H" + ], + [ + 0.028601, + "\u001b[m\u001b[93m\u001b[107m\u001b[53;195H\u001b[38;5;144m\u001b[48;5;240m  84%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m8\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:1\u001b[41;5H" + ], + [ + 0.0318, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[38;23H\u001b[1m\u001b[31m\u001b[106m{\u001b[40;9H}\u001b[m\u001b[93m\u001b[107m\u001b[53;195H\u001b[38;5;144m\u001b[48;5;240m  83%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m7\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:5\u001b[40;9H\u001b[?12l\u001b[?25h" + ], + [ + 0.04273, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[38;23H{\u001b[40;9H}\u001b[53;195H\u001b[38;5;144m\u001b[48;5;240m  81%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m6\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:8\u001b[39;12H\u001b[?12l\u001b[?25h" + ], + [ + 0.028264, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[53;195H\u001b[38;5;144m\u001b[48;5;240m  80%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m5\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:5\u001b[38;9H\u001b[?12l\u001b[?25h" + ], + [ + 0.031967, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[53;195H\u001b[38;5;108m\u001b[48;5;240m  78%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m4\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[37;9H\u001b[?12l\u001b[?25h" + ], + [ + 0.037706, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[25;51H\u001b[1m\u001b[31m\u001b[106m{\u001b[36;9H}\u001b[m\u001b[93m\u001b[107m\u001b[53;195H\u001b[38;5;108m\u001b[48;5;240m  77%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m3\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[36;9H\u001b[?12l\u001b[?25h" + ], + [ + 0.030776, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[25;51H{\u001b[36;9H}\u001b[53;195H\u001b[38;5;108m\u001b[48;5;240m  75%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m2\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:8\u001b[35;12H\u001b[?12l\u001b[?25h" + ], + [ + 0.028632, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[53;195H\u001b[38;5;108m\u001b[48;5;240m  74%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m1\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[34;12H\u001b[?12l\u001b[?25h" + ], + [ + 0.032475, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[53;195H\u001b[38;5;108m\u001b[48;5;240m  72%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m0\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[33;12H\u001b[?12l\u001b[?25h" + ], + [ + 0.026166, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[53;195H\u001b[38;5;108m\u001b[48;5;240m  71%\u001b[m\u001b[93m\u001b[107m\u001b[6C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m49\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[32;12H\u001b[?12l\u001b[?25h" + ], + [ + 0.168545, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[53;195H\u001b[38;5;108m\u001b[48;5;240m  70%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m8\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[31;12H\u001b[?12l\u001b[?25h" + ], + [ + 0.49982, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[53;195H\u001b[38;5;108m\u001b[48;5;240m  68%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m7\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[30;12H\u001b[?12l\u001b[?25h" + ], + [ + 0.030812, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[53;195H\u001b[38;5;108m\u001b[48;5;240m  67%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m6\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[29;12H\u001b[?12l\u001b[?25h" + ], + [ + 0.030802, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[53;195H\u001b[38;5;108m\u001b[48;5;240m  65%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m5\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[28;12H\u001b[?12l\u001b[?25h" + ], + [ + 0.032574, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[53;195H\u001b[38;5;108m\u001b[48;5;240m  64%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m4\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[27;12H\u001b[?12l\u001b[?25h" + ], + [ + 0.029137, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[53;195H\u001b[38;5;107m\u001b[48;5;240m  62%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m3\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[26;12H\u001b[?12l\u001b[?25h" + ], + [ + 0.037678, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[53;195H\u001b[38;5;107m\u001b[48;5;240m  61%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m2\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:5\u001b[25;9H\u001b[?12l\u001b[?25h" + ], + [ + 0.28215, + "\u001b[m\u001b[93m\u001b[107m\u001b[53;195H\u001b[38;5;107m\u001b[48;5;240m  62%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m3\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:8\u001b[26;12H" + ], + [ + 0.499953, + "\u001b[m\u001b[93m\u001b[107m\u001b[53;195H\u001b[38;5;108m\u001b[48;5;240m  64%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m4\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[27;12H" + ], + [ + 0.029953, + "\u001b[m\u001b[93m\u001b[107m\u001b[53;195H\u001b[38;5;108m\u001b[48;5;240m  65%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m5\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[28;12H" + ], + [ + 0.033793, + "\u001b[m\u001b[93m\u001b[107m\u001b[53;195H\u001b[38;5;108m\u001b[48;5;240m  67%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m6\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[29;12H" + ], + [ + 0.032469, + "\u001b[m\u001b[93m\u001b[107m\u001b[53;195H\u001b[38;5;108m\u001b[48;5;240m  68%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m7\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[30;12H" + ], + [ + 0.030452, + "\u001b[m\u001b[93m\u001b[107m\u001b[53;195H\u001b[38;5;108m\u001b[48;5;240m  70%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m8\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[31;12H" + ], + [ + 0.03474, + "\u001b[m\u001b[93m\u001b[107m\u001b[53;195H\u001b[38;5;108m\u001b[48;5;240m  71%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m9\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[32;12H" + ], + [ + 0.031553, + "\u001b[m\u001b[93m\u001b[107m\u001b[53;195H\u001b[38;5;108m\u001b[48;5;240m  72%\u001b[m\u001b[93m\u001b[107m\u001b[6C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m50\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[33;12H" + ], + [ + 0.027886, + "\u001b[m\u001b[93m\u001b[107m\u001b[53;195H\u001b[38;5;108m\u001b[48;5;240m  74%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m1\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[34;12H" + ], + [ + 0.032183, + "\u001b[m\u001b[93m\u001b[107m\u001b[53;195H\u001b[38;5;108m\u001b[48;5;240m  75%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m2\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[35;12H" + ], + [ + 0.361308, + "\u001b[m\u001b[93m\u001b[107m\u001b[53;195H\u001b[38;5;108m\u001b[48;5;240m  74%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m1\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[34;12H" + ], + [ + 0.180436, + "\u001b[m\u001b[93m\u001b[107m\u001b[53;195H\u001b[38;5;108m\u001b[48;5;240m  72%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m0\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[33;12H" + ], + [ + 0.163593, + "\u001b[m\u001b[93m\u001b[107m\u001b[53;195H\u001b[38;5;108m\u001b[48;5;240m  71%\u001b[m\u001b[93m\u001b[107m\u001b[6C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m49\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[32;12H" + ], + [ + 0.167433, + "\u001b[m\u001b[93m\u001b[107m\u001b[53;195H\u001b[38;5;108m\u001b[48;5;240m  70%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m8\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[31;12H" + ], + [ + 0.499694, + "\u001b[m\u001b[93m\u001b[107m\u001b[53;195H\u001b[38;5;108m\u001b[48;5;240m  68%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m7\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[30;12H" + ], + [ + 0.035176, + "\u001b[m\u001b[93m\u001b[107m\u001b[53;195H\u001b[38;5;108m\u001b[48;5;240m  67%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m6\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[29;12H" + ], + [ + 0.176855, + "\u001b[m\u001b[93m\u001b[107m\u001b[53;195H\u001b[38;5;108m\u001b[48;5;240m  65%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m5\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[28;12H" + ], + [ + 0.167552, + "\u001b[m\u001b[93m\u001b[107m\u001b[53;195H\u001b[38;5;108m\u001b[48;5;240m  64%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m4\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[27;12H" + ], + [ + 0.162525, + "\u001b[m\u001b[93m\u001b[107m\u001b[53;195H\u001b[38;5;107m\u001b[48;5;240m  62%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m3\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[26;12H" + ], + [ + 0.344534, + "\u001b[m\u001b[93m\u001b[107m\u001b[53;195H\u001b[38;5;107m\u001b[48;5;240m  61%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m2\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:5\u001b[25;9H" + ], + [ + 0.475291, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[42C\u001b[1m\u001b[31m\u001b[106m{\u001b[36;9H}\u001b[m\u001b[93m\u001b[107m\u001b[53;209H\u001b[38;5;22m\u001b[48;5;252m47\u001b[25;51H\u001b[?12l\u001b[?25h" + ], + [ + 0.862743, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m{\u001b[36;9H}\u001b[53;210H\u001b[38;5;22m\u001b[48;5;252m6\u001b[25;50H\u001b[?12l\u001b[?25h" + ], + [ + 0.211622, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[25;29H\u001b[1m\u001b[31m\u001b[106m(\u001b[19C)\u001b[m\u001b[93m\u001b[107m\u001b[53;210H\u001b[38;5;22m\u001b[48;5;252m5\u001b[25;49H\u001b[?12l\u001b[?25h" + ], + [ + 0.334139, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[25;29H(t\u001b[18C) \u001b[53;210H\u001b[38;5;22m\u001b[48;5;252m6\u001b[25;50H\u001b[?12l\u001b[?25h" + ], + [ + 0.690098, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m \u001b[1m\u001b[31m\u001b[106m{\u001b[36;9H}\u001b[m\u001b[93m\u001b[107m\u001b[53;210H\u001b[38;5;22m\u001b[48;5;252m7\u001b[25;51H\u001b[?12l\u001b[?25h" + ], + [ + 0.829404, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m{\u001b[36;9H}\u001b[53;195H\u001b[38;5;107m\u001b[48;5;240m  62%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m3\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[26;51H\u001b[?12l\u001b[?25h" + ], + [ + 0.187135, + "\u001b[m\u001b[93m\u001b[107m\u001b[53;195H\u001b[38;5;108m\u001b[48;5;240m  64%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m4\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:\u001b[27;51H" + ], + [ + 0.223449, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[28;27H\u001b[1m\u001b[31m\u001b[106m{\u001b[30;13H}\u001b[m\u001b[93m\u001b[107m\u001b[53;195H\u001b[38;5;108m\u001b[48;5;240m  65%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m5\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:23\u001b[28;27H\u001b[?12l\u001b[?25h" + ], + [ + 0.381099, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m{\u001b[30;13H}\u001b[53;195H\u001b[38;5;108m\u001b[48;5;240m  67%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m6\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:47\u001b[29;51H\u001b[?12l\u001b[?25h" + ], + [ + 0.445137, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[28;27H\u001b[1m\u001b[31m\u001b[106m{\u001b[30;13H}\u001b[m\u001b[93m\u001b[107m\u001b[53;195H\u001b[38;5;108m\u001b[48;5;240m  68%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m7\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:9 \u001b[30;13H\u001b[?12l\u001b[?25h" + ], + [ + 0.207385, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[28;27H{\u001b[30;13H}\u001b[53;195H\u001b[38;5;108m\u001b[48;5;240m  70%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m8\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:47\u001b[31;51H\u001b[?12l\u001b[?25h" + ], + [ + 0.222319, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[32;27H\u001b[1m\u001b[31m\u001b[106m{\u001b[34;13H}\u001b[m\u001b[93m\u001b[107m\u001b[53;195H\u001b[38;5;108m\u001b[48;5;240m  71%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m9\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:23\u001b[32;27H\u001b[?12l\u001b[?25h" + ], + [ + 0.499981, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m{\u001b[34;13H}\u001b[53;195H\u001b[38;5;108m\u001b[48;5;240m  72%\u001b[m\u001b[93m\u001b[107m\u001b[6C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m50\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:22\u001b[33;26H\u001b[?12l\u001b[?25h" + ], + [ + 0.029604, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[32;27H\u001b[1m\u001b[31m\u001b[106m{\u001b[34;13H}\u001b[m\u001b[93m\u001b[107m\u001b[53;195H\u001b[38;5;108m\u001b[48;5;240m  74%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m1\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:9 \u001b[34;13H\u001b[?12l\u001b[?25h" + ], + [ + 0.162284, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[32;27H{\u001b[34;13H}\u001b[35;24H\u001b[1m\u001b[31m\u001b[106m()\u001b[m\u001b[93m\u001b[107m\u001b[53;195H\u001b[38;5;108m\u001b[48;5;240m  75%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m2\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:21\u001b[35;25H\u001b[?12l\u001b[?25h" + ], + [ + 0.200133, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[25;51H\u001b[1m\u001b[31m\u001b[106m{\u001b[m\u001b[93m\u001b[107m\u001b[35;24H()\u001b[36;9H\u001b[1m\u001b[31m\u001b[106m}\u001b[m\u001b[93m\u001b[107m\u001b[53;195H\u001b[38;5;108m\u001b[48;5;240m  77%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m3\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:5 \u001b[36;9H\u001b[?12l\u001b[?25h" + ], + [ + 0.196823, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[25;51H{\u001b[36;9H}\u001b[53;195H\u001b[38;5;108m\u001b[48;5;240m  78%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m4\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:47\u001b[37;51H\u001b[?12l\u001b[?25h" + ], + [ + 0.356692, + "\u001b[?25l\u001b[m\u001b[93m\u001b[107m\u001b[25;51H\u001b[1m\u001b[31m\u001b[106m{\u001b[36;9H}\u001b[m\u001b[93m\u001b[107m\u001b[53;195H\u001b[38;5;108m\u001b[48;5;240m  77%\u001b[m\u001b[93m\u001b[107m\u001b[7C\u001b[1m\u001b[38;5;235m\u001b[48;5;252m3\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:5 \u001b[36;9H\u001b[?12l\u001b[?25h" + ], + [ + 837.577075, + "\u001b[27m\u001b[23m\u001b[m\u001b[93m\u001b[107m\u001b[H\u001b[2J\u001b[?25l\u001b[1;1H\u001b[96m\u001b[47m 19 \u001b[m\u001b[93m\u001b[107m\u001b[32mtype\u001b[m\u001b[93m\u001b[107m JSONstruct \u001b[32mstruct\u001b[m\u001b[93m\u001b[107m {\r\n\u001b[96m\u001b[47m 20 \u001b[m\u001b[93m\u001b[107m Output []\u001b[32minterface\u001b[m\u001b[93m\u001b[107m{}\r\n\u001b[96m\u001b[47m 21 \u001b[m\u001b[93m\u001b[107m}\r\n\u001b[96m\u001b[47m 22 \r\n 23 \u001b[m\u001b[93m\u001b[107m\u001b[96m// StdoutTemplate for Go template output\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m 24 \u001b[m\u001b[93m\u001b[107m\u001b[32mtype\u001b[m\u001b[93m\u001b[107m StdoutTemplate \u001b[32mstruct\u001b[m\u001b[93m\u001b[107m {\r\n\u001b[96m\u001b[47m 25 \u001b[m\u001b[93m\u001b[107m Output []\u001b[32minterface\u001b[m\u001b[93m\u001b[107m{}\r\n\u001b[96m\u001b[47m 26 \u001b[m\u001b[93m\u001b[107m Template \u001b[33mstring\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m 27 \u001b[m\u001b[93m\u001b[107m Fields \u001b[33mmap\u001b[m\u001b[93m\u001b[107m[\u001b[33mstring\u001b[m\u001b[93m\u001b[107m]\u001b[33mstring\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m 28 \u001b[m\u001b[93m\u001b[107m}\r\n\u001b[96m\u001b[47m 29 \r\n 30 \u001b[m\u001b[93m\u001b[107m\u001b[96m// Out method for JSON\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m 31 \u001b[m\u001b[93m\u001b[107m\u001b[32mfunc\u001b[m\u001b[93m\u001b[107m (j JSONstruct) Out() \u001b[33merror\u001b[m\u001b[93m\u001b[107m {\r\n\u001b[96m\u001b[47m 32 \u001b[m\u001b[93m\u001b[107m data, err := json.MarshalIndent(j.Output, \u001b[36m\"\"\u001b[m\u001b[93m\u001b[107m, \u001b[36m\" \"\u001b[m\u001b[93m\u001b[107m)\r\n" + ], + [ + 7.7e-05, + "\u001b[96m\u001b[47m 33 \u001b[m\u001b[93m\u001b[107m \u001b[32mif\u001b[m\u001b[93m\u001b[107m err != \u001b[36mnil\u001b[m\u001b[93m\u001b[107m {\r\n\u001b[96m\u001b[47m 34 \u001b[m\u001b[93m\u001b[107m\u001b[8C\u001b[32mreturn\u001b[m\u001b[93m\u001b[107m err\r\n\u001b[96m\u001b[47m 35 \u001b[m\u001b[93m\u001b[107m }\r\n\u001b[96m\u001b[47m 36 \u001b[m\u001b[93m\u001b[107m fmt.Printf(\u001b[36m\"\u001b[m\u001b[93m\u001b[107m\u001b[31m%s\\n\u001b[m\u001b[93m\u001b[107m\u001b[36m\"\u001b[m\u001b[93m\u001b[107m, data)\r\n\u001b[96m\u001b[47m 37 \u001b[m\u001b[93m\u001b[107m \u001b[32mreturn\u001b[m\u001b[93m\u001b[107m \u001b[36mnil\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m 38 \u001b[m\u001b[93m\u001b[107m}\r\n\u001b[96m\u001b[47m 39 \r\n 40 \u001b[m\u001b[93m\u001b[107m\u001b[96m// Out method for Go templates\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m 41 \u001b[m\u001b[93m\u001b[107m\u001b[32mfunc\u001b[m\u001b[93m\u001b[107m (t StdoutTemplate) Out() \u001b[33merror\u001b[m\u001b[93m\u001b[107m {\r\n\u001b[96m\u001b[47m 42 \u001b[m\u001b[93m\u001b[107m \u001b[32mif\u001b[m\u001b[93m\u001b[107m strings.HasPrefix(t.Template, \u001b[36m\"table\"\u001b[m\u001b[93m\u001b[107m) \u001b[1m\u001b[31m\u001b[106m{\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m 43 \u001b[m\u001b[93m\u001b[107m\u001b[8Ct.Template = strings.TrimSpace(t.Template[\u001b[36m5\u001b[m\u001b[93m\u001b[107m:])\r\n\u001b[96m\u001b[47m 44 \u001b[m\u001b[93m\u001b[107m\u001b[8CheaderTmpl, err := template.New(\u001b[36m\"header\"\u001b[m\u001b[93m\u001b[107m).Funcs(headerFunctions).Parse(t.Template)\r\n\u001b[96m\u001b[47m 45 \u001b[m\u001b[93m\u001b[107m" + ], + [ + 0.006486, + "\u001b[8C\u001b[32mif\u001b[m\u001b[93m\u001b[107m err != \u001b[36mnil\u001b[m\u001b[93m\u001b[107m {\r\n\u001b[96m\u001b[47m 46 \u001b[m\u001b[93m\u001b[107m\u001b[12C\u001b[32mreturn\u001b[m\u001b[93m\u001b[107m errors.Wrapf(err, \u001b[36m\"Template parsing error\"\u001b[m\u001b[93m\u001b[107m)\r\n\u001b[96m\u001b[47m 47 \u001b[m\u001b[93m\u001b[107m\u001b[8C}\r\n\u001b[96m\u001b[47m 48 \u001b[m\u001b[93m\u001b[107m\u001b[8Cerr = headerTmpl.Execute(os.Stdout, t.Fields)\r\n\u001b[96m\u001b[47m 49 \u001b[m\u001b[93m\u001b[107m\u001b[8C\u001b[32mif\u001b[m\u001b[93m\u001b[107m err != \u001b[36mnil\u001b[m\u001b[93m\u001b[107m {\r\n\u001b[96m\u001b[47m 50 \u001b[m\u001b[93m\u001b[107m\u001b[12C\u001b[32mreturn\u001b[m\u001b[93m\u001b[107m err\r\n\u001b[96m\u001b[47m 51 \u001b[m\u001b[93m\u001b[107m\u001b[8C}\r\n\u001b[96m\u001b[47m 52 \u001b[m\u001b[93m\u001b[107m\u001b[8Cfmt.Println()\r\n\u001b[96m\u001b[47m 53 \u001b[m\u001b[93m\u001b[107m \u001b[1m\u001b[31m\u001b[106m}\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m 54 \u001b[m\u001b[93m\u001b[107m tmpl, err := template.New(\u001b[36m\"image\"\u001b[m\u001b[93m\u001b[107m).Funcs(basicFunctions).Parse(t.Template)\r\n\u001b[96m\u001b[47m 55 \u001b[m\u001b[93m\u001b[107m \u001b[32mif\u001b[m\u001b[93m\u001b[107m err != \u001b[36mnil\u001b[m\u001b[93m\u001b[107m {\r\n\u001b[96m\u001b[47m 56 \u001b[m\u001b[93m\u001b[107m\u001b[8C\u001b[32mreturn\u001b[m\u001b[93m\u001b[107m errors.Wrapf(err, \u001b[36m\"Template parsing error\"\u001b[m\u001b[93m\u001b[107m)\r\n\u001b[96m\u001b[47m 57 \u001b[m\u001b[93m\u001b[107m }\r\n\u001b[96m\u001b[47m 58 \r\n 59 \u001b[m\u001b[93m\u001b[107m \u001b[32mfor\u001b[m\u001b[93m\u001b[107m" + ], + [ + 6.6e-05, + " _, img := \u001b[32mrange\u001b[m\u001b[93m\u001b[107m t.Output {\r\n\u001b[96m\u001b[47m 60 \u001b[m\u001b[93m\u001b[107m\u001b[8CbasicTmpl := tmpl.Funcs(basicFunctions)\r\n\u001b[96m\u001b[47m 61 \u001b[m\u001b[93m\u001b[107m\u001b[8Cerr = basicTmpl.Execute(os.Stdout, img)\r\n\u001b[96m\u001b[47m 62 \u001b[m\u001b[93m\u001b[107m\u001b[8C\u001b[32mif\u001b[m\u001b[93m\u001b[107m err != \u001b[36mnil\u001b[m\u001b[93m\u001b[107m {\r\n\u001b[96m\u001b[47m 63 \u001b[m\u001b[93m\u001b[107m\u001b[12C\u001b[32mreturn\u001b[m\u001b[93m\u001b[107m err\r\n\u001b[96m\u001b[47m 64 \u001b[m\u001b[93m\u001b[107m\u001b[8C}\r\n\u001b[96m\u001b[47m 65 \u001b[m\u001b[93m\u001b[107m\u001b[8Cfmt.Println()\r\n\u001b[96m\u001b[47m 66 \u001b[m\u001b[93m\u001b[107m }\r\n\u001b[96m\u001b[47m 67 \u001b[m\u001b[93m\u001b[107m \u001b[32mreturn\u001b[m\u001b[93m\u001b[107m \u001b[36mnil\u001b[m\u001b[93m\u001b[107m\r\n\u001b[96m\u001b[47m 68 \u001b[m\u001b[93m\u001b[107m\r\n\u001b[1m\u001b[38;5;22m\u001b[48;5;148m NORMAL \u001b[m\u001b[93m\u001b[107m\u001b[38;5;148m\u001b[48;5;240m\u001b[51;10H \u001b[m\u001b[93m\u001b[107m\u001b[38;5;250m\u001b[48;5;240m\u001b[51;12H master \u001b[m\u001b[93m\u001b[107m\u001b[38;5;245m\u001b[48;5;240m\u001b[51;21H \u001b[m\u001b[93m\u001b[107m\u001b[38;5;250m\u001b[48;5;240mcmd/kpod/formats/\u001b[m\u001b[93m\u001b[107m\u001b[1m\u001b[38;5;231m\u001b[48;5;240mformats.go \u001b[m\u001b[93m\u001b[107m\u001b[38;5;240m\u001b[48;5;236m\u001b[51;51H \u001b[m\u001b[93m\u001b[107m\u001b[38;5;231m\u001b[48;5;236m                                   " + ], + [ + 2.6e-05, + "                                                                                         \u001b[m\u001b[93m\u001b[107m\u001b[38;5;247m\u001b[48;5;236munix\u001b[m\u001b[93m\u001b[107m\u001b[38;5;244m\u001b[48;5;236m \u001b[m\u001b[93m\u001b[107m\u001b[51;182H\u001b[38;5;247m\u001b[48;5;236m utf-8\u001b[m\u001b[93m\u001b[107m\u001b[38;5;244m\u001b[48;5;236m \u001b[m\u001b[93m\u001b[107m\u001b[51;190H\u001b[38;5;247m\u001b[48;5;236m go\u001b[m\u001b[93m\u001b[107m\u001b[38;5;240m\u001b[48;5;236m \u001b[m\u001b[93m\u001b[107m\u001b[51;195H\u001b[38;5;108m\u001b[48;5;240m  77%\u001b[m\u001b[93m\u001b[107m\u001b[38;5;252m\u001b[48;5;240m \u001b[m\u001b[93m\u001b[107m\u001b[51;202H\u001b[38;5;235m\u001b[48;5;252m \u001b[51;204H \u001b[m\u001b[93m\u001b[107m\u001b[1m\u001b[38;5;235m\u001b[48;5;252m 53\u001b[m\u001b[93m\u001b[107m\u001b[38;5;22m\u001b[48;5;252m:5  \u001b[35;9H\u001b[?12l\u001b[?25h" + ], + [ + 0.84171, + "\u001b[?25l\u001b[52;1H\u001b[m\u001b[93m\u001b[107m:\u001b[?2004h\u001b[?12l\u001b[?25h" + ], + [ + 0.167691, + "q\u001b[?25l\u001b[?12l\u001b[?25h" + ], + [ + 0.064539, + "\r" + ], + [ + 0.016979, + "\u001b[?25l\u001b[?2004l\u001b[52;1H\u001b[K\u001b[52;1H\u001b[?2004l\u001b[?1l\u001b>\u001b[?12l\u001b[?25h\u001b[?1049l" + ], + [ + 0.002329, + "\u001b[1m\u001b[7m%\u001b[27m\u001b[1m\u001b[0m \r \r" + ], + [ + 0.02599, + "\r\n\u001b[34m\u001b[01mcri-o\u001b[22m \u001b[90mgit/master \u001b[39m \u001b[33m853s\u001b[39m\r\n" + ], + [ + 0.001018, + "\u001b]7;file://localhost.localdomain/home/ryan/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007" + ], + [ + 0.000113, + "\u001b]2;ryan@localhost: ~/Development/Go/src/github.com/kubernetes-incubator/cri-o\u0007" + ], + [ + 2.3e-05, + "\u001b]1;..cubator/cri-o\u0007" + ], + [ + 8.7e-05, + "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[35m❯\u001b[39m \u001b[K\u001b[208C\u001b[90m\u001b[39m\u001b[208D" + ], + [ + 6.7e-05, + "\u001b[?1h\u001b=" + ], + [ + 2.7e-05, + "\u001b[?2004h" + ], + [ + 0.177155, + "e" + ], + [ + 0.184267, + "\bex" + ], + [ + 0.095845, + "i" + ], + [ + 0.144511, + "t" + ], + [ + 0.087093, + "\u001b[?1l\u001b>" + ], + [ + 0.000252, + "\u001b[?2004l\r\r\n" + ], + [ + 0.009572, + "\u001b]2;exit\u0007\u001b]1;exit\u0007" + ] + ] +} \ No newline at end of file diff --git a/libkpod/container_server.go b/libkpod/container_server.go index b4c333c3..f04e0284 100644 --- a/libkpod/container_server.go +++ b/libkpod/container_server.go @@ -17,6 +17,7 @@ import ( "github.com/kubernetes-incubator/cri-o/pkg/annotations" "github.com/kubernetes-incubator/cri-o/pkg/registrar" "github.com/kubernetes-incubator/cri-o/pkg/storage" + "github.com/opencontainers/runc/libcontainer" rspec "github.com/opencontainers/runtime-spec/specs-go" "github.com/opencontainers/selinux/go-selinux/label" "github.com/pkg/errors" @@ -195,6 +196,12 @@ func (c *ContainerServer) Update() error { if _, ok := oldPodContainers[id]; !ok { // this container's ID wasn't in the updated list -> removed removedPodContainers[id] = id + } else { + ctr := c.GetContainer(id) + if ctr != nil { + // if the container exists, update its state + c.ContainerStateFromDisk(c.GetContainer(id)) + } } }) for removedPodContainer := range removedPodContainers { @@ -583,13 +590,31 @@ func (c *ContainerServer) RemoveContainer(ctr *oci.Container) { c.state.containers.Delete(ctr.ID()) } -// ListContainers returns a list of all containers stored by the server state -func (c *ContainerServer) ListContainers() []*oci.Container { +// listContainers returns a list of all containers stored by the server state +func (c *ContainerServer) listContainers() []*oci.Container { c.stateLock.Lock() defer c.stateLock.Unlock() return c.state.containers.List() } +// ListContainers returns a list of all containers stored by the server state +// that match the given filter function +func (c *ContainerServer) ListContainers(filters ...func(*oci.Container) bool) ([]*oci.Container, error) { + containers := c.listContainers() + if len(filters) == 0 { + return containers, nil + } + filteredContainers := make([]*oci.Container, 0, len(containers)) + for _, container := range containers { + for _, filter := range filters { + if filter(container) { + filteredContainers = append(filteredContainers, container) + } + } + } + return filteredContainers, nil +} + // AddSandbox adds a sandbox to the sandbox state store func (c *ContainerServer) AddSandbox(sb *sandbox.Sandbox) { c.stateLock.Lock() @@ -641,3 +666,20 @@ func (c *ContainerServer) ListSandboxes() []*sandbox.Sandbox { return sbArray } + +// LibcontainerStats gets the stats for the container with the given id from runc/libcontainer +func (c *ContainerServer) LibcontainerStats(ctr *oci.Container) (*libcontainer.Stats, error) { + // TODO: make this not hardcoded + // was: c.runtime.Path(ociContainer) but that returns /usr/bin/runc - how do we get /run/runc? + // runroot is /var/run/runc + // Hardcoding probably breaks ClearContainers compatibility + factory, err := loadFactory("/run/runc") + if err != nil { + return nil, err + } + container, err := factory.Load(ctr.ID()) + if err != nil { + return nil, err + } + return container.Stats() +} diff --git a/libkpod/image/image.go b/libkpod/image/image.go index 1d91fb98..6ed609b2 100644 --- a/libkpod/image/image.go +++ b/libkpod/image/image.go @@ -161,16 +161,15 @@ func MatchesReference(name, argName string) bool { } // FormattedSize returns a human-readable formatted size for the image -func FormattedSize(size int64) string { +func FormattedSize(size float64) string { suffixes := [5]string{"B", "KB", "MB", "GB", "TB"} count := 0 - formattedSize := float64(size) - for formattedSize >= 1024 && count < 4 { - formattedSize /= 1024 + for size >= 1024 && count < 4 { + size /= 1024 count++ } - return fmt.Sprintf("%.4g %s", formattedSize, suffixes[count]) + return fmt.Sprintf("%.4g %s", size, suffixes[count]) } // FindImage searches for a *storage.Image with a matching the given name or ID in the given store. diff --git a/libkpod/stats.go b/libkpod/stats.go new file mode 100644 index 00000000..f4d645d6 --- /dev/null +++ b/libkpod/stats.go @@ -0,0 +1,111 @@ +package libkpod + +import ( + "path/filepath" + "syscall" + "time" + + "strings" + + "github.com/kubernetes-incubator/cri-o/oci" + "github.com/opencontainers/runc/libcontainer" +) + +// ContainerStats contains the statistics information for a running container +type ContainerStats struct { + Container string + CPU float64 + cpuNano uint64 + systemNano uint64 + MemUsage uint64 + MemLimit uint64 + MemPerc float64 + NetInput uint64 + NetOutput uint64 + BlockInput uint64 + BlockOutput uint64 + PIDs uint64 +} + +// GetContainerStats gets the running stats for a given container +func (c *ContainerServer) GetContainerStats(ctr *oci.Container, previousStats *ContainerStats) (*ContainerStats, error) { + previousCPU := previousStats.cpuNano + previousSystem := previousStats.systemNano + libcontainerStats, err := c.LibcontainerStats(ctr) + if err != nil { + return nil, err + } + cgroupStats := libcontainerStats.CgroupStats + stats := new(ContainerStats) + stats.Container = ctr.ID() + stats.CPU = calculateCPUPercent(libcontainerStats, previousCPU, previousSystem) + stats.MemUsage = cgroupStats.MemoryStats.Usage.Usage + stats.MemLimit = getMemLimit(cgroupStats.MemoryStats.Usage.Limit) + stats.MemPerc = float64(stats.MemUsage) / float64(stats.MemLimit) + stats.PIDs = cgroupStats.PidsStats.Current + stats.BlockInput, stats.BlockOutput = calculateBlockIO(libcontainerStats) + stats.NetInput, stats.NetOutput = getContainerNetIO(libcontainerStats) + + return stats, nil +} + +func loadFactory(root string) (libcontainer.Factory, error) { + abs, err := filepath.Abs(root) + if err != nil { + return nil, err + } + cgroupManager := libcontainer.Cgroupfs + return libcontainer.New(abs, cgroupManager, libcontainer.CriuPath("")) +} + +// getMemory limit returns the memory limit for a given cgroup +// If the configured memory limit is larger than the total memory on the sys, the +// physical system memory size is returned +func getMemLimit(cgroupLimit uint64) uint64 { + si := &syscall.Sysinfo_t{} + err := syscall.Sysinfo(si) + if err != nil { + return cgroupLimit + } + + physicalLimit := uint64(si.Totalram) + if cgroupLimit > physicalLimit { + return physicalLimit + } + return cgroupLimit +} + +// Returns the total number of bytes transmitted and received for the given container stats +func getContainerNetIO(stats *libcontainer.Stats) (received uint64, transmitted uint64) { + for _, iface := range stats.Interfaces { + received += iface.RxBytes + transmitted += iface.TxBytes + } + return +} + +func calculateCPUPercent(stats *libcontainer.Stats, previousCPU, previousSystem uint64) float64 { + var ( + cpuPercent = 0.0 + cpuDelta = float64(stats.CgroupStats.CpuStats.CpuUsage.TotalUsage - previousCPU) + systemDelta = float64(uint64(time.Now().UnixNano()) - previousSystem) + ) + if systemDelta > 0.0 && cpuDelta > 0.0 { + // gets a ratio of container cpu usage total, multiplies it by the number of cores (4 cores running + // at 100% utilization should be 400% utilization), and multiplies that by 100 to get a percentage + cpuPercent = (cpuDelta / systemDelta) * float64(len(stats.CgroupStats.CpuStats.CpuUsage.PercpuUsage)) * 100 + } + return cpuPercent +} + +func calculateBlockIO(stats *libcontainer.Stats) (read uint64, write uint64) { + for _, blkIOEntry := range stats.CgroupStats.BlkioStats.IoServiceBytesRecursive { + switch strings.ToLower(blkIOEntry.Op) { + case "read": + read += blkIOEntry.Value + case "write": + write += blkIOEntry.Value + } + } + return +} diff --git a/server/container_list.go b/server/container_list.go index a6ddd81c..719228f7 100644 --- a/server/container_list.go +++ b/server/container_list.go @@ -31,36 +31,37 @@ func (s *Server) ListContainers(ctx context.Context, req *pb.ListContainersReque logrus.Debugf("ListContainersRequest %+v", req) var ctrs []*pb.Container filter := req.Filter - ctrList := s.ContainerServer.ListContainers() + ctrList, err := s.ContainerServer.ListContainers() + if err != nil { + return nil, err + } // Filter using container id and pod id first. - if filter != nil { - if filter.Id != "" { - id, err := s.CtrIDIndex().Get(filter.Id) - if err != nil { - return nil, err - } - c := s.ContainerServer.GetContainer(id) - if c != nil { - if filter.PodSandboxId != "" { - if c.Sandbox() == filter.PodSandboxId { - ctrList = []*oci.Container{c} - } else { - ctrList = []*oci.Container{} - } - - } else { - ctrList = []*oci.Container{c} - } - } - } else { + if filter.Id != "" { + id, err := s.CtrIDIndex().Get(filter.Id) + if err != nil { + return nil, err + } + c := s.ContainerServer.GetContainer(id) + if c != nil { if filter.PodSandboxId != "" { - pod := s.ContainerServer.GetSandbox(filter.PodSandboxId) - if pod == nil { - ctrList = []*oci.Container{} + if c.Sandbox() == filter.PodSandboxId { + ctrList = []*oci.Container{c} } else { - ctrList = pod.Containers().List() + ctrList = []*oci.Container{} } + + } else { + ctrList = []*oci.Container{c} + } + } + } else { + if filter.PodSandboxId != "" { + pod := s.ContainerServer.GetSandbox(filter.PodSandboxId) + if pod == nil { + ctrList = []*oci.Container{} + } else { + ctrList = pod.Containers().List() } } } diff --git a/test/kpod_stats.bats b/test/kpod_stats.bats new file mode 100644 index 00000000..c9f58cc9 --- /dev/null +++ b/test/kpod_stats.bats @@ -0,0 +1,107 @@ +#!/usr/bin/env bats + +load helpers + +ROOT="$TESTDIR/crio" +RUNROOT="$TESTDIR/crio-run" +KPOD_OPTIONS="--root $ROOT --runroot $RUNROOT $STORAGE_OPTS" + +function teardown() { + cleanup_test +} + +@test "stats single output" { + start_crio + run crioctl pod run --config "$TESTDATA"/sandbox_config.json + echo "$output" + [ "$status" -eq 0 ] + pod_id="$output" + run crioctl ctr create --config "$TESTDATA"/container_redis.json --pod "$pod_id" + echo "$output" + [ "$status" -eq 0 ] + ctr_id="$output" + run crioctl ctr start --id "$ctr_id" + echo "$output" + [ "$status" -eq 0 ] + run ${KPOD_BINARY} $KPOD_OPTIONS stats --no-stream "$ctr_id" + echo "$output" + [ "$status" -eq 0 ] + cleanup_ctrs + cleanup_pods + stop_crio +} + +@test "stats does not output stopped container" { + start_crio + run crioctl pod run --config "$TESTDATA"/sandbox_config.json + echo "$output" + [ "$status" -eq 0 ] + pod_id="$output" + run crioctl ctr create --config "$TESTDATA"/container_redis.json --pod "$pod_id" + echo "$output" + [ "$status" -eq 0 ] + ctr_id="$output" + run ${KPOD_BINARY} $KPOD_OPTIONS stats --no-stream + echo "$output" + [ "$status" -eq 0 ] + cleanup_ctrs + cleanup_pods + stop_crio +} + +@test "stats outputs stopped container with all flag" { + start_crio + run crioctl pod run --config "$TESTDATA"/sandbox_config.json + echo "$output" + [ "$status" -eq 0 ] + pod_id="$output" + run crioctl ctr create --config "$TESTDATA"/container_redis.json --pod "$pod_id" + echo "$output" + [ "$status" -eq 0 ] + ctr_id="$output" + run ${KPOD_BINARY} $KPOD_OPTIONS stats --no-stream --all + echo "$output" + [ "$status" -eq 0 ] + cleanup_ctrs + cleanup_pods + stop_crio +} + +@test "stats output only id" { + start_crio + run crioctl pod run --config "$TESTDATA"/sandbox_config.json + echo "$output" + [ "$status" -eq 0 ] + pod_id="$output" + run crioctl ctr create --config "$TESTDATA"/container_redis.json --pod "$pod_id" + echo "$output" + [ "$status" -eq 0 ] + ctr_id="$output" + run crioctl ctr start --id "$ctr_id" + echo "$output" + [ "$status" -eq 0 ] + run ${KPOD_BINARY} $KPOD_OPTIONS stats --no-stream --format {{.ID}} "$ctr_id" + [ "$status" -eq 0 ] + # once ps is implemented, run ps -q and see if that equals the output from above + cleanup_ctrs + cleanup_pods + stop_crio +} + +@test "stats streaming output" { + start_crio + run crioctl pod run --config "$TESTDATA"/sandbox_config.json + echo "$output" + [ "$status" -eq 0 ] + pod_id="$output" + run crioctl ctr create --config "$TESTDATA"/container_redis.json --pod "$pod_id" + echo "$output" + [ "$status" -eq 0 ] + ctr_id="$output" + run timeout 5s bash -c "${KPOD_BINARY} $KPOD_OPTIONS stats --all" + echo "$output" + [ "$status" -eq 124 ] #124 is the status set by timeout when it has to kill the command at the end of the given time + cleanup_ctrs + cleanup_pods + stop_crio +} diff --git a/vendor.conf b/vendor.conf index 10b3735a..bd3ad3d6 100644 --- a/vendor.conf +++ b/vendor.conf @@ -84,3 +84,4 @@ github.com/hpcloud/tail v1.0.0 gopkg.in/fsnotify.v1 v1.4.2 gopkg.in/tomb.v1 v1 github.com/fatih/camelcase f6a740d52f961c60348ebb109adde9f4635d7540 +github.com/buger/goterm 2f8dfbc7dbbff5dd1d391ed91482c24df243b2d3 diff --git a/vendor/github.com/buger/goterm/README.md b/vendor/github.com/buger/goterm/README.md new file mode 100644 index 00000000..536b7b88 --- /dev/null +++ b/vendor/github.com/buger/goterm/README.md @@ -0,0 +1,119 @@ +## Description + +This library provides basic building blocks for building advanced console UIs. + +Initially created for [Gor](http://github.com/buger/gor). + +Full API documentation: http://godoc.org/github.com/buger/goterm + +## Basic usage + +Full screen console app, printing current time: + +```go +import ( + tm "github.com/buger/goterm" + "time" +) + +func main() { + tm.Clear() // Clear current screen + + for { + // By moving cursor to top-left position we ensure that console output + // will be overwritten each time, instead of adding new. + tm.MoveCursor(1,1) + + tm.Println("Current Time:", time.Now().Format(time.RFC1123)) + + tm.Flush() // Call it every time at the end of rendering + + time.Sleep(time.Second) + } +} +``` + +This can be seen in [examples/time_example.go](examples/time_example.go). To +run it yourself, go into your `$GOPATH/src/github.com/buger/goterm` directory +and run `go run ./examples/time_example.go` + + +Print red bold message on white background: + +```go +tm.Println(tm.Background(tm.Color(tm.Bold("Important header"), tm.RED), tm.WHITE)) +``` + + +Create box and move it to center of the screen: + +```go +tm.Clear() + +// Create Box with 30% width of current screen, and height of 20 lines +box := tm.NewBox(30|tm.PCT, 20, 0) + +// Add some content to the box +// Note that you can add ANY content, even tables +fmt.Fprint(box, "Some box content") + +// Move Box to approx center of the screen +tm.Print(tm.MoveTo(box.String(), 40|tm.PCT, 40|tm.PCT)) + +tm.Flush() +``` + +This can be found in [examples/box_example.go](examples/box_example.go). + +Draw table: + +```go +// Based on http://golang.org/pkg/text/tabwriter +totals := tm.NewTable(0, 10, 5, ' ', 0) +fmt.Fprintf(totals, "Time\tStarted\tActive\tFinished\n") +fmt.Fprintf(totals, "%s\t%d\t%d\t%d\n", "All", started, started-finished, finished) +tm.Println(totals) +tm.Flush() +``` + +This can be found in [examples/table_example.go](examples/table_example.go). + +## Line charts + +Chart example: + +![screen shot 2013-07-09 at 5 05 37 pm](https://f.cloud.github.com/assets/14009/767676/e3dd35aa-e887-11e2-9cd2-f6451eb26adc.png) + + +```go + import ( + tm "github.com/buger/goterm" + ) + + chart := tm.NewLineChart(100, 20) + + data := new(tm.DataTable) + data.addColumn("Time") + data.addColumn("Sin(x)") + data.addColumn("Cos(x+1)") + + for i := 0.1; i < 10; i += 0.1 { + data.addRow(i, math.Sin(i), math.Cos(i+1)) + } + + tm.Println(chart.Draw(data)) +``` + +This can be found in [examples/chart_example.go](examples/chart_example.go). + +Drawing 2 separate graphs in different scales. Each graph have its own Y axe. + +```go +chart.Flags = tm.DRAW_INDEPENDENT +``` + +Drawing graph with relative scale (Grapwh draw starting from min value instead of zero) + +```go +chart.Flags = tm.DRAW_RELATIVE +``` diff --git a/vendor/github.com/buger/goterm/box.go b/vendor/github.com/buger/goterm/box.go new file mode 100644 index 00000000..7df929d7 --- /dev/null +++ b/vendor/github.com/buger/goterm/box.go @@ -0,0 +1,122 @@ +package goterm + +import ( + "bytes" + "strings" +) + +const DEFAULT_BORDER = "- │ ┌ ┐ └ ┘" + +// Box allows you to create independent parts of screen, with its own buffer and borders. +// Can be used for creating modal windows +// +// Generates boxes likes this: +// ┌--------┐ +// │hello │ +// │world │ +// │ │ +// └--------┘ +// +type Box struct { + Buf *bytes.Buffer + + Width int + Height int + + // To get even padding: PaddingX ~= PaddingY*4 + PaddingX int + PaddingY int + + // Should contain 6 border pieces separated by spaces + // + // Example border: + // "- │ ┌ ┐ └ ┘" + Border string + + Flags int // Not used now +} + +// Create new Box. +// Width and height can be relative: +// +// // Create box with 50% with of current screen and 10 lines height +// box := tm.NewBox(50|tm.PCT, 10, 0) +// +func NewBox(width, height int, flags int) *Box { + width, height = GetXY(width, height) + + box := new(Box) + box.Buf = new(bytes.Buffer) + box.Width = width + box.Height = height + box.Border = DEFAULT_BORDER + box.PaddingX = 1 + box.PaddingY = 0 + box.Flags = flags + + return box +} + +func (b *Box) Write(p []byte) (int, error) { + return b.Buf.Write(p) +} + +// Render Box +func (b *Box) String() (out string) { + borders := strings.Split(b.Border, " ") + lines := strings.Split(b.Buf.String(), "\n") + + // Border + padding + prefix := borders[1] + strings.Repeat(" ", b.PaddingX) + suffix := strings.Repeat(" ", b.PaddingX) + borders[1] + + offset := b.PaddingY + 1 // 1 is border width + + // Content width without borders and padding + contentWidth := b.Width - (b.PaddingX+1)*2 + + for y := 0; y < b.Height; y++ { + var line string + + switch { + // Draw borders for first line + case y == 0: + line = borders[2] + strings.Repeat(borders[0], b.Width-2) + borders[3] + + // Draw borders for last line + case y == (b.Height - 1): + line = borders[4] + strings.Repeat(borders[0], b.Width-2) + borders[5] + + // Draw top and bottom padding + case y <= b.PaddingY || y >= (b.Height-b.PaddingY): + line = borders[1] + strings.Repeat(" ", b.Width-2) + borders[1] + + // Render content + default: + if len(lines) > y-offset { + line = lines[y-offset] + } else { + line = "" + } + + if len(line) > contentWidth-1 { + // If line is too large limit it + line = line[0:contentWidth] + } else { + // If line is too small enlarge it by adding spaces + line = line + strings.Repeat(" ", contentWidth-len(line)) + } + + line = prefix + line + suffix + } + + // Don't add newline for last element + if y != b.Height-1 { + line = line + "\n" + } + + out += line + } + + return out +} diff --git a/vendor/github.com/buger/goterm/plot.go b/vendor/github.com/buger/goterm/plot.go new file mode 100644 index 00000000..77b9fb09 --- /dev/null +++ b/vendor/github.com/buger/goterm/plot.go @@ -0,0 +1,328 @@ +package goterm + +import ( + "fmt" + "math" + "strings" +) + +const ( + AXIS_LEFT = iota + AXIS_RIGHT +) + +const ( + DRAW_INDEPENDENT = 1 << iota + DRAW_RELATIVE +) + +type DataTable struct { + columns []string + + rows [][]float64 +} + +func (d *DataTable) AddColumn(name string) { + d.columns = append(d.columns, name) +} + +func (d *DataTable) AddRow(elms ...float64) { + d.rows = append(d.rows, elms) +} + +type Chart interface { + Draw(data DataTable, flags int) string +} + +type LineChart struct { + Buf []string + chartBuf []string + + data *DataTable + + Width int + Height int + + chartHeight int + chartWidth int + + paddingX int + + paddingY int + + Flags int +} + +func genBuf(size int) []string { + buf := make([]string, size) + + for i := 0; i < size; i++ { + buf[i] = " " + } + + return buf +} + +// Format float +func ff(num interface{}) string { + return fmt.Sprintf("%.1f", num) +} + +func NewLineChart(width, height int) *LineChart { + chart := new(LineChart) + chart.Width = width + chart.Height = height + chart.Buf = genBuf(width * height) + + // axis lines + axies text + chart.paddingY = 2 + + return chart +} + +func (c *LineChart) DrawAxes(maxX, minX, maxY, minY float64, index int) { + side := AXIS_LEFT + + if c.Flags&DRAW_INDEPENDENT != 0 { + if index%2 == 0 { + side = AXIS_RIGHT + } + + c.DrawLine(c.paddingX-1, 1, c.Width-c.paddingX, 1, "-") + } else { + c.DrawLine(c.paddingX-1, 1, c.Width-1, 1, "-") + } + + if side == AXIS_LEFT { + c.DrawLine(c.paddingX-1, 1, c.paddingX-1, c.Height-1, "│") + } else { + c.DrawLine(c.Width-c.paddingX, 1, c.Width-c.paddingX, c.Height-1, "│") + } + + left := 0 + if side == AXIS_RIGHT { + left = c.Width - c.paddingX + 1 + } + + if c.Flags&DRAW_RELATIVE != 0 { + c.writeText(ff(minY), left, 1) + } else { + if minY > 0 { + c.writeText("0", left, 1) + } else { + c.writeText(ff(minY), left, 1) + } + } + + c.writeText(ff(maxY), left, c.Height-1) + + c.writeText(ff(minX), c.paddingX, 0) + + x_col := c.data.columns[0] + c.writeText(c.data.columns[0], c.Width/2-len(x_col)/2, 1) + + if c.Flags&DRAW_INDEPENDENT != 0 || len(c.data.columns) < 3 { + col := c.data.columns[index] + + for idx, char := range strings.Split(col, "") { + start_from := c.Height/2 + len(col)/2 - idx + + if side == AXIS_LEFT { + c.writeText(char, c.paddingX-1, start_from) + } else { + c.writeText(char, c.Width-c.paddingX, start_from) + } + } + } + + if c.Flags&DRAW_INDEPENDENT != 0 { + c.writeText(ff(maxX), c.Width-c.paddingX-len(ff(maxX)), 0) + } else { + c.writeText(ff(maxX), c.Width-len(ff(maxX)), 0) + } +} + +func (c *LineChart) writeText(text string, x, y int) { + coord := y*c.Width + x + + for idx, char := range strings.Split(text, "") { + c.Buf[coord+idx] = char + } +} + +func (c *LineChart) Draw(data *DataTable) (out string) { + var scaleY, scaleX float64 + + c.data = data + + if c.Flags&DRAW_INDEPENDENT != 0 && len(data.columns) > 3 { + fmt.Println("Error: Can't use DRAW_INDEPENDENT for more then 2 graphs") + return "" + } + + charts := len(data.columns) - 1 + + prevPoint := [2]int{-1, -1} + + maxX, minX, maxY, minY := getBoundaryValues(data, -1) + + c.paddingX = int(math.Max(float64(len(ff(minY))), float64(len(ff(maxY))))) + 1 + + c.chartHeight = c.Height - c.paddingY + + if c.Flags&DRAW_INDEPENDENT != 0 { + c.chartWidth = c.Width - 2*c.paddingX + } else { + c.chartWidth = c.Width - c.paddingX - 1 + } + + scaleX = float64(c.chartWidth) / (maxX - minX) + + if c.Flags&DRAW_RELATIVE != 0 || minY < 0 { + scaleY = float64(c.chartHeight) / (maxY - minY) + } else { + scaleY = float64(c.chartHeight) / maxY + } + + for i := 1; i < charts+1; i++ { + if c.Flags&DRAW_INDEPENDENT != 0 { + maxX, minX, maxY, minY = getBoundaryValues(data, i) + + scaleX = float64(c.chartWidth-1) / (maxX - minX) + scaleY = float64(c.chartHeight) / maxY + + if c.Flags&DRAW_RELATIVE != 0 || minY < 0 { + scaleY = float64(c.chartHeight) / (maxY - minY) + } + } + + symbol := Color("•", i) + + c_data := getChartData(data, i) + + for _, point := range c_data { + x := int((point[0]-minX)*scaleX) + c.paddingX + y := int((point[1])*scaleY) + c.paddingY + + if c.Flags&DRAW_RELATIVE != 0 || minY < 0 { + y = int((point[1]-minY)*scaleY) + c.paddingY + } + + if prevPoint[0] == -1 { + prevPoint[0] = x + prevPoint[1] = y + } + + if prevPoint[0] <= x { + c.DrawLine(prevPoint[0], prevPoint[1], x, y, symbol) + } + + prevPoint[0] = x + prevPoint[1] = y + } + + c.DrawAxes(maxX, minX, maxY, minY, i) + } + + for row := c.Height - 1; row >= 0; row-- { + out += strings.Join(c.Buf[row*c.Width:(row+1)*c.Width], "") + "\n" + } + + return +} + +func (c *LineChart) DrawLine(x0, y0, x1, y1 int, symbol string) { + drawLine(x0, y0, x1, y1, func(x, y int) { + coord := y*c.Width + x + + if coord > 0 && coord < len(c.Buf) { + c.Buf[coord] = symbol + } + }) +} + +func getBoundaryValues(data *DataTable, index int) (maxX, minX, maxY, minY float64) { + maxX = data.rows[0][0] + minX = data.rows[0][0] + maxY = data.rows[0][1] + minY = data.rows[0][1] + + for _, r := range data.rows { + maxX = math.Max(maxX, r[0]) + minX = math.Min(minX, r[0]) + + for idx, c := range r { + if idx > 0 { + if index == -1 || index == idx { + maxY = math.Max(maxY, c) + minY = math.Min(minY, c) + } + } + } + } + + if maxY > 0 { + maxY = maxY * 1.1 + } else { + maxY = maxY * 0.9 + } + + if minY > 0 { + minY = minY * 0.9 + } else { + minY = minY * 1.1 + } + + return +} + +// DataTable can contain data for multiple graphs, we need to extract only 1 +func getChartData(data *DataTable, index int) (out [][]float64) { + for _, r := range data.rows { + out = append(out, []float64{r[0], r[index]}) + } + + return +} + +// Algorithm for drawing line between two points +// +// http://en.wikipedia.org/wiki/Bresenham's_line_algorithm +func drawLine(x0, y0, x1, y1 int, plot func(int, int)) { + dx := x1 - x0 + if dx < 0 { + dx = -dx + } + dy := y1 - y0 + if dy < 0 { + dy = -dy + } + var sx, sy int + if x0 < x1 { + sx = 1 + } else { + sx = -1 + } + if y0 < y1 { + sy = 1 + } else { + sy = -1 + } + err := dx - dy + + for { + plot(x0, y0) + if x0 == x1 && y0 == y1 { + break + } + e2 := 2 * err + if e2 > -dy { + err -= dy + x0 += sx + } + if e2 < dx { + err += dx + y0 += sy + } + } +} diff --git a/vendor/github.com/buger/goterm/table.go b/vendor/github.com/buger/goterm/table.go new file mode 100644 index 00000000..d8dae55c --- /dev/null +++ b/vendor/github.com/buger/goterm/table.go @@ -0,0 +1,34 @@ +package goterm + +import ( + "bytes" + "text/tabwriter" +) + +// Tabwriter with own buffer: +// +// totals := tm.NewTable(0, 10, 5, ' ', 0) +// fmt.Fprintf(totals, "Time\tStarted\tActive\tFinished\n") +// fmt.Fprintf(totals, "%s\t%d\t%d\t%d\n", "All", started, started-finished, finished) +// tm.Println(totals) +// +// Based on http://golang.org/pkg/text/tabwriter +type Table struct { + tabwriter.Writer + + Buf *bytes.Buffer +} + +// Same as here http://golang.org/pkg/text/tabwriter/#Writer.Init +func NewTable(minwidth, tabwidth, padding int, padchar byte, flags uint) *Table { + tbl := new(Table) + tbl.Buf = new(bytes.Buffer) + tbl.Init(tbl.Buf, minwidth, tabwidth, padding, padchar, flags) + + return tbl +} + +func (t *Table) String() string { + t.Flush() + return t.Buf.String() +} diff --git a/vendor/github.com/buger/goterm/terminal.go b/vendor/github.com/buger/goterm/terminal.go new file mode 100644 index 00000000..6b45c78b --- /dev/null +++ b/vendor/github.com/buger/goterm/terminal.go @@ -0,0 +1,258 @@ +// Provides basic bulding blocks for advanced console UI +// +// Coordinate system: +// +// 1/1---X----> +// | +// Y +// | +// v +// +// Documentation for ANSI codes: http://en.wikipedia.org/wiki/ANSI_escape_code#Colors +// +// Inspired by: http://www.darkcoding.net/software/pretty-command-line-console-output-on-unix-in-python-and-go-lang/ +package goterm + +import ( + "bufio" + "bytes" + "fmt" + "os" + "strings" +) + +// Reset all custom styles +const RESET = "\033[0m" + +// Reset to default color +const RESET_COLOR = "\033[32m" + +// Return curor to start of line and clean it +const RESET_LINE = "\r\033[K" + +// List of possible colors +const ( + BLACK = iota + RED + GREEN + YELLOW + BLUE + MAGENTA + CYAN + WHITE +) + +var Output *bufio.Writer = bufio.NewWriter(os.Stdout) + +func getColor(code int) string { + return fmt.Sprintf("\033[3%dm", code) +} + +func getBgColor(code int) string { + return fmt.Sprintf("\033[4%dm", code) +} + +// Set percent flag: num | PCT +// +// Check percent flag: num & PCT +// +// Reset percent flag: num & 0xFF +const shift = uint(^uint(0)>>63) << 4 +const PCT = 0x8000 << shift + +type winsize struct { + Row uint16 + Col uint16 + Xpixel uint16 + Ypixel uint16 +} + +// Global screen buffer +// Its not recommented write to buffer dirrectly, use package Print,Printf,Println fucntions instead. +var Screen *bytes.Buffer = new(bytes.Buffer) + +// Get relative or absolute coorditantes +// To get relative, set PCT flag to number: +// +// // Get 10% of total width to `x` and 20 to y +// x, y = tm.GetXY(10|tm.PCT, 20) +// +func GetXY(x int, y int) (int, int) { + if y == -1 { + y = CurrentHeight() + 1 + } + + if x&PCT != 0 { + x = int((x & 0xFF) * Width() / 100) + } + + if y&PCT != 0 { + y = int((y & 0xFF) * Height() / 100) + } + + return x, y +} + +type sf func(int, string) string + +// Apply given transformation func for each line in string +func applyTransform(str string, transform sf) (out string) { + out = "" + + for idx, line := range strings.Split(str, "\n") { + out += transform(idx, line) + } + + return +} + +// Clear screen +func Clear() { + Output.WriteString("\033[2J") +} + +// Move cursor to given position +func MoveCursor(x int, y int) { + fmt.Fprintf(Screen, "\033[%d;%dH", x, y) +} + +// Move cursor up relative the current position +func MoveCursorUp(bias int) { + fmt.Fprintf(Screen, "\033[%dA", bias) +} + +// Move cursor down relative the current position +func MoveCursorDown(bias int) { + fmt.Fprintf(Screen, "\033[%dB", bias) +} + +// Move cursor forward relative the current position +func MoveCursorForward(bias int) { + fmt.Fprintf(Screen, "\033[%dC", bias) +} + +// Move cursor backward relative the current position +func MoveCursorBackward(bias int) { + fmt.Fprintf(Screen, "\033[%dD", bias) +} + +// Move string to possition +func MoveTo(str string, x int, y int) (out string) { + x, y = GetXY(x, y) + + return applyTransform(str, func(idx int, line string) string { + return fmt.Sprintf("\033[%d;%dH%s", y+idx, x, line) + }) +} + +// Return carrier to start of line +func ResetLine(str string) (out string) { + return applyTransform(str, func(idx int, line string) string { + return fmt.Sprintf(RESET_LINE, line) + }) +} + +// Make bold +func Bold(str string) string { + return applyTransform(str, func(idx int, line string) string { + return fmt.Sprintf("\033[1m%s\033[0m", line) + }) +} + +// Apply given color to string: +// +// tm.Color("RED STRING", tm.RED) +// +func Color(str string, color int) string { + return applyTransform(str, func(idx int, line string) string { + return fmt.Sprintf("%s%s%s", getColor(color), line, RESET) + }) +} + +func Highlight(str, substr string, color int) string { + hiSubstr := Color(substr, color) + return strings.Replace(str, substr, hiSubstr, -1) +} + +func HighlightRegion(str string, from, to, color int) string { + return str[:from] + Color(str[from:to], color) + str[to:] +} + +// Change background color of string: +// +// tm.Background("string", tm.RED) +// +func Background(str string, color int) string { + return applyTransform(str, func(idx int, line string) string { + return fmt.Sprintf("%s%s%s", getBgColor(color), line, RESET) + }) +} + +// Get console width +func Width() int { + ws, err := getWinsize() + + if err != nil { + return -1 + } + + return int(ws.Col) +} + +// Get console height +func Height() int { + ws, err := getWinsize() + if err != nil { + return -1 + } + return int(ws.Row) +} + +// Get current height. Line count in Screen buffer. +func CurrentHeight() int { + return strings.Count(Screen.String(), "\n") +} + +// Flush buffer and ensure that it will not overflow screen +func Flush() { + for idx, str := range strings.Split(Screen.String(), "\n") { + if idx > Height() { + return + } + + Output.WriteString(str + "\n") + } + + Output.Flush() + Screen.Reset() +} + +func Print(a ...interface{}) (n int, err error) { + return fmt.Fprint(Screen, a...) +} + +func Println(a ...interface{}) (n int, err error) { + return fmt.Fprintln(Screen, a...) +} + +func Printf(format string, a ...interface{}) (n int, err error) { + return fmt.Fprintf(Screen, format, a...) +} + +func Context(data string, idx, max int) string { + var start, end int + + if len(data[:idx]) < (max / 2) { + start = 0 + } else { + start = idx - max/2 + } + + if len(data)-idx < (max / 2) { + end = len(data) - 1 + } else { + end = idx + max/2 + } + + return data[start:end] +} diff --git a/vendor/github.com/buger/goterm/terminal_nosysioctl.go b/vendor/github.com/buger/goterm/terminal_nosysioctl.go new file mode 100644 index 00000000..69061500 --- /dev/null +++ b/vendor/github.com/buger/goterm/terminal_nosysioctl.go @@ -0,0 +1,12 @@ +// +build windows plan9 solaris + +package goterm + +func getWinsize() (*winsize, error) { + ws := new(winsize) + + ws.Col = 80 + ws.Row = 24 + + return ws, nil +} diff --git a/vendor/github.com/buger/goterm/terminal_sysioctl.go b/vendor/github.com/buger/goterm/terminal_sysioctl.go new file mode 100644 index 00000000..e98430fb --- /dev/null +++ b/vendor/github.com/buger/goterm/terminal_sysioctl.go @@ -0,0 +1,36 @@ +// +build !windows,!plan9,!solaris + +package goterm + +import ( + "fmt" + "os" + "runtime" + "syscall" + "unsafe" +) + +func getWinsize() (*winsize, error) { + ws := new(winsize) + + var _TIOCGWINSZ int64 + + switch runtime.GOOS { + case "linux": + _TIOCGWINSZ = 0x5413 + case "darwin": + _TIOCGWINSZ = 1074295912 + } + + r1, _, errno := syscall.Syscall(syscall.SYS_IOCTL, + uintptr(syscall.Stdin), + uintptr(_TIOCGWINSZ), + uintptr(unsafe.Pointer(ws)), + ) + + if int(r1) == -1 { + fmt.Println("Error:", os.NewSyscallError("GetWinsize", errno)) + return nil, os.NewSyscallError("GetWinsize", errno) + } + return ws, nil +} diff --git a/vendor/github.com/mrunalp/fileutils/LICENSE b/vendor/github.com/mrunalp/fileutils/LICENSE new file mode 100644 index 00000000..27448585 --- /dev/null +++ b/vendor/github.com/mrunalp/fileutils/LICENSE @@ -0,0 +1,191 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + Copyright 2014 Docker, Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/vendor/github.com/mrunalp/fileutils/README.md b/vendor/github.com/mrunalp/fileutils/README.md new file mode 100644 index 00000000..6cb4140e --- /dev/null +++ b/vendor/github.com/mrunalp/fileutils/README.md @@ -0,0 +1,5 @@ +# fileutils + +Collection of utilities for file manipulation in golang + +The library is based on docker pkg/archive pkg/idtools but does copies instead of handling archive formats. diff --git a/vendor/github.com/mrunalp/fileutils/fileutils.go b/vendor/github.com/mrunalp/fileutils/fileutils.go new file mode 100644 index 00000000..b60cb909 --- /dev/null +++ b/vendor/github.com/mrunalp/fileutils/fileutils.go @@ -0,0 +1,161 @@ +package fileutils + +import ( + "fmt" + "io" + "os" + "path/filepath" + "syscall" +) + +// CopyFile copies the file at source to dest +func CopyFile(source string, dest string) error { + si, err := os.Lstat(source) + if err != nil { + return err + } + + st, ok := si.Sys().(*syscall.Stat_t) + if !ok { + return fmt.Errorf("could not convert to syscall.Stat_t") + } + + uid := int(st.Uid) + gid := int(st.Gid) + + // Handle symlinks + if si.Mode()&os.ModeSymlink != 0 { + target, err := os.Readlink(source) + if err != nil { + return err + } + if err := os.Symlink(target, dest); err != nil { + return err + } + } + + // Handle device files + if st.Mode&syscall.S_IFMT == syscall.S_IFBLK || st.Mode&syscall.S_IFMT == syscall.S_IFCHR { + devMajor := int64(major(uint64(st.Rdev))) + devMinor := int64(minor(uint64(st.Rdev))) + mode := uint32(si.Mode() & 07777) + if st.Mode&syscall.S_IFMT == syscall.S_IFBLK { + mode |= syscall.S_IFBLK + } + if st.Mode&syscall.S_IFMT == syscall.S_IFCHR { + mode |= syscall.S_IFCHR + } + if err := syscall.Mknod(dest, mode, int(mkdev(devMajor, devMinor))); err != nil { + return err + } + } + + // Handle regular files + if si.Mode().IsRegular() { + sf, err := os.Open(source) + if err != nil { + return err + } + defer sf.Close() + + df, err := os.Create(dest) + if err != nil { + return err + } + defer df.Close() + + _, err = io.Copy(df, sf) + if err != nil { + return err + } + } + + // Chown the file + if err := os.Lchown(dest, uid, gid); err != nil { + return err + } + + // Chmod the file + if !(si.Mode()&os.ModeSymlink == os.ModeSymlink) { + if err := os.Chmod(dest, si.Mode()); err != nil { + return err + } + } + + return nil +} + +// CopyDirectory copies the files under the source directory +// to dest directory. The dest directory is created if it +// does not exist. +func CopyDirectory(source string, dest string) error { + fi, err := os.Stat(source) + if err != nil { + return err + } + + // Get owner. + st, ok := fi.Sys().(*syscall.Stat_t) + if !ok { + return fmt.Errorf("could not convert to syscall.Stat_t") + } + + // We have to pick an owner here anyway. + if err := MkdirAllNewAs(dest, fi.Mode(), int(st.Uid), int(st.Gid)); err != nil { + return err + } + + return filepath.Walk(source, func(path string, info os.FileInfo, err error) error { + if err != nil { + return err + } + + // Get the relative path + relPath, err := filepath.Rel(source, path) + if err != nil { + return nil + } + + if info.IsDir() { + // Skip the source directory. + if path != source { + // Get the owner. + st, ok := info.Sys().(*syscall.Stat_t) + if !ok { + return fmt.Errorf("could not convert to syscall.Stat_t") + } + + uid := int(st.Uid) + gid := int(st.Gid) + + if err := os.Mkdir(filepath.Join(dest, relPath), info.Mode()); err != nil { + return err + } + + if err := os.Lchown(filepath.Join(dest, relPath), uid, gid); err != nil { + return err + } + } + return nil + } + + // Copy the file. + if err := CopyFile(path, filepath.Join(dest, relPath)); err != nil { + return err + } + + return nil + }) +} + +func major(device uint64) uint64 { + return (device >> 8) & 0xfff +} + +func minor(device uint64) uint64 { + return (device & 0xff) | ((device >> 12) & 0xfff00) +} + +func mkdev(major int64, minor int64) uint32 { + return uint32(((minor & 0xfff00) << 12) | ((major & 0xfff) << 8) | (minor & 0xff)) +} diff --git a/vendor/github.com/mrunalp/fileutils/idtools.go b/vendor/github.com/mrunalp/fileutils/idtools.go new file mode 100644 index 00000000..161aec8f --- /dev/null +++ b/vendor/github.com/mrunalp/fileutils/idtools.go @@ -0,0 +1,49 @@ +package fileutils + +import ( + "os" + "path/filepath" +) + +// MkdirAllNewAs creates a directory (include any along the path) and then modifies +// ownership ONLY of newly created directories to the requested uid/gid. If the +// directories along the path exist, no change of ownership will be performed +func MkdirAllNewAs(path string, mode os.FileMode, ownerUID, ownerGID int) error { + // make an array containing the original path asked for, plus (for mkAll == true) + // all path components leading up to the complete path that don't exist before we MkdirAll + // so that we can chown all of them properly at the end. If chownExisting is false, we won't + // chown the full directory path if it exists + var paths []string + if _, err := os.Stat(path); err != nil && os.IsNotExist(err) { + paths = []string{path} + } else if err == nil { + // nothing to do; directory path fully exists already + return nil + } + + // walk back to "/" looking for directories which do not exist + // and add them to the paths array for chown after creation + dirPath := path + for { + dirPath = filepath.Dir(dirPath) + if dirPath == "/" { + break + } + if _, err := os.Stat(dirPath); err != nil && os.IsNotExist(err) { + paths = append(paths, dirPath) + } + } + + if err := os.MkdirAll(path, mode); err != nil && !os.IsExist(err) { + return err + } + + // even if it existed, we will chown the requested path + any subpaths that + // didn't exist when we called MkdirAll + for _, pathComponent := range paths { + if err := os.Chown(pathComponent, ownerUID, ownerGID); err != nil { + return err + } + } + return nil +} diff --git a/vendor/github.com/opencontainers/runc/libcontainer/container_linux.go b/vendor/github.com/opencontainers/runc/libcontainer/container_linux.go index 7a319ef8..d7e7516e 100644 --- a/vendor/github.com/opencontainers/runc/libcontainer/container_linux.go +++ b/vendor/github.com/opencontainers/runc/libcontainer/container_linux.go @@ -18,17 +18,17 @@ import ( "syscall" // only for SysProcAttr and Signal "time" - "golang.org/x/sys/unix" - - "github.com/Sirupsen/logrus" - "github.com/golang/protobuf/proto" "github.com/opencontainers/runc/libcontainer/cgroups" "github.com/opencontainers/runc/libcontainer/configs" "github.com/opencontainers/runc/libcontainer/criurpc" "github.com/opencontainers/runc/libcontainer/system" "github.com/opencontainers/runc/libcontainer/utils" + + "github.com/golang/protobuf/proto" + "github.com/sirupsen/logrus" "github.com/syndtr/gocapability/capability" "github.com/vishvananda/netlink/nl" + "golang.org/x/sys/unix" ) const stdioFdCount = 3 @@ -546,7 +546,8 @@ func (c *linuxContainer) checkCriuFeatures(criuOpts *CriuOpts, rpcOpts *criurpc. var t criurpc.CriuReqType t = criurpc.CriuReqType_FEATURE_CHECK - if err := c.checkCriuVersion("1.8"); err != nil { + // criu 1.8 => 10800 + if err := c.checkCriuVersion(10800); err != nil { // Feature checking was introduced with CRIU 1.8. // Ignore the feature check if an older CRIU version is used // and just act as before. @@ -589,19 +590,12 @@ func (c *linuxContainer) checkCriuFeatures(criuOpts *CriuOpts, rpcOpts *criurpc. return nil } -// checkCriuVersion checks Criu version greater than or equal to minVersion -func (c *linuxContainer) checkCriuVersion(minVersion string) error { - var x, y, z, versionReq int +func parseCriuVersion(path string) (int, error) { + var x, y, z int - _, err := fmt.Sscanf(minVersion, "%d.%d.%d\n", &x, &y, &z) // 1.5.2 + out, err := exec.Command(path, "-V").Output() if err != nil { - _, err = fmt.Sscanf(minVersion, "Version: %d.%d\n", &x, &y) // 1.6 - } - versionReq = x*10000 + y*100 + z - - out, err := exec.Command(c.criuPath, "-V").Output() - if err != nil { - return fmt.Errorf("Unable to execute CRIU command: %s", c.criuPath) + return 0, fmt.Errorf("Unable to execute CRIU command: %s", path) } x = 0 @@ -613,7 +607,7 @@ func (c *linuxContainer) checkCriuVersion(minVersion string) error { if sp := strings.Index(string(out), "GitID"); sp > 0 { version = string(out)[sp:ep] } else { - return fmt.Errorf("Unable to parse the CRIU version: %s", c.criuPath) + return 0, fmt.Errorf("Unable to parse the CRIU version: %s", path) } n, err := fmt.Sscanf(string(version), "GitID: v%d.%d.%d", &x, &y, &z) // 1.5.2 @@ -624,7 +618,7 @@ func (c *linuxContainer) checkCriuVersion(minVersion string) error { z++ } if n < 2 || err != nil { - return fmt.Errorf("Unable to parse the CRIU version: %s %d %s", version, n, err) + return 0, fmt.Errorf("Unable to parse the CRIU version: %s %d %s", version, n, err) } } else { // criu release version format @@ -633,19 +627,81 @@ func (c *linuxContainer) checkCriuVersion(minVersion string) error { n, err = fmt.Sscanf(string(out), "Version: %d.%d\n", &x, &y) // 1.6 } if n < 2 || err != nil { - return fmt.Errorf("Unable to parse the CRIU version: %s %d %s", out, n, err) + return 0, fmt.Errorf("Unable to parse the CRIU version: %s %d %s", out, n, err) } } - c.criuVersion = x*10000 + y*100 + z + return x*10000 + y*100 + z, nil +} - if c.criuVersion < versionReq { - return fmt.Errorf("CRIU version %d must be %d or higher", c.criuVersion, versionReq) +func compareCriuVersion(criuVersion int, minVersion int) error { + // simple function to perform the actual version compare + if criuVersion < minVersion { + return fmt.Errorf("CRIU version %d must be %d or higher", criuVersion, minVersion) } return nil } +// This is used to store the result of criu version RPC +var criuVersionRPC *criurpc.CriuVersion + +// checkCriuVersion checks Criu version greater than or equal to minVersion +func (c *linuxContainer) checkCriuVersion(minVersion int) error { + + // If the version of criu has already been determined there is no need + // to ask criu for the version again. Use the value from c.criuVersion. + if c.criuVersion != 0 { + return compareCriuVersion(c.criuVersion, minVersion) + } + + // First try if this version of CRIU support the version RPC. + // The CRIU version RPC was introduced with CRIU 3.0. + + // First, reset the variable for the RPC answer to nil + criuVersionRPC = nil + + var t criurpc.CriuReqType + t = criurpc.CriuReqType_VERSION + req := &criurpc.CriuReq{ + Type: &t, + } + + err := c.criuSwrk(nil, req, nil, false) + if err != nil { + return fmt.Errorf("CRIU version check failed: %s", err) + } + + if criuVersionRPC != nil { + logrus.Debugf("CRIU version: %s", criuVersionRPC) + // major and minor are always set + c.criuVersion = int(*criuVersionRPC.Major) * 10000 + c.criuVersion += int(*criuVersionRPC.Minor) * 100 + if criuVersionRPC.Sublevel != nil { + c.criuVersion += int(*criuVersionRPC.Sublevel) + } + if criuVersionRPC.Gitid != nil { + // runc's convention is that a CRIU git release is + // always the same as increasing the minor by 1 + c.criuVersion -= (c.criuVersion % 100) + c.criuVersion += 100 + } + return compareCriuVersion(c.criuVersion, minVersion) + } + + // This is CRIU without the version RPC and therefore + // older than 3.0. Parsing the output is required. + + // This can be remove once runc does not work with criu older than 3.0 + + c.criuVersion, err = parseCriuVersion(c.criuPath) + if err != nil { + return err + } + + return compareCriuVersion(c.criuVersion, minVersion) +} + const descriptorsFilename = "descriptors.json" func (c *linuxContainer) addCriuDumpMount(req *criurpc.CriuReq, m *configs.Mount) { @@ -695,7 +751,8 @@ func (c *linuxContainer) Checkpoint(criuOpts *CriuOpts) error { return fmt.Errorf("cannot checkpoint a rootless container") } - if err := c.checkCriuVersion("1.5.2"); err != nil { + // criu 1.5.2 => 10502 + if err := c.checkCriuVersion(10502); err != nil { return err } @@ -768,7 +825,8 @@ func (c *linuxContainer) Checkpoint(criuOpts *CriuOpts) error { // append optional manage cgroups mode if criuOpts.ManageCgroupsMode != 0 { - if err := c.checkCriuVersion("1.7"); err != nil { + // criu 1.7 => 10700 + if err := c.checkCriuVersion(10700); err != nil { return err } mode := criurpc.CriuCgMode(criuOpts.ManageCgroupsMode) @@ -800,7 +858,6 @@ func (c *linuxContainer) Checkpoint(criuOpts *CriuOpts) error { switch m.Device { case "bind": c.addCriuDumpMount(req, m) - break case "cgroup": binds, err := getCgroupMounts(m) if err != nil { @@ -809,7 +866,6 @@ func (c *linuxContainer) Checkpoint(criuOpts *CriuOpts) error { for _, b := range binds { c.addCriuDumpMount(req, b) } - break } } @@ -862,9 +918,8 @@ func (c *linuxContainer) restoreNetwork(req *criurpc.CriuReq, criuOpts *CriuOpts veth.IfOut = proto.String(iface.HostInterfaceName) veth.IfIn = proto.String(iface.Name) req.Opts.Veths = append(req.Opts.Veths, veth) - break case "loopback": - break + // Do nothing } } for _, i := range criuOpts.VethPairs { @@ -885,7 +940,8 @@ func (c *linuxContainer) Restore(process *Process, criuOpts *CriuOpts) error { return fmt.Errorf("cannot restore a rootless container") } - if err := c.checkCriuVersion("1.5.2"); err != nil { + // criu 1.5.2 => 10502 + if err := c.checkCriuVersion(10502); err != nil { return err } if criuOpts.WorkDirectory == "" { @@ -954,7 +1010,6 @@ func (c *linuxContainer) Restore(process *Process, criuOpts *CriuOpts) error { switch m.Device { case "bind": c.addCriuRestoreMount(req, m) - break case "cgroup": binds, err := getCgroupMounts(m) if err != nil { @@ -963,7 +1018,6 @@ func (c *linuxContainer) Restore(process *Process, criuOpts *CriuOpts) error { for _, b := range binds { c.addCriuRestoreMount(req, b) } - break } } @@ -983,7 +1037,8 @@ func (c *linuxContainer) Restore(process *Process, criuOpts *CriuOpts) error { // append optional manage cgroups mode if criuOpts.ManageCgroupsMode != 0 { - if err := c.checkCriuVersion("1.7"); err != nil { + // criu 1.7 => 10700 + if err := c.checkCriuVersion(10700); err != nil { return err } mode := criurpc.CriuCgMode(criuOpts.ManageCgroupsMode) @@ -1045,7 +1100,14 @@ func (c *linuxContainer) criuSwrk(process *Process, req *criurpc.CriuReq, opts * return err } - logPath := filepath.Join(opts.WorkDirectory, req.GetOpts().GetLogFile()) + var logPath string + if opts != nil { + logPath = filepath.Join(opts.WorkDirectory, req.GetOpts().GetLogFile()) + } else { + // For the VERSION RPC 'opts' is set to 'nil' and therefore + // opts.WorkDirectory does not exist. Set logPath to "". + logPath = "" + } criuClient := os.NewFile(uintptr(fds[0]), "criu-transport-client") criuClientFileCon, err := net.FileConn(criuClient) criuClient.Close() @@ -1060,7 +1122,11 @@ func (c *linuxContainer) criuSwrk(process *Process, req *criurpc.CriuReq, opts * defer criuServer.Close() args := []string{"swrk", "3"} - logrus.Debugf("Using CRIU %d at: %s", c.criuVersion, c.criuPath) + if c.criuVersion != 0 { + // If the CRIU Version is still '0' then this is probably + // the initial CRIU run to detect the version. Skip it. + logrus.Debugf("Using CRIU %d at: %s", c.criuVersion, c.criuPath) + } logrus.Debugf("Using CRIU with following args: %s", args) cmd := exec.Command(c.criuPath, args...) if process != nil { @@ -1101,8 +1167,11 @@ func (c *linuxContainer) criuSwrk(process *Process, req *criurpc.CriuReq, opts * logrus.Debugf("Using CRIU in %s mode", req.GetType().String()) // In the case of criurpc.CriuReqType_FEATURE_CHECK req.GetOpts() // should be empty. For older CRIU versions it still will be - // available but empty. - if req.GetType() != criurpc.CriuReqType_FEATURE_CHECK { + // available but empty. criurpc.CriuReqType_VERSION actually + // has no req.GetOpts(). + if !(req.GetType() == criurpc.CriuReqType_FEATURE_CHECK || + req.GetType() == criurpc.CriuReqType_VERSION) { + val := reflect.ValueOf(req.GetOpts()) v := reflect.Indirect(val) for i := 0; i < v.NumField(); i++ { @@ -1145,15 +1214,23 @@ func (c *linuxContainer) criuSwrk(process *Process, req *criurpc.CriuReq, opts * } if !resp.GetSuccess() { typeString := req.GetType().String() + if typeString == "VERSION" { + // If the VERSION RPC fails this probably means that the CRIU + // version is too old for this RPC. Just return 'nil'. + return nil + } return fmt.Errorf("criu failed: type %s errno %d\nlog file: %s", typeString, resp.GetCrErrno(), logPath) } t := resp.GetType() switch { + case t == criurpc.CriuReqType_VERSION: + logrus.Debugf("CRIU version: %s", resp) + criuVersionRPC = resp.GetVersion() + break case t == criurpc.CriuReqType_FEATURE_CHECK: logrus.Debugf("Feature check says: %s", resp) criuFeatures = resp.GetFeatures() - break case t == criurpc.CriuReqType_NOTIFY: if err := c.criuNotifications(resp, process, opts, extFds, oob[:oobn]); err != nil { return err @@ -1295,6 +1372,9 @@ func (c *linuxContainer) criuNotifications(resp *criurpc.CriuResp, process *Proc return err } fds, err := unix.ParseUnixRights(&scm[0]) + if err != nil { + return err + } master := os.NewFile(uintptr(fds[0]), "orphan-pts-master") defer master.Close() diff --git a/vendor/github.com/opencontainers/runc/libcontainer/criurpc/criurpc.pb.go b/vendor/github.com/opencontainers/runc/libcontainer/criurpc/criurpc.pb.go index 1e5311bf..21af9db9 100644 --- a/vendor/github.com/opencontainers/runc/libcontainer/criurpc/criurpc.pb.go +++ b/vendor/github.com/opencontainers/runc/libcontainer/criurpc/criurpc.pb.go @@ -23,6 +23,7 @@ It has these top-level messages: CriuFeatures CriuReq CriuResp + CriuVersion */ package criurpc @@ -103,19 +104,21 @@ const ( CriuReqType_CPUINFO_DUMP CriuReqType = 7 CriuReqType_CPUINFO_CHECK CriuReqType = 8 CriuReqType_FEATURE_CHECK CriuReqType = 9 + CriuReqType_VERSION CriuReqType = 10 ) var CriuReqType_name = map[int32]string{ - 0: "EMPTY", - 1: "DUMP", - 2: "RESTORE", - 3: "CHECK", - 4: "PRE_DUMP", - 5: "PAGE_SERVER", - 6: "NOTIFY", - 7: "CPUINFO_DUMP", - 8: "CPUINFO_CHECK", - 9: "FEATURE_CHECK", + 0: "EMPTY", + 1: "DUMP", + 2: "RESTORE", + 3: "CHECK", + 4: "PRE_DUMP", + 5: "PAGE_SERVER", + 6: "NOTIFY", + 7: "CPUINFO_DUMP", + 8: "CPUINFO_CHECK", + 9: "FEATURE_CHECK", + 10: "VERSION", } var CriuReqType_value = map[string]int32{ "EMPTY": 0, @@ -128,6 +131,7 @@ var CriuReqType_value = map[string]int32{ "CPUINFO_DUMP": 7, "CPUINFO_CHECK": 8, "FEATURE_CHECK": 9, + "VERSION": 10, } func (x CriuReqType) Enum() *CriuReqType { @@ -190,8 +194,8 @@ func (m *CriuPageServerInfo) GetFd() int32 { } type CriuVethPair struct { - IfIn *string `protobuf:"bytes,1,req,name=if_in" json:"if_in,omitempty"` - IfOut *string `protobuf:"bytes,2,req,name=if_out" json:"if_out,omitempty"` + IfIn *string `protobuf:"bytes,1,req,name=if_in,json=ifIn" json:"if_in,omitempty"` + IfOut *string `protobuf:"bytes,2,req,name=if_out,json=ifOut" json:"if_out,omitempty"` XXX_unrecognized []byte `json:"-"` } @@ -241,8 +245,8 @@ func (m *ExtMountMap) GetVal() string { type JoinNamespace struct { Ns *string `protobuf:"bytes,1,req,name=ns" json:"ns,omitempty"` - NsFile *string `protobuf:"bytes,2,req,name=ns_file" json:"ns_file,omitempty"` - ExtraOpt *string `protobuf:"bytes,3,opt,name=extra_opt" json:"extra_opt,omitempty"` + NsFile *string `protobuf:"bytes,2,req,name=ns_file,json=nsFile" json:"ns_file,omitempty"` + ExtraOpt *string `protobuf:"bytes,3,opt,name=extra_opt,json=extraOpt" json:"extra_opt,omitempty"` XXX_unrecognized []byte `json:"-"` } @@ -340,55 +344,55 @@ func (m *UnixSk) GetInode() uint32 { } type CriuOpts struct { - ImagesDirFd *int32 `protobuf:"varint,1,req,name=images_dir_fd" json:"images_dir_fd,omitempty"` + ImagesDirFd *int32 `protobuf:"varint,1,req,name=images_dir_fd,json=imagesDirFd" json:"images_dir_fd,omitempty"` Pid *int32 `protobuf:"varint,2,opt,name=pid" json:"pid,omitempty"` - LeaveRunning *bool `protobuf:"varint,3,opt,name=leave_running" json:"leave_running,omitempty"` - ExtUnixSk *bool `protobuf:"varint,4,opt,name=ext_unix_sk" json:"ext_unix_sk,omitempty"` - TcpEstablished *bool `protobuf:"varint,5,opt,name=tcp_established" json:"tcp_established,omitempty"` - EvasiveDevices *bool `protobuf:"varint,6,opt,name=evasive_devices" json:"evasive_devices,omitempty"` - ShellJob *bool `protobuf:"varint,7,opt,name=shell_job" json:"shell_job,omitempty"` - FileLocks *bool `protobuf:"varint,8,opt,name=file_locks" json:"file_locks,omitempty"` - LogLevel *int32 `protobuf:"varint,9,opt,name=log_level,def=2" json:"log_level,omitempty"` - LogFile *string `protobuf:"bytes,10,opt,name=log_file" json:"log_file,omitempty"` + LeaveRunning *bool `protobuf:"varint,3,opt,name=leave_running,json=leaveRunning" json:"leave_running,omitempty"` + ExtUnixSk *bool `protobuf:"varint,4,opt,name=ext_unix_sk,json=extUnixSk" json:"ext_unix_sk,omitempty"` + TcpEstablished *bool `protobuf:"varint,5,opt,name=tcp_established,json=tcpEstablished" json:"tcp_established,omitempty"` + EvasiveDevices *bool `protobuf:"varint,6,opt,name=evasive_devices,json=evasiveDevices" json:"evasive_devices,omitempty"` + ShellJob *bool `protobuf:"varint,7,opt,name=shell_job,json=shellJob" json:"shell_job,omitempty"` + FileLocks *bool `protobuf:"varint,8,opt,name=file_locks,json=fileLocks" json:"file_locks,omitempty"` + LogLevel *int32 `protobuf:"varint,9,opt,name=log_level,json=logLevel,def=2" json:"log_level,omitempty"` + LogFile *string `protobuf:"bytes,10,opt,name=log_file,json=logFile" json:"log_file,omitempty"` Ps *CriuPageServerInfo `protobuf:"bytes,11,opt,name=ps" json:"ps,omitempty"` - NotifyScripts *bool `protobuf:"varint,12,opt,name=notify_scripts" json:"notify_scripts,omitempty"` + NotifyScripts *bool `protobuf:"varint,12,opt,name=notify_scripts,json=notifyScripts" json:"notify_scripts,omitempty"` Root *string `protobuf:"bytes,13,opt,name=root" json:"root,omitempty"` - ParentImg *string `protobuf:"bytes,14,opt,name=parent_img" json:"parent_img,omitempty"` - TrackMem *bool `protobuf:"varint,15,opt,name=track_mem" json:"track_mem,omitempty"` - AutoDedup *bool `protobuf:"varint,16,opt,name=auto_dedup" json:"auto_dedup,omitempty"` - WorkDirFd *int32 `protobuf:"varint,17,opt,name=work_dir_fd" json:"work_dir_fd,omitempty"` - LinkRemap *bool `protobuf:"varint,18,opt,name=link_remap" json:"link_remap,omitempty"` + ParentImg *string `protobuf:"bytes,14,opt,name=parent_img,json=parentImg" json:"parent_img,omitempty"` + TrackMem *bool `protobuf:"varint,15,opt,name=track_mem,json=trackMem" json:"track_mem,omitempty"` + AutoDedup *bool `protobuf:"varint,16,opt,name=auto_dedup,json=autoDedup" json:"auto_dedup,omitempty"` + WorkDirFd *int32 `protobuf:"varint,17,opt,name=work_dir_fd,json=workDirFd" json:"work_dir_fd,omitempty"` + LinkRemap *bool `protobuf:"varint,18,opt,name=link_remap,json=linkRemap" json:"link_remap,omitempty"` Veths []*CriuVethPair `protobuf:"bytes,19,rep,name=veths" json:"veths,omitempty"` - CpuCap *uint32 `protobuf:"varint,20,opt,name=cpu_cap,def=4294967295" json:"cpu_cap,omitempty"` - ForceIrmap *bool `protobuf:"varint,21,opt,name=force_irmap" json:"force_irmap,omitempty"` - ExecCmd []string `protobuf:"bytes,22,rep,name=exec_cmd" json:"exec_cmd,omitempty"` - ExtMnt []*ExtMountMap `protobuf:"bytes,23,rep,name=ext_mnt" json:"ext_mnt,omitempty"` - ManageCgroups *bool `protobuf:"varint,24,opt,name=manage_cgroups" json:"manage_cgroups,omitempty"` - CgRoot []*CgroupRoot `protobuf:"bytes,25,rep,name=cg_root" json:"cg_root,omitempty"` - RstSibling *bool `protobuf:"varint,26,opt,name=rst_sibling" json:"rst_sibling,omitempty"` - InheritFd []*InheritFd `protobuf:"bytes,27,rep,name=inherit_fd" json:"inherit_fd,omitempty"` - AutoExtMnt *bool `protobuf:"varint,28,opt,name=auto_ext_mnt" json:"auto_ext_mnt,omitempty"` - ExtSharing *bool `protobuf:"varint,29,opt,name=ext_sharing" json:"ext_sharing,omitempty"` - ExtMasters *bool `protobuf:"varint,30,opt,name=ext_masters" json:"ext_masters,omitempty"` - SkipMnt []string `protobuf:"bytes,31,rep,name=skip_mnt" json:"skip_mnt,omitempty"` - EnableFs []string `protobuf:"bytes,32,rep,name=enable_fs" json:"enable_fs,omitempty"` - UnixSkIno []*UnixSk `protobuf:"bytes,33,rep,name=unix_sk_ino" json:"unix_sk_ino,omitempty"` - ManageCgroupsMode *CriuCgMode `protobuf:"varint,34,opt,name=manage_cgroups_mode,enum=CriuCgMode" json:"manage_cgroups_mode,omitempty"` - GhostLimit *uint32 `protobuf:"varint,35,opt,name=ghost_limit,def=1048576" json:"ghost_limit,omitempty"` - IrmapScanPaths []string `protobuf:"bytes,36,rep,name=irmap_scan_paths" json:"irmap_scan_paths,omitempty"` + CpuCap *uint32 `protobuf:"varint,20,opt,name=cpu_cap,json=cpuCap,def=4294967295" json:"cpu_cap,omitempty"` + ForceIrmap *bool `protobuf:"varint,21,opt,name=force_irmap,json=forceIrmap" json:"force_irmap,omitempty"` + ExecCmd []string `protobuf:"bytes,22,rep,name=exec_cmd,json=execCmd" json:"exec_cmd,omitempty"` + ExtMnt []*ExtMountMap `protobuf:"bytes,23,rep,name=ext_mnt,json=extMnt" json:"ext_mnt,omitempty"` + ManageCgroups *bool `protobuf:"varint,24,opt,name=manage_cgroups,json=manageCgroups" json:"manage_cgroups,omitempty"` + CgRoot []*CgroupRoot `protobuf:"bytes,25,rep,name=cg_root,json=cgRoot" json:"cg_root,omitempty"` + RstSibling *bool `protobuf:"varint,26,opt,name=rst_sibling,json=rstSibling" json:"rst_sibling,omitempty"` + InheritFd []*InheritFd `protobuf:"bytes,27,rep,name=inherit_fd,json=inheritFd" json:"inherit_fd,omitempty"` + AutoExtMnt *bool `protobuf:"varint,28,opt,name=auto_ext_mnt,json=autoExtMnt" json:"auto_ext_mnt,omitempty"` + ExtSharing *bool `protobuf:"varint,29,opt,name=ext_sharing,json=extSharing" json:"ext_sharing,omitempty"` + ExtMasters *bool `protobuf:"varint,30,opt,name=ext_masters,json=extMasters" json:"ext_masters,omitempty"` + SkipMnt []string `protobuf:"bytes,31,rep,name=skip_mnt,json=skipMnt" json:"skip_mnt,omitempty"` + EnableFs []string `protobuf:"bytes,32,rep,name=enable_fs,json=enableFs" json:"enable_fs,omitempty"` + UnixSkIno []*UnixSk `protobuf:"bytes,33,rep,name=unix_sk_ino,json=unixSkIno" json:"unix_sk_ino,omitempty"` + ManageCgroupsMode *CriuCgMode `protobuf:"varint,34,opt,name=manage_cgroups_mode,json=manageCgroupsMode,enum=CriuCgMode" json:"manage_cgroups_mode,omitempty"` + GhostLimit *uint32 `protobuf:"varint,35,opt,name=ghost_limit,json=ghostLimit,def=1048576" json:"ghost_limit,omitempty"` + IrmapScanPaths []string `protobuf:"bytes,36,rep,name=irmap_scan_paths,json=irmapScanPaths" json:"irmap_scan_paths,omitempty"` External []string `protobuf:"bytes,37,rep,name=external" json:"external,omitempty"` - EmptyNs *uint32 `protobuf:"varint,38,opt,name=empty_ns" json:"empty_ns,omitempty"` - JoinNs []*JoinNamespace `protobuf:"bytes,39,rep,name=join_ns" json:"join_ns,omitempty"` - CgroupProps *string `protobuf:"bytes,41,opt,name=cgroup_props" json:"cgroup_props,omitempty"` - CgroupPropsFile *string `protobuf:"bytes,42,opt,name=cgroup_props_file" json:"cgroup_props_file,omitempty"` - CgroupDumpController []string `protobuf:"bytes,43,rep,name=cgroup_dump_controller" json:"cgroup_dump_controller,omitempty"` - FreezeCgroup *string `protobuf:"bytes,44,opt,name=freeze_cgroup" json:"freeze_cgroup,omitempty"` + EmptyNs *uint32 `protobuf:"varint,38,opt,name=empty_ns,json=emptyNs" json:"empty_ns,omitempty"` + JoinNs []*JoinNamespace `protobuf:"bytes,39,rep,name=join_ns,json=joinNs" json:"join_ns,omitempty"` + CgroupProps *string `protobuf:"bytes,41,opt,name=cgroup_props,json=cgroupProps" json:"cgroup_props,omitempty"` + CgroupPropsFile *string `protobuf:"bytes,42,opt,name=cgroup_props_file,json=cgroupPropsFile" json:"cgroup_props_file,omitempty"` + CgroupDumpController []string `protobuf:"bytes,43,rep,name=cgroup_dump_controller,json=cgroupDumpController" json:"cgroup_dump_controller,omitempty"` + FreezeCgroup *string `protobuf:"bytes,44,opt,name=freeze_cgroup,json=freezeCgroup" json:"freeze_cgroup,omitempty"` Timeout *uint32 `protobuf:"varint,45,opt,name=timeout" json:"timeout,omitempty"` - TcpSkipInFlight *bool `protobuf:"varint,46,opt,name=tcp_skip_in_flight" json:"tcp_skip_in_flight,omitempty"` - WeakSysctls *bool `protobuf:"varint,47,opt,name=weak_sysctls" json:"weak_sysctls,omitempty"` - LazyPages *bool `protobuf:"varint,48,opt,name=lazy_pages" json:"lazy_pages,omitempty"` - StatusFd *int32 `protobuf:"varint,49,opt,name=status_fd" json:"status_fd,omitempty"` - OrphanPtsMaster *bool `protobuf:"varint,50,opt,name=orphan_pts_master" json:"orphan_pts_master,omitempty"` + TcpSkipInFlight *bool `protobuf:"varint,46,opt,name=tcp_skip_in_flight,json=tcpSkipInFlight" json:"tcp_skip_in_flight,omitempty"` + WeakSysctls *bool `protobuf:"varint,47,opt,name=weak_sysctls,json=weakSysctls" json:"weak_sysctls,omitempty"` + LazyPages *bool `protobuf:"varint,48,opt,name=lazy_pages,json=lazyPages" json:"lazy_pages,omitempty"` + StatusFd *int32 `protobuf:"varint,49,opt,name=status_fd,json=statusFd" json:"status_fd,omitempty"` + OrphanPtsMaster *bool `protobuf:"varint,50,opt,name=orphan_pts_master,json=orphanPtsMaster" json:"orphan_pts_master,omitempty"` XXX_unrecognized []byte `json:"-"` } @@ -807,7 +811,8 @@ func (m *CriuNotify) GetPid() int32 { // List of features which can queried via // CRIU_REQ_TYPE__FEATURE_CHECK type CriuFeatures struct { - MemTrack *bool `protobuf:"varint,1,opt,name=mem_track" json:"mem_track,omitempty"` + MemTrack *bool `protobuf:"varint,1,opt,name=mem_track,json=memTrack" json:"mem_track,omitempty"` + LazyPages *bool `protobuf:"varint,2,opt,name=lazy_pages,json=lazyPages" json:"lazy_pages,omitempty"` XXX_unrecognized []byte `json:"-"` } @@ -823,15 +828,22 @@ func (m *CriuFeatures) GetMemTrack() bool { return false } +func (m *CriuFeatures) GetLazyPages() bool { + if m != nil && m.LazyPages != nil { + return *m.LazyPages + } + return false +} + type CriuReq struct { Type *CriuReqType `protobuf:"varint,1,req,name=type,enum=CriuReqType" json:"type,omitempty"` Opts *CriuOpts `protobuf:"bytes,2,opt,name=opts" json:"opts,omitempty"` - NotifySuccess *bool `protobuf:"varint,3,opt,name=notify_success" json:"notify_success,omitempty"` + NotifySuccess *bool `protobuf:"varint,3,opt,name=notify_success,json=notifySuccess" json:"notify_success,omitempty"` // // When set service won't close the connection but // will wait for more req-s to appear. Works not // for all request types. - KeepOpen *bool `protobuf:"varint,4,opt,name=keep_open" json:"keep_open,omitempty"` + KeepOpen *bool `protobuf:"varint,4,opt,name=keep_open,json=keepOpen" json:"keep_open,omitempty"` // // 'features' can be used to query which features // are supported by the installed criu/kernel @@ -887,9 +899,10 @@ type CriuResp struct { Restore *CriuRestoreResp `protobuf:"bytes,4,opt,name=restore" json:"restore,omitempty"` Notify *CriuNotify `protobuf:"bytes,5,opt,name=notify" json:"notify,omitempty"` Ps *CriuPageServerInfo `protobuf:"bytes,6,opt,name=ps" json:"ps,omitempty"` - CrErrno *int32 `protobuf:"varint,7,opt,name=cr_errno" json:"cr_errno,omitempty"` + CrErrno *int32 `protobuf:"varint,7,opt,name=cr_errno,json=crErrno" json:"cr_errno,omitempty"` Features *CriuFeatures `protobuf:"bytes,8,opt,name=features" json:"features,omitempty"` - CrErrmsg *string `protobuf:"bytes,9,opt,name=cr_errmsg" json:"cr_errmsg,omitempty"` + CrErrmsg *string `protobuf:"bytes,9,opt,name=cr_errmsg,json=crErrmsg" json:"cr_errmsg,omitempty"` + Version *CriuVersion `protobuf:"bytes,10,opt,name=version" json:"version,omitempty"` XXX_unrecognized []byte `json:"-"` } @@ -961,6 +974,71 @@ func (m *CriuResp) GetCrErrmsg() string { return "" } +func (m *CriuResp) GetVersion() *CriuVersion { + if m != nil { + return m.Version + } + return nil +} + +// Answer for criu_req_type.VERSION requests +type CriuVersion struct { + Major *int32 `protobuf:"varint,1,req,name=major" json:"major,omitempty"` + Minor *int32 `protobuf:"varint,2,req,name=minor" json:"minor,omitempty"` + Gitid *string `protobuf:"bytes,3,opt,name=gitid" json:"gitid,omitempty"` + Sublevel *int32 `protobuf:"varint,4,opt,name=sublevel" json:"sublevel,omitempty"` + Extra *int32 `protobuf:"varint,5,opt,name=extra" json:"extra,omitempty"` + Name *string `protobuf:"bytes,6,opt,name=name" json:"name,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *CriuVersion) Reset() { *m = CriuVersion{} } +func (m *CriuVersion) String() string { return proto.CompactTextString(m) } +func (*CriuVersion) ProtoMessage() {} +func (*CriuVersion) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{14} } + +func (m *CriuVersion) GetMajor() int32 { + if m != nil && m.Major != nil { + return *m.Major + } + return 0 +} + +func (m *CriuVersion) GetMinor() int32 { + if m != nil && m.Minor != nil { + return *m.Minor + } + return 0 +} + +func (m *CriuVersion) GetGitid() string { + if m != nil && m.Gitid != nil { + return *m.Gitid + } + return "" +} + +func (m *CriuVersion) GetSublevel() int32 { + if m != nil && m.Sublevel != nil { + return *m.Sublevel + } + return 0 +} + +func (m *CriuVersion) GetExtra() int32 { + if m != nil && m.Extra != nil { + return *m.Extra + } + return 0 +} + +func (m *CriuVersion) GetName() string { + if m != nil && m.Name != nil { + return *m.Name + } + return "" +} + func init() { proto.RegisterType((*CriuPageServerInfo)(nil), "criu_page_server_info") proto.RegisterType((*CriuVethPair)(nil), "criu_veth_pair") @@ -976,6 +1054,7 @@ func init() { proto.RegisterType((*CriuFeatures)(nil), "criu_features") proto.RegisterType((*CriuReq)(nil), "criu_req") proto.RegisterType((*CriuResp)(nil), "criu_resp") + proto.RegisterType((*CriuVersion)(nil), "criu_version") proto.RegisterEnum("CriuCgMode", CriuCgMode_name, CriuCgMode_value) proto.RegisterEnum("CriuReqType", CriuReqType_name, CriuReqType_value) } @@ -983,87 +1062,117 @@ func init() { func init() { proto.RegisterFile("criurpc.proto", fileDescriptor0) } var fileDescriptor0 = []byte{ - // 1297 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0x7c, 0x56, 0xdb, 0x77, 0xd3, 0xc6, - 0x13, 0xfe, 0xc5, 0x71, 0x7c, 0x59, 0x5f, 0x22, 0x04, 0x84, 0xe5, 0x9e, 0x9f, 0x28, 0x6d, 0x49, - 0x5b, 0x03, 0x3e, 0x5c, 0x0a, 0x4f, 0xe5, 0x04, 0x87, 0xe6, 0x14, 0x62, 0x1f, 0xc7, 0xe9, 0x39, - 0x3c, 0xed, 0x11, 0xd2, 0xda, 0x5e, 0x2c, 0x69, 0xd5, 0xdd, 0x95, 0x21, 0xfc, 0x03, 0x7d, 0xec, - 0x63, 0x1f, 0xfb, 0xaf, 0x76, 0x76, 0x24, 0x05, 0x41, 0x39, 0xbc, 0x80, 0x35, 0x9a, 0xcb, 0x37, - 0xdf, 0xcc, 0x7c, 0x0a, 0xe9, 0x05, 0x4a, 0x64, 0x2a, 0x0d, 0x06, 0xa9, 0x92, 0x46, 0x7a, 0x63, - 0x72, 0xd1, 0x1a, 0x58, 0xea, 0x2f, 0x38, 0xd3, 0x5c, 0xad, 0xb9, 0x62, 0x22, 0x99, 0x4b, 0x77, - 0x9b, 0x34, 0xfd, 0x30, 0x54, 0x5c, 0x6b, 0xba, 0xb1, 0xbb, 0xf1, 0x7d, 0xdb, 0xed, 0x92, 0x7a, - 0x2a, 0x95, 0xa1, 0x35, 0x78, 0xda, 0x72, 0x3b, 0x64, 0x33, 0x15, 0x21, 0xdd, 0xc4, 0x07, 0x42, - 0x6a, 0xf3, 0x90, 0xd6, 0xed, 0x6f, 0xef, 0x2e, 0xe9, 0x63, 0xc2, 0x35, 0x37, 0x4b, 0xc8, 0x2a, - 0x94, 0xdb, 0x23, 0x5b, 0x62, 0x0e, 0x49, 0x21, 0x4f, 0x0d, 0xf2, 0xf4, 0x49, 0x03, 0x1e, 0x65, - 0x66, 0x33, 0xc1, 0xb3, 0x77, 0x87, 0xf4, 0xf8, 0x7b, 0xc3, 0x62, 0x99, 0x25, 0xf0, 0xaf, 0x9f, - 0xda, 0xd4, 0x2b, 0x7e, 0x5a, 0x78, 0xc3, 0xc3, 0xda, 0x8f, 0x0a, 0xd7, 0x5f, 0x48, 0xff, 0xad, - 0x14, 0x09, 0x4b, 0xfc, 0x98, 0xeb, 0xd4, 0x0f, 0xb8, 0xad, 0x9c, 0xe8, 0xc2, 0x15, 0x10, 0x27, - 0x9a, 0xcd, 0x45, 0xc4, 0x73, 0x77, 0xf7, 0x1c, 0x69, 0x43, 0x66, 0xe5, 0x33, 0x99, 0x1a, 0x44, - 0xda, 0xf6, 0x6e, 0x13, 0x22, 0x92, 0x25, 0x57, 0xc2, 0xb0, 0x79, 0xf8, 0x69, 0xa5, 0xbc, 0x09, - 0x1b, 0xb9, 0x05, 0x98, 0x3a, 0xc1, 0x42, 0xc9, 0x2c, 0x65, 0x4a, 0x4a, 0x63, 0x5b, 0x0f, 0x8c, - 0x8a, 0x2a, 0x44, 0xf8, 0x66, 0x59, 0x60, 0xa2, 0xa4, 0x99, 0x25, 0xe2, 0x3d, 0xd3, 0x2b, 0x6c, - 0x34, 0x91, 0x21, 0xc7, 0x84, 0x3d, 0xef, 0xef, 0x36, 0x69, 0x23, 0x15, 0x50, 0x5e, 0xbb, 0x17, - 0x49, 0x4f, 0xc4, 0x40, 0xb2, 0x66, 0xa1, 0x50, 0x50, 0x1c, 0x9d, 0xce, 0x78, 0xcc, 0x49, 0x05, - 0x9f, 0x88, 0xfb, 0x6b, 0xce, 0x54, 0x96, 0x24, 0x22, 0x59, 0x20, 0xe8, 0x96, 0x7b, 0x9e, 0x74, - 0x2c, 0x43, 0x45, 0x19, 0xe4, 0xb9, 0xe5, 0x5e, 0x22, 0xdb, 0x26, 0x48, 0x19, 0xd7, 0xc6, 0x7f, - 0x13, 0x09, 0xbd, 0xe4, 0x21, 0xdd, 0x2a, 0x5f, 0xf0, 0xb5, 0xaf, 0x05, 0xa4, 0x09, 0xf9, 0x5a, - 0x04, 0x5c, 0xd3, 0x06, 0xbe, 0x00, 0x3a, 0xc0, 0x2d, 0x8a, 0xd8, 0x5b, 0xf9, 0x86, 0x36, 0xd1, - 0x04, 0x4d, 0x5b, 0xbe, 0x58, 0x24, 0x83, 0x95, 0xa6, 0x2d, 0xb4, 0x5d, 0x20, 0xed, 0x48, 0x2e, - 0x58, 0xc4, 0xd7, 0x3c, 0xa2, 0x6d, 0x8b, 0xeb, 0xe9, 0xc6, 0xd0, 0x75, 0x48, 0xcb, 0x5a, 0x91, - 0x5d, 0x82, 0x34, 0x78, 0xa4, 0x96, 0x6a, 0xda, 0x81, 0xdf, 0x9d, 0xe1, 0xce, 0xe0, 0xcb, 0x4b, - 0xb4, 0x43, 0xfa, 0x89, 0x34, 0x62, 0x7e, 0xca, 0x34, 0x38, 0x00, 0x0d, 0xb4, 0x8b, 0x35, 0x80, - 0x42, 0x4b, 0x2c, 0xed, 0x61, 0x26, 0x40, 0x91, 0xfa, 0x8a, 0xc3, 0xf8, 0x45, 0xbc, 0xa0, 0x7d, - 0xb4, 0x01, 0x58, 0x98, 0x5c, 0xb0, 0x62, 0x31, 0x8f, 0xe9, 0x76, 0x09, 0xd6, 0xcf, 0x8c, 0x84, - 0xae, 0xc2, 0x2c, 0xa5, 0x4e, 0x49, 0xcd, 0x3b, 0xa9, 0x56, 0x25, 0xa7, 0xe7, 0x90, 0x46, 0x70, - 0x8c, 0x44, 0xb2, 0x62, 0x8a, 0xc3, 0x3a, 0x51, 0x17, 0x1d, 0x6f, 0x90, 0x2d, 0xbb, 0x91, 0x9a, - 0x9e, 0xdf, 0xdd, 0x04, 0xc0, 0xdb, 0x83, 0xcf, 0x96, 0xf4, 0x2a, 0x69, 0x06, 0x69, 0xc6, 0x02, - 0x08, 0xb8, 0x00, 0x01, 0xbd, 0xa7, 0xe4, 0xc1, 0xf0, 0xc9, 0x83, 0x27, 0x8f, 0x1e, 0x0f, 0x9f, - 0x3c, 0xb4, 0x55, 0xe6, 0x52, 0x05, 0x9c, 0x09, 0x65, 0x33, 0x5e, 0xc4, 0x8c, 0xc0, 0x08, 0x7f, - 0xcf, 0x03, 0x16, 0xc4, 0x21, 0xdd, 0x81, 0xa4, 0x6d, 0xf7, 0x26, 0x69, 0xe2, 0x26, 0x27, 0x86, - 0x5e, 0xc2, 0x2a, 0xfd, 0xc1, 0xa7, 0x9b, 0x0d, 0x74, 0xc4, 0x7e, 0x62, 0x49, 0xca, 0xb7, 0x4b, - 0x53, 0x8a, 0xa9, 0xae, 0x43, 0xf1, 0x05, 0xae, 0x1a, 0xbd, 0x8c, 0x81, 0xdd, 0x41, 0x75, 0xfd, - 0xa0, 0xbc, 0xd2, 0x86, 0x69, 0x01, 0x83, 0x86, 0xa5, 0xb8, 0x82, 0x31, 0x37, 0xab, 0x9b, 0x4c, - 0xaf, 0x62, 0x58, 0x67, 0x50, 0x59, 0xee, 0x0b, 0xa4, 0x8b, 0x74, 0x95, 0x90, 0xae, 0x55, 0x77, - 0x49, 0x2f, 0x7d, 0x65, 0x73, 0x5d, 0xaf, 0x1a, 0x63, 0x5f, 0x1b, 0xae, 0x34, 0xbd, 0x51, 0xf6, - 0xa7, 0x57, 0x22, 0xc5, 0xd8, 0x9b, 0xd8, 0x9f, 0xbd, 0xa7, 0x04, 0xb6, 0x8d, 0xb3, 0xb9, 0xa6, - 0xbb, 0x68, 0xba, 0x4e, 0x3a, 0xc5, 0x5a, 0xc2, 0xc0, 0x25, 0xfd, 0x3f, 0xc2, 0x68, 0x0d, 0xca, - 0x8b, 0xd8, 0x23, 0xe7, 0x3f, 0x6d, 0x18, 0xc8, 0x80, 0xfb, 0xf0, 0xa0, 0x40, 0x7f, 0xd8, 0xcb, - 0x67, 0x00, 0x9d, 0x5b, 0xa3, 0x7b, 0x8d, 0x74, 0x16, 0x4b, 0x09, 0x7d, 0x46, 0x22, 0x16, 0x86, - 0xde, 0xc2, 0x29, 0x34, 0xef, 0xdf, 0x7b, 0xf0, 0xf3, 0xc3, 0xc7, 0x8f, 0x5c, 0x4a, 0x1c, 0x24, - 0x1f, 0x16, 0xc9, 0x4f, 0x98, 0xbd, 0x3f, 0x4d, 0xbf, 0x41, 0x08, 0x38, 0x07, 0xc0, 0x9d, 0x80, - 0x4c, 0xdc, 0x3e, 0xb3, 0xc4, 0xa9, 0x39, 0x65, 0x20, 0x0d, 0xdf, 0xda, 0x34, 0xee, 0x2e, 0x69, - 0xe6, 0xc2, 0xa1, 0xe9, 0x77, 0xc5, 0xfc, 0x3f, 0x13, 0x12, 0x60, 0xab, 0xa0, 0x1c, 0x74, 0x11, - 0x06, 0x73, 0x07, 0xb7, 0xf0, 0x32, 0x39, 0x57, 0xb5, 0xe6, 0xeb, 0xbf, 0x87, 0xaf, 0x6e, 0x90, - 0x9d, 0xe2, 0x55, 0x98, 0xc5, 0x29, 0x0b, 0x64, 0x62, 0x94, 0x8c, 0x22, 0xae, 0xe8, 0x0f, 0x08, - 0x02, 0x6e, 0x79, 0xae, 0x38, 0xff, 0x50, 0xb6, 0x4e, 0x7f, 0xc4, 0x30, 0x10, 0x29, 0x23, 0x62, - 0x6e, 0xe5, 0xef, 0x27, 0x84, 0x76, 0x85, 0xb8, 0xf6, 0x8e, 0x91, 0x6a, 0x40, 0x34, 0x8f, 0xc4, - 0x62, 0x69, 0xe8, 0xa0, 0x38, 0xc5, 0xee, 0x3b, 0xee, 0xaf, 0x98, 0x3e, 0xd5, 0x81, 0x89, 0x34, - 0xbd, 0x5b, 0xde, 0x41, 0xe4, 0x7f, 0x38, 0xc5, 0x6b, 0xd3, 0xf4, 0xde, 0xd9, 0x6d, 0x1b, 0xdf, - 0x64, 0xda, 0x2e, 0xc3, 0x7d, 0xbc, 0x02, 0xc0, 0x2e, 0x55, 0xba, 0xb4, 0x6c, 0x19, 0x5d, 0xcc, - 0x96, 0x0e, 0xad, 0xb7, 0xe7, 0x15, 0x1a, 0x8d, 0xc8, 0x41, 0xe2, 0x53, 0x4b, 0x19, 0xfc, 0x6f, - 0xa4, 0xe2, 0x21, 0xaa, 0x5c, 0xcb, 0xdb, 0x85, 0xd6, 0xad, 0x4f, 0x61, 0xce, 0xdd, 0x0a, 0xb5, - 0x42, 0xe9, 0xf2, 0xf6, 0x40, 0x24, 0xad, 0x47, 0x7e, 0xe1, 0x56, 0xd7, 0xf3, 0x23, 0x2f, 0x64, - 0xb2, 0xaa, 0x6c, 0x50, 0x11, 0xbf, 0x3b, 0x6c, 0xce, 0x01, 0x24, 0xa4, 0xb2, 0x80, 0xe1, 0xb2, - 0x19, 0xde, 0x78, 0x51, 0xf1, 0xaf, 0x0d, 0xd2, 0x2a, 0x4a, 0xfe, 0x01, 0xdb, 0x50, 0x37, 0xa7, - 0x69, 0x2e, 0xa5, 0x7d, 0x38, 0xa4, 0xf2, 0x05, 0xb3, 0x56, 0xd8, 0x86, 0xba, 0x15, 0x55, 0x4c, - 0xde, 0x19, 0x92, 0xc1, 0x47, 0x99, 0xad, 0x28, 0x4e, 0x16, 0x04, 0xf6, 0xeb, 0xb5, 0x59, 0x12, - 0xb4, 0xe2, 0x3c, 0x05, 0x27, 0x9e, 0x14, 0x0a, 0xba, 0x4b, 0x5a, 0x25, 0x1c, 0x94, 0xce, 0x4e, - 0x59, 0xa6, 0xb4, 0x7a, 0x7f, 0xd6, 0x0a, 0x05, 0xc7, 0xe6, 0xbf, 0x0e, 0x09, 0x06, 0x5b, 0x56, - 0xb4, 0x1f, 0x06, 0x7b, 0xd4, 0x75, 0xcb, 0x2f, 0xd6, 0x3f, 0x13, 0x9c, 0x8f, 0x8c, 0xdf, 0x22, - 0xcd, 0x82, 0x5a, 0x84, 0xd3, 0x19, 0xba, 0x83, 0xff, 0xf2, 0x7d, 0x8d, 0x34, 0xf2, 0x6e, 0x0a, - 0x80, 0xdd, 0x41, 0x95, 0xf1, 0x5c, 0x81, 0x1b, 0x5f, 0x55, 0x60, 0xc7, 0x72, 0xca, 0xb8, 0x52, - 0x70, 0x9d, 0x4d, 0xdc, 0x8b, 0x6a, 0xdb, 0xad, 0x2f, 0xb5, 0x6d, 0xb9, 0xca, 0x63, 0x62, 0xbd, - 0xc0, 0x2f, 0x40, 0x7b, 0x8f, 0xc1, 0x79, 0x54, 0x8f, 0x95, 0x90, 0xc6, 0xe1, 0x8b, 0xa3, 0xf1, - 0x74, 0xe4, 0xfc, 0x0f, 0x06, 0xdd, 0xdc, 0x7f, 0xc1, 0x8e, 0xc6, 0x47, 0x23, 0x67, 0xc3, 0x6d, - 0x93, 0xad, 0xc9, 0x74, 0x3c, 0x39, 0x76, 0x6a, 0x6e, 0x8b, 0xd4, 0x8f, 0xc7, 0x07, 0x33, 0x67, - 0xd3, 0xfe, 0x3a, 0x38, 0x79, 0xf9, 0xd2, 0xa9, 0xdb, 0xb8, 0xe3, 0xd9, 0xf4, 0x70, 0x7f, 0xe6, - 0xd8, 0x4f, 0x5f, 0xf3, 0xf9, 0xe8, 0xe0, 0xd9, 0xc9, 0xcb, 0x99, 0xd3, 0xd8, 0xfb, 0x67, 0xa3, - 0xd8, 0x90, 0x33, 0x42, 0x21, 0xd3, 0xe8, 0xd5, 0x64, 0xf6, 0x1a, 0x2a, 0x40, 0xfc, 0xf3, 0x93, - 0x57, 0x13, 0x48, 0x0f, 0x31, 0xd3, 0xd1, 0xf1, 0xcc, 0x16, 0xae, 0x59, 0x8f, 0xfd, 0x5f, 0x47, - 0xfb, 0xbf, 0x41, 0x85, 0x2e, 0x69, 0x4d, 0xa6, 0x23, 0x86, 0x5e, 0x75, 0x98, 0x45, 0x67, 0xf2, - 0xec, 0xc5, 0x88, 0x1d, 0x8f, 0xa6, 0xbf, 0x8f, 0xa6, 0x8e, 0xfd, 0x03, 0xa5, 0x71, 0x34, 0x9e, - 0x1d, 0x1e, 0xbc, 0x76, 0x1a, 0xc0, 0x48, 0x77, 0x7f, 0x72, 0x72, 0x78, 0x74, 0x30, 0xce, 0xdd, - 0x9b, 0xd0, 0x6f, 0xaf, 0xb4, 0xe4, 0xf9, 0xec, 0xba, 0xf4, 0x0e, 0x46, 0xcf, 0x66, 0x27, 0x90, - 0x33, 0x37, 0xb5, 0xff, 0x0d, 0x00, 0x00, 0xff, 0xff, 0xed, 0xcb, 0xc7, 0x95, 0x39, 0x09, 0x00, - 0x00, + // 1781 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x56, 0xdd, 0x72, 0x5b, 0xb7, + 0x11, 0x0e, 0x29, 0xfe, 0x1c, 0x82, 0x3f, 0xa6, 0x10, 0xdb, 0x81, 0x93, 0xda, 0x62, 0xe8, 0x28, + 0x51, 0x15, 0x97, 0x4d, 0x58, 0x3b, 0xae, 0x33, 0xed, 0x85, 0x47, 0x22, 0x5d, 0x36, 0x92, 0xc8, + 0x01, 0x25, 0xcf, 0xe4, 0x0a, 0x73, 0x74, 0x0e, 0x48, 0xc1, 0x3c, 0x7f, 0x05, 0x40, 0x45, 0xf2, + 0x83, 0xf4, 0x29, 0xfa, 0x0c, 0x7d, 0x84, 0xbe, 0x4e, 0x6f, 0x3b, 0xbb, 0x00, 0x65, 0x29, 0xc9, + 0xb4, 0xbd, 0xc3, 0x7e, 0x58, 0x00, 0xbb, 0xfb, 0xed, 0x0f, 0x48, 0x3b, 0xd2, 0x6a, 0xad, 0x8b, + 0x68, 0x50, 0xe8, 0xdc, 0xe6, 0xfd, 0x25, 0x79, 0x00, 0x80, 0x28, 0xc2, 0xa5, 0x14, 0x46, 0xea, + 0x4b, 0xa9, 0x85, 0xca, 0x16, 0x39, 0x65, 0xa4, 0x1e, 0xc6, 0xb1, 0x96, 0xc6, 0xb0, 0x52, 0xaf, + 0xb4, 0xd7, 0xe0, 0x1b, 0x91, 0x52, 0x52, 0x29, 0x72, 0x6d, 0x59, 0xb9, 0x57, 0xda, 0xab, 0x72, + 0x5c, 0xd3, 0x2e, 0xd9, 0x2a, 0x54, 0xcc, 0xb6, 0x10, 0x82, 0x25, 0xed, 0x90, 0xf2, 0x22, 0x66, + 0x15, 0x04, 0xca, 0x8b, 0xb8, 0xff, 0x27, 0xd2, 0xc1, 0x87, 0x2e, 0xa5, 0xbd, 0x10, 0x45, 0xa8, + 0x34, 0xfd, 0x98, 0x54, 0xd5, 0x42, 0xa8, 0x8c, 0x95, 0x7a, 0xe5, 0xbd, 0x06, 0xaf, 0xa8, 0xc5, + 0x24, 0xa3, 0x0f, 0x48, 0x4d, 0x2d, 0x44, 0xbe, 0x86, 0xeb, 0x01, 0xad, 0xaa, 0xc5, 0x74, 0x6d, + 0xfb, 0x7f, 0x20, 0x6d, 0x79, 0x65, 0x45, 0x9a, 0xaf, 0x33, 0x2b, 0xd2, 0xb0, 0x80, 0x07, 0x57, + 0xf2, 0xda, 0x1f, 0x85, 0x25, 0x20, 0x97, 0x61, 0xe2, 0x8f, 0xc1, 0xb2, 0xff, 0x96, 0x74, 0xde, + 0xe5, 0x2a, 0x13, 0x59, 0x98, 0x4a, 0x53, 0x84, 0x91, 0x04, 0xa3, 0x32, 0xe3, 0x0f, 0x95, 0x33, + 0x43, 0x3f, 0x21, 0xf5, 0xcc, 0x88, 0x85, 0x4a, 0xa4, 0x3f, 0x57, 0xcb, 0xcc, 0x58, 0x25, 0x92, + 0x7e, 0x46, 0x1a, 0xf2, 0xca, 0xea, 0x50, 0xe4, 0x85, 0x45, 0xaf, 0x1a, 0x3c, 0x40, 0x60, 0x5a, + 0xd8, 0xfe, 0x80, 0x10, 0x95, 0x5d, 0x48, 0xad, 0xac, 0x58, 0xc4, 0xbf, 0x62, 0x89, 0x73, 0x1d, + 0x2e, 0x74, 0xae, 0xbf, 0x20, 0xcd, 0x68, 0xa9, 0xf3, 0x75, 0x21, 0x74, 0x9e, 0x5b, 0x88, 0x5f, + 0x64, 0x75, 0xe2, 0xc3, 0x8a, 0x6b, 0x8c, 0x69, 0x68, 0x2f, 0xbc, 0x15, 0xb8, 0xee, 0xef, 0x90, + 0xfa, 0x3a, 0x53, 0x57, 0xc2, 0xac, 0xe8, 0x7d, 0x52, 0x55, 0x59, 0x1e, 0x4b, 0x7c, 0xa5, 0xcd, + 0x9d, 0xd0, 0xff, 0x57, 0x9b, 0x34, 0x30, 0xa6, 0x79, 0x61, 0x0d, 0xed, 0x93, 0xb6, 0x4a, 0xc3, + 0xa5, 0x34, 0x22, 0x56, 0x5a, 0x2c, 0x62, 0xd4, 0xad, 0xf2, 0xa6, 0x03, 0x0f, 0x95, 0x1e, 0xc7, + 0x1b, 0x9a, 0xca, 0x1f, 0x68, 0x7a, 0x4a, 0xda, 0x89, 0x0c, 0x2f, 0xa5, 0xd0, 0xeb, 0x2c, 0x53, + 0xd9, 0x12, 0x9d, 0x0d, 0x78, 0x0b, 0x41, 0xee, 0x30, 0xfa, 0x84, 0x34, 0x21, 0xfa, 0xde, 0x1a, + 0x24, 0x35, 0xe0, 0x10, 0xa0, 0xb3, 0x4c, 0x5d, 0xcd, 0x57, 0xf4, 0x2b, 0x72, 0xcf, 0x46, 0x85, + 0x90, 0xc6, 0x86, 0xe7, 0x89, 0x32, 0x17, 0x32, 0x66, 0x55, 0xd4, 0xe9, 0xd8, 0xa8, 0x18, 0x7d, + 0x40, 0x41, 0x51, 0x5e, 0x86, 0x46, 0x5d, 0x4a, 0x11, 0xcb, 0x4b, 0x15, 0x49, 0xc3, 0x6a, 0x4e, + 0xd1, 0xc3, 0x87, 0x0e, 0x85, 0xf8, 0x9b, 0x0b, 0x99, 0x24, 0xe2, 0x5d, 0x7e, 0xce, 0xea, 0xa8, + 0x12, 0x20, 0xf0, 0xd7, 0xfc, 0x9c, 0x3e, 0x26, 0x04, 0x28, 0x13, 0x49, 0x1e, 0xad, 0x0c, 0x0b, + 0x9c, 0x35, 0x80, 0x1c, 0x01, 0x40, 0x9f, 0x90, 0x46, 0x92, 0x2f, 0x45, 0x22, 0x2f, 0x65, 0xc2, + 0x1a, 0xe0, 0xea, 0xf7, 0xa5, 0x21, 0x0f, 0x92, 0x7c, 0x79, 0x04, 0x10, 0x7d, 0x44, 0x60, 0xed, + 0x58, 0x27, 0x2e, 0xb5, 0x93, 0x7c, 0x89, 0xb4, 0x7f, 0x49, 0xca, 0x85, 0x61, 0xcd, 0x5e, 0x69, + 0xaf, 0x39, 0x7c, 0x38, 0xf8, 0xd5, 0xc2, 0xe0, 0xe5, 0xc2, 0xd0, 0x5d, 0xd2, 0xc9, 0x72, 0xab, + 0x16, 0xd7, 0xc2, 0x44, 0x5a, 0x15, 0xd6, 0xb0, 0x16, 0x5a, 0xd1, 0x76, 0xe8, 0xdc, 0x81, 0xc0, + 0x2a, 0x30, 0xce, 0xda, 0x8e, 0x69, 0x64, 0xff, 0x31, 0x21, 0x45, 0xa8, 0x65, 0x66, 0x85, 0x4a, + 0x97, 0xac, 0x83, 0x3b, 0x0d, 0x87, 0x4c, 0xd2, 0x25, 0x38, 0x6e, 0x75, 0x18, 0xad, 0x44, 0x2a, + 0x53, 0x76, 0xcf, 0x39, 0x8e, 0xc0, 0xb1, 0x4c, 0xe1, 0x6c, 0xb8, 0xb6, 0xb9, 0x88, 0x65, 0xbc, + 0x2e, 0x58, 0xd7, 0x39, 0x0e, 0xc8, 0x21, 0x00, 0x40, 0xd3, 0x4f, 0xb9, 0x5e, 0x6d, 0xf8, 0xdf, + 0x46, 0x96, 0x1b, 0x00, 0x39, 0xf6, 0x1f, 0x13, 0x92, 0xa8, 0x6c, 0x25, 0xb4, 0x4c, 0xc3, 0x82, + 0x51, 0x77, 0x1c, 0x10, 0x0e, 0x00, 0xdd, 0x25, 0x55, 0x28, 0x4e, 0xc3, 0x3e, 0xee, 0x6d, 0xed, + 0x35, 0x87, 0xf7, 0x06, 0x77, 0xeb, 0x95, 0xbb, 0x5d, 0xfa, 0x94, 0xd4, 0xa3, 0x62, 0x2d, 0xa2, + 0xb0, 0x60, 0xf7, 0x7b, 0xa5, 0xbd, 0xf6, 0xf7, 0xe4, 0xf9, 0xf0, 0xd5, 0xf3, 0x57, 0xdf, 0xbd, + 0x1c, 0xbe, 0x7a, 0xc1, 0x6b, 0x51, 0xb1, 0x3e, 0x08, 0x0b, 0xba, 0x43, 0x9a, 0x8b, 0x5c, 0x47, + 0x52, 0x28, 0x0d, 0x6f, 0x3d, 0xc0, 0xb7, 0x08, 0x42, 0x13, 0x40, 0x80, 0x04, 0x79, 0x25, 0x23, + 0x11, 0xa5, 0x31, 0x7b, 0xd8, 0xdb, 0x02, 0x12, 0x40, 0x3e, 0x48, 0x21, 0x49, 0xea, 0x58, 0xeb, + 0x99, 0x65, 0x9f, 0xa0, 0x25, 0x9d, 0xc1, 0x9d, 0xda, 0xe7, 0x35, 0x79, 0x65, 0x8f, 0x33, 0x0b, + 0x2c, 0xa4, 0x61, 0x06, 0xfc, 0xb8, 0xf2, 0x32, 0x8c, 0x39, 0x16, 0x1c, 0x7a, 0xe0, 0x40, 0xba, + 0x4b, 0xea, 0xd1, 0x12, 0x4b, 0x8f, 0x3d, 0xc2, 0xfb, 0x5a, 0x83, 0x5b, 0xe5, 0xc8, 0x6b, 0xd1, + 0x92, 0x03, 0x31, 0x3b, 0xa4, 0xa9, 0x8d, 0x15, 0x46, 0x9d, 0x27, 0x50, 0x07, 0x9f, 0x3a, 0x93, + 0xb5, 0xb1, 0x73, 0x87, 0xd0, 0xfd, 0xdb, 0x65, 0xcf, 0x3e, 0xc3, 0xab, 0x9a, 0x83, 0x0f, 0x10, + 0x6f, 0xf8, 0xf5, 0x38, 0xa6, 0x3d, 0xd2, 0x42, 0xa6, 0x36, 0x8e, 0xfc, 0xc6, 0xdd, 0x06, 0xd8, + 0xc8, 0x19, 0xbf, 0xe3, 0x6a, 0xca, 0x5c, 0x84, 0x1a, 0x9e, 0x7b, 0xec, 0x14, 0xe4, 0x95, 0x9d, + 0x3b, 0x64, 0xa3, 0x90, 0x86, 0xc6, 0x4a, 0x6d, 0xd8, 0x93, 0x1b, 0x85, 0x63, 0x87, 0x40, 0x08, + 0xcd, 0x4a, 0x15, 0x78, 0xff, 0x8e, 0x0b, 0x21, 0xc8, 0x70, 0x39, 0xb4, 0xaf, 0x2c, 0x3c, 0x4f, + 0xa4, 0x58, 0x18, 0xd6, 0xc3, 0xbd, 0xc0, 0x01, 0x63, 0x43, 0xf7, 0x48, 0xd3, 0x57, 0xb2, 0x50, + 0x59, 0xce, 0x3e, 0x47, 0x47, 0x82, 0x81, 0xc7, 0x78, 0x63, 0x8d, 0x45, 0x3d, 0xc9, 0x72, 0xfa, + 0x67, 0xf2, 0xf1, 0xdd, 0x00, 0x8b, 0x14, 0x9a, 0x50, 0xbf, 0x57, 0xda, 0xeb, 0x0c, 0xdb, 0x2e, + 0x3f, 0xa2, 0x25, 0x82, 0x7c, 0xfb, 0x4e, 0xd0, 0x8f, 0xf3, 0x58, 0xc2, 0x43, 0xcb, 0x8b, 0xdc, + 0x58, 0x91, 0xa8, 0x54, 0x59, 0xf6, 0x14, 0xb3, 0xa5, 0xfe, 0xed, 0x37, 0xcf, 0xff, 0xf8, 0xe2, + 0xe5, 0x77, 0x9c, 0xe0, 0xde, 0x11, 0x6c, 0xd1, 0x3d, 0xd2, 0xc5, 0x44, 0x11, 0x26, 0x0a, 0x33, + 0x01, 0xdd, 0xcf, 0xb0, 0x2f, 0xd0, 0xec, 0x0e, 0xe2, 0xf3, 0x28, 0xcc, 0x66, 0x80, 0xd2, 0x4f, + 0x21, 0x6f, 0xac, 0xd4, 0x59, 0x98, 0xb0, 0x5d, 0xef, 0x98, 0x97, 0x31, 0xa7, 0xd2, 0xc2, 0x5e, + 0x8b, 0xcc, 0xb0, 0x2f, 0xe1, 0x31, 0x5e, 0x47, 0xf9, 0x04, 0x7c, 0xae, 0xbb, 0x51, 0x60, 0xd8, + 0x57, 0x3e, 0xbb, 0xef, 0x8e, 0x06, 0x5e, 0x03, 0xf9, 0xc4, 0xd0, 0xcf, 0x49, 0xcb, 0x67, 0x47, + 0xa1, 0xf3, 0xc2, 0xb0, 0xdf, 0x62, 0x85, 0xfa, 0x06, 0x3e, 0x03, 0x88, 0xee, 0x93, 0xed, 0xdb, + 0x2a, 0xae, 0x93, 0xec, 0xa3, 0xde, 0xbd, 0x5b, 0x7a, 0xd8, 0x51, 0x9e, 0x93, 0x87, 0x5e, 0x37, + 0x5e, 0xa7, 0x85, 0x88, 0xf2, 0xcc, 0xea, 0x3c, 0x49, 0xa4, 0x66, 0x5f, 0xa3, 0xf5, 0xf7, 0xdd, + 0xee, 0xe1, 0x3a, 0x2d, 0x0e, 0x6e, 0xf6, 0xa0, 0x2b, 0x2f, 0xb4, 0x94, 0xef, 0x37, 0x81, 0x67, + 0xcf, 0xf0, 0xf6, 0x96, 0x03, 0x5d, 0x8c, 0x61, 0x42, 0x5b, 0x95, 0x4a, 0x98, 0x95, 0xbf, 0x73, + 0xde, 0x7a, 0x91, 0x7e, 0x4d, 0x28, 0xf4, 0x63, 0xcc, 0x0e, 0x95, 0x89, 0x45, 0xa2, 0x96, 0x17, + 0x96, 0x0d, 0x30, 0x83, 0xa0, 0x53, 0xcf, 0x57, 0xaa, 0x98, 0x64, 0x63, 0x84, 0xc1, 0xe1, 0x9f, + 0x64, 0xb8, 0x12, 0xe6, 0xda, 0x44, 0x36, 0x31, 0xec, 0xf7, 0xa8, 0xd6, 0x04, 0x6c, 0xee, 0x20, + 0x6c, 0x1c, 0xe1, 0xfb, 0x6b, 0xec, 0x85, 0x86, 0x7d, 0xe3, 0x1b, 0x47, 0xf8, 0xfe, 0x7a, 0x06, + 0x00, 0x36, 0x6b, 0x1b, 0xda, 0xb5, 0x81, 0xba, 0xf8, 0x16, 0xbb, 0x4e, 0xe0, 0x80, 0x71, 0x0c, + 0xc1, 0xca, 0x75, 0x71, 0x01, 0xb4, 0x5a, 0xe3, 0xb3, 0x99, 0x0d, 0x9d, 0x29, 0x6e, 0x63, 0x66, + 0x8d, 0x4b, 0xe9, 0xfe, 0x33, 0xff, 0x47, 0xc0, 0x50, 0x69, 0x69, 0x0a, 0xa0, 0x5b, 0x4b, 0x63, + 0x73, 0x2d, 0x63, 0x9c, 0x97, 0x01, 0xbf, 0x91, 0xfb, 0xbb, 0x64, 0x1b, 0xb5, 0x3d, 0xe0, 0x0e, + 0xf8, 0x09, 0xe7, 0x66, 0x1f, 0x2c, 0xfb, 0x2f, 0x49, 0x13, 0xd5, 0x5c, 0x6b, 0xa6, 0x0f, 0x49, + 0xcd, 0xf5, 0x6c, 0x3f, 0x7f, 0xbd, 0xf4, 0xcb, 0xd1, 0xd8, 0xff, 0xc1, 0xfd, 0x95, 0xc4, 0x42, + 0x86, 0x76, 0xad, 0x9d, 0x9f, 0xa9, 0x4c, 0x05, 0xb6, 0xe3, 0x8d, 0x35, 0xa9, 0x4c, 0x4f, 0x41, + 0xfe, 0x59, 0x8c, 0xca, 0x3f, 0x8b, 0x51, 0xff, 0x9f, 0x25, 0x12, 0x78, 0x6b, 0xff, 0x46, 0xfb, + 0xa4, 0x62, 0xaf, 0x0b, 0x37, 0xcd, 0x3b, 0xc3, 0xce, 0x60, 0xb3, 0x21, 0x00, 0xe5, 0xb8, 0x47, + 0x9f, 0x90, 0x0a, 0x8c, 0x75, 0xbc, 0xa9, 0x39, 0x24, 0x83, 0x9b, 0x41, 0xcf, 0x11, 0xbf, 0x3d, + 0x82, 0xd6, 0x51, 0x04, 0xdf, 0xb4, 0xad, 0x3b, 0x23, 0xc8, 0x81, 0x60, 0xf3, 0x4a, 0xca, 0x42, + 0xe4, 0x85, 0xcc, 0xfc, 0xe0, 0x0e, 0x00, 0x98, 0x16, 0x32, 0xa3, 0xfb, 0x24, 0xd8, 0x38, 0x87, + 0x03, 0xbb, 0xb9, 0xb1, 0x65, 0x83, 0xf2, 0x9b, 0xfd, 0xfe, 0xbf, 0xcb, 0xfe, 0xb3, 0x81, 0x61, + 0xfe, 0x7f, 0x3c, 0x60, 0xa4, 0xbe, 0x31, 0x0d, 0xbe, 0x35, 0x01, 0xdf, 0x88, 0xf4, 0x29, 0xa9, + 0x00, 0xc5, 0x68, 0xf1, 0xcd, 0xa0, 0xb9, 0x21, 0x9d, 0xe3, 0x26, 0x7d, 0x46, 0xea, 0x9e, 0x59, + 0xb4, 0xbb, 0x39, 0xa4, 0x83, 0x5f, 0xd0, 0xcd, 0x37, 0x2a, 0xf4, 0x0b, 0x52, 0x73, 0x8e, 0x7b, + 0x47, 0x5a, 0x83, 0x5b, 0xa4, 0x73, 0xbf, 0xe7, 0xe7, 0x7b, 0xed, 0x7f, 0xce, 0xf7, 0x47, 0x40, + 0x96, 0x90, 0x5a, 0x67, 0x39, 0xfe, 0x3e, 0xaa, 0xbc, 0x1e, 0xe9, 0x11, 0x88, 0x77, 0x62, 0x16, + 0xfc, 0xf7, 0x98, 0x41, 0xf0, 0xdd, 0x35, 0xa9, 0x59, 0xe2, 0x4f, 0xa4, 0xc1, 0x03, 0xbc, 0x27, + 0x35, 0x4b, 0x18, 0x73, 0x97, 0x52, 0x1b, 0x95, 0x67, 0xf8, 0x0b, 0x69, 0x6e, 0x1a, 0xaa, 0x07, + 0xf9, 0x66, 0xb7, 0xff, 0xf7, 0x12, 0x69, 0xdd, 0xde, 0x81, 0xdf, 0x60, 0x1a, 0xbe, 0xcb, 0xb5, + 0xcf, 0x72, 0x27, 0x20, 0xaa, 0xb2, 0x5c, 0xfb, 0x8f, 0xa7, 0x13, 0x00, 0x5d, 0x2a, 0xeb, 0xbf, + 0xe6, 0x0d, 0xee, 0x04, 0x28, 0x2b, 0xb3, 0x3e, 0x77, 0x3f, 0xa4, 0x8a, 0x2f, 0x58, 0x2f, 0xc3, + 0x09, 0xfc, 0xe9, 0x62, 0x20, 0xab, 0xdc, 0x09, 0xf0, 0x95, 0x81, 0x5e, 0x89, 0xb1, 0x6b, 0x70, + 0x5c, 0xef, 0x0b, 0x6f, 0x97, 0x1f, 0x01, 0x94, 0x90, 0xda, 0xe4, 0xcd, 0xc9, 0x94, 0x8f, 0xba, + 0x1f, 0xd1, 0x26, 0xa9, 0x1f, 0xbc, 0x11, 0x27, 0xd3, 0x93, 0x51, 0xb7, 0x44, 0x1b, 0xa4, 0x3a, + 0xe3, 0xd3, 0xd9, 0xbc, 0x5b, 0xa6, 0x01, 0xa9, 0xcc, 0xa7, 0xe3, 0xd3, 0xee, 0x16, 0xac, 0xc6, + 0x67, 0x47, 0x47, 0xdd, 0x0a, 0x9c, 0x9b, 0x9f, 0xf2, 0xc9, 0xc1, 0x69, 0xb7, 0x0a, 0xe7, 0x0e, + 0x47, 0xe3, 0xd7, 0x67, 0x47, 0xa7, 0xdd, 0xda, 0xfe, 0x3f, 0x4a, 0xbe, 0x04, 0x37, 0x99, 0x05, + 0x37, 0x8d, 0x8e, 0x67, 0xa7, 0x3f, 0x76, 0x3f, 0x82, 0xf3, 0x87, 0x67, 0xc7, 0xb3, 0x6e, 0x09, + 0xce, 0xf0, 0xd1, 0xfc, 0x14, 0x1e, 0x2e, 0x83, 0xc6, 0xc1, 0x5f, 0x46, 0x07, 0x3f, 0x74, 0xb7, + 0x68, 0x8b, 0x04, 0x33, 0x3e, 0x12, 0xa8, 0x55, 0xa1, 0xf7, 0x48, 0x73, 0xf6, 0xfa, 0xcd, 0x48, + 0xcc, 0x47, 0xfc, 0xed, 0x88, 0x77, 0xab, 0xf0, 0xec, 0xc9, 0xf4, 0x74, 0x32, 0xfe, 0xb1, 0x5b, + 0xa3, 0x5d, 0xd2, 0x3a, 0x98, 0x9d, 0x4d, 0x4e, 0xc6, 0x53, 0xa7, 0x5e, 0xa7, 0xdb, 0xa4, 0xbd, + 0x41, 0xdc, 0x7d, 0x01, 0x40, 0xe3, 0xd1, 0xeb, 0xd3, 0x33, 0x3e, 0xf2, 0x50, 0x03, 0x9e, 0x7e, + 0x3b, 0xe2, 0xf3, 0xc9, 0xf4, 0xa4, 0x4b, 0xfe, 0x13, 0x00, 0x00, 0xff, 0xff, 0x5f, 0x2a, 0xaf, + 0x49, 0x5b, 0x0d, 0x00, 0x00, } diff --git a/vendor/github.com/opencontainers/runc/libcontainer/criurpc/criurpc.proto b/vendor/github.com/opencontainers/runc/libcontainer/criurpc/criurpc.proto index f924b735..48e42e26 100644 --- a/vendor/github.com/opencontainers/runc/libcontainer/criurpc/criurpc.proto +++ b/vendor/github.com/opencontainers/runc/libcontainer/criurpc/criurpc.proto @@ -140,6 +140,8 @@ enum criu_req_type { CPUINFO_CHECK = 8; FEATURE_CHECK = 9; + + VERSION = 10; } /* @@ -148,6 +150,7 @@ enum criu_req_type { */ message criu_features { optional bool mem_track = 1; + optional bool lazy_pages = 2; } /* @@ -192,4 +195,15 @@ message criu_resp { optional int32 cr_errno = 7; optional criu_features features = 8; optional string cr_errmsg = 9; + optional criu_version version = 10; +} + +/* Answer for criu_req_type.VERSION requests */ +message criu_version { + required int32 major = 1; + required int32 minor = 2; + optional string gitid = 3; + optional int32 sublevel = 4; + optional int32 extra = 5; + optional string name = 6; } diff --git a/vendor/github.com/opencontainers/runc/libcontainer/init_linux.go b/vendor/github.com/opencontainers/runc/libcontainer/init_linux.go index 65bee0be..63afd28e 100644 --- a/vendor/github.com/opencontainers/runc/libcontainer/init_linux.go +++ b/vendor/github.com/opencontainers/runc/libcontainer/init_linux.go @@ -12,14 +12,14 @@ import ( "syscall" // only for Errno "unsafe" - "github.com/Sirupsen/logrus" "github.com/opencontainers/runc/libcontainer/cgroups" "github.com/opencontainers/runc/libcontainer/configs" "github.com/opencontainers/runc/libcontainer/system" "github.com/opencontainers/runc/libcontainer/user" "github.com/opencontainers/runc/libcontainer/utils" - "github.com/vishvananda/netlink" + "github.com/sirupsen/logrus" + "github.com/vishvananda/netlink" "golang.org/x/sys/unix" ) diff --git a/vendor/github.com/opencontainers/runc/libcontainer/state_linux.go b/vendor/github.com/opencontainers/runc/libcontainer/state_linux.go index 07055695..44fa6b43 100644 --- a/vendor/github.com/opencontainers/runc/libcontainer/state_linux.go +++ b/vendor/github.com/opencontainers/runc/libcontainer/state_linux.go @@ -7,10 +7,10 @@ import ( "os" "path/filepath" - "github.com/Sirupsen/logrus" "github.com/opencontainers/runc/libcontainer/configs" "github.com/opencontainers/runc/libcontainer/utils" + "github.com/sirupsen/logrus" "golang.org/x/sys/unix" ) diff --git a/vendor/github.com/vishvananda/netlink/LICENSE b/vendor/github.com/vishvananda/netlink/LICENSE new file mode 100644 index 00000000..9f64db85 --- /dev/null +++ b/vendor/github.com/vishvananda/netlink/LICENSE @@ -0,0 +1,192 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + Copyright 2014 Vishvananda Ishaya. + Copyright 2014 Docker, Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/vendor/github.com/vishvananda/netlink/README.md b/vendor/github.com/vishvananda/netlink/README.md new file mode 100644 index 00000000..0b61be21 --- /dev/null +++ b/vendor/github.com/vishvananda/netlink/README.md @@ -0,0 +1,91 @@ +# netlink - netlink library for go # + +[![Build Status](https://travis-ci.org/vishvananda/netlink.png?branch=master)](https://travis-ci.org/vishvananda/netlink) [![GoDoc](https://godoc.org/github.com/vishvananda/netlink?status.svg)](https://godoc.org/github.com/vishvananda/netlink) + +The netlink package provides a simple netlink library for go. Netlink +is the interface a user-space program in linux uses to communicate with +the kernel. It can be used to add and remove interfaces, set ip addresses +and routes, and configure ipsec. Netlink communication requires elevated +privileges, so in most cases this code needs to be run as root. Since +low-level netlink messages are inscrutable at best, the library attempts +to provide an api that is loosely modeled on the CLI provided by iproute2. +Actions like `ip link add` will be accomplished via a similarly named +function like AddLink(). This library began its life as a fork of the +netlink functionality in +[docker/libcontainer](https://github.com/docker/libcontainer) but was +heavily rewritten to improve testability, performance, and to add new +functionality like ipsec xfrm handling. + +## Local Build and Test ## + +You can use go get command: + + go get github.com/vishvananda/netlink + +Testing dependencies: + + go get github.com/vishvananda/netns + +Testing (requires root): + + sudo -E go test github.com/vishvananda/netlink + +## Examples ## + +Add a new bridge and add eth1 into it: + +```go +package main + +import ( + "fmt" + "github.com/vishvananda/netlink" +) + +func main() { + la := netlink.NewLinkAttrs() + la.Name = "foo" + mybridge := &netlink.Bridge{LinkAttrs: la} + err := netlink.LinkAdd(mybridge) + if err != nil { + fmt.Printf("could not add %s: %v\n", la.Name, err) + } + eth1, _ := netlink.LinkByName("eth1") + netlink.LinkSetMaster(eth1, mybridge) +} + +``` +Note `NewLinkAttrs` constructor, it sets default values in structure. For now +it sets only `TxQLen` to `-1`, so kernel will set default by itself. If you're +using simple initialization(`LinkAttrs{Name: "foo"}`) `TxQLen` will be set to +`0` unless you specify it like `LinkAttrs{Name: "foo", TxQLen: 1000}`. + +Add a new ip address to loopback: + +```go +package main + +import ( + "github.com/vishvananda/netlink" +) + +func main() { + lo, _ := netlink.LinkByName("lo") + addr, _ := netlink.ParseAddr("169.254.169.254/32") + netlink.AddrAdd(lo, addr) +} + +``` + +## Future Work ## + +Many pieces of netlink are not yet fully supported in the high-level +interface. Aspects of virtually all of the high-level objects don't exist. +Many of the underlying primitives are there, so its a matter of putting +the right fields into the high-level objects and making sure that they +are serialized and deserialized correctly in the Add and List methods. + +There are also a few pieces of low level netlink functionality that still +need to be implemented. Routing rules are not in place and some of the +more advanced link types. Hopefully there is decent structure and testing +in place to make these fairly straightforward to add. diff --git a/vendor/github.com/vishvananda/netlink/addr.go b/vendor/github.com/vishvananda/netlink/addr.go new file mode 100644 index 00000000..f08c9569 --- /dev/null +++ b/vendor/github.com/vishvananda/netlink/addr.go @@ -0,0 +1,56 @@ +package netlink + +import ( + "fmt" + "net" + "strings" +) + +// Addr represents an IP address from netlink. Netlink ip addresses +// include a mask, so it stores the address as a net.IPNet. +type Addr struct { + *net.IPNet + Label string + Flags int + Scope int + Peer *net.IPNet + Broadcast net.IP + PreferedLft int + ValidLft int +} + +// String returns $ip/$netmask $label +func (a Addr) String() string { + return strings.TrimSpace(fmt.Sprintf("%s %s", a.IPNet, a.Label)) +} + +// ParseAddr parses the string representation of an address in the +// form $ip/$netmask $label. The label portion is optional +func ParseAddr(s string) (*Addr, error) { + label := "" + parts := strings.Split(s, " ") + if len(parts) > 1 { + s = parts[0] + label = parts[1] + } + m, err := ParseIPNet(s) + if err != nil { + return nil, err + } + return &Addr{IPNet: m, Label: label}, nil +} + +// Equal returns true if both Addrs have the same net.IPNet value. +func (a Addr) Equal(x Addr) bool { + sizea, _ := a.Mask.Size() + sizeb, _ := x.Mask.Size() + // ignore label for comparison + return a.IP.Equal(x.IP) && sizea == sizeb +} + +func (a Addr) PeerEqual(x Addr) bool { + sizea, _ := a.Peer.Mask.Size() + sizeb, _ := x.Peer.Mask.Size() + // ignore label for comparison + return a.Peer.IP.Equal(x.Peer.IP) && sizea == sizeb +} diff --git a/vendor/github.com/vishvananda/netlink/addr_linux.go b/vendor/github.com/vishvananda/netlink/addr_linux.go new file mode 100644 index 00000000..f33242a7 --- /dev/null +++ b/vendor/github.com/vishvananda/netlink/addr_linux.go @@ -0,0 +1,288 @@ +package netlink + +import ( + "fmt" + "log" + "net" + "strings" + "syscall" + + "github.com/vishvananda/netlink/nl" + "github.com/vishvananda/netns" +) + +// IFA_FLAGS is a u32 attribute. +const IFA_FLAGS = 0x8 + +// AddrAdd will add an IP address to a link device. +// Equivalent to: `ip addr add $addr dev $link` +func AddrAdd(link Link, addr *Addr) error { + return pkgHandle.AddrAdd(link, addr) +} + +// AddrAdd will add an IP address to a link device. +// Equivalent to: `ip addr add $addr dev $link` +func (h *Handle) AddrAdd(link Link, addr *Addr) error { + req := h.newNetlinkRequest(syscall.RTM_NEWADDR, syscall.NLM_F_CREATE|syscall.NLM_F_EXCL|syscall.NLM_F_ACK) + return h.addrHandle(link, addr, req) +} + +// AddrReplace will replace (or, if not present, add) an IP address on a link device. +// Equivalent to: `ip addr replace $addr dev $link` +func AddrReplace(link Link, addr *Addr) error { + return pkgHandle.AddrReplace(link, addr) +} + +// AddrReplace will replace (or, if not present, add) an IP address on a link device. +// Equivalent to: `ip addr replace $addr dev $link` +func (h *Handle) AddrReplace(link Link, addr *Addr) error { + req := h.newNetlinkRequest(syscall.RTM_NEWADDR, syscall.NLM_F_CREATE|syscall.NLM_F_REPLACE|syscall.NLM_F_ACK) + return h.addrHandle(link, addr, req) +} + +// AddrDel will delete an IP address from a link device. +// Equivalent to: `ip addr del $addr dev $link` +func AddrDel(link Link, addr *Addr) error { + return pkgHandle.AddrDel(link, addr) +} + +// AddrDel will delete an IP address from a link device. +// Equivalent to: `ip addr del $addr dev $link` +func (h *Handle) AddrDel(link Link, addr *Addr) error { + req := h.newNetlinkRequest(syscall.RTM_DELADDR, syscall.NLM_F_ACK) + return h.addrHandle(link, addr, req) +} + +func (h *Handle) addrHandle(link Link, addr *Addr, req *nl.NetlinkRequest) error { + base := link.Attrs() + if addr.Label != "" && !strings.HasPrefix(addr.Label, base.Name) { + return fmt.Errorf("label must begin with interface name") + } + h.ensureIndex(base) + + family := nl.GetIPFamily(addr.IP) + + msg := nl.NewIfAddrmsg(family) + msg.Index = uint32(base.Index) + msg.Scope = uint8(addr.Scope) + prefixlen, _ := addr.Mask.Size() + msg.Prefixlen = uint8(prefixlen) + req.AddData(msg) + + var localAddrData []byte + if family == FAMILY_V4 { + localAddrData = addr.IP.To4() + } else { + localAddrData = addr.IP.To16() + } + + localData := nl.NewRtAttr(syscall.IFA_LOCAL, localAddrData) + req.AddData(localData) + var peerAddrData []byte + if addr.Peer != nil { + if family == FAMILY_V4 { + peerAddrData = addr.Peer.IP.To4() + } else { + peerAddrData = addr.Peer.IP.To16() + } + } else { + peerAddrData = localAddrData + } + + addressData := nl.NewRtAttr(syscall.IFA_ADDRESS, peerAddrData) + req.AddData(addressData) + + if addr.Flags != 0 { + if addr.Flags <= 0xff { + msg.IfAddrmsg.Flags = uint8(addr.Flags) + } else { + b := make([]byte, 4) + native.PutUint32(b, uint32(addr.Flags)) + flagsData := nl.NewRtAttr(IFA_FLAGS, b) + req.AddData(flagsData) + } + } + + if addr.Broadcast != nil { + req.AddData(nl.NewRtAttr(syscall.IFA_BROADCAST, addr.Broadcast)) + } + + if addr.Label != "" { + labelData := nl.NewRtAttr(syscall.IFA_LABEL, nl.ZeroTerminated(addr.Label)) + req.AddData(labelData) + } + + _, err := req.Execute(syscall.NETLINK_ROUTE, 0) + return err +} + +// AddrList gets a list of IP addresses in the system. +// Equivalent to: `ip addr show`. +// The list can be filtered by link and ip family. +func AddrList(link Link, family int) ([]Addr, error) { + return pkgHandle.AddrList(link, family) +} + +// AddrList gets a list of IP addresses in the system. +// Equivalent to: `ip addr show`. +// The list can be filtered by link and ip family. +func (h *Handle) AddrList(link Link, family int) ([]Addr, error) { + req := h.newNetlinkRequest(syscall.RTM_GETADDR, syscall.NLM_F_DUMP) + msg := nl.NewIfInfomsg(family) + req.AddData(msg) + + msgs, err := req.Execute(syscall.NETLINK_ROUTE, syscall.RTM_NEWADDR) + if err != nil { + return nil, err + } + + indexFilter := 0 + if link != nil { + base := link.Attrs() + h.ensureIndex(base) + indexFilter = base.Index + } + + var res []Addr + for _, m := range msgs { + addr, msgFamily, ifindex, err := parseAddr(m) + if err != nil { + return res, err + } + + if link != nil && ifindex != indexFilter { + // Ignore messages from other interfaces + continue + } + + if family != FAMILY_ALL && msgFamily != family { + continue + } + + res = append(res, addr) + } + + return res, nil +} + +func parseAddr(m []byte) (addr Addr, family, index int, err error) { + msg := nl.DeserializeIfAddrmsg(m) + + family = -1 + index = -1 + + attrs, err1 := nl.ParseRouteAttr(m[msg.Len():]) + if err1 != nil { + err = err1 + return + } + + family = int(msg.Family) + index = int(msg.Index) + + var local, dst *net.IPNet + for _, attr := range attrs { + switch attr.Attr.Type { + case syscall.IFA_ADDRESS: + dst = &net.IPNet{ + IP: attr.Value, + Mask: net.CIDRMask(int(msg.Prefixlen), 8*len(attr.Value)), + } + addr.Peer = dst + case syscall.IFA_LOCAL: + local = &net.IPNet{ + IP: attr.Value, + Mask: net.CIDRMask(int(msg.Prefixlen), 8*len(attr.Value)), + } + addr.IPNet = local + case syscall.IFA_BROADCAST: + addr.Broadcast = attr.Value + case syscall.IFA_LABEL: + addr.Label = string(attr.Value[:len(attr.Value)-1]) + case IFA_FLAGS: + addr.Flags = int(native.Uint32(attr.Value[0:4])) + case nl.IFA_CACHEINFO: + ci := nl.DeserializeIfaCacheInfo(attr.Value) + addr.PreferedLft = int(ci.IfaPrefered) + addr.ValidLft = int(ci.IfaValid) + } + } + + // IFA_LOCAL should be there but if not, fall back to IFA_ADDRESS + if local != nil { + addr.IPNet = local + } else { + addr.IPNet = dst + } + addr.Scope = int(msg.Scope) + + return +} + +type AddrUpdate struct { + LinkAddress net.IPNet + LinkIndex int + Flags int + Scope int + PreferedLft int + ValidLft int + NewAddr bool // true=added false=deleted +} + +// AddrSubscribe takes a chan down which notifications will be sent +// when addresses change. Close the 'done' chan to stop subscription. +func AddrSubscribe(ch chan<- AddrUpdate, done <-chan struct{}) error { + return addrSubscribe(netns.None(), netns.None(), ch, done) +} + +// AddrSubscribeAt works like AddrSubscribe plus it allows the caller +// to choose the network namespace in which to subscribe (ns). +func AddrSubscribeAt(ns netns.NsHandle, ch chan<- AddrUpdate, done <-chan struct{}) error { + return addrSubscribe(ns, netns.None(), ch, done) +} + +func addrSubscribe(newNs, curNs netns.NsHandle, ch chan<- AddrUpdate, done <-chan struct{}) error { + s, err := nl.SubscribeAt(newNs, curNs, syscall.NETLINK_ROUTE, syscall.RTNLGRP_IPV4_IFADDR, syscall.RTNLGRP_IPV6_IFADDR) + if err != nil { + return err + } + if done != nil { + go func() { + <-done + s.Close() + }() + } + go func() { + defer close(ch) + for { + msgs, err := s.Receive() + if err != nil { + log.Printf("netlink.AddrSubscribe: Receive() error: %v", err) + return + } + for _, m := range msgs { + msgType := m.Header.Type + if msgType != syscall.RTM_NEWADDR && msgType != syscall.RTM_DELADDR { + log.Printf("netlink.AddrSubscribe: bad message type: %d", msgType) + continue + } + + addr, _, ifindex, err := parseAddr(m.Data) + if err != nil { + log.Printf("netlink.AddrSubscribe: could not parse address: %v", err) + continue + } + + ch <- AddrUpdate{LinkAddress: *addr.IPNet, + LinkIndex: ifindex, + NewAddr: msgType == syscall.RTM_NEWADDR, + Flags: addr.Flags, + Scope: addr.Scope, + PreferedLft: addr.PreferedLft, + ValidLft: addr.ValidLft} + } + } + }() + + return nil +} diff --git a/vendor/github.com/vishvananda/netlink/bpf_linux.go b/vendor/github.com/vishvananda/netlink/bpf_linux.go new file mode 100644 index 00000000..53374398 --- /dev/null +++ b/vendor/github.com/vishvananda/netlink/bpf_linux.go @@ -0,0 +1,62 @@ +package netlink + +/* +#include +#include +#include +#include +#include +#include + +static int load_simple_bpf(int prog_type, int ret) { +#ifdef __NR_bpf + // { return ret; } + __u64 __attribute__((aligned(8))) insns[] = { + 0x00000000000000b7ull | ((__u64)ret<<32), + 0x0000000000000095ull, + }; + __u8 __attribute__((aligned(8))) license[] = "ASL2"; + // Copied from a header file since libc is notoriously slow to update. + // The call will succeed or fail and that will be our indication on + // whether or not it is supported. + struct { + __u32 prog_type; + __u32 insn_cnt; + __u64 insns; + __u64 license; + __u32 log_level; + __u32 log_size; + __u64 log_buf; + __u32 kern_version; + } __attribute__((aligned(8))) attr = { + .prog_type = prog_type, + .insn_cnt = 2, + .insns = (uintptr_t)&insns, + .license = (uintptr_t)&license, + }; + return syscall(__NR_bpf, 5, &attr, sizeof(attr)); +#else + errno = EINVAL; + return -1; +#endif +} +*/ +import "C" + +type BpfProgType C.int + +const ( + BPF_PROG_TYPE_UNSPEC BpfProgType = iota + BPF_PROG_TYPE_SOCKET_FILTER + BPF_PROG_TYPE_KPROBE + BPF_PROG_TYPE_SCHED_CLS + BPF_PROG_TYPE_SCHED_ACT + BPF_PROG_TYPE_TRACEPOINT + BPF_PROG_TYPE_XDP +) + +// loadSimpleBpf loads a trivial bpf program for testing purposes +func loadSimpleBpf(progType BpfProgType, ret int) (int, error) { + fd, err := C.load_simple_bpf(C.int(progType), C.int(ret)) + return int(fd), err +} diff --git a/vendor/github.com/vishvananda/netlink/bridge_linux.go b/vendor/github.com/vishvananda/netlink/bridge_linux.go new file mode 100644 index 00000000..a65d6a13 --- /dev/null +++ b/vendor/github.com/vishvananda/netlink/bridge_linux.go @@ -0,0 +1,115 @@ +package netlink + +import ( + "fmt" + "syscall" + + "github.com/vishvananda/netlink/nl" +) + +// BridgeVlanList gets a map of device id to bridge vlan infos. +// Equivalent to: `bridge vlan show` +func BridgeVlanList() (map[int32][]*nl.BridgeVlanInfo, error) { + return pkgHandle.BridgeVlanList() +} + +// BridgeVlanList gets a map of device id to bridge vlan infos. +// Equivalent to: `bridge vlan show` +func (h *Handle) BridgeVlanList() (map[int32][]*nl.BridgeVlanInfo, error) { + req := h.newNetlinkRequest(syscall.RTM_GETLINK, syscall.NLM_F_DUMP) + msg := nl.NewIfInfomsg(syscall.AF_BRIDGE) + req.AddData(msg) + req.AddData(nl.NewRtAttr(nl.IFLA_EXT_MASK, nl.Uint32Attr(uint32(nl.RTEXT_FILTER_BRVLAN)))) + + msgs, err := req.Execute(syscall.NETLINK_ROUTE, syscall.RTM_NEWLINK) + if err != nil { + return nil, err + } + ret := make(map[int32][]*nl.BridgeVlanInfo) + for _, m := range msgs { + msg := nl.DeserializeIfInfomsg(m) + + attrs, err := nl.ParseRouteAttr(m[msg.Len():]) + if err != nil { + return nil, err + } + for _, attr := range attrs { + switch attr.Attr.Type { + case nl.IFLA_AF_SPEC: + //nested attr + nestAttrs, err := nl.ParseRouteAttr(attr.Value) + if err != nil { + return nil, fmt.Errorf("failed to parse nested attr %v", err) + } + for _, nestAttr := range nestAttrs { + switch nestAttr.Attr.Type { + case nl.IFLA_BRIDGE_VLAN_INFO: + vlanInfo := nl.DeserializeBridgeVlanInfo(nestAttr.Value) + ret[msg.Index] = append(ret[msg.Index], vlanInfo) + } + } + } + } + } + return ret, nil +} + +// BridgeVlanAdd adds a new vlan filter entry +// Equivalent to: `bridge vlan add dev DEV vid VID [ pvid ] [ untagged ] [ self ] [ master ]` +func BridgeVlanAdd(link Link, vid uint16, pvid, untagged, self, master bool) error { + return pkgHandle.BridgeVlanAdd(link, vid, pvid, untagged, self, master) +} + +// BridgeVlanAdd adds a new vlan filter entry +// Equivalent to: `bridge vlan add dev DEV vid VID [ pvid ] [ untagged ] [ self ] [ master ]` +func (h *Handle) BridgeVlanAdd(link Link, vid uint16, pvid, untagged, self, master bool) error { + return h.bridgeVlanModify(syscall.RTM_SETLINK, link, vid, pvid, untagged, self, master) +} + +// BridgeVlanDel adds a new vlan filter entry +// Equivalent to: `bridge vlan del dev DEV vid VID [ pvid ] [ untagged ] [ self ] [ master ]` +func BridgeVlanDel(link Link, vid uint16, pvid, untagged, self, master bool) error { + return pkgHandle.BridgeVlanDel(link, vid, pvid, untagged, self, master) +} + +// BridgeVlanDel adds a new vlan filter entry +// Equivalent to: `bridge vlan del dev DEV vid VID [ pvid ] [ untagged ] [ self ] [ master ]` +func (h *Handle) BridgeVlanDel(link Link, vid uint16, pvid, untagged, self, master bool) error { + return h.bridgeVlanModify(syscall.RTM_DELLINK, link, vid, pvid, untagged, self, master) +} + +func (h *Handle) bridgeVlanModify(cmd int, link Link, vid uint16, pvid, untagged, self, master bool) error { + base := link.Attrs() + h.ensureIndex(base) + req := h.newNetlinkRequest(cmd, syscall.NLM_F_ACK) + + msg := nl.NewIfInfomsg(syscall.AF_BRIDGE) + msg.Index = int32(base.Index) + req.AddData(msg) + + br := nl.NewRtAttr(nl.IFLA_AF_SPEC, nil) + var flags uint16 + if self { + flags |= nl.BRIDGE_FLAGS_SELF + } + if master { + flags |= nl.BRIDGE_FLAGS_MASTER + } + if flags > 0 { + nl.NewRtAttrChild(br, nl.IFLA_BRIDGE_FLAGS, nl.Uint16Attr(flags)) + } + vlanInfo := &nl.BridgeVlanInfo{Vid: vid} + if pvid { + vlanInfo.Flags |= nl.BRIDGE_VLAN_INFO_PVID + } + if untagged { + vlanInfo.Flags |= nl.BRIDGE_VLAN_INFO_UNTAGGED + } + nl.NewRtAttrChild(br, nl.IFLA_BRIDGE_VLAN_INFO, vlanInfo.Serialize()) + req.AddData(br) + _, err := req.Execute(syscall.NETLINK_ROUTE, 0) + if err != nil { + return err + } + return nil +} diff --git a/vendor/github.com/vishvananda/netlink/class.go b/vendor/github.com/vishvananda/netlink/class.go new file mode 100644 index 00000000..8ee13af4 --- /dev/null +++ b/vendor/github.com/vishvananda/netlink/class.go @@ -0,0 +1,78 @@ +package netlink + +import ( + "fmt" +) + +type Class interface { + Attrs() *ClassAttrs + Type() string +} + +// ClassAttrs represents a netlink class. A filter is associated with a link, +// has a handle and a parent. The root filter of a device should have a +// parent == HANDLE_ROOT. +type ClassAttrs struct { + LinkIndex int + Handle uint32 + Parent uint32 + Leaf uint32 +} + +func (q ClassAttrs) String() string { + return fmt.Sprintf("{LinkIndex: %d, Handle: %s, Parent: %s, Leaf: %d}", q.LinkIndex, HandleStr(q.Handle), HandleStr(q.Parent), q.Leaf) +} + +type HtbClassAttrs struct { + // TODO handle all attributes + Rate uint64 + Ceil uint64 + Buffer uint32 + Cbuffer uint32 + Quantum uint32 + Level uint32 + Prio uint32 +} + +func (q HtbClassAttrs) String() string { + return fmt.Sprintf("{Rate: %d, Ceil: %d, Buffer: %d, Cbuffer: %d}", q.Rate, q.Ceil, q.Buffer, q.Cbuffer) +} + +// HtbClass represents an Htb class +type HtbClass struct { + ClassAttrs + Rate uint64 + Ceil uint64 + Buffer uint32 + Cbuffer uint32 + Quantum uint32 + Level uint32 + Prio uint32 +} + +func (q HtbClass) String() string { + return fmt.Sprintf("{Rate: %d, Ceil: %d, Buffer: %d, Cbuffer: %d}", q.Rate, q.Ceil, q.Buffer, q.Cbuffer) +} + +func (q *HtbClass) Attrs() *ClassAttrs { + return &q.ClassAttrs +} + +func (q *HtbClass) Type() string { + return "htb" +} + +// GenericClass classes represent types that are not currently understood +// by this netlink library. +type GenericClass struct { + ClassAttrs + ClassType string +} + +func (class *GenericClass) Attrs() *ClassAttrs { + return &class.ClassAttrs +} + +func (class *GenericClass) Type() string { + return class.ClassType +} diff --git a/vendor/github.com/vishvananda/netlink/class_linux.go b/vendor/github.com/vishvananda/netlink/class_linux.go new file mode 100644 index 00000000..91cd3883 --- /dev/null +++ b/vendor/github.com/vishvananda/netlink/class_linux.go @@ -0,0 +1,254 @@ +package netlink + +import ( + "errors" + "syscall" + + "github.com/vishvananda/netlink/nl" +) + +// NOTE: function is in here because it uses other linux functions +func NewHtbClass(attrs ClassAttrs, cattrs HtbClassAttrs) *HtbClass { + mtu := 1600 + rate := cattrs.Rate / 8 + ceil := cattrs.Ceil / 8 + buffer := cattrs.Buffer + cbuffer := cattrs.Cbuffer + + if ceil == 0 { + ceil = rate + } + + if buffer == 0 { + buffer = uint32(float64(rate)/Hz() + float64(mtu)) + } + buffer = uint32(Xmittime(rate, buffer)) + + if cbuffer == 0 { + cbuffer = uint32(float64(ceil)/Hz() + float64(mtu)) + } + cbuffer = uint32(Xmittime(ceil, cbuffer)) + + return &HtbClass{ + ClassAttrs: attrs, + Rate: rate, + Ceil: ceil, + Buffer: buffer, + Cbuffer: cbuffer, + Quantum: 10, + Level: 0, + Prio: 0, + } +} + +// ClassDel will delete a class from the system. +// Equivalent to: `tc class del $class` +func ClassDel(class Class) error { + return pkgHandle.ClassDel(class) +} + +// ClassDel will delete a class from the system. +// Equivalent to: `tc class del $class` +func (h *Handle) ClassDel(class Class) error { + return h.classModify(syscall.RTM_DELTCLASS, 0, class) +} + +// ClassChange will change a class in place +// Equivalent to: `tc class change $class` +// The parent and handle MUST NOT be changed. +func ClassChange(class Class) error { + return pkgHandle.ClassChange(class) +} + +// ClassChange will change a class in place +// Equivalent to: `tc class change $class` +// The parent and handle MUST NOT be changed. +func (h *Handle) ClassChange(class Class) error { + return h.classModify(syscall.RTM_NEWTCLASS, 0, class) +} + +// ClassReplace will replace a class to the system. +// quivalent to: `tc class replace $class` +// The handle MAY be changed. +// If a class already exist with this parent/handle pair, the class is changed. +// If a class does not already exist with this parent/handle, a new class is created. +func ClassReplace(class Class) error { + return pkgHandle.ClassReplace(class) +} + +// ClassReplace will replace a class to the system. +// quivalent to: `tc class replace $class` +// The handle MAY be changed. +// If a class already exist with this parent/handle pair, the class is changed. +// If a class does not already exist with this parent/handle, a new class is created. +func (h *Handle) ClassReplace(class Class) error { + return h.classModify(syscall.RTM_NEWTCLASS, syscall.NLM_F_CREATE, class) +} + +// ClassAdd will add a class to the system. +// Equivalent to: `tc class add $class` +func ClassAdd(class Class) error { + return pkgHandle.ClassAdd(class) +} + +// ClassAdd will add a class to the system. +// Equivalent to: `tc class add $class` +func (h *Handle) ClassAdd(class Class) error { + return h.classModify( + syscall.RTM_NEWTCLASS, + syscall.NLM_F_CREATE|syscall.NLM_F_EXCL, + class, + ) +} + +func (h *Handle) classModify(cmd, flags int, class Class) error { + req := h.newNetlinkRequest(cmd, flags|syscall.NLM_F_ACK) + base := class.Attrs() + msg := &nl.TcMsg{ + Family: nl.FAMILY_ALL, + Ifindex: int32(base.LinkIndex), + Handle: base.Handle, + Parent: base.Parent, + } + req.AddData(msg) + + if cmd != syscall.RTM_DELTCLASS { + if err := classPayload(req, class); err != nil { + return err + } + } + _, err := req.Execute(syscall.NETLINK_ROUTE, 0) + return err +} + +func classPayload(req *nl.NetlinkRequest, class Class) error { + req.AddData(nl.NewRtAttr(nl.TCA_KIND, nl.ZeroTerminated(class.Type()))) + + options := nl.NewRtAttr(nl.TCA_OPTIONS, nil) + if htb, ok := class.(*HtbClass); ok { + opt := nl.TcHtbCopt{} + opt.Buffer = htb.Buffer + opt.Cbuffer = htb.Cbuffer + opt.Quantum = htb.Quantum + opt.Level = htb.Level + opt.Prio = htb.Prio + // TODO: Handle Debug properly. For now default to 0 + /* Calculate {R,C}Tab and set Rate and Ceil */ + cellLog := -1 + ccellLog := -1 + linklayer := nl.LINKLAYER_ETHERNET + mtu := 1600 + var rtab [256]uint32 + var ctab [256]uint32 + tcrate := nl.TcRateSpec{Rate: uint32(htb.Rate)} + if CalcRtable(&tcrate, rtab, cellLog, uint32(mtu), linklayer) < 0 { + return errors.New("HTB: failed to calculate rate table") + } + opt.Rate = tcrate + tcceil := nl.TcRateSpec{Rate: uint32(htb.Ceil)} + if CalcRtable(&tcceil, ctab, ccellLog, uint32(mtu), linklayer) < 0 { + return errors.New("HTB: failed to calculate ceil rate table") + } + opt.Ceil = tcceil + nl.NewRtAttrChild(options, nl.TCA_HTB_PARMS, opt.Serialize()) + nl.NewRtAttrChild(options, nl.TCA_HTB_RTAB, SerializeRtab(rtab)) + nl.NewRtAttrChild(options, nl.TCA_HTB_CTAB, SerializeRtab(ctab)) + } + req.AddData(options) + return nil +} + +// ClassList gets a list of classes in the system. +// Equivalent to: `tc class show`. +// Generally returns nothing if link and parent are not specified. +func ClassList(link Link, parent uint32) ([]Class, error) { + return pkgHandle.ClassList(link, parent) +} + +// ClassList gets a list of classes in the system. +// Equivalent to: `tc class show`. +// Generally returns nothing if link and parent are not specified. +func (h *Handle) ClassList(link Link, parent uint32) ([]Class, error) { + req := h.newNetlinkRequest(syscall.RTM_GETTCLASS, syscall.NLM_F_DUMP) + msg := &nl.TcMsg{ + Family: nl.FAMILY_ALL, + Parent: parent, + } + if link != nil { + base := link.Attrs() + h.ensureIndex(base) + msg.Ifindex = int32(base.Index) + } + req.AddData(msg) + + msgs, err := req.Execute(syscall.NETLINK_ROUTE, syscall.RTM_NEWTCLASS) + if err != nil { + return nil, err + } + + var res []Class + for _, m := range msgs { + msg := nl.DeserializeTcMsg(m) + + attrs, err := nl.ParseRouteAttr(m[msg.Len():]) + if err != nil { + return nil, err + } + + base := ClassAttrs{ + LinkIndex: int(msg.Ifindex), + Handle: msg.Handle, + Parent: msg.Parent, + } + + var class Class + classType := "" + for _, attr := range attrs { + switch attr.Attr.Type { + case nl.TCA_KIND: + classType = string(attr.Value[:len(attr.Value)-1]) + switch classType { + case "htb": + class = &HtbClass{} + default: + class = &GenericClass{ClassType: classType} + } + case nl.TCA_OPTIONS: + switch classType { + case "htb": + data, err := nl.ParseRouteAttr(attr.Value) + if err != nil { + return nil, err + } + _, err = parseHtbClassData(class, data) + if err != nil { + return nil, err + } + } + } + } + *class.Attrs() = base + res = append(res, class) + } + + return res, nil +} + +func parseHtbClassData(class Class, data []syscall.NetlinkRouteAttr) (bool, error) { + htb := class.(*HtbClass) + detailed := false + for _, datum := range data { + switch datum.Attr.Type { + case nl.TCA_HTB_PARMS: + opt := nl.DeserializeTcHtbCopt(datum.Value) + htb.Rate = uint64(opt.Rate.Rate) + htb.Ceil = uint64(opt.Ceil.Rate) + htb.Buffer = opt.Buffer + htb.Cbuffer = opt.Cbuffer + htb.Quantum = opt.Quantum + htb.Level = opt.Level + htb.Prio = opt.Prio + } + } + return detailed, nil +} diff --git a/vendor/github.com/vishvananda/netlink/conntrack_linux.go b/vendor/github.com/vishvananda/netlink/conntrack_linux.go new file mode 100644 index 00000000..ecf04456 --- /dev/null +++ b/vendor/github.com/vishvananda/netlink/conntrack_linux.go @@ -0,0 +1,371 @@ +package netlink + +import ( + "bytes" + "encoding/binary" + "errors" + "fmt" + "net" + "syscall" + + "github.com/vishvananda/netlink/nl" +) + +// ConntrackTableType Conntrack table for the netlink operation +type ConntrackTableType uint8 + +const ( + // ConntrackTable Conntrack table + // https://github.com/torvalds/linux/blob/master/include/uapi/linux/netfilter/nfnetlink.h -> #define NFNL_SUBSYS_CTNETLINK 1 + ConntrackTable = 1 + // ConntrackExpectTable Conntrack expect table + // https://github.com/torvalds/linux/blob/master/include/uapi/linux/netfilter/nfnetlink.h -> #define NFNL_SUBSYS_CTNETLINK_EXP 2 + ConntrackExpectTable = 2 +) +const ( + // For Parsing Mark + TCP_PROTO = 6 + UDP_PROTO = 17 +) +const ( + // backward compatibility with golang 1.6 which does not have io.SeekCurrent + seekCurrent = 1 +) + +// InetFamily Family type +type InetFamily uint8 + +// -L [table] [options] List conntrack or expectation table +// -G [table] parameters Get conntrack or expectation + +// -I [table] parameters Create a conntrack or expectation +// -U [table] parameters Update a conntrack +// -E [table] [options] Show events + +// -C [table] Show counter +// -S Show statistics + +// ConntrackTableList returns the flow list of a table of a specific family +// conntrack -L [table] [options] List conntrack or expectation table +func ConntrackTableList(table ConntrackTableType, family InetFamily) ([]*ConntrackFlow, error) { + return pkgHandle.ConntrackTableList(table, family) +} + +// ConntrackTableFlush flushes all the flows of a specified table +// conntrack -F [table] Flush table +// The flush operation applies to all the family types +func ConntrackTableFlush(table ConntrackTableType) error { + return pkgHandle.ConntrackTableFlush(table) +} + +// ConntrackDeleteFilter deletes entries on the specified table on the base of the filter +// conntrack -D [table] parameters Delete conntrack or expectation +func ConntrackDeleteFilter(table ConntrackTableType, family InetFamily, filter CustomConntrackFilter) (uint, error) { + return pkgHandle.ConntrackDeleteFilter(table, family, filter) +} + +// ConntrackTableList returns the flow list of a table of a specific family using the netlink handle passed +// conntrack -L [table] [options] List conntrack or expectation table +func (h *Handle) ConntrackTableList(table ConntrackTableType, family InetFamily) ([]*ConntrackFlow, error) { + res, err := h.dumpConntrackTable(table, family) + if err != nil { + return nil, err + } + + // Deserialize all the flows + var result []*ConntrackFlow + for _, dataRaw := range res { + result = append(result, parseRawData(dataRaw)) + } + + return result, nil +} + +// ConntrackTableFlush flushes all the flows of a specified table using the netlink handle passed +// conntrack -F [table] Flush table +// The flush operation applies to all the family types +func (h *Handle) ConntrackTableFlush(table ConntrackTableType) error { + req := h.newConntrackRequest(table, syscall.AF_INET, nl.IPCTNL_MSG_CT_DELETE, syscall.NLM_F_ACK) + _, err := req.Execute(syscall.NETLINK_NETFILTER, 0) + return err +} + +// ConntrackDeleteFilter deletes entries on the specified table on the base of the filter using the netlink handle passed +// conntrack -D [table] parameters Delete conntrack or expectation +func (h *Handle) ConntrackDeleteFilter(table ConntrackTableType, family InetFamily, filter CustomConntrackFilter) (uint, error) { + res, err := h.dumpConntrackTable(table, family) + if err != nil { + return 0, err + } + + var matched uint + for _, dataRaw := range res { + flow := parseRawData(dataRaw) + if match := filter.MatchConntrackFlow(flow); match { + req2 := h.newConntrackRequest(table, family, nl.IPCTNL_MSG_CT_DELETE, syscall.NLM_F_ACK) + // skip the first 4 byte that are the netfilter header, the newConntrackRequest is adding it already + req2.AddRawData(dataRaw[4:]) + req2.Execute(syscall.NETLINK_NETFILTER, 0) + matched++ + } + } + + return matched, nil +} + +func (h *Handle) newConntrackRequest(table ConntrackTableType, family InetFamily, operation, flags int) *nl.NetlinkRequest { + // Create the Netlink request object + req := h.newNetlinkRequest((int(table)<<8)|operation, flags) + // Add the netfilter header + msg := &nl.Nfgenmsg{ + NfgenFamily: uint8(family), + Version: nl.NFNETLINK_V0, + ResId: 0, + } + req.AddData(msg) + return req +} + +func (h *Handle) dumpConntrackTable(table ConntrackTableType, family InetFamily) ([][]byte, error) { + req := h.newConntrackRequest(table, family, nl.IPCTNL_MSG_CT_GET, syscall.NLM_F_DUMP) + return req.Execute(syscall.NETLINK_NETFILTER, 0) +} + +// The full conntrack flow structure is very complicated and can be found in the file: +// http://git.netfilter.org/libnetfilter_conntrack/tree/include/internal/object.h +// For the time being, the structure below allows to parse and extract the base information of a flow +type ipTuple struct { + SrcIP net.IP + DstIP net.IP + Protocol uint8 + SrcPort uint16 + DstPort uint16 +} + +type ConntrackFlow struct { + FamilyType uint8 + Forward ipTuple + Reverse ipTuple + Mark uint32 +} + +func (s *ConntrackFlow) String() string { + // conntrack cmd output: + // udp 17 src=127.0.0.1 dst=127.0.0.1 sport=4001 dport=1234 [UNREPLIED] src=127.0.0.1 dst=127.0.0.1 sport=1234 dport=4001 mark=0 + return fmt.Sprintf("%s\t%d src=%s dst=%s sport=%d dport=%d\tsrc=%s dst=%s sport=%d dport=%d mark=%d", + nl.L4ProtoMap[s.Forward.Protocol], s.Forward.Protocol, + s.Forward.SrcIP.String(), s.Forward.DstIP.String(), s.Forward.SrcPort, s.Forward.DstPort, + s.Reverse.SrcIP.String(), s.Reverse.DstIP.String(), s.Reverse.SrcPort, s.Reverse.DstPort, s.Mark) +} + +// This method parse the ip tuple structure +// The message structure is the following: +// +// +// +// +// +func parseIpTuple(reader *bytes.Reader, tpl *ipTuple) uint8 { + for i := 0; i < 2; i++ { + _, t, _, v := parseNfAttrTLV(reader) + switch t { + case nl.CTA_IP_V4_SRC, nl.CTA_IP_V6_SRC: + tpl.SrcIP = v + case nl.CTA_IP_V4_DST, nl.CTA_IP_V6_DST: + tpl.DstIP = v + } + } + // Skip the next 4 bytes nl.NLA_F_NESTED|nl.CTA_TUPLE_PROTO + reader.Seek(4, seekCurrent) + _, t, _, v := parseNfAttrTLV(reader) + if t == nl.CTA_PROTO_NUM { + tpl.Protocol = uint8(v[0]) + } + // Skip some padding 3 bytes + reader.Seek(3, seekCurrent) + for i := 0; i < 2; i++ { + _, t, _ := parseNfAttrTL(reader) + switch t { + case nl.CTA_PROTO_SRC_PORT: + parseBERaw16(reader, &tpl.SrcPort) + case nl.CTA_PROTO_DST_PORT: + parseBERaw16(reader, &tpl.DstPort) + } + // Skip some padding 2 byte + reader.Seek(2, seekCurrent) + } + return tpl.Protocol +} + +func parseNfAttrTLV(r *bytes.Reader) (isNested bool, attrType, len uint16, value []byte) { + isNested, attrType, len = parseNfAttrTL(r) + + value = make([]byte, len) + binary.Read(r, binary.BigEndian, &value) + return isNested, attrType, len, value +} + +func parseNfAttrTL(r *bytes.Reader) (isNested bool, attrType, len uint16) { + binary.Read(r, nl.NativeEndian(), &len) + len -= nl.SizeofNfattr + + binary.Read(r, nl.NativeEndian(), &attrType) + isNested = (attrType & nl.NLA_F_NESTED) == nl.NLA_F_NESTED + attrType = attrType & (nl.NLA_F_NESTED - 1) + + return isNested, attrType, len +} + +func parseBERaw16(r *bytes.Reader, v *uint16) { + binary.Read(r, binary.BigEndian, v) +} + +func parseRawData(data []byte) *ConntrackFlow { + s := &ConntrackFlow{} + var proto uint8 + // First there is the Nfgenmsg header + // consume only the family field + reader := bytes.NewReader(data) + binary.Read(reader, nl.NativeEndian(), &s.FamilyType) + + // skip rest of the Netfilter header + reader.Seek(3, seekCurrent) + // The message structure is the following: + // 4 bytes + // 4 bytes + // flow information of the forward flow + // 4 bytes + // 4 bytes + // flow information of the reverse flow + for reader.Len() > 0 { + nested, t, l := parseNfAttrTL(reader) + if nested && t == nl.CTA_TUPLE_ORIG { + if nested, t, _ = parseNfAttrTL(reader); nested && t == nl.CTA_TUPLE_IP { + proto = parseIpTuple(reader, &s.Forward) + } + } else if nested && t == nl.CTA_TUPLE_REPLY { + if nested, t, _ = parseNfAttrTL(reader); nested && t == nl.CTA_TUPLE_IP { + parseIpTuple(reader, &s.Reverse) + + // Got all the useful information stop parsing + break + } else { + // Header not recognized skip it + reader.Seek(int64(l), seekCurrent) + } + } + } + if proto == TCP_PROTO { + reader.Seek(64, seekCurrent) + _, t, _, v := parseNfAttrTLV(reader) + if t == nl.CTA_MARK { + s.Mark = uint32(v[3]) + } + } else if proto == UDP_PROTO { + reader.Seek(16, seekCurrent) + _, t, _, v := parseNfAttrTLV(reader) + if t == nl.CTA_MARK { + s.Mark = uint32(v[3]) + } + } + return s +} + +// Conntrack parameters and options: +// -n, --src-nat ip source NAT ip +// -g, --dst-nat ip destination NAT ip +// -j, --any-nat ip source or destination NAT ip +// -m, --mark mark Set mark +// -c, --secmark secmark Set selinux secmark +// -e, --event-mask eventmask Event mask, eg. NEW,DESTROY +// -z, --zero Zero counters while listing +// -o, --output type[,...] Output format, eg. xml +// -l, --label label[,...] conntrack labels + +// Common parameters and options: +// -s, --src, --orig-src ip Source address from original direction +// -d, --dst, --orig-dst ip Destination address from original direction +// -r, --reply-src ip Source addres from reply direction +// -q, --reply-dst ip Destination address from reply direction +// -p, --protonum proto Layer 4 Protocol, eg. 'tcp' +// -f, --family proto Layer 3 Protocol, eg. 'ipv6' +// -t, --timeout timeout Set timeout +// -u, --status status Set status, eg. ASSURED +// -w, --zone value Set conntrack zone +// --orig-zone value Set zone for original direction +// --reply-zone value Set zone for reply direction +// -b, --buffer-size Netlink socket buffer size +// --mask-src ip Source mask address +// --mask-dst ip Destination mask address + +// Filter types +type ConntrackFilterType uint8 + +const ( + ConntrackOrigSrcIP = iota // -orig-src ip Source address from original direction + ConntrackOrigDstIP // -orig-dst ip Destination address from original direction + ConntrackNatSrcIP // -src-nat ip Source NAT ip + ConntrackNatDstIP // -dst-nat ip Destination NAT ip + ConntrackNatAnyIP // -any-nat ip Source or destination NAT ip +) + +type CustomConntrackFilter interface { + // MatchConntrackFlow applies the filter to the flow and returns true if the flow matches + // the filter or false otherwise + MatchConntrackFlow(flow *ConntrackFlow) bool +} + +type ConntrackFilter struct { + ipFilter map[ConntrackFilterType]net.IP +} + +// AddIP adds an IP to the conntrack filter +func (f *ConntrackFilter) AddIP(tp ConntrackFilterType, ip net.IP) error { + if f.ipFilter == nil { + f.ipFilter = make(map[ConntrackFilterType]net.IP) + } + if _, ok := f.ipFilter[tp]; ok { + return errors.New("Filter attribute already present") + } + f.ipFilter[tp] = ip + return nil +} + +// MatchConntrackFlow applies the filter to the flow and returns true if the flow matches the filter +// false otherwise +func (f *ConntrackFilter) MatchConntrackFlow(flow *ConntrackFlow) bool { + if len(f.ipFilter) == 0 { + // empty filter always not match + return false + } + + match := true + // -orig-src ip Source address from original direction + if elem, found := f.ipFilter[ConntrackOrigSrcIP]; found { + match = match && elem.Equal(flow.Forward.SrcIP) + } + + // -orig-dst ip Destination address from original direction + if elem, found := f.ipFilter[ConntrackOrigDstIP]; match && found { + match = match && elem.Equal(flow.Forward.DstIP) + } + + // -src-nat ip Source NAT ip + if elem, found := f.ipFilter[ConntrackNatSrcIP]; match && found { + match = match && elem.Equal(flow.Reverse.SrcIP) + } + + // -dst-nat ip Destination NAT ip + if elem, found := f.ipFilter[ConntrackNatDstIP]; match && found { + match = match && elem.Equal(flow.Reverse.DstIP) + } + + // -any-nat ip Source or destination NAT ip + if elem, found := f.ipFilter[ConntrackNatAnyIP]; match && found { + match = match && (elem.Equal(flow.Reverse.SrcIP) || elem.Equal(flow.Reverse.DstIP)) + } + + return match +} + +var _ CustomConntrackFilter = (*ConntrackFilter)(nil) diff --git a/vendor/github.com/vishvananda/netlink/conntrack_unspecified.go b/vendor/github.com/vishvananda/netlink/conntrack_unspecified.go new file mode 100644 index 00000000..af7af799 --- /dev/null +++ b/vendor/github.com/vishvananda/netlink/conntrack_unspecified.go @@ -0,0 +1,53 @@ +// +build !linux + +package netlink + +// ConntrackTableType Conntrack table for the netlink operation +type ConntrackTableType uint8 + +// InetFamily Family type +type InetFamily uint8 + +// ConntrackFlow placeholder +type ConntrackFlow struct{} + +// ConntrackFilter placeholder +type ConntrackFilter struct{} + +// ConntrackTableList returns the flow list of a table of a specific family +// conntrack -L [table] [options] List conntrack or expectation table +func ConntrackTableList(table ConntrackTableType, family InetFamily) ([]*ConntrackFlow, error) { + return nil, ErrNotImplemented +} + +// ConntrackTableFlush flushes all the flows of a specified table +// conntrack -F [table] Flush table +// The flush operation applies to all the family types +func ConntrackTableFlush(table ConntrackTableType) error { + return ErrNotImplemented +} + +// ConntrackDeleteFilter deletes entries on the specified table on the base of the filter +// conntrack -D [table] parameters Delete conntrack or expectation +func ConntrackDeleteFilter(table ConntrackTableType, family InetFamily, filter *ConntrackFilter) (uint, error) { + return 0, ErrNotImplemented +} + +// ConntrackTableList returns the flow list of a table of a specific family using the netlink handle passed +// conntrack -L [table] [options] List conntrack or expectation table +func (h *Handle) ConntrackTableList(table ConntrackTableType, family InetFamily) ([]*ConntrackFlow, error) { + return nil, ErrNotImplemented +} + +// ConntrackTableFlush flushes all the flows of a specified table using the netlink handle passed +// conntrack -F [table] Flush table +// The flush operation applies to all the family types +func (h *Handle) ConntrackTableFlush(table ConntrackTableType) error { + return ErrNotImplemented +} + +// ConntrackDeleteFilter deletes entries on the specified table on the base of the filter using the netlink handle passed +// conntrack -D [table] parameters Delete conntrack or expectation +func (h *Handle) ConntrackDeleteFilter(table ConntrackTableType, family InetFamily, filter *ConntrackFilter) (uint, error) { + return 0, ErrNotImplemented +} diff --git a/vendor/github.com/vishvananda/netlink/filter.go b/vendor/github.com/vishvananda/netlink/filter.go new file mode 100644 index 00000000..938b28b0 --- /dev/null +++ b/vendor/github.com/vishvananda/netlink/filter.go @@ -0,0 +1,283 @@ +package netlink + +import ( + "fmt" + + "github.com/vishvananda/netlink/nl" +) + +type Filter interface { + Attrs() *FilterAttrs + Type() string +} + +// FilterAttrs represents a netlink filter. A filter is associated with a link, +// has a handle and a parent. The root filter of a device should have a +// parent == HANDLE_ROOT. +type FilterAttrs struct { + LinkIndex int + Handle uint32 + Parent uint32 + Priority uint16 // lower is higher priority + Protocol uint16 // syscall.ETH_P_* +} + +func (q FilterAttrs) String() string { + return fmt.Sprintf("{LinkIndex: %d, Handle: %s, Parent: %s, Priority: %d, Protocol: %d}", q.LinkIndex, HandleStr(q.Handle), HandleStr(q.Parent), q.Priority, q.Protocol) +} + +type TcAct int32 + +const ( + TC_ACT_UNSPEC TcAct = -1 + TC_ACT_OK TcAct = 0 + TC_ACT_RECLASSIFY TcAct = 1 + TC_ACT_SHOT TcAct = 2 + TC_ACT_PIPE TcAct = 3 + TC_ACT_STOLEN TcAct = 4 + TC_ACT_QUEUED TcAct = 5 + TC_ACT_REPEAT TcAct = 6 + TC_ACT_REDIRECT TcAct = 7 + TC_ACT_JUMP TcAct = 0x10000000 +) + +func (a TcAct) String() string { + switch a { + case TC_ACT_UNSPEC: + return "unspec" + case TC_ACT_OK: + return "ok" + case TC_ACT_RECLASSIFY: + return "reclassify" + case TC_ACT_SHOT: + return "shot" + case TC_ACT_PIPE: + return "pipe" + case TC_ACT_STOLEN: + return "stolen" + case TC_ACT_QUEUED: + return "queued" + case TC_ACT_REPEAT: + return "repeat" + case TC_ACT_REDIRECT: + return "redirect" + case TC_ACT_JUMP: + return "jump" + } + return fmt.Sprintf("0x%x", int32(a)) +} + +type TcPolAct int32 + +const ( + TC_POLICE_UNSPEC TcPolAct = TcPolAct(TC_ACT_UNSPEC) + TC_POLICE_OK TcPolAct = TcPolAct(TC_ACT_OK) + TC_POLICE_RECLASSIFY TcPolAct = TcPolAct(TC_ACT_RECLASSIFY) + TC_POLICE_SHOT TcPolAct = TcPolAct(TC_ACT_SHOT) + TC_POLICE_PIPE TcPolAct = TcPolAct(TC_ACT_PIPE) +) + +func (a TcPolAct) String() string { + switch a { + case TC_POLICE_UNSPEC: + return "unspec" + case TC_POLICE_OK: + return "ok" + case TC_POLICE_RECLASSIFY: + return "reclassify" + case TC_POLICE_SHOT: + return "shot" + case TC_POLICE_PIPE: + return "pipe" + } + return fmt.Sprintf("0x%x", int32(a)) +} + +type ActionAttrs struct { + Index int + Capab int + Action TcAct + Refcnt int + Bindcnt int +} + +func (q ActionAttrs) String() string { + return fmt.Sprintf("{Index: %d, Capab: %x, Action: %s, Refcnt: %d, Bindcnt: %d}", q.Index, q.Capab, q.Action.String(), q.Refcnt, q.Bindcnt) +} + +// Action represents an action in any supported filter. +type Action interface { + Attrs() *ActionAttrs + Type() string +} + +type GenericAction struct { + ActionAttrs +} + +func (action *GenericAction) Type() string { + return "generic" +} + +func (action *GenericAction) Attrs() *ActionAttrs { + return &action.ActionAttrs +} + +type BpfAction struct { + ActionAttrs + Fd int + Name string +} + +func (action *BpfAction) Type() string { + return "bpf" +} + +func (action *BpfAction) Attrs() *ActionAttrs { + return &action.ActionAttrs +} + +type MirredAct uint8 + +func (a MirredAct) String() string { + switch a { + case TCA_EGRESS_REDIR: + return "egress redir" + case TCA_EGRESS_MIRROR: + return "egress mirror" + case TCA_INGRESS_REDIR: + return "ingress redir" + case TCA_INGRESS_MIRROR: + return "ingress mirror" + } + return "unknown" +} + +const ( + TCA_EGRESS_REDIR MirredAct = 1 /* packet redirect to EGRESS*/ + TCA_EGRESS_MIRROR MirredAct = 2 /* mirror packet to EGRESS */ + TCA_INGRESS_REDIR MirredAct = 3 /* packet redirect to INGRESS*/ + TCA_INGRESS_MIRROR MirredAct = 4 /* mirror packet to INGRESS */ +) + +type MirredAction struct { + ActionAttrs + MirredAction MirredAct + Ifindex int +} + +func (action *MirredAction) Type() string { + return "mirred" +} + +func (action *MirredAction) Attrs() *ActionAttrs { + return &action.ActionAttrs +} + +func NewMirredAction(redirIndex int) *MirredAction { + return &MirredAction{ + ActionAttrs: ActionAttrs{ + Action: TC_ACT_STOLEN, + }, + MirredAction: TCA_EGRESS_REDIR, + Ifindex: redirIndex, + } +} + +// Constants used in TcU32Sel.Flags. +const ( + TC_U32_TERMINAL = nl.TC_U32_TERMINAL + TC_U32_OFFSET = nl.TC_U32_OFFSET + TC_U32_VAROFFSET = nl.TC_U32_VAROFFSET + TC_U32_EAT = nl.TC_U32_EAT +) + +// Sel of the U32 filters that contains multiple TcU32Key. This is the copy +// and the frontend representation of nl.TcU32Sel. It is serialized into canonical +// nl.TcU32Sel with the appropriate endianness. +type TcU32Sel struct { + Flags uint8 + Offshift uint8 + Nkeys uint8 + Pad uint8 + Offmask uint16 + Off uint16 + Offoff int16 + Hoff int16 + Hmask uint32 + Keys []TcU32Key +} + +// TcU32Key contained of Sel in the U32 filters. This is the copy and the frontend +// representation of nl.TcU32Key. It is serialized into chanonical nl.TcU32Sel +// with the appropriate endianness. +type TcU32Key struct { + Mask uint32 + Val uint32 + Off int32 + OffMask int32 +} + +// U32 filters on many packet related properties +type U32 struct { + FilterAttrs + ClassId uint32 + RedirIndex int + Sel *TcU32Sel + Actions []Action +} + +func (filter *U32) Attrs() *FilterAttrs { + return &filter.FilterAttrs +} + +func (filter *U32) Type() string { + return "u32" +} + +type FilterFwAttrs struct { + ClassId uint32 + InDev string + Mask uint32 + Index uint32 + Buffer uint32 + Mtu uint32 + Mpu uint16 + Rate uint32 + AvRate uint32 + PeakRate uint32 + Action TcPolAct + Overhead uint16 + LinkLayer int +} + +type BpfFilter struct { + FilterAttrs + ClassId uint32 + Fd int + Name string + DirectAction bool +} + +func (filter *BpfFilter) Type() string { + return "bpf" +} + +func (filter *BpfFilter) Attrs() *FilterAttrs { + return &filter.FilterAttrs +} + +// GenericFilter filters represent types that are not currently understood +// by this netlink library. +type GenericFilter struct { + FilterAttrs + FilterType string +} + +func (filter *GenericFilter) Attrs() *FilterAttrs { + return &filter.FilterAttrs +} + +func (filter *GenericFilter) Type() string { + return filter.FilterType +} diff --git a/vendor/github.com/vishvananda/netlink/filter_linux.go b/vendor/github.com/vishvananda/netlink/filter_linux.go new file mode 100644 index 00000000..dc0f90af --- /dev/null +++ b/vendor/github.com/vishvananda/netlink/filter_linux.go @@ -0,0 +1,591 @@ +package netlink + +import ( + "bytes" + "encoding/binary" + "errors" + "fmt" + "syscall" + "unsafe" + + "github.com/vishvananda/netlink/nl" +) + +// Fw filter filters on firewall marks +// NOTE: this is in filter_linux because it refers to nl.TcPolice which +// is defined in nl/tc_linux.go +type Fw struct { + FilterAttrs + ClassId uint32 + // TODO remove nl type from interface + Police nl.TcPolice + InDev string + // TODO Action + Mask uint32 + AvRate uint32 + Rtab [256]uint32 + Ptab [256]uint32 +} + +func NewFw(attrs FilterAttrs, fattrs FilterFwAttrs) (*Fw, error) { + var rtab [256]uint32 + var ptab [256]uint32 + rcellLog := -1 + pcellLog := -1 + avrate := fattrs.AvRate / 8 + police := nl.TcPolice{} + police.Rate.Rate = fattrs.Rate / 8 + police.PeakRate.Rate = fattrs.PeakRate / 8 + buffer := fattrs.Buffer + linklayer := nl.LINKLAYER_ETHERNET + + if fattrs.LinkLayer != nl.LINKLAYER_UNSPEC { + linklayer = fattrs.LinkLayer + } + + police.Action = int32(fattrs.Action) + if police.Rate.Rate != 0 { + police.Rate.Mpu = fattrs.Mpu + police.Rate.Overhead = fattrs.Overhead + if CalcRtable(&police.Rate, rtab, rcellLog, fattrs.Mtu, linklayer) < 0 { + return nil, errors.New("TBF: failed to calculate rate table") + } + police.Burst = uint32(Xmittime(uint64(police.Rate.Rate), uint32(buffer))) + } + police.Mtu = fattrs.Mtu + if police.PeakRate.Rate != 0 { + police.PeakRate.Mpu = fattrs.Mpu + police.PeakRate.Overhead = fattrs.Overhead + if CalcRtable(&police.PeakRate, ptab, pcellLog, fattrs.Mtu, linklayer) < 0 { + return nil, errors.New("POLICE: failed to calculate peak rate table") + } + } + + return &Fw{ + FilterAttrs: attrs, + ClassId: fattrs.ClassId, + InDev: fattrs.InDev, + Mask: fattrs.Mask, + Police: police, + AvRate: avrate, + Rtab: rtab, + Ptab: ptab, + }, nil +} + +func (filter *Fw) Attrs() *FilterAttrs { + return &filter.FilterAttrs +} + +func (filter *Fw) Type() string { + return "fw" +} + +// FilterDel will delete a filter from the system. +// Equivalent to: `tc filter del $filter` +func FilterDel(filter Filter) error { + return pkgHandle.FilterDel(filter) +} + +// FilterDel will delete a filter from the system. +// Equivalent to: `tc filter del $filter` +func (h *Handle) FilterDel(filter Filter) error { + req := h.newNetlinkRequest(syscall.RTM_DELTFILTER, syscall.NLM_F_ACK) + base := filter.Attrs() + msg := &nl.TcMsg{ + Family: nl.FAMILY_ALL, + Ifindex: int32(base.LinkIndex), + Handle: base.Handle, + Parent: base.Parent, + Info: MakeHandle(base.Priority, nl.Swap16(base.Protocol)), + } + req.AddData(msg) + + _, err := req.Execute(syscall.NETLINK_ROUTE, 0) + return err +} + +// FilterAdd will add a filter to the system. +// Equivalent to: `tc filter add $filter` +func FilterAdd(filter Filter) error { + return pkgHandle.FilterAdd(filter) +} + +// FilterAdd will add a filter to the system. +// Equivalent to: `tc filter add $filter` +func (h *Handle) FilterAdd(filter Filter) error { + native = nl.NativeEndian() + req := h.newNetlinkRequest(syscall.RTM_NEWTFILTER, syscall.NLM_F_CREATE|syscall.NLM_F_EXCL|syscall.NLM_F_ACK) + base := filter.Attrs() + msg := &nl.TcMsg{ + Family: nl.FAMILY_ALL, + Ifindex: int32(base.LinkIndex), + Handle: base.Handle, + Parent: base.Parent, + Info: MakeHandle(base.Priority, nl.Swap16(base.Protocol)), + } + req.AddData(msg) + req.AddData(nl.NewRtAttr(nl.TCA_KIND, nl.ZeroTerminated(filter.Type()))) + + options := nl.NewRtAttr(nl.TCA_OPTIONS, nil) + if u32, ok := filter.(*U32); ok { + // Convert TcU32Sel into nl.TcU32Sel as it is without copy. + sel := (*nl.TcU32Sel)(unsafe.Pointer(u32.Sel)) + if sel == nil { + // match all + sel = &nl.TcU32Sel{ + Nkeys: 1, + Flags: nl.TC_U32_TERMINAL, + } + sel.Keys = append(sel.Keys, nl.TcU32Key{}) + } + + if native != networkOrder { + // Copy TcU32Sel. + cSel := *sel + keys := make([]nl.TcU32Key, cap(sel.Keys)) + copy(keys, sel.Keys) + cSel.Keys = keys + sel = &cSel + + // Handle the endianness of attributes + sel.Offmask = native.Uint16(htons(sel.Offmask)) + sel.Hmask = native.Uint32(htonl(sel.Hmask)) + for i, key := range sel.Keys { + sel.Keys[i].Mask = native.Uint32(htonl(key.Mask)) + sel.Keys[i].Val = native.Uint32(htonl(key.Val)) + } + } + sel.Nkeys = uint8(len(sel.Keys)) + nl.NewRtAttrChild(options, nl.TCA_U32_SEL, sel.Serialize()) + if u32.ClassId != 0 { + nl.NewRtAttrChild(options, nl.TCA_U32_CLASSID, nl.Uint32Attr(u32.ClassId)) + } + actionsAttr := nl.NewRtAttrChild(options, nl.TCA_U32_ACT, nil) + // backwards compatibility + if u32.RedirIndex != 0 { + u32.Actions = append([]Action{NewMirredAction(u32.RedirIndex)}, u32.Actions...) + } + if err := EncodeActions(actionsAttr, u32.Actions); err != nil { + return err + } + } else if fw, ok := filter.(*Fw); ok { + if fw.Mask != 0 { + b := make([]byte, 4) + native.PutUint32(b, fw.Mask) + nl.NewRtAttrChild(options, nl.TCA_FW_MASK, b) + } + if fw.InDev != "" { + nl.NewRtAttrChild(options, nl.TCA_FW_INDEV, nl.ZeroTerminated(fw.InDev)) + } + if (fw.Police != nl.TcPolice{}) { + + police := nl.NewRtAttrChild(options, nl.TCA_FW_POLICE, nil) + nl.NewRtAttrChild(police, nl.TCA_POLICE_TBF, fw.Police.Serialize()) + if (fw.Police.Rate != nl.TcRateSpec{}) { + payload := SerializeRtab(fw.Rtab) + nl.NewRtAttrChild(police, nl.TCA_POLICE_RATE, payload) + } + if (fw.Police.PeakRate != nl.TcRateSpec{}) { + payload := SerializeRtab(fw.Ptab) + nl.NewRtAttrChild(police, nl.TCA_POLICE_PEAKRATE, payload) + } + } + if fw.ClassId != 0 { + b := make([]byte, 4) + native.PutUint32(b, fw.ClassId) + nl.NewRtAttrChild(options, nl.TCA_FW_CLASSID, b) + } + } else if bpf, ok := filter.(*BpfFilter); ok { + var bpfFlags uint32 + if bpf.ClassId != 0 { + nl.NewRtAttrChild(options, nl.TCA_BPF_CLASSID, nl.Uint32Attr(bpf.ClassId)) + } + if bpf.Fd >= 0 { + nl.NewRtAttrChild(options, nl.TCA_BPF_FD, nl.Uint32Attr((uint32(bpf.Fd)))) + } + if bpf.Name != "" { + nl.NewRtAttrChild(options, nl.TCA_BPF_NAME, nl.ZeroTerminated(bpf.Name)) + } + if bpf.DirectAction { + bpfFlags |= nl.TCA_BPF_FLAG_ACT_DIRECT + } + nl.NewRtAttrChild(options, nl.TCA_BPF_FLAGS, nl.Uint32Attr(bpfFlags)) + } + + req.AddData(options) + _, err := req.Execute(syscall.NETLINK_ROUTE, 0) + return err +} + +// FilterList gets a list of filters in the system. +// Equivalent to: `tc filter show`. +// Generally returns nothing if link and parent are not specified. +func FilterList(link Link, parent uint32) ([]Filter, error) { + return pkgHandle.FilterList(link, parent) +} + +// FilterList gets a list of filters in the system. +// Equivalent to: `tc filter show`. +// Generally returns nothing if link and parent are not specified. +func (h *Handle) FilterList(link Link, parent uint32) ([]Filter, error) { + req := h.newNetlinkRequest(syscall.RTM_GETTFILTER, syscall.NLM_F_DUMP) + msg := &nl.TcMsg{ + Family: nl.FAMILY_ALL, + Parent: parent, + } + if link != nil { + base := link.Attrs() + h.ensureIndex(base) + msg.Ifindex = int32(base.Index) + } + req.AddData(msg) + + msgs, err := req.Execute(syscall.NETLINK_ROUTE, syscall.RTM_NEWTFILTER) + if err != nil { + return nil, err + } + + var res []Filter + for _, m := range msgs { + msg := nl.DeserializeTcMsg(m) + + attrs, err := nl.ParseRouteAttr(m[msg.Len():]) + if err != nil { + return nil, err + } + + base := FilterAttrs{ + LinkIndex: int(msg.Ifindex), + Handle: msg.Handle, + Parent: msg.Parent, + } + base.Priority, base.Protocol = MajorMinor(msg.Info) + base.Protocol = nl.Swap16(base.Protocol) + + var filter Filter + filterType := "" + detailed := false + for _, attr := range attrs { + switch attr.Attr.Type { + case nl.TCA_KIND: + filterType = string(attr.Value[:len(attr.Value)-1]) + switch filterType { + case "u32": + filter = &U32{} + case "fw": + filter = &Fw{} + case "bpf": + filter = &BpfFilter{} + default: + filter = &GenericFilter{FilterType: filterType} + } + case nl.TCA_OPTIONS: + data, err := nl.ParseRouteAttr(attr.Value) + if err != nil { + return nil, err + } + switch filterType { + case "u32": + detailed, err = parseU32Data(filter, data) + if err != nil { + return nil, err + } + case "fw": + detailed, err = parseFwData(filter, data) + if err != nil { + return nil, err + } + case "bpf": + detailed, err = parseBpfData(filter, data) + if err != nil { + return nil, err + } + default: + detailed = true + } + } + } + // only return the detailed version of the filter + if detailed { + *filter.Attrs() = base + res = append(res, filter) + } + } + + return res, nil +} + +func toTcGen(attrs *ActionAttrs, tcgen *nl.TcGen) { + tcgen.Index = uint32(attrs.Index) + tcgen.Capab = uint32(attrs.Capab) + tcgen.Action = int32(attrs.Action) + tcgen.Refcnt = int32(attrs.Refcnt) + tcgen.Bindcnt = int32(attrs.Bindcnt) +} + +func toAttrs(tcgen *nl.TcGen, attrs *ActionAttrs) { + attrs.Index = int(tcgen.Index) + attrs.Capab = int(tcgen.Capab) + attrs.Action = TcAct(tcgen.Action) + attrs.Refcnt = int(tcgen.Refcnt) + attrs.Bindcnt = int(tcgen.Bindcnt) +} + +func EncodeActions(attr *nl.RtAttr, actions []Action) error { + tabIndex := int(nl.TCA_ACT_TAB) + + for _, action := range actions { + switch action := action.(type) { + default: + return fmt.Errorf("unknown action type %s", action.Type()) + case *MirredAction: + table := nl.NewRtAttrChild(attr, tabIndex, nil) + tabIndex++ + nl.NewRtAttrChild(table, nl.TCA_ACT_KIND, nl.ZeroTerminated("mirred")) + aopts := nl.NewRtAttrChild(table, nl.TCA_ACT_OPTIONS, nil) + mirred := nl.TcMirred{ + Eaction: int32(action.MirredAction), + Ifindex: uint32(action.Ifindex), + } + toTcGen(action.Attrs(), &mirred.TcGen) + nl.NewRtAttrChild(aopts, nl.TCA_MIRRED_PARMS, mirred.Serialize()) + case *BpfAction: + table := nl.NewRtAttrChild(attr, tabIndex, nil) + tabIndex++ + nl.NewRtAttrChild(table, nl.TCA_ACT_KIND, nl.ZeroTerminated("bpf")) + aopts := nl.NewRtAttrChild(table, nl.TCA_ACT_OPTIONS, nil) + gen := nl.TcGen{} + toTcGen(action.Attrs(), &gen) + nl.NewRtAttrChild(aopts, nl.TCA_ACT_BPF_PARMS, gen.Serialize()) + nl.NewRtAttrChild(aopts, nl.TCA_ACT_BPF_FD, nl.Uint32Attr(uint32(action.Fd))) + nl.NewRtAttrChild(aopts, nl.TCA_ACT_BPF_NAME, nl.ZeroTerminated(action.Name)) + case *GenericAction: + table := nl.NewRtAttrChild(attr, tabIndex, nil) + tabIndex++ + nl.NewRtAttrChild(table, nl.TCA_ACT_KIND, nl.ZeroTerminated("gact")) + aopts := nl.NewRtAttrChild(table, nl.TCA_ACT_OPTIONS, nil) + gen := nl.TcGen{} + toTcGen(action.Attrs(), &gen) + nl.NewRtAttrChild(aopts, nl.TCA_GACT_PARMS, gen.Serialize()) + } + } + return nil +} + +func parseActions(tables []syscall.NetlinkRouteAttr) ([]Action, error) { + var actions []Action + for _, table := range tables { + var action Action + var actionType string + aattrs, err := nl.ParseRouteAttr(table.Value) + if err != nil { + return nil, err + } + nextattr: + for _, aattr := range aattrs { + switch aattr.Attr.Type { + case nl.TCA_KIND: + actionType = string(aattr.Value[:len(aattr.Value)-1]) + // only parse if the action is mirred or bpf + switch actionType { + case "mirred": + action = &MirredAction{} + case "bpf": + action = &BpfAction{} + case "gact": + action = &GenericAction{} + default: + break nextattr + } + case nl.TCA_OPTIONS: + adata, err := nl.ParseRouteAttr(aattr.Value) + if err != nil { + return nil, err + } + for _, adatum := range adata { + switch actionType { + case "mirred": + switch adatum.Attr.Type { + case nl.TCA_MIRRED_PARMS: + mirred := *nl.DeserializeTcMirred(adatum.Value) + toAttrs(&mirred.TcGen, action.Attrs()) + action.(*MirredAction).ActionAttrs = ActionAttrs{} + action.(*MirredAction).Ifindex = int(mirred.Ifindex) + action.(*MirredAction).MirredAction = MirredAct(mirred.Eaction) + } + case "bpf": + switch adatum.Attr.Type { + case nl.TCA_ACT_BPF_PARMS: + gen := *nl.DeserializeTcGen(adatum.Value) + toAttrs(&gen, action.Attrs()) + case nl.TCA_ACT_BPF_FD: + action.(*BpfAction).Fd = int(native.Uint32(adatum.Value[0:4])) + case nl.TCA_ACT_BPF_NAME: + action.(*BpfAction).Name = string(adatum.Value[:len(adatum.Value)-1]) + } + case "gact": + switch adatum.Attr.Type { + case nl.TCA_GACT_PARMS: + gen := *nl.DeserializeTcGen(adatum.Value) + toAttrs(&gen, action.Attrs()) + } + } + } + } + } + actions = append(actions, action) + } + return actions, nil +} + +func parseU32Data(filter Filter, data []syscall.NetlinkRouteAttr) (bool, error) { + native = nl.NativeEndian() + u32 := filter.(*U32) + detailed := false + for _, datum := range data { + switch datum.Attr.Type { + case nl.TCA_U32_SEL: + detailed = true + sel := nl.DeserializeTcU32Sel(datum.Value) + u32.Sel = (*TcU32Sel)(unsafe.Pointer(sel)) + if native != networkOrder { + // Handle the endianness of attributes + u32.Sel.Offmask = native.Uint16(htons(sel.Offmask)) + u32.Sel.Hmask = native.Uint32(htonl(sel.Hmask)) + for i, key := range u32.Sel.Keys { + u32.Sel.Keys[i].Mask = native.Uint32(htonl(key.Mask)) + u32.Sel.Keys[i].Val = native.Uint32(htonl(key.Val)) + } + } + case nl.TCA_U32_ACT: + tables, err := nl.ParseRouteAttr(datum.Value) + if err != nil { + return detailed, err + } + u32.Actions, err = parseActions(tables) + if err != nil { + return detailed, err + } + for _, action := range u32.Actions { + if action, ok := action.(*MirredAction); ok { + u32.RedirIndex = int(action.Ifindex) + } + } + case nl.TCA_U32_CLASSID: + u32.ClassId = native.Uint32(datum.Value) + } + } + return detailed, nil +} + +func parseFwData(filter Filter, data []syscall.NetlinkRouteAttr) (bool, error) { + native = nl.NativeEndian() + fw := filter.(*Fw) + detailed := true + for _, datum := range data { + switch datum.Attr.Type { + case nl.TCA_FW_MASK: + fw.Mask = native.Uint32(datum.Value[0:4]) + case nl.TCA_FW_CLASSID: + fw.ClassId = native.Uint32(datum.Value[0:4]) + case nl.TCA_FW_INDEV: + fw.InDev = string(datum.Value[:len(datum.Value)-1]) + case nl.TCA_FW_POLICE: + adata, _ := nl.ParseRouteAttr(datum.Value) + for _, aattr := range adata { + switch aattr.Attr.Type { + case nl.TCA_POLICE_TBF: + fw.Police = *nl.DeserializeTcPolice(aattr.Value) + case nl.TCA_POLICE_RATE: + fw.Rtab = DeserializeRtab(aattr.Value) + case nl.TCA_POLICE_PEAKRATE: + fw.Ptab = DeserializeRtab(aattr.Value) + } + } + } + } + return detailed, nil +} + +func parseBpfData(filter Filter, data []syscall.NetlinkRouteAttr) (bool, error) { + native = nl.NativeEndian() + bpf := filter.(*BpfFilter) + detailed := true + for _, datum := range data { + switch datum.Attr.Type { + case nl.TCA_BPF_FD: + bpf.Fd = int(native.Uint32(datum.Value[0:4])) + case nl.TCA_BPF_NAME: + bpf.Name = string(datum.Value[:len(datum.Value)-1]) + case nl.TCA_BPF_CLASSID: + bpf.ClassId = native.Uint32(datum.Value[0:4]) + case nl.TCA_BPF_FLAGS: + flags := native.Uint32(datum.Value[0:4]) + if (flags & nl.TCA_BPF_FLAG_ACT_DIRECT) != 0 { + bpf.DirectAction = true + } + } + } + return detailed, nil +} + +func AlignToAtm(size uint) uint { + var linksize, cells int + cells = int(size / nl.ATM_CELL_PAYLOAD) + if (size % nl.ATM_CELL_PAYLOAD) > 0 { + cells++ + } + linksize = cells * nl.ATM_CELL_SIZE + return uint(linksize) +} + +func AdjustSize(sz uint, mpu uint, linklayer int) uint { + if sz < mpu { + sz = mpu + } + switch linklayer { + case nl.LINKLAYER_ATM: + return AlignToAtm(sz) + default: + return sz + } +} + +func CalcRtable(rate *nl.TcRateSpec, rtab [256]uint32, cellLog int, mtu uint32, linklayer int) int { + bps := rate.Rate + mpu := rate.Mpu + var sz uint + if mtu == 0 { + mtu = 2047 + } + if cellLog < 0 { + cellLog = 0 + for (mtu >> uint(cellLog)) > 255 { + cellLog++ + } + } + for i := 0; i < 256; i++ { + sz = AdjustSize(uint((i+1)< 0 { + nl.NewRtAttrChild(data, nl.IFLA_VXLAN_AGEING, nl.Uint32Attr(uint32(vxlan.Age))) + } + if vxlan.Limit > 0 { + nl.NewRtAttrChild(data, nl.IFLA_VXLAN_LIMIT, nl.Uint32Attr(uint32(vxlan.Limit))) + } + if vxlan.Port > 0 { + nl.NewRtAttrChild(data, nl.IFLA_VXLAN_PORT, htons(uint16(vxlan.Port))) + } + if vxlan.PortLow > 0 || vxlan.PortHigh > 0 { + pr := vxlanPortRange{uint16(vxlan.PortLow), uint16(vxlan.PortHigh)} + + buf := new(bytes.Buffer) + binary.Write(buf, binary.BigEndian, &pr) + + nl.NewRtAttrChild(data, nl.IFLA_VXLAN_PORT_RANGE, buf.Bytes()) + } +} + +func addBondAttrs(bond *Bond, linkInfo *nl.RtAttr) { + data := nl.NewRtAttrChild(linkInfo, nl.IFLA_INFO_DATA, nil) + if bond.Mode >= 0 { + nl.NewRtAttrChild(data, nl.IFLA_BOND_MODE, nl.Uint8Attr(uint8(bond.Mode))) + } + if bond.ActiveSlave >= 0 { + nl.NewRtAttrChild(data, nl.IFLA_BOND_ACTIVE_SLAVE, nl.Uint32Attr(uint32(bond.ActiveSlave))) + } + if bond.Miimon >= 0 { + nl.NewRtAttrChild(data, nl.IFLA_BOND_MIIMON, nl.Uint32Attr(uint32(bond.Miimon))) + } + if bond.UpDelay >= 0 { + nl.NewRtAttrChild(data, nl.IFLA_BOND_UPDELAY, nl.Uint32Attr(uint32(bond.UpDelay))) + } + if bond.DownDelay >= 0 { + nl.NewRtAttrChild(data, nl.IFLA_BOND_DOWNDELAY, nl.Uint32Attr(uint32(bond.DownDelay))) + } + if bond.UseCarrier >= 0 { + nl.NewRtAttrChild(data, nl.IFLA_BOND_USE_CARRIER, nl.Uint8Attr(uint8(bond.UseCarrier))) + } + if bond.ArpInterval >= 0 { + nl.NewRtAttrChild(data, nl.IFLA_BOND_ARP_INTERVAL, nl.Uint32Attr(uint32(bond.ArpInterval))) + } + if bond.ArpIpTargets != nil { + msg := nl.NewRtAttrChild(data, nl.IFLA_BOND_ARP_IP_TARGET, nil) + for i := range bond.ArpIpTargets { + ip := bond.ArpIpTargets[i].To4() + if ip != nil { + nl.NewRtAttrChild(msg, i, []byte(ip)) + continue + } + ip = bond.ArpIpTargets[i].To16() + if ip != nil { + nl.NewRtAttrChild(msg, i, []byte(ip)) + } + } + } + if bond.ArpValidate >= 0 { + nl.NewRtAttrChild(data, nl.IFLA_BOND_ARP_VALIDATE, nl.Uint32Attr(uint32(bond.ArpValidate))) + } + if bond.ArpAllTargets >= 0 { + nl.NewRtAttrChild(data, nl.IFLA_BOND_ARP_ALL_TARGETS, nl.Uint32Attr(uint32(bond.ArpAllTargets))) + } + if bond.Primary >= 0 { + nl.NewRtAttrChild(data, nl.IFLA_BOND_PRIMARY, nl.Uint32Attr(uint32(bond.Primary))) + } + if bond.PrimaryReselect >= 0 { + nl.NewRtAttrChild(data, nl.IFLA_BOND_PRIMARY_RESELECT, nl.Uint8Attr(uint8(bond.PrimaryReselect))) + } + if bond.FailOverMac >= 0 { + nl.NewRtAttrChild(data, nl.IFLA_BOND_FAIL_OVER_MAC, nl.Uint8Attr(uint8(bond.FailOverMac))) + } + if bond.XmitHashPolicy >= 0 { + nl.NewRtAttrChild(data, nl.IFLA_BOND_XMIT_HASH_POLICY, nl.Uint8Attr(uint8(bond.XmitHashPolicy))) + } + if bond.ResendIgmp >= 0 { + nl.NewRtAttrChild(data, nl.IFLA_BOND_RESEND_IGMP, nl.Uint32Attr(uint32(bond.ResendIgmp))) + } + if bond.NumPeerNotif >= 0 { + nl.NewRtAttrChild(data, nl.IFLA_BOND_NUM_PEER_NOTIF, nl.Uint8Attr(uint8(bond.NumPeerNotif))) + } + if bond.AllSlavesActive >= 0 { + nl.NewRtAttrChild(data, nl.IFLA_BOND_ALL_SLAVES_ACTIVE, nl.Uint8Attr(uint8(bond.AllSlavesActive))) + } + if bond.MinLinks >= 0 { + nl.NewRtAttrChild(data, nl.IFLA_BOND_MIN_LINKS, nl.Uint32Attr(uint32(bond.MinLinks))) + } + if bond.LpInterval >= 0 { + nl.NewRtAttrChild(data, nl.IFLA_BOND_LP_INTERVAL, nl.Uint32Attr(uint32(bond.LpInterval))) + } + if bond.PackersPerSlave >= 0 { + nl.NewRtAttrChild(data, nl.IFLA_BOND_PACKETS_PER_SLAVE, nl.Uint32Attr(uint32(bond.PackersPerSlave))) + } + if bond.LacpRate >= 0 { + nl.NewRtAttrChild(data, nl.IFLA_BOND_AD_LACP_RATE, nl.Uint8Attr(uint8(bond.LacpRate))) + } + if bond.AdSelect >= 0 { + nl.NewRtAttrChild(data, nl.IFLA_BOND_AD_SELECT, nl.Uint8Attr(uint8(bond.AdSelect))) + } + if bond.AdActorSysPrio >= 0 { + nl.NewRtAttrChild(data, nl.IFLA_BOND_AD_ACTOR_SYS_PRIO, nl.Uint16Attr(uint16(bond.AdActorSysPrio))) + } + if bond.AdUserPortKey >= 0 { + nl.NewRtAttrChild(data, nl.IFLA_BOND_AD_USER_PORT_KEY, nl.Uint16Attr(uint16(bond.AdUserPortKey))) + } + if bond.AdActorSystem != nil { + nl.NewRtAttrChild(data, nl.IFLA_BOND_AD_ACTOR_SYSTEM, []byte(bond.AdActorSystem)) + } + if bond.TlbDynamicLb >= 0 { + nl.NewRtAttrChild(data, nl.IFLA_BOND_TLB_DYNAMIC_LB, nl.Uint8Attr(uint8(bond.TlbDynamicLb))) + } +} + +// LinkAdd adds a new link device. The type and features of the device +// are taken from the parameters in the link object. +// Equivalent to: `ip link add $link` +func LinkAdd(link Link) error { + return pkgHandle.LinkAdd(link) +} + +// LinkAdd adds a new link device. The type and features of the device +// are taken fromt the parameters in the link object. +// Equivalent to: `ip link add $link` +func (h *Handle) LinkAdd(link Link) error { + return h.linkModify(link, syscall.NLM_F_CREATE|syscall.NLM_F_EXCL|syscall.NLM_F_ACK) +} + +func (h *Handle) linkModify(link Link, flags int) error { + // TODO: support extra data for macvlan + base := link.Attrs() + + if base.Name == "" { + return fmt.Errorf("LinkAttrs.Name cannot be empty!") + } + + if tuntap, ok := link.(*Tuntap); ok { + // TODO: support user + // TODO: support group + // TODO: multi_queue + // TODO: support non- persistent + if tuntap.Mode < syscall.IFF_TUN || tuntap.Mode > syscall.IFF_TAP { + return fmt.Errorf("Tuntap.Mode %v unknown!", tuntap.Mode) + } + file, err := os.OpenFile("/dev/net/tun", os.O_RDWR, 0) + if err != nil { + return err + } + defer file.Close() + var req ifReq + if tuntap.Flags == 0 { + req.Flags = uint16(TUNTAP_DEFAULTS) + } else { + req.Flags = uint16(tuntap.Flags) + } + req.Flags |= uint16(tuntap.Mode) + copy(req.Name[:15], base.Name) + _, _, errno := syscall.Syscall(syscall.SYS_IOCTL, file.Fd(), uintptr(syscall.TUNSETIFF), uintptr(unsafe.Pointer(&req))) + if errno != 0 { + return fmt.Errorf("Tuntap IOCTL TUNSETIFF failed, errno %v", errno) + } + _, _, errno = syscall.Syscall(syscall.SYS_IOCTL, file.Fd(), uintptr(syscall.TUNSETPERSIST), 1) + if errno != 0 { + return fmt.Errorf("Tuntap IOCTL TUNSETPERSIST failed, errno %v", errno) + } + h.ensureIndex(base) + + // can't set master during create, so set it afterwards + if base.MasterIndex != 0 { + // TODO: verify MasterIndex is actually a bridge? + return h.LinkSetMasterByIndex(link, base.MasterIndex) + } + return nil + } + + req := h.newNetlinkRequest(syscall.RTM_NEWLINK, flags) + + msg := nl.NewIfInfomsg(syscall.AF_UNSPEC) + // TODO: make it shorter + if base.Flags&net.FlagUp != 0 { + msg.Change = syscall.IFF_UP + msg.Flags = syscall.IFF_UP + } + if base.Flags&net.FlagBroadcast != 0 { + msg.Change |= syscall.IFF_BROADCAST + msg.Flags |= syscall.IFF_BROADCAST + } + if base.Flags&net.FlagLoopback != 0 { + msg.Change |= syscall.IFF_LOOPBACK + msg.Flags |= syscall.IFF_LOOPBACK + } + if base.Flags&net.FlagPointToPoint != 0 { + msg.Change |= syscall.IFF_POINTOPOINT + msg.Flags |= syscall.IFF_POINTOPOINT + } + if base.Flags&net.FlagMulticast != 0 { + msg.Change |= syscall.IFF_MULTICAST + msg.Flags |= syscall.IFF_MULTICAST + } + req.AddData(msg) + + if base.ParentIndex != 0 { + b := make([]byte, 4) + native.PutUint32(b, uint32(base.ParentIndex)) + data := nl.NewRtAttr(syscall.IFLA_LINK, b) + req.AddData(data) + } else if link.Type() == "ipvlan" { + return fmt.Errorf("Can't create ipvlan link without ParentIndex") + } + + nameData := nl.NewRtAttr(syscall.IFLA_IFNAME, nl.ZeroTerminated(base.Name)) + req.AddData(nameData) + + if base.MTU > 0 { + mtu := nl.NewRtAttr(syscall.IFLA_MTU, nl.Uint32Attr(uint32(base.MTU))) + req.AddData(mtu) + } + + if base.TxQLen >= 0 { + qlen := nl.NewRtAttr(syscall.IFLA_TXQLEN, nl.Uint32Attr(uint32(base.TxQLen))) + req.AddData(qlen) + } + + if base.HardwareAddr != nil { + hwaddr := nl.NewRtAttr(syscall.IFLA_ADDRESS, []byte(base.HardwareAddr)) + req.AddData(hwaddr) + } + + if base.Namespace != nil { + var attr *nl.RtAttr + switch base.Namespace.(type) { + case NsPid: + val := nl.Uint32Attr(uint32(base.Namespace.(NsPid))) + attr = nl.NewRtAttr(syscall.IFLA_NET_NS_PID, val) + case NsFd: + val := nl.Uint32Attr(uint32(base.Namespace.(NsFd))) + attr = nl.NewRtAttr(nl.IFLA_NET_NS_FD, val) + } + + req.AddData(attr) + } + + if base.Xdp != nil { + addXdpAttrs(base.Xdp, req) + } + + linkInfo := nl.NewRtAttr(syscall.IFLA_LINKINFO, nil) + nl.NewRtAttrChild(linkInfo, nl.IFLA_INFO_KIND, nl.NonZeroTerminated(link.Type())) + + if vlan, ok := link.(*Vlan); ok { + b := make([]byte, 2) + native.PutUint16(b, uint16(vlan.VlanId)) + data := nl.NewRtAttrChild(linkInfo, nl.IFLA_INFO_DATA, nil) + nl.NewRtAttrChild(data, nl.IFLA_VLAN_ID, b) + } else if veth, ok := link.(*Veth); ok { + data := nl.NewRtAttrChild(linkInfo, nl.IFLA_INFO_DATA, nil) + peer := nl.NewRtAttrChild(data, nl.VETH_INFO_PEER, nil) + nl.NewIfInfomsgChild(peer, syscall.AF_UNSPEC) + nl.NewRtAttrChild(peer, syscall.IFLA_IFNAME, nl.ZeroTerminated(veth.PeerName)) + if base.TxQLen >= 0 { + nl.NewRtAttrChild(peer, syscall.IFLA_TXQLEN, nl.Uint32Attr(uint32(base.TxQLen))) + } + if base.MTU > 0 { + nl.NewRtAttrChild(peer, syscall.IFLA_MTU, nl.Uint32Attr(uint32(base.MTU))) + } + + } else if vxlan, ok := link.(*Vxlan); ok { + addVxlanAttrs(vxlan, linkInfo) + } else if bond, ok := link.(*Bond); ok { + addBondAttrs(bond, linkInfo) + } else if ipv, ok := link.(*IPVlan); ok { + data := nl.NewRtAttrChild(linkInfo, nl.IFLA_INFO_DATA, nil) + nl.NewRtAttrChild(data, nl.IFLA_IPVLAN_MODE, nl.Uint16Attr(uint16(ipv.Mode))) + } else if macv, ok := link.(*Macvlan); ok { + if macv.Mode != MACVLAN_MODE_DEFAULT { + data := nl.NewRtAttrChild(linkInfo, nl.IFLA_INFO_DATA, nil) + nl.NewRtAttrChild(data, nl.IFLA_MACVLAN_MODE, nl.Uint32Attr(macvlanModes[macv.Mode])) + } + } else if macv, ok := link.(*Macvtap); ok { + if macv.Mode != MACVLAN_MODE_DEFAULT { + data := nl.NewRtAttrChild(linkInfo, nl.IFLA_INFO_DATA, nil) + nl.NewRtAttrChild(data, nl.IFLA_MACVLAN_MODE, nl.Uint32Attr(macvlanModes[macv.Mode])) + } + } else if gretap, ok := link.(*Gretap); ok { + addGretapAttrs(gretap, linkInfo) + } else if iptun, ok := link.(*Iptun); ok { + addIptunAttrs(iptun, linkInfo) + } else if vti, ok := link.(*Vti); ok { + addVtiAttrs(vti, linkInfo) + } else if vrf, ok := link.(*Vrf); ok { + addVrfAttrs(vrf, linkInfo) + } else if bridge, ok := link.(*Bridge); ok { + addBridgeAttrs(bridge, linkInfo) + } else if gtp, ok := link.(*GTP); ok { + addGTPAttrs(gtp, linkInfo) + } + + req.AddData(linkInfo) + + _, err := req.Execute(syscall.NETLINK_ROUTE, 0) + if err != nil { + return err + } + + h.ensureIndex(base) + + // can't set master during create, so set it afterwards + if base.MasterIndex != 0 { + // TODO: verify MasterIndex is actually a bridge? + return h.LinkSetMasterByIndex(link, base.MasterIndex) + } + return nil +} + +// LinkDel deletes link device. Either Index or Name must be set in +// the link object for it to be deleted. The other values are ignored. +// Equivalent to: `ip link del $link` +func LinkDel(link Link) error { + return pkgHandle.LinkDel(link) +} + +// LinkDel deletes link device. Either Index or Name must be set in +// the link object for it to be deleted. The other values are ignored. +// Equivalent to: `ip link del $link` +func (h *Handle) LinkDel(link Link) error { + base := link.Attrs() + + h.ensureIndex(base) + + req := h.newNetlinkRequest(syscall.RTM_DELLINK, syscall.NLM_F_ACK) + + msg := nl.NewIfInfomsg(syscall.AF_UNSPEC) + msg.Index = int32(base.Index) + req.AddData(msg) + + _, err := req.Execute(syscall.NETLINK_ROUTE, 0) + return err +} + +func (h *Handle) linkByNameDump(name string) (Link, error) { + links, err := h.LinkList() + if err != nil { + return nil, err + } + + for _, link := range links { + if link.Attrs().Name == name { + return link, nil + } + } + return nil, LinkNotFoundError{fmt.Errorf("Link %s not found", name)} +} + +func (h *Handle) linkByAliasDump(alias string) (Link, error) { + links, err := h.LinkList() + if err != nil { + return nil, err + } + + for _, link := range links { + if link.Attrs().Alias == alias { + return link, nil + } + } + return nil, LinkNotFoundError{fmt.Errorf("Link alias %s not found", alias)} +} + +// LinkByName finds a link by name and returns a pointer to the object. +func LinkByName(name string) (Link, error) { + return pkgHandle.LinkByName(name) +} + +// LinkByName finds a link by name and returns a pointer to the object. +func (h *Handle) LinkByName(name string) (Link, error) { + if h.lookupByDump { + return h.linkByNameDump(name) + } + + req := h.newNetlinkRequest(syscall.RTM_GETLINK, syscall.NLM_F_ACK) + + msg := nl.NewIfInfomsg(syscall.AF_UNSPEC) + req.AddData(msg) + + nameData := nl.NewRtAttr(syscall.IFLA_IFNAME, nl.ZeroTerminated(name)) + req.AddData(nameData) + + link, err := execGetLink(req) + if err == syscall.EINVAL { + // older kernels don't support looking up via IFLA_IFNAME + // so fall back to dumping all links + h.lookupByDump = true + return h.linkByNameDump(name) + } + + return link, err +} + +// LinkByAlias finds a link by its alias and returns a pointer to the object. +// If there are multiple links with the alias it returns the first one +func LinkByAlias(alias string) (Link, error) { + return pkgHandle.LinkByAlias(alias) +} + +// LinkByAlias finds a link by its alias and returns a pointer to the object. +// If there are multiple links with the alias it returns the first one +func (h *Handle) LinkByAlias(alias string) (Link, error) { + if h.lookupByDump { + return h.linkByAliasDump(alias) + } + + req := h.newNetlinkRequest(syscall.RTM_GETLINK, syscall.NLM_F_ACK) + + msg := nl.NewIfInfomsg(syscall.AF_UNSPEC) + req.AddData(msg) + + nameData := nl.NewRtAttr(syscall.IFLA_IFALIAS, nl.ZeroTerminated(alias)) + req.AddData(nameData) + + link, err := execGetLink(req) + if err == syscall.EINVAL { + // older kernels don't support looking up via IFLA_IFALIAS + // so fall back to dumping all links + h.lookupByDump = true + return h.linkByAliasDump(alias) + } + + return link, err +} + +// LinkByIndex finds a link by index and returns a pointer to the object. +func LinkByIndex(index int) (Link, error) { + return pkgHandle.LinkByIndex(index) +} + +// LinkByIndex finds a link by index and returns a pointer to the object. +func (h *Handle) LinkByIndex(index int) (Link, error) { + req := h.newNetlinkRequest(syscall.RTM_GETLINK, syscall.NLM_F_ACK) + + msg := nl.NewIfInfomsg(syscall.AF_UNSPEC) + msg.Index = int32(index) + req.AddData(msg) + + return execGetLink(req) +} + +func execGetLink(req *nl.NetlinkRequest) (Link, error) { + msgs, err := req.Execute(syscall.NETLINK_ROUTE, 0) + if err != nil { + if errno, ok := err.(syscall.Errno); ok { + if errno == syscall.ENODEV { + return nil, LinkNotFoundError{fmt.Errorf("Link not found")} + } + } + return nil, err + } + + switch { + case len(msgs) == 0: + return nil, LinkNotFoundError{fmt.Errorf("Link not found")} + + case len(msgs) == 1: + return LinkDeserialize(nil, msgs[0]) + + default: + return nil, fmt.Errorf("More than one link found") + } +} + +// linkDeserialize deserializes a raw message received from netlink into +// a link object. +func LinkDeserialize(hdr *syscall.NlMsghdr, m []byte) (Link, error) { + msg := nl.DeserializeIfInfomsg(m) + + attrs, err := nl.ParseRouteAttr(m[msg.Len():]) + if err != nil { + return nil, err + } + + base := LinkAttrs{Index: int(msg.Index), RawFlags: msg.Flags, Flags: linkFlags(msg.Flags), EncapType: msg.EncapType()} + if msg.Flags&syscall.IFF_PROMISC != 0 { + base.Promisc = 1 + } + var ( + link Link + stats32 []byte + stats64 []byte + linkType string + ) + for _, attr := range attrs { + switch attr.Attr.Type { + case syscall.IFLA_LINKINFO: + infos, err := nl.ParseRouteAttr(attr.Value) + if err != nil { + return nil, err + } + for _, info := range infos { + switch info.Attr.Type { + case nl.IFLA_INFO_KIND: + linkType = string(info.Value[:len(info.Value)-1]) + switch linkType { + case "dummy": + link = &Dummy{} + case "ifb": + link = &Ifb{} + case "bridge": + link = &Bridge{} + case "vlan": + link = &Vlan{} + case "veth": + link = &Veth{} + case "vxlan": + link = &Vxlan{} + case "bond": + link = &Bond{} + case "ipvlan": + link = &IPVlan{} + case "macvlan": + link = &Macvlan{} + case "macvtap": + link = &Macvtap{} + case "gretap": + link = &Gretap{} + case "ipip": + link = &Iptun{} + case "vti": + link = &Vti{} + case "vrf": + link = &Vrf{} + case "gtp": + link = >P{} + default: + link = &GenericLink{LinkType: linkType} + } + case nl.IFLA_INFO_DATA: + data, err := nl.ParseRouteAttr(info.Value) + if err != nil { + return nil, err + } + switch linkType { + case "vlan": + parseVlanData(link, data) + case "vxlan": + parseVxlanData(link, data) + case "bond": + parseBondData(link, data) + case "ipvlan": + parseIPVlanData(link, data) + case "macvlan": + parseMacvlanData(link, data) + case "macvtap": + parseMacvtapData(link, data) + case "gretap": + parseGretapData(link, data) + case "ipip": + parseIptunData(link, data) + case "vti": + parseVtiData(link, data) + case "vrf": + parseVrfData(link, data) + case "bridge": + parseBridgeData(link, data) + case "gtp": + parseGTPData(link, data) + } + } + } + case syscall.IFLA_ADDRESS: + var nonzero bool + for _, b := range attr.Value { + if b != 0 { + nonzero = true + } + } + if nonzero { + base.HardwareAddr = attr.Value[:] + } + case syscall.IFLA_IFNAME: + base.Name = string(attr.Value[:len(attr.Value)-1]) + case syscall.IFLA_MTU: + base.MTU = int(native.Uint32(attr.Value[0:4])) + case syscall.IFLA_LINK: + base.ParentIndex = int(native.Uint32(attr.Value[0:4])) + case syscall.IFLA_MASTER: + base.MasterIndex = int(native.Uint32(attr.Value[0:4])) + case syscall.IFLA_TXQLEN: + base.TxQLen = int(native.Uint32(attr.Value[0:4])) + case syscall.IFLA_IFALIAS: + base.Alias = string(attr.Value[:len(attr.Value)-1]) + case syscall.IFLA_STATS: + stats32 = attr.Value[:] + case IFLA_STATS64: + stats64 = attr.Value[:] + case nl.IFLA_XDP: + xdp, err := parseLinkXdp(attr.Value[:]) + if err != nil { + return nil, err + } + base.Xdp = xdp + case syscall.IFLA_PROTINFO | syscall.NLA_F_NESTED: + if hdr != nil && hdr.Type == syscall.RTM_NEWLINK && + msg.Family == syscall.AF_BRIDGE { + attrs, err := nl.ParseRouteAttr(attr.Value[:]) + if err != nil { + return nil, err + } + base.Protinfo = parseProtinfo(attrs) + } + case syscall.IFLA_OPERSTATE: + base.OperState = LinkOperState(uint8(attr.Value[0])) + } + } + + if stats64 != nil { + base.Statistics = parseLinkStats64(stats64) + } else if stats32 != nil { + base.Statistics = parseLinkStats32(stats32) + } + + // Links that don't have IFLA_INFO_KIND are hardware devices + if link == nil { + link = &Device{} + } + *link.Attrs() = base + + return link, nil +} + +// LinkList gets a list of link devices. +// Equivalent to: `ip link show` +func LinkList() ([]Link, error) { + return pkgHandle.LinkList() +} + +// LinkList gets a list of link devices. +// Equivalent to: `ip link show` +func (h *Handle) LinkList() ([]Link, error) { + // NOTE(vish): This duplicates functionality in net/iface_linux.go, but we need + // to get the message ourselves to parse link type. + req := h.newNetlinkRequest(syscall.RTM_GETLINK, syscall.NLM_F_DUMP) + + msg := nl.NewIfInfomsg(syscall.AF_UNSPEC) + req.AddData(msg) + + msgs, err := req.Execute(syscall.NETLINK_ROUTE, syscall.RTM_NEWLINK) + if err != nil { + return nil, err + } + + var res []Link + for _, m := range msgs { + link, err := LinkDeserialize(nil, m) + if err != nil { + return nil, err + } + res = append(res, link) + } + + return res, nil +} + +// LinkUpdate is used to pass information back from LinkSubscribe() +type LinkUpdate struct { + nl.IfInfomsg + Header syscall.NlMsghdr + Link +} + +// LinkSubscribe takes a chan down which notifications will be sent +// when links change. Close the 'done' chan to stop subscription. +func LinkSubscribe(ch chan<- LinkUpdate, done <-chan struct{}) error { + return linkSubscribe(netns.None(), netns.None(), ch, done) +} + +// LinkSubscribeAt works like LinkSubscribe plus it allows the caller +// to choose the network namespace in which to subscribe (ns). +func LinkSubscribeAt(ns netns.NsHandle, ch chan<- LinkUpdate, done <-chan struct{}) error { + return linkSubscribe(ns, netns.None(), ch, done) +} + +func linkSubscribe(newNs, curNs netns.NsHandle, ch chan<- LinkUpdate, done <-chan struct{}) error { + s, err := nl.SubscribeAt(newNs, curNs, syscall.NETLINK_ROUTE, syscall.RTNLGRP_LINK) + if err != nil { + return err + } + if done != nil { + go func() { + <-done + s.Close() + }() + } + go func() { + defer close(ch) + for { + msgs, err := s.Receive() + if err != nil { + return + } + for _, m := range msgs { + ifmsg := nl.DeserializeIfInfomsg(m.Data) + link, err := LinkDeserialize(&m.Header, m.Data) + if err != nil { + return + } + ch <- LinkUpdate{IfInfomsg: *ifmsg, Header: m.Header, Link: link} + } + } + }() + + return nil +} + +func LinkSetHairpin(link Link, mode bool) error { + return pkgHandle.LinkSetHairpin(link, mode) +} + +func (h *Handle) LinkSetHairpin(link Link, mode bool) error { + return h.setProtinfoAttr(link, mode, nl.IFLA_BRPORT_MODE) +} + +func LinkSetGuard(link Link, mode bool) error { + return pkgHandle.LinkSetGuard(link, mode) +} + +func (h *Handle) LinkSetGuard(link Link, mode bool) error { + return h.setProtinfoAttr(link, mode, nl.IFLA_BRPORT_GUARD) +} + +func LinkSetFastLeave(link Link, mode bool) error { + return pkgHandle.LinkSetFastLeave(link, mode) +} + +func (h *Handle) LinkSetFastLeave(link Link, mode bool) error { + return h.setProtinfoAttr(link, mode, nl.IFLA_BRPORT_FAST_LEAVE) +} + +func LinkSetLearning(link Link, mode bool) error { + return pkgHandle.LinkSetLearning(link, mode) +} + +func (h *Handle) LinkSetLearning(link Link, mode bool) error { + return h.setProtinfoAttr(link, mode, nl.IFLA_BRPORT_LEARNING) +} + +func LinkSetRootBlock(link Link, mode bool) error { + return pkgHandle.LinkSetRootBlock(link, mode) +} + +func (h *Handle) LinkSetRootBlock(link Link, mode bool) error { + return h.setProtinfoAttr(link, mode, nl.IFLA_BRPORT_PROTECT) +} + +func LinkSetFlood(link Link, mode bool) error { + return pkgHandle.LinkSetFlood(link, mode) +} + +func (h *Handle) LinkSetFlood(link Link, mode bool) error { + return h.setProtinfoAttr(link, mode, nl.IFLA_BRPORT_UNICAST_FLOOD) +} + +func LinkSetBrProxyArp(link Link, mode bool) error { + return pkgHandle.LinkSetBrProxyArp(link, mode) +} + +func (h *Handle) LinkSetBrProxyArp(link Link, mode bool) error { + return h.setProtinfoAttr(link, mode, nl.IFLA_BRPORT_PROXYARP) +} + +func LinkSetBrProxyArpWiFi(link Link, mode bool) error { + return pkgHandle.LinkSetBrProxyArpWiFi(link, mode) +} + +func (h *Handle) LinkSetBrProxyArpWiFi(link Link, mode bool) error { + return h.setProtinfoAttr(link, mode, nl.IFLA_BRPORT_PROXYARP_WIFI) +} + +func (h *Handle) setProtinfoAttr(link Link, mode bool, attr int) error { + base := link.Attrs() + h.ensureIndex(base) + req := h.newNetlinkRequest(syscall.RTM_SETLINK, syscall.NLM_F_ACK) + + msg := nl.NewIfInfomsg(syscall.AF_BRIDGE) + msg.Index = int32(base.Index) + req.AddData(msg) + + br := nl.NewRtAttr(syscall.IFLA_PROTINFO|syscall.NLA_F_NESTED, nil) + nl.NewRtAttrChild(br, attr, boolToByte(mode)) + req.AddData(br) + _, err := req.Execute(syscall.NETLINK_ROUTE, 0) + if err != nil { + return err + } + return nil +} + +func parseVlanData(link Link, data []syscall.NetlinkRouteAttr) { + vlan := link.(*Vlan) + for _, datum := range data { + switch datum.Attr.Type { + case nl.IFLA_VLAN_ID: + vlan.VlanId = int(native.Uint16(datum.Value[0:2])) + } + } +} + +func parseVxlanData(link Link, data []syscall.NetlinkRouteAttr) { + vxlan := link.(*Vxlan) + for _, datum := range data { + switch datum.Attr.Type { + case nl.IFLA_VXLAN_ID: + vxlan.VxlanId = int(native.Uint32(datum.Value[0:4])) + case nl.IFLA_VXLAN_LINK: + vxlan.VtepDevIndex = int(native.Uint32(datum.Value[0:4])) + case nl.IFLA_VXLAN_LOCAL: + vxlan.SrcAddr = net.IP(datum.Value[0:4]) + case nl.IFLA_VXLAN_LOCAL6: + vxlan.SrcAddr = net.IP(datum.Value[0:16]) + case nl.IFLA_VXLAN_GROUP: + vxlan.Group = net.IP(datum.Value[0:4]) + case nl.IFLA_VXLAN_GROUP6: + vxlan.Group = net.IP(datum.Value[0:16]) + case nl.IFLA_VXLAN_TTL: + vxlan.TTL = int(datum.Value[0]) + case nl.IFLA_VXLAN_TOS: + vxlan.TOS = int(datum.Value[0]) + case nl.IFLA_VXLAN_LEARNING: + vxlan.Learning = int8(datum.Value[0]) != 0 + case nl.IFLA_VXLAN_PROXY: + vxlan.Proxy = int8(datum.Value[0]) != 0 + case nl.IFLA_VXLAN_RSC: + vxlan.RSC = int8(datum.Value[0]) != 0 + case nl.IFLA_VXLAN_L2MISS: + vxlan.L2miss = int8(datum.Value[0]) != 0 + case nl.IFLA_VXLAN_L3MISS: + vxlan.L3miss = int8(datum.Value[0]) != 0 + case nl.IFLA_VXLAN_UDP_CSUM: + vxlan.UDPCSum = int8(datum.Value[0]) != 0 + case nl.IFLA_VXLAN_GBP: + vxlan.GBP = true + case nl.IFLA_VXLAN_FLOWBASED: + vxlan.FlowBased = int8(datum.Value[0]) != 0 + case nl.IFLA_VXLAN_AGEING: + vxlan.Age = int(native.Uint32(datum.Value[0:4])) + vxlan.NoAge = vxlan.Age == 0 + case nl.IFLA_VXLAN_LIMIT: + vxlan.Limit = int(native.Uint32(datum.Value[0:4])) + case nl.IFLA_VXLAN_PORT: + vxlan.Port = int(ntohs(datum.Value[0:2])) + case nl.IFLA_VXLAN_PORT_RANGE: + buf := bytes.NewBuffer(datum.Value[0:4]) + var pr vxlanPortRange + if binary.Read(buf, binary.BigEndian, &pr) != nil { + vxlan.PortLow = int(pr.Lo) + vxlan.PortHigh = int(pr.Hi) + } + } + } +} + +func parseBondData(link Link, data []syscall.NetlinkRouteAttr) { + bond := link.(*Bond) + for i := range data { + switch data[i].Attr.Type { + case nl.IFLA_BOND_MODE: + bond.Mode = BondMode(data[i].Value[0]) + case nl.IFLA_BOND_ACTIVE_SLAVE: + bond.ActiveSlave = int(native.Uint32(data[i].Value[0:4])) + case nl.IFLA_BOND_MIIMON: + bond.Miimon = int(native.Uint32(data[i].Value[0:4])) + case nl.IFLA_BOND_UPDELAY: + bond.UpDelay = int(native.Uint32(data[i].Value[0:4])) + case nl.IFLA_BOND_DOWNDELAY: + bond.DownDelay = int(native.Uint32(data[i].Value[0:4])) + case nl.IFLA_BOND_USE_CARRIER: + bond.UseCarrier = int(data[i].Value[0]) + case nl.IFLA_BOND_ARP_INTERVAL: + bond.ArpInterval = int(native.Uint32(data[i].Value[0:4])) + case nl.IFLA_BOND_ARP_IP_TARGET: + // TODO: implement + case nl.IFLA_BOND_ARP_VALIDATE: + bond.ArpValidate = BondArpValidate(native.Uint32(data[i].Value[0:4])) + case nl.IFLA_BOND_ARP_ALL_TARGETS: + bond.ArpAllTargets = BondArpAllTargets(native.Uint32(data[i].Value[0:4])) + case nl.IFLA_BOND_PRIMARY: + bond.Primary = int(native.Uint32(data[i].Value[0:4])) + case nl.IFLA_BOND_PRIMARY_RESELECT: + bond.PrimaryReselect = BondPrimaryReselect(data[i].Value[0]) + case nl.IFLA_BOND_FAIL_OVER_MAC: + bond.FailOverMac = BondFailOverMac(data[i].Value[0]) + case nl.IFLA_BOND_XMIT_HASH_POLICY: + bond.XmitHashPolicy = BondXmitHashPolicy(data[i].Value[0]) + case nl.IFLA_BOND_RESEND_IGMP: + bond.ResendIgmp = int(native.Uint32(data[i].Value[0:4])) + case nl.IFLA_BOND_NUM_PEER_NOTIF: + bond.NumPeerNotif = int(data[i].Value[0]) + case nl.IFLA_BOND_ALL_SLAVES_ACTIVE: + bond.AllSlavesActive = int(data[i].Value[0]) + case nl.IFLA_BOND_MIN_LINKS: + bond.MinLinks = int(native.Uint32(data[i].Value[0:4])) + case nl.IFLA_BOND_LP_INTERVAL: + bond.LpInterval = int(native.Uint32(data[i].Value[0:4])) + case nl.IFLA_BOND_PACKETS_PER_SLAVE: + bond.PackersPerSlave = int(native.Uint32(data[i].Value[0:4])) + case nl.IFLA_BOND_AD_LACP_RATE: + bond.LacpRate = BondLacpRate(data[i].Value[0]) + case nl.IFLA_BOND_AD_SELECT: + bond.AdSelect = BondAdSelect(data[i].Value[0]) + case nl.IFLA_BOND_AD_INFO: + // TODO: implement + case nl.IFLA_BOND_AD_ACTOR_SYS_PRIO: + bond.AdActorSysPrio = int(native.Uint16(data[i].Value[0:2])) + case nl.IFLA_BOND_AD_USER_PORT_KEY: + bond.AdUserPortKey = int(native.Uint16(data[i].Value[0:2])) + case nl.IFLA_BOND_AD_ACTOR_SYSTEM: + bond.AdActorSystem = net.HardwareAddr(data[i].Value[0:6]) + case nl.IFLA_BOND_TLB_DYNAMIC_LB: + bond.TlbDynamicLb = int(data[i].Value[0]) + } + } +} + +func parseIPVlanData(link Link, data []syscall.NetlinkRouteAttr) { + ipv := link.(*IPVlan) + for _, datum := range data { + if datum.Attr.Type == nl.IFLA_IPVLAN_MODE { + ipv.Mode = IPVlanMode(native.Uint32(datum.Value[0:4])) + return + } + } +} + +func parseMacvtapData(link Link, data []syscall.NetlinkRouteAttr) { + macv := link.(*Macvtap) + parseMacvlanData(&macv.Macvlan, data) +} + +func parseMacvlanData(link Link, data []syscall.NetlinkRouteAttr) { + macv := link.(*Macvlan) + for _, datum := range data { + if datum.Attr.Type == nl.IFLA_MACVLAN_MODE { + switch native.Uint32(datum.Value[0:4]) { + case nl.MACVLAN_MODE_PRIVATE: + macv.Mode = MACVLAN_MODE_PRIVATE + case nl.MACVLAN_MODE_VEPA: + macv.Mode = MACVLAN_MODE_VEPA + case nl.MACVLAN_MODE_BRIDGE: + macv.Mode = MACVLAN_MODE_BRIDGE + case nl.MACVLAN_MODE_PASSTHRU: + macv.Mode = MACVLAN_MODE_PASSTHRU + case nl.MACVLAN_MODE_SOURCE: + macv.Mode = MACVLAN_MODE_SOURCE + } + return + } + } +} + +// copied from pkg/net_linux.go +func linkFlags(rawFlags uint32) net.Flags { + var f net.Flags + if rawFlags&syscall.IFF_UP != 0 { + f |= net.FlagUp + } + if rawFlags&syscall.IFF_BROADCAST != 0 { + f |= net.FlagBroadcast + } + if rawFlags&syscall.IFF_LOOPBACK != 0 { + f |= net.FlagLoopback + } + if rawFlags&syscall.IFF_POINTOPOINT != 0 { + f |= net.FlagPointToPoint + } + if rawFlags&syscall.IFF_MULTICAST != 0 { + f |= net.FlagMulticast + } + return f +} + +func addGretapAttrs(gretap *Gretap, linkInfo *nl.RtAttr) { + data := nl.NewRtAttrChild(linkInfo, nl.IFLA_INFO_DATA, nil) + + if gretap.FlowBased { + // In flow based mode, no other attributes need to be configured + nl.NewRtAttrChild(data, nl.IFLA_GRE_COLLECT_METADATA, boolAttr(gretap.FlowBased)) + return + } + + ip := gretap.Local.To4() + if ip != nil { + nl.NewRtAttrChild(data, nl.IFLA_GRE_LOCAL, []byte(ip)) + } + ip = gretap.Remote.To4() + if ip != nil { + nl.NewRtAttrChild(data, nl.IFLA_GRE_REMOTE, []byte(ip)) + } + + if gretap.IKey != 0 { + nl.NewRtAttrChild(data, nl.IFLA_GRE_IKEY, htonl(gretap.IKey)) + gretap.IFlags |= uint16(nl.GRE_KEY) + } + + if gretap.OKey != 0 { + nl.NewRtAttrChild(data, nl.IFLA_GRE_OKEY, htonl(gretap.OKey)) + gretap.OFlags |= uint16(nl.GRE_KEY) + } + + nl.NewRtAttrChild(data, nl.IFLA_GRE_IFLAGS, htons(gretap.IFlags)) + nl.NewRtAttrChild(data, nl.IFLA_GRE_OFLAGS, htons(gretap.OFlags)) + + if gretap.Link != 0 { + nl.NewRtAttrChild(data, nl.IFLA_GRE_LINK, nl.Uint32Attr(gretap.Link)) + } + + nl.NewRtAttrChild(data, nl.IFLA_GRE_PMTUDISC, nl.Uint8Attr(gretap.PMtuDisc)) + nl.NewRtAttrChild(data, nl.IFLA_GRE_TTL, nl.Uint8Attr(gretap.Ttl)) + nl.NewRtAttrChild(data, nl.IFLA_GRE_TOS, nl.Uint8Attr(gretap.Tos)) + nl.NewRtAttrChild(data, nl.IFLA_GRE_ENCAP_TYPE, nl.Uint16Attr(gretap.EncapType)) + nl.NewRtAttrChild(data, nl.IFLA_GRE_ENCAP_FLAGS, nl.Uint16Attr(gretap.EncapFlags)) + nl.NewRtAttrChild(data, nl.IFLA_GRE_ENCAP_SPORT, htons(gretap.EncapSport)) + nl.NewRtAttrChild(data, nl.IFLA_GRE_ENCAP_DPORT, htons(gretap.EncapDport)) +} + +func parseGretapData(link Link, data []syscall.NetlinkRouteAttr) { + gre := link.(*Gretap) + for _, datum := range data { + switch datum.Attr.Type { + case nl.IFLA_GRE_OKEY: + gre.IKey = ntohl(datum.Value[0:4]) + case nl.IFLA_GRE_IKEY: + gre.OKey = ntohl(datum.Value[0:4]) + case nl.IFLA_GRE_LOCAL: + gre.Local = net.IP(datum.Value[0:4]) + case nl.IFLA_GRE_REMOTE: + gre.Remote = net.IP(datum.Value[0:4]) + case nl.IFLA_GRE_ENCAP_SPORT: + gre.EncapSport = ntohs(datum.Value[0:2]) + case nl.IFLA_GRE_ENCAP_DPORT: + gre.EncapDport = ntohs(datum.Value[0:2]) + case nl.IFLA_GRE_IFLAGS: + gre.IFlags = ntohs(datum.Value[0:2]) + case nl.IFLA_GRE_OFLAGS: + gre.OFlags = ntohs(datum.Value[0:2]) + + case nl.IFLA_GRE_TTL: + gre.Ttl = uint8(datum.Value[0]) + case nl.IFLA_GRE_TOS: + gre.Tos = uint8(datum.Value[0]) + case nl.IFLA_GRE_PMTUDISC: + gre.PMtuDisc = uint8(datum.Value[0]) + case nl.IFLA_GRE_ENCAP_TYPE: + gre.EncapType = native.Uint16(datum.Value[0:2]) + case nl.IFLA_GRE_ENCAP_FLAGS: + gre.EncapFlags = native.Uint16(datum.Value[0:2]) + case nl.IFLA_GRE_COLLECT_METADATA: + gre.FlowBased = int8(datum.Value[0]) != 0 + } + } +} + +func parseLinkStats32(data []byte) *LinkStatistics { + return (*LinkStatistics)((*LinkStatistics32)(unsafe.Pointer(&data[0:SizeofLinkStats32][0])).to64()) +} + +func parseLinkStats64(data []byte) *LinkStatistics { + return (*LinkStatistics)((*LinkStatistics64)(unsafe.Pointer(&data[0:SizeofLinkStats64][0]))) +} + +func addXdpAttrs(xdp *LinkXdp, req *nl.NetlinkRequest) { + attrs := nl.NewRtAttr(nl.IFLA_XDP|syscall.NLA_F_NESTED, nil) + b := make([]byte, 4) + native.PutUint32(b, uint32(xdp.Fd)) + nl.NewRtAttrChild(attrs, nl.IFLA_XDP_FD, b) + native.PutUint32(b, xdp.Flags) + nl.NewRtAttrChild(attrs, nl.IFLA_XDP_FLAGS, b) + req.AddData(attrs) +} + +func parseLinkXdp(data []byte) (*LinkXdp, error) { + attrs, err := nl.ParseRouteAttr(data) + if err != nil { + return nil, err + } + xdp := &LinkXdp{} + for _, attr := range attrs { + switch attr.Attr.Type { + case nl.IFLA_XDP_FD: + xdp.Fd = int(native.Uint32(attr.Value[0:4])) + case nl.IFLA_XDP_ATTACHED: + xdp.Attached = attr.Value[0] != 0 + case nl.IFLA_XDP_FLAGS: + xdp.Flags = native.Uint32(attr.Value[0:4]) + case nl.IFLA_XDP_PROG_ID: + xdp.ProgId = native.Uint32(attr.Value[0:4]) + } + } + return xdp, nil +} + +func addIptunAttrs(iptun *Iptun, linkInfo *nl.RtAttr) { + data := nl.NewRtAttrChild(linkInfo, nl.IFLA_INFO_DATA, nil) + + ip := iptun.Local.To4() + if ip != nil { + nl.NewRtAttrChild(data, nl.IFLA_IPTUN_LOCAL, []byte(ip)) + } + + ip = iptun.Remote.To4() + if ip != nil { + nl.NewRtAttrChild(data, nl.IFLA_IPTUN_REMOTE, []byte(ip)) + } + + if iptun.Link != 0 { + nl.NewRtAttrChild(data, nl.IFLA_IPTUN_LINK, nl.Uint32Attr(iptun.Link)) + } + nl.NewRtAttrChild(data, nl.IFLA_IPTUN_PMTUDISC, nl.Uint8Attr(iptun.PMtuDisc)) + nl.NewRtAttrChild(data, nl.IFLA_IPTUN_TTL, nl.Uint8Attr(iptun.Ttl)) + nl.NewRtAttrChild(data, nl.IFLA_IPTUN_TOS, nl.Uint8Attr(iptun.Tos)) +} + +func parseIptunData(link Link, data []syscall.NetlinkRouteAttr) { + iptun := link.(*Iptun) + for _, datum := range data { + switch datum.Attr.Type { + case nl.IFLA_IPTUN_LOCAL: + iptun.Local = net.IP(datum.Value[0:4]) + case nl.IFLA_IPTUN_REMOTE: + iptun.Remote = net.IP(datum.Value[0:4]) + case nl.IFLA_IPTUN_TTL: + iptun.Ttl = uint8(datum.Value[0]) + case nl.IFLA_IPTUN_TOS: + iptun.Tos = uint8(datum.Value[0]) + case nl.IFLA_IPTUN_PMTUDISC: + iptun.PMtuDisc = uint8(datum.Value[0]) + } + } +} + +func addVtiAttrs(vti *Vti, linkInfo *nl.RtAttr) { + data := nl.NewRtAttrChild(linkInfo, nl.IFLA_INFO_DATA, nil) + + ip := vti.Local.To4() + if ip != nil { + nl.NewRtAttrChild(data, nl.IFLA_VTI_LOCAL, []byte(ip)) + } + + ip = vti.Remote.To4() + if ip != nil { + nl.NewRtAttrChild(data, nl.IFLA_VTI_REMOTE, []byte(ip)) + } + + if vti.Link != 0 { + nl.NewRtAttrChild(data, nl.IFLA_VTI_LINK, nl.Uint32Attr(vti.Link)) + } + + nl.NewRtAttrChild(data, nl.IFLA_VTI_IKEY, htonl(vti.IKey)) + nl.NewRtAttrChild(data, nl.IFLA_VTI_OKEY, htonl(vti.OKey)) +} + +func parseVtiData(link Link, data []syscall.NetlinkRouteAttr) { + vti := link.(*Vti) + for _, datum := range data { + switch datum.Attr.Type { + case nl.IFLA_VTI_LOCAL: + vti.Local = net.IP(datum.Value[0:4]) + case nl.IFLA_VTI_REMOTE: + vti.Remote = net.IP(datum.Value[0:4]) + case nl.IFLA_VTI_IKEY: + vti.IKey = ntohl(datum.Value[0:4]) + case nl.IFLA_VTI_OKEY: + vti.OKey = ntohl(datum.Value[0:4]) + } + } +} + +func addVrfAttrs(vrf *Vrf, linkInfo *nl.RtAttr) { + data := nl.NewRtAttrChild(linkInfo, nl.IFLA_INFO_DATA, nil) + b := make([]byte, 4) + native.PutUint32(b, uint32(vrf.Table)) + nl.NewRtAttrChild(data, nl.IFLA_VRF_TABLE, b) +} + +func parseVrfData(link Link, data []syscall.NetlinkRouteAttr) { + vrf := link.(*Vrf) + for _, datum := range data { + switch datum.Attr.Type { + case nl.IFLA_VRF_TABLE: + vrf.Table = native.Uint32(datum.Value[0:4]) + } + } +} + +func addBridgeAttrs(bridge *Bridge, linkInfo *nl.RtAttr) { + data := nl.NewRtAttrChild(linkInfo, nl.IFLA_INFO_DATA, nil) + if bridge.MulticastSnooping != nil { + nl.NewRtAttrChild(data, nl.IFLA_BR_MCAST_SNOOPING, boolToByte(*bridge.MulticastSnooping)) + } + if bridge.HelloTime != nil { + nl.NewRtAttrChild(data, nl.IFLA_BR_HELLO_TIME, nl.Uint32Attr(*bridge.HelloTime)) + } +} + +func parseBridgeData(bridge Link, data []syscall.NetlinkRouteAttr) { + br := bridge.(*Bridge) + for _, datum := range data { + switch datum.Attr.Type { + case nl.IFLA_BR_HELLO_TIME: + helloTime := native.Uint32(datum.Value[0:4]) + br.HelloTime = &helloTime + case nl.IFLA_BR_MCAST_SNOOPING: + mcastSnooping := datum.Value[0] == 1 + br.MulticastSnooping = &mcastSnooping + } + } +} + +func addGTPAttrs(gtp *GTP, linkInfo *nl.RtAttr) { + data := nl.NewRtAttrChild(linkInfo, nl.IFLA_INFO_DATA, nil) + nl.NewRtAttrChild(data, nl.IFLA_GTP_FD0, nl.Uint32Attr(uint32(gtp.FD0))) + nl.NewRtAttrChild(data, nl.IFLA_GTP_FD1, nl.Uint32Attr(uint32(gtp.FD1))) + nl.NewRtAttrChild(data, nl.IFLA_GTP_PDP_HASHSIZE, nl.Uint32Attr(131072)) + if gtp.Role != nl.GTP_ROLE_GGSN { + nl.NewRtAttrChild(data, nl.IFLA_GTP_ROLE, nl.Uint32Attr(uint32(gtp.Role))) + } +} + +func parseGTPData(link Link, data []syscall.NetlinkRouteAttr) { + gtp := link.(*GTP) + for _, datum := range data { + switch datum.Attr.Type { + case nl.IFLA_GTP_FD0: + gtp.FD0 = int(native.Uint32(datum.Value)) + case nl.IFLA_GTP_FD1: + gtp.FD1 = int(native.Uint32(datum.Value)) + case nl.IFLA_GTP_PDP_HASHSIZE: + gtp.PDPHashsize = int(native.Uint32(datum.Value)) + case nl.IFLA_GTP_ROLE: + gtp.Role = int(native.Uint32(datum.Value)) + } + } +} diff --git a/vendor/github.com/vishvananda/netlink/link_tuntap_linux.go b/vendor/github.com/vishvananda/netlink/link_tuntap_linux.go new file mode 100644 index 00000000..310bd33d --- /dev/null +++ b/vendor/github.com/vishvananda/netlink/link_tuntap_linux.go @@ -0,0 +1,14 @@ +package netlink + +// ideally golang.org/x/sys/unix would define IfReq but it only has +// IFNAMSIZ, hence this minimalistic implementation +const ( + SizeOfIfReq = 40 + IFNAMSIZ = 16 +) + +type ifReq struct { + Name [IFNAMSIZ]byte + Flags uint16 + pad [SizeOfIfReq - IFNAMSIZ - 2]byte +} diff --git a/vendor/github.com/vishvananda/netlink/neigh.go b/vendor/github.com/vishvananda/netlink/neigh.go new file mode 100644 index 00000000..0e5eb90c --- /dev/null +++ b/vendor/github.com/vishvananda/netlink/neigh.go @@ -0,0 +1,22 @@ +package netlink + +import ( + "fmt" + "net" +) + +// Neigh represents a link layer neighbor from netlink. +type Neigh struct { + LinkIndex int + Family int + State int + Type int + Flags int + IP net.IP + HardwareAddr net.HardwareAddr +} + +// String returns $ip/$hwaddr $label +func (neigh *Neigh) String() string { + return fmt.Sprintf("%s %s", neigh.IP, neigh.HardwareAddr) +} diff --git a/vendor/github.com/vishvananda/netlink/neigh_linux.go b/vendor/github.com/vishvananda/netlink/neigh_linux.go new file mode 100644 index 00000000..f069db25 --- /dev/null +++ b/vendor/github.com/vishvananda/netlink/neigh_linux.go @@ -0,0 +1,250 @@ +package netlink + +import ( + "net" + "syscall" + "unsafe" + + "github.com/vishvananda/netlink/nl" +) + +const ( + NDA_UNSPEC = iota + NDA_DST + NDA_LLADDR + NDA_CACHEINFO + NDA_PROBES + NDA_VLAN + NDA_PORT + NDA_VNI + NDA_IFINDEX + NDA_MAX = NDA_IFINDEX +) + +// Neighbor Cache Entry States. +const ( + NUD_NONE = 0x00 + NUD_INCOMPLETE = 0x01 + NUD_REACHABLE = 0x02 + NUD_STALE = 0x04 + NUD_DELAY = 0x08 + NUD_PROBE = 0x10 + NUD_FAILED = 0x20 + NUD_NOARP = 0x40 + NUD_PERMANENT = 0x80 +) + +// Neighbor Flags +const ( + NTF_USE = 0x01 + NTF_SELF = 0x02 + NTF_MASTER = 0x04 + NTF_PROXY = 0x08 + NTF_ROUTER = 0x80 +) + +type Ndmsg struct { + Family uint8 + Index uint32 + State uint16 + Flags uint8 + Type uint8 +} + +func deserializeNdmsg(b []byte) *Ndmsg { + var dummy Ndmsg + return (*Ndmsg)(unsafe.Pointer(&b[0:unsafe.Sizeof(dummy)][0])) +} + +func (msg *Ndmsg) Serialize() []byte { + return (*(*[unsafe.Sizeof(*msg)]byte)(unsafe.Pointer(msg)))[:] +} + +func (msg *Ndmsg) Len() int { + return int(unsafe.Sizeof(*msg)) +} + +// NeighAdd will add an IP to MAC mapping to the ARP table +// Equivalent to: `ip neigh add ....` +func NeighAdd(neigh *Neigh) error { + return pkgHandle.NeighAdd(neigh) +} + +// NeighAdd will add an IP to MAC mapping to the ARP table +// Equivalent to: `ip neigh add ....` +func (h *Handle) NeighAdd(neigh *Neigh) error { + return h.neighAdd(neigh, syscall.NLM_F_CREATE|syscall.NLM_F_EXCL) +} + +// NeighSet will add or replace an IP to MAC mapping to the ARP table +// Equivalent to: `ip neigh replace....` +func NeighSet(neigh *Neigh) error { + return pkgHandle.NeighSet(neigh) +} + +// NeighSet will add or replace an IP to MAC mapping to the ARP table +// Equivalent to: `ip neigh replace....` +func (h *Handle) NeighSet(neigh *Neigh) error { + return h.neighAdd(neigh, syscall.NLM_F_CREATE|syscall.NLM_F_REPLACE) +} + +// NeighAppend will append an entry to FDB +// Equivalent to: `bridge fdb append...` +func NeighAppend(neigh *Neigh) error { + return pkgHandle.NeighAppend(neigh) +} + +// NeighAppend will append an entry to FDB +// Equivalent to: `bridge fdb append...` +func (h *Handle) NeighAppend(neigh *Neigh) error { + return h.neighAdd(neigh, syscall.NLM_F_CREATE|syscall.NLM_F_APPEND) +} + +// NeighAppend will append an entry to FDB +// Equivalent to: `bridge fdb append...` +func neighAdd(neigh *Neigh, mode int) error { + return pkgHandle.neighAdd(neigh, mode) +} + +// NeighAppend will append an entry to FDB +// Equivalent to: `bridge fdb append...` +func (h *Handle) neighAdd(neigh *Neigh, mode int) error { + req := h.newNetlinkRequest(syscall.RTM_NEWNEIGH, mode|syscall.NLM_F_ACK) + return neighHandle(neigh, req) +} + +// NeighDel will delete an IP address from a link device. +// Equivalent to: `ip addr del $addr dev $link` +func NeighDel(neigh *Neigh) error { + return pkgHandle.NeighDel(neigh) +} + +// NeighDel will delete an IP address from a link device. +// Equivalent to: `ip addr del $addr dev $link` +func (h *Handle) NeighDel(neigh *Neigh) error { + req := h.newNetlinkRequest(syscall.RTM_DELNEIGH, syscall.NLM_F_ACK) + return neighHandle(neigh, req) +} + +func neighHandle(neigh *Neigh, req *nl.NetlinkRequest) error { + var family int + if neigh.Family > 0 { + family = neigh.Family + } else { + family = nl.GetIPFamily(neigh.IP) + } + + msg := Ndmsg{ + Family: uint8(family), + Index: uint32(neigh.LinkIndex), + State: uint16(neigh.State), + Type: uint8(neigh.Type), + Flags: uint8(neigh.Flags), + } + req.AddData(&msg) + + ipData := neigh.IP.To4() + if ipData == nil { + ipData = neigh.IP.To16() + } + + dstData := nl.NewRtAttr(NDA_DST, ipData) + req.AddData(dstData) + + if neigh.Flags != NTF_PROXY || neigh.HardwareAddr != nil { + hwData := nl.NewRtAttr(NDA_LLADDR, []byte(neigh.HardwareAddr)) + req.AddData(hwData) + } + + _, err := req.Execute(syscall.NETLINK_ROUTE, 0) + return err +} + +// NeighList gets a list of IP-MAC mappings in the system (ARP table). +// Equivalent to: `ip neighbor show`. +// The list can be filtered by link and ip family. +func NeighList(linkIndex, family int) ([]Neigh, error) { + return pkgHandle.NeighList(linkIndex, family) +} + +// NeighProxyList gets a list of neighbor proxies in the system. +// Equivalent to: `ip neighbor show proxy`. +// The list can be filtered by link and ip family. +func NeighProxyList(linkIndex, family int) ([]Neigh, error) { + return pkgHandle.NeighProxyList(linkIndex, family) +} + +// NeighList gets a list of IP-MAC mappings in the system (ARP table). +// Equivalent to: `ip neighbor show`. +// The list can be filtered by link and ip family. +func (h *Handle) NeighList(linkIndex, family int) ([]Neigh, error) { + return h.neighList(linkIndex, family, 0) +} + +// NeighProxyList gets a list of neighbor proxies in the system. +// Equivalent to: `ip neighbor show proxy`. +// The list can be filtered by link, ip family. +func (h *Handle) NeighProxyList(linkIndex, family int) ([]Neigh, error) { + return h.neighList(linkIndex, family, NTF_PROXY) +} + +func (h *Handle) neighList(linkIndex, family, flags int) ([]Neigh, error) { + req := h.newNetlinkRequest(syscall.RTM_GETNEIGH, syscall.NLM_F_DUMP) + msg := Ndmsg{ + Family: uint8(family), + Index: uint32(linkIndex), + Flags: uint8(flags), + } + req.AddData(&msg) + + msgs, err := req.Execute(syscall.NETLINK_ROUTE, syscall.RTM_NEWNEIGH) + if err != nil { + return nil, err + } + + var res []Neigh + for _, m := range msgs { + ndm := deserializeNdmsg(m) + if linkIndex != 0 && int(ndm.Index) != linkIndex { + // Ignore messages from other interfaces + continue + } + + neigh, err := NeighDeserialize(m) + if err != nil { + continue + } + + res = append(res, *neigh) + } + + return res, nil +} + +func NeighDeserialize(m []byte) (*Neigh, error) { + msg := deserializeNdmsg(m) + + neigh := Neigh{ + LinkIndex: int(msg.Index), + Family: int(msg.Family), + State: int(msg.State), + Type: int(msg.Type), + Flags: int(msg.Flags), + } + + attrs, err := nl.ParseRouteAttr(m[msg.Len():]) + if err != nil { + return nil, err + } + + for _, attr := range attrs { + switch attr.Attr.Type { + case NDA_DST: + neigh.IP = net.IP(attr.Value) + case NDA_LLADDR: + neigh.HardwareAddr = net.HardwareAddr(attr.Value) + } + } + + return &neigh, nil +} diff --git a/vendor/github.com/vishvananda/netlink/netlink.go b/vendor/github.com/vishvananda/netlink/netlink.go new file mode 100644 index 00000000..fb159526 --- /dev/null +++ b/vendor/github.com/vishvananda/netlink/netlink.go @@ -0,0 +1,39 @@ +// Package netlink provides a simple library for netlink. Netlink is +// the interface a user-space program in linux uses to communicate with +// the kernel. It can be used to add and remove interfaces, set up ip +// addresses and routes, and confiugre ipsec. Netlink communication +// requires elevated privileges, so in most cases this code needs to +// be run as root. The low level primitives for netlink are contained +// in the nl subpackage. This package attempts to provide a high-level +// interface that is loosly modeled on the iproute2 cli. +package netlink + +import ( + "errors" + "net" +) + +var ( + // ErrNotImplemented is returned when a requested feature is not implemented. + ErrNotImplemented = errors.New("not implemented") +) + +// ParseIPNet parses a string in ip/net format and returns a net.IPNet. +// This is valuable because addresses in netlink are often IPNets and +// ParseCIDR returns an IPNet with the IP part set to the base IP of the +// range. +func ParseIPNet(s string) (*net.IPNet, error) { + ip, ipNet, err := net.ParseCIDR(s) + if err != nil { + return nil, err + } + return &net.IPNet{IP: ip, Mask: ipNet.Mask}, nil +} + +// NewIPNet generates an IPNet from an ip address using a netmask of 32 or 128. +func NewIPNet(ip net.IP) *net.IPNet { + if ip.To4() != nil { + return &net.IPNet{IP: ip, Mask: net.CIDRMask(32, 32)} + } + return &net.IPNet{IP: ip, Mask: net.CIDRMask(128, 128)} +} diff --git a/vendor/github.com/vishvananda/netlink/netlink_linux.go b/vendor/github.com/vishvananda/netlink/netlink_linux.go new file mode 100644 index 00000000..a20d293d --- /dev/null +++ b/vendor/github.com/vishvananda/netlink/netlink_linux.go @@ -0,0 +1,11 @@ +package netlink + +import "github.com/vishvananda/netlink/nl" + +// Family type definitions +const ( + FAMILY_ALL = nl.FAMILY_ALL + FAMILY_V4 = nl.FAMILY_V4 + FAMILY_V6 = nl.FAMILY_V6 + FAMILY_MPLS = nl.FAMILY_MPLS +) diff --git a/vendor/github.com/vishvananda/netlink/netlink_unspecified.go b/vendor/github.com/vishvananda/netlink/netlink_unspecified.go new file mode 100644 index 00000000..2d57c16d --- /dev/null +++ b/vendor/github.com/vishvananda/netlink/netlink_unspecified.go @@ -0,0 +1,221 @@ +// +build !linux + +package netlink + +import "net" + +func LinkSetUp(link Link) error { + return ErrNotImplemented +} + +func LinkSetDown(link Link) error { + return ErrNotImplemented +} + +func LinkSetMTU(link Link, mtu int) error { + return ErrNotImplemented +} + +func LinkSetMaster(link Link, master *Bridge) error { + return ErrNotImplemented +} + +func LinkSetNsPid(link Link, nspid int) error { + return ErrNotImplemented +} + +func LinkSetNsFd(link Link, fd int) error { + return ErrNotImplemented +} + +func LinkSetName(link Link, name string) error { + return ErrNotImplemented +} + +func LinkSetAlias(link Link, name string) error { + return ErrNotImplemented +} + +func LinkSetHardwareAddr(link Link, hwaddr net.HardwareAddr) error { + return ErrNotImplemented +} + +func LinkSetVfHardwareAddr(link Link, vf int, hwaddr net.HardwareAddr) error { + return ErrNotImplemented +} + +func LinkSetVfVlan(link Link, vf, vlan int) error { + return ErrNotImplemented +} + +func LinkSetVfTxRate(link Link, vf, rate int) error { + return ErrNotImplemented +} + +func LinkSetNoMaster(link Link) error { + return ErrNotImplemented +} + +func LinkSetMasterByIndex(link Link, masterIndex int) error { + return ErrNotImplemented +} + +func LinkSetXdpFd(link Link, fd int) error { + return ErrNotImplemented +} + +func LinkSetARPOff(link Link) error { + return ErrNotImplemented +} + +func LinkSetARPOn(link Link) error { + return ErrNotImplemented +} + +func LinkByName(name string) (Link, error) { + return nil, ErrNotImplemented +} + +func LinkByAlias(alias string) (Link, error) { + return nil, ErrNotImplemented +} + +func LinkByIndex(index int) (Link, error) { + return nil, ErrNotImplemented +} + +func LinkSetHairpin(link Link, mode bool) error { + return ErrNotImplemented +} + +func LinkSetGuard(link Link, mode bool) error { + return ErrNotImplemented +} + +func LinkSetFastLeave(link Link, mode bool) error { + return ErrNotImplemented +} + +func LinkSetLearning(link Link, mode bool) error { + return ErrNotImplemented +} + +func LinkSetRootBlock(link Link, mode bool) error { + return ErrNotImplemented +} + +func LinkSetFlood(link Link, mode bool) error { + return ErrNotImplemented +} + +func LinkAdd(link Link) error { + return ErrNotImplemented +} + +func LinkDel(link Link) error { + return ErrNotImplemented +} + +func SetHairpin(link Link, mode bool) error { + return ErrNotImplemented +} + +func SetGuard(link Link, mode bool) error { + return ErrNotImplemented +} + +func SetFastLeave(link Link, mode bool) error { + return ErrNotImplemented +} + +func SetLearning(link Link, mode bool) error { + return ErrNotImplemented +} + +func SetRootBlock(link Link, mode bool) error { + return ErrNotImplemented +} + +func SetFlood(link Link, mode bool) error { + return ErrNotImplemented +} + +func LinkList() ([]Link, error) { + return nil, ErrNotImplemented +} + +func AddrAdd(link Link, addr *Addr) error { + return ErrNotImplemented +} + +func AddrDel(link Link, addr *Addr) error { + return ErrNotImplemented +} + +func AddrList(link Link, family int) ([]Addr, error) { + return nil, ErrNotImplemented +} + +func RouteAdd(route *Route) error { + return ErrNotImplemented +} + +func RouteDel(route *Route) error { + return ErrNotImplemented +} + +func RouteList(link Link, family int) ([]Route, error) { + return nil, ErrNotImplemented +} + +func XfrmPolicyAdd(policy *XfrmPolicy) error { + return ErrNotImplemented +} + +func XfrmPolicyDel(policy *XfrmPolicy) error { + return ErrNotImplemented +} + +func XfrmPolicyList(family int) ([]XfrmPolicy, error) { + return nil, ErrNotImplemented +} + +func XfrmStateAdd(policy *XfrmState) error { + return ErrNotImplemented +} + +func XfrmStateDel(policy *XfrmState) error { + return ErrNotImplemented +} + +func XfrmStateList(family int) ([]XfrmState, error) { + return nil, ErrNotImplemented +} + +func NeighAdd(neigh *Neigh) error { + return ErrNotImplemented +} + +func NeighSet(neigh *Neigh) error { + return ErrNotImplemented +} + +func NeighAppend(neigh *Neigh) error { + return ErrNotImplemented +} + +func NeighDel(neigh *Neigh) error { + return ErrNotImplemented +} + +func NeighList(linkIndex, family int) ([]Neigh, error) { + return nil, ErrNotImplemented +} + +func NeighDeserialize(m []byte) (*Neigh, error) { + return nil, ErrNotImplemented +} + +func SocketGet(local, remote net.Addr) (*Socket, error) { + return nil, ErrNotImplemented +} diff --git a/vendor/github.com/vishvananda/netlink/nl/addr_linux.go b/vendor/github.com/vishvananda/netlink/nl/addr_linux.go new file mode 100644 index 00000000..fe362e9f --- /dev/null +++ b/vendor/github.com/vishvananda/netlink/nl/addr_linux.go @@ -0,0 +1,76 @@ +package nl + +import ( + "syscall" + "unsafe" +) + +type IfAddrmsg struct { + syscall.IfAddrmsg +} + +func NewIfAddrmsg(family int) *IfAddrmsg { + return &IfAddrmsg{ + IfAddrmsg: syscall.IfAddrmsg{ + Family: uint8(family), + }, + } +} + +// struct ifaddrmsg { +// __u8 ifa_family; +// __u8 ifa_prefixlen; /* The prefix length */ +// __u8 ifa_flags; /* Flags */ +// __u8 ifa_scope; /* Address scope */ +// __u32 ifa_index; /* Link index */ +// }; + +// type IfAddrmsg struct { +// Family uint8 +// Prefixlen uint8 +// Flags uint8 +// Scope uint8 +// Index uint32 +// } +// SizeofIfAddrmsg = 0x8 + +func DeserializeIfAddrmsg(b []byte) *IfAddrmsg { + return (*IfAddrmsg)(unsafe.Pointer(&b[0:syscall.SizeofIfAddrmsg][0])) +} + +func (msg *IfAddrmsg) Serialize() []byte { + return (*(*[syscall.SizeofIfAddrmsg]byte)(unsafe.Pointer(msg)))[:] +} + +func (msg *IfAddrmsg) Len() int { + return syscall.SizeofIfAddrmsg +} + +// struct ifa_cacheinfo { +// __u32 ifa_prefered; +// __u32 ifa_valid; +// __u32 cstamp; /* created timestamp, hundredths of seconds */ +// __u32 tstamp; /* updated timestamp, hundredths of seconds */ +// }; + +const IFA_CACHEINFO = 6 +const SizeofIfaCacheInfo = 0x10 + +type IfaCacheInfo struct { + IfaPrefered uint32 + IfaValid uint32 + Cstamp uint32 + Tstamp uint32 +} + +func (msg *IfaCacheInfo) Len() int { + return SizeofIfaCacheInfo +} + +func DeserializeIfaCacheInfo(b []byte) *IfaCacheInfo { + return (*IfaCacheInfo)(unsafe.Pointer(&b[0:SizeofIfaCacheInfo][0])) +} + +func (msg *IfaCacheInfo) Serialize() []byte { + return (*(*[SizeofIfaCacheInfo]byte)(unsafe.Pointer(msg)))[:] +} diff --git a/vendor/github.com/vishvananda/netlink/nl/bridge_linux.go b/vendor/github.com/vishvananda/netlink/nl/bridge_linux.go new file mode 100644 index 00000000..6c0d3333 --- /dev/null +++ b/vendor/github.com/vishvananda/netlink/nl/bridge_linux.go @@ -0,0 +1,74 @@ +package nl + +import ( + "fmt" + "unsafe" +) + +const ( + SizeofBridgeVlanInfo = 0x04 +) + +/* Bridge Flags */ +const ( + BRIDGE_FLAGS_MASTER = iota /* Bridge command to/from master */ + BRIDGE_FLAGS_SELF /* Bridge command to/from lowerdev */ +) + +/* Bridge management nested attributes + * [IFLA_AF_SPEC] = { + * [IFLA_BRIDGE_FLAGS] + * [IFLA_BRIDGE_MODE] + * [IFLA_BRIDGE_VLAN_INFO] + * } + */ +const ( + IFLA_BRIDGE_FLAGS = iota + IFLA_BRIDGE_MODE + IFLA_BRIDGE_VLAN_INFO +) + +const ( + BRIDGE_VLAN_INFO_MASTER = 1 << iota + BRIDGE_VLAN_INFO_PVID + BRIDGE_VLAN_INFO_UNTAGGED + BRIDGE_VLAN_INFO_RANGE_BEGIN + BRIDGE_VLAN_INFO_RANGE_END +) + +// struct bridge_vlan_info { +// __u16 flags; +// __u16 vid; +// }; + +type BridgeVlanInfo struct { + Flags uint16 + Vid uint16 +} + +func (b *BridgeVlanInfo) Serialize() []byte { + return (*(*[SizeofBridgeVlanInfo]byte)(unsafe.Pointer(b)))[:] +} + +func DeserializeBridgeVlanInfo(b []byte) *BridgeVlanInfo { + return (*BridgeVlanInfo)(unsafe.Pointer(&b[0:SizeofBridgeVlanInfo][0])) +} + +func (b *BridgeVlanInfo) PortVID() bool { + return b.Flags&BRIDGE_VLAN_INFO_PVID > 0 +} + +func (b *BridgeVlanInfo) EngressUntag() bool { + return b.Flags&BRIDGE_VLAN_INFO_UNTAGGED > 0 +} + +func (b *BridgeVlanInfo) String() string { + return fmt.Sprintf("%+v", *b) +} + +/* New extended info filters for IFLA_EXT_MASK */ +const ( + RTEXT_FILTER_VF = 1 << iota + RTEXT_FILTER_BRVLAN + RTEXT_FILTER_BRVLAN_COMPRESSED +) diff --git a/vendor/github.com/vishvananda/netlink/nl/conntrack_linux.go b/vendor/github.com/vishvananda/netlink/nl/conntrack_linux.go new file mode 100644 index 00000000..380cc596 --- /dev/null +++ b/vendor/github.com/vishvananda/netlink/nl/conntrack_linux.go @@ -0,0 +1,189 @@ +package nl + +import "unsafe" + +// Track the message sizes for the correct serialization/deserialization +const ( + SizeofNfgenmsg = 4 + SizeofNfattr = 4 + SizeofNfConntrack = 376 + SizeofNfctTupleHead = 52 +) + +var L4ProtoMap = map[uint8]string{ + 6: "tcp", + 17: "udp", +} + +// All the following constants are coming from: +// https://github.com/torvalds/linux/blob/master/include/uapi/linux/netfilter/nfnetlink_conntrack.h + +// enum cntl_msg_types { +// IPCTNL_MSG_CT_NEW, +// IPCTNL_MSG_CT_GET, +// IPCTNL_MSG_CT_DELETE, +// IPCTNL_MSG_CT_GET_CTRZERO, +// IPCTNL_MSG_CT_GET_STATS_CPU, +// IPCTNL_MSG_CT_GET_STATS, +// IPCTNL_MSG_CT_GET_DYING, +// IPCTNL_MSG_CT_GET_UNCONFIRMED, +// +// IPCTNL_MSG_MAX +// }; +const ( + IPCTNL_MSG_CT_GET = 1 + IPCTNL_MSG_CT_DELETE = 2 +) + +// #define NFNETLINK_V0 0 +const ( + NFNETLINK_V0 = 0 +) + +// #define NLA_F_NESTED (1 << 15) +const ( + NLA_F_NESTED = (1 << 15) +) + +// enum ctattr_type { +// CTA_UNSPEC, +// CTA_TUPLE_ORIG, +// CTA_TUPLE_REPLY, +// CTA_STATUS, +// CTA_PROTOINFO, +// CTA_HELP, +// CTA_NAT_SRC, +// #define CTA_NAT CTA_NAT_SRC /* backwards compatibility */ +// CTA_TIMEOUT, +// CTA_MARK, +// CTA_COUNTERS_ORIG, +// CTA_COUNTERS_REPLY, +// CTA_USE, +// CTA_ID, +// CTA_NAT_DST, +// CTA_TUPLE_MASTER, +// CTA_SEQ_ADJ_ORIG, +// CTA_NAT_SEQ_ADJ_ORIG = CTA_SEQ_ADJ_ORIG, +// CTA_SEQ_ADJ_REPLY, +// CTA_NAT_SEQ_ADJ_REPLY = CTA_SEQ_ADJ_REPLY, +// CTA_SECMARK, /* obsolete */ +// CTA_ZONE, +// CTA_SECCTX, +// CTA_TIMESTAMP, +// CTA_MARK_MASK, +// CTA_LABELS, +// CTA_LABELS_MASK, +// __CTA_MAX +// }; +const ( + CTA_TUPLE_ORIG = 1 + CTA_TUPLE_REPLY = 2 + CTA_STATUS = 3 + CTA_TIMEOUT = 7 + CTA_MARK = 8 + CTA_PROTOINFO = 4 +) + +// enum ctattr_tuple { +// CTA_TUPLE_UNSPEC, +// CTA_TUPLE_IP, +// CTA_TUPLE_PROTO, +// CTA_TUPLE_ZONE, +// __CTA_TUPLE_MAX +// }; +// #define CTA_TUPLE_MAX (__CTA_TUPLE_MAX - 1) +const ( + CTA_TUPLE_IP = 1 + CTA_TUPLE_PROTO = 2 +) + +// enum ctattr_ip { +// CTA_IP_UNSPEC, +// CTA_IP_V4_SRC, +// CTA_IP_V4_DST, +// CTA_IP_V6_SRC, +// CTA_IP_V6_DST, +// __CTA_IP_MAX +// }; +// #define CTA_IP_MAX (__CTA_IP_MAX - 1) +const ( + CTA_IP_V4_SRC = 1 + CTA_IP_V4_DST = 2 + CTA_IP_V6_SRC = 3 + CTA_IP_V6_DST = 4 +) + +// enum ctattr_l4proto { +// CTA_PROTO_UNSPEC, +// CTA_PROTO_NUM, +// CTA_PROTO_SRC_PORT, +// CTA_PROTO_DST_PORT, +// CTA_PROTO_ICMP_ID, +// CTA_PROTO_ICMP_TYPE, +// CTA_PROTO_ICMP_CODE, +// CTA_PROTO_ICMPV6_ID, +// CTA_PROTO_ICMPV6_TYPE, +// CTA_PROTO_ICMPV6_CODE, +// __CTA_PROTO_MAX +// }; +// #define CTA_PROTO_MAX (__CTA_PROTO_MAX - 1) +const ( + CTA_PROTO_NUM = 1 + CTA_PROTO_SRC_PORT = 2 + CTA_PROTO_DST_PORT = 3 +) + +// enum ctattr_protoinfo { +// CTA_PROTOINFO_UNSPEC, +// CTA_PROTOINFO_TCP, +// CTA_PROTOINFO_DCCP, +// CTA_PROTOINFO_SCTP, +// __CTA_PROTOINFO_MAX +// }; +// #define CTA_PROTOINFO_MAX (__CTA_PROTOINFO_MAX - 1) +const ( + CTA_PROTOINFO_TCP = 1 +) + +// enum ctattr_protoinfo_tcp { +// CTA_PROTOINFO_TCP_UNSPEC, +// CTA_PROTOINFO_TCP_STATE, +// CTA_PROTOINFO_TCP_WSCALE_ORIGINAL, +// CTA_PROTOINFO_TCP_WSCALE_REPLY, +// CTA_PROTOINFO_TCP_FLAGS_ORIGINAL, +// CTA_PROTOINFO_TCP_FLAGS_REPLY, +// __CTA_PROTOINFO_TCP_MAX +// }; +// #define CTA_PROTOINFO_TCP_MAX (__CTA_PROTOINFO_TCP_MAX - 1) +const ( + CTA_PROTOINFO_TCP_STATE = 1 + CTA_PROTOINFO_TCP_WSCALE_ORIGINAL = 2 + CTA_PROTOINFO_TCP_WSCALE_REPLY = 3 + CTA_PROTOINFO_TCP_FLAGS_ORIGINAL = 4 + CTA_PROTOINFO_TCP_FLAGS_REPLY = 5 +) + +// /* General form of address family dependent message. +// */ +// struct nfgenmsg { +// __u8 nfgen_family; /* AF_xxx */ +// __u8 version; /* nfnetlink version */ +// __be16 res_id; /* resource id */ +// }; +type Nfgenmsg struct { + NfgenFamily uint8 + Version uint8 + ResId uint16 // big endian +} + +func (msg *Nfgenmsg) Len() int { + return SizeofNfgenmsg +} + +func DeserializeNfgenmsg(b []byte) *Nfgenmsg { + return (*Nfgenmsg)(unsafe.Pointer(&b[0:SizeofNfgenmsg][0])) +} + +func (msg *Nfgenmsg) Serialize() []byte { + return (*(*[SizeofNfgenmsg]byte)(unsafe.Pointer(msg)))[:] +} diff --git a/vendor/github.com/vishvananda/netlink/nl/genetlink_linux.go b/vendor/github.com/vishvananda/netlink/nl/genetlink_linux.go new file mode 100644 index 00000000..81b46f2c --- /dev/null +++ b/vendor/github.com/vishvananda/netlink/nl/genetlink_linux.go @@ -0,0 +1,89 @@ +package nl + +import ( + "unsafe" +) + +const SizeofGenlmsg = 4 + +const ( + GENL_ID_CTRL = 0x10 + GENL_CTRL_VERSION = 2 + GENL_CTRL_NAME = "nlctrl" +) + +const ( + GENL_CTRL_CMD_GETFAMILY = 3 +) + +const ( + GENL_CTRL_ATTR_UNSPEC = iota + GENL_CTRL_ATTR_FAMILY_ID + GENL_CTRL_ATTR_FAMILY_NAME + GENL_CTRL_ATTR_VERSION + GENL_CTRL_ATTR_HDRSIZE + GENL_CTRL_ATTR_MAXATTR + GENL_CTRL_ATTR_OPS + GENL_CTRL_ATTR_MCAST_GROUPS +) + +const ( + GENL_CTRL_ATTR_OP_UNSPEC = iota + GENL_CTRL_ATTR_OP_ID + GENL_CTRL_ATTR_OP_FLAGS +) + +const ( + GENL_ADMIN_PERM = 1 << iota + GENL_CMD_CAP_DO + GENL_CMD_CAP_DUMP + GENL_CMD_CAP_HASPOL +) + +const ( + GENL_CTRL_ATTR_MCAST_GRP_UNSPEC = iota + GENL_CTRL_ATTR_MCAST_GRP_NAME + GENL_CTRL_ATTR_MCAST_GRP_ID +) + +const ( + GENL_GTP_VERSION = 0 + GENL_GTP_NAME = "gtp" +) + +const ( + GENL_GTP_CMD_NEWPDP = iota + GENL_GTP_CMD_DELPDP + GENL_GTP_CMD_GETPDP +) + +const ( + GENL_GTP_ATTR_UNSPEC = iota + GENL_GTP_ATTR_LINK + GENL_GTP_ATTR_VERSION + GENL_GTP_ATTR_TID + GENL_GTP_ATTR_PEER_ADDRESS + GENL_GTP_ATTR_MS_ADDRESS + GENL_GTP_ATTR_FLOW + GENL_GTP_ATTR_NET_NS_FD + GENL_GTP_ATTR_I_TEI + GENL_GTP_ATTR_O_TEI + GENL_GTP_ATTR_PAD +) + +type Genlmsg struct { + Command uint8 + Version uint8 +} + +func (msg *Genlmsg) Len() int { + return SizeofGenlmsg +} + +func DeserializeGenlmsg(b []byte) *Genlmsg { + return (*Genlmsg)(unsafe.Pointer(&b[0:SizeofGenlmsg][0])) +} + +func (msg *Genlmsg) Serialize() []byte { + return (*(*[SizeofGenlmsg]byte)(unsafe.Pointer(msg)))[:] +} diff --git a/vendor/github.com/vishvananda/netlink/nl/link_linux.go b/vendor/github.com/vishvananda/netlink/nl/link_linux.go new file mode 100644 index 00000000..a492246d --- /dev/null +++ b/vendor/github.com/vishvananda/netlink/nl/link_linux.go @@ -0,0 +1,525 @@ +package nl + +import ( + "syscall" + "unsafe" +) + +const ( + DEFAULT_CHANGE = 0xFFFFFFFF + // doesn't exist in syscall + IFLA_VFINFO_LIST = syscall.IFLA_IFALIAS + 1 + iota + IFLA_STATS64 + IFLA_VF_PORTS + IFLA_PORT_SELF + IFLA_AF_SPEC + IFLA_GROUP + IFLA_NET_NS_FD + IFLA_EXT_MASK + IFLA_PROMISCUITY + IFLA_NUM_TX_QUEUES + IFLA_NUM_RX_QUEUES + IFLA_CARRIER + IFLA_PHYS_PORT_ID + IFLA_CARRIER_CHANGES + IFLA_PHYS_SWITCH_ID + IFLA_LINK_NETNSID + IFLA_PHYS_PORT_NAME + IFLA_PROTO_DOWN + IFLA_GSO_MAX_SEGS + IFLA_GSO_MAX_SIZE + IFLA_PAD + IFLA_XDP +) + +const ( + IFLA_INFO_UNSPEC = iota + IFLA_INFO_KIND + IFLA_INFO_DATA + IFLA_INFO_XSTATS + IFLA_INFO_MAX = IFLA_INFO_XSTATS +) + +const ( + IFLA_VLAN_UNSPEC = iota + IFLA_VLAN_ID + IFLA_VLAN_FLAGS + IFLA_VLAN_EGRESS_QOS + IFLA_VLAN_INGRESS_QOS + IFLA_VLAN_PROTOCOL + IFLA_VLAN_MAX = IFLA_VLAN_PROTOCOL +) + +const ( + VETH_INFO_UNSPEC = iota + VETH_INFO_PEER + VETH_INFO_MAX = VETH_INFO_PEER +) + +const ( + IFLA_VXLAN_UNSPEC = iota + IFLA_VXLAN_ID + IFLA_VXLAN_GROUP + IFLA_VXLAN_LINK + IFLA_VXLAN_LOCAL + IFLA_VXLAN_TTL + IFLA_VXLAN_TOS + IFLA_VXLAN_LEARNING + IFLA_VXLAN_AGEING + IFLA_VXLAN_LIMIT + IFLA_VXLAN_PORT_RANGE + IFLA_VXLAN_PROXY + IFLA_VXLAN_RSC + IFLA_VXLAN_L2MISS + IFLA_VXLAN_L3MISS + IFLA_VXLAN_PORT + IFLA_VXLAN_GROUP6 + IFLA_VXLAN_LOCAL6 + IFLA_VXLAN_UDP_CSUM + IFLA_VXLAN_UDP_ZERO_CSUM6_TX + IFLA_VXLAN_UDP_ZERO_CSUM6_RX + IFLA_VXLAN_REMCSUM_TX + IFLA_VXLAN_REMCSUM_RX + IFLA_VXLAN_GBP + IFLA_VXLAN_REMCSUM_NOPARTIAL + IFLA_VXLAN_FLOWBASED + IFLA_VXLAN_MAX = IFLA_VXLAN_FLOWBASED +) + +const ( + BRIDGE_MODE_UNSPEC = iota + BRIDGE_MODE_HAIRPIN +) + +const ( + IFLA_BRPORT_UNSPEC = iota + IFLA_BRPORT_STATE + IFLA_BRPORT_PRIORITY + IFLA_BRPORT_COST + IFLA_BRPORT_MODE + IFLA_BRPORT_GUARD + IFLA_BRPORT_PROTECT + IFLA_BRPORT_FAST_LEAVE + IFLA_BRPORT_LEARNING + IFLA_BRPORT_UNICAST_FLOOD + IFLA_BRPORT_PROXYARP + IFLA_BRPORT_LEARNING_SYNC + IFLA_BRPORT_PROXYARP_WIFI + IFLA_BRPORT_MAX = IFLA_BRPORT_PROXYARP_WIFI +) + +const ( + IFLA_IPVLAN_UNSPEC = iota + IFLA_IPVLAN_MODE + IFLA_IPVLAN_MAX = IFLA_IPVLAN_MODE +) + +const ( + IFLA_MACVLAN_UNSPEC = iota + IFLA_MACVLAN_MODE + IFLA_MACVLAN_FLAGS + IFLA_MACVLAN_MAX = IFLA_MACVLAN_FLAGS +) + +const ( + MACVLAN_MODE_PRIVATE = 1 + MACVLAN_MODE_VEPA = 2 + MACVLAN_MODE_BRIDGE = 4 + MACVLAN_MODE_PASSTHRU = 8 + MACVLAN_MODE_SOURCE = 16 +) + +const ( + IFLA_BOND_UNSPEC = iota + IFLA_BOND_MODE + IFLA_BOND_ACTIVE_SLAVE + IFLA_BOND_MIIMON + IFLA_BOND_UPDELAY + IFLA_BOND_DOWNDELAY + IFLA_BOND_USE_CARRIER + IFLA_BOND_ARP_INTERVAL + IFLA_BOND_ARP_IP_TARGET + IFLA_BOND_ARP_VALIDATE + IFLA_BOND_ARP_ALL_TARGETS + IFLA_BOND_PRIMARY + IFLA_BOND_PRIMARY_RESELECT + IFLA_BOND_FAIL_OVER_MAC + IFLA_BOND_XMIT_HASH_POLICY + IFLA_BOND_RESEND_IGMP + IFLA_BOND_NUM_PEER_NOTIF + IFLA_BOND_ALL_SLAVES_ACTIVE + IFLA_BOND_MIN_LINKS + IFLA_BOND_LP_INTERVAL + IFLA_BOND_PACKETS_PER_SLAVE + IFLA_BOND_AD_LACP_RATE + IFLA_BOND_AD_SELECT + IFLA_BOND_AD_INFO + IFLA_BOND_AD_ACTOR_SYS_PRIO + IFLA_BOND_AD_USER_PORT_KEY + IFLA_BOND_AD_ACTOR_SYSTEM + IFLA_BOND_TLB_DYNAMIC_LB +) + +const ( + IFLA_BOND_AD_INFO_UNSPEC = iota + IFLA_BOND_AD_INFO_AGGREGATOR + IFLA_BOND_AD_INFO_NUM_PORTS + IFLA_BOND_AD_INFO_ACTOR_KEY + IFLA_BOND_AD_INFO_PARTNER_KEY + IFLA_BOND_AD_INFO_PARTNER_MAC +) + +const ( + IFLA_BOND_SLAVE_UNSPEC = iota + IFLA_BOND_SLAVE_STATE + IFLA_BOND_SLAVE_MII_STATUS + IFLA_BOND_SLAVE_LINK_FAILURE_COUNT + IFLA_BOND_SLAVE_PERM_HWADDR + IFLA_BOND_SLAVE_QUEUE_ID + IFLA_BOND_SLAVE_AD_AGGREGATOR_ID +) + +const ( + IFLA_GRE_UNSPEC = iota + IFLA_GRE_LINK + IFLA_GRE_IFLAGS + IFLA_GRE_OFLAGS + IFLA_GRE_IKEY + IFLA_GRE_OKEY + IFLA_GRE_LOCAL + IFLA_GRE_REMOTE + IFLA_GRE_TTL + IFLA_GRE_TOS + IFLA_GRE_PMTUDISC + IFLA_GRE_ENCAP_LIMIT + IFLA_GRE_FLOWINFO + IFLA_GRE_FLAGS + IFLA_GRE_ENCAP_TYPE + IFLA_GRE_ENCAP_FLAGS + IFLA_GRE_ENCAP_SPORT + IFLA_GRE_ENCAP_DPORT + IFLA_GRE_COLLECT_METADATA + IFLA_GRE_MAX = IFLA_GRE_COLLECT_METADATA +) + +const ( + GRE_CSUM = 0x8000 + GRE_ROUTING = 0x4000 + GRE_KEY = 0x2000 + GRE_SEQ = 0x1000 + GRE_STRICT = 0x0800 + GRE_REC = 0x0700 + GRE_FLAGS = 0x00F8 + GRE_VERSION = 0x0007 +) + +const ( + IFLA_VF_INFO_UNSPEC = iota + IFLA_VF_INFO + IFLA_VF_INFO_MAX = IFLA_VF_INFO +) + +const ( + IFLA_VF_UNSPEC = iota + IFLA_VF_MAC /* Hardware queue specific attributes */ + IFLA_VF_VLAN + IFLA_VF_TX_RATE /* Max TX Bandwidth Allocation */ + IFLA_VF_SPOOFCHK /* Spoof Checking on/off switch */ + IFLA_VF_LINK_STATE /* link state enable/disable/auto switch */ + IFLA_VF_RATE /* Min and Max TX Bandwidth Allocation */ + IFLA_VF_RSS_QUERY_EN /* RSS Redirection Table and Hash Key query + * on/off switch + */ + IFLA_VF_STATS /* network device statistics */ + IFLA_VF_MAX = IFLA_VF_STATS +) + +const ( + IFLA_VF_LINK_STATE_AUTO = iota /* link state of the uplink */ + IFLA_VF_LINK_STATE_ENABLE /* link always up */ + IFLA_VF_LINK_STATE_DISABLE /* link always down */ + IFLA_VF_LINK_STATE_MAX = IFLA_VF_LINK_STATE_DISABLE +) + +const ( + IFLA_VF_STATS_RX_PACKETS = iota + IFLA_VF_STATS_TX_PACKETS + IFLA_VF_STATS_RX_BYTES + IFLA_VF_STATS_TX_BYTES + IFLA_VF_STATS_BROADCAST + IFLA_VF_STATS_MULTICAST + IFLA_VF_STATS_MAX = IFLA_VF_STATS_MULTICAST +) + +const ( + SizeofVfMac = 0x24 + SizeofVfVlan = 0x0c + SizeofVfTxRate = 0x08 + SizeofVfRate = 0x0c + SizeofVfSpoofchk = 0x08 + SizeofVfLinkState = 0x08 + SizeofVfRssQueryEn = 0x08 +) + +// struct ifla_vf_mac { +// __u32 vf; +// __u8 mac[32]; /* MAX_ADDR_LEN */ +// }; + +type VfMac struct { + Vf uint32 + Mac [32]byte +} + +func (msg *VfMac) Len() int { + return SizeofVfMac +} + +func DeserializeVfMac(b []byte) *VfMac { + return (*VfMac)(unsafe.Pointer(&b[0:SizeofVfMac][0])) +} + +func (msg *VfMac) Serialize() []byte { + return (*(*[SizeofVfMac]byte)(unsafe.Pointer(msg)))[:] +} + +// struct ifla_vf_vlan { +// __u32 vf; +// __u32 vlan; /* 0 - 4095, 0 disables VLAN filter */ +// __u32 qos; +// }; + +type VfVlan struct { + Vf uint32 + Vlan uint32 + Qos uint32 +} + +func (msg *VfVlan) Len() int { + return SizeofVfVlan +} + +func DeserializeVfVlan(b []byte) *VfVlan { + return (*VfVlan)(unsafe.Pointer(&b[0:SizeofVfVlan][0])) +} + +func (msg *VfVlan) Serialize() []byte { + return (*(*[SizeofVfVlan]byte)(unsafe.Pointer(msg)))[:] +} + +// struct ifla_vf_tx_rate { +// __u32 vf; +// __u32 rate; /* Max TX bandwidth in Mbps, 0 disables throttling */ +// }; + +type VfTxRate struct { + Vf uint32 + Rate uint32 +} + +func (msg *VfTxRate) Len() int { + return SizeofVfTxRate +} + +func DeserializeVfTxRate(b []byte) *VfTxRate { + return (*VfTxRate)(unsafe.Pointer(&b[0:SizeofVfTxRate][0])) +} + +func (msg *VfTxRate) Serialize() []byte { + return (*(*[SizeofVfTxRate]byte)(unsafe.Pointer(msg)))[:] +} + +// struct ifla_vf_rate { +// __u32 vf; +// __u32 min_tx_rate; /* Min Bandwidth in Mbps */ +// __u32 max_tx_rate; /* Max Bandwidth in Mbps */ +// }; + +type VfRate struct { + Vf uint32 + MinTxRate uint32 + MaxTxRate uint32 +} + +func (msg *VfRate) Len() int { + return SizeofVfRate +} + +func DeserializeVfRate(b []byte) *VfRate { + return (*VfRate)(unsafe.Pointer(&b[0:SizeofVfRate][0])) +} + +func (msg *VfRate) Serialize() []byte { + return (*(*[SizeofVfRate]byte)(unsafe.Pointer(msg)))[:] +} + +// struct ifla_vf_spoofchk { +// __u32 vf; +// __u32 setting; +// }; + +type VfSpoofchk struct { + Vf uint32 + Setting uint32 +} + +func (msg *VfSpoofchk) Len() int { + return SizeofVfSpoofchk +} + +func DeserializeVfSpoofchk(b []byte) *VfSpoofchk { + return (*VfSpoofchk)(unsafe.Pointer(&b[0:SizeofVfSpoofchk][0])) +} + +func (msg *VfSpoofchk) Serialize() []byte { + return (*(*[SizeofVfSpoofchk]byte)(unsafe.Pointer(msg)))[:] +} + +// struct ifla_vf_link_state { +// __u32 vf; +// __u32 link_state; +// }; + +type VfLinkState struct { + Vf uint32 + LinkState uint32 +} + +func (msg *VfLinkState) Len() int { + return SizeofVfLinkState +} + +func DeserializeVfLinkState(b []byte) *VfLinkState { + return (*VfLinkState)(unsafe.Pointer(&b[0:SizeofVfLinkState][0])) +} + +func (msg *VfLinkState) Serialize() []byte { + return (*(*[SizeofVfLinkState]byte)(unsafe.Pointer(msg)))[:] +} + +// struct ifla_vf_rss_query_en { +// __u32 vf; +// __u32 setting; +// }; + +type VfRssQueryEn struct { + Vf uint32 + Setting uint32 +} + +func (msg *VfRssQueryEn) Len() int { + return SizeofVfRssQueryEn +} + +func DeserializeVfRssQueryEn(b []byte) *VfRssQueryEn { + return (*VfRssQueryEn)(unsafe.Pointer(&b[0:SizeofVfRssQueryEn][0])) +} + +func (msg *VfRssQueryEn) Serialize() []byte { + return (*(*[SizeofVfRssQueryEn]byte)(unsafe.Pointer(msg)))[:] +} + +const ( + IFLA_XDP_UNSPEC = iota + IFLA_XDP_FD /* fd of xdp program to attach, or -1 to remove */ + IFLA_XDP_ATTACHED /* read-only bool indicating if prog is attached */ + IFLA_XDP_FLAGS /* xdp prog related flags */ + IFLA_XDP_PROG_ID /* xdp prog id */ + IFLA_XDP_MAX = IFLA_XDP_PROG_ID +) + +const ( + IFLA_IPTUN_UNSPEC = iota + IFLA_IPTUN_LINK + IFLA_IPTUN_LOCAL + IFLA_IPTUN_REMOTE + IFLA_IPTUN_TTL + IFLA_IPTUN_TOS + IFLA_IPTUN_ENCAP_LIMIT + IFLA_IPTUN_FLOWINFO + IFLA_IPTUN_FLAGS + IFLA_IPTUN_PROTO + IFLA_IPTUN_PMTUDISC + IFLA_IPTUN_6RD_PREFIX + IFLA_IPTUN_6RD_RELAY_PREFIX + IFLA_IPTUN_6RD_PREFIXLEN + IFLA_IPTUN_6RD_RELAY_PREFIXLEN + IFLA_IPTUN_MAX = IFLA_IPTUN_6RD_RELAY_PREFIXLEN +) + +const ( + IFLA_VTI_UNSPEC = iota + IFLA_VTI_LINK + IFLA_VTI_IKEY + IFLA_VTI_OKEY + IFLA_VTI_LOCAL + IFLA_VTI_REMOTE + IFLA_VTI_MAX = IFLA_VTI_REMOTE +) + +const ( + IFLA_VRF_UNSPEC = iota + IFLA_VRF_TABLE +) + +const ( + IFLA_BR_UNSPEC = iota + IFLA_BR_FORWARD_DELAY + IFLA_BR_HELLO_TIME + IFLA_BR_MAX_AGE + IFLA_BR_AGEING_TIME + IFLA_BR_STP_STATE + IFLA_BR_PRIORITY + IFLA_BR_VLAN_FILTERING + IFLA_BR_VLAN_PROTOCOL + IFLA_BR_GROUP_FWD_MASK + IFLA_BR_ROOT_ID + IFLA_BR_BRIDGE_ID + IFLA_BR_ROOT_PORT + IFLA_BR_ROOT_PATH_COST + IFLA_BR_TOPOLOGY_CHANGE + IFLA_BR_TOPOLOGY_CHANGE_DETECTED + IFLA_BR_HELLO_TIMER + IFLA_BR_TCN_TIMER + IFLA_BR_TOPOLOGY_CHANGE_TIMER + IFLA_BR_GC_TIMER + IFLA_BR_GROUP_ADDR + IFLA_BR_FDB_FLUSH + IFLA_BR_MCAST_ROUTER + IFLA_BR_MCAST_SNOOPING + IFLA_BR_MCAST_QUERY_USE_IFADDR + IFLA_BR_MCAST_QUERIER + IFLA_BR_MCAST_HASH_ELASTICITY + IFLA_BR_MCAST_HASH_MAX + IFLA_BR_MCAST_LAST_MEMBER_CNT + IFLA_BR_MCAST_STARTUP_QUERY_CNT + IFLA_BR_MCAST_LAST_MEMBER_INTVL + IFLA_BR_MCAST_MEMBERSHIP_INTVL + IFLA_BR_MCAST_QUERIER_INTVL + IFLA_BR_MCAST_QUERY_INTVL + IFLA_BR_MCAST_QUERY_RESPONSE_INTVL + IFLA_BR_MCAST_STARTUP_QUERY_INTVL + IFLA_BR_NF_CALL_IPTABLES + IFLA_BR_NF_CALL_IP6TABLES + IFLA_BR_NF_CALL_ARPTABLES + IFLA_BR_VLAN_DEFAULT_PVID + IFLA_BR_PAD + IFLA_BR_VLAN_STATS_ENABLED + IFLA_BR_MCAST_STATS_ENABLED + IFLA_BR_MCAST_IGMP_VERSION + IFLA_BR_MCAST_MLD_VERSION + IFLA_BR_MAX = IFLA_BR_MCAST_MLD_VERSION +) + +const ( + IFLA_GTP_UNSPEC = iota + IFLA_GTP_FD0 + IFLA_GTP_FD1 + IFLA_GTP_PDP_HASHSIZE + IFLA_GTP_ROLE +) + +const ( + GTP_ROLE_GGSN = iota + GTP_ROLE_SGSN +) diff --git a/vendor/github.com/vishvananda/netlink/nl/mpls_linux.go b/vendor/github.com/vishvananda/netlink/nl/mpls_linux.go new file mode 100644 index 00000000..3915b7ee --- /dev/null +++ b/vendor/github.com/vishvananda/netlink/nl/mpls_linux.go @@ -0,0 +1,36 @@ +package nl + +import "encoding/binary" + +const ( + MPLS_LS_LABEL_SHIFT = 12 + MPLS_LS_S_SHIFT = 8 +) + +func EncodeMPLSStack(labels ...int) []byte { + b := make([]byte, 4*len(labels)) + for idx, label := range labels { + l := label << MPLS_LS_LABEL_SHIFT + if idx == len(labels)-1 { + l |= 1 << MPLS_LS_S_SHIFT + } + binary.BigEndian.PutUint32(b[idx*4:], uint32(l)) + } + return b +} + +func DecodeMPLSStack(buf []byte) []int { + if len(buf)%4 != 0 { + return nil + } + stack := make([]int, 0, len(buf)/4) + for len(buf) > 0 { + l := binary.BigEndian.Uint32(buf[:4]) + buf = buf[4:] + stack = append(stack, int(l)>>MPLS_LS_LABEL_SHIFT) + if (l>>MPLS_LS_S_SHIFT)&1 > 0 { + break + } + } + return stack +} diff --git a/vendor/github.com/vishvananda/netlink/nl/nl_linux.go b/vendor/github.com/vishvananda/netlink/nl/nl_linux.go new file mode 100644 index 00000000..1329acd8 --- /dev/null +++ b/vendor/github.com/vishvananda/netlink/nl/nl_linux.go @@ -0,0 +1,718 @@ +// Package nl has low level primitives for making Netlink calls. +package nl + +import ( + "bytes" + "encoding/binary" + "fmt" + "net" + "runtime" + "sync" + "sync/atomic" + "syscall" + "unsafe" + + "github.com/vishvananda/netns" +) + +const ( + // Family type definitions + FAMILY_ALL = syscall.AF_UNSPEC + FAMILY_V4 = syscall.AF_INET + FAMILY_V6 = syscall.AF_INET6 + FAMILY_MPLS = AF_MPLS +) + +// SupportedNlFamilies contains the list of netlink families this netlink package supports +var SupportedNlFamilies = []int{syscall.NETLINK_ROUTE, syscall.NETLINK_XFRM, syscall.NETLINK_NETFILTER} + +var nextSeqNr uint32 + +// GetIPFamily returns the family type of a net.IP. +func GetIPFamily(ip net.IP) int { + if len(ip) <= net.IPv4len { + return FAMILY_V4 + } + if ip.To4() != nil { + return FAMILY_V4 + } + return FAMILY_V6 +} + +var nativeEndian binary.ByteOrder + +// Get native endianness for the system +func NativeEndian() binary.ByteOrder { + if nativeEndian == nil { + var x uint32 = 0x01020304 + if *(*byte)(unsafe.Pointer(&x)) == 0x01 { + nativeEndian = binary.BigEndian + } else { + nativeEndian = binary.LittleEndian + } + } + return nativeEndian +} + +// Byte swap a 16 bit value if we aren't big endian +func Swap16(i uint16) uint16 { + if NativeEndian() == binary.BigEndian { + return i + } + return (i&0xff00)>>8 | (i&0xff)<<8 +} + +// Byte swap a 32 bit value if aren't big endian +func Swap32(i uint32) uint32 { + if NativeEndian() == binary.BigEndian { + return i + } + return (i&0xff000000)>>24 | (i&0xff0000)>>8 | (i&0xff00)<<8 | (i&0xff)<<24 +} + +type NetlinkRequestData interface { + Len() int + Serialize() []byte +} + +// IfInfomsg is related to links, but it is used for list requests as well +type IfInfomsg struct { + syscall.IfInfomsg +} + +// Create an IfInfomsg with family specified +func NewIfInfomsg(family int) *IfInfomsg { + return &IfInfomsg{ + IfInfomsg: syscall.IfInfomsg{ + Family: uint8(family), + }, + } +} + +func DeserializeIfInfomsg(b []byte) *IfInfomsg { + return (*IfInfomsg)(unsafe.Pointer(&b[0:syscall.SizeofIfInfomsg][0])) +} + +func (msg *IfInfomsg) Serialize() []byte { + return (*(*[syscall.SizeofIfInfomsg]byte)(unsafe.Pointer(msg)))[:] +} + +func (msg *IfInfomsg) Len() int { + return syscall.SizeofIfInfomsg +} + +func (msg *IfInfomsg) EncapType() string { + switch msg.Type { + case 0: + return "generic" + case syscall.ARPHRD_ETHER: + return "ether" + case syscall.ARPHRD_EETHER: + return "eether" + case syscall.ARPHRD_AX25: + return "ax25" + case syscall.ARPHRD_PRONET: + return "pronet" + case syscall.ARPHRD_CHAOS: + return "chaos" + case syscall.ARPHRD_IEEE802: + return "ieee802" + case syscall.ARPHRD_ARCNET: + return "arcnet" + case syscall.ARPHRD_APPLETLK: + return "atalk" + case syscall.ARPHRD_DLCI: + return "dlci" + case syscall.ARPHRD_ATM: + return "atm" + case syscall.ARPHRD_METRICOM: + return "metricom" + case syscall.ARPHRD_IEEE1394: + return "ieee1394" + case syscall.ARPHRD_INFINIBAND: + return "infiniband" + case syscall.ARPHRD_SLIP: + return "slip" + case syscall.ARPHRD_CSLIP: + return "cslip" + case syscall.ARPHRD_SLIP6: + return "slip6" + case syscall.ARPHRD_CSLIP6: + return "cslip6" + case syscall.ARPHRD_RSRVD: + return "rsrvd" + case syscall.ARPHRD_ADAPT: + return "adapt" + case syscall.ARPHRD_ROSE: + return "rose" + case syscall.ARPHRD_X25: + return "x25" + case syscall.ARPHRD_HWX25: + return "hwx25" + case syscall.ARPHRD_PPP: + return "ppp" + case syscall.ARPHRD_HDLC: + return "hdlc" + case syscall.ARPHRD_LAPB: + return "lapb" + case syscall.ARPHRD_DDCMP: + return "ddcmp" + case syscall.ARPHRD_RAWHDLC: + return "rawhdlc" + case syscall.ARPHRD_TUNNEL: + return "ipip" + case syscall.ARPHRD_TUNNEL6: + return "tunnel6" + case syscall.ARPHRD_FRAD: + return "frad" + case syscall.ARPHRD_SKIP: + return "skip" + case syscall.ARPHRD_LOOPBACK: + return "loopback" + case syscall.ARPHRD_LOCALTLK: + return "ltalk" + case syscall.ARPHRD_FDDI: + return "fddi" + case syscall.ARPHRD_BIF: + return "bif" + case syscall.ARPHRD_SIT: + return "sit" + case syscall.ARPHRD_IPDDP: + return "ip/ddp" + case syscall.ARPHRD_IPGRE: + return "gre" + case syscall.ARPHRD_PIMREG: + return "pimreg" + case syscall.ARPHRD_HIPPI: + return "hippi" + case syscall.ARPHRD_ASH: + return "ash" + case syscall.ARPHRD_ECONET: + return "econet" + case syscall.ARPHRD_IRDA: + return "irda" + case syscall.ARPHRD_FCPP: + return "fcpp" + case syscall.ARPHRD_FCAL: + return "fcal" + case syscall.ARPHRD_FCPL: + return "fcpl" + case syscall.ARPHRD_FCFABRIC: + return "fcfb0" + case syscall.ARPHRD_FCFABRIC + 1: + return "fcfb1" + case syscall.ARPHRD_FCFABRIC + 2: + return "fcfb2" + case syscall.ARPHRD_FCFABRIC + 3: + return "fcfb3" + case syscall.ARPHRD_FCFABRIC + 4: + return "fcfb4" + case syscall.ARPHRD_FCFABRIC + 5: + return "fcfb5" + case syscall.ARPHRD_FCFABRIC + 6: + return "fcfb6" + case syscall.ARPHRD_FCFABRIC + 7: + return "fcfb7" + case syscall.ARPHRD_FCFABRIC + 8: + return "fcfb8" + case syscall.ARPHRD_FCFABRIC + 9: + return "fcfb9" + case syscall.ARPHRD_FCFABRIC + 10: + return "fcfb10" + case syscall.ARPHRD_FCFABRIC + 11: + return "fcfb11" + case syscall.ARPHRD_FCFABRIC + 12: + return "fcfb12" + case syscall.ARPHRD_IEEE802_TR: + return "tr" + case syscall.ARPHRD_IEEE80211: + return "ieee802.11" + case syscall.ARPHRD_IEEE80211_PRISM: + return "ieee802.11/prism" + case syscall.ARPHRD_IEEE80211_RADIOTAP: + return "ieee802.11/radiotap" + case syscall.ARPHRD_IEEE802154: + return "ieee802.15.4" + + case 65534: + return "none" + case 65535: + return "void" + } + return fmt.Sprintf("unknown%d", msg.Type) +} + +func rtaAlignOf(attrlen int) int { + return (attrlen + syscall.RTA_ALIGNTO - 1) & ^(syscall.RTA_ALIGNTO - 1) +} + +func NewIfInfomsgChild(parent *RtAttr, family int) *IfInfomsg { + msg := NewIfInfomsg(family) + parent.children = append(parent.children, msg) + return msg +} + +// Extend RtAttr to handle data and children +type RtAttr struct { + syscall.RtAttr + Data []byte + children []NetlinkRequestData +} + +// Create a new Extended RtAttr object +func NewRtAttr(attrType int, data []byte) *RtAttr { + return &RtAttr{ + RtAttr: syscall.RtAttr{ + Type: uint16(attrType), + }, + children: []NetlinkRequestData{}, + Data: data, + } +} + +// Create a new RtAttr obj anc add it as a child of an existing object +func NewRtAttrChild(parent *RtAttr, attrType int, data []byte) *RtAttr { + attr := NewRtAttr(attrType, data) + parent.children = append(parent.children, attr) + return attr +} + +func (a *RtAttr) Len() int { + if len(a.children) == 0 { + return (syscall.SizeofRtAttr + len(a.Data)) + } + + l := 0 + for _, child := range a.children { + l += rtaAlignOf(child.Len()) + } + l += syscall.SizeofRtAttr + return rtaAlignOf(l + len(a.Data)) +} + +// Serialize the RtAttr into a byte array +// This can't just unsafe.cast because it must iterate through children. +func (a *RtAttr) Serialize() []byte { + native := NativeEndian() + + length := a.Len() + buf := make([]byte, rtaAlignOf(length)) + + next := 4 + if a.Data != nil { + copy(buf[next:], a.Data) + next += rtaAlignOf(len(a.Data)) + } + if len(a.children) > 0 { + for _, child := range a.children { + childBuf := child.Serialize() + copy(buf[next:], childBuf) + next += rtaAlignOf(len(childBuf)) + } + } + + if l := uint16(length); l != 0 { + native.PutUint16(buf[0:2], l) + } + native.PutUint16(buf[2:4], a.Type) + return buf +} + +type NetlinkRequest struct { + syscall.NlMsghdr + Data []NetlinkRequestData + RawData []byte + Sockets map[int]*SocketHandle +} + +// Serialize the Netlink Request into a byte array +func (req *NetlinkRequest) Serialize() []byte { + length := syscall.SizeofNlMsghdr + dataBytes := make([][]byte, len(req.Data)) + for i, data := range req.Data { + dataBytes[i] = data.Serialize() + length = length + len(dataBytes[i]) + } + length += len(req.RawData) + + req.Len = uint32(length) + b := make([]byte, length) + hdr := (*(*[syscall.SizeofNlMsghdr]byte)(unsafe.Pointer(req)))[:] + next := syscall.SizeofNlMsghdr + copy(b[0:next], hdr) + for _, data := range dataBytes { + for _, dataByte := range data { + b[next] = dataByte + next = next + 1 + } + } + // Add the raw data if any + if len(req.RawData) > 0 { + copy(b[next:length], req.RawData) + } + return b +} + +func (req *NetlinkRequest) AddData(data NetlinkRequestData) { + if data != nil { + req.Data = append(req.Data, data) + } +} + +// AddRawData adds raw bytes to the end of the NetlinkRequest object during serialization +func (req *NetlinkRequest) AddRawData(data []byte) { + if data != nil { + req.RawData = append(req.RawData, data...) + } +} + +// Execute the request against a the given sockType. +// Returns a list of netlink messages in serialized format, optionally filtered +// by resType. +func (req *NetlinkRequest) Execute(sockType int, resType uint16) ([][]byte, error) { + var ( + s *NetlinkSocket + err error + ) + + if req.Sockets != nil { + if sh, ok := req.Sockets[sockType]; ok { + s = sh.Socket + req.Seq = atomic.AddUint32(&sh.Seq, 1) + } + } + sharedSocket := s != nil + + if s == nil { + s, err = getNetlinkSocket(sockType) + if err != nil { + return nil, err + } + defer s.Close() + } else { + s.Lock() + defer s.Unlock() + } + + if err := s.Send(req); err != nil { + return nil, err + } + + pid, err := s.GetPid() + if err != nil { + return nil, err + } + + var res [][]byte + +done: + for { + msgs, err := s.Receive() + if err != nil { + return nil, err + } + for _, m := range msgs { + if m.Header.Seq != req.Seq { + if sharedSocket { + continue + } + return nil, fmt.Errorf("Wrong Seq nr %d, expected %d", m.Header.Seq, req.Seq) + } + if m.Header.Pid != pid { + return nil, fmt.Errorf("Wrong pid %d, expected %d", m.Header.Pid, pid) + } + if m.Header.Type == syscall.NLMSG_DONE { + break done + } + if m.Header.Type == syscall.NLMSG_ERROR { + native := NativeEndian() + error := int32(native.Uint32(m.Data[0:4])) + if error == 0 { + break done + } + return nil, syscall.Errno(-error) + } + if resType != 0 && m.Header.Type != resType { + continue + } + res = append(res, m.Data) + if m.Header.Flags&syscall.NLM_F_MULTI == 0 { + break done + } + } + } + return res, nil +} + +// Create a new netlink request from proto and flags +// Note the Len value will be inaccurate once data is added until +// the message is serialized +func NewNetlinkRequest(proto, flags int) *NetlinkRequest { + return &NetlinkRequest{ + NlMsghdr: syscall.NlMsghdr{ + Len: uint32(syscall.SizeofNlMsghdr), + Type: uint16(proto), + Flags: syscall.NLM_F_REQUEST | uint16(flags), + Seq: atomic.AddUint32(&nextSeqNr, 1), + }, + } +} + +type NetlinkSocket struct { + fd int32 + lsa syscall.SockaddrNetlink + sync.Mutex +} + +func getNetlinkSocket(protocol int) (*NetlinkSocket, error) { + fd, err := syscall.Socket(syscall.AF_NETLINK, syscall.SOCK_RAW|syscall.SOCK_CLOEXEC, protocol) + if err != nil { + return nil, err + } + s := &NetlinkSocket{ + fd: int32(fd), + } + s.lsa.Family = syscall.AF_NETLINK + if err := syscall.Bind(fd, &s.lsa); err != nil { + syscall.Close(fd) + return nil, err + } + + return s, nil +} + +// GetNetlinkSocketAt opens a netlink socket in the network namespace newNs +// and positions the thread back into the network namespace specified by curNs, +// when done. If curNs is close, the function derives the current namespace and +// moves back into it when done. If newNs is close, the socket will be opened +// in the current network namespace. +func GetNetlinkSocketAt(newNs, curNs netns.NsHandle, protocol int) (*NetlinkSocket, error) { + c, err := executeInNetns(newNs, curNs) + if err != nil { + return nil, err + } + defer c() + return getNetlinkSocket(protocol) +} + +// executeInNetns sets execution of the code following this call to the +// network namespace newNs, then moves the thread back to curNs if open, +// otherwise to the current netns at the time the function was invoked +// In case of success, the caller is expected to execute the returned function +// at the end of the code that needs to be executed in the network namespace. +// Example: +// func jobAt(...) error { +// d, err := executeInNetns(...) +// if err != nil { return err} +// defer d() +// < code which needs to be executed in specific netns> +// } +// TODO: his function probably belongs to netns pkg. +func executeInNetns(newNs, curNs netns.NsHandle) (func(), error) { + var ( + err error + moveBack func(netns.NsHandle) error + closeNs func() error + unlockThd func() + ) + restore := func() { + // order matters + if moveBack != nil { + moveBack(curNs) + } + if closeNs != nil { + closeNs() + } + if unlockThd != nil { + unlockThd() + } + } + if newNs.IsOpen() { + runtime.LockOSThread() + unlockThd = runtime.UnlockOSThread + if !curNs.IsOpen() { + if curNs, err = netns.Get(); err != nil { + restore() + return nil, fmt.Errorf("could not get current namespace while creating netlink socket: %v", err) + } + closeNs = curNs.Close + } + if err := netns.Set(newNs); err != nil { + restore() + return nil, fmt.Errorf("failed to set into network namespace %d while creating netlink socket: %v", newNs, err) + } + moveBack = netns.Set + } + return restore, nil +} + +// Create a netlink socket with a given protocol (e.g. NETLINK_ROUTE) +// and subscribe it to multicast groups passed in variable argument list. +// Returns the netlink socket on which Receive() method can be called +// to retrieve the messages from the kernel. +func Subscribe(protocol int, groups ...uint) (*NetlinkSocket, error) { + fd, err := syscall.Socket(syscall.AF_NETLINK, syscall.SOCK_RAW, protocol) + if err != nil { + return nil, err + } + s := &NetlinkSocket{ + fd: int32(fd), + } + s.lsa.Family = syscall.AF_NETLINK + + for _, g := range groups { + s.lsa.Groups |= (1 << (g - 1)) + } + + if err := syscall.Bind(fd, &s.lsa); err != nil { + syscall.Close(fd) + return nil, err + } + + return s, nil +} + +// SubscribeAt works like Subscribe plus let's the caller choose the network +// namespace in which the socket would be opened (newNs). Then control goes back +// to curNs if open, otherwise to the netns at the time this function was called. +func SubscribeAt(newNs, curNs netns.NsHandle, protocol int, groups ...uint) (*NetlinkSocket, error) { + c, err := executeInNetns(newNs, curNs) + if err != nil { + return nil, err + } + defer c() + return Subscribe(protocol, groups...) +} + +func (s *NetlinkSocket) Close() { + fd := int(atomic.SwapInt32(&s.fd, -1)) + syscall.Close(fd) +} + +func (s *NetlinkSocket) GetFd() int { + return int(atomic.LoadInt32(&s.fd)) +} + +func (s *NetlinkSocket) Send(request *NetlinkRequest) error { + fd := int(atomic.LoadInt32(&s.fd)) + if fd < 0 { + return fmt.Errorf("Send called on a closed socket") + } + if err := syscall.Sendto(fd, request.Serialize(), 0, &s.lsa); err != nil { + return err + } + return nil +} + +func (s *NetlinkSocket) Receive() ([]syscall.NetlinkMessage, error) { + fd := int(atomic.LoadInt32(&s.fd)) + if fd < 0 { + return nil, fmt.Errorf("Receive called on a closed socket") + } + rb := make([]byte, syscall.Getpagesize()) + nr, _, err := syscall.Recvfrom(fd, rb, 0) + if err != nil { + return nil, err + } + if nr < syscall.NLMSG_HDRLEN { + return nil, fmt.Errorf("Got short response from netlink") + } + rb = rb[:nr] + return syscall.ParseNetlinkMessage(rb) +} + +func (s *NetlinkSocket) GetPid() (uint32, error) { + fd := int(atomic.LoadInt32(&s.fd)) + lsa, err := syscall.Getsockname(fd) + if err != nil { + return 0, err + } + switch v := lsa.(type) { + case *syscall.SockaddrNetlink: + return v.Pid, nil + } + return 0, fmt.Errorf("Wrong socket type") +} + +func ZeroTerminated(s string) []byte { + bytes := make([]byte, len(s)+1) + for i := 0; i < len(s); i++ { + bytes[i] = s[i] + } + bytes[len(s)] = 0 + return bytes +} + +func NonZeroTerminated(s string) []byte { + bytes := make([]byte, len(s)) + for i := 0; i < len(s); i++ { + bytes[i] = s[i] + } + return bytes +} + +func BytesToString(b []byte) string { + n := bytes.Index(b, []byte{0}) + return string(b[:n]) +} + +func Uint8Attr(v uint8) []byte { + return []byte{byte(v)} +} + +func Uint16Attr(v uint16) []byte { + native := NativeEndian() + bytes := make([]byte, 2) + native.PutUint16(bytes, v) + return bytes +} + +func Uint32Attr(v uint32) []byte { + native := NativeEndian() + bytes := make([]byte, 4) + native.PutUint32(bytes, v) + return bytes +} + +func Uint64Attr(v uint64) []byte { + native := NativeEndian() + bytes := make([]byte, 8) + native.PutUint64(bytes, v) + return bytes +} + +func ParseRouteAttr(b []byte) ([]syscall.NetlinkRouteAttr, error) { + var attrs []syscall.NetlinkRouteAttr + for len(b) >= syscall.SizeofRtAttr { + a, vbuf, alen, err := netlinkRouteAttrAndValue(b) + if err != nil { + return nil, err + } + ra := syscall.NetlinkRouteAttr{Attr: *a, Value: vbuf[:int(a.Len)-syscall.SizeofRtAttr]} + attrs = append(attrs, ra) + b = b[alen:] + } + return attrs, nil +} + +func netlinkRouteAttrAndValue(b []byte) (*syscall.RtAttr, []byte, int, error) { + a := (*syscall.RtAttr)(unsafe.Pointer(&b[0])) + if int(a.Len) < syscall.SizeofRtAttr || int(a.Len) > len(b) { + return nil, nil, 0, syscall.EINVAL + } + return a, b[syscall.SizeofRtAttr:], rtaAlignOf(int(a.Len)), nil +} + +// SocketHandle contains the netlink socket and the associated +// sequence counter for a specific netlink family +type SocketHandle struct { + Seq uint32 + Socket *NetlinkSocket +} + +// Close closes the netlink socket +func (sh *SocketHandle) Close() { + if sh.Socket != nil { + sh.Socket.Close() + } +} diff --git a/vendor/github.com/vishvananda/netlink/nl/nl_unspecified.go b/vendor/github.com/vishvananda/netlink/nl/nl_unspecified.go new file mode 100644 index 00000000..dfc0be66 --- /dev/null +++ b/vendor/github.com/vishvananda/netlink/nl/nl_unspecified.go @@ -0,0 +1,11 @@ +// +build !linux + +package nl + +import "encoding/binary" + +var SupportedNlFamilies = []int{} + +func NativeEndian() binary.ByteOrder { + return nil +} diff --git a/vendor/github.com/vishvananda/netlink/nl/route_linux.go b/vendor/github.com/vishvananda/netlink/nl/route_linux.go new file mode 100644 index 00000000..1a064d65 --- /dev/null +++ b/vendor/github.com/vishvananda/netlink/nl/route_linux.go @@ -0,0 +1,80 @@ +package nl + +import ( + "syscall" + "unsafe" +) + +type RtMsg struct { + syscall.RtMsg +} + +func NewRtMsg() *RtMsg { + return &RtMsg{ + RtMsg: syscall.RtMsg{ + Table: syscall.RT_TABLE_MAIN, + Scope: syscall.RT_SCOPE_UNIVERSE, + Protocol: syscall.RTPROT_BOOT, + Type: syscall.RTN_UNICAST, + }, + } +} + +func NewRtDelMsg() *RtMsg { + return &RtMsg{ + RtMsg: syscall.RtMsg{ + Table: syscall.RT_TABLE_MAIN, + Scope: syscall.RT_SCOPE_NOWHERE, + }, + } +} + +func (msg *RtMsg) Len() int { + return syscall.SizeofRtMsg +} + +func DeserializeRtMsg(b []byte) *RtMsg { + return (*RtMsg)(unsafe.Pointer(&b[0:syscall.SizeofRtMsg][0])) +} + +func (msg *RtMsg) Serialize() []byte { + return (*(*[syscall.SizeofRtMsg]byte)(unsafe.Pointer(msg)))[:] +} + +type RtNexthop struct { + syscall.RtNexthop + Children []NetlinkRequestData +} + +func DeserializeRtNexthop(b []byte) *RtNexthop { + return (*RtNexthop)(unsafe.Pointer(&b[0:syscall.SizeofRtNexthop][0])) +} + +func (msg *RtNexthop) Len() int { + if len(msg.Children) == 0 { + return syscall.SizeofRtNexthop + } + + l := 0 + for _, child := range msg.Children { + l += rtaAlignOf(child.Len()) + } + l += syscall.SizeofRtNexthop + return rtaAlignOf(l) +} + +func (msg *RtNexthop) Serialize() []byte { + length := msg.Len() + msg.RtNexthop.Len = uint16(length) + buf := make([]byte, length) + copy(buf, (*(*[syscall.SizeofRtNexthop]byte)(unsafe.Pointer(msg)))[:]) + next := rtaAlignOf(syscall.SizeofRtNexthop) + if len(msg.Children) > 0 { + for _, child := range msg.Children { + childBuf := child.Serialize() + copy(buf[next:], childBuf) + next += rtaAlignOf(len(childBuf)) + } + } + return buf +} diff --git a/vendor/github.com/vishvananda/netlink/nl/syscall.go b/vendor/github.com/vishvananda/netlink/nl/syscall.go new file mode 100644 index 00000000..3473e536 --- /dev/null +++ b/vendor/github.com/vishvananda/netlink/nl/syscall.go @@ -0,0 +1,68 @@ +package nl + +// syscall package lack of rule atributes type. +// Thus there are defined below +const ( + FRA_UNSPEC = iota + FRA_DST /* destination address */ + FRA_SRC /* source address */ + FRA_IIFNAME /* interface name */ + FRA_GOTO /* target to jump to (FR_ACT_GOTO) */ + FRA_UNUSED2 + FRA_PRIORITY /* priority/preference */ + FRA_UNUSED3 + FRA_UNUSED4 + FRA_UNUSED5 + FRA_FWMARK /* mark */ + FRA_FLOW /* flow/class id */ + FRA_TUN_ID + FRA_SUPPRESS_IFGROUP + FRA_SUPPRESS_PREFIXLEN + FRA_TABLE /* Extended table id */ + FRA_FWMASK /* mask for netfilter mark */ + FRA_OIFNAME +) + +// ip rule netlink request types +const ( + FR_ACT_UNSPEC = iota + FR_ACT_TO_TBL /* Pass to fixed table */ + FR_ACT_GOTO /* Jump to another rule */ + FR_ACT_NOP /* No operation */ + FR_ACT_RES3 + FR_ACT_RES4 + FR_ACT_BLACKHOLE /* Drop without notification */ + FR_ACT_UNREACHABLE /* Drop with ENETUNREACH */ + FR_ACT_PROHIBIT /* Drop with EACCES */ +) + +// socket diags related +const ( + SOCK_DIAG_BY_FAMILY = 20 /* linux.sock_diag.h */ + TCPDIAG_NOCOOKIE = 0xFFFFFFFF /* TCPDIAG_NOCOOKIE in net/ipv4/tcp_diag.h*/ +) + +const ( + AF_MPLS = 28 +) + +const ( + RTA_NEWDST = 0x13 + RTA_ENCAP_TYPE = 0x15 + RTA_ENCAP = 0x16 +) + +// RTA_ENCAP subtype +const ( + MPLS_IPTUNNEL_UNSPEC = iota + MPLS_IPTUNNEL_DST +) + +// light weight tunnel encap types +const ( + LWTUNNEL_ENCAP_NONE = iota + LWTUNNEL_ENCAP_MPLS + LWTUNNEL_ENCAP_IP + LWTUNNEL_ENCAP_ILA + LWTUNNEL_ENCAP_IP6 +) diff --git a/vendor/github.com/vishvananda/netlink/nl/tc_linux.go b/vendor/github.com/vishvananda/netlink/nl/tc_linux.go new file mode 100644 index 00000000..e91fb21c --- /dev/null +++ b/vendor/github.com/vishvananda/netlink/nl/tc_linux.go @@ -0,0 +1,675 @@ +package nl + +import ( + "unsafe" +) + +// LinkLayer +const ( + LINKLAYER_UNSPEC = iota + LINKLAYER_ETHERNET + LINKLAYER_ATM +) + +// ATM +const ( + ATM_CELL_PAYLOAD = 48 + ATM_CELL_SIZE = 53 +) + +const TC_LINKLAYER_MASK = 0x0F + +// Police +const ( + TCA_POLICE_UNSPEC = iota + TCA_POLICE_TBF + TCA_POLICE_RATE + TCA_POLICE_PEAKRATE + TCA_POLICE_AVRATE + TCA_POLICE_RESULT + TCA_POLICE_MAX = TCA_POLICE_RESULT +) + +// Message types +const ( + TCA_UNSPEC = iota + TCA_KIND + TCA_OPTIONS + TCA_STATS + TCA_XSTATS + TCA_RATE + TCA_FCNT + TCA_STATS2 + TCA_STAB + TCA_MAX = TCA_STAB +) + +const ( + TCA_ACT_TAB = 1 + TCAA_MAX = 1 +) + +const ( + TCA_ACT_UNSPEC = iota + TCA_ACT_KIND + TCA_ACT_OPTIONS + TCA_ACT_INDEX + TCA_ACT_STATS + TCA_ACT_MAX +) + +const ( + TCA_PRIO_UNSPEC = iota + TCA_PRIO_MQ + TCA_PRIO_MAX = TCA_PRIO_MQ +) + +const ( + SizeofTcMsg = 0x14 + SizeofTcActionMsg = 0x04 + SizeofTcPrioMap = 0x14 + SizeofTcRateSpec = 0x0c + SizeofTcNetemQopt = 0x18 + SizeofTcNetemCorr = 0x0c + SizeofTcNetemReorder = 0x08 + SizeofTcNetemCorrupt = 0x08 + SizeofTcTbfQopt = 2*SizeofTcRateSpec + 0x0c + SizeofTcHtbCopt = 2*SizeofTcRateSpec + 0x14 + SizeofTcHtbGlob = 0x14 + SizeofTcU32Key = 0x10 + SizeofTcU32Sel = 0x10 // without keys + SizeofTcGen = 0x14 + SizeofTcMirred = SizeofTcGen + 0x08 + SizeofTcPolice = 2*SizeofTcRateSpec + 0x20 +) + +// struct tcmsg { +// unsigned char tcm_family; +// unsigned char tcm__pad1; +// unsigned short tcm__pad2; +// int tcm_ifindex; +// __u32 tcm_handle; +// __u32 tcm_parent; +// __u32 tcm_info; +// }; + +type TcMsg struct { + Family uint8 + Pad [3]byte + Ifindex int32 + Handle uint32 + Parent uint32 + Info uint32 +} + +func (msg *TcMsg) Len() int { + return SizeofTcMsg +} + +func DeserializeTcMsg(b []byte) *TcMsg { + return (*TcMsg)(unsafe.Pointer(&b[0:SizeofTcMsg][0])) +} + +func (x *TcMsg) Serialize() []byte { + return (*(*[SizeofTcMsg]byte)(unsafe.Pointer(x)))[:] +} + +// struct tcamsg { +// unsigned char tca_family; +// unsigned char tca__pad1; +// unsigned short tca__pad2; +// }; + +type TcActionMsg struct { + Family uint8 + Pad [3]byte +} + +func (msg *TcActionMsg) Len() int { + return SizeofTcActionMsg +} + +func DeserializeTcActionMsg(b []byte) *TcActionMsg { + return (*TcActionMsg)(unsafe.Pointer(&b[0:SizeofTcActionMsg][0])) +} + +func (x *TcActionMsg) Serialize() []byte { + return (*(*[SizeofTcActionMsg]byte)(unsafe.Pointer(x)))[:] +} + +const ( + TC_PRIO_MAX = 15 +) + +// struct tc_prio_qopt { +// int bands; /* Number of bands */ +// __u8 priomap[TC_PRIO_MAX+1]; /* Map: logical priority -> PRIO band */ +// }; + +type TcPrioMap struct { + Bands int32 + Priomap [TC_PRIO_MAX + 1]uint8 +} + +func (msg *TcPrioMap) Len() int { + return SizeofTcPrioMap +} + +func DeserializeTcPrioMap(b []byte) *TcPrioMap { + return (*TcPrioMap)(unsafe.Pointer(&b[0:SizeofTcPrioMap][0])) +} + +func (x *TcPrioMap) Serialize() []byte { + return (*(*[SizeofTcPrioMap]byte)(unsafe.Pointer(x)))[:] +} + +const ( + TCA_TBF_UNSPEC = iota + TCA_TBF_PARMS + TCA_TBF_RTAB + TCA_TBF_PTAB + TCA_TBF_RATE64 + TCA_TBF_PRATE64 + TCA_TBF_BURST + TCA_TBF_PBURST + TCA_TBF_MAX = TCA_TBF_PBURST +) + +// struct tc_ratespec { +// unsigned char cell_log; +// __u8 linklayer; /* lower 4 bits */ +// unsigned short overhead; +// short cell_align; +// unsigned short mpu; +// __u32 rate; +// }; + +type TcRateSpec struct { + CellLog uint8 + Linklayer uint8 + Overhead uint16 + CellAlign int16 + Mpu uint16 + Rate uint32 +} + +func (msg *TcRateSpec) Len() int { + return SizeofTcRateSpec +} + +func DeserializeTcRateSpec(b []byte) *TcRateSpec { + return (*TcRateSpec)(unsafe.Pointer(&b[0:SizeofTcRateSpec][0])) +} + +func (x *TcRateSpec) Serialize() []byte { + return (*(*[SizeofTcRateSpec]byte)(unsafe.Pointer(x)))[:] +} + +/** +* NETEM + */ + +const ( + TCA_NETEM_UNSPEC = iota + TCA_NETEM_CORR + TCA_NETEM_DELAY_DIST + TCA_NETEM_REORDER + TCA_NETEM_CORRUPT + TCA_NETEM_LOSS + TCA_NETEM_RATE + TCA_NETEM_ECN + TCA_NETEM_RATE64 + TCA_NETEM_MAX = TCA_NETEM_RATE64 +) + +// struct tc_netem_qopt { +// __u32 latency; /* added delay (us) */ +// __u32 limit; /* fifo limit (packets) */ +// __u32 loss; /* random packet loss (0=none ~0=100%) */ +// __u32 gap; /* re-ordering gap (0 for none) */ +// __u32 duplicate; /* random packet dup (0=none ~0=100%) */ +// __u32 jitter; /* random jitter in latency (us) */ +// }; + +type TcNetemQopt struct { + Latency uint32 + Limit uint32 + Loss uint32 + Gap uint32 + Duplicate uint32 + Jitter uint32 +} + +func (msg *TcNetemQopt) Len() int { + return SizeofTcNetemQopt +} + +func DeserializeTcNetemQopt(b []byte) *TcNetemQopt { + return (*TcNetemQopt)(unsafe.Pointer(&b[0:SizeofTcNetemQopt][0])) +} + +func (x *TcNetemQopt) Serialize() []byte { + return (*(*[SizeofTcNetemQopt]byte)(unsafe.Pointer(x)))[:] +} + +// struct tc_netem_corr { +// __u32 delay_corr; /* delay correlation */ +// __u32 loss_corr; /* packet loss correlation */ +// __u32 dup_corr; /* duplicate correlation */ +// }; + +type TcNetemCorr struct { + DelayCorr uint32 + LossCorr uint32 + DupCorr uint32 +} + +func (msg *TcNetemCorr) Len() int { + return SizeofTcNetemCorr +} + +func DeserializeTcNetemCorr(b []byte) *TcNetemCorr { + return (*TcNetemCorr)(unsafe.Pointer(&b[0:SizeofTcNetemCorr][0])) +} + +func (x *TcNetemCorr) Serialize() []byte { + return (*(*[SizeofTcNetemCorr]byte)(unsafe.Pointer(x)))[:] +} + +// struct tc_netem_reorder { +// __u32 probability; +// __u32 correlation; +// }; + +type TcNetemReorder struct { + Probability uint32 + Correlation uint32 +} + +func (msg *TcNetemReorder) Len() int { + return SizeofTcNetemReorder +} + +func DeserializeTcNetemReorder(b []byte) *TcNetemReorder { + return (*TcNetemReorder)(unsafe.Pointer(&b[0:SizeofTcNetemReorder][0])) +} + +func (x *TcNetemReorder) Serialize() []byte { + return (*(*[SizeofTcNetemReorder]byte)(unsafe.Pointer(x)))[:] +} + +// struct tc_netem_corrupt { +// __u32 probability; +// __u32 correlation; +// }; + +type TcNetemCorrupt struct { + Probability uint32 + Correlation uint32 +} + +func (msg *TcNetemCorrupt) Len() int { + return SizeofTcNetemCorrupt +} + +func DeserializeTcNetemCorrupt(b []byte) *TcNetemCorrupt { + return (*TcNetemCorrupt)(unsafe.Pointer(&b[0:SizeofTcNetemCorrupt][0])) +} + +func (x *TcNetemCorrupt) Serialize() []byte { + return (*(*[SizeofTcNetemCorrupt]byte)(unsafe.Pointer(x)))[:] +} + +// struct tc_tbf_qopt { +// struct tc_ratespec rate; +// struct tc_ratespec peakrate; +// __u32 limit; +// __u32 buffer; +// __u32 mtu; +// }; + +type TcTbfQopt struct { + Rate TcRateSpec + Peakrate TcRateSpec + Limit uint32 + Buffer uint32 + Mtu uint32 +} + +func (msg *TcTbfQopt) Len() int { + return SizeofTcTbfQopt +} + +func DeserializeTcTbfQopt(b []byte) *TcTbfQopt { + return (*TcTbfQopt)(unsafe.Pointer(&b[0:SizeofTcTbfQopt][0])) +} + +func (x *TcTbfQopt) Serialize() []byte { + return (*(*[SizeofTcTbfQopt]byte)(unsafe.Pointer(x)))[:] +} + +const ( + TCA_HTB_UNSPEC = iota + TCA_HTB_PARMS + TCA_HTB_INIT + TCA_HTB_CTAB + TCA_HTB_RTAB + TCA_HTB_DIRECT_QLEN + TCA_HTB_RATE64 + TCA_HTB_CEIL64 + TCA_HTB_MAX = TCA_HTB_CEIL64 +) + +//struct tc_htb_opt { +// struct tc_ratespec rate; +// struct tc_ratespec ceil; +// __u32 buffer; +// __u32 cbuffer; +// __u32 quantum; +// __u32 level; /* out only */ +// __u32 prio; +//}; + +type TcHtbCopt struct { + Rate TcRateSpec + Ceil TcRateSpec + Buffer uint32 + Cbuffer uint32 + Quantum uint32 + Level uint32 + Prio uint32 +} + +func (msg *TcHtbCopt) Len() int { + return SizeofTcHtbCopt +} + +func DeserializeTcHtbCopt(b []byte) *TcHtbCopt { + return (*TcHtbCopt)(unsafe.Pointer(&b[0:SizeofTcHtbCopt][0])) +} + +func (x *TcHtbCopt) Serialize() []byte { + return (*(*[SizeofTcHtbCopt]byte)(unsafe.Pointer(x)))[:] +} + +type TcHtbGlob struct { + Version uint32 + Rate2Quantum uint32 + Defcls uint32 + Debug uint32 + DirectPkts uint32 +} + +func (msg *TcHtbGlob) Len() int { + return SizeofTcHtbGlob +} + +func DeserializeTcHtbGlob(b []byte) *TcHtbGlob { + return (*TcHtbGlob)(unsafe.Pointer(&b[0:SizeofTcHtbGlob][0])) +} + +func (x *TcHtbGlob) Serialize() []byte { + return (*(*[SizeofTcHtbGlob]byte)(unsafe.Pointer(x)))[:] +} + +const ( + TCA_U32_UNSPEC = iota + TCA_U32_CLASSID + TCA_U32_HASH + TCA_U32_LINK + TCA_U32_DIVISOR + TCA_U32_SEL + TCA_U32_POLICE + TCA_U32_ACT + TCA_U32_INDEV + TCA_U32_PCNT + TCA_U32_MARK + TCA_U32_MAX = TCA_U32_MARK +) + +// struct tc_u32_key { +// __be32 mask; +// __be32 val; +// int off; +// int offmask; +// }; + +type TcU32Key struct { + Mask uint32 // big endian + Val uint32 // big endian + Off int32 + OffMask int32 +} + +func (msg *TcU32Key) Len() int { + return SizeofTcU32Key +} + +func DeserializeTcU32Key(b []byte) *TcU32Key { + return (*TcU32Key)(unsafe.Pointer(&b[0:SizeofTcU32Key][0])) +} + +func (x *TcU32Key) Serialize() []byte { + return (*(*[SizeofTcU32Key]byte)(unsafe.Pointer(x)))[:] +} + +// struct tc_u32_sel { +// unsigned char flags; +// unsigned char offshift; +// unsigned char nkeys; +// +// __be16 offmask; +// __u16 off; +// short offoff; +// +// short hoff; +// __be32 hmask; +// struct tc_u32_key keys[0]; +// }; + +const ( + TC_U32_TERMINAL = 1 << iota + TC_U32_OFFSET = 1 << iota + TC_U32_VAROFFSET = 1 << iota + TC_U32_EAT = 1 << iota +) + +type TcU32Sel struct { + Flags uint8 + Offshift uint8 + Nkeys uint8 + Pad uint8 + Offmask uint16 // big endian + Off uint16 + Offoff int16 + Hoff int16 + Hmask uint32 // big endian + Keys []TcU32Key +} + +func (msg *TcU32Sel) Len() int { + return SizeofTcU32Sel + int(msg.Nkeys)*SizeofTcU32Key +} + +func DeserializeTcU32Sel(b []byte) *TcU32Sel { + x := &TcU32Sel{} + copy((*(*[SizeofTcU32Sel]byte)(unsafe.Pointer(x)))[:], b) + next := SizeofTcU32Sel + var i uint8 + for i = 0; i < x.Nkeys; i++ { + x.Keys = append(x.Keys, *DeserializeTcU32Key(b[next:])) + next += SizeofTcU32Key + } + return x +} + +func (x *TcU32Sel) Serialize() []byte { + // This can't just unsafe.cast because it must iterate through keys. + buf := make([]byte, x.Len()) + copy(buf, (*(*[SizeofTcU32Sel]byte)(unsafe.Pointer(x)))[:]) + next := SizeofTcU32Sel + for _, key := range x.Keys { + keyBuf := key.Serialize() + copy(buf[next:], keyBuf) + next += SizeofTcU32Key + } + return buf +} + +type TcGen struct { + Index uint32 + Capab uint32 + Action int32 + Refcnt int32 + Bindcnt int32 +} + +func (msg *TcGen) Len() int { + return SizeofTcGen +} + +func DeserializeTcGen(b []byte) *TcGen { + return (*TcGen)(unsafe.Pointer(&b[0:SizeofTcGen][0])) +} + +func (x *TcGen) Serialize() []byte { + return (*(*[SizeofTcGen]byte)(unsafe.Pointer(x)))[:] +} + +// #define tc_gen \ +// __u32 index; \ +// __u32 capab; \ +// int action; \ +// int refcnt; \ +// int bindcnt + +const ( + TCA_ACT_GACT = 5 +) + +const ( + TCA_GACT_UNSPEC = iota + TCA_GACT_TM + TCA_GACT_PARMS + TCA_GACT_PROB + TCA_GACT_MAX = TCA_GACT_PROB +) + +type TcGact TcGen + +const ( + TCA_ACT_BPF = 13 +) + +const ( + TCA_ACT_BPF_UNSPEC = iota + TCA_ACT_BPF_TM + TCA_ACT_BPF_PARMS + TCA_ACT_BPF_OPS_LEN + TCA_ACT_BPF_OPS + TCA_ACT_BPF_FD + TCA_ACT_BPF_NAME + TCA_ACT_BPF_MAX = TCA_ACT_BPF_NAME +) + +const ( + TCA_BPF_FLAG_ACT_DIRECT uint32 = 1 << iota +) + +const ( + TCA_BPF_UNSPEC = iota + TCA_BPF_ACT + TCA_BPF_POLICE + TCA_BPF_CLASSID + TCA_BPF_OPS_LEN + TCA_BPF_OPS + TCA_BPF_FD + TCA_BPF_NAME + TCA_BPF_FLAGS + TCA_BPF_MAX = TCA_BPF_FLAGS +) + +type TcBpf TcGen + +const ( + TCA_ACT_MIRRED = 8 +) + +const ( + TCA_MIRRED_UNSPEC = iota + TCA_MIRRED_TM + TCA_MIRRED_PARMS + TCA_MIRRED_MAX = TCA_MIRRED_PARMS +) + +// struct tc_mirred { +// tc_gen; +// int eaction; /* one of IN/EGRESS_MIRROR/REDIR */ +// __u32 ifindex; /* ifindex of egress port */ +// }; + +type TcMirred struct { + TcGen + Eaction int32 + Ifindex uint32 +} + +func (msg *TcMirred) Len() int { + return SizeofTcMirred +} + +func DeserializeTcMirred(b []byte) *TcMirred { + return (*TcMirred)(unsafe.Pointer(&b[0:SizeofTcMirred][0])) +} + +func (x *TcMirred) Serialize() []byte { + return (*(*[SizeofTcMirred]byte)(unsafe.Pointer(x)))[:] +} + +// struct tc_police { +// __u32 index; +// int action; +// __u32 limit; +// __u32 burst; +// __u32 mtu; +// struct tc_ratespec rate; +// struct tc_ratespec peakrate; +// int refcnt; +// int bindcnt; +// __u32 capab; +// }; + +type TcPolice struct { + Index uint32 + Action int32 + Limit uint32 + Burst uint32 + Mtu uint32 + Rate TcRateSpec + PeakRate TcRateSpec + Refcnt int32 + Bindcnt int32 + Capab uint32 +} + +func (msg *TcPolice) Len() int { + return SizeofTcPolice +} + +func DeserializeTcPolice(b []byte) *TcPolice { + return (*TcPolice)(unsafe.Pointer(&b[0:SizeofTcPolice][0])) +} + +func (x *TcPolice) Serialize() []byte { + return (*(*[SizeofTcPolice]byte)(unsafe.Pointer(x)))[:] +} + +const ( + TCA_FW_UNSPEC = iota + TCA_FW_CLASSID + TCA_FW_POLICE + TCA_FW_INDEV + TCA_FW_ACT + TCA_FW_MASK + TCA_FW_MAX = TCA_FW_MASK +) diff --git a/vendor/github.com/vishvananda/netlink/nl/xfrm_linux.go b/vendor/github.com/vishvananda/netlink/nl/xfrm_linux.go new file mode 100644 index 00000000..09a2ffa1 --- /dev/null +++ b/vendor/github.com/vishvananda/netlink/nl/xfrm_linux.go @@ -0,0 +1,296 @@ +package nl + +import ( + "bytes" + "net" + "unsafe" +) + +// Infinity for packet and byte counts +const ( + XFRM_INF = ^uint64(0) +) + +type XfrmMsgType uint8 + +type XfrmMsg interface { + Type() XfrmMsgType +} + +// Message Types +const ( + XFRM_MSG_BASE XfrmMsgType = 0x10 + XFRM_MSG_NEWSA = 0x10 + XFRM_MSG_DELSA = 0x11 + XFRM_MSG_GETSA = 0x12 + XFRM_MSG_NEWPOLICY = 0x13 + XFRM_MSG_DELPOLICY = 0x14 + XFRM_MSG_GETPOLICY = 0x15 + XFRM_MSG_ALLOCSPI = 0x16 + XFRM_MSG_ACQUIRE = 0x17 + XFRM_MSG_EXPIRE = 0x18 + XFRM_MSG_UPDPOLICY = 0x19 + XFRM_MSG_UPDSA = 0x1a + XFRM_MSG_POLEXPIRE = 0x1b + XFRM_MSG_FLUSHSA = 0x1c + XFRM_MSG_FLUSHPOLICY = 0x1d + XFRM_MSG_NEWAE = 0x1e + XFRM_MSG_GETAE = 0x1f + XFRM_MSG_REPORT = 0x20 + XFRM_MSG_MIGRATE = 0x21 + XFRM_MSG_NEWSADINFO = 0x22 + XFRM_MSG_GETSADINFO = 0x23 + XFRM_MSG_NEWSPDINFO = 0x24 + XFRM_MSG_GETSPDINFO = 0x25 + XFRM_MSG_MAPPING = 0x26 + XFRM_MSG_MAX = 0x26 + XFRM_NR_MSGTYPES = 0x17 +) + +// Attribute types +const ( + /* Netlink message attributes. */ + XFRMA_UNSPEC = 0x00 + XFRMA_ALG_AUTH = 0x01 /* struct xfrm_algo */ + XFRMA_ALG_CRYPT = 0x02 /* struct xfrm_algo */ + XFRMA_ALG_COMP = 0x03 /* struct xfrm_algo */ + XFRMA_ENCAP = 0x04 /* struct xfrm_algo + struct xfrm_encap_tmpl */ + XFRMA_TMPL = 0x05 /* 1 or more struct xfrm_user_tmpl */ + XFRMA_SA = 0x06 /* struct xfrm_usersa_info */ + XFRMA_POLICY = 0x07 /* struct xfrm_userpolicy_info */ + XFRMA_SEC_CTX = 0x08 /* struct xfrm_sec_ctx */ + XFRMA_LTIME_VAL = 0x09 + XFRMA_REPLAY_VAL = 0x0a + XFRMA_REPLAY_THRESH = 0x0b + XFRMA_ETIMER_THRESH = 0x0c + XFRMA_SRCADDR = 0x0d /* xfrm_address_t */ + XFRMA_COADDR = 0x0e /* xfrm_address_t */ + XFRMA_LASTUSED = 0x0f /* unsigned long */ + XFRMA_POLICY_TYPE = 0x10 /* struct xfrm_userpolicy_type */ + XFRMA_MIGRATE = 0x11 + XFRMA_ALG_AEAD = 0x12 /* struct xfrm_algo_aead */ + XFRMA_KMADDRESS = 0x13 /* struct xfrm_user_kmaddress */ + XFRMA_ALG_AUTH_TRUNC = 0x14 /* struct xfrm_algo_auth */ + XFRMA_MARK = 0x15 /* struct xfrm_mark */ + XFRMA_TFCPAD = 0x16 /* __u32 */ + XFRMA_REPLAY_ESN_VAL = 0x17 /* struct xfrm_replay_esn */ + XFRMA_SA_EXTRA_FLAGS = 0x18 /* __u32 */ + XFRMA_MAX = 0x18 +) + +const ( + SizeofXfrmAddress = 0x10 + SizeofXfrmSelector = 0x38 + SizeofXfrmLifetimeCfg = 0x40 + SizeofXfrmLifetimeCur = 0x20 + SizeofXfrmId = 0x18 + SizeofXfrmMark = 0x08 +) + +// Netlink groups +const ( + XFRMNLGRP_NONE = 0x0 + XFRMNLGRP_ACQUIRE = 0x1 + XFRMNLGRP_EXPIRE = 0x2 + XFRMNLGRP_SA = 0x3 + XFRMNLGRP_POLICY = 0x4 + XFRMNLGRP_AEVENTS = 0x5 + XFRMNLGRP_REPORT = 0x6 + XFRMNLGRP_MIGRATE = 0x7 + XFRMNLGRP_MAPPING = 0x8 + __XFRMNLGRP_MAX = 0x9 +) + +// typedef union { +// __be32 a4; +// __be32 a6[4]; +// } xfrm_address_t; + +type XfrmAddress [SizeofXfrmAddress]byte + +func (x *XfrmAddress) ToIP() net.IP { + var empty = [12]byte{} + ip := make(net.IP, net.IPv6len) + if bytes.Equal(x[4:16], empty[:]) { + ip[10] = 0xff + ip[11] = 0xff + copy(ip[12:16], x[0:4]) + } else { + copy(ip[:], x[:]) + } + return ip +} + +func (x *XfrmAddress) ToIPNet(prefixlen uint8) *net.IPNet { + ip := x.ToIP() + if GetIPFamily(ip) == FAMILY_V4 { + return &net.IPNet{IP: ip, Mask: net.CIDRMask(int(prefixlen), 32)} + } + return &net.IPNet{IP: ip, Mask: net.CIDRMask(int(prefixlen), 128)} +} + +func (x *XfrmAddress) FromIP(ip net.IP) { + var empty = [16]byte{} + if len(ip) < net.IPv4len { + copy(x[4:16], empty[:]) + } else if GetIPFamily(ip) == FAMILY_V4 { + copy(x[0:4], ip.To4()[0:4]) + copy(x[4:16], empty[:12]) + } else { + copy(x[0:16], ip.To16()[0:16]) + } +} + +func DeserializeXfrmAddress(b []byte) *XfrmAddress { + return (*XfrmAddress)(unsafe.Pointer(&b[0:SizeofXfrmAddress][0])) +} + +func (x *XfrmAddress) Serialize() []byte { + return (*(*[SizeofXfrmAddress]byte)(unsafe.Pointer(x)))[:] +} + +// struct xfrm_selector { +// xfrm_address_t daddr; +// xfrm_address_t saddr; +// __be16 dport; +// __be16 dport_mask; +// __be16 sport; +// __be16 sport_mask; +// __u16 family; +// __u8 prefixlen_d; +// __u8 prefixlen_s; +// __u8 proto; +// int ifindex; +// __kernel_uid32_t user; +// }; + +type XfrmSelector struct { + Daddr XfrmAddress + Saddr XfrmAddress + Dport uint16 // big endian + DportMask uint16 // big endian + Sport uint16 // big endian + SportMask uint16 // big endian + Family uint16 + PrefixlenD uint8 + PrefixlenS uint8 + Proto uint8 + Pad [3]byte + Ifindex int32 + User uint32 +} + +func (msg *XfrmSelector) Len() int { + return SizeofXfrmSelector +} + +func DeserializeXfrmSelector(b []byte) *XfrmSelector { + return (*XfrmSelector)(unsafe.Pointer(&b[0:SizeofXfrmSelector][0])) +} + +func (msg *XfrmSelector) Serialize() []byte { + return (*(*[SizeofXfrmSelector]byte)(unsafe.Pointer(msg)))[:] +} + +// struct xfrm_lifetime_cfg { +// __u64 soft_byte_limit; +// __u64 hard_byte_limit; +// __u64 soft_packet_limit; +// __u64 hard_packet_limit; +// __u64 soft_add_expires_seconds; +// __u64 hard_add_expires_seconds; +// __u64 soft_use_expires_seconds; +// __u64 hard_use_expires_seconds; +// }; +// + +type XfrmLifetimeCfg struct { + SoftByteLimit uint64 + HardByteLimit uint64 + SoftPacketLimit uint64 + HardPacketLimit uint64 + SoftAddExpiresSeconds uint64 + HardAddExpiresSeconds uint64 + SoftUseExpiresSeconds uint64 + HardUseExpiresSeconds uint64 +} + +func (msg *XfrmLifetimeCfg) Len() int { + return SizeofXfrmLifetimeCfg +} + +func DeserializeXfrmLifetimeCfg(b []byte) *XfrmLifetimeCfg { + return (*XfrmLifetimeCfg)(unsafe.Pointer(&b[0:SizeofXfrmLifetimeCfg][0])) +} + +func (msg *XfrmLifetimeCfg) Serialize() []byte { + return (*(*[SizeofXfrmLifetimeCfg]byte)(unsafe.Pointer(msg)))[:] +} + +// struct xfrm_lifetime_cur { +// __u64 bytes; +// __u64 packets; +// __u64 add_time; +// __u64 use_time; +// }; + +type XfrmLifetimeCur struct { + Bytes uint64 + Packets uint64 + AddTime uint64 + UseTime uint64 +} + +func (msg *XfrmLifetimeCur) Len() int { + return SizeofXfrmLifetimeCur +} + +func DeserializeXfrmLifetimeCur(b []byte) *XfrmLifetimeCur { + return (*XfrmLifetimeCur)(unsafe.Pointer(&b[0:SizeofXfrmLifetimeCur][0])) +} + +func (msg *XfrmLifetimeCur) Serialize() []byte { + return (*(*[SizeofXfrmLifetimeCur]byte)(unsafe.Pointer(msg)))[:] +} + +// struct xfrm_id { +// xfrm_address_t daddr; +// __be32 spi; +// __u8 proto; +// }; + +type XfrmId struct { + Daddr XfrmAddress + Spi uint32 // big endian + Proto uint8 + Pad [3]byte +} + +func (msg *XfrmId) Len() int { + return SizeofXfrmId +} + +func DeserializeXfrmId(b []byte) *XfrmId { + return (*XfrmId)(unsafe.Pointer(&b[0:SizeofXfrmId][0])) +} + +func (msg *XfrmId) Serialize() []byte { + return (*(*[SizeofXfrmId]byte)(unsafe.Pointer(msg)))[:] +} + +type XfrmMark struct { + Value uint32 + Mask uint32 +} + +func (msg *XfrmMark) Len() int { + return SizeofXfrmMark +} + +func DeserializeXfrmMark(b []byte) *XfrmMark { + return (*XfrmMark)(unsafe.Pointer(&b[0:SizeofXfrmMark][0])) +} + +func (msg *XfrmMark) Serialize() []byte { + return (*(*[SizeofXfrmMark]byte)(unsafe.Pointer(msg)))[:] +} diff --git a/vendor/github.com/vishvananda/netlink/nl/xfrm_monitor_linux.go b/vendor/github.com/vishvananda/netlink/nl/xfrm_monitor_linux.go new file mode 100644 index 00000000..715df4cc --- /dev/null +++ b/vendor/github.com/vishvananda/netlink/nl/xfrm_monitor_linux.go @@ -0,0 +1,32 @@ +package nl + +import ( + "unsafe" +) + +const ( + SizeofXfrmUserExpire = 0xe8 +) + +// struct xfrm_user_expire { +// struct xfrm_usersa_info state; +// __u8 hard; +// }; + +type XfrmUserExpire struct { + XfrmUsersaInfo XfrmUsersaInfo + Hard uint8 + Pad [7]byte +} + +func (msg *XfrmUserExpire) Len() int { + return SizeofXfrmUserExpire +} + +func DeserializeXfrmUserExpire(b []byte) *XfrmUserExpire { + return (*XfrmUserExpire)(unsafe.Pointer(&b[0:SizeofXfrmUserExpire][0])) +} + +func (msg *XfrmUserExpire) Serialize() []byte { + return (*(*[SizeofXfrmUserExpire]byte)(unsafe.Pointer(msg)))[:] +} diff --git a/vendor/github.com/vishvananda/netlink/nl/xfrm_policy_linux.go b/vendor/github.com/vishvananda/netlink/nl/xfrm_policy_linux.go new file mode 100644 index 00000000..66f7e03d --- /dev/null +++ b/vendor/github.com/vishvananda/netlink/nl/xfrm_policy_linux.go @@ -0,0 +1,119 @@ +package nl + +import ( + "unsafe" +) + +const ( + SizeofXfrmUserpolicyId = 0x40 + SizeofXfrmUserpolicyInfo = 0xa8 + SizeofXfrmUserTmpl = 0x40 +) + +// struct xfrm_userpolicy_id { +// struct xfrm_selector sel; +// __u32 index; +// __u8 dir; +// }; +// + +type XfrmUserpolicyId struct { + Sel XfrmSelector + Index uint32 + Dir uint8 + Pad [3]byte +} + +func (msg *XfrmUserpolicyId) Len() int { + return SizeofXfrmUserpolicyId +} + +func DeserializeXfrmUserpolicyId(b []byte) *XfrmUserpolicyId { + return (*XfrmUserpolicyId)(unsafe.Pointer(&b[0:SizeofXfrmUserpolicyId][0])) +} + +func (msg *XfrmUserpolicyId) Serialize() []byte { + return (*(*[SizeofXfrmUserpolicyId]byte)(unsafe.Pointer(msg)))[:] +} + +// struct xfrm_userpolicy_info { +// struct xfrm_selector sel; +// struct xfrm_lifetime_cfg lft; +// struct xfrm_lifetime_cur curlft; +// __u32 priority; +// __u32 index; +// __u8 dir; +// __u8 action; +// #define XFRM_POLICY_ALLOW 0 +// #define XFRM_POLICY_BLOCK 1 +// __u8 flags; +// #define XFRM_POLICY_LOCALOK 1 /* Allow user to override global policy */ +// /* Automatically expand selector to include matching ICMP payloads. */ +// #define XFRM_POLICY_ICMP 2 +// __u8 share; +// }; + +type XfrmUserpolicyInfo struct { + Sel XfrmSelector + Lft XfrmLifetimeCfg + Curlft XfrmLifetimeCur + Priority uint32 + Index uint32 + Dir uint8 + Action uint8 + Flags uint8 + Share uint8 + Pad [4]byte +} + +func (msg *XfrmUserpolicyInfo) Len() int { + return SizeofXfrmUserpolicyInfo +} + +func DeserializeXfrmUserpolicyInfo(b []byte) *XfrmUserpolicyInfo { + return (*XfrmUserpolicyInfo)(unsafe.Pointer(&b[0:SizeofXfrmUserpolicyInfo][0])) +} + +func (msg *XfrmUserpolicyInfo) Serialize() []byte { + return (*(*[SizeofXfrmUserpolicyInfo]byte)(unsafe.Pointer(msg)))[:] +} + +// struct xfrm_user_tmpl { +// struct xfrm_id id; +// __u16 family; +// xfrm_address_t saddr; +// __u32 reqid; +// __u8 mode; +// __u8 share; +// __u8 optional; +// __u32 aalgos; +// __u32 ealgos; +// __u32 calgos; +// } + +type XfrmUserTmpl struct { + XfrmId XfrmId + Family uint16 + Pad1 [2]byte + Saddr XfrmAddress + Reqid uint32 + Mode uint8 + Share uint8 + Optional uint8 + Pad2 byte + Aalgos uint32 + Ealgos uint32 + Calgos uint32 +} + +func (msg *XfrmUserTmpl) Len() int { + return SizeofXfrmUserTmpl +} + +func DeserializeXfrmUserTmpl(b []byte) *XfrmUserTmpl { + return (*XfrmUserTmpl)(unsafe.Pointer(&b[0:SizeofXfrmUserTmpl][0])) +} + +func (msg *XfrmUserTmpl) Serialize() []byte { + return (*(*[SizeofXfrmUserTmpl]byte)(unsafe.Pointer(msg)))[:] +} diff --git a/vendor/github.com/vishvananda/netlink/nl/xfrm_state_linux.go b/vendor/github.com/vishvananda/netlink/nl/xfrm_state_linux.go new file mode 100644 index 00000000..b6290fd5 --- /dev/null +++ b/vendor/github.com/vishvananda/netlink/nl/xfrm_state_linux.go @@ -0,0 +1,334 @@ +package nl + +import ( + "unsafe" +) + +const ( + SizeofXfrmUsersaId = 0x18 + SizeofXfrmStats = 0x0c + SizeofXfrmUsersaInfo = 0xe0 + SizeofXfrmUserSpiInfo = 0xe8 + SizeofXfrmAlgo = 0x44 + SizeofXfrmAlgoAuth = 0x48 + SizeofXfrmAlgoAEAD = 0x48 + SizeofXfrmEncapTmpl = 0x18 + SizeofXfrmUsersaFlush = 0x8 + SizeofXfrmReplayStateEsn = 0x18 +) + +const ( + XFRM_STATE_NOECN = 1 + XFRM_STATE_DECAP_DSCP = 2 + XFRM_STATE_NOPMTUDISC = 4 + XFRM_STATE_WILDRECV = 8 + XFRM_STATE_ICMP = 16 + XFRM_STATE_AF_UNSPEC = 32 + XFRM_STATE_ALIGN4 = 64 + XFRM_STATE_ESN = 128 +) + +// struct xfrm_usersa_id { +// xfrm_address_t daddr; +// __be32 spi; +// __u16 family; +// __u8 proto; +// }; + +type XfrmUsersaId struct { + Daddr XfrmAddress + Spi uint32 // big endian + Family uint16 + Proto uint8 + Pad byte +} + +func (msg *XfrmUsersaId) Len() int { + return SizeofXfrmUsersaId +} + +func DeserializeXfrmUsersaId(b []byte) *XfrmUsersaId { + return (*XfrmUsersaId)(unsafe.Pointer(&b[0:SizeofXfrmUsersaId][0])) +} + +func (msg *XfrmUsersaId) Serialize() []byte { + return (*(*[SizeofXfrmUsersaId]byte)(unsafe.Pointer(msg)))[:] +} + +// struct xfrm_stats { +// __u32 replay_window; +// __u32 replay; +// __u32 integrity_failed; +// }; + +type XfrmStats struct { + ReplayWindow uint32 + Replay uint32 + IntegrityFailed uint32 +} + +func (msg *XfrmStats) Len() int { + return SizeofXfrmStats +} + +func DeserializeXfrmStats(b []byte) *XfrmStats { + return (*XfrmStats)(unsafe.Pointer(&b[0:SizeofXfrmStats][0])) +} + +func (msg *XfrmStats) Serialize() []byte { + return (*(*[SizeofXfrmStats]byte)(unsafe.Pointer(msg)))[:] +} + +// struct xfrm_usersa_info { +// struct xfrm_selector sel; +// struct xfrm_id id; +// xfrm_address_t saddr; +// struct xfrm_lifetime_cfg lft; +// struct xfrm_lifetime_cur curlft; +// struct xfrm_stats stats; +// __u32 seq; +// __u32 reqid; +// __u16 family; +// __u8 mode; /* XFRM_MODE_xxx */ +// __u8 replay_window; +// __u8 flags; +// #define XFRM_STATE_NOECN 1 +// #define XFRM_STATE_DECAP_DSCP 2 +// #define XFRM_STATE_NOPMTUDISC 4 +// #define XFRM_STATE_WILDRECV 8 +// #define XFRM_STATE_ICMP 16 +// #define XFRM_STATE_AF_UNSPEC 32 +// #define XFRM_STATE_ALIGN4 64 +// #define XFRM_STATE_ESN 128 +// }; +// +// #define XFRM_SA_XFLAG_DONT_ENCAP_DSCP 1 +// + +type XfrmUsersaInfo struct { + Sel XfrmSelector + Id XfrmId + Saddr XfrmAddress + Lft XfrmLifetimeCfg + Curlft XfrmLifetimeCur + Stats XfrmStats + Seq uint32 + Reqid uint32 + Family uint16 + Mode uint8 + ReplayWindow uint8 + Flags uint8 + Pad [7]byte +} + +func (msg *XfrmUsersaInfo) Len() int { + return SizeofXfrmUsersaInfo +} + +func DeserializeXfrmUsersaInfo(b []byte) *XfrmUsersaInfo { + return (*XfrmUsersaInfo)(unsafe.Pointer(&b[0:SizeofXfrmUsersaInfo][0])) +} + +func (msg *XfrmUsersaInfo) Serialize() []byte { + return (*(*[SizeofXfrmUsersaInfo]byte)(unsafe.Pointer(msg)))[:] +} + +// struct xfrm_userspi_info { +// struct xfrm_usersa_info info; +// __u32 min; +// __u32 max; +// }; + +type XfrmUserSpiInfo struct { + XfrmUsersaInfo XfrmUsersaInfo + Min uint32 + Max uint32 +} + +func (msg *XfrmUserSpiInfo) Len() int { + return SizeofXfrmUserSpiInfo +} + +func DeserializeXfrmUserSpiInfo(b []byte) *XfrmUserSpiInfo { + return (*XfrmUserSpiInfo)(unsafe.Pointer(&b[0:SizeofXfrmUserSpiInfo][0])) +} + +func (msg *XfrmUserSpiInfo) Serialize() []byte { + return (*(*[SizeofXfrmUserSpiInfo]byte)(unsafe.Pointer(msg)))[:] +} + +// struct xfrm_algo { +// char alg_name[64]; +// unsigned int alg_key_len; /* in bits */ +// char alg_key[0]; +// }; + +type XfrmAlgo struct { + AlgName [64]byte + AlgKeyLen uint32 + AlgKey []byte +} + +func (msg *XfrmAlgo) Len() int { + return SizeofXfrmAlgo + int(msg.AlgKeyLen/8) +} + +func DeserializeXfrmAlgo(b []byte) *XfrmAlgo { + ret := XfrmAlgo{} + copy(ret.AlgName[:], b[0:64]) + ret.AlgKeyLen = *(*uint32)(unsafe.Pointer(&b[64])) + ret.AlgKey = b[68:ret.Len()] + return &ret +} + +func (msg *XfrmAlgo) Serialize() []byte { + b := make([]byte, msg.Len()) + copy(b[0:64], msg.AlgName[:]) + copy(b[64:68], (*(*[4]byte)(unsafe.Pointer(&msg.AlgKeyLen)))[:]) + copy(b[68:msg.Len()], msg.AlgKey[:]) + return b +} + +// struct xfrm_algo_auth { +// char alg_name[64]; +// unsigned int alg_key_len; /* in bits */ +// unsigned int alg_trunc_len; /* in bits */ +// char alg_key[0]; +// }; + +type XfrmAlgoAuth struct { + AlgName [64]byte + AlgKeyLen uint32 + AlgTruncLen uint32 + AlgKey []byte +} + +func (msg *XfrmAlgoAuth) Len() int { + return SizeofXfrmAlgoAuth + int(msg.AlgKeyLen/8) +} + +func DeserializeXfrmAlgoAuth(b []byte) *XfrmAlgoAuth { + ret := XfrmAlgoAuth{} + copy(ret.AlgName[:], b[0:64]) + ret.AlgKeyLen = *(*uint32)(unsafe.Pointer(&b[64])) + ret.AlgTruncLen = *(*uint32)(unsafe.Pointer(&b[68])) + ret.AlgKey = b[72:ret.Len()] + return &ret +} + +func (msg *XfrmAlgoAuth) Serialize() []byte { + b := make([]byte, msg.Len()) + copy(b[0:64], msg.AlgName[:]) + copy(b[64:68], (*(*[4]byte)(unsafe.Pointer(&msg.AlgKeyLen)))[:]) + copy(b[68:72], (*(*[4]byte)(unsafe.Pointer(&msg.AlgTruncLen)))[:]) + copy(b[72:msg.Len()], msg.AlgKey[:]) + return b +} + +// struct xfrm_algo_aead { +// char alg_name[64]; +// unsigned int alg_key_len; /* in bits */ +// unsigned int alg_icv_len; /* in bits */ +// char alg_key[0]; +// } + +type XfrmAlgoAEAD struct { + AlgName [64]byte + AlgKeyLen uint32 + AlgICVLen uint32 + AlgKey []byte +} + +func (msg *XfrmAlgoAEAD) Len() int { + return SizeofXfrmAlgoAEAD + int(msg.AlgKeyLen/8) +} + +func DeserializeXfrmAlgoAEAD(b []byte) *XfrmAlgoAEAD { + ret := XfrmAlgoAEAD{} + copy(ret.AlgName[:], b[0:64]) + ret.AlgKeyLen = *(*uint32)(unsafe.Pointer(&b[64])) + ret.AlgICVLen = *(*uint32)(unsafe.Pointer(&b[68])) + ret.AlgKey = b[72:ret.Len()] + return &ret +} + +func (msg *XfrmAlgoAEAD) Serialize() []byte { + b := make([]byte, msg.Len()) + copy(b[0:64], msg.AlgName[:]) + copy(b[64:68], (*(*[4]byte)(unsafe.Pointer(&msg.AlgKeyLen)))[:]) + copy(b[68:72], (*(*[4]byte)(unsafe.Pointer(&msg.AlgICVLen)))[:]) + copy(b[72:msg.Len()], msg.AlgKey[:]) + return b +} + +// struct xfrm_encap_tmpl { +// __u16 encap_type; +// __be16 encap_sport; +// __be16 encap_dport; +// xfrm_address_t encap_oa; +// }; + +type XfrmEncapTmpl struct { + EncapType uint16 + EncapSport uint16 // big endian + EncapDport uint16 // big endian + Pad [2]byte + EncapOa XfrmAddress +} + +func (msg *XfrmEncapTmpl) Len() int { + return SizeofXfrmEncapTmpl +} + +func DeserializeXfrmEncapTmpl(b []byte) *XfrmEncapTmpl { + return (*XfrmEncapTmpl)(unsafe.Pointer(&b[0:SizeofXfrmEncapTmpl][0])) +} + +func (msg *XfrmEncapTmpl) Serialize() []byte { + return (*(*[SizeofXfrmEncapTmpl]byte)(unsafe.Pointer(msg)))[:] +} + +// struct xfrm_usersa_flush { +// __u8 proto; +// }; + +type XfrmUsersaFlush struct { + Proto uint8 +} + +func (msg *XfrmUsersaFlush) Len() int { + return SizeofXfrmUsersaFlush +} + +func DeserializeXfrmUsersaFlush(b []byte) *XfrmUsersaFlush { + return (*XfrmUsersaFlush)(unsafe.Pointer(&b[0:SizeofXfrmUsersaFlush][0])) +} + +func (msg *XfrmUsersaFlush) Serialize() []byte { + return (*(*[SizeofXfrmUsersaFlush]byte)(unsafe.Pointer(msg)))[:] +} + +// struct xfrm_replay_state_esn { +// unsigned int bmp_len; +// __u32 oseq; +// __u32 seq; +// __u32 oseq_hi; +// __u32 seq_hi; +// __u32 replay_window; +// __u32 bmp[0]; +// }; + +type XfrmReplayStateEsn struct { + BmpLen uint32 + OSeq uint32 + Seq uint32 + OSeqHi uint32 + SeqHi uint32 + ReplayWindow uint32 + Bmp []uint32 +} + +func (msg *XfrmReplayStateEsn) Serialize() []byte { + // We deliberately do not pass Bmp, as it gets set by the kernel. + return (*(*[SizeofXfrmReplayStateEsn]byte)(unsafe.Pointer(msg)))[:] +} diff --git a/vendor/github.com/vishvananda/netlink/order.go b/vendor/github.com/vishvananda/netlink/order.go new file mode 100644 index 00000000..e28e153a --- /dev/null +++ b/vendor/github.com/vishvananda/netlink/order.go @@ -0,0 +1,32 @@ +package netlink + +import ( + "encoding/binary" + + "github.com/vishvananda/netlink/nl" +) + +var ( + native = nl.NativeEndian() + networkOrder = binary.BigEndian +) + +func htonl(val uint32) []byte { + bytes := make([]byte, 4) + binary.BigEndian.PutUint32(bytes, val) + return bytes +} + +func htons(val uint16) []byte { + bytes := make([]byte, 2) + binary.BigEndian.PutUint16(bytes, val) + return bytes +} + +func ntohl(buf []byte) uint32 { + return binary.BigEndian.Uint32(buf) +} + +func ntohs(buf []byte) uint16 { + return binary.BigEndian.Uint16(buf) +} diff --git a/vendor/github.com/vishvananda/netlink/protinfo.go b/vendor/github.com/vishvananda/netlink/protinfo.go new file mode 100644 index 00000000..0087c443 --- /dev/null +++ b/vendor/github.com/vishvananda/netlink/protinfo.go @@ -0,0 +1,58 @@ +package netlink + +import ( + "strings" +) + +// Protinfo represents bridge flags from netlink. +type Protinfo struct { + Hairpin bool + Guard bool + FastLeave bool + RootBlock bool + Learning bool + Flood bool + ProxyArp bool + ProxyArpWiFi bool +} + +// String returns a list of enabled flags +func (prot *Protinfo) String() string { + var boolStrings []string + if prot.Hairpin { + boolStrings = append(boolStrings, "Hairpin") + } + if prot.Guard { + boolStrings = append(boolStrings, "Guard") + } + if prot.FastLeave { + boolStrings = append(boolStrings, "FastLeave") + } + if prot.RootBlock { + boolStrings = append(boolStrings, "RootBlock") + } + if prot.Learning { + boolStrings = append(boolStrings, "Learning") + } + if prot.Flood { + boolStrings = append(boolStrings, "Flood") + } + if prot.ProxyArp { + boolStrings = append(boolStrings, "ProxyArp") + } + if prot.ProxyArpWiFi { + boolStrings = append(boolStrings, "ProxyArpWiFi") + } + return strings.Join(boolStrings, " ") +} + +func boolToByte(x bool) []byte { + if x { + return []byte{1} + } + return []byte{0} +} + +func byteToBool(x byte) bool { + return uint8(x) != 0 +} diff --git a/vendor/github.com/vishvananda/netlink/protinfo_linux.go b/vendor/github.com/vishvananda/netlink/protinfo_linux.go new file mode 100644 index 00000000..10dd0d53 --- /dev/null +++ b/vendor/github.com/vishvananda/netlink/protinfo_linux.go @@ -0,0 +1,74 @@ +package netlink + +import ( + "fmt" + "syscall" + + "github.com/vishvananda/netlink/nl" +) + +func LinkGetProtinfo(link Link) (Protinfo, error) { + return pkgHandle.LinkGetProtinfo(link) +} + +func (h *Handle) LinkGetProtinfo(link Link) (Protinfo, error) { + base := link.Attrs() + h.ensureIndex(base) + var pi Protinfo + req := h.newNetlinkRequest(syscall.RTM_GETLINK, syscall.NLM_F_DUMP) + msg := nl.NewIfInfomsg(syscall.AF_BRIDGE) + req.AddData(msg) + msgs, err := req.Execute(syscall.NETLINK_ROUTE, 0) + if err != nil { + return pi, err + } + + for _, m := range msgs { + ans := nl.DeserializeIfInfomsg(m) + if int(ans.Index) != base.Index { + continue + } + attrs, err := nl.ParseRouteAttr(m[ans.Len():]) + if err != nil { + return pi, err + } + for _, attr := range attrs { + if attr.Attr.Type != syscall.IFLA_PROTINFO|syscall.NLA_F_NESTED { + continue + } + infos, err := nl.ParseRouteAttr(attr.Value) + if err != nil { + return pi, err + } + pi = *parseProtinfo(infos) + + return pi, nil + } + } + return pi, fmt.Errorf("Device with index %d not found", base.Index) +} + +func parseProtinfo(infos []syscall.NetlinkRouteAttr) *Protinfo { + var pi Protinfo + for _, info := range infos { + switch info.Attr.Type { + case nl.IFLA_BRPORT_MODE: + pi.Hairpin = byteToBool(info.Value[0]) + case nl.IFLA_BRPORT_GUARD: + pi.Guard = byteToBool(info.Value[0]) + case nl.IFLA_BRPORT_FAST_LEAVE: + pi.FastLeave = byteToBool(info.Value[0]) + case nl.IFLA_BRPORT_PROTECT: + pi.RootBlock = byteToBool(info.Value[0]) + case nl.IFLA_BRPORT_LEARNING: + pi.Learning = byteToBool(info.Value[0]) + case nl.IFLA_BRPORT_UNICAST_FLOOD: + pi.Flood = byteToBool(info.Value[0]) + case nl.IFLA_BRPORT_PROXYARP: + pi.ProxyArp = byteToBool(info.Value[0]) + case nl.IFLA_BRPORT_PROXYARP_WIFI: + pi.ProxyArpWiFi = byteToBool(info.Value[0]) + } + } + return &pi +} diff --git a/vendor/github.com/vishvananda/netlink/qdisc.go b/vendor/github.com/vishvananda/netlink/qdisc.go new file mode 100644 index 00000000..0ca86ebe --- /dev/null +++ b/vendor/github.com/vishvananda/netlink/qdisc.go @@ -0,0 +1,232 @@ +package netlink + +import ( + "fmt" + "math" +) + +const ( + HANDLE_NONE = 0 + HANDLE_INGRESS = 0xFFFFFFF1 + HANDLE_CLSACT = HANDLE_INGRESS + HANDLE_ROOT = 0xFFFFFFFF + PRIORITY_MAP_LEN = 16 +) +const ( + HANDLE_MIN_INGRESS = 0xFFFFFFF2 + HANDLE_MIN_EGRESS = 0xFFFFFFF3 +) + +type Qdisc interface { + Attrs() *QdiscAttrs + Type() string +} + +// QdiscAttrs represents a netlink qdisc. A qdisc is associated with a link, +// has a handle, a parent and a refcnt. The root qdisc of a device should +// have parent == HANDLE_ROOT. +type QdiscAttrs struct { + LinkIndex int + Handle uint32 + Parent uint32 + Refcnt uint32 // read only +} + +func (q QdiscAttrs) String() string { + return fmt.Sprintf("{LinkIndex: %d, Handle: %s, Parent: %s, Refcnt: %d}", q.LinkIndex, HandleStr(q.Handle), HandleStr(q.Parent), q.Refcnt) +} + +func MakeHandle(major, minor uint16) uint32 { + return (uint32(major) << 16) | uint32(minor) +} + +func MajorMinor(handle uint32) (uint16, uint16) { + return uint16((handle & 0xFFFF0000) >> 16), uint16(handle & 0x0000FFFFF) +} + +func HandleStr(handle uint32) string { + switch handle { + case HANDLE_NONE: + return "none" + case HANDLE_INGRESS: + return "ingress" + case HANDLE_ROOT: + return "root" + default: + major, minor := MajorMinor(handle) + return fmt.Sprintf("%x:%x", major, minor) + } +} + +func Percentage2u32(percentage float32) uint32 { + // FIXME this is most likely not the best way to convert from % to uint32 + if percentage == 100 { + return math.MaxUint32 + } + return uint32(math.MaxUint32 * (percentage / 100)) +} + +// PfifoFast is the default qdisc created by the kernel if one has not +// been defined for the interface +type PfifoFast struct { + QdiscAttrs + Bands uint8 + PriorityMap [PRIORITY_MAP_LEN]uint8 +} + +func (qdisc *PfifoFast) Attrs() *QdiscAttrs { + return &qdisc.QdiscAttrs +} + +func (qdisc *PfifoFast) Type() string { + return "pfifo_fast" +} + +// Prio is a basic qdisc that works just like PfifoFast +type Prio struct { + QdiscAttrs + Bands uint8 + PriorityMap [PRIORITY_MAP_LEN]uint8 +} + +func NewPrio(attrs QdiscAttrs) *Prio { + return &Prio{ + QdiscAttrs: attrs, + Bands: 3, + PriorityMap: [PRIORITY_MAP_LEN]uint8{1, 2, 2, 2, 1, 2, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1}, + } +} + +func (qdisc *Prio) Attrs() *QdiscAttrs { + return &qdisc.QdiscAttrs +} + +func (qdisc *Prio) Type() string { + return "prio" +} + +// Htb is a classful qdisc that rate limits based on tokens +type Htb struct { + QdiscAttrs + Version uint32 + Rate2Quantum uint32 + Defcls uint32 + Debug uint32 + DirectPkts uint32 +} + +func NewHtb(attrs QdiscAttrs) *Htb { + return &Htb{ + QdiscAttrs: attrs, + Version: 3, + Defcls: 0, + Rate2Quantum: 10, + Debug: 0, + DirectPkts: 0, + } +} + +func (qdisc *Htb) Attrs() *QdiscAttrs { + return &qdisc.QdiscAttrs +} + +func (qdisc *Htb) Type() string { + return "htb" +} + +// Netem is a classless qdisc that rate limits based on tokens + +type NetemQdiscAttrs struct { + Latency uint32 // in us + DelayCorr float32 // in % + Limit uint32 + Loss float32 // in % + LossCorr float32 // in % + Gap uint32 + Duplicate float32 // in % + DuplicateCorr float32 // in % + Jitter uint32 // in us + ReorderProb float32 // in % + ReorderCorr float32 // in % + CorruptProb float32 // in % + CorruptCorr float32 // in % +} + +func (q NetemQdiscAttrs) String() string { + return fmt.Sprintf( + "{Latency: %d, Limit: %d, Loss: %f, Gap: %d, Duplicate: %f, Jitter: %d}", + q.Latency, q.Limit, q.Loss, q.Gap, q.Duplicate, q.Jitter, + ) +} + +type Netem struct { + QdiscAttrs + Latency uint32 + DelayCorr uint32 + Limit uint32 + Loss uint32 + LossCorr uint32 + Gap uint32 + Duplicate uint32 + DuplicateCorr uint32 + Jitter uint32 + ReorderProb uint32 + ReorderCorr uint32 + CorruptProb uint32 + CorruptCorr uint32 +} + +func (qdisc *Netem) Attrs() *QdiscAttrs { + return &qdisc.QdiscAttrs +} + +func (qdisc *Netem) Type() string { + return "netem" +} + +// Tbf is a classless qdisc that rate limits based on tokens +type Tbf struct { + QdiscAttrs + Rate uint64 + Limit uint32 + Buffer uint32 + Peakrate uint64 + Minburst uint32 + // TODO: handle other settings +} + +func (qdisc *Tbf) Attrs() *QdiscAttrs { + return &qdisc.QdiscAttrs +} + +func (qdisc *Tbf) Type() string { + return "tbf" +} + +// Ingress is a qdisc for adding ingress filters +type Ingress struct { + QdiscAttrs +} + +func (qdisc *Ingress) Attrs() *QdiscAttrs { + return &qdisc.QdiscAttrs +} + +func (qdisc *Ingress) Type() string { + return "ingress" +} + +// GenericQdisc qdiscs represent types that are not currently understood +// by this netlink library. +type GenericQdisc struct { + QdiscAttrs + QdiscType string +} + +func (qdisc *GenericQdisc) Attrs() *QdiscAttrs { + return &qdisc.QdiscAttrs +} + +func (qdisc *GenericQdisc) Type() string { + return qdisc.QdiscType +} diff --git a/vendor/github.com/vishvananda/netlink/qdisc_linux.go b/vendor/github.com/vishvananda/netlink/qdisc_linux.go new file mode 100644 index 00000000..2c0deddb --- /dev/null +++ b/vendor/github.com/vishvananda/netlink/qdisc_linux.go @@ -0,0 +1,527 @@ +package netlink + +import ( + "fmt" + "io/ioutil" + "strconv" + "strings" + "syscall" + + "github.com/vishvananda/netlink/nl" +) + +// NOTE function is here because it uses other linux functions +func NewNetem(attrs QdiscAttrs, nattrs NetemQdiscAttrs) *Netem { + var limit uint32 = 1000 + var lossCorr, delayCorr, duplicateCorr uint32 + var reorderProb, reorderCorr uint32 + var corruptProb, corruptCorr uint32 + + latency := nattrs.Latency + loss := Percentage2u32(nattrs.Loss) + gap := nattrs.Gap + duplicate := Percentage2u32(nattrs.Duplicate) + jitter := nattrs.Jitter + + // Correlation + if latency > 0 && jitter > 0 { + delayCorr = Percentage2u32(nattrs.DelayCorr) + } + if loss > 0 { + lossCorr = Percentage2u32(nattrs.LossCorr) + } + if duplicate > 0 { + duplicateCorr = Percentage2u32(nattrs.DuplicateCorr) + } + // FIXME should validate values(like loss/duplicate are percentages...) + latency = time2Tick(latency) + + if nattrs.Limit != 0 { + limit = nattrs.Limit + } + // Jitter is only value if latency is > 0 + if latency > 0 { + jitter = time2Tick(jitter) + } + + reorderProb = Percentage2u32(nattrs.ReorderProb) + reorderCorr = Percentage2u32(nattrs.ReorderCorr) + + if reorderProb > 0 { + // ERROR if lantency == 0 + if gap == 0 { + gap = 1 + } + } + + corruptProb = Percentage2u32(nattrs.CorruptProb) + corruptCorr = Percentage2u32(nattrs.CorruptCorr) + + return &Netem{ + QdiscAttrs: attrs, + Latency: latency, + DelayCorr: delayCorr, + Limit: limit, + Loss: loss, + LossCorr: lossCorr, + Gap: gap, + Duplicate: duplicate, + DuplicateCorr: duplicateCorr, + Jitter: jitter, + ReorderProb: reorderProb, + ReorderCorr: reorderCorr, + CorruptProb: corruptProb, + CorruptCorr: corruptCorr, + } +} + +// QdiscDel will delete a qdisc from the system. +// Equivalent to: `tc qdisc del $qdisc` +func QdiscDel(qdisc Qdisc) error { + return pkgHandle.QdiscDel(qdisc) +} + +// QdiscDel will delete a qdisc from the system. +// Equivalent to: `tc qdisc del $qdisc` +func (h *Handle) QdiscDel(qdisc Qdisc) error { + return h.qdiscModify(syscall.RTM_DELQDISC, 0, qdisc) +} + +// QdiscChange will change a qdisc in place +// Equivalent to: `tc qdisc change $qdisc` +// The parent and handle MUST NOT be changed. +func QdiscChange(qdisc Qdisc) error { + return pkgHandle.QdiscChange(qdisc) +} + +// QdiscChange will change a qdisc in place +// Equivalent to: `tc qdisc change $qdisc` +// The parent and handle MUST NOT be changed. +func (h *Handle) QdiscChange(qdisc Qdisc) error { + return h.qdiscModify(syscall.RTM_NEWQDISC, 0, qdisc) +} + +// QdiscReplace will replace a qdisc to the system. +// Equivalent to: `tc qdisc replace $qdisc` +// The handle MUST change. +func QdiscReplace(qdisc Qdisc) error { + return pkgHandle.QdiscReplace(qdisc) +} + +// QdiscReplace will replace a qdisc to the system. +// Equivalent to: `tc qdisc replace $qdisc` +// The handle MUST change. +func (h *Handle) QdiscReplace(qdisc Qdisc) error { + return h.qdiscModify( + syscall.RTM_NEWQDISC, + syscall.NLM_F_CREATE|syscall.NLM_F_REPLACE, + qdisc) +} + +// QdiscAdd will add a qdisc to the system. +// Equivalent to: `tc qdisc add $qdisc` +func QdiscAdd(qdisc Qdisc) error { + return pkgHandle.QdiscAdd(qdisc) +} + +// QdiscAdd will add a qdisc to the system. +// Equivalent to: `tc qdisc add $qdisc` +func (h *Handle) QdiscAdd(qdisc Qdisc) error { + return h.qdiscModify( + syscall.RTM_NEWQDISC, + syscall.NLM_F_CREATE|syscall.NLM_F_EXCL, + qdisc) +} + +func (h *Handle) qdiscModify(cmd, flags int, qdisc Qdisc) error { + req := h.newNetlinkRequest(cmd, flags|syscall.NLM_F_ACK) + base := qdisc.Attrs() + msg := &nl.TcMsg{ + Family: nl.FAMILY_ALL, + Ifindex: int32(base.LinkIndex), + Handle: base.Handle, + Parent: base.Parent, + } + req.AddData(msg) + + // When deleting don't bother building the rest of the netlink payload + if cmd != syscall.RTM_DELQDISC { + if err := qdiscPayload(req, qdisc); err != nil { + return err + } + } + + _, err := req.Execute(syscall.NETLINK_ROUTE, 0) + return err +} + +func qdiscPayload(req *nl.NetlinkRequest, qdisc Qdisc) error { + + req.AddData(nl.NewRtAttr(nl.TCA_KIND, nl.ZeroTerminated(qdisc.Type()))) + + options := nl.NewRtAttr(nl.TCA_OPTIONS, nil) + if prio, ok := qdisc.(*Prio); ok { + tcmap := nl.TcPrioMap{ + Bands: int32(prio.Bands), + Priomap: prio.PriorityMap, + } + options = nl.NewRtAttr(nl.TCA_OPTIONS, tcmap.Serialize()) + } else if tbf, ok := qdisc.(*Tbf); ok { + opt := nl.TcTbfQopt{} + opt.Rate.Rate = uint32(tbf.Rate) + opt.Peakrate.Rate = uint32(tbf.Peakrate) + opt.Limit = tbf.Limit + opt.Buffer = tbf.Buffer + nl.NewRtAttrChild(options, nl.TCA_TBF_PARMS, opt.Serialize()) + if tbf.Rate >= uint64(1<<32) { + nl.NewRtAttrChild(options, nl.TCA_TBF_RATE64, nl.Uint64Attr(tbf.Rate)) + } + if tbf.Peakrate >= uint64(1<<32) { + nl.NewRtAttrChild(options, nl.TCA_TBF_PRATE64, nl.Uint64Attr(tbf.Peakrate)) + } + if tbf.Peakrate > 0 { + nl.NewRtAttrChild(options, nl.TCA_TBF_PBURST, nl.Uint32Attr(tbf.Minburst)) + } + } else if htb, ok := qdisc.(*Htb); ok { + opt := nl.TcHtbGlob{} + opt.Version = htb.Version + opt.Rate2Quantum = htb.Rate2Quantum + opt.Defcls = htb.Defcls + // TODO: Handle Debug properly. For now default to 0 + opt.Debug = htb.Debug + opt.DirectPkts = htb.DirectPkts + nl.NewRtAttrChild(options, nl.TCA_HTB_INIT, opt.Serialize()) + // nl.NewRtAttrChild(options, nl.TCA_HTB_DIRECT_QLEN, opt.Serialize()) + } else if netem, ok := qdisc.(*Netem); ok { + opt := nl.TcNetemQopt{} + opt.Latency = netem.Latency + opt.Limit = netem.Limit + opt.Loss = netem.Loss + opt.Gap = netem.Gap + opt.Duplicate = netem.Duplicate + opt.Jitter = netem.Jitter + options = nl.NewRtAttr(nl.TCA_OPTIONS, opt.Serialize()) + // Correlation + corr := nl.TcNetemCorr{} + corr.DelayCorr = netem.DelayCorr + corr.LossCorr = netem.LossCorr + corr.DupCorr = netem.DuplicateCorr + + if corr.DelayCorr > 0 || corr.LossCorr > 0 || corr.DupCorr > 0 { + nl.NewRtAttrChild(options, nl.TCA_NETEM_CORR, corr.Serialize()) + } + // Corruption + corruption := nl.TcNetemCorrupt{} + corruption.Probability = netem.CorruptProb + corruption.Correlation = netem.CorruptCorr + if corruption.Probability > 0 { + nl.NewRtAttrChild(options, nl.TCA_NETEM_CORRUPT, corruption.Serialize()) + } + // Reorder + reorder := nl.TcNetemReorder{} + reorder.Probability = netem.ReorderProb + reorder.Correlation = netem.ReorderCorr + if reorder.Probability > 0 { + nl.NewRtAttrChild(options, nl.TCA_NETEM_REORDER, reorder.Serialize()) + } + } else if _, ok := qdisc.(*Ingress); ok { + // ingress filters must use the proper handle + if qdisc.Attrs().Parent != HANDLE_INGRESS { + return fmt.Errorf("Ingress filters must set Parent to HANDLE_INGRESS") + } + } + + req.AddData(options) + return nil +} + +// QdiscList gets a list of qdiscs in the system. +// Equivalent to: `tc qdisc show`. +// The list can be filtered by link. +func QdiscList(link Link) ([]Qdisc, error) { + return pkgHandle.QdiscList(link) +} + +// QdiscList gets a list of qdiscs in the system. +// Equivalent to: `tc qdisc show`. +// The list can be filtered by link. +func (h *Handle) QdiscList(link Link) ([]Qdisc, error) { + req := h.newNetlinkRequest(syscall.RTM_GETQDISC, syscall.NLM_F_DUMP) + index := int32(0) + if link != nil { + base := link.Attrs() + h.ensureIndex(base) + index = int32(base.Index) + } + msg := &nl.TcMsg{ + Family: nl.FAMILY_ALL, + Ifindex: index, + } + req.AddData(msg) + + msgs, err := req.Execute(syscall.NETLINK_ROUTE, syscall.RTM_NEWQDISC) + if err != nil { + return nil, err + } + + var res []Qdisc + for _, m := range msgs { + msg := nl.DeserializeTcMsg(m) + + attrs, err := nl.ParseRouteAttr(m[msg.Len():]) + if err != nil { + return nil, err + } + + // skip qdiscs from other interfaces + if link != nil && msg.Ifindex != index { + continue + } + + base := QdiscAttrs{ + LinkIndex: int(msg.Ifindex), + Handle: msg.Handle, + Parent: msg.Parent, + Refcnt: msg.Info, + } + var qdisc Qdisc + qdiscType := "" + for _, attr := range attrs { + switch attr.Attr.Type { + case nl.TCA_KIND: + qdiscType = string(attr.Value[:len(attr.Value)-1]) + switch qdiscType { + case "pfifo_fast": + qdisc = &PfifoFast{} + case "prio": + qdisc = &Prio{} + case "tbf": + qdisc = &Tbf{} + case "ingress": + qdisc = &Ingress{} + case "htb": + qdisc = &Htb{} + case "netem": + qdisc = &Netem{} + default: + qdisc = &GenericQdisc{QdiscType: qdiscType} + } + case nl.TCA_OPTIONS: + switch qdiscType { + case "pfifo_fast": + // pfifo returns TcPrioMap directly without wrapping it in rtattr + if err := parsePfifoFastData(qdisc, attr.Value); err != nil { + return nil, err + } + case "prio": + // prio returns TcPrioMap directly without wrapping it in rtattr + if err := parsePrioData(qdisc, attr.Value); err != nil { + return nil, err + } + case "tbf": + data, err := nl.ParseRouteAttr(attr.Value) + if err != nil { + return nil, err + } + if err := parseTbfData(qdisc, data); err != nil { + return nil, err + } + case "htb": + data, err := nl.ParseRouteAttr(attr.Value) + if err != nil { + return nil, err + } + if err := parseHtbData(qdisc, data); err != nil { + return nil, err + } + case "netem": + if err := parseNetemData(qdisc, attr.Value); err != nil { + return nil, err + } + + // no options for ingress + } + } + } + *qdisc.Attrs() = base + res = append(res, qdisc) + } + + return res, nil +} + +func parsePfifoFastData(qdisc Qdisc, value []byte) error { + pfifo := qdisc.(*PfifoFast) + tcmap := nl.DeserializeTcPrioMap(value) + pfifo.PriorityMap = tcmap.Priomap + pfifo.Bands = uint8(tcmap.Bands) + return nil +} + +func parsePrioData(qdisc Qdisc, value []byte) error { + prio := qdisc.(*Prio) + tcmap := nl.DeserializeTcPrioMap(value) + prio.PriorityMap = tcmap.Priomap + prio.Bands = uint8(tcmap.Bands) + return nil +} + +func parseHtbData(qdisc Qdisc, data []syscall.NetlinkRouteAttr) error { + native = nl.NativeEndian() + htb := qdisc.(*Htb) + for _, datum := range data { + switch datum.Attr.Type { + case nl.TCA_HTB_INIT: + opt := nl.DeserializeTcHtbGlob(datum.Value) + htb.Version = opt.Version + htb.Rate2Quantum = opt.Rate2Quantum + htb.Defcls = opt.Defcls + htb.Debug = opt.Debug + htb.DirectPkts = opt.DirectPkts + case nl.TCA_HTB_DIRECT_QLEN: + // TODO + //htb.DirectQlen = native.uint32(datum.Value) + } + } + return nil +} + +func parseNetemData(qdisc Qdisc, value []byte) error { + netem := qdisc.(*Netem) + opt := nl.DeserializeTcNetemQopt(value) + netem.Latency = opt.Latency + netem.Limit = opt.Limit + netem.Loss = opt.Loss + netem.Gap = opt.Gap + netem.Duplicate = opt.Duplicate + netem.Jitter = opt.Jitter + data, err := nl.ParseRouteAttr(value[nl.SizeofTcNetemQopt:]) + if err != nil { + return err + } + for _, datum := range data { + switch datum.Attr.Type { + case nl.TCA_NETEM_CORR: + opt := nl.DeserializeTcNetemCorr(datum.Value) + netem.DelayCorr = opt.DelayCorr + netem.LossCorr = opt.LossCorr + netem.DuplicateCorr = opt.DupCorr + case nl.TCA_NETEM_CORRUPT: + opt := nl.DeserializeTcNetemCorrupt(datum.Value) + netem.CorruptProb = opt.Probability + netem.CorruptCorr = opt.Correlation + case nl.TCA_NETEM_REORDER: + opt := nl.DeserializeTcNetemReorder(datum.Value) + netem.ReorderProb = opt.Probability + netem.ReorderCorr = opt.Correlation + } + } + return nil +} + +func parseTbfData(qdisc Qdisc, data []syscall.NetlinkRouteAttr) error { + native = nl.NativeEndian() + tbf := qdisc.(*Tbf) + for _, datum := range data { + switch datum.Attr.Type { + case nl.TCA_TBF_PARMS: + opt := nl.DeserializeTcTbfQopt(datum.Value) + tbf.Rate = uint64(opt.Rate.Rate) + tbf.Peakrate = uint64(opt.Peakrate.Rate) + tbf.Limit = opt.Limit + tbf.Buffer = opt.Buffer + case nl.TCA_TBF_RATE64: + tbf.Rate = native.Uint64(datum.Value[0:8]) + case nl.TCA_TBF_PRATE64: + tbf.Peakrate = native.Uint64(datum.Value[0:8]) + case nl.TCA_TBF_PBURST: + tbf.Minburst = native.Uint32(datum.Value[0:4]) + } + } + return nil +} + +const ( + TIME_UNITS_PER_SEC = 1000000 +) + +var ( + tickInUsec float64 + clockFactor float64 + hz float64 +) + +func initClock() { + data, err := ioutil.ReadFile("/proc/net/psched") + if err != nil { + return + } + parts := strings.Split(strings.TrimSpace(string(data)), " ") + if len(parts) < 3 { + return + } + var vals [3]uint64 + for i := range vals { + val, err := strconv.ParseUint(parts[i], 16, 32) + if err != nil { + return + } + vals[i] = val + } + // compatibility + if vals[2] == 1000000000 { + vals[0] = vals[1] + } + clockFactor = float64(vals[2]) / TIME_UNITS_PER_SEC + tickInUsec = float64(vals[0]) / float64(vals[1]) * clockFactor + hz = float64(vals[0]) +} + +func TickInUsec() float64 { + if tickInUsec == 0.0 { + initClock() + } + return tickInUsec +} + +func ClockFactor() float64 { + if clockFactor == 0.0 { + initClock() + } + return clockFactor +} + +func Hz() float64 { + if hz == 0.0 { + initClock() + } + return hz +} + +func time2Tick(time uint32) uint32 { + return uint32(float64(time) * TickInUsec()) +} + +func tick2Time(tick uint32) uint32 { + return uint32(float64(tick) / TickInUsec()) +} + +func time2Ktime(time uint32) uint32 { + return uint32(float64(time) * ClockFactor()) +} + +func ktime2Time(ktime uint32) uint32 { + return uint32(float64(ktime) / ClockFactor()) +} + +func burst(rate uint64, buffer uint32) uint32 { + return uint32(float64(rate) * float64(tick2Time(buffer)) / TIME_UNITS_PER_SEC) +} + +func latency(rate uint64, limit, buffer uint32) float64 { + return TIME_UNITS_PER_SEC*(float64(limit)/float64(rate)) - float64(tick2Time(buffer)) +} + +func Xmittime(rate uint64, size uint32) float64 { + return TickInUsec() * TIME_UNITS_PER_SEC * (float64(size) / float64(rate)) +} diff --git a/vendor/github.com/vishvananda/netlink/route.go b/vendor/github.com/vishvananda/netlink/route.go new file mode 100644 index 00000000..03ac4b23 --- /dev/null +++ b/vendor/github.com/vishvananda/netlink/route.go @@ -0,0 +1,116 @@ +package netlink + +import ( + "fmt" + "net" + "strings" +) + +// Scope is an enum representing a route scope. +type Scope uint8 + +type NextHopFlag int + +type Destination interface { + Family() int + Decode([]byte) error + Encode() ([]byte, error) + String() string +} + +type Encap interface { + Type() int + Decode([]byte) error + Encode() ([]byte, error) + String() string +} + +// Route represents a netlink route. +type Route struct { + LinkIndex int + ILinkIndex int + Scope Scope + Dst *net.IPNet + Src net.IP + Gw net.IP + MultiPath []*NexthopInfo + Protocol int + Priority int + Table int + Type int + Tos int + Flags int + MPLSDst *int + NewDst Destination + Encap Encap +} + +func (r Route) String() string { + elems := []string{} + if len(r.MultiPath) == 0 { + elems = append(elems, fmt.Sprintf("Ifindex: %d", r.LinkIndex)) + } + if r.MPLSDst != nil { + elems = append(elems, fmt.Sprintf("Dst: %d", r.MPLSDst)) + } else { + elems = append(elems, fmt.Sprintf("Dst: %s", r.Dst)) + } + if r.NewDst != nil { + elems = append(elems, fmt.Sprintf("NewDst: %s", r.NewDst)) + } + if r.Encap != nil { + elems = append(elems, fmt.Sprintf("Encap: %s", r.Encap)) + } + elems = append(elems, fmt.Sprintf("Src: %s", r.Src)) + if len(r.MultiPath) > 0 { + elems = append(elems, fmt.Sprintf("Gw: %s", r.MultiPath)) + } else { + elems = append(elems, fmt.Sprintf("Gw: %s", r.Gw)) + } + elems = append(elems, fmt.Sprintf("Flags: %s", r.ListFlags())) + elems = append(elems, fmt.Sprintf("Table: %d", r.Table)) + return fmt.Sprintf("{%s}", strings.Join(elems, " ")) +} + +func (r *Route) SetFlag(flag NextHopFlag) { + r.Flags |= int(flag) +} + +func (r *Route) ClearFlag(flag NextHopFlag) { + r.Flags &^= int(flag) +} + +type flagString struct { + f NextHopFlag + s string +} + +// RouteUpdate is sent when a route changes - type is RTM_NEWROUTE or RTM_DELROUTE +type RouteUpdate struct { + Type uint16 + Route +} + +type NexthopInfo struct { + LinkIndex int + Hops int + Gw net.IP + Flags int + NewDst Destination + Encap Encap +} + +func (n *NexthopInfo) String() string { + elems := []string{} + elems = append(elems, fmt.Sprintf("Ifindex: %d", n.LinkIndex)) + if n.NewDst != nil { + elems = append(elems, fmt.Sprintf("NewDst: %s", n.NewDst)) + } + if n.Encap != nil { + elems = append(elems, fmt.Sprintf("Encap: %s", n.Encap)) + } + elems = append(elems, fmt.Sprintf("Weight: %d", n.Hops+1)) + elems = append(elems, fmt.Sprintf("Gw: %d", n.Gw)) + elems = append(elems, fmt.Sprintf("Flags: %s", n.ListFlags())) + return fmt.Sprintf("{%s}", strings.Join(elems, " ")) +} diff --git a/vendor/github.com/vishvananda/netlink/route_linux.go b/vendor/github.com/vishvananda/netlink/route_linux.go new file mode 100644 index 00000000..cd739e71 --- /dev/null +++ b/vendor/github.com/vishvananda/netlink/route_linux.go @@ -0,0 +1,674 @@ +package netlink + +import ( + "fmt" + "net" + "strings" + "syscall" + + "github.com/vishvananda/netlink/nl" + "github.com/vishvananda/netns" +) + +// RtAttr is shared so it is in netlink_linux.go + +const ( + SCOPE_UNIVERSE Scope = syscall.RT_SCOPE_UNIVERSE + SCOPE_SITE Scope = syscall.RT_SCOPE_SITE + SCOPE_LINK Scope = syscall.RT_SCOPE_LINK + SCOPE_HOST Scope = syscall.RT_SCOPE_HOST + SCOPE_NOWHERE Scope = syscall.RT_SCOPE_NOWHERE +) + +const ( + RT_FILTER_PROTOCOL uint64 = 1 << (1 + iota) + RT_FILTER_SCOPE + RT_FILTER_TYPE + RT_FILTER_TOS + RT_FILTER_IIF + RT_FILTER_OIF + RT_FILTER_DST + RT_FILTER_SRC + RT_FILTER_GW + RT_FILTER_TABLE +) + +const ( + FLAG_ONLINK NextHopFlag = syscall.RTNH_F_ONLINK + FLAG_PERVASIVE NextHopFlag = syscall.RTNH_F_PERVASIVE +) + +var testFlags = []flagString{ + {f: FLAG_ONLINK, s: "onlink"}, + {f: FLAG_PERVASIVE, s: "pervasive"}, +} + +func listFlags(flag int) []string { + var flags []string + for _, tf := range testFlags { + if flag&int(tf.f) != 0 { + flags = append(flags, tf.s) + } + } + return flags +} + +func (r *Route) ListFlags() []string { + return listFlags(r.Flags) +} + +func (n *NexthopInfo) ListFlags() []string { + return listFlags(n.Flags) +} + +type MPLSDestination struct { + Labels []int +} + +func (d *MPLSDestination) Family() int { + return nl.FAMILY_MPLS +} + +func (d *MPLSDestination) Decode(buf []byte) error { + d.Labels = nl.DecodeMPLSStack(buf) + return nil +} + +func (d *MPLSDestination) Encode() ([]byte, error) { + return nl.EncodeMPLSStack(d.Labels...), nil +} + +func (d *MPLSDestination) String() string { + s := make([]string, 0, len(d.Labels)) + for _, l := range d.Labels { + s = append(s, fmt.Sprintf("%d", l)) + } + return strings.Join(s, "/") +} + +type MPLSEncap struct { + Labels []int +} + +func (e *MPLSEncap) Type() int { + return nl.LWTUNNEL_ENCAP_MPLS +} + +func (e *MPLSEncap) Decode(buf []byte) error { + if len(buf) < 4 { + return fmt.Errorf("Lack of bytes") + } + native := nl.NativeEndian() + l := native.Uint16(buf) + if len(buf) < int(l) { + return fmt.Errorf("Lack of bytes") + } + buf = buf[:l] + typ := native.Uint16(buf[2:]) + if typ != nl.MPLS_IPTUNNEL_DST { + return fmt.Errorf("Unknown MPLS Encap Type: %d", typ) + } + e.Labels = nl.DecodeMPLSStack(buf[4:]) + return nil +} + +func (e *MPLSEncap) Encode() ([]byte, error) { + s := nl.EncodeMPLSStack(e.Labels...) + native := nl.NativeEndian() + hdr := make([]byte, 4) + native.PutUint16(hdr, uint16(len(s)+4)) + native.PutUint16(hdr[2:], nl.MPLS_IPTUNNEL_DST) + return append(hdr, s...), nil +} + +func (e *MPLSEncap) String() string { + s := make([]string, 0, len(e.Labels)) + for _, l := range e.Labels { + s = append(s, fmt.Sprintf("%d", l)) + } + return strings.Join(s, "/") +} + +// RouteAdd will add a route to the system. +// Equivalent to: `ip route add $route` +func RouteAdd(route *Route) error { + return pkgHandle.RouteAdd(route) +} + +// RouteAdd will add a route to the system. +// Equivalent to: `ip route add $route` +func (h *Handle) RouteAdd(route *Route) error { + flags := syscall.NLM_F_CREATE | syscall.NLM_F_EXCL | syscall.NLM_F_ACK + req := h.newNetlinkRequest(syscall.RTM_NEWROUTE, flags) + return h.routeHandle(route, req, nl.NewRtMsg()) +} + +// RouteReplace will add a route to the system. +// Equivalent to: `ip route replace $route` +func RouteReplace(route *Route) error { + return pkgHandle.RouteReplace(route) +} + +// RouteReplace will add a route to the system. +// Equivalent to: `ip route replace $route` +func (h *Handle) RouteReplace(route *Route) error { + flags := syscall.NLM_F_CREATE | syscall.NLM_F_REPLACE | syscall.NLM_F_ACK + req := h.newNetlinkRequest(syscall.RTM_NEWROUTE, flags) + return h.routeHandle(route, req, nl.NewRtMsg()) +} + +// RouteDel will delete a route from the system. +// Equivalent to: `ip route del $route` +func RouteDel(route *Route) error { + return pkgHandle.RouteDel(route) +} + +// RouteDel will delete a route from the system. +// Equivalent to: `ip route del $route` +func (h *Handle) RouteDel(route *Route) error { + req := h.newNetlinkRequest(syscall.RTM_DELROUTE, syscall.NLM_F_ACK) + return h.routeHandle(route, req, nl.NewRtDelMsg()) +} + +func (h *Handle) routeHandle(route *Route, req *nl.NetlinkRequest, msg *nl.RtMsg) error { + if (route.Dst == nil || route.Dst.IP == nil) && route.Src == nil && route.Gw == nil && route.MPLSDst == nil { + return fmt.Errorf("one of Dst.IP, Src, or Gw must not be nil") + } + + family := -1 + var rtAttrs []*nl.RtAttr + + if route.Dst != nil && route.Dst.IP != nil { + dstLen, _ := route.Dst.Mask.Size() + msg.Dst_len = uint8(dstLen) + dstFamily := nl.GetIPFamily(route.Dst.IP) + family = dstFamily + var dstData []byte + if dstFamily == FAMILY_V4 { + dstData = route.Dst.IP.To4() + } else { + dstData = route.Dst.IP.To16() + } + rtAttrs = append(rtAttrs, nl.NewRtAttr(syscall.RTA_DST, dstData)) + } else if route.MPLSDst != nil { + family = nl.FAMILY_MPLS + msg.Dst_len = uint8(20) + msg.Type = syscall.RTN_UNICAST + rtAttrs = append(rtAttrs, nl.NewRtAttr(syscall.RTA_DST, nl.EncodeMPLSStack(*route.MPLSDst))) + } + + if route.NewDst != nil { + if family != -1 && family != route.NewDst.Family() { + return fmt.Errorf("new destination and destination are not the same address family") + } + buf, err := route.NewDst.Encode() + if err != nil { + return err + } + rtAttrs = append(rtAttrs, nl.NewRtAttr(nl.RTA_NEWDST, buf)) + } + + if route.Encap != nil { + buf := make([]byte, 2) + native.PutUint16(buf, uint16(route.Encap.Type())) + rtAttrs = append(rtAttrs, nl.NewRtAttr(nl.RTA_ENCAP_TYPE, buf)) + buf, err := route.Encap.Encode() + if err != nil { + return err + } + rtAttrs = append(rtAttrs, nl.NewRtAttr(nl.RTA_ENCAP, buf)) + } + + if route.Src != nil { + srcFamily := nl.GetIPFamily(route.Src) + if family != -1 && family != srcFamily { + return fmt.Errorf("source and destination ip are not the same IP family") + } + family = srcFamily + var srcData []byte + if srcFamily == FAMILY_V4 { + srcData = route.Src.To4() + } else { + srcData = route.Src.To16() + } + // The commonly used src ip for routes is actually PREFSRC + rtAttrs = append(rtAttrs, nl.NewRtAttr(syscall.RTA_PREFSRC, srcData)) + } + + if route.Gw != nil { + gwFamily := nl.GetIPFamily(route.Gw) + if family != -1 && family != gwFamily { + return fmt.Errorf("gateway, source, and destination ip are not the same IP family") + } + family = gwFamily + var gwData []byte + if gwFamily == FAMILY_V4 { + gwData = route.Gw.To4() + } else { + gwData = route.Gw.To16() + } + rtAttrs = append(rtAttrs, nl.NewRtAttr(syscall.RTA_GATEWAY, gwData)) + } + + if len(route.MultiPath) > 0 { + buf := []byte{} + for _, nh := range route.MultiPath { + rtnh := &nl.RtNexthop{ + RtNexthop: syscall.RtNexthop{ + Hops: uint8(nh.Hops), + Ifindex: int32(nh.LinkIndex), + Flags: uint8(nh.Flags), + }, + } + children := []nl.NetlinkRequestData{} + if nh.Gw != nil { + gwFamily := nl.GetIPFamily(nh.Gw) + if family != -1 && family != gwFamily { + return fmt.Errorf("gateway, source, and destination ip are not the same IP family") + } + if gwFamily == FAMILY_V4 { + children = append(children, nl.NewRtAttr(syscall.RTA_GATEWAY, []byte(nh.Gw.To4()))) + } else { + children = append(children, nl.NewRtAttr(syscall.RTA_GATEWAY, []byte(nh.Gw.To16()))) + } + } + if nh.NewDst != nil { + if family != -1 && family != nh.NewDst.Family() { + return fmt.Errorf("new destination and destination are not the same address family") + } + buf, err := nh.NewDst.Encode() + if err != nil { + return err + } + children = append(children, nl.NewRtAttr(nl.RTA_NEWDST, buf)) + } + if nh.Encap != nil { + buf := make([]byte, 2) + native.PutUint16(buf, uint16(nh.Encap.Type())) + rtAttrs = append(rtAttrs, nl.NewRtAttr(nl.RTA_ENCAP_TYPE, buf)) + buf, err := nh.Encap.Encode() + if err != nil { + return err + } + children = append(children, nl.NewRtAttr(nl.RTA_ENCAP, buf)) + } + rtnh.Children = children + buf = append(buf, rtnh.Serialize()...) + } + rtAttrs = append(rtAttrs, nl.NewRtAttr(syscall.RTA_MULTIPATH, buf)) + } + + if route.Table > 0 { + if route.Table >= 256 { + msg.Table = syscall.RT_TABLE_UNSPEC + b := make([]byte, 4) + native.PutUint32(b, uint32(route.Table)) + rtAttrs = append(rtAttrs, nl.NewRtAttr(syscall.RTA_TABLE, b)) + } else { + msg.Table = uint8(route.Table) + } + } + + if route.Priority > 0 { + b := make([]byte, 4) + native.PutUint32(b, uint32(route.Priority)) + rtAttrs = append(rtAttrs, nl.NewRtAttr(syscall.RTA_PRIORITY, b)) + } + if route.Tos > 0 { + msg.Tos = uint8(route.Tos) + } + if route.Protocol > 0 { + msg.Protocol = uint8(route.Protocol) + } + if route.Type > 0 { + msg.Type = uint8(route.Type) + } + + msg.Flags = uint32(route.Flags) + msg.Scope = uint8(route.Scope) + msg.Family = uint8(family) + req.AddData(msg) + for _, attr := range rtAttrs { + req.AddData(attr) + } + + var ( + b = make([]byte, 4) + native = nl.NativeEndian() + ) + native.PutUint32(b, uint32(route.LinkIndex)) + + req.AddData(nl.NewRtAttr(syscall.RTA_OIF, b)) + + _, err := req.Execute(syscall.NETLINK_ROUTE, 0) + return err +} + +// RouteList gets a list of routes in the system. +// Equivalent to: `ip route show`. +// The list can be filtered by link and ip family. +func RouteList(link Link, family int) ([]Route, error) { + return pkgHandle.RouteList(link, family) +} + +// RouteList gets a list of routes in the system. +// Equivalent to: `ip route show`. +// The list can be filtered by link and ip family. +func (h *Handle) RouteList(link Link, family int) ([]Route, error) { + var routeFilter *Route + if link != nil { + routeFilter = &Route{ + LinkIndex: link.Attrs().Index, + } + } + return h.RouteListFiltered(family, routeFilter, RT_FILTER_OIF) +} + +// RouteListFiltered gets a list of routes in the system filtered with specified rules. +// All rules must be defined in RouteFilter struct +func RouteListFiltered(family int, filter *Route, filterMask uint64) ([]Route, error) { + return pkgHandle.RouteListFiltered(family, filter, filterMask) +} + +// RouteListFiltered gets a list of routes in the system filtered with specified rules. +// All rules must be defined in RouteFilter struct +func (h *Handle) RouteListFiltered(family int, filter *Route, filterMask uint64) ([]Route, error) { + req := h.newNetlinkRequest(syscall.RTM_GETROUTE, syscall.NLM_F_DUMP) + infmsg := nl.NewIfInfomsg(family) + req.AddData(infmsg) + + msgs, err := req.Execute(syscall.NETLINK_ROUTE, syscall.RTM_NEWROUTE) + if err != nil { + return nil, err + } + + var res []Route + for _, m := range msgs { + msg := nl.DeserializeRtMsg(m) + if msg.Flags&syscall.RTM_F_CLONED != 0 { + // Ignore cloned routes + continue + } + if msg.Table != syscall.RT_TABLE_MAIN { + if filter == nil || filter != nil && filterMask&RT_FILTER_TABLE == 0 { + // Ignore non-main tables + continue + } + } + route, err := deserializeRoute(m) + if err != nil { + return nil, err + } + if filter != nil { + switch { + case filterMask&RT_FILTER_TABLE != 0 && filter.Table != syscall.RT_TABLE_UNSPEC && route.Table != filter.Table: + continue + case filterMask&RT_FILTER_PROTOCOL != 0 && route.Protocol != filter.Protocol: + continue + case filterMask&RT_FILTER_SCOPE != 0 && route.Scope != filter.Scope: + continue + case filterMask&RT_FILTER_TYPE != 0 && route.Type != filter.Type: + continue + case filterMask&RT_FILTER_TOS != 0 && route.Tos != filter.Tos: + continue + case filterMask&RT_FILTER_OIF != 0 && route.LinkIndex != filter.LinkIndex: + continue + case filterMask&RT_FILTER_IIF != 0 && route.ILinkIndex != filter.ILinkIndex: + continue + case filterMask&RT_FILTER_GW != 0 && !route.Gw.Equal(filter.Gw): + continue + case filterMask&RT_FILTER_SRC != 0 && !route.Src.Equal(filter.Src): + continue + case filterMask&RT_FILTER_DST != 0: + if filter.MPLSDst == nil || route.MPLSDst == nil || (*filter.MPLSDst) != (*route.MPLSDst) { + if filter.Dst == nil { + if route.Dst != nil { + continue + } + } else { + if route.Dst == nil { + continue + } + aMaskLen, aMaskBits := route.Dst.Mask.Size() + bMaskLen, bMaskBits := filter.Dst.Mask.Size() + if !(route.Dst.IP.Equal(filter.Dst.IP) && aMaskLen == bMaskLen && aMaskBits == bMaskBits) { + continue + } + } + } + } + } + res = append(res, route) + } + return res, nil +} + +// deserializeRoute decodes a binary netlink message into a Route struct +func deserializeRoute(m []byte) (Route, error) { + msg := nl.DeserializeRtMsg(m) + attrs, err := nl.ParseRouteAttr(m[msg.Len():]) + if err != nil { + return Route{}, err + } + route := Route{ + Scope: Scope(msg.Scope), + Protocol: int(msg.Protocol), + Table: int(msg.Table), + Type: int(msg.Type), + Tos: int(msg.Tos), + Flags: int(msg.Flags), + } + + native := nl.NativeEndian() + var encap, encapType syscall.NetlinkRouteAttr + for _, attr := range attrs { + switch attr.Attr.Type { + case syscall.RTA_GATEWAY: + route.Gw = net.IP(attr.Value) + case syscall.RTA_PREFSRC: + route.Src = net.IP(attr.Value) + case syscall.RTA_DST: + if msg.Family == nl.FAMILY_MPLS { + stack := nl.DecodeMPLSStack(attr.Value) + if len(stack) == 0 || len(stack) > 1 { + return route, fmt.Errorf("invalid MPLS RTA_DST") + } + route.MPLSDst = &stack[0] + } else { + route.Dst = &net.IPNet{ + IP: attr.Value, + Mask: net.CIDRMask(int(msg.Dst_len), 8*len(attr.Value)), + } + } + case syscall.RTA_OIF: + route.LinkIndex = int(native.Uint32(attr.Value[0:4])) + case syscall.RTA_IIF: + route.ILinkIndex = int(native.Uint32(attr.Value[0:4])) + case syscall.RTA_PRIORITY: + route.Priority = int(native.Uint32(attr.Value[0:4])) + case syscall.RTA_TABLE: + route.Table = int(native.Uint32(attr.Value[0:4])) + case syscall.RTA_MULTIPATH: + parseRtNexthop := func(value []byte) (*NexthopInfo, []byte, error) { + if len(value) < syscall.SizeofRtNexthop { + return nil, nil, fmt.Errorf("Lack of bytes") + } + nh := nl.DeserializeRtNexthop(value) + if len(value) < int(nh.RtNexthop.Len) { + return nil, nil, fmt.Errorf("Lack of bytes") + } + info := &NexthopInfo{ + LinkIndex: int(nh.RtNexthop.Ifindex), + Hops: int(nh.RtNexthop.Hops), + Flags: int(nh.RtNexthop.Flags), + } + attrs, err := nl.ParseRouteAttr(value[syscall.SizeofRtNexthop:int(nh.RtNexthop.Len)]) + if err != nil { + return nil, nil, err + } + var encap, encapType syscall.NetlinkRouteAttr + for _, attr := range attrs { + switch attr.Attr.Type { + case syscall.RTA_GATEWAY: + info.Gw = net.IP(attr.Value) + case nl.RTA_NEWDST: + var d Destination + switch msg.Family { + case nl.FAMILY_MPLS: + d = &MPLSDestination{} + } + if err := d.Decode(attr.Value); err != nil { + return nil, nil, err + } + info.NewDst = d + case nl.RTA_ENCAP_TYPE: + encapType = attr + case nl.RTA_ENCAP: + encap = attr + } + } + + if len(encap.Value) != 0 && len(encapType.Value) != 0 { + typ := int(native.Uint16(encapType.Value[0:2])) + var e Encap + switch typ { + case nl.LWTUNNEL_ENCAP_MPLS: + e = &MPLSEncap{} + if err := e.Decode(encap.Value); err != nil { + return nil, nil, err + } + } + info.Encap = e + } + + return info, value[int(nh.RtNexthop.Len):], nil + } + rest := attr.Value + for len(rest) > 0 { + info, buf, err := parseRtNexthop(rest) + if err != nil { + return route, err + } + route.MultiPath = append(route.MultiPath, info) + rest = buf + } + case nl.RTA_NEWDST: + var d Destination + switch msg.Family { + case nl.FAMILY_MPLS: + d = &MPLSDestination{} + } + if err := d.Decode(attr.Value); err != nil { + return route, err + } + route.NewDst = d + case nl.RTA_ENCAP_TYPE: + encapType = attr + case nl.RTA_ENCAP: + encap = attr + } + } + + if len(encap.Value) != 0 && len(encapType.Value) != 0 { + typ := int(native.Uint16(encapType.Value[0:2])) + var e Encap + switch typ { + case nl.LWTUNNEL_ENCAP_MPLS: + e = &MPLSEncap{} + if err := e.Decode(encap.Value); err != nil { + return route, err + } + } + route.Encap = e + } + + return route, nil +} + +// RouteGet gets a route to a specific destination from the host system. +// Equivalent to: 'ip route get'. +func RouteGet(destination net.IP) ([]Route, error) { + return pkgHandle.RouteGet(destination) +} + +// RouteGet gets a route to a specific destination from the host system. +// Equivalent to: 'ip route get'. +func (h *Handle) RouteGet(destination net.IP) ([]Route, error) { + req := h.newNetlinkRequest(syscall.RTM_GETROUTE, syscall.NLM_F_REQUEST) + family := nl.GetIPFamily(destination) + var destinationData []byte + var bitlen uint8 + if family == FAMILY_V4 { + destinationData = destination.To4() + bitlen = 32 + } else { + destinationData = destination.To16() + bitlen = 128 + } + msg := &nl.RtMsg{} + msg.Family = uint8(family) + msg.Dst_len = bitlen + req.AddData(msg) + + rtaDst := nl.NewRtAttr(syscall.RTA_DST, destinationData) + req.AddData(rtaDst) + + msgs, err := req.Execute(syscall.NETLINK_ROUTE, syscall.RTM_NEWROUTE) + if err != nil { + return nil, err + } + + var res []Route + for _, m := range msgs { + route, err := deserializeRoute(m) + if err != nil { + return nil, err + } + res = append(res, route) + } + return res, nil + +} + +// RouteSubscribe takes a chan down which notifications will be sent +// when routes are added or deleted. Close the 'done' chan to stop subscription. +func RouteSubscribe(ch chan<- RouteUpdate, done <-chan struct{}) error { + return routeSubscribeAt(netns.None(), netns.None(), ch, done) +} + +// RouteSubscribeAt works like RouteSubscribe plus it allows the caller +// to choose the network namespace in which to subscribe (ns). +func RouteSubscribeAt(ns netns.NsHandle, ch chan<- RouteUpdate, done <-chan struct{}) error { + return routeSubscribeAt(ns, netns.None(), ch, done) +} + +func routeSubscribeAt(newNs, curNs netns.NsHandle, ch chan<- RouteUpdate, done <-chan struct{}) error { + s, err := nl.SubscribeAt(newNs, curNs, syscall.NETLINK_ROUTE, syscall.RTNLGRP_IPV4_ROUTE, syscall.RTNLGRP_IPV6_ROUTE) + if err != nil { + return err + } + if done != nil { + go func() { + <-done + s.Close() + }() + } + go func() { + defer close(ch) + for { + msgs, err := s.Receive() + if err != nil { + return + } + for _, m := range msgs { + route, err := deserializeRoute(m.Data) + if err != nil { + return + } + ch <- RouteUpdate{Type: m.Header.Type, Route: route} + } + } + }() + + return nil +} diff --git a/vendor/github.com/vishvananda/netlink/route_unspecified.go b/vendor/github.com/vishvananda/netlink/route_unspecified.go new file mode 100644 index 00000000..2701862b --- /dev/null +++ b/vendor/github.com/vishvananda/netlink/route_unspecified.go @@ -0,0 +1,11 @@ +// +build !linux + +package netlink + +func (r *Route) ListFlags() []string { + return []string{} +} + +func (n *NexthopInfo) ListFlags() []string { + return []string{} +} diff --git a/vendor/github.com/vishvananda/netlink/rule.go b/vendor/github.com/vishvananda/netlink/rule.go new file mode 100644 index 00000000..f0243def --- /dev/null +++ b/vendor/github.com/vishvananda/netlink/rule.go @@ -0,0 +1,40 @@ +package netlink + +import ( + "fmt" + "net" +) + +// Rule represents a netlink rule. +type Rule struct { + Priority int + Table int + Mark int + Mask int + TunID uint + Goto int + Src *net.IPNet + Dst *net.IPNet + Flow int + IifName string + OifName string + SuppressIfgroup int + SuppressPrefixlen int +} + +func (r Rule) String() string { + return fmt.Sprintf("ip rule %d: from %s table %d", r.Priority, r.Src, r.Table) +} + +// NewRule return empty rules. +func NewRule() *Rule { + return &Rule{ + SuppressIfgroup: -1, + SuppressPrefixlen: -1, + Priority: -1, + Mark: -1, + Mask: -1, + Goto: -1, + Flow: -1, + } +} diff --git a/vendor/github.com/vishvananda/netlink/rule_linux.go b/vendor/github.com/vishvananda/netlink/rule_linux.go new file mode 100644 index 00000000..f9cdc855 --- /dev/null +++ b/vendor/github.com/vishvananda/netlink/rule_linux.go @@ -0,0 +1,221 @@ +package netlink + +import ( + "fmt" + "net" + "syscall" + + "github.com/vishvananda/netlink/nl" +) + +// RuleAdd adds a rule to the system. +// Equivalent to: ip rule add +func RuleAdd(rule *Rule) error { + return pkgHandle.RuleAdd(rule) +} + +// RuleAdd adds a rule to the system. +// Equivalent to: ip rule add +func (h *Handle) RuleAdd(rule *Rule) error { + req := h.newNetlinkRequest(syscall.RTM_NEWRULE, syscall.NLM_F_CREATE|syscall.NLM_F_EXCL|syscall.NLM_F_ACK) + return ruleHandle(rule, req) +} + +// RuleDel deletes a rule from the system. +// Equivalent to: ip rule del +func RuleDel(rule *Rule) error { + return pkgHandle.RuleDel(rule) +} + +// RuleDel deletes a rule from the system. +// Equivalent to: ip rule del +func (h *Handle) RuleDel(rule *Rule) error { + req := h.newNetlinkRequest(syscall.RTM_DELRULE, syscall.NLM_F_CREATE|syscall.NLM_F_EXCL|syscall.NLM_F_ACK) + return ruleHandle(rule, req) +} + +func ruleHandle(rule *Rule, req *nl.NetlinkRequest) error { + msg := nl.NewRtMsg() + msg.Family = syscall.AF_INET + var dstFamily uint8 + + var rtAttrs []*nl.RtAttr + if rule.Dst != nil && rule.Dst.IP != nil { + dstLen, _ := rule.Dst.Mask.Size() + msg.Dst_len = uint8(dstLen) + msg.Family = uint8(nl.GetIPFamily(rule.Dst.IP)) + dstFamily = msg.Family + var dstData []byte + if msg.Family == syscall.AF_INET { + dstData = rule.Dst.IP.To4() + } else { + dstData = rule.Dst.IP.To16() + } + rtAttrs = append(rtAttrs, nl.NewRtAttr(syscall.RTA_DST, dstData)) + } + + if rule.Src != nil && rule.Src.IP != nil { + msg.Family = uint8(nl.GetIPFamily(rule.Src.IP)) + if dstFamily != 0 && dstFamily != msg.Family { + return fmt.Errorf("source and destination ip are not the same IP family") + } + srcLen, _ := rule.Src.Mask.Size() + msg.Src_len = uint8(srcLen) + var srcData []byte + if msg.Family == syscall.AF_INET { + srcData = rule.Src.IP.To4() + } else { + srcData = rule.Src.IP.To16() + } + rtAttrs = append(rtAttrs, nl.NewRtAttr(syscall.RTA_SRC, srcData)) + } + + if rule.Table >= 0 { + msg.Table = uint8(rule.Table) + if rule.Table >= 256 { + msg.Table = syscall.RT_TABLE_UNSPEC + } + } + + req.AddData(msg) + for i := range rtAttrs { + req.AddData(rtAttrs[i]) + } + + native := nl.NativeEndian() + + if rule.Priority >= 0 { + b := make([]byte, 4) + native.PutUint32(b, uint32(rule.Priority)) + req.AddData(nl.NewRtAttr(nl.FRA_PRIORITY, b)) + } + if rule.Mark >= 0 { + b := make([]byte, 4) + native.PutUint32(b, uint32(rule.Mark)) + req.AddData(nl.NewRtAttr(nl.FRA_FWMARK, b)) + } + if rule.Mask >= 0 { + b := make([]byte, 4) + native.PutUint32(b, uint32(rule.Mask)) + req.AddData(nl.NewRtAttr(nl.FRA_FWMASK, b)) + } + if rule.Flow >= 0 { + b := make([]byte, 4) + native.PutUint32(b, uint32(rule.Flow)) + req.AddData(nl.NewRtAttr(nl.FRA_FLOW, b)) + } + if rule.TunID > 0 { + b := make([]byte, 4) + native.PutUint32(b, uint32(rule.TunID)) + req.AddData(nl.NewRtAttr(nl.FRA_TUN_ID, b)) + } + if rule.Table >= 256 { + b := make([]byte, 4) + native.PutUint32(b, uint32(rule.Table)) + req.AddData(nl.NewRtAttr(nl.FRA_TABLE, b)) + } + if msg.Table > 0 { + if rule.SuppressPrefixlen >= 0 { + b := make([]byte, 4) + native.PutUint32(b, uint32(rule.SuppressPrefixlen)) + req.AddData(nl.NewRtAttr(nl.FRA_SUPPRESS_PREFIXLEN, b)) + } + if rule.SuppressIfgroup >= 0 { + b := make([]byte, 4) + native.PutUint32(b, uint32(rule.SuppressIfgroup)) + req.AddData(nl.NewRtAttr(nl.FRA_SUPPRESS_IFGROUP, b)) + } + } + if rule.IifName != "" { + req.AddData(nl.NewRtAttr(nl.FRA_IIFNAME, []byte(rule.IifName))) + } + if rule.OifName != "" { + req.AddData(nl.NewRtAttr(nl.FRA_OIFNAME, []byte(rule.OifName))) + } + if rule.Goto >= 0 { + msg.Type = nl.FR_ACT_NOP + b := make([]byte, 4) + native.PutUint32(b, uint32(rule.Goto)) + req.AddData(nl.NewRtAttr(nl.FRA_GOTO, b)) + } + + _, err := req.Execute(syscall.NETLINK_ROUTE, 0) + return err +} + +// RuleList lists rules in the system. +// Equivalent to: ip rule list +func RuleList(family int) ([]Rule, error) { + return pkgHandle.RuleList(family) +} + +// RuleList lists rules in the system. +// Equivalent to: ip rule list +func (h *Handle) RuleList(family int) ([]Rule, error) { + req := h.newNetlinkRequest(syscall.RTM_GETRULE, syscall.NLM_F_DUMP|syscall.NLM_F_REQUEST) + msg := nl.NewIfInfomsg(family) + req.AddData(msg) + + msgs, err := req.Execute(syscall.NETLINK_ROUTE, syscall.RTM_NEWRULE) + if err != nil { + return nil, err + } + + native := nl.NativeEndian() + var res = make([]Rule, 0) + for i := range msgs { + msg := nl.DeserializeRtMsg(msgs[i]) + attrs, err := nl.ParseRouteAttr(msgs[i][msg.Len():]) + if err != nil { + return nil, err + } + + rule := NewRule() + + for j := range attrs { + switch attrs[j].Attr.Type { + case syscall.RTA_TABLE: + rule.Table = int(native.Uint32(attrs[j].Value[0:4])) + case nl.FRA_SRC: + rule.Src = &net.IPNet{ + IP: attrs[j].Value, + Mask: net.CIDRMask(int(msg.Src_len), 8*len(attrs[j].Value)), + } + case nl.FRA_DST: + rule.Dst = &net.IPNet{ + IP: attrs[j].Value, + Mask: net.CIDRMask(int(msg.Dst_len), 8*len(attrs[j].Value)), + } + case nl.FRA_FWMARK: + rule.Mark = int(native.Uint32(attrs[j].Value[0:4])) + case nl.FRA_FWMASK: + rule.Mask = int(native.Uint32(attrs[j].Value[0:4])) + case nl.FRA_TUN_ID: + rule.TunID = uint(native.Uint64(attrs[j].Value[0:4])) + case nl.FRA_IIFNAME: + rule.IifName = string(attrs[j].Value[:len(attrs[j].Value)-1]) + case nl.FRA_OIFNAME: + rule.OifName = string(attrs[j].Value[:len(attrs[j].Value)-1]) + case nl.FRA_SUPPRESS_PREFIXLEN: + i := native.Uint32(attrs[j].Value[0:4]) + if i != 0xffffffff { + rule.SuppressPrefixlen = int(i) + } + case nl.FRA_SUPPRESS_IFGROUP: + i := native.Uint32(attrs[j].Value[0:4]) + if i != 0xffffffff { + rule.SuppressIfgroup = int(i) + } + case nl.FRA_FLOW: + rule.Flow = int(native.Uint32(attrs[j].Value[0:4])) + case nl.FRA_GOTO: + rule.Goto = int(native.Uint32(attrs[j].Value[0:4])) + case nl.FRA_PRIORITY: + rule.Priority = int(native.Uint32(attrs[j].Value[0:4])) + } + } + res = append(res, *rule) + } + + return res, nil +} diff --git a/vendor/github.com/vishvananda/netlink/socket.go b/vendor/github.com/vishvananda/netlink/socket.go new file mode 100644 index 00000000..41aa7262 --- /dev/null +++ b/vendor/github.com/vishvananda/netlink/socket.go @@ -0,0 +1,27 @@ +package netlink + +import "net" + +// SocketID identifies a single socket. +type SocketID struct { + SourcePort uint16 + DestinationPort uint16 + Source net.IP + Destination net.IP + Interface uint32 + Cookie [2]uint32 +} + +// Socket represents a netlink socket. +type Socket struct { + Family uint8 + State uint8 + Timer uint8 + Retrans uint8 + ID SocketID + Expires uint32 + RQueue uint32 + WQueue uint32 + UID uint32 + INode uint32 +} diff --git a/vendor/github.com/vishvananda/netlink/socket_linux.go b/vendor/github.com/vishvananda/netlink/socket_linux.go new file mode 100644 index 00000000..b42b84f0 --- /dev/null +++ b/vendor/github.com/vishvananda/netlink/socket_linux.go @@ -0,0 +1,159 @@ +package netlink + +import ( + "errors" + "fmt" + "net" + "syscall" + + "github.com/vishvananda/netlink/nl" +) + +const ( + sizeofSocketID = 0x30 + sizeofSocketRequest = sizeofSocketID + 0x8 + sizeofSocket = sizeofSocketID + 0x18 +) + +type socketRequest struct { + Family uint8 + Protocol uint8 + Ext uint8 + pad uint8 + States uint32 + ID SocketID +} + +type writeBuffer struct { + Bytes []byte + pos int +} + +func (b *writeBuffer) Write(c byte) { + b.Bytes[b.pos] = c + b.pos++ +} + +func (b *writeBuffer) Next(n int) []byte { + s := b.Bytes[b.pos : b.pos+n] + b.pos += n + return s +} + +func (r *socketRequest) Serialize() []byte { + b := writeBuffer{Bytes: make([]byte, sizeofSocketRequest)} + b.Write(r.Family) + b.Write(r.Protocol) + b.Write(r.Ext) + b.Write(r.pad) + native.PutUint32(b.Next(4), r.States) + networkOrder.PutUint16(b.Next(2), r.ID.SourcePort) + networkOrder.PutUint16(b.Next(2), r.ID.DestinationPort) + copy(b.Next(4), r.ID.Source.To4()) + b.Next(12) + copy(b.Next(4), r.ID.Destination.To4()) + b.Next(12) + native.PutUint32(b.Next(4), r.ID.Interface) + native.PutUint32(b.Next(4), r.ID.Cookie[0]) + native.PutUint32(b.Next(4), r.ID.Cookie[1]) + return b.Bytes +} + +func (r *socketRequest) Len() int { return sizeofSocketRequest } + +type readBuffer struct { + Bytes []byte + pos int +} + +func (b *readBuffer) Read() byte { + c := b.Bytes[b.pos] + b.pos++ + return c +} + +func (b *readBuffer) Next(n int) []byte { + s := b.Bytes[b.pos : b.pos+n] + b.pos += n + return s +} + +func (s *Socket) deserialize(b []byte) error { + if len(b) < sizeofSocket { + return fmt.Errorf("socket data short read (%d); want %d", len(b), sizeofSocket) + } + rb := readBuffer{Bytes: b} + s.Family = rb.Read() + s.State = rb.Read() + s.Timer = rb.Read() + s.Retrans = rb.Read() + s.ID.SourcePort = networkOrder.Uint16(rb.Next(2)) + s.ID.DestinationPort = networkOrder.Uint16(rb.Next(2)) + s.ID.Source = net.IPv4(rb.Read(), rb.Read(), rb.Read(), rb.Read()) + rb.Next(12) + s.ID.Destination = net.IPv4(rb.Read(), rb.Read(), rb.Read(), rb.Read()) + rb.Next(12) + s.ID.Interface = native.Uint32(rb.Next(4)) + s.ID.Cookie[0] = native.Uint32(rb.Next(4)) + s.ID.Cookie[1] = native.Uint32(rb.Next(4)) + s.Expires = native.Uint32(rb.Next(4)) + s.RQueue = native.Uint32(rb.Next(4)) + s.WQueue = native.Uint32(rb.Next(4)) + s.UID = native.Uint32(rb.Next(4)) + s.INode = native.Uint32(rb.Next(4)) + return nil +} + +// SocketGet returns the Socket identified by its local and remote addresses. +func SocketGet(local, remote net.Addr) (*Socket, error) { + localTCP, ok := local.(*net.TCPAddr) + if !ok { + return nil, ErrNotImplemented + } + remoteTCP, ok := remote.(*net.TCPAddr) + if !ok { + return nil, ErrNotImplemented + } + localIP := localTCP.IP.To4() + if localIP == nil { + return nil, ErrNotImplemented + } + remoteIP := remoteTCP.IP.To4() + if remoteIP == nil { + return nil, ErrNotImplemented + } + + s, err := nl.Subscribe(syscall.NETLINK_INET_DIAG) + if err != nil { + return nil, err + } + defer s.Close() + req := nl.NewNetlinkRequest(nl.SOCK_DIAG_BY_FAMILY, 0) + req.AddData(&socketRequest{ + Family: syscall.AF_INET, + Protocol: syscall.IPPROTO_TCP, + ID: SocketID{ + SourcePort: uint16(localTCP.Port), + DestinationPort: uint16(remoteTCP.Port), + Source: localIP, + Destination: remoteIP, + Cookie: [2]uint32{nl.TCPDIAG_NOCOOKIE, nl.TCPDIAG_NOCOOKIE}, + }, + }) + s.Send(req) + msgs, err := s.Receive() + if err != nil { + return nil, err + } + if len(msgs) == 0 { + return nil, errors.New("no message nor error from netlink") + } + if len(msgs) > 2 { + return nil, fmt.Errorf("multiple (%d) matching sockets", len(msgs)) + } + sock := &Socket{} + if err := sock.deserialize(msgs[0].Data); err != nil { + return nil, err + } + return sock, nil +} diff --git a/vendor/github.com/vishvananda/netlink/xfrm.go b/vendor/github.com/vishvananda/netlink/xfrm.go new file mode 100644 index 00000000..9962dcf7 --- /dev/null +++ b/vendor/github.com/vishvananda/netlink/xfrm.go @@ -0,0 +1,74 @@ +package netlink + +import ( + "fmt" + "syscall" +) + +// Proto is an enum representing an ipsec protocol. +type Proto uint8 + +const ( + XFRM_PROTO_ROUTE2 Proto = syscall.IPPROTO_ROUTING + XFRM_PROTO_ESP Proto = syscall.IPPROTO_ESP + XFRM_PROTO_AH Proto = syscall.IPPROTO_AH + XFRM_PROTO_HAO Proto = syscall.IPPROTO_DSTOPTS + XFRM_PROTO_COMP Proto = 0x6c // NOTE not defined on darwin + XFRM_PROTO_IPSEC_ANY Proto = syscall.IPPROTO_RAW +) + +func (p Proto) String() string { + switch p { + case XFRM_PROTO_ROUTE2: + return "route2" + case XFRM_PROTO_ESP: + return "esp" + case XFRM_PROTO_AH: + return "ah" + case XFRM_PROTO_HAO: + return "hao" + case XFRM_PROTO_COMP: + return "comp" + case XFRM_PROTO_IPSEC_ANY: + return "ipsec-any" + } + return fmt.Sprintf("%d", p) +} + +// Mode is an enum representing an ipsec transport. +type Mode uint8 + +const ( + XFRM_MODE_TRANSPORT Mode = iota + XFRM_MODE_TUNNEL + XFRM_MODE_ROUTEOPTIMIZATION + XFRM_MODE_IN_TRIGGER + XFRM_MODE_BEET + XFRM_MODE_MAX +) + +func (m Mode) String() string { + switch m { + case XFRM_MODE_TRANSPORT: + return "transport" + case XFRM_MODE_TUNNEL: + return "tunnel" + case XFRM_MODE_ROUTEOPTIMIZATION: + return "ro" + case XFRM_MODE_IN_TRIGGER: + return "in_trigger" + case XFRM_MODE_BEET: + return "beet" + } + return fmt.Sprintf("%d", m) +} + +// XfrmMark represents the mark associated to the state or policy +type XfrmMark struct { + Value uint32 + Mask uint32 +} + +func (m *XfrmMark) String() string { + return fmt.Sprintf("(0x%x,0x%x)", m.Value, m.Mask) +} diff --git a/vendor/github.com/vishvananda/netlink/xfrm_monitor_linux.go b/vendor/github.com/vishvananda/netlink/xfrm_monitor_linux.go new file mode 100644 index 00000000..7b98c9cb --- /dev/null +++ b/vendor/github.com/vishvananda/netlink/xfrm_monitor_linux.go @@ -0,0 +1,98 @@ +package netlink + +import ( + "fmt" + "syscall" + + "github.com/vishvananda/netns" + + "github.com/vishvananda/netlink/nl" +) + +type XfrmMsg interface { + Type() nl.XfrmMsgType +} + +type XfrmMsgExpire struct { + XfrmState *XfrmState + Hard bool +} + +func (ue *XfrmMsgExpire) Type() nl.XfrmMsgType { + return nl.XFRM_MSG_EXPIRE +} + +func parseXfrmMsgExpire(b []byte) *XfrmMsgExpire { + var e XfrmMsgExpire + + msg := nl.DeserializeXfrmUserExpire(b) + e.XfrmState = xfrmStateFromXfrmUsersaInfo(&msg.XfrmUsersaInfo) + e.Hard = msg.Hard == 1 + + return &e +} + +func XfrmMonitor(ch chan<- XfrmMsg, done <-chan struct{}, errorChan chan<- error, + types ...nl.XfrmMsgType) error { + + groups, err := xfrmMcastGroups(types) + if err != nil { + return nil + } + s, err := nl.SubscribeAt(netns.None(), netns.None(), syscall.NETLINK_XFRM, groups...) + if err != nil { + return err + } + + if done != nil { + go func() { + <-done + s.Close() + }() + + } + + go func() { + defer close(ch) + for { + msgs, err := s.Receive() + if err != nil { + errorChan <- err + return + } + for _, m := range msgs { + switch m.Header.Type { + case nl.XFRM_MSG_EXPIRE: + ch <- parseXfrmMsgExpire(m.Data) + default: + errorChan <- fmt.Errorf("unsupported msg type: %x", m.Header.Type) + } + } + } + }() + + return nil +} + +func xfrmMcastGroups(types []nl.XfrmMsgType) ([]uint, error) { + groups := make([]uint, 0) + + if len(types) == 0 { + return nil, fmt.Errorf("no xfrm msg type specified") + } + + for _, t := range types { + var group uint + + switch t { + case nl.XFRM_MSG_EXPIRE: + group = nl.XFRMNLGRP_EXPIRE + default: + return nil, fmt.Errorf("unsupported group: %x", t) + } + + groups = append(groups, group) + } + + return groups, nil +} diff --git a/vendor/github.com/vishvananda/netlink/xfrm_policy.go b/vendor/github.com/vishvananda/netlink/xfrm_policy.go new file mode 100644 index 00000000..c97ec43a --- /dev/null +++ b/vendor/github.com/vishvananda/netlink/xfrm_policy.go @@ -0,0 +1,74 @@ +package netlink + +import ( + "fmt" + "net" +) + +// Dir is an enum representing an ipsec template direction. +type Dir uint8 + +const ( + XFRM_DIR_IN Dir = iota + XFRM_DIR_OUT + XFRM_DIR_FWD + XFRM_SOCKET_IN + XFRM_SOCKET_OUT + XFRM_SOCKET_FWD +) + +func (d Dir) String() string { + switch d { + case XFRM_DIR_IN: + return "dir in" + case XFRM_DIR_OUT: + return "dir out" + case XFRM_DIR_FWD: + return "dir fwd" + case XFRM_SOCKET_IN: + return "socket in" + case XFRM_SOCKET_OUT: + return "socket out" + case XFRM_SOCKET_FWD: + return "socket fwd" + } + return fmt.Sprintf("socket %d", d-XFRM_SOCKET_IN) +} + +// XfrmPolicyTmpl encapsulates a rule for the base addresses of an ipsec +// policy. These rules are matched with XfrmState to determine encryption +// and authentication algorithms. +type XfrmPolicyTmpl struct { + Dst net.IP + Src net.IP + Proto Proto + Mode Mode + Spi int + Reqid int +} + +func (t XfrmPolicyTmpl) String() string { + return fmt.Sprintf("{Dst: %v, Src: %v, Proto: %s, Mode: %s, Spi: 0x%x, Reqid: 0x%x}", + t.Dst, t.Src, t.Proto, t.Mode, t.Spi, t.Reqid) +} + +// XfrmPolicy represents an ipsec policy. It represents the overlay network +// and has a list of XfrmPolicyTmpls representing the base addresses of +// the policy. +type XfrmPolicy struct { + Dst *net.IPNet + Src *net.IPNet + Proto Proto + DstPort int + SrcPort int + Dir Dir + Priority int + Index int + Mark *XfrmMark + Tmpls []XfrmPolicyTmpl +} + +func (p XfrmPolicy) String() string { + return fmt.Sprintf("{Dst: %v, Src: %v, Proto: %s, DstPort: %d, SrcPort: %d, Dir: %s, Priority: %d, Index: %d, Mark: %s, Tmpls: %s}", + p.Dst, p.Src, p.Proto, p.DstPort, p.SrcPort, p.Dir, p.Priority, p.Index, p.Mark, p.Tmpls) +} diff --git a/vendor/github.com/vishvananda/netlink/xfrm_policy_linux.go b/vendor/github.com/vishvananda/netlink/xfrm_policy_linux.go new file mode 100644 index 00000000..c3d4e422 --- /dev/null +++ b/vendor/github.com/vishvananda/netlink/xfrm_policy_linux.go @@ -0,0 +1,257 @@ +package netlink + +import ( + "syscall" + + "github.com/vishvananda/netlink/nl" +) + +func selFromPolicy(sel *nl.XfrmSelector, policy *XfrmPolicy) { + sel.Family = uint16(nl.FAMILY_V4) + if policy.Dst != nil { + sel.Family = uint16(nl.GetIPFamily(policy.Dst.IP)) + sel.Daddr.FromIP(policy.Dst.IP) + prefixlenD, _ := policy.Dst.Mask.Size() + sel.PrefixlenD = uint8(prefixlenD) + } + if policy.Src != nil { + sel.Saddr.FromIP(policy.Src.IP) + prefixlenS, _ := policy.Src.Mask.Size() + sel.PrefixlenS = uint8(prefixlenS) + } + sel.Proto = uint8(policy.Proto) + sel.Dport = nl.Swap16(uint16(policy.DstPort)) + sel.Sport = nl.Swap16(uint16(policy.SrcPort)) + if sel.Dport != 0 { + sel.DportMask = ^uint16(0) + } + if sel.Sport != 0 { + sel.SportMask = ^uint16(0) + } +} + +// XfrmPolicyAdd will add an xfrm policy to the system. +// Equivalent to: `ip xfrm policy add $policy` +func XfrmPolicyAdd(policy *XfrmPolicy) error { + return pkgHandle.XfrmPolicyAdd(policy) +} + +// XfrmPolicyAdd will add an xfrm policy to the system. +// Equivalent to: `ip xfrm policy add $policy` +func (h *Handle) XfrmPolicyAdd(policy *XfrmPolicy) error { + return h.xfrmPolicyAddOrUpdate(policy, nl.XFRM_MSG_NEWPOLICY) +} + +// XfrmPolicyUpdate will update an xfrm policy to the system. +// Equivalent to: `ip xfrm policy update $policy` +func XfrmPolicyUpdate(policy *XfrmPolicy) error { + return pkgHandle.XfrmPolicyUpdate(policy) +} + +// XfrmPolicyUpdate will update an xfrm policy to the system. +// Equivalent to: `ip xfrm policy update $policy` +func (h *Handle) XfrmPolicyUpdate(policy *XfrmPolicy) error { + return h.xfrmPolicyAddOrUpdate(policy, nl.XFRM_MSG_UPDPOLICY) +} + +func (h *Handle) xfrmPolicyAddOrUpdate(policy *XfrmPolicy, nlProto int) error { + req := h.newNetlinkRequest(nlProto, syscall.NLM_F_CREATE|syscall.NLM_F_EXCL|syscall.NLM_F_ACK) + + msg := &nl.XfrmUserpolicyInfo{} + selFromPolicy(&msg.Sel, policy) + msg.Priority = uint32(policy.Priority) + msg.Index = uint32(policy.Index) + msg.Dir = uint8(policy.Dir) + msg.Lft.SoftByteLimit = nl.XFRM_INF + msg.Lft.HardByteLimit = nl.XFRM_INF + msg.Lft.SoftPacketLimit = nl.XFRM_INF + msg.Lft.HardPacketLimit = nl.XFRM_INF + req.AddData(msg) + + tmplData := make([]byte, nl.SizeofXfrmUserTmpl*len(policy.Tmpls)) + for i, tmpl := range policy.Tmpls { + start := i * nl.SizeofXfrmUserTmpl + userTmpl := nl.DeserializeXfrmUserTmpl(tmplData[start : start+nl.SizeofXfrmUserTmpl]) + userTmpl.XfrmId.Daddr.FromIP(tmpl.Dst) + userTmpl.Saddr.FromIP(tmpl.Src) + userTmpl.XfrmId.Proto = uint8(tmpl.Proto) + userTmpl.XfrmId.Spi = nl.Swap32(uint32(tmpl.Spi)) + userTmpl.Mode = uint8(tmpl.Mode) + userTmpl.Reqid = uint32(tmpl.Reqid) + userTmpl.Aalgos = ^uint32(0) + userTmpl.Ealgos = ^uint32(0) + userTmpl.Calgos = ^uint32(0) + } + if len(tmplData) > 0 { + tmpls := nl.NewRtAttr(nl.XFRMA_TMPL, tmplData) + req.AddData(tmpls) + } + if policy.Mark != nil { + out := nl.NewRtAttr(nl.XFRMA_MARK, writeMark(policy.Mark)) + req.AddData(out) + } + + _, err := req.Execute(syscall.NETLINK_XFRM, 0) + return err +} + +// XfrmPolicyDel will delete an xfrm policy from the system. Note that +// the Tmpls are ignored when matching the policy to delete. +// Equivalent to: `ip xfrm policy del $policy` +func XfrmPolicyDel(policy *XfrmPolicy) error { + return pkgHandle.XfrmPolicyDel(policy) +} + +// XfrmPolicyDel will delete an xfrm policy from the system. Note that +// the Tmpls are ignored when matching the policy to delete. +// Equivalent to: `ip xfrm policy del $policy` +func (h *Handle) XfrmPolicyDel(policy *XfrmPolicy) error { + _, err := h.xfrmPolicyGetOrDelete(policy, nl.XFRM_MSG_DELPOLICY) + return err +} + +// XfrmPolicyList gets a list of xfrm policies in the system. +// Equivalent to: `ip xfrm policy show`. +// The list can be filtered by ip family. +func XfrmPolicyList(family int) ([]XfrmPolicy, error) { + return pkgHandle.XfrmPolicyList(family) +} + +// XfrmPolicyList gets a list of xfrm policies in the system. +// Equivalent to: `ip xfrm policy show`. +// The list can be filtered by ip family. +func (h *Handle) XfrmPolicyList(family int) ([]XfrmPolicy, error) { + req := h.newNetlinkRequest(nl.XFRM_MSG_GETPOLICY, syscall.NLM_F_DUMP) + + msg := nl.NewIfInfomsg(family) + req.AddData(msg) + + msgs, err := req.Execute(syscall.NETLINK_XFRM, nl.XFRM_MSG_NEWPOLICY) + if err != nil { + return nil, err + } + + var res []XfrmPolicy + for _, m := range msgs { + if policy, err := parseXfrmPolicy(m, family); err == nil { + res = append(res, *policy) + } else if err == familyError { + continue + } else { + return nil, err + } + } + return res, nil +} + +// XfrmPolicyGet gets a the policy described by the index or selector, if found. +// Equivalent to: `ip xfrm policy get { SELECTOR | index INDEX } dir DIR [ctx CTX ] [ mark MARK [ mask MASK ] ] [ ptype PTYPE ]`. +func XfrmPolicyGet(policy *XfrmPolicy) (*XfrmPolicy, error) { + return pkgHandle.XfrmPolicyGet(policy) +} + +// XfrmPolicyGet gets a the policy described by the index or selector, if found. +// Equivalent to: `ip xfrm policy get { SELECTOR | index INDEX } dir DIR [ctx CTX ] [ mark MARK [ mask MASK ] ] [ ptype PTYPE ]`. +func (h *Handle) XfrmPolicyGet(policy *XfrmPolicy) (*XfrmPolicy, error) { + return h.xfrmPolicyGetOrDelete(policy, nl.XFRM_MSG_GETPOLICY) +} + +// XfrmPolicyFlush will flush the policies on the system. +// Equivalent to: `ip xfrm policy flush` +func XfrmPolicyFlush() error { + return pkgHandle.XfrmPolicyFlush() +} + +// XfrmPolicyFlush will flush the policies on the system. +// Equivalent to: `ip xfrm policy flush` +func (h *Handle) XfrmPolicyFlush() error { + req := h.newNetlinkRequest(nl.XFRM_MSG_FLUSHPOLICY, syscall.NLM_F_ACK) + _, err := req.Execute(syscall.NETLINK_XFRM, 0) + return err +} + +func (h *Handle) xfrmPolicyGetOrDelete(policy *XfrmPolicy, nlProto int) (*XfrmPolicy, error) { + req := h.newNetlinkRequest(nlProto, syscall.NLM_F_ACK) + + msg := &nl.XfrmUserpolicyId{} + selFromPolicy(&msg.Sel, policy) + msg.Index = uint32(policy.Index) + msg.Dir = uint8(policy.Dir) + req.AddData(msg) + + if policy.Mark != nil { + out := nl.NewRtAttr(nl.XFRMA_MARK, writeMark(policy.Mark)) + req.AddData(out) + } + + resType := nl.XFRM_MSG_NEWPOLICY + if nlProto == nl.XFRM_MSG_DELPOLICY { + resType = 0 + } + + msgs, err := req.Execute(syscall.NETLINK_XFRM, uint16(resType)) + if err != nil { + return nil, err + } + + if nlProto == nl.XFRM_MSG_DELPOLICY { + return nil, err + } + + p, err := parseXfrmPolicy(msgs[0], FAMILY_ALL) + if err != nil { + return nil, err + } + + return p, nil +} + +func parseXfrmPolicy(m []byte, family int) (*XfrmPolicy, error) { + msg := nl.DeserializeXfrmUserpolicyInfo(m) + + // This is mainly for the policy dump + if family != FAMILY_ALL && family != int(msg.Sel.Family) { + return nil, familyError + } + + var policy XfrmPolicy + + policy.Dst = msg.Sel.Daddr.ToIPNet(msg.Sel.PrefixlenD) + policy.Src = msg.Sel.Saddr.ToIPNet(msg.Sel.PrefixlenS) + policy.Proto = Proto(msg.Sel.Proto) + policy.DstPort = int(nl.Swap16(msg.Sel.Dport)) + policy.SrcPort = int(nl.Swap16(msg.Sel.Sport)) + policy.Priority = int(msg.Priority) + policy.Index = int(msg.Index) + policy.Dir = Dir(msg.Dir) + + attrs, err := nl.ParseRouteAttr(m[msg.Len():]) + if err != nil { + return nil, err + } + + for _, attr := range attrs { + switch attr.Attr.Type { + case nl.XFRMA_TMPL: + max := len(attr.Value) + for i := 0; i < max; i += nl.SizeofXfrmUserTmpl { + var resTmpl XfrmPolicyTmpl + tmpl := nl.DeserializeXfrmUserTmpl(attr.Value[i : i+nl.SizeofXfrmUserTmpl]) + resTmpl.Dst = tmpl.XfrmId.Daddr.ToIP() + resTmpl.Src = tmpl.Saddr.ToIP() + resTmpl.Proto = Proto(tmpl.XfrmId.Proto) + resTmpl.Mode = Mode(tmpl.Mode) + resTmpl.Spi = int(nl.Swap32(tmpl.XfrmId.Spi)) + resTmpl.Reqid = int(tmpl.Reqid) + policy.Tmpls = append(policy.Tmpls, resTmpl) + } + case nl.XFRMA_MARK: + mark := nl.DeserializeXfrmMark(attr.Value[:]) + policy.Mark = new(XfrmMark) + policy.Mark.Value = mark.Value + policy.Mark.Mask = mark.Mask + } + } + + return &policy, nil +} diff --git a/vendor/github.com/vishvananda/netlink/xfrm_state.go b/vendor/github.com/vishvananda/netlink/xfrm_state.go new file mode 100644 index 00000000..368a9b98 --- /dev/null +++ b/vendor/github.com/vishvananda/netlink/xfrm_state.go @@ -0,0 +1,108 @@ +package netlink + +import ( + "fmt" + "net" +) + +// XfrmStateAlgo represents the algorithm to use for the ipsec encryption. +type XfrmStateAlgo struct { + Name string + Key []byte + TruncateLen int // Auth only + ICVLen int // AEAD only +} + +func (a XfrmStateAlgo) String() string { + base := fmt.Sprintf("{Name: %s, Key: 0x%x", a.Name, a.Key) + if a.TruncateLen != 0 { + base = fmt.Sprintf("%s, Truncate length: %d", base, a.TruncateLen) + } + if a.ICVLen != 0 { + base = fmt.Sprintf("%s, ICV length: %d", base, a.ICVLen) + } + return fmt.Sprintf("%s}", base) +} + +// EncapType is an enum representing the optional packet encapsulation. +type EncapType uint8 + +const ( + XFRM_ENCAP_ESPINUDP_NONIKE EncapType = iota + 1 + XFRM_ENCAP_ESPINUDP +) + +func (e EncapType) String() string { + switch e { + case XFRM_ENCAP_ESPINUDP_NONIKE: + return "espinudp-non-ike" + case XFRM_ENCAP_ESPINUDP: + return "espinudp" + } + return "unknown" +} + +// XfrmStateEncap represents the encapsulation to use for the ipsec encryption. +type XfrmStateEncap struct { + Type EncapType + SrcPort int + DstPort int + OriginalAddress net.IP +} + +func (e XfrmStateEncap) String() string { + return fmt.Sprintf("{Type: %s, Srcport: %d, DstPort: %d, OriginalAddress: %v}", + e.Type, e.SrcPort, e.DstPort, e.OriginalAddress) +} + +// XfrmStateLimits represents the configured limits for the state. +type XfrmStateLimits struct { + ByteSoft uint64 + ByteHard uint64 + PacketSoft uint64 + PacketHard uint64 + TimeSoft uint64 + TimeHard uint64 + TimeUseSoft uint64 + TimeUseHard uint64 +} + +// XfrmState represents the state of an ipsec policy. It optionally +// contains an XfrmStateAlgo for encryption and one for authentication. +type XfrmState struct { + Dst net.IP + Src net.IP + Proto Proto + Mode Mode + Spi int + Reqid int + ReplayWindow int + Limits XfrmStateLimits + Mark *XfrmMark + Auth *XfrmStateAlgo + Crypt *XfrmStateAlgo + Aead *XfrmStateAlgo + Encap *XfrmStateEncap + ESN bool +} + +func (sa XfrmState) String() string { + return fmt.Sprintf("Dst: %v, Src: %v, Proto: %s, Mode: %s, SPI: 0x%x, ReqID: 0x%x, ReplayWindow: %d, Mark: %v, Auth: %v, Crypt: %v, Aead: %v, Encap: %v, ESN: %t", + sa.Dst, sa.Src, sa.Proto, sa.Mode, sa.Spi, sa.Reqid, sa.ReplayWindow, sa.Mark, sa.Auth, sa.Crypt, sa.Aead, sa.Encap, sa.ESN) +} +func (sa XfrmState) Print(stats bool) string { + if !stats { + return sa.String() + } + + return fmt.Sprintf("%s, ByteSoft: %s, ByteHard: %s, PacketSoft: %s, PacketHard: %s, TimeSoft: %d, TimeHard: %d, TimeUseSoft: %d, TimeUseHard: %d", + sa.String(), printLimit(sa.Limits.ByteSoft), printLimit(sa.Limits.ByteHard), printLimit(sa.Limits.PacketSoft), printLimit(sa.Limits.PacketHard), + sa.Limits.TimeSoft, sa.Limits.TimeHard, sa.Limits.TimeUseSoft, sa.Limits.TimeUseHard) +} + +func printLimit(lmt uint64) string { + if lmt == ^uint64(0) { + return "(INF)" + } + return fmt.Sprintf("%d", lmt) +} diff --git a/vendor/github.com/vishvananda/netlink/xfrm_state_linux.go b/vendor/github.com/vishvananda/netlink/xfrm_state_linux.go new file mode 100644 index 00000000..6a7bc0de --- /dev/null +++ b/vendor/github.com/vishvananda/netlink/xfrm_state_linux.go @@ -0,0 +1,444 @@ +package netlink + +import ( + "fmt" + "syscall" + "unsafe" + + "github.com/vishvananda/netlink/nl" +) + +func writeStateAlgo(a *XfrmStateAlgo) []byte { + algo := nl.XfrmAlgo{ + AlgKeyLen: uint32(len(a.Key) * 8), + AlgKey: a.Key, + } + end := len(a.Name) + if end > 64 { + end = 64 + } + copy(algo.AlgName[:end], a.Name) + return algo.Serialize() +} + +func writeStateAlgoAuth(a *XfrmStateAlgo) []byte { + algo := nl.XfrmAlgoAuth{ + AlgKeyLen: uint32(len(a.Key) * 8), + AlgTruncLen: uint32(a.TruncateLen), + AlgKey: a.Key, + } + end := len(a.Name) + if end > 64 { + end = 64 + } + copy(algo.AlgName[:end], a.Name) + return algo.Serialize() +} + +func writeStateAlgoAead(a *XfrmStateAlgo) []byte { + algo := nl.XfrmAlgoAEAD{ + AlgKeyLen: uint32(len(a.Key) * 8), + AlgICVLen: uint32(a.ICVLen), + AlgKey: a.Key, + } + end := len(a.Name) + if end > 64 { + end = 64 + } + copy(algo.AlgName[:end], a.Name) + return algo.Serialize() +} + +func writeMark(m *XfrmMark) []byte { + mark := &nl.XfrmMark{ + Value: m.Value, + Mask: m.Mask, + } + if mark.Mask == 0 { + mark.Mask = ^uint32(0) + } + return mark.Serialize() +} + +func writeReplayEsn(replayWindow int) []byte { + replayEsn := &nl.XfrmReplayStateEsn{ + OSeq: 0, + Seq: 0, + OSeqHi: 0, + SeqHi: 0, + ReplayWindow: uint32(replayWindow), + } + + // taken from iproute2/ip/xfrm_state.c: + replayEsn.BmpLen = uint32((replayWindow + (4 * 8) - 1) / (4 * 8)) + + return replayEsn.Serialize() +} + +// XfrmStateAdd will add an xfrm state to the system. +// Equivalent to: `ip xfrm state add $state` +func XfrmStateAdd(state *XfrmState) error { + return pkgHandle.XfrmStateAdd(state) +} + +// XfrmStateAdd will add an xfrm state to the system. +// Equivalent to: `ip xfrm state add $state` +func (h *Handle) XfrmStateAdd(state *XfrmState) error { + return h.xfrmStateAddOrUpdate(state, nl.XFRM_MSG_NEWSA) +} + +// XfrmStateAllocSpi will allocate an xfrm state in the system. +// Equivalent to: `ip xfrm state allocspi` +func XfrmStateAllocSpi(state *XfrmState) (*XfrmState, error) { + return pkgHandle.xfrmStateAllocSpi(state) +} + +// XfrmStateUpdate will update an xfrm state to the system. +// Equivalent to: `ip xfrm state update $state` +func XfrmStateUpdate(state *XfrmState) error { + return pkgHandle.XfrmStateUpdate(state) +} + +// XfrmStateUpdate will update an xfrm state to the system. +// Equivalent to: `ip xfrm state update $state` +func (h *Handle) XfrmStateUpdate(state *XfrmState) error { + return h.xfrmStateAddOrUpdate(state, nl.XFRM_MSG_UPDSA) +} + +func (h *Handle) xfrmStateAddOrUpdate(state *XfrmState, nlProto int) error { + + // A state with spi 0 can't be deleted so don't allow it to be set + if state.Spi == 0 { + return fmt.Errorf("Spi must be set when adding xfrm state.") + } + req := h.newNetlinkRequest(nlProto, syscall.NLM_F_CREATE|syscall.NLM_F_EXCL|syscall.NLM_F_ACK) + + msg := xfrmUsersaInfoFromXfrmState(state) + + if state.ESN { + if state.ReplayWindow == 0 { + return fmt.Errorf("ESN flag set without ReplayWindow") + } + msg.Flags |= nl.XFRM_STATE_ESN + msg.ReplayWindow = 0 + } + + limitsToLft(state.Limits, &msg.Lft) + req.AddData(msg) + + if state.Auth != nil { + out := nl.NewRtAttr(nl.XFRMA_ALG_AUTH_TRUNC, writeStateAlgoAuth(state.Auth)) + req.AddData(out) + } + if state.Crypt != nil { + out := nl.NewRtAttr(nl.XFRMA_ALG_CRYPT, writeStateAlgo(state.Crypt)) + req.AddData(out) + } + if state.Aead != nil { + out := nl.NewRtAttr(nl.XFRMA_ALG_AEAD, writeStateAlgoAead(state.Aead)) + req.AddData(out) + } + if state.Encap != nil { + encapData := make([]byte, nl.SizeofXfrmEncapTmpl) + encap := nl.DeserializeXfrmEncapTmpl(encapData) + encap.EncapType = uint16(state.Encap.Type) + encap.EncapSport = nl.Swap16(uint16(state.Encap.SrcPort)) + encap.EncapDport = nl.Swap16(uint16(state.Encap.DstPort)) + encap.EncapOa.FromIP(state.Encap.OriginalAddress) + out := nl.NewRtAttr(nl.XFRMA_ENCAP, encapData) + req.AddData(out) + } + if state.Mark != nil { + out := nl.NewRtAttr(nl.XFRMA_MARK, writeMark(state.Mark)) + req.AddData(out) + } + if state.ESN { + out := nl.NewRtAttr(nl.XFRMA_REPLAY_ESN_VAL, writeReplayEsn(state.ReplayWindow)) + req.AddData(out) + } + + _, err := req.Execute(syscall.NETLINK_XFRM, 0) + return err +} + +func (h *Handle) xfrmStateAllocSpi(state *XfrmState) (*XfrmState, error) { + req := h.newNetlinkRequest(nl.XFRM_MSG_ALLOCSPI, + syscall.NLM_F_CREATE|syscall.NLM_F_EXCL|syscall.NLM_F_ACK) + + msg := &nl.XfrmUserSpiInfo{} + msg.XfrmUsersaInfo = *(xfrmUsersaInfoFromXfrmState(state)) + // 1-255 is reserved by IANA for future use + msg.Min = 0x100 + msg.Max = 0xffffffff + req.AddData(msg) + + if state.Mark != nil { + out := nl.NewRtAttr(nl.XFRMA_MARK, writeMark(state.Mark)) + req.AddData(out) + } + + msgs, err := req.Execute(syscall.NETLINK_XFRM, 0) + if err != nil { + return nil, err + } + + s, err := parseXfrmState(msgs[0], FAMILY_ALL) + if err != nil { + return nil, err + } + + return s, err +} + +// XfrmStateDel will delete an xfrm state from the system. Note that +// the Algos are ignored when matching the state to delete. +// Equivalent to: `ip xfrm state del $state` +func XfrmStateDel(state *XfrmState) error { + return pkgHandle.XfrmStateDel(state) +} + +// XfrmStateDel will delete an xfrm state from the system. Note that +// the Algos are ignored when matching the state to delete. +// Equivalent to: `ip xfrm state del $state` +func (h *Handle) XfrmStateDel(state *XfrmState) error { + _, err := h.xfrmStateGetOrDelete(state, nl.XFRM_MSG_DELSA) + return err +} + +// XfrmStateList gets a list of xfrm states in the system. +// Equivalent to: `ip [-4|-6] xfrm state show`. +// The list can be filtered by ip family. +func XfrmStateList(family int) ([]XfrmState, error) { + return pkgHandle.XfrmStateList(family) +} + +// XfrmStateList gets a list of xfrm states in the system. +// Equivalent to: `ip xfrm state show`. +// The list can be filtered by ip family. +func (h *Handle) XfrmStateList(family int) ([]XfrmState, error) { + req := h.newNetlinkRequest(nl.XFRM_MSG_GETSA, syscall.NLM_F_DUMP) + + msgs, err := req.Execute(syscall.NETLINK_XFRM, nl.XFRM_MSG_NEWSA) + if err != nil { + return nil, err + } + + var res []XfrmState + for _, m := range msgs { + if state, err := parseXfrmState(m, family); err == nil { + res = append(res, *state) + } else if err == familyError { + continue + } else { + return nil, err + } + } + return res, nil +} + +// XfrmStateGet gets the xfrm state described by the ID, if found. +// Equivalent to: `ip xfrm state get ID [ mark MARK [ mask MASK ] ]`. +// Only the fields which constitue the SA ID must be filled in: +// ID := [ src ADDR ] [ dst ADDR ] [ proto XFRM-PROTO ] [ spi SPI ] +// mark is optional +func XfrmStateGet(state *XfrmState) (*XfrmState, error) { + return pkgHandle.XfrmStateGet(state) +} + +// XfrmStateGet gets the xfrm state described by the ID, if found. +// Equivalent to: `ip xfrm state get ID [ mark MARK [ mask MASK ] ]`. +// Only the fields which constitue the SA ID must be filled in: +// ID := [ src ADDR ] [ dst ADDR ] [ proto XFRM-PROTO ] [ spi SPI ] +// mark is optional +func (h *Handle) XfrmStateGet(state *XfrmState) (*XfrmState, error) { + return h.xfrmStateGetOrDelete(state, nl.XFRM_MSG_GETSA) +} + +func (h *Handle) xfrmStateGetOrDelete(state *XfrmState, nlProto int) (*XfrmState, error) { + req := h.newNetlinkRequest(nlProto, syscall.NLM_F_ACK) + + msg := &nl.XfrmUsersaId{} + msg.Family = uint16(nl.GetIPFamily(state.Dst)) + msg.Daddr.FromIP(state.Dst) + msg.Proto = uint8(state.Proto) + msg.Spi = nl.Swap32(uint32(state.Spi)) + req.AddData(msg) + + if state.Mark != nil { + out := nl.NewRtAttr(nl.XFRMA_MARK, writeMark(state.Mark)) + req.AddData(out) + } + if state.Src != nil { + out := nl.NewRtAttr(nl.XFRMA_SRCADDR, state.Src.To16()) + req.AddData(out) + } + + resType := nl.XFRM_MSG_NEWSA + if nlProto == nl.XFRM_MSG_DELSA { + resType = 0 + } + + msgs, err := req.Execute(syscall.NETLINK_XFRM, uint16(resType)) + if err != nil { + return nil, err + } + + if nlProto == nl.XFRM_MSG_DELSA { + return nil, nil + } + + s, err := parseXfrmState(msgs[0], FAMILY_ALL) + if err != nil { + return nil, err + } + + return s, nil +} + +var familyError = fmt.Errorf("family error") + +func xfrmStateFromXfrmUsersaInfo(msg *nl.XfrmUsersaInfo) *XfrmState { + var state XfrmState + + state.Dst = msg.Id.Daddr.ToIP() + state.Src = msg.Saddr.ToIP() + state.Proto = Proto(msg.Id.Proto) + state.Mode = Mode(msg.Mode) + state.Spi = int(nl.Swap32(msg.Id.Spi)) + state.Reqid = int(msg.Reqid) + state.ReplayWindow = int(msg.ReplayWindow) + lftToLimits(&msg.Lft, &state.Limits) + + return &state +} + +func parseXfrmState(m []byte, family int) (*XfrmState, error) { + msg := nl.DeserializeXfrmUsersaInfo(m) + + // This is mainly for the state dump + if family != FAMILY_ALL && family != int(msg.Family) { + return nil, familyError + } + + state := xfrmStateFromXfrmUsersaInfo(msg) + + attrs, err := nl.ParseRouteAttr(m[nl.SizeofXfrmUsersaInfo:]) + if err != nil { + return nil, err + } + + for _, attr := range attrs { + switch attr.Attr.Type { + case nl.XFRMA_ALG_AUTH, nl.XFRMA_ALG_CRYPT: + var resAlgo *XfrmStateAlgo + if attr.Attr.Type == nl.XFRMA_ALG_AUTH { + if state.Auth == nil { + state.Auth = new(XfrmStateAlgo) + } + resAlgo = state.Auth + } else { + state.Crypt = new(XfrmStateAlgo) + resAlgo = state.Crypt + } + algo := nl.DeserializeXfrmAlgo(attr.Value[:]) + (*resAlgo).Name = nl.BytesToString(algo.AlgName[:]) + (*resAlgo).Key = algo.AlgKey + case nl.XFRMA_ALG_AUTH_TRUNC: + if state.Auth == nil { + state.Auth = new(XfrmStateAlgo) + } + algo := nl.DeserializeXfrmAlgoAuth(attr.Value[:]) + state.Auth.Name = nl.BytesToString(algo.AlgName[:]) + state.Auth.Key = algo.AlgKey + state.Auth.TruncateLen = int(algo.AlgTruncLen) + case nl.XFRMA_ALG_AEAD: + state.Aead = new(XfrmStateAlgo) + algo := nl.DeserializeXfrmAlgoAEAD(attr.Value[:]) + state.Aead.Name = nl.BytesToString(algo.AlgName[:]) + state.Aead.Key = algo.AlgKey + state.Aead.ICVLen = int(algo.AlgICVLen) + case nl.XFRMA_ENCAP: + encap := nl.DeserializeXfrmEncapTmpl(attr.Value[:]) + state.Encap = new(XfrmStateEncap) + state.Encap.Type = EncapType(encap.EncapType) + state.Encap.SrcPort = int(nl.Swap16(encap.EncapSport)) + state.Encap.DstPort = int(nl.Swap16(encap.EncapDport)) + state.Encap.OriginalAddress = encap.EncapOa.ToIP() + case nl.XFRMA_MARK: + mark := nl.DeserializeXfrmMark(attr.Value[:]) + state.Mark = new(XfrmMark) + state.Mark.Value = mark.Value + state.Mark.Mask = mark.Mask + } + } + + return state, nil +} + +// XfrmStateFlush will flush the xfrm state on the system. +// proto = 0 means any transformation protocols +// Equivalent to: `ip xfrm state flush [ proto XFRM-PROTO ]` +func XfrmStateFlush(proto Proto) error { + return pkgHandle.XfrmStateFlush(proto) +} + +// XfrmStateFlush will flush the xfrm state on the system. +// proto = 0 means any transformation protocols +// Equivalent to: `ip xfrm state flush [ proto XFRM-PROTO ]` +func (h *Handle) XfrmStateFlush(proto Proto) error { + req := h.newNetlinkRequest(nl.XFRM_MSG_FLUSHSA, syscall.NLM_F_ACK) + + req.AddData(&nl.XfrmUsersaFlush{Proto: uint8(proto)}) + + _, err := req.Execute(syscall.NETLINK_XFRM, 0) + if err != nil { + return err + } + + return nil +} + +func limitsToLft(lmts XfrmStateLimits, lft *nl.XfrmLifetimeCfg) { + if lmts.ByteSoft != 0 { + lft.SoftByteLimit = lmts.ByteSoft + } else { + lft.SoftByteLimit = nl.XFRM_INF + } + if lmts.ByteHard != 0 { + lft.HardByteLimit = lmts.ByteHard + } else { + lft.HardByteLimit = nl.XFRM_INF + } + if lmts.PacketSoft != 0 { + lft.SoftPacketLimit = lmts.PacketSoft + } else { + lft.SoftPacketLimit = nl.XFRM_INF + } + if lmts.PacketHard != 0 { + lft.HardPacketLimit = lmts.PacketHard + } else { + lft.HardPacketLimit = nl.XFRM_INF + } + lft.SoftAddExpiresSeconds = lmts.TimeSoft + lft.HardAddExpiresSeconds = lmts.TimeHard + lft.SoftUseExpiresSeconds = lmts.TimeUseSoft + lft.HardUseExpiresSeconds = lmts.TimeUseHard +} + +func lftToLimits(lft *nl.XfrmLifetimeCfg, lmts *XfrmStateLimits) { + *lmts = *(*XfrmStateLimits)(unsafe.Pointer(lft)) +} + +func xfrmUsersaInfoFromXfrmState(state *XfrmState) *nl.XfrmUsersaInfo { + msg := &nl.XfrmUsersaInfo{} + msg.Family = uint16(nl.GetIPFamily(state.Dst)) + msg.Id.Daddr.FromIP(state.Dst) + msg.Saddr.FromIP(state.Src) + msg.Id.Proto = uint8(state.Proto) + msg.Mode = uint8(state.Mode) + msg.Id.Spi = nl.Swap32(uint32(state.Spi)) + msg.Reqid = uint32(state.Reqid) + msg.ReplayWindow = uint8(state.ReplayWindow) + + return msg +} diff --git a/vendor/github.com/vishvananda/netns/LICENSE b/vendor/github.com/vishvananda/netns/LICENSE new file mode 100644 index 00000000..9f64db85 --- /dev/null +++ b/vendor/github.com/vishvananda/netns/LICENSE @@ -0,0 +1,192 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + Copyright 2014 Vishvananda Ishaya. + Copyright 2014 Docker, Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/vendor/github.com/vishvananda/netns/README.md b/vendor/github.com/vishvananda/netns/README.md new file mode 100644 index 00000000..66a5f725 --- /dev/null +++ b/vendor/github.com/vishvananda/netns/README.md @@ -0,0 +1,51 @@ +# netns - network namespaces in go # + +The netns package provides an ultra-simple interface for handling +network namespaces in go. Changing namespaces requires elevated +privileges, so in most cases this code needs to be run as root. + +## Local Build and Test ## + +You can use go get command: + + go get github.com/vishvananda/netns + +Testing (requires root): + + sudo -E go test github.com/vishvananda/netns + +## Example ## + +```go +package main + +import ( + "fmt" + "net" + "runtime" + "github.com/vishvananda/netns" +) + +func main() { + // Lock the OS Thread so we don't accidentally switch namespaces + runtime.LockOSThread() + defer runtime.UnlockOSThread() + + // Save the current network namespace + origns, _ := netns.Get() + defer origns.Close() + + // Create a new network namespace + newns, _ := netns.New() + netns.Set(newns) + defer newns.Close() + + // Do something with the network namespace + ifaces, _ := net.Interfaces() + fmt.Printf("Interfaces: %v\n", ifaces) + + // Switch back to the original namespace + netns.Set(origns) +} + +``` diff --git a/vendor/github.com/vishvananda/netns/netns.go b/vendor/github.com/vishvananda/netns/netns.go new file mode 100644 index 00000000..dd2f2157 --- /dev/null +++ b/vendor/github.com/vishvananda/netns/netns.go @@ -0,0 +1,80 @@ +// Package netns allows ultra-simple network namespace handling. NsHandles +// can be retrieved and set. Note that the current namespace is thread +// local so actions that set and reset namespaces should use LockOSThread +// to make sure the namespace doesn't change due to a goroutine switch. +// It is best to close NsHandles when you are done with them. This can be +// accomplished via a `defer ns.Close()` on the handle. Changing namespaces +// requires elevated privileges, so in most cases this code needs to be run +// as root. +package netns + +import ( + "fmt" + "syscall" +) + +// NsHandle is a handle to a network namespace. It can be cast directly +// to an int and used as a file descriptor. +type NsHandle int + +// Equal determines if two network handles refer to the same network +// namespace. This is done by comparing the device and inode that the +// file descriptors point to. +func (ns NsHandle) Equal(other NsHandle) bool { + if ns == other { + return true + } + var s1, s2 syscall.Stat_t + if err := syscall.Fstat(int(ns), &s1); err != nil { + return false + } + if err := syscall.Fstat(int(other), &s2); err != nil { + return false + } + return (s1.Dev == s2.Dev) && (s1.Ino == s2.Ino) +} + +// String shows the file descriptor number and its dev and inode. +func (ns NsHandle) String() string { + var s syscall.Stat_t + if ns == -1 { + return "NS(None)" + } + if err := syscall.Fstat(int(ns), &s); err != nil { + return fmt.Sprintf("NS(%d: unknown)", ns) + } + return fmt.Sprintf("NS(%d: %d, %d)", ns, s.Dev, s.Ino) +} + +// UniqueId returns a string which uniquely identifies the namespace +// associated with the network handle. +func (ns NsHandle) UniqueId() string { + var s syscall.Stat_t + if ns == -1 { + return "NS(none)" + } + if err := syscall.Fstat(int(ns), &s); err != nil { + return "NS(unknown)" + } + return fmt.Sprintf("NS(%d:%d)", s.Dev, s.Ino) +} + +// IsOpen returns true if Close() has not been called. +func (ns NsHandle) IsOpen() bool { + return ns != -1 +} + +// Close closes the NsHandle and resets its file descriptor to -1. +// It is not safe to use an NsHandle after Close() is called. +func (ns *NsHandle) Close() error { + if err := syscall.Close(int(*ns)); err != nil { + return err + } + (*ns) = -1 + return nil +} + +// None gets an empty (closed) NsHandle. +func None() NsHandle { + return NsHandle(-1) +} diff --git a/vendor/github.com/vishvananda/netns/netns_linux.go b/vendor/github.com/vishvananda/netns/netns_linux.go new file mode 100644 index 00000000..a267c710 --- /dev/null +++ b/vendor/github.com/vishvananda/netns/netns_linux.go @@ -0,0 +1,224 @@ +// +build linux + +package netns + +import ( + "fmt" + "io/ioutil" + "os" + "path/filepath" + "runtime" + "strconv" + "strings" + "syscall" +) + +// SYS_SETNS syscall allows changing the namespace of the current process. +var SYS_SETNS = map[string]uintptr{ + "386": 346, + "amd64": 308, + "arm64": 268, + "arm": 375, + "mips": 4344, + "mipsle": 4344, + "ppc64": 350, + "ppc64le": 350, + "s390x": 339, +}[runtime.GOARCH] + +// Deprecated: use syscall pkg instead (go >= 1.5 needed). +const ( + CLONE_NEWUTS = 0x04000000 /* New utsname group? */ + CLONE_NEWIPC = 0x08000000 /* New ipcs */ + CLONE_NEWUSER = 0x10000000 /* New user namespace */ + CLONE_NEWPID = 0x20000000 /* New pid namespace */ + CLONE_NEWNET = 0x40000000 /* New network namespace */ + CLONE_IO = 0x80000000 /* Get io context */ +) + +// Setns sets namespace using syscall. Note that this should be a method +// in syscall but it has not been added. +func Setns(ns NsHandle, nstype int) (err error) { + _, _, e1 := syscall.Syscall(SYS_SETNS, uintptr(ns), uintptr(nstype), 0) + if e1 != 0 { + err = e1 + } + return +} + +// Set sets the current network namespace to the namespace represented +// by NsHandle. +func Set(ns NsHandle) (err error) { + return Setns(ns, CLONE_NEWNET) +} + +// New creates a new network namespace and returns a handle to it. +func New() (ns NsHandle, err error) { + if err := syscall.Unshare(CLONE_NEWNET); err != nil { + return -1, err + } + return Get() +} + +// Get gets a handle to the current threads network namespace. +func Get() (NsHandle, error) { + return GetFromThread(os.Getpid(), syscall.Gettid()) +} + +// GetFromPath gets a handle to a network namespace +// identified by the path +func GetFromPath(path string) (NsHandle, error) { + fd, err := syscall.Open(path, syscall.O_RDONLY, 0) + if err != nil { + return -1, err + } + return NsHandle(fd), nil +} + +// GetFromName gets a handle to a named network namespace such as one +// created by `ip netns add`. +func GetFromName(name string) (NsHandle, error) { + return GetFromPath(fmt.Sprintf("/var/run/netns/%s", name)) +} + +// GetFromPid gets a handle to the network namespace of a given pid. +func GetFromPid(pid int) (NsHandle, error) { + return GetFromPath(fmt.Sprintf("/proc/%d/ns/net", pid)) +} + +// GetFromThread gets a handle to the network namespace of a given pid and tid. +func GetFromThread(pid, tid int) (NsHandle, error) { + return GetFromPath(fmt.Sprintf("/proc/%d/task/%d/ns/net", pid, tid)) +} + +// GetFromDocker gets a handle to the network namespace of a docker container. +// Id is prefixed matched against the running docker containers, so a short +// identifier can be used as long as it isn't ambiguous. +func GetFromDocker(id string) (NsHandle, error) { + pid, err := getPidForContainer(id) + if err != nil { + return -1, err + } + return GetFromPid(pid) +} + +// borrowed from docker/utils/utils.go +func findCgroupMountpoint(cgroupType string) (string, error) { + output, err := ioutil.ReadFile("/proc/mounts") + if err != nil { + return "", err + } + + // /proc/mounts has 6 fields per line, one mount per line, e.g. + // cgroup /sys/fs/cgroup/devices cgroup rw,relatime,devices 0 0 + for _, line := range strings.Split(string(output), "\n") { + parts := strings.Split(line, " ") + if len(parts) == 6 && parts[2] == "cgroup" { + for _, opt := range strings.Split(parts[3], ",") { + if opt == cgroupType { + return parts[1], nil + } + } + } + } + + return "", fmt.Errorf("cgroup mountpoint not found for %s", cgroupType) +} + +// Returns the relative path to the cgroup docker is running in. +// borrowed from docker/utils/utils.go +// modified to get the docker pid instead of using /proc/self +func getThisCgroup(cgroupType string) (string, error) { + dockerpid, err := ioutil.ReadFile("/var/run/docker.pid") + if err != nil { + return "", err + } + result := strings.Split(string(dockerpid), "\n") + if len(result) == 0 || len(result[0]) == 0 { + return "", fmt.Errorf("docker pid not found in /var/run/docker.pid") + } + pid, err := strconv.Atoi(result[0]) + if err != nil { + return "", err + } + output, err := ioutil.ReadFile(fmt.Sprintf("/proc/%d/cgroup", pid)) + if err != nil { + return "", err + } + for _, line := range strings.Split(string(output), "\n") { + parts := strings.Split(line, ":") + // any type used by docker should work + if parts[1] == cgroupType { + return parts[2], nil + } + } + return "", fmt.Errorf("cgroup '%s' not found in /proc/%d/cgroup", cgroupType, pid) +} + +// Returns the first pid in a container. +// borrowed from docker/utils/utils.go +// modified to only return the first pid +// modified to glob with id +// modified to search for newer docker containers +func getPidForContainer(id string) (int, error) { + pid := 0 + + // memory is chosen randomly, any cgroup used by docker works + cgroupType := "memory" + + cgroupRoot, err := findCgroupMountpoint(cgroupType) + if err != nil { + return pid, err + } + + cgroupThis, err := getThisCgroup(cgroupType) + if err != nil { + return pid, err + } + + id += "*" + + attempts := []string{ + filepath.Join(cgroupRoot, cgroupThis, id, "tasks"), + // With more recent lxc versions use, cgroup will be in lxc/ + filepath.Join(cgroupRoot, cgroupThis, "lxc", id, "tasks"), + // With more recent docker, cgroup will be in docker/ + filepath.Join(cgroupRoot, cgroupThis, "docker", id, "tasks"), + // Even more recent docker versions under systemd use docker-.scope/ + filepath.Join(cgroupRoot, "system.slice", "docker-"+id+".scope", "tasks"), + // Even more recent docker versions under cgroup/systemd/docker// + filepath.Join(cgroupRoot, "..", "systemd", "docker", id, "tasks"), + } + + var filename string + for _, attempt := range attempts { + filenames, _ := filepath.Glob(attempt) + if len(filenames) > 1 { + return pid, fmt.Errorf("Ambiguous id supplied: %v", filenames) + } else if len(filenames) == 1 { + filename = filenames[0] + break + } + } + + if filename == "" { + return pid, fmt.Errorf("Unable to find container: %v", id[:len(id)-1]) + } + + output, err := ioutil.ReadFile(filename) + if err != nil { + return pid, err + } + + result := strings.Split(string(output), "\n") + if len(result) == 0 || len(result[0]) == 0 { + return pid, fmt.Errorf("No pid found for container") + } + + pid, err = strconv.Atoi(result[0]) + if err != nil { + return pid, fmt.Errorf("Invalid pid '%s': %s", result[0], err) + } + + return pid, nil +} diff --git a/vendor/github.com/vishvananda/netns/netns_unspecified.go b/vendor/github.com/vishvananda/netns/netns_unspecified.go new file mode 100644 index 00000000..d06af62b --- /dev/null +++ b/vendor/github.com/vishvananda/netns/netns_unspecified.go @@ -0,0 +1,43 @@ +// +build !linux + +package netns + +import ( + "errors" +) + +var ( + ErrNotImplemented = errors.New("not implemented") +) + +func Set(ns NsHandle) (err error) { + return ErrNotImplemented +} + +func New() (ns NsHandle, err error) { + return -1, ErrNotImplemented +} + +func Get() (NsHandle, error) { + return -1, ErrNotImplemented +} + +func GetFromPath(path string) (NsHandle, error) { + return -1, ErrNotImplemented +} + +func GetFromName(name string) (NsHandle, error) { + return -1, ErrNotImplemented +} + +func GetFromPid(pid int) (NsHandle, error) { + return -1, ErrNotImplemented +} + +func GetFromThread(pid, tid int) (NsHandle, error) { + return -1, ErrNotImplemented +} + +func GetFromDocker(id string) (NsHandle, error) { + return -1, ErrNotImplemented +}