From 706a836f35a16dc0acf551adbf3e88da69311e07 Mon Sep 17 00:00:00 2001 From: Justin Brooks Date: Mon, 5 Jun 2023 11:16:39 -0400 Subject: [PATCH 1/6] init --- .gitignore | 6 +- cmd/installer/main.go | 67 ++++ go.mod | 66 ++++ go.sum | 337 +++++++++++++++++++ pkg/cmd/bundle/bundle.go | 45 +++ pkg/cmd/install/install.go | 44 +++ pkg/config/1.27.2.yaml | 18 + pkg/config/configs.go | 5 + pkg/discover/networking/ips.go | 48 +++ pkg/discover/system/lsb.go | 4 + pkg/download/downloader.go | 23 ++ pkg/files/cp.go | 23 ++ pkg/files/tar.go | 79 +++++ pkg/images/download.go | 23 ++ pkg/images/load.go | 14 + pkg/kubernetes/cni/cni.go | 31 ++ pkg/kubernetes/containerd/containerd.service | 42 +++ pkg/kubernetes/containerd/images.go | 63 ++++ pkg/kubernetes/containerd/install.go | 101 ++++++ pkg/kubernetes/crictl/download.go | 29 ++ pkg/kubernetes/docker/download.go | 29 ++ pkg/kubernetes/kubeadm/ip.conf | 5 + pkg/kubernetes/kubeadm/k8s.conf | 12 + pkg/kubernetes/kubeadm/kubeadm.go | 30 ++ pkg/kubernetes/kubeadm/modules.go | 52 +++ pkg/kubernetes/kubectl/kubectl.go | 27 ++ pkg/kubernetes/kubelet/10-kube.conf | 11 + pkg/kubernetes/kubelet/kubelet.go | 43 +++ pkg/kubernetes/runc/runc.go | 33 ++ pkg/linux/modprobe.go | 7 + pkg/linux/swap/swap.go | 60 ++++ pkg/linux/systemd/systemctl.go | 15 + 32 files changed, 1391 insertions(+), 1 deletion(-) create mode 100644 cmd/installer/main.go create mode 100644 go.mod create mode 100644 go.sum create mode 100644 pkg/cmd/bundle/bundle.go create mode 100644 pkg/cmd/install/install.go create mode 100644 pkg/config/1.27.2.yaml create mode 100644 pkg/config/configs.go create mode 100644 pkg/discover/networking/ips.go create mode 100644 pkg/discover/system/lsb.go create mode 100644 pkg/download/downloader.go create mode 100644 pkg/files/cp.go create mode 100644 pkg/files/tar.go create mode 100644 pkg/images/download.go create mode 100644 pkg/images/load.go create mode 100644 pkg/kubernetes/cni/cni.go create mode 100644 pkg/kubernetes/containerd/containerd.service create mode 100644 pkg/kubernetes/containerd/images.go create mode 100644 pkg/kubernetes/containerd/install.go create mode 100644 pkg/kubernetes/crictl/download.go create mode 100644 pkg/kubernetes/docker/download.go create mode 100644 pkg/kubernetes/kubeadm/ip.conf create mode 100644 pkg/kubernetes/kubeadm/k8s.conf create mode 100644 pkg/kubernetes/kubeadm/kubeadm.go create mode 100644 pkg/kubernetes/kubeadm/modules.go create mode 100644 pkg/kubernetes/kubectl/kubectl.go create mode 100644 pkg/kubernetes/kubelet/10-kube.conf create mode 100644 pkg/kubernetes/kubelet/kubelet.go create mode 100644 pkg/kubernetes/runc/runc.go create mode 100644 pkg/linux/modprobe.go create mode 100644 pkg/linux/swap/swap.go create mode 100644 pkg/linux/systemd/systemctl.go diff --git a/.gitignore b/.gitignore index c741d0e..9711bab 100644 --- a/.gitignore +++ b/.gitignore @@ -7,4 +7,8 @@ cert-issuer.yaml *.tfvars node_modules staging/* -js/ \ No newline at end of file +js/ + +packages +.DS_store +*.log \ No newline at end of file diff --git a/cmd/installer/main.go b/cmd/installer/main.go new file mode 100644 index 0000000..8302f8c --- /dev/null +++ b/cmd/installer/main.go @@ -0,0 +1,67 @@ +package main + +import ( + "context" + + "github.com/pterm/pterm" + "github.com/spf13/cobra" + "github.com/wandb/server/pkg/cmd/bundle" + "github.com/wandb/server/pkg/linux/swap" +) + +func RootCmd() *cobra.Command { + return &cobra.Command{ + Short: "W&B Server Installer CLI", + Long: `Weights & Biases tool for install and managing VM deployments`, + } +} + +func BundleCmd() *cobra.Command { + return &cobra.Command{ + Use: "bundle", + Short: "Creates an Airgap bunddle", + Run: func(cmd *cobra.Command, args []string) { + bundle.DownloadPackages() + }, + } +} + +func InstallCommand() *cobra.Command { + return &cobra.Command{ + Use: "install", + Short: "Runs the installer", + Run: func(cmd *cobra.Command, args []string) { + swap.MustSweepoff() + bundle.DownloadPackages() + }, + } +} + +func init() { + pterm.EnableDebugMessages() + pterm.EnableColor() + pterm.DefaultInteractiveSelect.MaxHeight = 15 + pterm.Debug.Prefix.Text = "d" + pterm.Debug.Prefix.Style = &pterm.ThemeDefault.DebugMessageStyle + pterm.Info.Prefix.Text = "i" + pterm.Info.Prefix.Style = &pterm.ThemeDefault.InfoMessageStyle + pterm.Info.MessageStyle = &pterm.ThemeDefault.DefaultText + pterm.Success.Prefix.Text = "✓" + pterm.Success.Prefix.Style = &pterm.ThemeDefault.SuccessMessageStyle + pterm.Warning.Prefix.Text = "!" + pterm.Warning.Prefix.Style = &pterm.ThemeDefault.WarningMessageStyle + pterm.Error.Prefix.Text = "✗" + pterm.Error.Prefix.Style = &pterm.ThemeDefault.ErrorMessageStyle + pterm.Fatal.Prefix.Text = "🤯" + pterm.Fatal.Prefix.Style = &pterm.ThemeDefault.FatalMessageStyle +} + +func main() { + ctx := context.Background() + cmd := RootCmd() + + cmd.AddCommand(InstallCommand()) + cmd.AddCommand(BundleCmd()) + + cmd.ExecuteContext(ctx) +} \ No newline at end of file diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..b1bc0a0 --- /dev/null +++ b/go.mod @@ -0,0 +1,66 @@ +module github.com/wandb/server + +go 1.20 + +require ( + github.com/containerd/containerd v1.7.2 + github.com/pterm/pterm v0.12.62 + github.com/spf13/cobra v1.7.0 +) + +require ( + atomicgo.dev/cursor v0.1.1 // indirect + atomicgo.dev/keyboard v0.2.9 // indirect + atomicgo.dev/schedule v0.0.2 // indirect + github.com/AdaLogics/go-fuzz-headers v0.0.0-20230106234847-43070de90fa1 // indirect + github.com/AdamKorcz/go-118-fuzz-build v0.0.0-20221215162035-5330a85ea652 // indirect + github.com/Microsoft/go-winio v0.6.1 // indirect + github.com/Microsoft/hcsshim v0.10.0-rc.8 // indirect + github.com/containerd/cgroups v1.1.0 // indirect + github.com/containerd/console v1.0.3 // indirect + github.com/containerd/continuity v0.4.1 // indirect + github.com/containerd/fifo v1.1.0 // indirect + github.com/containerd/ttrpc v1.2.2 // indirect + github.com/containerd/typeurl/v2 v2.1.1 // indirect + github.com/cyphar/filepath-securejoin v0.2.3 // indirect + github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c // indirect + github.com/go-logr/logr v1.2.3 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect + github.com/golang/protobuf v1.5.3 // indirect + github.com/google/go-cmp v0.5.9 // indirect + github.com/google/uuid v1.3.0 // indirect + github.com/gookit/color v1.5.3 // indirect + github.com/inconshreveable/mousetrap v1.1.0 // indirect + github.com/klauspost/compress v1.16.0 // indirect + github.com/lithammer/fuzzysearch v1.1.8 // indirect + github.com/mattn/go-runewidth v0.0.14 // indirect + github.com/moby/locker v1.0.1 // indirect + github.com/moby/sys/mountinfo v0.6.2 // indirect + github.com/moby/sys/sequential v0.5.0 // indirect + github.com/moby/sys/signal v0.7.0 // indirect + github.com/opencontainers/go-digest v1.0.0 // indirect + github.com/opencontainers/image-spec v1.1.0-rc2.0.20221005185240-3a7f492d3f1b // indirect + github.com/opencontainers/runc v1.1.5 // indirect + github.com/opencontainers/runtime-spec v1.1.0-rc.1 // indirect + github.com/opencontainers/selinux v1.11.0 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/rivo/uniseg v0.4.4 // indirect + github.com/sirupsen/logrus v1.9.0 // indirect + github.com/spf13/pflag v1.0.5 // indirect + github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e // indirect + go.opencensus.io v0.24.0 // indirect + go.opentelemetry.io/otel v1.14.0 // indirect + go.opentelemetry.io/otel/trace v1.14.0 // indirect + golang.org/x/mod v0.9.0 // indirect + golang.org/x/net v0.8.0 // indirect + golang.org/x/sync v0.1.0 // indirect + golang.org/x/sys v0.8.0 // indirect + golang.org/x/term v0.8.0 // indirect + golang.org/x/text v0.9.0 // indirect + golang.org/x/tools v0.7.0 // indirect + google.golang.org/genproto v0.0.0-20230306155012-7f2fa6fef1f4 // indirect + google.golang.org/grpc v1.53.0 // indirect + google.golang.org/protobuf v1.29.1 // indirect +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..92f8378 --- /dev/null +++ b/go.sum @@ -0,0 +1,337 @@ +atomicgo.dev/assert v0.0.2 h1:FiKeMiZSgRrZsPo9qn/7vmr7mCsh5SZyXY4YGYiYwrg= +atomicgo.dev/cursor v0.1.1 h1:0t9sxQomCTRh5ug+hAMCs59x/UmC9QL6Ci5uosINKD4= +atomicgo.dev/cursor v0.1.1/go.mod h1:Lr4ZJB3U7DfPPOkbH7/6TOtJ4vFGHlgj1nc+n900IpU= +atomicgo.dev/keyboard v0.2.9 h1:tOsIid3nlPLZ3lwgG8KZMp/SFmr7P0ssEN5JUsm78K8= +atomicgo.dev/keyboard v0.2.9/go.mod h1:BC4w9g00XkxH/f1HXhW2sXmJFOCWbKn9xrOunSFtExQ= +atomicgo.dev/schedule v0.0.2 h1:2e/4KY6t3wokja01Cyty6qgkQM8MotJzjtqCH70oX2Q= +atomicgo.dev/schedule v0.0.2/go.mod h1:xeUa3oAkiuHYh8bKiQBRojqAMq3PXXbJujjb0hw8pEU= +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +github.com/AdaLogics/go-fuzz-headers v0.0.0-20230106234847-43070de90fa1 h1:EKPd1INOIyr5hWOWhvpmQpY6tKjeG0hT1s3AMC/9fic= +github.com/AdaLogics/go-fuzz-headers v0.0.0-20230106234847-43070de90fa1/go.mod h1:VzwV+t+dZ9j/H867F1M2ziD+yLHtB46oM35FxxMJ4d0= +github.com/AdamKorcz/go-118-fuzz-build v0.0.0-20221215162035-5330a85ea652 h1:+vTEFqeoeur6XSq06bs+roX3YiT49gUniJK7Zky7Xjg= +github.com/AdamKorcz/go-118-fuzz-build v0.0.0-20221215162035-5330a85ea652/go.mod h1:OahwfttHWG6eJ0clwcfBAHoDI6X/LV/15hx/wlMZSrU= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/MarvinJWendt/testza v0.1.0/go.mod h1:7AxNvlfeHP7Z/hDQ5JtE3OKYT3XFUeLCDE2DQninSqs= +github.com/MarvinJWendt/testza v0.2.1/go.mod h1:God7bhG8n6uQxwdScay+gjm9/LnO4D3kkcZX4hv9Rp8= +github.com/MarvinJWendt/testza v0.2.8/go.mod h1:nwIcjmr0Zz+Rcwfh3/4UhBp7ePKVhuBExvZqnKYWlII= +github.com/MarvinJWendt/testza v0.2.10/go.mod h1:pd+VWsoGUiFtq+hRKSU1Bktnn+DMCSrDrXDpX2bG66k= +github.com/MarvinJWendt/testza v0.2.12/go.mod h1:JOIegYyV7rX+7VZ9r77L/eH6CfJHHzXjB69adAhzZkI= +github.com/MarvinJWendt/testza v0.3.0/go.mod h1:eFcL4I0idjtIx8P9C6KkAuLgATNKpX4/2oUqKc6bF2c= +github.com/MarvinJWendt/testza v0.4.2/go.mod h1:mSdhXiKH8sg/gQehJ63bINcCKp7RtYewEjXsvsVUPbE= +github.com/MarvinJWendt/testza v0.5.2 h1:53KDo64C1z/h/d/stCYCPY69bt/OSwjq5KpFNwi+zB4= +github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= +github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= +github.com/Microsoft/hcsshim v0.10.0-rc.8 h1:YSZVvlIIDD1UxQpJp0h+dnpLUw+TrY0cx8obKsp3bek= +github.com/Microsoft/hcsshim v0.10.0-rc.8/go.mod h1:OEthFdQv/AD2RAdzR6Mm1N1KPCztGKDurW1Z8b8VGMM= +github.com/atomicgo/cursor v0.0.1/go.mod h1:cBON2QmmrysudxNBFthvMtN32r3jxVRIvzkUiF/RuIk= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/checkpoint-restore/go-criu/v5 v5.3.0/go.mod h1:E/eQpaFtUKGOOSEBZgmKAcn+zUUwWxqcaKZlF54wK8E= +github.com/cilium/ebpf v0.7.0/go.mod h1:/oI2+1shJiTGAMgl6/RgJr36Eo1jzrRcAWbcXO2usCA= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/containerd/cgroups v1.1.0 h1:v8rEWFl6EoqHB+swVNjVoCJE8o3jX7e8nqBGPLaDFBM= +github.com/containerd/cgroups v1.1.0/go.mod h1:6ppBcbh/NOOUU+dMKrykgaBnK9lCIBxHqJDGwsa1mIw= +github.com/containerd/console v1.0.3 h1:lIr7SlA5PxZyMV30bDW0MGbiOPXwc63yRuCP0ARubLw= +github.com/containerd/console v1.0.3/go.mod h1:7LqA/THxQ86k76b8c/EMSiaJ3h1eZkMkXar0TQ1gf3U= +github.com/containerd/containerd v1.7.2 h1:UF2gdONnxO8I6byZXDi5sXWiWvlW3D/sci7dTQimEJo= +github.com/containerd/containerd v1.7.2/go.mod h1:afcz74+K10M/+cjGHIVQrCt3RAQhUSCAjJ9iMYhhkuI= +github.com/containerd/continuity v0.4.1 h1:wQnVrjIyQ8vhU2sgOiL5T07jo+ouqc2bnKsv5/EqGhU= +github.com/containerd/continuity v0.4.1/go.mod h1:F6PTNCKepoxEaXLQp3wDAjygEnImnZ/7o4JzpodfroQ= +github.com/containerd/fifo v1.1.0 h1:4I2mbh5stb1u6ycIABlBw9zgtlK8viPI9QkQNRQEEmY= +github.com/containerd/fifo v1.1.0/go.mod h1:bmC4NWMbXlt2EZ0Hc7Fx7QzTFxgPID13eH0Qu+MAb2o= +github.com/containerd/ttrpc v1.2.2 h1:9vqZr0pxwOF5koz6N0N3kJ0zDHokrcPxIR/ZR2YFtOs= +github.com/containerd/ttrpc v1.2.2/go.mod h1:sIT6l32Ph/H9cvnJsfXM5drIVzTr5A2flTf1G5tYZak= +github.com/containerd/typeurl/v2 v2.1.1 h1:3Q4Pt7i8nYwy2KmQWIw2+1hTvwTE/6w9FqcttATPO/4= +github.com/containerd/typeurl/v2 v2.1.1/go.mod h1:IDp2JFvbwZ31H8dQbEIY7sDl2L3o3HZj1hsSQlywkQ0= +github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= +github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/cyphar/filepath-securejoin v0.2.3 h1:YX6ebbZCZP7VkM3scTTokDgBL2TY741X51MTk3ycuNI= +github.com/cyphar/filepath-securejoin v0.2.3/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c h1:+pKlWGMw7gf6bQ+oDZB4KHQFypsfjYlq/C4rfL7D3g8= +github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c/go.mod h1:Uw6UezgYA44ePAFQYUehOuCzmy5zmg/+nl2ZfMWGkpA= +github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= +github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0= +github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/godbus/dbus/v5 v5.0.6/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= +github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= +github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= +github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= +github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/gookit/color v1.4.2/go.mod h1:fqRyamkC1W8uxl+lxCQxOT09l/vYfZ+QeiX3rKQHCoQ= +github.com/gookit/color v1.5.0/go.mod h1:43aQb+Zerm/BWh2GnrgOQm7ffz7tvQXEKV6BFMl7wAo= +github.com/gookit/color v1.5.3 h1:twfIhZs4QLCtimkP7MOxlF3A0U/5cDPseRT9M/+2SCE= +github.com/gookit/color v1.5.3/go.mod h1:NUzwzeehUfl7GIb36pqId+UGmRfQcU/WiiyTTeNjHtE= +github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= +github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.16.0 h1:iULayQNOReoYUe+1qtKOqw9CwJv3aNQu8ivo7lw1HU4= +github.com/klauspost/compress v1.16.0/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= +github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= +github.com/klauspost/cpuid/v2 v2.0.10/go.mod h1:g2LTdtYhdyuGPqyWyv7qRAmj1WBqxuObKfj5c0PQa7c= +github.com/klauspost/cpuid/v2 v2.0.12/go.mod h1:g2LTdtYhdyuGPqyWyv7qRAmj1WBqxuObKfj5c0PQa7c= +github.com/klauspost/cpuid/v2 v2.2.3 h1:sxCkb+qR91z4vsqw4vGGZlDgPz3G7gjaLyK3V8y70BU= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/lithammer/fuzzysearch v1.1.8 h1:/HIuJnjHuXS8bKaiTMeeDlW2/AyIWk2brx1V8LFgLN4= +github.com/lithammer/fuzzysearch v1.1.8/go.mod h1:IdqeyBClc3FFqSzYq/MXESsS4S0FsZ5ajtkr5xPLts4= +github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/mattn/go-runewidth v0.0.14 h1:+xnbZSEeDbOIg5/mE6JF0w6n9duR1l3/WmbinWVwUuU= +github.com/mattn/go-runewidth v0.0.14/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/moby/locker v1.0.1 h1:fOXqR41zeveg4fFODix+1Ch4mj/gT0NE1XJbp/epuBg= +github.com/moby/locker v1.0.1/go.mod h1:S7SDdo5zpBK84bzzVlKr2V0hz+7x9hWbYC/kq7oQppc= +github.com/moby/sys/mountinfo v0.5.0/go.mod h1:3bMD3Rg+zkqx8MRYPi7Pyb0Ie97QEBmdxbhnCLlSvSU= +github.com/moby/sys/mountinfo v0.6.2 h1:BzJjoreD5BMFNmD9Rus6gdd1pLuecOFPt8wC+Vygl78= +github.com/moby/sys/mountinfo v0.6.2/go.mod h1:IJb6JQeOklcdMU9F5xQ8ZALD+CUr5VlGpwtX+VE0rpI= +github.com/moby/sys/sequential v0.5.0 h1:OPvI35Lzn9K04PBbCLW0g4LcFAJgHsvXsRyewg5lXtc= +github.com/moby/sys/sequential v0.5.0/go.mod h1:tH2cOOs5V9MlPiXcQzRC+eEyab644PWKGRYaaV5ZZlo= +github.com/moby/sys/signal v0.7.0 h1:25RW3d5TnQEoKvRbEKUGay6DCQ46IxAVTT9CUMgmsSI= +github.com/moby/sys/signal v0.7.0/go.mod h1:GQ6ObYZfqacOwTtlXvcmh9A26dVRul/hbOZn88Kg8Tg= +github.com/mrunalp/fileutils v0.5.0/go.mod h1:M1WthSahJixYnrXQl/DFQuteStB1weuxD2QJNHXfbSQ= +github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= +github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= +github.com/opencontainers/image-spec v1.1.0-rc2.0.20221005185240-3a7f492d3f1b h1:YWuSjZCQAPM8UUBLkYUk1e+rZcvWHJmFb6i6rM44Xs8= +github.com/opencontainers/image-spec v1.1.0-rc2.0.20221005185240-3a7f492d3f1b/go.mod h1:3OVijpioIKYWTqjiG0zfF6wvoJ4fAXGbjdZuI2NgsRQ= +github.com/opencontainers/runc v1.1.5 h1:L44KXEpKmfWDcS02aeGm8QNTFXTo2D+8MYGDIJ/GDEs= +github.com/opencontainers/runc v1.1.5/go.mod h1:1J5XiS+vdZ3wCyZybsuxXZWGrgSr8fFJHLXuG2PsnNg= +github.com/opencontainers/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-spec v1.1.0-rc.1 h1:wHa9jroFfKGQqFHj0I1fMRKLl0pfj+ynAqBxo3v6u9w= +github.com/opencontainers/runtime-spec v1.1.0-rc.1/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/selinux v1.10.0/go.mod h1:2i0OySw99QjzBBQByd1Gr9gSjvuho1lHsJxIJ3gGbJI= +github.com/opencontainers/selinux v1.11.0 h1:+5Zbo97w3Lbmb3PeqQtpmTkMwsW5nRI3YaLpt7tQ7oU= +github.com/opencontainers/selinux v1.11.0/go.mod h1:E5dMC3VPuVvVHDYmi78qvhJp8+M586T4DlDRYpFkyec= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= +github.com/prometheus/procfs v0.8.0 h1:ODq8ZFEaYeCaZOJlZZdJA2AbQR98dSHSM1KW/You5mo= +github.com/pterm/pterm v0.12.27/go.mod h1:PhQ89w4i95rhgE+xedAoqous6K9X+r6aSOI2eFF7DZI= +github.com/pterm/pterm v0.12.29/go.mod h1:WI3qxgvoQFFGKGjGnJR849gU0TsEOvKn5Q8LlY1U7lg= +github.com/pterm/pterm v0.12.30/go.mod h1:MOqLIyMOgmTDz9yorcYbcw+HsgoZo3BQfg2wtl3HEFE= +github.com/pterm/pterm v0.12.31/go.mod h1:32ZAWZVXD7ZfG0s8qqHXePte42kdz8ECtRyEejaWgXU= +github.com/pterm/pterm v0.12.33/go.mod h1:x+h2uL+n7CP/rel9+bImHD5lF3nM9vJj80k9ybiiTTE= +github.com/pterm/pterm v0.12.36/go.mod h1:NjiL09hFhT/vWjQHSj1athJpx6H8cjpHXNAK5bUw8T8= +github.com/pterm/pterm v0.12.40/go.mod h1:ffwPLwlbXxP+rxT0GsgDTzS3y3rmpAO1NMjUkGTYf8s= +github.com/pterm/pterm v0.12.62 h1:Xjj5Wl6UR4Il9xOiDUOZRwReRTdO75if/JdWsn9I59s= +github.com/pterm/pterm v0.12.62/go.mod h1:+c3ujjE7N5qmNx6eKAa7YVSC6m/gCorJJKhzwYTbL90= +github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= +github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis= +github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= +github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/seccomp/libseccomp-golang v0.9.2-0.20220502022130-f33da4d89646/go.mod h1:JA8cRccbGaA1s33RQf7Y1+q9gHmZX1yB/z9WDN1C6fg= +github.com/sergi/go-diff v1.2.0 h1:XU+rvMAioB0UC3q1MFrIQy4Vo5/4VsRDQQXHsEya6xQ= +github.com/sergi/go-diff v1.2.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= +github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= +github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0= +github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/spf13/cobra v1.7.0 h1:hyqWnYt1ZQShIddO5kBpj3vu05/++x6tJ6dg8EC572I= +github.com/spf13/cobra v1.7.0/go.mod h1:uLxZILRyS/50WlhOIKD7W6V5bgeIt+4sICxh6uRMrb0= +github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.2 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8= +github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= +github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= +github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE= +github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df/go.mod h1:JP3t17pCcGlemwknint6hfoeCVQrEMVwxRLRjXpq+BU= +github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778/go.mod h1:2MuV+tbUrU1zIOPMxZ5EncGwgmMJsa+9ucAQZXxsObs= +github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e h1:JVG44RsyaB9T2KIHavMF/ppJZNG9ZpyihvCd0w101no= +github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e/go.mod h1:RbqR21r5mrJuqunuUZ/Dhy/avygyECGrLceyNeo4LiM= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= +go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= +go.opentelemetry.io/otel v1.14.0 h1:/79Huy8wbf5DnIPhemGB+zEPVwnN6fuQybr/SRXa6hM= +go.opentelemetry.io/otel v1.14.0/go.mod h1:o4buv+dJzx8rohcUeRmWUZhqupFvzWis188WlggnNeU= +go.opentelemetry.io/otel/trace v1.14.0 h1:wp2Mmvj41tDsyAJXiWDWpfNsOiIyd38fy85pyKcFq/M= +go.opentelemetry.io/otel/trace v1.14.0/go.mod h1:8avnQLK+CG77yNLUae4ea2JDQ6iT+gozhnZjy/rw9G8= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20220909182711-5c715a9e8561 h1:MDc5xs78ZrZr3HMQugiXOAkSZtfTpbJLDr/lwfgO53E= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.9.0 h1:KENHtAZL2y3NLMYZeHY9DW8HW8V+kQyJsY/V9JlKvCs= +golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.8.0 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ= +golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o= +golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190606203320-7fc4e5ec1444/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191115151921-52ab43148777/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210906170528-6f6e22806c34/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211013075003-97ac67df715c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211116061358-0a5406a5449c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220319134239-a9b59b0215f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0 h1:EBmGv8NaZBZTWvrbjNoL6HVt+IVy3QDQpJs7VRIw3tU= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210615171337-6886f2dfbf5b/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= +golang.org/x/term v0.8.0 h1:n5xxQn2i3PC0yLAbjTpNT85q/Kgzcr2gIoX9OrJUols= +golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE= +golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= +golang.org/x/tools v0.7.0 h1:W4OVu8VVOaIO0yzWMNdepAulS7YfoS3Zabrm8DOXXU4= +golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/genproto v0.0.0-20230306155012-7f2fa6fef1f4 h1:DdoeryqhaXp1LtT/emMP1BRJPHHKFi5akj/nbx/zNTA= +google.golang.org/genproto v0.0.0-20230306155012-7f2fa6fef1f4/go.mod h1:NWraEVixdDnqcqQ30jipen1STv2r/n24Wb7twVTGR4s= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= +google.golang.org/grpc v1.53.0 h1:LAv2ds7cmFV/XTS3XG1NneeENYrXGmorPxsBbptIjNc= +google.golang.org/grpc v1.53.0/go.mod h1:OnIrk0ipVdj4N5d9IUoFUx72/VlD7+jUsHwZgwSMQpw= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.29.1 h1:7QBf+IK2gx70Ap/hDsOmam3GE0v9HicjfEdAxE62UoM= +google.golang.org/protobuf v1.29.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= diff --git a/pkg/cmd/bundle/bundle.go b/pkg/cmd/bundle/bundle.go new file mode 100644 index 0000000..eb46a97 --- /dev/null +++ b/pkg/cmd/bundle/bundle.go @@ -0,0 +1,45 @@ +package bundle + +import ( + "sync" + + "github.com/pterm/pterm" + "github.com/wandb/server/pkg/kubernetes/cni" + "github.com/wandb/server/pkg/kubernetes/containerd" + "github.com/wandb/server/pkg/kubernetes/crictl" + "github.com/wandb/server/pkg/kubernetes/kubeadm" + "github.com/wandb/server/pkg/kubernetes/kubectl" + "github.com/wandb/server/pkg/kubernetes/kubelet" + "github.com/wandb/server/pkg/kubernetes/runc" +) + +func DownloadPackages() { + packages := []func()error{ + func() error { return containerd.Download("1.7.1", "./packages/containerd.tar.gz") }, + func() error { return crictl.Download("1.27.0", "./packages/crictl.tar.gz") }, + func() error { return runc.Download("1.1.7", "./packages/runc") }, + func() error { return cni.Download("1.3.0", "./packages/cni-plugins.tar.gz") }, + func() error { return kubeadm.Download("1.27.2", "./packages/kubeadm") }, + func() error { return kubelet.Download("1.27.2", "./packages/kubelet") }, + func() error { return kubectl.Download("1.27.2", "./packages/kubectl") }, + } + + progressbar, _ := pterm.DefaultProgressbar. + WithTotal(len(packages)). + WithTitle("Downloading packages"). + Start() + + wg := sync.WaitGroup{} + wg.Add(len(packages)) + for _, pkg := range packages { + go func(download func()error) { + err := download() + progressbar.Increment() + wg.Done() + pterm.Error.PrintOnError(err) + }(pkg) + } + wg.Wait() + + progressbar.Stop() +} diff --git a/pkg/cmd/install/install.go b/pkg/cmd/install/install.go new file mode 100644 index 0000000..c81d273 --- /dev/null +++ b/pkg/cmd/install/install.go @@ -0,0 +1,44 @@ +package isntall + +import ( + "sync" + + "github.com/pterm/pterm" + "github.com/wandb/server/pkg/kubernetes/cni" + "github.com/wandb/server/pkg/kubernetes/containerd" + "github.com/wandb/server/pkg/kubernetes/crictl" + "github.com/wandb/server/pkg/kubernetes/kubeadm" + "github.com/wandb/server/pkg/kubernetes/kubectl" + "github.com/wandb/server/pkg/kubernetes/kubelet" + "github.com/wandb/server/pkg/kubernetes/runc" +) + +func Install() { + packages := []func(){ + func() { containerd.Install("./packages/containerd.tar.gz") }, + func() { crictl.Install("./packages/crictl.tar.gz") }, + func() { runc.Install("./packages/runc") }, + func() { cni.Install("./packages/cni-plugins.tar.gz") }, + func() { kubeadm.Install("./packages/kubeadm") }, + func() { kubelet.Install("./packages/kubelet") }, + func() { kubectl.Install("./packages/kubectl") }, + } + + progressbar, _ := pterm.DefaultProgressbar. + WithTotal(len(packages)). + WithTitle("Downloading packages"). + Start() + + wg := sync.WaitGroup{} + wg.Add(len(packages)) + for _, pkg := range packages { + go func(download func()) { + download() + progressbar.Increment() + wg.Done() + }(pkg) + } + wg.Wait() + + progressbar.Stop() +} \ No newline at end of file diff --git a/pkg/config/1.27.2.yaml b/pkg/config/1.27.2.yaml new file mode 100644 index 0000000..f9d62d9 --- /dev/null +++ b/pkg/config/1.27.2.yaml @@ -0,0 +1,18 @@ +dir: ./ + +versions: + kubernetes: 1.27.2 + crictl: 1.27.0 + cni-plugins: 1.3.0 + containerd: 1.5.7 + runc: 1.1.7 + + openebs: 3.6.0 + contour: 1.18.0 + + images: + - registry.k8s.io/coredns/coredns:v1.10.1 + - registry.k8s.io/etcd:3.5.7-0 + - registry.k8s.io/pause:3.9 + - docker.io/envoyproxy/envoy:v1.26.1 + - ghcr.io/projectcontour/contour:v1.25.0 diff --git a/pkg/config/configs.go b/pkg/config/configs.go new file mode 100644 index 0000000..eca0ec4 --- /dev/null +++ b/pkg/config/configs.go @@ -0,0 +1,5 @@ +package config + +import "runtime" + +var Arch = runtime.GOARCH \ No newline at end of file diff --git a/pkg/discover/networking/ips.go b/pkg/discover/networking/ips.go new file mode 100644 index 0000000..89c6aa4 --- /dev/null +++ b/pkg/discover/networking/ips.go @@ -0,0 +1,48 @@ +package networking + +import ( + "fmt" + "io/ioutil" + "net" + "net/http" +) + +func GetPrivateIP() (string, error) { + addrs, err := net.InterfaceAddrs() + if err != nil { + return "", err + } + + for _, addr := range addrs { + ip, _, err := net.ParseCIDR(addr.String()) + if err != nil { + continue + } + + if isPrivateIP(ip) { + return ip.String(), nil + } + } + return "", fmt.Errorf("no private IP address found") +} + +func isPrivateIP(ip net.IP) bool { + if ip4 := ip.To4(); ip4 != nil { + return ip4[0] == 10 || (ip4[0] == 172 && ip4[1] >= 16 && ip4[1] <= 31) || (ip4[0]== 192 && ip4[1] == 168) + } + return false +} + +func GetPublicIP() (string, error) { + resp, err := http.Get("https://api.ipify.org") + if err != nil { + return "", fmt.Errorf("failed to query ipify API: %v", err) + } + defer resp.Body.Close() + + ip, err := ioutil.ReadAll(resp.Body) + if err != nil { + return "", fmt.Errorf("failed to read response body: %v", err) + } + return string(ip), nil +} \ No newline at end of file diff --git a/pkg/discover/system/lsb.go b/pkg/discover/system/lsb.go new file mode 100644 index 0000000..585dd60 --- /dev/null +++ b/pkg/discover/system/lsb.go @@ -0,0 +1,4 @@ +package linux + + + diff --git a/pkg/download/downloader.go b/pkg/download/downloader.go new file mode 100644 index 0000000..8680b2b --- /dev/null +++ b/pkg/download/downloader.go @@ -0,0 +1,23 @@ +package download + +import ( + "io" + "net/http" + "os" +) + +func HTTPDownloadAndSave(url string, filename string) error { + resp, err := http.Get(url) + if err != nil { + return err + } + defer resp.Body.Close() + + data, err := io.ReadAll(resp.Body) + if err != nil { + return err + } + + err = os.WriteFile(filename, data, 0644) + return err +} \ No newline at end of file diff --git a/pkg/files/cp.go b/pkg/files/cp.go new file mode 100644 index 0000000..81efb91 --- /dev/null +++ b/pkg/files/cp.go @@ -0,0 +1,23 @@ +package files + +import ( + "io" + "os" +) + +func CopyFile(src, dest string) error { + source, err := os.Open(src) + if err != nil { + return err + } + defer source.Close() + + destination, err := os.Create(dest) + if err != nil { + return err + } + defer destination.Close() + + _, err = io.Copy(destination, source) + return err +} \ No newline at end of file diff --git a/pkg/files/tar.go b/pkg/files/tar.go new file mode 100644 index 0000000..b738c73 --- /dev/null +++ b/pkg/files/tar.go @@ -0,0 +1,79 @@ +package files + +import ( + "archive/tar" + "compress/gzip" + "io" + "os" + "path/filepath" +) + + +func ExtractTarGz(filename, targetDir string) error { + f, err := os.Open(filename) + if err != nil { + return err + } + defer f.Close() + + gzr, err := gzip.NewReader(f) + if err != nil { + return err + } + defer gzr.Close() + + tr := tar.NewReader(f) + return extract(tr, targetDir) +} + +func ExtractTar(filename, targetDir string) error { + f, err := os.Open(filename) + if err != nil { + return err + } + defer f.Close() + + tr := tar.NewReader(f) + return extract(tr, targetDir) +} + +func extract(tr *tar.Reader, targetDir string) error { + for { + hdr, err := tr.Next() + if err == io.EOF { + break // reached end of archive + } else if err != nil { + return err + } + + targetPath := filepath.Join(targetDir, hdr.Name) + + info := hdr.FileInfo() + if info.IsDir() { + err = os.MkdirAll(targetPath, os.FileMode(hdr.Mode)) + if err != nil { + return err + } + } else { + // Create the file's parent directories if needed + err = os.MkdirAll(filepath.Dir(targetPath), 0755) + if err != nil { + return err + } + + outputFile, err := os.OpenFile(targetPath, os.O_RDWR|os.O_CREATE|os.O_TRUNC, os.FileMode(hdr.Mode)) + if err != nil { + return err + } + + _, err = io.Copy(outputFile, tr) + outputFile.Close() + + if err != nil { + return err + } + } + } + + return nil +} \ No newline at end of file diff --git a/pkg/images/download.go b/pkg/images/download.go new file mode 100644 index 0000000..f0902f2 --- /dev/null +++ b/pkg/images/download.go @@ -0,0 +1,23 @@ +package images + +import ( + "fmt" + "os/exec" + + "github.com/wandb/server/pkg/kubernetes/containerd" + "github.com/wandb/server/pkg/kubernetes/docker" +) + +// ImageDownloadAndSave downloads an image and saves it to a file. +func DownloadImageAndSave(image string, tag string, filename string) error { + _, err := exec.LookPath("docker") + if err != nil { + return docker.DownloadImageWithDocker(image, tag, filename) + } + + if containerd.IsInstalled() { + return containerd.DownloadImage(image, tag, filename) + } + + return fmt.Errorf("no supported container runtime found") +} diff --git a/pkg/images/load.go b/pkg/images/load.go new file mode 100644 index 0000000..b4cb115 --- /dev/null +++ b/pkg/images/load.go @@ -0,0 +1,14 @@ +package images + +import ( + "fmt" + + "github.com/wandb/server/pkg/kubernetes/containerd" +) + +func LoadImage(filename string) error { + if containerd.IsInstalled(){ + return containerd.LoadImage(filename) + } + return fmt.Errorf("no supported container runtime found") +} \ No newline at end of file diff --git a/pkg/kubernetes/cni/cni.go b/pkg/kubernetes/cni/cni.go new file mode 100644 index 0000000..f83a8a9 --- /dev/null +++ b/pkg/kubernetes/cni/cni.go @@ -0,0 +1,31 @@ +package cni + +import ( + "fmt" + "os" + "runtime" + + "github.com/wandb/server/pkg/download" + "github.com/wandb/server/pkg/files" +) + +const GithubRepo = "https://github.com/containernetworking/plugins" + +func DownloadURL(version string) string { + return fmt.Sprintf( + "%s/releases/download/v%s/cni-plugins-linux-%s-v%s.tgz", + GithubRepo, + version, + runtime.GOARCH, + version, + ) +} + +func Download(version string, path string) error { + return download.HTTPDownloadAndSave(DownloadURL(version), path) +} + +func Install(tarFile string) { + os.MkdirAll("/opt/cni/bin", 0755) + files.ExtractTarGz(tarFile, "/opt/cni/bin") +} \ No newline at end of file diff --git a/pkg/kubernetes/containerd/containerd.service b/pkg/kubernetes/containerd/containerd.service new file mode 100644 index 0000000..76b1ff9 --- /dev/null +++ b/pkg/kubernetes/containerd/containerd.service @@ -0,0 +1,42 @@ +# Copyright The containerd Authors. +# +# 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. + +[Unit] +Description=containerd container runtime +Documentation=https://containerd.io +After=network.target local-fs.target + +[Service] +#uncomment to enable the experimental sbservice (sandboxed) version of containerd/cri integration +#Environment="ENABLE_CRI_SANDBOXES=sandboxed" +ExecStartPre=-/sbin/modprobe overlay +ExecStart=/usr/local/bin/containerd + +Type=notify +Delegate=yes +KillMode=process +Restart=always +RestartSec=5 +# Having non-zero Limit*s causes performance problems due to accounting overhead +# in the kernel. We recommend using cgroups to do container-local accounting. +LimitNPROC=infinity +LimitCORE=infinity +LimitNOFILE=infinity +# Comment TasksMax if your systemd version does not supports it. +# Only systemd 226 and above support this version. +TasksMax=infinity +OOMScoreAdjust=-999 + +[Install] +WantedBy=multi-user.target \ No newline at end of file diff --git a/pkg/kubernetes/containerd/images.go b/pkg/kubernetes/containerd/images.go new file mode 100644 index 0000000..11a8189 --- /dev/null +++ b/pkg/kubernetes/containerd/images.go @@ -0,0 +1,63 @@ +package containerd + +import ( + "archive/tar" + "context" + "fmt" + "io" + "os" + "time" + + "github.com/containerd/containerd/content" +) + +func LoadImage(file string) error { + return nil +} + + +func DownloadImage(name string, tag string, filename string) error { + client := Client() + defer client.Close() + ctx := context.Background() + + imageURL := fmt.Sprintf("%s:%s", name, tag) + image, err := client.Pull( + ctx, + imageURL, + ) + if err != nil { + return fmt.Errorf("failed to pull Containerd image %s: %v", image, err) + } + + desc := image.Target() + + tarFile, err := os.Create(filename) + if err != nil { + return fmt.Errorf("failed to create tar file: %v", err) + } + defer tarFile.Close() + + tarWriter := tar.NewWriter(tarFile) + defer tarWriter.Close() + + reader, err := image.ContentStore().ReaderAt(ctx, desc) + if err != nil { + return err + } + defer reader.Close() + + hdr := &tar.Header{ + Name: desc.Digest.Hex(), + Mode: 0600, + Size: reader.Size(), + ModTime: time.Now(), + } + if err := tarWriter.WriteHeader(hdr); err != nil { + return err + } + + r := content.NewReader(reader) + _, err = io.Copy(tarWriter, r) + return err +} \ No newline at end of file diff --git a/pkg/kubernetes/containerd/install.go b/pkg/kubernetes/containerd/install.go new file mode 100644 index 0000000..2ab94d0 --- /dev/null +++ b/pkg/kubernetes/containerd/install.go @@ -0,0 +1,101 @@ +package containerd + +import ( + "context" + "fmt" + "os" + "runtime" + + _ "embed" + + "github.com/containerd/containerd" + "github.com/pterm/pterm" + "github.com/wandb/server/pkg/download" + "github.com/wandb/server/pkg/files" + "github.com/wandb/server/pkg/linux/systemd" +) + +const GithubRepo = "https://github.com/containerd/containerd" + +//go:embed containerd.service +var service string + +func DownloadURL(version string) string { + return fmt.Sprintf( + "%s/releases/download/v%s/containerd-%s-linux-%s.tar.gz", + GithubRepo, + version, + version, + runtime.GOARCH, + ) +} + +func Download(version string, path string) error { + return download.HTTPDownloadAndSave(DownloadURL(version), path) +} + +func unzip(tarFile string) error { + return files.ExtractTarGz(tarFile, "/usr/local") +} + +func setupSystemd() error { + err := os.WriteFile( + "/etc/systemd/system/containerd.service", + []byte(service), + 0600, + ) + if err != nil { + return err + } + + err = systemd.ReloadDemon() + if err != nil { + return err + } + + err = systemd.Enable("containerd") + if err != nil { + return err + } + + err = systemd.Restart("containerd") + if err != nil { + return err + } + return nil +} + +func Install(tarFile string) { + err := unzip(tarFile) + pterm.Fatal.PrintOnError(err, "failed to unzip containerd tar file") + + err = setupSystemd() + pterm.Fatal.PrintOnError(err, "failed to setup containerd systemd service") +} + +func IsInstalled() bool { + client, err := containerd.New("/run/containerd/containerd.sock") + if err != nil { + return false + } + if err = client.Close(); err != nil { + return false + } + return true +} + +func Client() (*containerd.Client) { + client, err := containerd.New("/run/containerd/containerd.sock") + pterm.Fatal.PrintOnError(err, "failed to create containerd client") + return client +} + +func Version() string { + client := Client() + defer client.Close() + + info, err := client.Version(context.Background()) + pterm.Fatal.PrintOnError(err, "failed to get containerd version") + + return info.Version +} \ No newline at end of file diff --git a/pkg/kubernetes/crictl/download.go b/pkg/kubernetes/crictl/download.go new file mode 100644 index 0000000..05ebc99 --- /dev/null +++ b/pkg/kubernetes/crictl/download.go @@ -0,0 +1,29 @@ +package crictl + +import ( + "fmt" + "runtime" + + "github.com/wandb/server/pkg/download" + "github.com/wandb/server/pkg/files" +) + +const GithubRepo = "https://github.com/kubernetes-sigs/cri-tools" + +func DownloadURL(version string) string { + return fmt.Sprintf( + "%s/releases/download/v%s/crictl-v%s-linux-%s.tar.gz", + GithubRepo, + version, + version, + runtime.GOARCH, + ) +} + +func Download(version string, path string) error { + return download.HTTPDownloadAndSave(DownloadURL(version), path) +} + +func Install(tarFile string) { + files.ExtractTarGz(tarFile, "/usr/local/bin") +} \ No newline at end of file diff --git a/pkg/kubernetes/docker/download.go b/pkg/kubernetes/docker/download.go new file mode 100644 index 0000000..be97d6f --- /dev/null +++ b/pkg/kubernetes/docker/download.go @@ -0,0 +1,29 @@ +package docker + +import ( + "fmt" + "os/exec" +) + +func DownloadImageWithDocker(name string, tag string, filename string) error { + image := fmt.Sprintf("%s:%s", name, tag) + + cmdPull := exec.Command("docker", "pull", image) + err := cmdPull.Run() + if err != nil { + return fmt.Errorf("failed to pull docker image %s: %v", image, err) + } + + cmdSave := exec.Command("docker", "save", image, "-o", filename) + err = cmdSave.Run() + if err != nil { + return fmt.Errorf("failed to save docker image %s as .tgz: %v", image, err) + } + + return nil +} + +func IsInstalled() bool { + _, err := exec.LookPath("docker") + return err != nil +} \ No newline at end of file diff --git a/pkg/kubernetes/kubeadm/ip.conf b/pkg/kubernetes/kubeadm/ip.conf new file mode 100644 index 0000000..d1f7e6d --- /dev/null +++ b/pkg/kubernetes/kubeadm/ip.conf @@ -0,0 +1,5 @@ +net.bridge.bridge-nf-call-iptables = 1 +net.ipv4.ip_forward = 1 + +net.bridge.bridge-nf-call-ip6tables = 1 +net.ipv6.ip_forward = 1 \ No newline at end of file diff --git a/pkg/kubernetes/kubeadm/k8s.conf b/pkg/kubernetes/kubeadm/k8s.conf new file mode 100644 index 0000000..a068b37 --- /dev/null +++ b/pkg/kubernetes/kubeadm/k8s.conf @@ -0,0 +1,12 @@ +overlay +br_netfilter + +ip_tables +ip6_tables + +ip_vs +ip_vs_rr +ip_vs_wrr +ip_vs_sh + +nf_conntrack \ No newline at end of file diff --git a/pkg/kubernetes/kubeadm/kubeadm.go b/pkg/kubernetes/kubeadm/kubeadm.go new file mode 100644 index 0000000..b05ef40 --- /dev/null +++ b/pkg/kubernetes/kubeadm/kubeadm.go @@ -0,0 +1,30 @@ +package kubeadm + +import ( + "fmt" + "os" + "runtime" + + "github.com/wandb/server/pkg/download" + "github.com/wandb/server/pkg/files" +) + +func DownloadURL(version string) string { + return fmt.Sprintf( + "https://dl.k8s.io/release/v%s/bin/linux/%s/kubeadm", + version, + runtime.GOARCH, + ) +} + +func Download(version string, path string) error { + return download.HTTPDownloadAndSave(DownloadURL(version), path) +} + +func Install(binary string) { + files.CopyFile(binary, "/usr/local/kubeadm") + os.Chmod("/usr/local/kubeadm", 0755) + + LoadModules() + LoadSystemdModules() +} \ No newline at end of file diff --git a/pkg/kubernetes/kubeadm/modules.go b/pkg/kubernetes/kubeadm/modules.go new file mode 100644 index 0000000..2118ef5 --- /dev/null +++ b/pkg/kubernetes/kubeadm/modules.go @@ -0,0 +1,52 @@ +package kubeadm + +import ( + "os" + "os/exec" + + _ "embed" + + "github.com/wandb/server/pkg/linux" +) + +//go:embed k8s.conf +var modulesConfig string + +func LoadModules() { + linux.Modprobe("overlay") + linux.Modprobe("br_netfilter") + + linux.Modprobe("ip_tables") + linux.Modprobe("ip6_tables") + + linux.Modprobe("ip_vs") + linux.Modprobe("ip_vs_rr") + linux.Modprobe("ip_vs_wrr") + linux.Modprobe("ip_vs_sh") + + linux.Modprobe("nf_conntrack") + + os.MkdirAll("/etc/modules-load.d", 0755) + os.WriteFile( + "/etc/modules-load.d/k8s.conf", + []byte(modulesConfig), + 0600, + ) +} + +//go:embed ip.conf +var systemdConf string + +func LoadSystemdModules() { + os.MkdirAll("/etc/sysctl.d", 0755) + os.WriteFile( + "/etc/sysctl -a.d/k8s-ipv4.conf", + []byte(systemdConf), + 0600, + ) + reloadSysctl() +} + +func reloadSysctl() error { + return exec.Command("sysctl", "--system").Run() +} \ No newline at end of file diff --git a/pkg/kubernetes/kubectl/kubectl.go b/pkg/kubernetes/kubectl/kubectl.go new file mode 100644 index 0000000..7a0ae3b --- /dev/null +++ b/pkg/kubernetes/kubectl/kubectl.go @@ -0,0 +1,27 @@ +package kubectl + +import ( + "fmt" + "os" + "runtime" + + "github.com/wandb/server/pkg/download" + "github.com/wandb/server/pkg/files" +) + +func DownloadURL(version string) string { + return fmt.Sprintf( + "https://dl.k8s.io/release/v%s/bin/linux/%s/kubectl", + version, + runtime.GOARCH, + ) +} + +func Download(version string, path string) error { + return download.HTTPDownloadAndSave(DownloadURL(version), path) +} + +func Install(binary string) { + files.CopyFile(binary, "/usr/local/kubectl") + os.Chmod("/usr/local/kubeadm", 0755) +} \ No newline at end of file diff --git a/pkg/kubernetes/kubelet/10-kube.conf b/pkg/kubernetes/kubelet/10-kube.conf new file mode 100644 index 0000000..d5c1096 --- /dev/null +++ b/pkg/kubernetes/kubelet/10-kube.conf @@ -0,0 +1,11 @@ +# Note: This dropin only works with kubeadm and kubelet v1.11+ +[Service] +Environment="KUBELET_KUBECONFIG_ARGS=--bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf" +Environment="KUBELET_CONFIG_ARGS=--config=/var/lib/kubelet/config.yaml" +# This is a file that "kubeadm init" and "kubeadm join" generates at runtime, populating the KUBELET_KUBEADM_ARGS variable dynamically +EnvironmentFile=-/var/lib/kubelet/kubeadm-flags.env +# This is a file that the user can use for overrides of the kubelet args as a last resort. Preferably, the user should use +# the .NodeRegistration.KubeletExtraArgs object in the configuration files instead. KUBELET_EXTRA_ARGS should be sourced from this file. +EnvironmentFile=-/etc/default/kubelet +ExecStart= +ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_CONFIG_ARGS $KUBELET_KUBEADM_ARGS $KUBELET_EXTRA_ARGS \ No newline at end of file diff --git a/pkg/kubernetes/kubelet/kubelet.go b/pkg/kubernetes/kubelet/kubelet.go new file mode 100644 index 0000000..a1012c0 --- /dev/null +++ b/pkg/kubernetes/kubelet/kubelet.go @@ -0,0 +1,43 @@ +package kubelet + +import ( + "fmt" + "os" + "runtime" + + _ "embed" + + "github.com/wandb/server/pkg/download" + "github.com/wandb/server/pkg/files" + "github.com/wandb/server/pkg/linux/systemd" +) + +func DownloadURL(version string) string { + return fmt.Sprintf( + "https://dl.k8s.io/release/v%s/bin/linux/%s/kubelet", + version, + runtime.GOARCH, + ) +} + +func Download(version string, path string) error { + return download.HTTPDownloadAndSave(DownloadURL(version), path) +} + +//go:embed 10-kube.conf +var service string +func Install(binary string) { + files.CopyFile(binary, "/usr/local/kubelet") + os.Chmod("/usr/local/kubelete", 0755) + + os.MkdirAll("/etc/systemd/system/kubelet.service.d", 0755) + os.WriteFile( + "/etc/systemd/system/kubelet.service.d/10-kube.conf", + []byte(service), + 0600, + ) + + systemd.ReloadDemon() + systemd.Enable("kubelete") + systemd.Restart("kubelete") +} \ No newline at end of file diff --git a/pkg/kubernetes/runc/runc.go b/pkg/kubernetes/runc/runc.go new file mode 100644 index 0000000..c471edc --- /dev/null +++ b/pkg/kubernetes/runc/runc.go @@ -0,0 +1,33 @@ +package runc + +import ( + "fmt" + "os" + "runtime" + + "github.com/pterm/pterm" + "github.com/wandb/server/pkg/download" + "github.com/wandb/server/pkg/files" +) + +const GithubRepo = "https://github.com/opencontainers/runc" + +func DownloadURL(version string) string { + return fmt.Sprintf( + "%s/releases/download/v%s/runc.%s", + GithubRepo, + version, + runtime.GOARCH, + ) +} + +func Download(version string, path string) error { + return download.HTTPDownloadAndSave(DownloadURL(version), path) +} + +func Install(file string) { + pterm.Info.Println("Installing runc") + files.CopyFile(file, "/usr/local/sbin/runc") + os.Chmod("/usr/local/sbin/runc", 0755) + pterm.Success.Println("Installed runc") +} \ No newline at end of file diff --git a/pkg/linux/modprobe.go b/pkg/linux/modprobe.go new file mode 100644 index 0000000..2cb02ef --- /dev/null +++ b/pkg/linux/modprobe.go @@ -0,0 +1,7 @@ +package linux + +import "os/exec" + +func Modprobe(mod string) error { + return exec.Command("modprobe", mod).Run() +} \ No newline at end of file diff --git a/pkg/linux/swap/swap.go b/pkg/linux/swap/swap.go new file mode 100644 index 0000000..3067fa6 --- /dev/null +++ b/pkg/linux/swap/swap.go @@ -0,0 +1,60 @@ +package swap + +import ( + "bufio" + "os" + "os/exec" + "strings" + "time" + + "github.com/pterm/pterm" +) + +func SwapIsOn() bool { + cmd := exec.Command("swapon", "--summary") + output, _ := cmd.Output() + return strings.Contains(string(output), " ") +} + +func SwapIsEnabled() bool { + return swapFstabEnabled() +} + +func swapFstabEnabled() bool { + f, _ := os.Open("/etc/fstab") + defer f.Close() + scanner := bufio.NewScanner(f) + for scanner.Scan() { + line := scanner.Text() + if !strings.HasPrefix(line, "#") && strings.Contains(line, "swap") { + return true + } + } + return false +} + +func swapFstabDisable() { + exec.Command("sed", "--in-place=.bak", "/\\bswap\\b/ s/^/#/", "/etc/fstab").Run() +} + +func MustSweepoff() { + if SwapIsOn() || SwapIsEnabled() { + pterm.Warning.Println("This application is incompatible with memory swapping enabled.") + disable, _ := pterm.DefaultInteractiveConfirm.WithDefaultValue(true).Show() + if disable { + exec.Command("swapoff", "--all").Run() + + if swapFstabEnabled() { + swapFstabDisable() + pterm.Info.Println("/etc/fstab has been updated to disable swap") + pterm.Warning.Println( + "Changes have been made to /etc/fstab." + + "We recommend reviewing them after completing this installation to " + + "ensure mounts are correctly configured.") + time.Sleep(5 * time.Second) + } + } else { + os.Exit(1) + } + } +} \ No newline at end of file diff --git a/pkg/linux/systemd/systemctl.go b/pkg/linux/systemd/systemctl.go new file mode 100644 index 0000000..4a89b43 --- /dev/null +++ b/pkg/linux/systemd/systemctl.go @@ -0,0 +1,15 @@ +package systemd + +import "os/exec" + +func ReloadDemon() error { + return exec.Command("systemctl", "daemon-reload").Run() +} + +func Enable(service string) error { + return exec.Command("systemctl", "enable", service).Run() +} + +func Restart(service string) error { + return exec.Command("systemctl", "restart", service).Run() +} \ No newline at end of file From b3acc9a7da3c64f8342148a0cc138e9a0adaa315 Mon Sep 17 00:00:00 2001 From: Justin Brooks Date: Mon, 5 Jun 2023 11:38:24 -0400 Subject: [PATCH 2/6] init messages --- cmd/installer/main.go | 7 ++++--- pkg/kubernetes/cni/cni.go | 2 ++ pkg/kubernetes/containerd/install.go | 3 +++ pkg/kubernetes/crictl/download.go | 2 ++ pkg/kubernetes/kubeadm/kubeadm.go | 4 ++++ pkg/kubernetes/kubectl/kubectl.go | 9 +++++++-- pkg/kubernetes/kubelet/kubelet.go | 3 +++ pkg/kubernetes/runc/runc.go | 3 ++- 8 files changed, 27 insertions(+), 6 deletions(-) diff --git a/cmd/installer/main.go b/cmd/installer/main.go index 8302f8c..61fc24e 100644 --- a/cmd/installer/main.go +++ b/cmd/installer/main.go @@ -6,7 +6,7 @@ import ( "github.com/pterm/pterm" "github.com/spf13/cobra" "github.com/wandb/server/pkg/cmd/bundle" - "github.com/wandb/server/pkg/linux/swap" + "github.com/wandb/server/pkg/kubernetes/kubectl" ) func RootCmd() *cobra.Command { @@ -31,8 +31,9 @@ func InstallCommand() *cobra.Command { Use: "install", Short: "Runs the installer", Run: func(cmd *cobra.Command, args []string) { - swap.MustSweepoff() - bundle.DownloadPackages() + // swap.MustSweepoff() + // bundle.DownloadPackages() + kubectl.Install("./packages/kubeadm") }, } } diff --git a/pkg/kubernetes/cni/cni.go b/pkg/kubernetes/cni/cni.go index f83a8a9..c36f6cd 100644 --- a/pkg/kubernetes/cni/cni.go +++ b/pkg/kubernetes/cni/cni.go @@ -5,6 +5,7 @@ import ( "os" "runtime" + "github.com/pterm/pterm" "github.com/wandb/server/pkg/download" "github.com/wandb/server/pkg/files" ) @@ -26,6 +27,7 @@ func Download(version string, path string) error { } func Install(tarFile string) { + pterm.Info.Printf("Installing cni plugins from %s\n", tarFile) os.MkdirAll("/opt/cni/bin", 0755) files.ExtractTarGz(tarFile, "/opt/cni/bin") } \ No newline at end of file diff --git a/pkg/kubernetes/containerd/install.go b/pkg/kubernetes/containerd/install.go index 2ab94d0..2652676 100644 --- a/pkg/kubernetes/containerd/install.go +++ b/pkg/kubernetes/containerd/install.go @@ -31,6 +31,7 @@ func DownloadURL(version string) string { } func Download(version string, path string) error { + pterm.Info.Printf("Downloading containerd: v%s\n", version) return download.HTTPDownloadAndSave(DownloadURL(version), path) } @@ -66,6 +67,8 @@ func setupSystemd() error { } func Install(tarFile string) { + pterm.Info.Printf("Installing containerd from %s\n", tarFile) + err := unzip(tarFile) pterm.Fatal.PrintOnError(err, "failed to unzip containerd tar file") diff --git a/pkg/kubernetes/crictl/download.go b/pkg/kubernetes/crictl/download.go index 05ebc99..5479d12 100644 --- a/pkg/kubernetes/crictl/download.go +++ b/pkg/kubernetes/crictl/download.go @@ -4,6 +4,7 @@ import ( "fmt" "runtime" + "github.com/pterm/pterm" "github.com/wandb/server/pkg/download" "github.com/wandb/server/pkg/files" ) @@ -21,6 +22,7 @@ func DownloadURL(version string) string { } func Download(version string, path string) error { + pterm.Info.Printf("Downloading crictl: v%s\n", version) return download.HTTPDownloadAndSave(DownloadURL(version), path) } diff --git a/pkg/kubernetes/kubeadm/kubeadm.go b/pkg/kubernetes/kubeadm/kubeadm.go index b05ef40..ac8ddd4 100644 --- a/pkg/kubernetes/kubeadm/kubeadm.go +++ b/pkg/kubernetes/kubeadm/kubeadm.go @@ -5,6 +5,7 @@ import ( "os" "runtime" + "github.com/pterm/pterm" "github.com/wandb/server/pkg/download" "github.com/wandb/server/pkg/files" ) @@ -18,10 +19,13 @@ func DownloadURL(version string) string { } func Download(version string, path string) error { + pterm.Info.Printf("Downloading runc: v%s\n", version) return download.HTTPDownloadAndSave(DownloadURL(version), path) } func Install(binary string) { + pterm.Info.Printf("Installing kubeadm from %s\n", binary) + files.CopyFile(binary, "/usr/local/kubeadm") os.Chmod("/usr/local/kubeadm", 0755) diff --git a/pkg/kubernetes/kubectl/kubectl.go b/pkg/kubernetes/kubectl/kubectl.go index 7a0ae3b..08c10c5 100644 --- a/pkg/kubernetes/kubectl/kubectl.go +++ b/pkg/kubernetes/kubectl/kubectl.go @@ -5,6 +5,7 @@ import ( "os" "runtime" + "github.com/pterm/pterm" "github.com/wandb/server/pkg/download" "github.com/wandb/server/pkg/files" ) @@ -18,10 +19,14 @@ func DownloadURL(version string) string { } func Download(version string, path string) error { + pterm.Info.Printf("Downloading kubectl: v%s\n", version) return download.HTTPDownloadAndSave(DownloadURL(version), path) } func Install(binary string) { - files.CopyFile(binary, "/usr/local/kubectl") - os.Chmod("/usr/local/kubeadm", 0755) + pterm.Info.Printf("Installing kubectl from %s\n", binary) + err := files.CopyFile(binary, "/usr/local/bin/kubectl") + pterm.Error.PrintOnError(err) + err = os.Chmod("/usr/local/bin/kubectl", 0755) + pterm.Error.PrintOnError(err) } \ No newline at end of file diff --git a/pkg/kubernetes/kubelet/kubelet.go b/pkg/kubernetes/kubelet/kubelet.go index a1012c0..849f612 100644 --- a/pkg/kubernetes/kubelet/kubelet.go +++ b/pkg/kubernetes/kubelet/kubelet.go @@ -7,6 +7,7 @@ import ( _ "embed" + "github.com/pterm/pterm" "github.com/wandb/server/pkg/download" "github.com/wandb/server/pkg/files" "github.com/wandb/server/pkg/linux/systemd" @@ -21,12 +22,14 @@ func DownloadURL(version string) string { } func Download(version string, path string) error { + pterm.Info.Printf("Downloading kubelet: v%s\n", version) return download.HTTPDownloadAndSave(DownloadURL(version), path) } //go:embed 10-kube.conf var service string func Install(binary string) { + pterm.Info.Printf("Installing kubelet from %s\n", binary) files.CopyFile(binary, "/usr/local/kubelet") os.Chmod("/usr/local/kubelete", 0755) diff --git a/pkg/kubernetes/runc/runc.go b/pkg/kubernetes/runc/runc.go index c471edc..aef9bf5 100644 --- a/pkg/kubernetes/runc/runc.go +++ b/pkg/kubernetes/runc/runc.go @@ -22,11 +22,12 @@ func DownloadURL(version string) string { } func Download(version string, path string) error { + pterm.Info.Printf("Downloading runc: v%s\n", version) return download.HTTPDownloadAndSave(DownloadURL(version), path) } func Install(file string) { - pterm.Info.Println("Installing runc") + pterm.Info.Printf("Installing runc from %s\n", file) files.CopyFile(file, "/usr/local/sbin/runc") os.Chmod("/usr/local/sbin/runc", 0755) pterm.Success.Println("Installed runc") From ef05605f8072496a21ca85a2711b26fda4616bf3 Mon Sep 17 00:00:00 2001 From: Justin Brooks Date: Tue, 6 Jun 2023 00:53:06 -0400 Subject: [PATCH 3/6] package clean up --- .gitignore | 4 +- cmd/installer/main.go | 11 +- go.mod | 13 ++ go.sum | 35 +++++ pkg/cmd/bundle/bundle.go | 42 +++--- pkg/cmd/install/install.go | 32 ++--- pkg/{download => dependency}/downloader.go | 11 +- pkg/files/tar.go | 79 ------------ pkg/images/download.go | 8 +- pkg/kubernetes/addons/flannel/flannel.go | 68 ++++++++++ pkg/kubernetes/cni/cni.go | 47 +++++-- pkg/kubernetes/conntrack/conntrack.go | 53 ++++++++ pkg/kubernetes/containerd/client.go | 35 +++++ pkg/kubernetes/containerd/images.go | 5 +- pkg/kubernetes/containerd/install.go | 104 --------------- pkg/kubernetes/containerd/package.go | 101 +++++++++++++++ pkg/kubernetes/crictl/download.go | 31 ----- pkg/kubernetes/crictl/package.go | 58 +++++++++ pkg/kubernetes/docker/download.go | 4 +- pkg/kubernetes/helm/package.go | 52 ++++++++ pkg/kubernetes/kubeadm/kubeadm.go | 142 +++++++++++++++++++-- pkg/kubernetes/kubeadm/modules.go | 14 +- pkg/kubernetes/kubectl/kubectl.go | 48 +++++-- pkg/kubernetes/kubelet/kubelet.go | 59 +++++++-- pkg/kubernetes/kubelet/kubelet.service | 14 ++ pkg/kubernetes/manifests.go | 52 ++++++++ pkg/kubernetes/runc/runc.go | 48 +++++-- pkg/linux/debian/pkg.go | 15 +++ 28 files changed, 859 insertions(+), 326 deletions(-) rename pkg/{download => dependency}/downloader.go (72%) delete mode 100644 pkg/files/tar.go create mode 100644 pkg/kubernetes/addons/flannel/flannel.go create mode 100644 pkg/kubernetes/conntrack/conntrack.go create mode 100644 pkg/kubernetes/containerd/client.go delete mode 100644 pkg/kubernetes/containerd/install.go create mode 100644 pkg/kubernetes/containerd/package.go delete mode 100644 pkg/kubernetes/crictl/download.go create mode 100644 pkg/kubernetes/crictl/package.go create mode 100644 pkg/kubernetes/helm/package.go create mode 100644 pkg/kubernetes/kubelet/kubelet.service create mode 100644 pkg/kubernetes/manifests.go create mode 100644 pkg/linux/debian/pkg.go diff --git a/.gitignore b/.gitignore index 9711bab..3d001d5 100644 --- a/.gitignore +++ b/.gitignore @@ -11,4 +11,6 @@ js/ packages .DS_store -*.log \ No newline at end of file +*.log + +bin \ No newline at end of file diff --git a/cmd/installer/main.go b/cmd/installer/main.go index 61fc24e..8409e4a 100644 --- a/cmd/installer/main.go +++ b/cmd/installer/main.go @@ -6,7 +6,9 @@ import ( "github.com/pterm/pterm" "github.com/spf13/cobra" "github.com/wandb/server/pkg/cmd/bundle" - "github.com/wandb/server/pkg/kubernetes/kubectl" + "github.com/wandb/server/pkg/cmd/install" + "github.com/wandb/server/pkg/kubernetes/kubeadm" + "github.com/wandb/server/pkg/linux/swap" ) func RootCmd() *cobra.Command { @@ -31,9 +33,10 @@ func InstallCommand() *cobra.Command { Use: "install", Short: "Runs the installer", Run: func(cmd *cobra.Command, args []string) { - // swap.MustSweepoff() - // bundle.DownloadPackages() - kubectl.Install("./packages/kubeadm") + swap.MustSweepoff() + bundle.DownloadPackages() + install.InstallPackages() + kubeadm.Init() }, } } diff --git a/go.mod b/go.mod index b1bc0a0..4165efb 100644 --- a/go.mod +++ b/go.mod @@ -6,6 +6,8 @@ require ( github.com/containerd/containerd v1.7.2 github.com/pterm/pterm v0.12.62 github.com/spf13/cobra v1.7.0 + k8s.io/api v0.27.2 + k8s.io/apimachinery v0.27.2 ) require ( @@ -30,9 +32,11 @@ require ( github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/protobuf v1.5.3 // indirect github.com/google/go-cmp v0.5.9 // indirect + github.com/google/gofuzz v1.2.0 // indirect github.com/google/uuid v1.3.0 // indirect github.com/gookit/color v1.5.3 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect github.com/klauspost/compress v1.16.0 // indirect github.com/lithammer/fuzzysearch v1.1.8 // indirect github.com/mattn/go-runewidth v0.0.14 // indirect @@ -40,6 +44,8 @@ require ( github.com/moby/sys/mountinfo v0.6.2 // indirect github.com/moby/sys/sequential v0.5.0 // indirect github.com/moby/sys/signal v0.7.0 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.2 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect github.com/opencontainers/image-spec v1.1.0-rc2.0.20221005185240-3a7f492d3f1b // indirect github.com/opencontainers/runc v1.1.5 // indirect @@ -63,4 +69,11 @@ require ( google.golang.org/genproto v0.0.0-20230306155012-7f2fa6fef1f4 // indirect google.golang.org/grpc v1.53.0 // indirect google.golang.org/protobuf v1.29.1 // indirect + gopkg.in/inf.v0 v0.9.1 // indirect + gopkg.in/yaml.v2 v2.4.0 // indirect + k8s.io/klog/v2 v2.90.1 // indirect + k8s.io/utils v0.0.0-20230220204549-a5ecb0141aa5 // indirect + sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect + sigs.k8s.io/structured-merge-diff/v4 v4.2.3 // indirect + sigs.k8s.io/yaml v1.3.0 // indirect ) diff --git a/go.sum b/go.sum index 92f8378..2a7f301 100644 --- a/go.sum +++ b/go.sum @@ -59,6 +59,7 @@ github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.m github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= +github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0= github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= @@ -96,6 +97,9 @@ github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= @@ -105,6 +109,8 @@ github.com/gookit/color v1.5.3 h1:twfIhZs4QLCtimkP7MOxlF3A0U/5cDPseRT9M/+2SCE= github.com/gookit/color v1.5.3/go.mod h1:NUzwzeehUfl7GIb36pqId+UGmRfQcU/WiiyTTeNjHtE= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/klauspost/compress v1.16.0 h1:iULayQNOReoYUe+1qtKOqw9CwJv3aNQu8ivo7lw1HU4= @@ -115,8 +121,10 @@ github.com/klauspost/cpuid/v2 v2.0.12/go.mod h1:g2LTdtYhdyuGPqyWyv7qRAmj1WBqxuOb github.com/klauspost/cpuid/v2 v2.2.3 h1:sxCkb+qR91z4vsqw4vGGZlDgPz3G7gjaLyK3V8y70BU= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/lithammer/fuzzysearch v1.1.8 h1:/HIuJnjHuXS8bKaiTMeeDlW2/AyIWk2brx1V8LFgLN4= github.com/lithammer/fuzzysearch v1.1.8/go.mod h1:IdqeyBClc3FFqSzYq/MXESsS4S0FsZ5ajtkr5xPLts4= github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= @@ -131,6 +139,11 @@ github.com/moby/sys/sequential v0.5.0 h1:OPvI35Lzn9K04PBbCLW0g4LcFAJgHsvXsRyewg5 github.com/moby/sys/sequential v0.5.0/go.mod h1:tH2cOOs5V9MlPiXcQzRC+eEyab644PWKGRYaaV5ZZlo= github.com/moby/sys/signal v0.7.0 h1:25RW3d5TnQEoKvRbEKUGay6DCQ46IxAVTT9CUMgmsSI= github.com/moby/sys/signal v0.7.0/go.mod h1:GQ6ObYZfqacOwTtlXvcmh9A26dVRul/hbOZn88Kg8Tg= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/mrunalp/fileutils v0.5.0/go.mod h1:M1WthSahJixYnrXQl/DFQuteStB1weuxD2QJNHXfbSQ= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= @@ -163,6 +176,7 @@ github.com/pterm/pterm v0.12.62/go.mod h1:+c3ujjE7N5qmNx6eKAa7YVSC6m/gCorJJKhzwY github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis= github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= +github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/seccomp/libseccomp-golang v0.9.2-0.20220502022130-f33da4d89646/go.mod h1:JA8cRccbGaA1s33RQf7Y1+q9gHmZX1yB/z9WDN1C6fg= @@ -180,6 +194,7 @@ github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+ github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= @@ -327,11 +342,31 @@ google.golang.org/protobuf v1.29.1 h1:7QBf+IK2gx70Ap/hDsOmam3GE0v9HicjfEdAxE62Uo google.golang.org/protobuf v1.29.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= +gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +k8s.io/api v0.27.2 h1:+H17AJpUMvl+clT+BPnKf0E3ksMAzoBBg7CntpSuADo= +k8s.io/api v0.27.2/go.mod h1:ENmbocXfBT2ADujUXcBhHV55RIT31IIEvkntP6vZKS4= +k8s.io/apimachinery v0.27.2 h1:vBjGaKKieaIreI+oQwELalVG4d8f3YAMNpWLzDXkxeg= +k8s.io/apimachinery v0.27.2/go.mod h1:XNfZ6xklnMCOGGFNqXG7bUrQCoR04dh/E7FprV6pb+E= +k8s.io/klog/v2 v2.90.1 h1:m4bYOKall2MmOiRaR1J+We67Do7vm9KiQVlT96lnHUw= +k8s.io/klog/v2 v2.90.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= +k8s.io/utils v0.0.0-20230220204549-a5ecb0141aa5 h1:kmDqav+P+/5e1i9tFfHq1qcF3sOrDp+YEkVDAHu7Jwk= +k8s.io/utils v0.0.0-20230220204549-a5ecb0141aa5/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo= +sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= +sigs.k8s.io/structured-merge-diff/v4 v4.2.3 h1:PRbqxJClWWYMNV1dhaG4NsibJbArud9kFxnAMREiWFE= +sigs.k8s.io/structured-merge-diff/v4 v4.2.3/go.mod h1:qjx8mGObPmV2aSZepjQjbmb2ihdVs8cGKBraizNC69E= +sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= +sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= diff --git a/pkg/cmd/bundle/bundle.go b/pkg/cmd/bundle/bundle.go index eb46a97..dcd3f9e 100644 --- a/pkg/cmd/bundle/bundle.go +++ b/pkg/cmd/bundle/bundle.go @@ -1,27 +1,29 @@ package bundle import ( + "os" "sync" "github.com/pterm/pterm" - "github.com/wandb/server/pkg/kubernetes/cni" - "github.com/wandb/server/pkg/kubernetes/containerd" - "github.com/wandb/server/pkg/kubernetes/crictl" - "github.com/wandb/server/pkg/kubernetes/kubeadm" - "github.com/wandb/server/pkg/kubernetes/kubectl" - "github.com/wandb/server/pkg/kubernetes/kubelet" - "github.com/wandb/server/pkg/kubernetes/runc" + "github.com/wandb/server/pkg/dependency" + "github.com/wandb/server/pkg/kubernetes/addons/flannel" + "github.com/wandb/server/pkg/kubernetes/helm" ) func DownloadPackages() { - packages := []func()error{ - func() error { return containerd.Download("1.7.1", "./packages/containerd.tar.gz") }, - func() error { return crictl.Download("1.27.0", "./packages/crictl.tar.gz") }, - func() error { return runc.Download("1.1.7", "./packages/runc") }, - func() error { return cni.Download("1.3.0", "./packages/cni-plugins.tar.gz") }, - func() error { return kubeadm.Download("1.27.2", "./packages/kubeadm") }, - func() error { return kubelet.Download("1.27.2", "./packages/kubelet") }, - func() error { return kubectl.Download("1.27.2", "./packages/kubectl") }, + downloadDir := "./packages" + os.MkdirAll(downloadDir, 0755) + packages := []dependency.Package{ + // containerd.NewPackage("1.7.2", downloadDir), + // crictl.NewPackage("1.27.0", downloadDir), + // runc.NewPackage("1.1.7", downloadDir), + // cni.NewPackage("1.3.0", downloadDir), + // conntrack.NewPackage("1.4.6-2", downloadDir), + // kubeadm.NewPackage("1.27.2", downloadDir), + // kubectl.NewPackage("1.27.2", downloadDir), + // kubelet.NewPackage("1.27.2", downloadDir), + flannel.NewPackage("0.22.0", downloadDir), + helm.NewPackage("3.12.0", downloadDir), } progressbar, _ := pterm.DefaultProgressbar. @@ -32,8 +34,14 @@ func DownloadPackages() { wg := sync.WaitGroup{} wg.Add(len(packages)) for _, pkg := range packages { - go func(download func()error) { - err := download() + go func(p dependency.Package) { + pterm.Info.Printf("Downloading %s (v%s)\n", p.Name(), p.Version()) + err := p.Download() + if err == nil { + pterm.Success.Printf("Downloaded %s (v%s)\n", p.Name(), p.Version()) + } else { + pterm.Error.Printf("Failed to download %s (v%s): %w\n", p.Name(), p.Version(), err) + } progressbar.Increment() wg.Done() pterm.Error.PrintOnError(err) diff --git a/pkg/cmd/install/install.go b/pkg/cmd/install/install.go index c81d273..b3c5811 100644 --- a/pkg/cmd/install/install.go +++ b/pkg/cmd/install/install.go @@ -1,39 +1,33 @@ -package isntall +package install import ( "sync" "github.com/pterm/pterm" - "github.com/wandb/server/pkg/kubernetes/cni" - "github.com/wandb/server/pkg/kubernetes/containerd" - "github.com/wandb/server/pkg/kubernetes/crictl" - "github.com/wandb/server/pkg/kubernetes/kubeadm" - "github.com/wandb/server/pkg/kubernetes/kubectl" - "github.com/wandb/server/pkg/kubernetes/kubelet" - "github.com/wandb/server/pkg/kubernetes/runc" ) -func Install() { +func InstallPackages() { packages := []func(){ - func() { containerd.Install("./packages/containerd.tar.gz") }, - func() { crictl.Install("./packages/crictl.tar.gz") }, - func() { runc.Install("./packages/runc") }, - func() { cni.Install("./packages/cni-plugins.tar.gz") }, - func() { kubeadm.Install("./packages/kubeadm") }, - func() { kubelet.Install("./packages/kubelet") }, - func() { kubectl.Install("./packages/kubectl") }, + // func() { containerd.Install("./packages/containerd.tar.gz") }, + // func() { crictl.Install("./packages/crictl.tar.gz") }, + // func() { runc.Install("./packages/runc") }, + // func() { cni.Install("./packages/cni-plugins.tar.gz") }, + // func() { kubeadm.Install("./packages/kubeadm") }, + // func() { kubelet.Install("./packages/kubelet") }, + // func() { kubectl.Install("./packages/kubectl") }, + // func() { conntrack.Install("./packages/conntrack.deb") }, } progressbar, _ := pterm.DefaultProgressbar. WithTotal(len(packages)). - WithTitle("Downloading packages"). + WithTitle("Installing packages"). Start() wg := sync.WaitGroup{} wg.Add(len(packages)) for _, pkg := range packages { - go func(download func()) { - download() + go func(install func()) { + install() progressbar.Increment() wg.Done() }(pkg) diff --git a/pkg/download/downloader.go b/pkg/dependency/downloader.go similarity index 72% rename from pkg/download/downloader.go rename to pkg/dependency/downloader.go index 8680b2b..ad82b59 100644 --- a/pkg/download/downloader.go +++ b/pkg/dependency/downloader.go @@ -1,4 +1,4 @@ -package download +package dependency import ( "io" @@ -20,4 +20,11 @@ func HTTPDownloadAndSave(url string, filename string) error { err = os.WriteFile(filename, data, 0644) return err -} \ No newline at end of file +} + +type Package interface { + Version() string + Name() string + Install() error + Download() error +} diff --git a/pkg/files/tar.go b/pkg/files/tar.go deleted file mode 100644 index b738c73..0000000 --- a/pkg/files/tar.go +++ /dev/null @@ -1,79 +0,0 @@ -package files - -import ( - "archive/tar" - "compress/gzip" - "io" - "os" - "path/filepath" -) - - -func ExtractTarGz(filename, targetDir string) error { - f, err := os.Open(filename) - if err != nil { - return err - } - defer f.Close() - - gzr, err := gzip.NewReader(f) - if err != nil { - return err - } - defer gzr.Close() - - tr := tar.NewReader(f) - return extract(tr, targetDir) -} - -func ExtractTar(filename, targetDir string) error { - f, err := os.Open(filename) - if err != nil { - return err - } - defer f.Close() - - tr := tar.NewReader(f) - return extract(tr, targetDir) -} - -func extract(tr *tar.Reader, targetDir string) error { - for { - hdr, err := tr.Next() - if err == io.EOF { - break // reached end of archive - } else if err != nil { - return err - } - - targetPath := filepath.Join(targetDir, hdr.Name) - - info := hdr.FileInfo() - if info.IsDir() { - err = os.MkdirAll(targetPath, os.FileMode(hdr.Mode)) - if err != nil { - return err - } - } else { - // Create the file's parent directories if needed - err = os.MkdirAll(filepath.Dir(targetPath), 0755) - if err != nil { - return err - } - - outputFile, err := os.OpenFile(targetPath, os.O_RDWR|os.O_CREATE|os.O_TRUNC, os.FileMode(hdr.Mode)) - if err != nil { - return err - } - - _, err = io.Copy(outputFile, tr) - outputFile.Close() - - if err != nil { - return err - } - } - } - - return nil -} \ No newline at end of file diff --git a/pkg/images/download.go b/pkg/images/download.go index f0902f2..40b08b1 100644 --- a/pkg/images/download.go +++ b/pkg/images/download.go @@ -8,15 +8,15 @@ import ( "github.com/wandb/server/pkg/kubernetes/docker" ) -// ImageDownloadAndSave downloads an image and saves it to a file. -func DownloadImageAndSave(image string, tag string, filename string) error { +// Download downloads an image and saves it to a file. +func Download(image string, filename string) error { _, err := exec.LookPath("docker") if err != nil { - return docker.DownloadImageWithDocker(image, tag, filename) + return docker.DownloadImage(image, filename) } if containerd.IsInstalled() { - return containerd.DownloadImage(image, tag, filename) + return containerd.DownloadImage(image, filename) } return fmt.Errorf("no supported container runtime found") diff --git a/pkg/kubernetes/addons/flannel/flannel.go b/pkg/kubernetes/addons/flannel/flannel.go new file mode 100644 index 0000000..335bcaf --- /dev/null +++ b/pkg/kubernetes/addons/flannel/flannel.go @@ -0,0 +1,68 @@ +package flannel + +import ( + "fmt" + "os" + "path" + "strings" + + "github.com/wandb/server/pkg/dependency" + "github.com/wandb/server/pkg/images" + "github.com/wandb/server/pkg/kubernetes" +) + +const githubRepo = "https://github.com/flannel-io/flannel" + +func manifestURL(version string) string { + return fmt.Sprintf( + "%s/releases/download/v%s/kube-flannel.yml", + githubRepo, + version, + ) +} + +func NewPackage(version string, dest string) dependency.Package { + return &FlannelPackage{version, dest} +} + +type FlannelPackage struct { + version string + dest string +} + +func (p FlannelPackage) path() string { + pa := path.Join(p.dest, p.Name(), p.version) + os.MkdirAll(pa, 0755) + return pa +} + +func (p FlannelPackage) Download() error { + err := dependency.HTTPDownloadAndSave( + manifestURL(p.version), + path.Join(p.path(), "kube-flannel.yml"), + ) + if err != nil { + return err + } + + f, _ := os.ReadFile(path.Join(p.path(), "kube-flannel.yml")) + imgs, _ := kubernetes.GetImagesFromManifest(string(f)) + for _, image := range imgs { + dir := path.Join(p.path(), strings.Split(image, ":")[0]) + os.MkdirAll(dir, 0755) + images.Download(image, path.Join(dir, "image.tar")) + } + return nil +} + +func (p FlannelPackage) Install() error { + panic("unimplemented") +} + +func (p FlannelPackage) Name() string { + return "flannel" +} + +func (p FlannelPackage) Version() string { + return p.version +} diff --git a/pkg/kubernetes/cni/cni.go b/pkg/kubernetes/cni/cni.go index c36f6cd..88356ac 100644 --- a/pkg/kubernetes/cni/cni.go +++ b/pkg/kubernetes/cni/cni.go @@ -3,11 +3,11 @@ package cni import ( "fmt" "os" + "os/exec" + "path" "runtime" - "github.com/pterm/pterm" - "github.com/wandb/server/pkg/download" - "github.com/wandb/server/pkg/files" + "github.com/wandb/server/pkg/dependency" ) const GithubRepo = "https://github.com/containernetworking/plugins" @@ -22,12 +22,41 @@ func DownloadURL(version string) string { ) } -func Download(version string, path string) error { - return download.HTTPDownloadAndSave(DownloadURL(version), path) +func NewPackage(version string, dest string) dependency.Package { + return &CNIPluginPackage{version, dest} } -func Install(tarFile string) { - pterm.Info.Printf("Installing cni plugins from %s\n", tarFile) - os.MkdirAll("/opt/cni/bin", 0755) - files.ExtractTarGz(tarFile, "/opt/cni/bin") +type CNIPluginPackage struct{ + version string + dest string +} + +func (p CNIPluginPackage) Version() string { + return p.version +} + +func (p CNIPluginPackage) path() string { + pa := path.Join(p.dest, p.Name(), p.version) + os.MkdirAll(pa, 0755) + return pa +} + +func (p CNIPluginPackage) Install() error { + err := os.MkdirAll("/opt/cni/bin", 0755) + if err != nil { + return err + } + tar := path.Join(p.path(), "cni-plugins.tgz") + return exec.Command("tar", "-xzf", tar, "-C", "/opt/cni/bin").Run() +} + +func (p CNIPluginPackage) Download() error { + return dependency.HTTPDownloadAndSave( + DownloadURL(p.version), + path.Join(p.path(), "cni-plugins.tgz"), + ) +} + +func (p CNIPluginPackage) Name() string { + return "cni-plugins" } \ No newline at end of file diff --git a/pkg/kubernetes/conntrack/conntrack.go b/pkg/kubernetes/conntrack/conntrack.go new file mode 100644 index 0000000..e5d2a4c --- /dev/null +++ b/pkg/kubernetes/conntrack/conntrack.go @@ -0,0 +1,53 @@ +package conntrack + +import ( + "fmt" + "os" + "path" + "runtime" + + "github.com/wandb/server/pkg/dependency" + "github.com/wandb/server/pkg/linux/debian" +) + +func DownloadURL(version string) string { + return fmt.Sprintf( + "https://deb.debian.org/debian/pool/main/c/conntrack-tools/conntrack_%s_%s.deb", + version, + runtime.GOARCH, + ) +} + +func NewPackage(version string, dest string) dependency.Package { + return &ConntrackPackage{version, dest} +} + +type ConntrackPackage struct { + version string + dest string +} + +func (p ConntrackPackage) path() string { + pa := path.Join(p.dest, p.Name(), p.version) + os.MkdirAll(pa, 0755) + return pa +} + +func (p *ConntrackPackage) Version() string { + return p.version +} + +func (p *ConntrackPackage) Install() error { + return debian.InstallPackage(p.dest) +} + +func (p *ConntrackPackage) Download() error { + return dependency.HTTPDownloadAndSave( + DownloadURL(p.version), + path.Join(p.path(), "conntrack.deb"), + ) +} + +func (p *ConntrackPackage) Name() string { + return "conntrack" +} diff --git a/pkg/kubernetes/containerd/client.go b/pkg/kubernetes/containerd/client.go new file mode 100644 index 0000000..18b3398 --- /dev/null +++ b/pkg/kubernetes/containerd/client.go @@ -0,0 +1,35 @@ +package containerd + +import ( + "context" + + "github.com/containerd/containerd" + "github.com/pterm/pterm" +) + +func Client() (*containerd.Client) { + client, err := containerd.New("/run/containerd/containerd.sock") + pterm.Fatal.PrintOnError(err, "failed to create containerd client") + return client +} + +func Version() string { + client := Client() + defer client.Close() + + info, err := client.Version(context.Background()) + pterm.Fatal.PrintOnError(err, "failed to get containerd version") + + return info.Version +} + +func IsInstalled() bool { + client, err := containerd.New("/run/containerd/containerd.sock") + if err != nil { + return false + } + if err = client.Close(); err != nil { + return false + } + return true +} \ No newline at end of file diff --git a/pkg/kubernetes/containerd/images.go b/pkg/kubernetes/containerd/images.go index 11a8189..31dfbbb 100644 --- a/pkg/kubernetes/containerd/images.go +++ b/pkg/kubernetes/containerd/images.go @@ -16,15 +16,14 @@ func LoadImage(file string) error { } -func DownloadImage(name string, tag string, filename string) error { +func DownloadImage(name string, filename string) error { client := Client() defer client.Close() ctx := context.Background() - imageURL := fmt.Sprintf("%s:%s", name, tag) image, err := client.Pull( ctx, - imageURL, + name, ) if err != nil { return fmt.Errorf("failed to pull Containerd image %s: %v", image, err) diff --git a/pkg/kubernetes/containerd/install.go b/pkg/kubernetes/containerd/install.go deleted file mode 100644 index 2652676..0000000 --- a/pkg/kubernetes/containerd/install.go +++ /dev/null @@ -1,104 +0,0 @@ -package containerd - -import ( - "context" - "fmt" - "os" - "runtime" - - _ "embed" - - "github.com/containerd/containerd" - "github.com/pterm/pterm" - "github.com/wandb/server/pkg/download" - "github.com/wandb/server/pkg/files" - "github.com/wandb/server/pkg/linux/systemd" -) - -const GithubRepo = "https://github.com/containerd/containerd" - -//go:embed containerd.service -var service string - -func DownloadURL(version string) string { - return fmt.Sprintf( - "%s/releases/download/v%s/containerd-%s-linux-%s.tar.gz", - GithubRepo, - version, - version, - runtime.GOARCH, - ) -} - -func Download(version string, path string) error { - pterm.Info.Printf("Downloading containerd: v%s\n", version) - return download.HTTPDownloadAndSave(DownloadURL(version), path) -} - -func unzip(tarFile string) error { - return files.ExtractTarGz(tarFile, "/usr/local") -} - -func setupSystemd() error { - err := os.WriteFile( - "/etc/systemd/system/containerd.service", - []byte(service), - 0600, - ) - if err != nil { - return err - } - - err = systemd.ReloadDemon() - if err != nil { - return err - } - - err = systemd.Enable("containerd") - if err != nil { - return err - } - - err = systemd.Restart("containerd") - if err != nil { - return err - } - return nil -} - -func Install(tarFile string) { - pterm.Info.Printf("Installing containerd from %s\n", tarFile) - - err := unzip(tarFile) - pterm.Fatal.PrintOnError(err, "failed to unzip containerd tar file") - - err = setupSystemd() - pterm.Fatal.PrintOnError(err, "failed to setup containerd systemd service") -} - -func IsInstalled() bool { - client, err := containerd.New("/run/containerd/containerd.sock") - if err != nil { - return false - } - if err = client.Close(); err != nil { - return false - } - return true -} - -func Client() (*containerd.Client) { - client, err := containerd.New("/run/containerd/containerd.sock") - pterm.Fatal.PrintOnError(err, "failed to create containerd client") - return client -} - -func Version() string { - client := Client() - defer client.Close() - - info, err := client.Version(context.Background()) - pterm.Fatal.PrintOnError(err, "failed to get containerd version") - - return info.Version -} \ No newline at end of file diff --git a/pkg/kubernetes/containerd/package.go b/pkg/kubernetes/containerd/package.go new file mode 100644 index 0000000..72ceab3 --- /dev/null +++ b/pkg/kubernetes/containerd/package.go @@ -0,0 +1,101 @@ +package containerd + +import ( + "fmt" + "os" + "os/exec" + "path" + "runtime" + + _ "embed" + + "github.com/pterm/pterm" + download "github.com/wandb/server/pkg/dependency" + "github.com/wandb/server/pkg/linux/systemd" +) + +const GithubRepo = "https://github.com/containerd/containerd" + +func DownloadURL(version string) string { + return fmt.Sprintf( + "%s/releases/download/v%s/containerd-%s-linux-%s.tar.gz", + GithubRepo, + version, + version, + runtime.GOARCH, + ) +} + +// go:embed containerd.service +var service string +func setupSystemd() error { + pterm.Info.Println("Configuring containerd in systemd") + + err := os.MkdirAll("/etc/systemd/system", 0755) + if err != nil { + return err + } + err = os.WriteFile( + "/etc/systemd/system/containerd.service", + []byte(service), + 0600, + ) + if err != nil { + return err + } + + err = systemd.ReloadDemon() + if err != nil { + return err + } + + err = systemd.Enable("containerd") + if err != nil { + return err + } + + err = systemd.Restart("containerd") + if err != nil { + return err + } + return nil +} + +func NewPackage(version string, dest string) download.Package { + return &ContainerdPackage{version, dest} +} + +type ContainerdPackage struct{ + version string + dest string +} + +func (p ContainerdPackage) path() string { + pa := path.Join(p.dest, p.Name(), p.version) + os.MkdirAll(pa, 0755) + return pa +} + +func (p ContainerdPackage) Version() string { + return p.version +} + +func (p ContainerdPackage) Install() error { + tar := path.Join(p.path(), "containerd.tar.gz") + err := exec.Command("tar", "-xzf", tar, "-C", "/usr/local").Run() + if err != nil { + return err + } + return setupSystemd() +} + +func (p ContainerdPackage) Download() error { + return download.HTTPDownloadAndSave( + DownloadURL(p.version), + path.Join(p.path(), "containerd.tar.gz"), + ) +} + +func (p *ContainerdPackage) Name() string { + return "containerd" +} \ No newline at end of file diff --git a/pkg/kubernetes/crictl/download.go b/pkg/kubernetes/crictl/download.go deleted file mode 100644 index 5479d12..0000000 --- a/pkg/kubernetes/crictl/download.go +++ /dev/null @@ -1,31 +0,0 @@ -package crictl - -import ( - "fmt" - "runtime" - - "github.com/pterm/pterm" - "github.com/wandb/server/pkg/download" - "github.com/wandb/server/pkg/files" -) - -const GithubRepo = "https://github.com/kubernetes-sigs/cri-tools" - -func DownloadURL(version string) string { - return fmt.Sprintf( - "%s/releases/download/v%s/crictl-v%s-linux-%s.tar.gz", - GithubRepo, - version, - version, - runtime.GOARCH, - ) -} - -func Download(version string, path string) error { - pterm.Info.Printf("Downloading crictl: v%s\n", version) - return download.HTTPDownloadAndSave(DownloadURL(version), path) -} - -func Install(tarFile string) { - files.ExtractTarGz(tarFile, "/usr/local/bin") -} \ No newline at end of file diff --git a/pkg/kubernetes/crictl/package.go b/pkg/kubernetes/crictl/package.go new file mode 100644 index 0000000..362f2f0 --- /dev/null +++ b/pkg/kubernetes/crictl/package.go @@ -0,0 +1,58 @@ +package crictl + +import ( + "fmt" + "os" + "os/exec" + "path" + "runtime" + + "github.com/wandb/server/pkg/dependency" +) + +const GithubRepo = "https://github.com/kubernetes-sigs/cri-tools" + +func DownloadURL(version string) string { + return fmt.Sprintf( + "%s/releases/download/v%s/crictl-v%s-linux-%s.tar.gz", + GithubRepo, + version, + version, + runtime.GOARCH, + ) +} + +func NewPackage(version string, dest string) dependency.Package { + return &CrictlPackage{version, dest} +} + +type CrictlPackage struct { + version string + dest string +} + +func (p CrictlPackage) path() string { + pa := path.Join(p.dest, p.Name(), p.version) + os.MkdirAll(pa, 0755) + return pa +} + +func (p CrictlPackage) Version() string { + return p.version +} + +func (p CrictlPackage) Install() error { + tar := path.Join(p.path(), "crictl.tar.gz") + return exec.Command("tar", "-xzf", tar, "-C", "/usr/local/bin").Run() +} + +func (p CrictlPackage) Download() error { + return dependency.HTTPDownloadAndSave( + DownloadURL(p.version), + path.Join(p.path(), "crictl.tar.gz"), + ) +} + +func (p CrictlPackage) Name() string { + return "circtl" +} \ No newline at end of file diff --git a/pkg/kubernetes/docker/download.go b/pkg/kubernetes/docker/download.go index be97d6f..1bff7cc 100644 --- a/pkg/kubernetes/docker/download.go +++ b/pkg/kubernetes/docker/download.go @@ -5,9 +5,7 @@ import ( "os/exec" ) -func DownloadImageWithDocker(name string, tag string, filename string) error { - image := fmt.Sprintf("%s:%s", name, tag) - +func DownloadImage(image string, filename string) error { cmdPull := exec.Command("docker", "pull", image) err := cmdPull.Run() if err != nil { diff --git a/pkg/kubernetes/helm/package.go b/pkg/kubernetes/helm/package.go new file mode 100644 index 0000000..38f8802 --- /dev/null +++ b/pkg/kubernetes/helm/package.go @@ -0,0 +1,52 @@ +package helm + +import ( + "fmt" + "os" + "path" + "runtime" + + "github.com/wandb/server/pkg/dependency" +) + +func DownloadURL(version string) string { + return fmt.Sprintf( + "https://get.helm.sh/helm-v%s-linux-%s.tar.gz", + version, + runtime.GOARCH, + ) +} + +func NewPackage(version string, dist string) dependency.Package { + return &HelmPackage{version, dist} +} + +type HelmPackage struct { + version string + dest string +} + +func (p HelmPackage) path() string { + pa := path.Join(p.dest, p.Name(), p.version) + os.MkdirAll(pa, 0755) + return pa +} + +func (p HelmPackage) Download() error { + return dependency.HTTPDownloadAndSave( + DownloadURL(p.version), + path.Join(p.path(), "helm.tar.gz"), + ) +} + +func (*HelmPackage) Install() error { + panic("unimplemented") +} + +func (HelmPackage) Name() string { + return "helm" +} + +func (p HelmPackage) Version() string { + return p.version +} diff --git a/pkg/kubernetes/kubeadm/kubeadm.go b/pkg/kubernetes/kubeadm/kubeadm.go index ac8ddd4..e2320b1 100644 --- a/pkg/kubernetes/kubeadm/kubeadm.go +++ b/pkg/kubernetes/kubeadm/kubeadm.go @@ -1,12 +1,20 @@ package kubeadm import ( + "crypto/tls" "fmt" + "io" + "net" + "net/http" "os" + "os/exec" + "path" "runtime" + "time" "github.com/pterm/pterm" - "github.com/wandb/server/pkg/download" + "github.com/wandb/server/pkg/dependency" + "github.com/wandb/server/pkg/discover/networking" "github.com/wandb/server/pkg/files" ) @@ -18,17 +26,129 @@ func DownloadURL(version string) string { ) } -func Download(version string, path string) error { - pterm.Info.Printf("Downloading runc: v%s\n", version) - return download.HTTPDownloadAndSave(DownloadURL(version), path) +func Init() { + init, _ := pterm.DefaultSpinner.Start("Initalizing kubeadm") + err := initCmd() + if err != nil { + init.Fail("Failed to initialize kubeadm cluster") + os.Exit(1) + } + + init.Success("Initialized kubeadm") + + health, _ := pterm.DefaultSpinner.Start("Waiting for kubeadm to be in healthy state") + retry := 0 + for !IsHealthy() { + retry += 1 + if retry > 10 { + health.Fail("Kubeadm unhealthy after 10 retries. Exiting.") + os.Exit(1) + return + } + time.Sleep(1 * time.Second) + } + health.Success("Kubeadm is healthy") +} + +func IsHealthy() bool { + privateIP, _ := networking.GetPrivateIP() + url := fmt.Sprintf("https://%s:%s/healthz", privateIP, "6443") + + transport := &http.Transport{ + DialContext: (&net.Dialer{ + Timeout: 30 * time.Second, + KeepAlive: 30 * time.Second, + }).DialContext, + Proxy: nil, // Disable the use of a proxy, similar to --noproxy "*" + DisableKeepAlives: true, + // Skip certificate validation, similar to --insecure flag + TLSClientConfig: &tls.Config{ + InsecureSkipVerify: true, + }, + } + + client := &http.Client{ + Timeout: time.Second * 30, + Transport: transport, + } + + resp, err := client.Get(url) + if err != nil { + return false + } + defer resp.Body.Close() + + if resp.StatusCode != http.StatusOK { + return false + } + + // Read and discard the response body as required + _, err = io.ReadAll(resp.Body) + if err != nil { + fmt.Printf("Error reading response body: %v\n", err) + return false + } + + return true +} + +func initCmd() error { + cmd := exec.Command( + "kubeadm", "init", + "--control-plane-endpoint=", + "--pod-network-cidr=", + "--ignore-preflight-errors=all") + cmd.Stdout = os.Stdout + cmd.Stderr = os.Stderr + return cmd.Run() +} + +func NewPackage(version string, dest string) dependency.Package { + return &KubeadmPackage{version, dest} } -func Install(binary string) { - pterm.Info.Printf("Installing kubeadm from %s\n", binary) +type KubeadmPackage struct { + version string + dest string +} + +func (p KubeadmPackage) path() string { + pa := path.Join(p.dest, p.Name(), p.version) + os.MkdirAll(pa, 0755) + return pa +} + +func (p KubeadmPackage) Version() string { + return p.version +} + +func (p KubeadmPackage) Install() error { + binary := path.Join(p.path(), "kubeadm") + err := files.CopyFile(binary, "/usr/local/bin/kubeadm") + if err != nil { + return err + } + + err = os.Chmod("/usr/local/bin/kubeadm", 0755) + if err != nil { + return err + } - files.CopyFile(binary, "/usr/local/kubeadm") - os.Chmod("/usr/local/kubeadm", 0755) + err = LoadModules() + if err != nil { + return err + } - LoadModules() - LoadSystemdModules() -} \ No newline at end of file + return LoadSystemdModules() +} + +func (p KubeadmPackage) Download() error { + return dependency.HTTPDownloadAndSave( + DownloadURL(p.version), + path.Join(p.path(), "kubeadm"), + ) +} + +func (p KubeadmPackage) Name() string { + return "kubeadm" +} diff --git a/pkg/kubernetes/kubeadm/modules.go b/pkg/kubernetes/kubeadm/modules.go index 2118ef5..7fb6d33 100644 --- a/pkg/kubernetes/kubeadm/modules.go +++ b/pkg/kubernetes/kubeadm/modules.go @@ -6,13 +6,14 @@ import ( _ "embed" + "github.com/pterm/pterm" "github.com/wandb/server/pkg/linux" ) //go:embed k8s.conf var modulesConfig string -func LoadModules() { +func LoadModules() error { linux.Modprobe("overlay") linux.Modprobe("br_netfilter") @@ -27,7 +28,7 @@ func LoadModules() { linux.Modprobe("nf_conntrack") os.MkdirAll("/etc/modules-load.d", 0755) - os.WriteFile( + return os.WriteFile( "/etc/modules-load.d/k8s.conf", []byte(modulesConfig), 0600, @@ -37,16 +38,17 @@ func LoadModules() { //go:embed ip.conf var systemdConf string -func LoadSystemdModules() { +func LoadSystemdModules() error { + pterm.Info.Println("Adding kubeadm to sysctl") os.MkdirAll("/etc/sysctl.d", 0755) os.WriteFile( - "/etc/sysctl -a.d/k8s-ipv4.conf", + "/etc/sysctl.d/k8s-network.conf", []byte(systemdConf), 0600, ) - reloadSysctl() + return reloadSysctl() } func reloadSysctl() error { return exec.Command("sysctl", "--system").Run() -} \ No newline at end of file +} diff --git a/pkg/kubernetes/kubectl/kubectl.go b/pkg/kubernetes/kubectl/kubectl.go index 08c10c5..8a6a020 100644 --- a/pkg/kubernetes/kubectl/kubectl.go +++ b/pkg/kubernetes/kubectl/kubectl.go @@ -3,10 +3,10 @@ package kubectl import ( "fmt" "os" + "path" "runtime" - "github.com/pterm/pterm" - "github.com/wandb/server/pkg/download" + "github.com/wandb/server/pkg/dependency" "github.com/wandb/server/pkg/files" ) @@ -18,15 +18,43 @@ func DownloadURL(version string) string { ) } -func Download(version string, path string) error { - pterm.Info.Printf("Downloading kubectl: v%s\n", version) - return download.HTTPDownloadAndSave(DownloadURL(version), path) +func NewPackage(version string, dest string) dependency.Package { + return &KubectlPackage{version, dest} } -func Install(binary string) { - pterm.Info.Printf("Installing kubectl from %s\n", binary) +type KubectlPackage struct { + version string + dest string +} + +func (p KubectlPackage) path() string { + pa := path.Join(p.dest, p.Name(), p.version) + os.MkdirAll(pa, 0755) + return pa +} + + +func (p KubectlPackage) Version() string { + return p.version +} + +func (p KubectlPackage) Install() error { + binary := path.Join(p.path(), "kubectl") err := files.CopyFile(binary, "/usr/local/bin/kubectl") - pterm.Error.PrintOnError(err) - err = os.Chmod("/usr/local/bin/kubectl", 0755) - pterm.Error.PrintOnError(err) + if err != nil { + return err + } + + return os.Chmod("/usr/local/bin/kubectl", 0755) +} + +func (p KubectlPackage) Download() error { + return dependency.HTTPDownloadAndSave( + DownloadURL(p.version), + path.Join(p.path(), "kubectl"), + ) +} + +func (p KubectlPackage) Name() string { + return "kubectl" } \ No newline at end of file diff --git a/pkg/kubernetes/kubelet/kubelet.go b/pkg/kubernetes/kubelet/kubelet.go index 849f612..2d249d8 100644 --- a/pkg/kubernetes/kubelet/kubelet.go +++ b/pkg/kubernetes/kubelet/kubelet.go @@ -3,12 +3,12 @@ package kubelet import ( "fmt" "os" + "path" "runtime" _ "embed" - "github.com/pterm/pterm" - "github.com/wandb/server/pkg/download" + "github.com/wandb/server/pkg/dependency" "github.com/wandb/server/pkg/files" "github.com/wandb/server/pkg/linux/systemd" ) @@ -21,26 +21,59 @@ func DownloadURL(version string) string { ) } -func Download(version string, path string) error { - pterm.Info.Printf("Downloading kubelet: v%s\n", version) - return download.HTTPDownloadAndSave(DownloadURL(version), path) +func NewPackage(version string, dest string) dependency.Package { + return &KubeletPackage{version, dest} +} + +type KubeletPackage struct { + version string + dest string +} + +func (p KubeletPackage) Version() string { + return p.version +} + +func (p KubeletPackage) path() string { + pa := path.Join(p.dest, p.Name(), p.version) + os.MkdirAll(pa, 0755) + return pa } //go:embed 10-kube.conf -var service string -func Install(binary string) { - pterm.Info.Printf("Installing kubelet from %s\n", binary) - files.CopyFile(binary, "/usr/local/kubelet") - os.Chmod("/usr/local/kubelete", 0755) +var kubeletConf string +//go:embed kubelet.service +var kubeletService string + +func (p KubeletPackage) Install() error { + binary := path.Join(p.path(), "kubelet") + files.CopyFile(binary, "/usr/bin/kubelet") + os.Chmod("/usr/bin/kubelet", 0755) os.MkdirAll("/etc/systemd/system/kubelet.service.d", 0755) os.WriteFile( "/etc/systemd/system/kubelet.service.d/10-kube.conf", - []byte(service), + []byte(kubeletConf), 0600, ) + os.WriteFile( + "/etc/systemd/system/kubelet.service.d/10-kube.conf", + []byte(kubeletService), + 0600, + ) systemd.ReloadDemon() - systemd.Enable("kubelete") - systemd.Restart("kubelete") + systemd.Enable("kubelet") + return systemd.Restart("kubelet") +} + +func (p KubeletPackage) Download() error { + return dependency.HTTPDownloadAndSave( + DownloadURL(p.version), + path.Join(p.path(), "kubelet"), + ) +} + +func (p KubeletPackage) Name() string { + return "kubelet" } \ No newline at end of file diff --git a/pkg/kubernetes/kubelet/kubelet.service b/pkg/kubernetes/kubelet/kubelet.service new file mode 100644 index 0000000..63a599f --- /dev/null +++ b/pkg/kubernetes/kubelet/kubelet.service @@ -0,0 +1,14 @@ +[Unit] +Description=kubelet: The Kubernetes Node Agent +Documentation=https://kubernetes.io/docs/home/ +Wants=network-online.target +After=network-online.target + +[Service] +ExecStart=/usr/bin/kubelet +Restart=always +StartLimitInterval=0 +RestartSec=10 + +[Install] +WantedBy=multi-user.target \ No newline at end of file diff --git a/pkg/kubernetes/manifests.go b/pkg/kubernetes/manifests.go new file mode 100644 index 0000000..d6a07f9 --- /dev/null +++ b/pkg/kubernetes/manifests.go @@ -0,0 +1,52 @@ +package kubernetes + +import ( + "fmt" + "strings" + + corev1 "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime/serializer/yaml" +) + +func GetImagesFromManifest(data string) ([]string, error) { + dec := yaml.NewDecodingSerializer(unstructured.UnstructuredJSONScheme) + images := make([]string, 0) + chunks := strings.Split(data, "---") + + for _, chunk := range chunks { + chunk = strings.TrimSpace(chunk) + if len(chunk) == 0 { + continue + } + + obj := &unstructured.Unstructured{} + _, _, err := dec.Decode([]byte(chunk), nil, obj) + if err != nil { + return nil, fmt.Errorf("error decoding manifests: %v", err) + } + + containers, _, _ := unstructured.NestedSlice(obj.Object, "spec", "template", "spec", "containers") + for _, cnt := range containers { + container := &corev1.Container{} + err := runtime.DefaultUnstructuredConverter.FromUnstructured(cnt.(map[string]interface{}), container) + if err != nil{ + return nil, fmt.Errorf("failed to convert unstructured container: %v", err) + } + images = append(images, container.Image) + } + + initContainers, _, _ := unstructured.NestedSlice(obj.Object, "spec", "template", "spec", "initContainers") + for _, cnt := range initContainers { + initContainer := &corev1.Container{} + err := runtime.DefaultUnstructuredConverter.FromUnstructured(cnt.(map[string]interface{}), initContainer) + if err != nil { + return nil, fmt.Errorf("failed to convert unstructured init container: %v", err) + } + images = append(images, initContainer.Image) + } + } + + return images, nil +} \ No newline at end of file diff --git a/pkg/kubernetes/runc/runc.go b/pkg/kubernetes/runc/runc.go index aef9bf5..3f9cff2 100644 --- a/pkg/kubernetes/runc/runc.go +++ b/pkg/kubernetes/runc/runc.go @@ -3,10 +3,10 @@ package runc import ( "fmt" "os" + "path" "runtime" - "github.com/pterm/pterm" - "github.com/wandb/server/pkg/download" + "github.com/wandb/server/pkg/dependency" "github.com/wandb/server/pkg/files" ) @@ -21,14 +21,42 @@ func DownloadURL(version string) string { ) } -func Download(version string, path string) error { - pterm.Info.Printf("Downloading runc: v%s\n", version) - return download.HTTPDownloadAndSave(DownloadURL(version), path) +func NewPackage(version string, dest string) dependency.Package { + return &RuncPackage{version, dest} } -func Install(file string) { - pterm.Info.Printf("Installing runc from %s\n", file) - files.CopyFile(file, "/usr/local/sbin/runc") - os.Chmod("/usr/local/sbin/runc", 0755) - pterm.Success.Println("Installed runc") +type RuncPackage struct { + version string + dest string +} + +func (p RuncPackage) path() string { + pa := path.Join(p.dest, p.Name(), p.version) + os.MkdirAll(pa, 0755) + return pa +} + +func (p RuncPackage) Version() string { + return p.version +} + +func (p RuncPackage) Install() error { + binary := path.Join(p.path(), "runc") + err := files.CopyFile(binary, "/usr/local/sbin/runc") + if err != nil { + return err + } + + return os.Chmod("/usr/local/sbin/runc", 0755) +} + +func (p RuncPackage) Download() error { + return dependency.HTTPDownloadAndSave( + DownloadURL(p.version), + path.Join(p.path(), "runc"), + ) +} + +func (p RuncPackage) Name() string { + return "runc" } \ No newline at end of file diff --git a/pkg/linux/debian/pkg.go b/pkg/linux/debian/pkg.go new file mode 100644 index 0000000..6308e3c --- /dev/null +++ b/pkg/linux/debian/pkg.go @@ -0,0 +1,15 @@ +package debian + +import ( + "fmt" + "os/exec" +) + +func InstallPackage(filepath string) error { + cmd := exec.Command("dpkg", "-i", filepath) + output, err := cmd.CombinedOutput() + if err != nil { + return fmt.Errorf("failed to install .deb package: %v\nOutput: %s", err, string(output)) + } + return nil +} \ No newline at end of file From f7ca4bcc536dc9a8ff5141bb79d37bc96a23e325 Mon Sep 17 00:00:00 2001 From: Justin Brooks Date: Tue, 6 Jun 2023 22:27:04 -0400 Subject: [PATCH 4/6] config stuff --- cmd/installer/main.go | 23 +- config.yaml | 21 ++ go.mod | 20 +- go.sum | 354 +++++++++++++++++++++++ pkg/cmd/bundle/bundle.go | 32 +- pkg/cmd/install/install.go | 48 +-- pkg/config/configs.go | 75 ++++- pkg/images/download.go | 2 +- pkg/kubernetes/addons/flannel/flannel.go | 10 +- pkg/kubernetes/cni/cni.go | 6 +- pkg/kubernetes/containerd/client.go | 4 +- pkg/kubernetes/docker/download.go | 4 +- pkg/kubernetes/kubeadm/kubeadm.go | 39 +-- 13 files changed, 555 insertions(+), 83 deletions(-) create mode 100644 config.yaml diff --git a/cmd/installer/main.go b/cmd/installer/main.go index 8409e4a..58fba85 100644 --- a/cmd/installer/main.go +++ b/cmd/installer/main.go @@ -2,11 +2,13 @@ package main import ( "context" + "os" "github.com/pterm/pterm" "github.com/spf13/cobra" "github.com/wandb/server/pkg/cmd/bundle" "github.com/wandb/server/pkg/cmd/install" + "github.com/wandb/server/pkg/config" "github.com/wandb/server/pkg/kubernetes/kubeadm" "github.com/wandb/server/pkg/linux/swap" ) @@ -20,23 +22,30 @@ func RootCmd() *cobra.Command { func BundleCmd() *cobra.Command { return &cobra.Command{ - Use: "bundle", + Use: "bundle", Short: "Creates an Airgap bunddle", Run: func(cmd *cobra.Command, args []string) { - bundle.DownloadPackages() + bundle.DownloadAllPackages() }, } } func InstallCommand() *cobra.Command { return &cobra.Command{ - Use: "install", + Use: "install", Short: "Runs the installer", Run: func(cmd *cobra.Command, args []string) { swap.MustSweepoff() - bundle.DownloadPackages() - install.InstallPackages() + + bundle.DownloadAllPackages() + bundle.DownloadImages() + + install.InstallKubernetes() + kubeadm.Init() + + install.InstallKubernetesAddons() + install.InstallWandbOperator() }, } } @@ -64,8 +73,10 @@ func main() { ctx := context.Background() cmd := RootCmd() + os.MkdirAll(config.Config.Dir, 0755) + cmd.AddCommand(InstallCommand()) cmd.AddCommand(BundleCmd()) cmd.ExecuteContext(ctx) -} \ No newline at end of file +} diff --git a/config.yaml b/config.yaml new file mode 100644 index 0000000..bf797b1 --- /dev/null +++ b/config.yaml @@ -0,0 +1,21 @@ +dir: . + +kubernetes: + version: 1.27.2 + images: + - registry.k8s.io/kube-apiserver:1.27.2 + - registry.k8s.io/kube-controller-manager:1.27.2 + - registry.k8s.io/kube-proxy:1.27.2 + - registry.k8s.io/kube-scheduler:1.27.2 + + - registry.k8s.io/coredns/coredns:v1.10.1 + - registry.k8s.io/etcd:3.5.7-0 + - registry.k8s.io/pause:3.9 + +cni: 1.30 +containerd: 1.7.2 +crictl: 1.27.0 +flannel: 0.22.0 +helm: 3.12.0 +conntract: 1.4.6-2 +runc: 1.1.7 diff --git a/go.mod b/go.mod index 4165efb..5273630 100644 --- a/go.mod +++ b/go.mod @@ -26,6 +26,7 @@ require ( github.com/containerd/typeurl/v2 v2.1.1 // indirect github.com/cyphar/filepath-securejoin v0.2.3 // indirect github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c // indirect + github.com/fsnotify/fsnotify v1.6.0 // indirect github.com/go-logr/logr v1.2.3 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/gogo/protobuf v1.3.2 // indirect @@ -35,11 +36,14 @@ require ( github.com/google/gofuzz v1.2.0 // indirect github.com/google/uuid v1.3.0 // indirect github.com/gookit/color v1.5.3 // indirect + github.com/hashicorp/hcl v1.0.0 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/klauspost/compress v1.16.0 // indirect github.com/lithammer/fuzzysearch v1.1.8 // indirect + github.com/magiconair/properties v1.8.7 // indirect github.com/mattn/go-runewidth v0.0.14 // indirect + github.com/mitchellh/mapstructure v1.5.0 // indirect github.com/moby/locker v1.0.1 // indirect github.com/moby/sys/mountinfo v0.6.2 // indirect github.com/moby/sys/sequential v0.5.0 // indirect @@ -51,26 +55,34 @@ require ( github.com/opencontainers/runc v1.1.5 // indirect github.com/opencontainers/runtime-spec v1.1.0-rc.1 // indirect github.com/opencontainers/selinux v1.11.0 // indirect + github.com/pelletier/go-toml/v2 v2.0.8 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/rivo/uniseg v0.4.4 // indirect github.com/sirupsen/logrus v1.9.0 // indirect + github.com/spf13/afero v1.9.5 // indirect + github.com/spf13/cast v1.5.1 // indirect + github.com/spf13/jwalterweatherman v1.1.0 // indirect github.com/spf13/pflag v1.0.5 // indirect + github.com/spf13/viper v1.16.0 // indirect + github.com/subosito/gotenv v1.4.2 // indirect github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e // indirect go.opencensus.io v0.24.0 // indirect go.opentelemetry.io/otel v1.14.0 // indirect go.opentelemetry.io/otel/trace v1.14.0 // indirect golang.org/x/mod v0.9.0 // indirect - golang.org/x/net v0.8.0 // indirect + golang.org/x/net v0.10.0 // indirect golang.org/x/sync v0.1.0 // indirect golang.org/x/sys v0.8.0 // indirect golang.org/x/term v0.8.0 // indirect golang.org/x/text v0.9.0 // indirect golang.org/x/tools v0.7.0 // indirect - google.golang.org/genproto v0.0.0-20230306155012-7f2fa6fef1f4 // indirect - google.golang.org/grpc v1.53.0 // indirect - google.golang.org/protobuf v1.29.1 // indirect + google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1 // indirect + google.golang.org/grpc v1.55.0 // indirect + google.golang.org/protobuf v1.30.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect k8s.io/klog/v2 v2.90.1 // indirect k8s.io/utils v0.0.0-20230220204549-a5ecb0141aa5 // indirect sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect diff --git a/go.sum b/go.sum index 2a7f301..92b1a49 100644 --- a/go.sum +++ b/go.sum @@ -6,11 +6,49 @@ atomicgo.dev/keyboard v0.2.9/go.mod h1:BC4w9g00XkxH/f1HXhW2sXmJFOCWbKn9xrOunSFtE atomicgo.dev/schedule v0.0.2 h1:2e/4KY6t3wokja01Cyty6qgkQM8MotJzjtqCH70oX2Q= atomicgo.dev/schedule v0.0.2/go.mod h1:xeUa3oAkiuHYh8bKiQBRojqAMq3PXXbJujjb0hw8pEU= cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= +cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= +cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= +cloud.google.com/go v0.44.3/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= +cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= +cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= +cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= +cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= +cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= +cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= +cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= +cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= +cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= +cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= +cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= +cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= +cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= +cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= +cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= +cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= +cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= +cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= +cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= +cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= +cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= +cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= +cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= +cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= +cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= +cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= +cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= +cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= +cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= +cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= +cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= github.com/AdaLogics/go-fuzz-headers v0.0.0-20230106234847-43070de90fa1 h1:EKPd1INOIyr5hWOWhvpmQpY6tKjeG0hT1s3AMC/9fic= github.com/AdaLogics/go-fuzz-headers v0.0.0-20230106234847-43070de90fa1/go.mod h1:VzwV+t+dZ9j/H867F1M2ziD+yLHtB46oM35FxxMJ4d0= github.com/AdamKorcz/go-118-fuzz-build v0.0.0-20221215162035-5330a85ea652 h1:+vTEFqeoeur6XSq06bs+roX3YiT49gUniJK7Zky7Xjg= github.com/AdamKorcz/go-118-fuzz-build v0.0.0-20221215162035-5330a85ea652/go.mod h1:OahwfttHWG6eJ0clwcfBAHoDI6X/LV/15hx/wlMZSrU= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/MarvinJWendt/testza v0.1.0/go.mod h1:7AxNvlfeHP7Z/hDQ5JtE3OKYT3XFUeLCDE2DQninSqs= github.com/MarvinJWendt/testza v0.2.1/go.mod h1:God7bhG8n6uQxwdScay+gjm9/LnO4D3kkcZX4hv9Rp8= github.com/MarvinJWendt/testza v0.2.8/go.mod h1:nwIcjmr0Zz+Rcwfh3/4UhBp7ePKVhuBExvZqnKYWlII= @@ -26,9 +64,14 @@ github.com/Microsoft/hcsshim v0.10.0-rc.8/go.mod h1:OEthFdQv/AD2RAdzR6Mm1N1KPCzt github.com/atomicgo/cursor v0.0.1/go.mod h1:cBON2QmmrysudxNBFthvMtN32r3jxVRIvzkUiF/RuIk= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/checkpoint-restore/go-criu/v5 v5.3.0/go.mod h1:E/eQpaFtUKGOOSEBZgmKAcn+zUUwWxqcaKZlF54wK8E= +github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= +github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= +github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/cilium/ebpf v0.7.0/go.mod h1:/oI2+1shJiTGAMgl6/RgJr36Eo1jzrRcAWbcXO2usCA= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/containerd/cgroups v1.1.0 h1:v8rEWFl6EoqHB+swVNjVoCJE8o3jX7e8nqBGPLaDFBM= github.com/containerd/cgroups v1.1.0/go.mod h1:6ppBcbh/NOOUU+dMKrykgaBnK9lCIBxHqJDGwsa1mIw= github.com/containerd/console v1.0.3 h1:lIr7SlA5PxZyMV30bDW0MGbiOPXwc63yRuCP0ARubLw= @@ -57,8 +100,15 @@ github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDD github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= +github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= +github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= +github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= +github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0= @@ -70,28 +120,45 @@ github.com/godbus/dbus/v5 v5.0.6/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5x github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= +github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= @@ -100,17 +167,42 @@ github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeN github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= +github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= +github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= github.com/gookit/color v1.4.2/go.mod h1:fqRyamkC1W8uxl+lxCQxOT09l/vYfZ+QeiX3rKQHCoQ= github.com/gookit/color v1.5.0/go.mod h1:43aQb+Zerm/BWh2GnrgOQm7ffz7tvQXEKV6BFMl7wAo= github.com/gookit/color v1.5.3 h1:twfIhZs4QLCtimkP7MOxlF3A0U/5cDPseRT9M/+2SCE= github.com/gookit/color v1.5.3/go.mod h1:NUzwzeehUfl7GIb36pqId+UGmRfQcU/WiiyTTeNjHtE= +github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= +github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= +github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/klauspost/compress v1.16.0 h1:iULayQNOReoYUe+1qtKOqw9CwJv3aNQu8ivo7lw1HU4= @@ -119,6 +211,7 @@ github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa02 github.com/klauspost/cpuid/v2 v2.0.10/go.mod h1:g2LTdtYhdyuGPqyWyv7qRAmj1WBqxuObKfj5c0PQa7c= github.com/klauspost/cpuid/v2 v2.0.12/go.mod h1:g2LTdtYhdyuGPqyWyv7qRAmj1WBqxuObKfj5c0PQa7c= github.com/klauspost/cpuid/v2 v2.2.3 h1:sxCkb+qR91z4vsqw4vGGZlDgPz3G7gjaLyK3V8y70BU= +github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= @@ -127,9 +220,13 @@ github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/lithammer/fuzzysearch v1.1.8 h1:/HIuJnjHuXS8bKaiTMeeDlW2/AyIWk2brx1V8LFgLN4= github.com/lithammer/fuzzysearch v1.1.8/go.mod h1:IdqeyBClc3FFqSzYq/MXESsS4S0FsZ5ajtkr5xPLts4= +github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= +github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/mattn/go-runewidth v0.0.14 h1:+xnbZSEeDbOIg5/mE6JF0w6n9duR1l3/WmbinWVwUuU= github.com/mattn/go-runewidth v0.0.14/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= +github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/moby/locker v1.0.1 h1:fOXqR41zeveg4fFODix+1Ch4mj/gT0NE1XJbp/epuBg= github.com/moby/locker v1.0.1/go.mod h1:S7SDdo5zpBK84bzzVlKr2V0hz+7x9hWbYC/kq7oQppc= github.com/moby/sys/mountinfo v0.5.0/go.mod h1:3bMD3Rg+zkqx8MRYPi7Pyb0Ie97QEBmdxbhnCLlSvSU= @@ -157,8 +254,12 @@ github.com/opencontainers/runtime-spec v1.1.0-rc.1/go.mod h1:jwyrGlmzljRJv/Fgzds github.com/opencontainers/selinux v1.10.0/go.mod h1:2i0OySw99QjzBBQByd1Gr9gSjvuho1lHsJxIJ3gGbJI= github.com/opencontainers/selinux v1.11.0 h1:+5Zbo97w3Lbmb3PeqQtpmTkMwsW5nRI3YaLpt7tQ7oU= github.com/opencontainers/selinux v1.11.0/go.mod h1:E5dMC3VPuVvVHDYmi78qvhJp8+M586T4DlDRYpFkyec= +github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= +github.com/pelletier/go-toml/v2 v2.0.8 h1:0ctb6s9mE31h0/lhu+J6OPmVeDxJn+kYnJc2jZR9tGQ= +github.com/pelletier/go-toml/v2 v2.0.8/go.mod h1:vuYfssBdrU2XDZ9bYydBu6t+6a6PYNcZljzZR9VXg+4= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= @@ -176,6 +277,7 @@ github.com/pterm/pterm v0.12.62/go.mod h1:+c3ujjE7N5qmNx6eKAa7YVSC6m/gCorJJKhzwY github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis= github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= @@ -186,22 +288,35 @@ github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeV github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0= github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/spf13/afero v1.9.5 h1:stMpOSZFs//0Lv29HduCmli3GUfpFoF3Y1Q/aXj/wVM= +github.com/spf13/afero v1.9.5/go.mod h1:UBogFpq8E9Hx+xc5CNTTEpTnuHVmXDwZcZcE1eb/UhQ= +github.com/spf13/cast v1.5.1 h1:R+kOtfhWQE6TVQzY+4D7wJLBgkdVasCEFxSUBYBYIlA= +github.com/spf13/cast v1.5.1/go.mod h1:b9PdjNptOpzXr7Rq1q9gJML/2cdGQAo69NKzQ10KN48= github.com/spf13/cobra v1.7.0 h1:hyqWnYt1ZQShIddO5kBpj3vu05/++x6tJ6dg8EC572I= github.com/spf13/cobra v1.7.0/go.mod h1:uLxZILRyS/50WlhOIKD7W6V5bgeIt+4sICxh6uRMrb0= +github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= +github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/viper v1.16.0 h1:rGGH0XDZhdUOryiDWjmIvUSWpbNqisK8Wk0Vyefw8hc= +github.com/spf13/viper v1.16.0/go.mod h1:yg78JgCJcbrQOvV9YLXgkLaZqUidkY9K+Dd1FofRzQg= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.2 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8= +github.com/stretchr/testify v1.8.3 h1:RP3t2pwF7cMEbC1dqtB6poj3niw/9gnV4Cjg5oW5gtY= +github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/subosito/gotenv v1.4.2 h1:X1TuBLAMDFbaTAChgCBLu3DU3UPyELpnF2jjJ2cz/S8= +github.com/subosito/gotenv v1.4.2/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE= @@ -209,9 +324,17 @@ github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df/go.mod h1:JP3t17 github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778/go.mod h1:2MuV+tbUrU1zIOPMxZ5EncGwgmMJsa+9ucAQZXxsObs= github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e h1:JVG44RsyaB9T2KIHavMF/ppJZNG9ZpyihvCd0w101no= github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e/go.mod h1:RbqR21r5mrJuqunuUZ/Dhy/avygyECGrLceyNeo4LiM= +github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= +go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= +go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= go.opentelemetry.io/otel v1.14.0 h1:/79Huy8wbf5DnIPhemGB+zEPVwnN6fuQybr/SRXa6hM= @@ -219,40 +342,107 @@ go.opentelemetry.io/otel v1.14.0/go.mod h1:o4buv+dJzx8rohcUeRmWUZhqupFvzWis188Wl go.opentelemetry.io/otel/trace v1.14.0 h1:wp2Mmvj41tDsyAJXiWDWpfNsOiIyd38fy85pyKcFq/M= go.opentelemetry.io/otel/trace v1.14.0/go.mod h1:8avnQLK+CG77yNLUae4ea2JDQ6iT+gozhnZjy/rw9G8= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= +golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= +golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= +golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= +golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= golang.org/x/exp v0.0.0-20220909182711-5c715a9e8561 h1:MDc5xs78ZrZr3HMQugiXOAkSZtfTpbJLDr/lwfgO53E= +golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= +golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= +golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= +golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= +golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= +golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= +golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.9.0 h1:KENHtAZL2y3NLMYZeHY9DW8HW8V+kQyJsY/V9JlKvCs= golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.8.0 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ= golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= +golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M= +golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -260,14 +450,43 @@ golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190606203320-7fc4e5ec1444/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191115151921-52ab43148777/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210906170528-6f6e22806c34/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211013075003-97ac67df715c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -277,6 +496,7 @@ golang.org/x/sys v0.0.0-20220319134239-a9b59b0215f8/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0 h1:EBmGv8NaZBZTWvrbjNoL6HVt+IVy3QDQpJs7VRIw3tU= @@ -288,20 +508,69 @@ golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuX golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.8.0 h1:n5xxQn2i3PC0yLAbjTpNT85q/Kgzcr2gIoX9OrJUols= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= +golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= +golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= +golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/tools v0.7.0 h1:W4OVu8VVOaIO0yzWMNdepAulS7YfoS3Zabrm8DOXXU4= @@ -310,22 +579,92 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= +google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= +google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= +google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= +google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= +google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= +google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= +google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= +google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= +google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= +google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20230306155012-7f2fa6fef1f4 h1:DdoeryqhaXp1LtT/emMP1BRJPHHKFi5akj/nbx/zNTA= google.golang.org/genproto v0.0.0-20230306155012-7f2fa6fef1f4/go.mod h1:NWraEVixdDnqcqQ30jipen1STv2r/n24Wb7twVTGR4s= +google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1 h1:KpwkzHKEF7B9Zxg18WzOa7djJ+Ha5DzthMyZYQfEn2A= +google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1/go.mod h1:nKE/iIaLqn2bQwXBg8f1g2Ylh6r5MN5CmZvuzZCgsCU= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= +google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= +google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= +google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= +google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= +google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.53.0 h1:LAv2ds7cmFV/XTS3XG1NneeENYrXGmorPxsBbptIjNc= google.golang.org/grpc v1.53.0/go.mod h1:OnIrk0ipVdj4N5d9IUoFUx72/VlD7+jUsHwZgwSMQpw= +google.golang.org/grpc v1.55.0 h1:3Oj82/tFSCeUrRTg/5E/7d/W5A1tj6Ky1ABAuZuv5ag= +google.golang.org/grpc v1.55.0/go.mod h1:iYEXKGkEBhg1PjZQvoYEVPTDkHo1/bjTnfwTeGONTY8= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -334,17 +673,24 @@ google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzi google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.29.1 h1:7QBf+IK2gx70Ap/hDsOmam3GE0v9HicjfEdAxE62UoM= google.golang.org/protobuf v1.29.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng= +google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= @@ -355,7 +701,12 @@ gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= +honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= k8s.io/api v0.27.2 h1:+H17AJpUMvl+clT+BPnKf0E3ksMAzoBBg7CntpSuADo= k8s.io/api v0.27.2/go.mod h1:ENmbocXfBT2ADujUXcBhHV55RIT31IIEvkntP6vZKS4= k8s.io/apimachinery v0.27.2 h1:vBjGaKKieaIreI+oQwELalVG4d8f3YAMNpWLzDXkxeg= @@ -364,6 +715,9 @@ k8s.io/klog/v2 v2.90.1 h1:m4bYOKall2MmOiRaR1J+We67Do7vm9KiQVlT96lnHUw= k8s.io/klog/v2 v2.90.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= k8s.io/utils v0.0.0-20230220204549-a5ecb0141aa5 h1:kmDqav+P+/5e1i9tFfHq1qcF3sOrDp+YEkVDAHu7Jwk= k8s.io/utils v0.0.0-20230220204549-a5ecb0141aa5/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= +rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= +rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo= sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= sigs.k8s.io/structured-merge-diff/v4 v4.2.3 h1:PRbqxJClWWYMNV1dhaG4NsibJbArud9kFxnAMREiWFE= diff --git a/pkg/cmd/bundle/bundle.go b/pkg/cmd/bundle/bundle.go index dcd3f9e..6a260cc 100644 --- a/pkg/cmd/bundle/bundle.go +++ b/pkg/cmd/bundle/bundle.go @@ -1,36 +1,24 @@ package bundle import ( - "os" "sync" "github.com/pterm/pterm" + "github.com/wandb/server/pkg/config" "github.com/wandb/server/pkg/dependency" - "github.com/wandb/server/pkg/kubernetes/addons/flannel" - "github.com/wandb/server/pkg/kubernetes/helm" ) -func DownloadPackages() { - downloadDir := "./packages" - os.MkdirAll(downloadDir, 0755) - packages := []dependency.Package{ - // containerd.NewPackage("1.7.2", downloadDir), - // crictl.NewPackage("1.27.0", downloadDir), - // runc.NewPackage("1.1.7", downloadDir), - // cni.NewPackage("1.3.0", downloadDir), - // conntrack.NewPackage("1.4.6-2", downloadDir), - // kubeadm.NewPackage("1.27.2", downloadDir), - // kubectl.NewPackage("1.27.2", downloadDir), - // kubelet.NewPackage("1.27.2", downloadDir), - flannel.NewPackage("0.22.0", downloadDir), - helm.NewPackage("3.12.0", downloadDir), - } +func DownloadAllPackages() { + packages := append( + config.KubernetesPackages(), + config.KubernetesAddonPackages()..., + ) progressbar, _ := pterm.DefaultProgressbar. WithTotal(len(packages)). WithTitle("Downloading packages"). Start() - + wg := sync.WaitGroup{} wg.Add(len(packages)) for _, pkg := range packages { @@ -40,7 +28,7 @@ func DownloadPackages() { if err == nil { pterm.Success.Printf("Downloaded %s (v%s)\n", p.Name(), p.Version()) } else { - pterm.Error.Printf("Failed to download %s (v%s): %w\n", p.Name(), p.Version(), err) + pterm.Error.Printf("Failed to download %s (v%s): %e\n", p.Name(), p.Version(), err) } progressbar.Increment() wg.Done() @@ -51,3 +39,7 @@ func DownloadPackages() { progressbar.Stop() } + +func DownloadImages() { + +} diff --git a/pkg/cmd/install/install.go b/pkg/cmd/install/install.go index b3c5811..fec2bfb 100644 --- a/pkg/cmd/install/install.go +++ b/pkg/cmd/install/install.go @@ -4,35 +4,49 @@ import ( "sync" "github.com/pterm/pterm" + "github.com/wandb/server/pkg/config" + "github.com/wandb/server/pkg/dependency" ) -func InstallPackages() { - packages := []func(){ - // func() { containerd.Install("./packages/containerd.tar.gz") }, - // func() { crictl.Install("./packages/crictl.tar.gz") }, - // func() { runc.Install("./packages/runc") }, - // func() { cni.Install("./packages/cni-plugins.tar.gz") }, - // func() { kubeadm.Install("./packages/kubeadm") }, - // func() { kubelet.Install("./packages/kubelet") }, - // func() { kubectl.Install("./packages/kubectl") }, - // func() { conntrack.Install("./packages/conntrack.deb") }, - } +func InstallKubernetes() { + packages := config.KubernetesPackages() progressbar, _ := pterm.DefaultProgressbar. WithTotal(len(packages)). - WithTitle("Installing packages"). + WithTitle("Installing kubernetes"). Start() - + wg := sync.WaitGroup{} wg.Add(len(packages)) for _, pkg := range packages { - go func(install func()) { - install() - progressbar.Increment() + go func(install dependency.Package) { + install.Install() wg.Done() }(pkg) } wg.Wait() + progressbar.Stop() +} + +func InstallKubernetesAddons() { + packages := config.KubernetesAddonPackages() + + progressbar, _ := pterm.DefaultProgressbar. + WithTotal(len(packages)). + WithTitle("Installing kubernetes"). + Start() + wg := sync.WaitGroup{} + wg.Add(len(packages)) + for _, pkg := range packages { + go func(install dependency.Package) { + install.Install() + wg.Done() + }(pkg) + } + wg.Wait() progressbar.Stop() -} \ No newline at end of file +} + +func InstallWandbOperator() { +} diff --git a/pkg/config/configs.go b/pkg/config/configs.go index eca0ec4..7371e3e 100644 --- a/pkg/config/configs.go +++ b/pkg/config/configs.go @@ -1,5 +1,76 @@ package config -import "runtime" +import ( + "github.com/spf13/viper" + "github.com/wandb/server/pkg/dependency" + "github.com/wandb/server/pkg/kubernetes/addons/flannel" + "github.com/wandb/server/pkg/kubernetes/cni" + "github.com/wandb/server/pkg/kubernetes/conntrack" + "github.com/wandb/server/pkg/kubernetes/containerd" + "github.com/wandb/server/pkg/kubernetes/crictl" + "github.com/wandb/server/pkg/kubernetes/helm" + "github.com/wandb/server/pkg/kubernetes/kubeadm" + "github.com/wandb/server/pkg/kubernetes/kubectl" + "github.com/wandb/server/pkg/kubernetes/kubelet" + "github.com/wandb/server/pkg/kubernetes/runc" +) -var Arch = runtime.GOARCH \ No newline at end of file +type config struct { + Airgap bool + + Dir string + + Kubernetes struct { + Version string + Images []string + } + + CNI string + Containerd string + Crictl string + Flannel string + Helm string + Conntract string + Runc string +} + +var Config config + +func init() { + viper.SetConfigType("yaml") + viper.SetConfigName("config") + + viper.SetEnvPrefix("INSTALLER") + viper.AutomaticEnv() + + viper.AddConfigPath(".") + viper.ReadInConfig() + + viper.SetDefault("dir", ".") + viper.SetDefault("airgap", false) + + viper.Unmarshal(&Config) +} + +func KubernetesPackages() []dependency.Package { + return []dependency.Package{ + kubeadm.NewPackage(Config.Kubernetes.Version, Config.Dir), + kubectl.NewPackage(Config.Kubernetes.Version, Config.Dir), + kubelet.NewPackage(Config.Kubernetes.Version, Config.Dir), + + cni.NewPackage(Config.CNI, Config.Dir), + containerd.NewPackage(Config.Containerd, Config.Dir), + + crictl.NewPackage(Config.Crictl, Config.Dir), + runc.NewPackage(Config.Runc, Config.Dir), + conntrack.NewPackage(Config.Conntract, Config.Dir), + flannel.NewPackage(Config.Flannel, Config.Dir), + helm.NewPackage(Config.Helm, Config.Dir), + } +} + +func KubernetesAddonPackages() []dependency.Package { + return []dependency.Package{ + flannel.NewPackage(Config.Flannel, Config.Dir), + } +} diff --git a/pkg/images/download.go b/pkg/images/download.go index 40b08b1..5c62a40 100644 --- a/pkg/images/download.go +++ b/pkg/images/download.go @@ -11,7 +11,7 @@ import ( // Download downloads an image and saves it to a file. func Download(image string, filename string) error { _, err := exec.LookPath("docker") - if err != nil { + if err == nil { return docker.DownloadImage(image, filename) } diff --git a/pkg/kubernetes/addons/flannel/flannel.go b/pkg/kubernetes/addons/flannel/flannel.go index 335bcaf..d18ff40 100644 --- a/pkg/kubernetes/addons/flannel/flannel.go +++ b/pkg/kubernetes/addons/flannel/flannel.go @@ -4,6 +4,7 @@ import ( "fmt" "os" "path" + "path/filepath" "strings" "github.com/wandb/server/pkg/dependency" @@ -48,9 +49,12 @@ func (p FlannelPackage) Download() error { f, _ := os.ReadFile(path.Join(p.path(), "kube-flannel.yml")) imgs, _ := kubernetes.GetImagesFromManifest(string(f)) for _, image := range imgs { - dir := path.Join(p.path(), strings.Split(image, ":")[0]) - os.MkdirAll(dir, 0755) - images.Download(image, path.Join(dir, "image.tar")) + file := path.Join(p.path(), strings.Split(image, ":")[0]+".tar") + os.MkdirAll(filepath.Dir(file), 0755) + err := images.Download(image, file) + if err != nil { + return err + } } return nil } diff --git a/pkg/kubernetes/cni/cni.go b/pkg/kubernetes/cni/cni.go index 88356ac..4499119 100644 --- a/pkg/kubernetes/cni/cni.go +++ b/pkg/kubernetes/cni/cni.go @@ -26,9 +26,9 @@ func NewPackage(version string, dest string) dependency.Package { return &CNIPluginPackage{version, dest} } -type CNIPluginPackage struct{ +type CNIPluginPackage struct { version string - dest string + dest string } func (p CNIPluginPackage) Version() string { @@ -59,4 +59,4 @@ func (p CNIPluginPackage) Download() error { func (p CNIPluginPackage) Name() string { return "cni-plugins" -} \ No newline at end of file +} diff --git a/pkg/kubernetes/containerd/client.go b/pkg/kubernetes/containerd/client.go index 18b3398..1f23807 100644 --- a/pkg/kubernetes/containerd/client.go +++ b/pkg/kubernetes/containerd/client.go @@ -7,7 +7,7 @@ import ( "github.com/pterm/pterm" ) -func Client() (*containerd.Client) { +func Client() *containerd.Client { client, err := containerd.New("/run/containerd/containerd.sock") pterm.Fatal.PrintOnError(err, "failed to create containerd client") return client @@ -32,4 +32,4 @@ func IsInstalled() bool { return false } return true -} \ No newline at end of file +} diff --git a/pkg/kubernetes/docker/download.go b/pkg/kubernetes/docker/download.go index 1bff7cc..362c2b8 100644 --- a/pkg/kubernetes/docker/download.go +++ b/pkg/kubernetes/docker/download.go @@ -23,5 +23,5 @@ func DownloadImage(image string, filename string) error { func IsInstalled() bool { _, err := exec.LookPath("docker") - return err != nil -} \ No newline at end of file + return err == nil +} diff --git a/pkg/kubernetes/kubeadm/kubeadm.go b/pkg/kubernetes/kubeadm/kubeadm.go index e2320b1..cbcdc06 100644 --- a/pkg/kubernetes/kubeadm/kubeadm.go +++ b/pkg/kubernetes/kubeadm/kubeadm.go @@ -27,15 +27,6 @@ func DownloadURL(version string) string { } func Init() { - init, _ := pterm.DefaultSpinner.Start("Initalizing kubeadm") - err := initCmd() - if err != nil { - init.Fail("Failed to initialize kubeadm cluster") - os.Exit(1) - } - - init.Success("Initialized kubeadm") - health, _ := pterm.DefaultSpinner.Start("Waiting for kubeadm to be in healthy state") retry := 0 for !IsHealthy() { @@ -43,7 +34,7 @@ func Init() { if retry > 10 { health.Fail("Kubeadm unhealthy after 10 retries. Exiting.") os.Exit(1) - return + return } time.Sleep(1 * time.Second) } @@ -53,7 +44,7 @@ func Init() { func IsHealthy() bool { privateIP, _ := networking.GetPrivateIP() url := fmt.Sprintf("https://%s:%s/healthz", privateIP, "6443") - + transport := &http.Transport{ DialContext: (&net.Dialer{ Timeout: 30 * time.Second, @@ -92,18 +83,7 @@ func IsHealthy() bool { return true } -func initCmd() error { - cmd := exec.Command( - "kubeadm", "init", - "--control-plane-endpoint=", - "--pod-network-cidr=", - "--ignore-preflight-errors=all") - cmd.Stdout = os.Stdout - cmd.Stderr = os.Stderr - return cmd.Run() -} - -func NewPackage(version string, dest string) dependency.Package { +func NewPackage(version string, dest string) *KubeadmPackage { return &KubeadmPackage{version, dest} } @@ -118,6 +98,19 @@ func (p KubeadmPackage) path() string { return pa } +func (p KubeadmPackage) Init() error { + privateIP, _ := networking.GetPrivateIP() + controlEndpoint := privateIP + ":6443" + cmd := exec.Command( + "kubeadm", "init", + "--control-plane-endpoint="+controlEndpoint, + "--pod-network-cidr=", + "--ignore-preflight-errors=all") + cmd.Stdout = os.Stdout + cmd.Stderr = os.Stderr + return cmd.Run() +} + func (p KubeadmPackage) Version() string { return p.version } From b58df9e1b81941c904afdaac5765002827087593 Mon Sep 17 00:00:00 2001 From: Justin Brooks Date: Wed, 7 Jun 2023 09:49:40 -0400 Subject: [PATCH 5/6] config --- config.yaml | 12 ++-- pkg/cmd/bundle/bundle.go | 4 ++ pkg/cmd/install/install.go | 3 +- pkg/config/1.27.2.yaml | 18 ------ pkg/config/configs.go | 13 ++++- pkg/images/download.go | 42 ++++++++++++++ pkg/kubernetes/addons/contour/contour.go | 70 ++++++++++++++++++++++++ pkg/kubernetes/addons/flannel/flannel.go | 15 ++--- pkg/kubernetes/helm/package.go | 6 +- pkg/kubernetes/manifests.go | 3 +- 10 files changed, 149 insertions(+), 37 deletions(-) delete mode 100644 pkg/config/1.27.2.yaml create mode 100644 pkg/kubernetes/addons/contour/contour.go diff --git a/config.yaml b/config.yaml index bf797b1..c6757b7 100644 --- a/config.yaml +++ b/config.yaml @@ -1,15 +1,14 @@ -dir: . +dir: ./packages kubernetes: version: 1.27.2 images: - - registry.k8s.io/kube-apiserver:1.27.2 - - registry.k8s.io/kube-controller-manager:1.27.2 - - registry.k8s.io/kube-proxy:1.27.2 - - registry.k8s.io/kube-scheduler:1.27.2 + - registry.k8s.io/kube-apiserver:v1.27.2 + - registry.k8s.io/kube-controller-manager:v1.27.2 + - registry.k8s.io/kube-proxy:v1.27.2 + - registry.k8s.io/kube-scheduler:v1.27.2 - registry.k8s.io/coredns/coredns:v1.10.1 - - registry.k8s.io/etcd:3.5.7-0 - registry.k8s.io/pause:3.9 cni: 1.30 @@ -19,3 +18,4 @@ flannel: 0.22.0 helm: 3.12.0 conntract: 1.4.6-2 runc: 1.1.7 +contour: 1.25 \ No newline at end of file diff --git a/pkg/cmd/bundle/bundle.go b/pkg/cmd/bundle/bundle.go index 6a260cc..ffa28f0 100644 --- a/pkg/cmd/bundle/bundle.go +++ b/pkg/cmd/bundle/bundle.go @@ -13,6 +13,10 @@ func DownloadAllPackages() { config.KubernetesPackages(), config.KubernetesAddonPackages()..., ) + packages = append( + packages, + config.KubernetesImages()..., + ) progressbar, _ := pterm.DefaultProgressbar. WithTotal(len(packages)). diff --git a/pkg/cmd/install/install.go b/pkg/cmd/install/install.go index fec2bfb..02041c8 100644 --- a/pkg/cmd/install/install.go +++ b/pkg/cmd/install/install.go @@ -33,7 +33,7 @@ func InstallKubernetesAddons() { progressbar, _ := pterm.DefaultProgressbar. WithTotal(len(packages)). - WithTitle("Installing kubernetes"). + WithTitle("Installing kubernetes addons"). Start() wg := sync.WaitGroup{} @@ -49,4 +49,5 @@ func InstallKubernetesAddons() { } func InstallWandbOperator() { + pterm.Fatal.Println("Not implemented") } diff --git a/pkg/config/1.27.2.yaml b/pkg/config/1.27.2.yaml deleted file mode 100644 index f9d62d9..0000000 --- a/pkg/config/1.27.2.yaml +++ /dev/null @@ -1,18 +0,0 @@ -dir: ./ - -versions: - kubernetes: 1.27.2 - crictl: 1.27.0 - cni-plugins: 1.3.0 - containerd: 1.5.7 - runc: 1.1.7 - - openebs: 3.6.0 - contour: 1.18.0 - - images: - - registry.k8s.io/coredns/coredns:v1.10.1 - - registry.k8s.io/etcd:3.5.7-0 - - registry.k8s.io/pause:3.9 - - docker.io/envoyproxy/envoy:v1.26.1 - - ghcr.io/projectcontour/contour:v1.25.0 diff --git a/pkg/config/configs.go b/pkg/config/configs.go index 7371e3e..9a66ab7 100644 --- a/pkg/config/configs.go +++ b/pkg/config/configs.go @@ -3,6 +3,8 @@ package config import ( "github.com/spf13/viper" "github.com/wandb/server/pkg/dependency" + "github.com/wandb/server/pkg/images" + "github.com/wandb/server/pkg/kubernetes/addons/contour" "github.com/wandb/server/pkg/kubernetes/addons/flannel" "github.com/wandb/server/pkg/kubernetes/cni" "github.com/wandb/server/pkg/kubernetes/conntrack" @@ -32,6 +34,7 @@ type config struct { Helm string Conntract string Runc string + Contour string } var Config config @@ -64,7 +67,6 @@ func KubernetesPackages() []dependency.Package { crictl.NewPackage(Config.Crictl, Config.Dir), runc.NewPackage(Config.Runc, Config.Dir), conntrack.NewPackage(Config.Conntract, Config.Dir), - flannel.NewPackage(Config.Flannel, Config.Dir), helm.NewPackage(Config.Helm, Config.Dir), } } @@ -72,5 +74,14 @@ func KubernetesPackages() []dependency.Package { func KubernetesAddonPackages() []dependency.Package { return []dependency.Package{ flannel.NewPackage(Config.Flannel, Config.Dir), + contour.NewPackage(Config.Contour, Config.Dir), + } +} + +func KubernetesImages() []dependency.Package { + pkgs := []dependency.Package{} + for _, img := range Config.Kubernetes.Images { + pkgs = append(pkgs, images.NewPackage(img, Config.Dir)) } + return pkgs } diff --git a/pkg/images/download.go b/pkg/images/download.go index 5c62a40..c74d205 100644 --- a/pkg/images/download.go +++ b/pkg/images/download.go @@ -2,8 +2,13 @@ package images import ( "fmt" + "os" "os/exec" + "path" + "path/filepath" + "strings" + "github.com/wandb/server/pkg/dependency" "github.com/wandb/server/pkg/kubernetes/containerd" "github.com/wandb/server/pkg/kubernetes/docker" ) @@ -21,3 +26,40 @@ func Download(image string, filename string) error { return fmt.Errorf("no supported container runtime found") } + +func NewPackage(image string, dest string) dependency.Package { + return &Package{image, dest} +} + +type Package struct { + image string + dest string +} + +func (p Package) Download() error { + return Download(p.image, p.imageFile()) +} + +func (p Package) imageFile() string { + img := strings.Split(p.image, ":")[0] + v := p.Version() + file := path.Join(p.dest, img, v+".tar") + os.MkdirAll(filepath.Dir(file), 0755) + return file +} + +// Install implements dependency.Package +func (*Package) Install() error { + panic("unimplemented") +} + +// Name implements dependency.Package +func (p Package) Name() string { + return strings.Split(p.image, ":")[0] +} + +// Version implements dependency.Package +func (p Package) Version() string { + image := strings.Split(p.image, ":")[1] + return strings.Trim(image, "v") +} diff --git a/pkg/kubernetes/addons/contour/contour.go b/pkg/kubernetes/addons/contour/contour.go new file mode 100644 index 0000000..e920914 --- /dev/null +++ b/pkg/kubernetes/addons/contour/contour.go @@ -0,0 +1,70 @@ +package contour + +import ( + "fmt" + "os" + "path" + + "github.com/wandb/server/pkg/dependency" + "github.com/wandb/server/pkg/images" + "github.com/wandb/server/pkg/kubernetes" +) + +func manifestURL(version string) string { + return fmt.Sprintf( + "https://raw.githubusercontent.com/projectcontour/contour/release-%s/examples/render/contour.yaml", + version, + ) +} + +func NewPackage(version string, dest string) dependency.Package { + return &ContourPackage{version, dest} +} + +// ContourPackage is a package for installing contour. Contour is a Kubernetes +// ingress controller for Lyft's Envoy proxy. +type ContourPackage struct { + version string + dest string +} + +func (p ContourPackage) path() string { + pa := path.Join(p.dest, p.Name(), p.version) + os.MkdirAll(pa, 0755) + return pa +} + +func (p ContourPackage) Download() error { + err := dependency.HTTPDownloadAndSave( + manifestURL(p.version), + path.Join(p.path(), "kube-contour.yml"), + ) + if err != nil { + return err + } + + f, _ := os.ReadFile(path.Join(p.path(), "kube-contour.yml")) + imgs, err := kubernetes.GetImagesFromManifest(string(f)) + if err != nil { + return err + } + for _, image := range imgs { + pkg := images.NewPackage(image, p.dest) + if err = pkg.Download(); err != nil { + return err + } + } + return nil +} + +func (p ContourPackage) Install() error { + panic("unimplemented") +} + +func (p ContourPackage) Name() string { + return "contour" +} + +func (p ContourPackage) Version() string { + return p.version +} diff --git a/pkg/kubernetes/addons/flannel/flannel.go b/pkg/kubernetes/addons/flannel/flannel.go index d18ff40..569a2d1 100644 --- a/pkg/kubernetes/addons/flannel/flannel.go +++ b/pkg/kubernetes/addons/flannel/flannel.go @@ -4,8 +4,6 @@ import ( "fmt" "os" "path" - "path/filepath" - "strings" "github.com/wandb/server/pkg/dependency" "github.com/wandb/server/pkg/images" @@ -26,6 +24,8 @@ func NewPackage(version string, dest string) dependency.Package { return &FlannelPackage{version, dest} } +// FlannelPackage is a package for installing flannel. Flannel is a Kubernetes +// network fabric for containers. type FlannelPackage struct { version string dest string @@ -47,12 +47,13 @@ func (p FlannelPackage) Download() error { } f, _ := os.ReadFile(path.Join(p.path(), "kube-flannel.yml")) - imgs, _ := kubernetes.GetImagesFromManifest(string(f)) + imgs, err := kubernetes.GetImagesFromManifest(string(f)) + if err != nil { + return err + } for _, image := range imgs { - file := path.Join(p.path(), strings.Split(image, ":")[0]+".tar") - os.MkdirAll(filepath.Dir(file), 0755) - err := images.Download(image, file) - if err != nil { + pkg := images.NewPackage(image, p.dest) + if err = pkg.Download(); err != nil { return err } } diff --git a/pkg/kubernetes/helm/package.go b/pkg/kubernetes/helm/package.go index 38f8802..10b1d69 100644 --- a/pkg/kubernetes/helm/package.go +++ b/pkg/kubernetes/helm/package.go @@ -3,6 +3,7 @@ package helm import ( "fmt" "os" + "os/exec" "path" "runtime" @@ -39,8 +40,9 @@ func (p HelmPackage) Download() error { ) } -func (*HelmPackage) Install() error { - panic("unimplemented") +func (p HelmPackage) Install() error { + tar := path.Join(p.path(), "helm.tar.gz") + return exec.Command("tar", "-xzf", tar, "-C", "/usr/local/bin").Run() } func (HelmPackage) Name() string { diff --git a/pkg/kubernetes/manifests.go b/pkg/kubernetes/manifests.go index d6a07f9..1f92825 100644 --- a/pkg/kubernetes/manifests.go +++ b/pkg/kubernetes/manifests.go @@ -14,7 +14,6 @@ func GetImagesFromManifest(data string) ([]string, error) { dec := yaml.NewDecodingSerializer(unstructured.UnstructuredJSONScheme) images := make([]string, 0) chunks := strings.Split(data, "---") - for _, chunk := range chunks { chunk = strings.TrimSpace(chunk) if len(chunk) == 0 { @@ -24,7 +23,7 @@ func GetImagesFromManifest(data string) ([]string, error) { obj := &unstructured.Unstructured{} _, _, err := dec.Decode([]byte(chunk), nil, obj) if err != nil { - return nil, fmt.Errorf("error decoding manifests: %v", err) + continue } containers, _, _ := unstructured.NestedSlice(obj.Object, "spec", "template", "spec", "containers") From ffba36ba1adb5c9c23080f07f1712ea7aa4aa221 Mon Sep 17 00:00:00 2001 From: Justin Brooks Date: Wed, 7 Jun 2023 21:51:23 -0400 Subject: [PATCH 6/6] zip bundle files --- .gitignore | 5 +++- cmd/installer/main.go | 3 +- configs/1.27.2.yaml | 21 +++++++++++++ configs/README.md | 3 ++ install.sh | 28 +++++++++++++++++ pkg/cmd/bundle/bundle.go | 65 +++++++++++++++++++++++++++++++++++++++- 6 files changed, 121 insertions(+), 4 deletions(-) create mode 100644 configs/1.27.2.yaml create mode 100644 configs/README.md create mode 100644 install.sh diff --git a/.gitignore b/.gitignore index 3d001d5..855e6ad 100644 --- a/.gitignore +++ b/.gitignore @@ -13,4 +13,7 @@ packages .DS_store *.log -bin \ No newline at end of file +bin + +installer +installer.tar.gz \ No newline at end of file diff --git a/cmd/installer/main.go b/cmd/installer/main.go index 58fba85..b982640 100644 --- a/cmd/installer/main.go +++ b/cmd/installer/main.go @@ -26,6 +26,7 @@ func BundleCmd() *cobra.Command { Short: "Creates an Airgap bunddle", Run: func(cmd *cobra.Command, args []string) { bundle.DownloadAllPackages() + bundle.CreateBundle("./installer.tar.gz") }, } } @@ -38,8 +39,6 @@ func InstallCommand() *cobra.Command { swap.MustSweepoff() bundle.DownloadAllPackages() - bundle.DownloadImages() - install.InstallKubernetes() kubeadm.Init() diff --git a/configs/1.27.2.yaml b/configs/1.27.2.yaml new file mode 100644 index 0000000..c6757b7 --- /dev/null +++ b/configs/1.27.2.yaml @@ -0,0 +1,21 @@ +dir: ./packages + +kubernetes: + version: 1.27.2 + images: + - registry.k8s.io/kube-apiserver:v1.27.2 + - registry.k8s.io/kube-controller-manager:v1.27.2 + - registry.k8s.io/kube-proxy:v1.27.2 + - registry.k8s.io/kube-scheduler:v1.27.2 + + - registry.k8s.io/coredns/coredns:v1.10.1 + - registry.k8s.io/pause:3.9 + +cni: 1.30 +containerd: 1.7.2 +crictl: 1.27.0 +flannel: 0.22.0 +helm: 3.12.0 +conntract: 1.4.6-2 +runc: 1.1.7 +contour: 1.25 \ No newline at end of file diff --git a/configs/README.md b/configs/README.md new file mode 100644 index 0000000..be16962 --- /dev/null +++ b/configs/README.md @@ -0,0 +1,3 @@ +# Config History + +History of all previous configs. \ No newline at end of file diff --git a/install.sh b/install.sh new file mode 100644 index 0000000..986b295 --- /dev/null +++ b/install.sh @@ -0,0 +1,28 @@ +#!/bin/bash + +function require_root_user() { + local user="$(id -un 2>/dev/null || true)" + if [ "$user" != "root" ]; then + bail "Error: this installer needs to be run as root." + fi +} + +function download_binary() { + if [ ! -e installer ]; then + printf "Downloading latest binary" + fi +} + +function download_config() { + if [ ! -e installer ]; then + printf "Downloading latest config" + fi +} + +require_root_user +download_config +download_binary + +chmod +x installer + +./installer install diff --git a/pkg/cmd/bundle/bundle.go b/pkg/cmd/bundle/bundle.go index ffa28f0..4574837 100644 --- a/pkg/cmd/bundle/bundle.go +++ b/pkg/cmd/bundle/bundle.go @@ -1,6 +1,11 @@ package bundle import ( + "archive/tar" + "compress/gzip" + "io" + "os" + "path/filepath" "sync" "github.com/pterm/pterm" @@ -44,6 +49,64 @@ func DownloadAllPackages() { progressbar.Stop() } -func DownloadImages() { +func CreateBundle(dest string) error { + srcs := []string{ + config.Config.Dir, + "installer", + "configs", + "config.yaml", + "install.sh", + "LICENSE", + "SECURITY.md", + } + + destFile, err := os.Create(dest) + if err != nil { + return err + } + defer destFile.Close() + + gzipWriter := gzip.NewWriter(destFile) + defer gzipWriter.Close() + + tarWriter := tar.NewWriter(gzipWriter) + defer tarWriter.Close() + + for _, src := range srcs { + err := filepath.Walk(src, func(path string, info os.FileInfo, err error) error { + if err != nil { + return err + } + + header, err := tar.FileInfoHeader(info, info.Name()) + if err != nil { + return err + } + header.Name = filepath.ToSlash(path) + + if err := tarWriter.WriteHeader(header); err != nil { + return err + } + + // Write file content + if !info.Mode().IsRegular() { + return nil + } + + file, err := os.Open(path) + if err != nil { + return err + } + defer file.Close() + + _, err = io.Copy(tarWriter, file) + return err + }) + + if err != nil { + return err + } + } + return nil }