go: re-do the entire thing

This is a mega-change, but attempting to split this up further is
probably not worth the effort.

Summary:

1. Bump up bazel, rules_go, and others.
2. Switch to new go target naming (bye bye go_default_library)
3. Move go deps to go.mod/go.sum, use make gazelle generate from that
4. Bump up Python deps a bit

And also whatever was required to actually get things to work - loads of
small useless changes.

Tested to work on NixOS and Ubuntu 20.04:

   $ bazel build //...
   $ bazel test //...

Change-Id: I8364bdaa1406b9ae4d0385a6b607f3e7989f98a9
Reviewed-on: https://gerrit.hackerspace.pl/c/hscloud/+/1583
Reviewed-by: q3k <q3k@hackerspace.pl>
diff --git a/cluster/admitomatic/BUILD.bazel b/cluster/admitomatic/BUILD.bazel
index 5aa7c0e..e2ff90f 100644
--- a/cluster/admitomatic/BUILD.bazel
+++ b/cluster/admitomatic/BUILD.bazel
@@ -2,7 +2,7 @@
 load("@io_bazel_rules_go//go:def.bzl", "go_binary", "go_library", "go_test")
 
 go_library(
-    name = "go_default_library",
+    name = "admitomatic_lib",
     srcs = [
         "ingress.go",
         "main.go",
@@ -11,40 +11,40 @@
     importpath = "code.hackerspace.pl/hscloud/cluster/admitomatic",
     visibility = ["//visibility:private"],
     deps = [
-        "//cluster/admitomatic/config:go_default_library",
-        "//go/mirko:go_default_library",
-        "@com_github_golang_glog//:go_default_library",
-        "@io_k8s_api//admission/v1beta1:go_default_library",
-        "@io_k8s_api//networking/v1beta1:go_default_library",
-        "@io_k8s_apimachinery//pkg/apis/meta/v1:go_default_library",
-        "@org_golang_google_protobuf//encoding/prototext:go_default_library",
+        "//cluster/admitomatic/config",
+        "//go/mirko",
+        "@com_github_golang_glog//:glog",
+        "@io_k8s_api//admission/v1beta1",
+        "@io_k8s_api//networking/v1beta1",
+        "@io_k8s_apimachinery//pkg/apis/meta/v1:meta",
+        "@org_golang_google_protobuf//encoding/prototext",
     ],
 )
 
 go_binary(
     name = "admitomatic",
-    embed = [":go_default_library"],
+    embed = [":admitomatic_lib"],
     visibility = ["//visibility:public"],
 )
 
 go_test(
-    name = "go_default_test",
+    name = "admitomatic_test",
     srcs = ["ingress_test.go"],
-    embed = [":go_default_library"],
+    embed = [":admitomatic_lib"],
     deps = [
-        "@io_k8s_api//admission/v1beta1:go_default_library",
-        "@io_k8s_api//networking/v1beta1:go_default_library",
-        "@io_k8s_apimachinery//pkg/apis/meta/v1:go_default_library",
-        "@io_k8s_apimachinery//pkg/runtime:go_default_library",
+        "@io_k8s_api//admission/v1beta1",
+        "@io_k8s_api//networking/v1beta1",
+        "@io_k8s_apimachinery//pkg/apis/meta/v1:meta",
+        "@io_k8s_apimachinery//pkg/runtime",
     ],
 )
 
 container_layer(
     name = "layer_bin",
+    directory = "/cluster/admitomatic/",
     files = [
         ":admitomatic",
     ],
-    directory = "/cluster/admitomatic/",
 )
 
 container_image(
@@ -57,8 +57,8 @@
 
 container_push(
     name = "push",
-    image = ":runtime",
     format = "Docker",
+    image = ":runtime",
     registry = "registry.k0.hswaw.net",
     repository = "cluster/admitomatic",
     tag = "{BUILD_TIMESTAMP}-{STABLE_GIT_COMMIT}",
diff --git a/cluster/admitomatic/config/BUILD.bazel b/cluster/admitomatic/config/BUILD.bazel
index 0344526..f74a0d1 100644
--- a/cluster/admitomatic/config/BUILD.bazel
+++ b/cluster/admitomatic/config/BUILD.bazel
@@ -16,7 +16,7 @@
 )
 
 go_library(
-    name = "go_default_library",
+    name = "config",
     embed = [":config_go_proto"],
     importpath = "code.hackerspace.pl/hscloud/cluster/admitomatic/config",
     visibility = ["//visibility:public"],
diff --git a/cluster/certs/BUILD.bazel b/cluster/certs/BUILD.bazel
index ca15f0f..f16d6aa 100644
--- a/cluster/certs/BUILD.bazel
+++ b/cluster/certs/BUILD.bazel
@@ -4,15 +4,15 @@
 go_embed_data(
     name = "certs_data",
     srcs = glob(["*.crt"]),
-    package = "certs",
     flatten = True,
+    package = "certs",
 )
 
 go_library(
-    name = "go_default_library",
+    name = "certs",
     srcs = [
         ":certs_data",  # keep
     ],
-    importpath = "code.hackerspace.pl/cluster/certs",
+    importpath = "code.hackerspace.pl/hscloud/cluster/certs",  # keep
     visibility = ["//visibility:public"],
 )
diff --git a/cluster/clustercfg/BUILD b/cluster/clustercfg/BUILD
index e7b308e..d81a947 100644
--- a/cluster/clustercfg/BUILD
+++ b/cluster/clustercfg/BUILD
@@ -1,7 +1,7 @@
 load("@io_bazel_rules_go//go:def.bzl", "go_binary", "go_library")
 
 go_library(
-    name = "go_default_library",
+    name = "clustercfg_lib",
     srcs = [
         "cmd_admincreds.go",
         "cmd_gencerts.go",
@@ -10,16 +10,16 @@
     importpath = "code.hackerspace.pl/hscloud/cluster/clustercfg",
     visibility = ["//visibility:private"],
     deps = [
-        "//cluster/clustercfg/certs:go_default_library",
-        "//go/workspace:go_default_library",
-        "@com_github_spf13_cobra//:go_default_library",
-        "@io_k8s_client_go//tools/clientcmd:go_default_library",
-        "@io_k8s_client_go//tools/clientcmd/api:go_default_library",
+        "//cluster/clustercfg/certs",
+        "//go/workspace",
+        "@com_github_spf13_cobra//:cobra",
+        "@io_k8s_client_go//tools/clientcmd",
+        "@io_k8s_client_go//tools/clientcmd/api",
     ],
 )
 
 go_binary(
     name = "clustercfg",
-    embed = [":go_default_library"],
+    embed = [":clustercfg_lib"],
     visibility = ["//visibility:public"],
 )
diff --git a/cluster/clustercfg/certs/BUILD.bazel b/cluster/clustercfg/certs/BUILD.bazel
index c115680..c78b988 100644
--- a/cluster/clustercfg/certs/BUILD.bazel
+++ b/cluster/clustercfg/certs/BUILD.bazel
@@ -1,7 +1,7 @@
 load("@io_bazel_rules_go//go:def.bzl", "go_library")
 
 go_library(
-    name = "go_default_library",
+    name = "certs",
     srcs = [
         "certs.go",
         "generator.go",
diff --git a/cluster/identd/BUILD.bazel b/cluster/identd/BUILD.bazel
index c49293f..689b922 100644
--- a/cluster/identd/BUILD.bazel
+++ b/cluster/identd/BUILD.bazel
@@ -2,46 +2,46 @@
 load("@io_bazel_rules_go//go:def.bzl", "go_binary", "go_library")
 
 go_library(
-    name = "go_default_library",
+    name = "identd_lib",
     srcs = ["main.go"],
     importpath = "code.hackerspace.pl/hscloud/cluster/identd",
     visibility = ["//visibility:private"],
     deps = [
-        "//cluster/identd/ident:go_default_library",
-        "//cluster/identd/kubenat:go_default_library",
-        "//go/mirko:go_default_library",
-        "@com_github_golang_glog//:go_default_library",
-        "@io_k8s_apimachinery//pkg/apis/meta/v1:go_default_library",
+        "//cluster/identd/ident",
+        "//cluster/identd/kubenat",
+        "//go/mirko",
+        "@com_github_golang_glog//:glog",
+        "@io_k8s_apimachinery//pkg/apis/meta/v1:meta",
     ],
 )
 
 go_binary(
     name = "identd",
-    embed = [":go_default_library"],
+    embed = [":identd_lib"],
     visibility = ["//visibility:public"],
 )
 
 container_layer(
     name = "layer_bin",
+    directory = "/cluster/identd/",
     files = [
         ":identd",
     ],
-    directory = "/cluster/identd/",
 )
 
 container_image(
     name = "runtime",
     base = "@prodimage-bionic//image",
+    entrypoint = "/cluster/identd/identd",
     layers = [
         ":layer_bin",
     ],
-    entrypoint = "/cluster/identd/identd",
 )
 
 container_push(
     name = "push",
-    image = ":runtime",
     format = "Docker",
+    image = ":runtime",
     registry = "registry.k0.hswaw.net",
     repository = "q3k/identd",
     tag = "{BUILD_TIMESTAMP}-{STABLE_GIT_COMMIT}",
diff --git a/cluster/identd/cri/BUILD.bazel b/cluster/identd/cri/BUILD.bazel
index 68a15aa..1fd00bd 100644
--- a/cluster/identd/cri/BUILD.bazel
+++ b/cluster/identd/cri/BUILD.bazel
@@ -17,7 +17,7 @@
 )
 
 go_library(
-    name = "go_default_library",
+    name = "cri",
     embed = [":cri_go_proto"],
     importpath = "code.hackerspace.pl/hscloud/cluster/identd/cri",
     visibility = ["//visibility:public"],
diff --git a/cluster/identd/ident/BUILD.bazel b/cluster/identd/ident/BUILD.bazel
index 737b814..a1bf063 100644
--- a/cluster/identd/ident/BUILD.bazel
+++ b/cluster/identd/ident/BUILD.bazel
@@ -1,7 +1,7 @@
 load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test")
 
 go_library(
-    name = "go_default_library",
+    name = "ident",
     srcs = [
         "client.go",
         "errors.go",
@@ -11,17 +11,17 @@
     ],
     importpath = "code.hackerspace.pl/hscloud/cluster/identd/ident",
     visibility = ["//visibility:public"],
-    deps = ["@com_github_golang_glog//:go_default_library"],
+    deps = ["@com_github_golang_glog//:glog"],
 )
 
 go_test(
-    name = "go_default_test",
+    name = "ident_test",
     srcs = [
         "e2e_test.go",
         "request_test.go",
         "response_test.go",
         "server_test.go",
     ],
-    embed = [":go_default_library"],
-    deps = ["@com_github_go_test_deep//:go_default_library"],
+    embed = [":ident"],
+    deps = ["@com_github_go_test_deep//:deep"],
 )
diff --git a/cluster/identd/kubenat/BUILD.bazel b/cluster/identd/kubenat/BUILD.bazel
index eeb97ef..02eea63 100644
--- a/cluster/identd/kubenat/BUILD.bazel
+++ b/cluster/identd/kubenat/BUILD.bazel
@@ -1,7 +1,7 @@
 load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test")
 
 go_library(
-    name = "go_default_library",
+    name = "kubenat",
     srcs = [
         "kubenat.go",
         "pods.go",
@@ -10,25 +10,25 @@
     importpath = "code.hackerspace.pl/hscloud/cluster/identd/kubenat",
     visibility = ["//visibility:public"],
     deps = [
-        "//cluster/identd/cri:go_default_library",
-        "@com_github_cenkalti_backoff//:go_default_library",
-        "@com_github_golang_glog//:go_default_library",
+        "//cluster/identd/cri",
+        "@com_github_cenkalti_backoff//:backoff",
+        "@com_github_golang_glog//:glog",
         "@org_golang_google_grpc//:go_default_library",
-        "@org_golang_google_grpc//codes:go_default_library",
-        "@org_golang_google_grpc//status:go_default_library",
+        "@org_golang_google_grpc//codes",
+        "@org_golang_google_grpc//status",
     ],
 )
 
 go_test(
-    name = "go_default_test",
+    name = "kubenat_test",
     srcs = [
         "kubenat_test.go",
         "pods_test.go",
         "translation_test.go",
     ],
-    embed = [":go_default_library"],
+    embed = [":kubenat"],
     deps = [
-        "@com_github_go_test_deep//:go_default_library",
-        "@com_github_golang_glog//:go_default_library",
+        "@com_github_go_test_deep//:deep",
+        "@com_github_golang_glog//:glog",
     ],
 )
diff --git a/cluster/prodaccess/BUILD.bazel b/cluster/prodaccess/BUILD.bazel
index 4db48dd..9189010 100644
--- a/cluster/prodaccess/BUILD.bazel
+++ b/cluster/prodaccess/BUILD.bazel
@@ -1,7 +1,7 @@
 load("@io_bazel_rules_go//go:def.bzl", "go_binary", "go_library")
 
 go_library(
-    name = "go_default_library",
+    name = "prodaccess_lib",
     srcs = [
         "hspki.go",
         "kubernetes.go",
@@ -10,19 +10,19 @@
     importpath = "code.hackerspace.pl/hscloud/cluster/prodaccess",
     visibility = ["//visibility:private"],
     deps = [
-        "//cluster/certs:go_default_library",
-        "//cluster/prodvider/proto:go_default_library",
-        "//go/pki:go_default_library",
-        "//go/workspace:go_default_library",
-        "@com_github_golang_glog//:go_default_library",
+        "//cluster/certs",
+        "//cluster/prodvider/proto",
+        "//go/pki",
+        "//go/workspace",
+        "@com_github_golang_glog//:glog",
         "@org_golang_google_grpc//:go_default_library",
-        "@org_golang_google_grpc//credentials:go_default_library",
-        "@org_golang_x_crypto//ssh/terminal:go_default_library",
+        "@org_golang_google_grpc//credentials",
+        "@org_golang_x_crypto//ssh/terminal",
     ],
 )
 
 go_binary(
     name = "prodaccess",
-    embed = [":go_default_library"],
+    embed = [":prodaccess_lib"],
     visibility = ["//visibility:public"],
 )
diff --git a/cluster/prodaccess/prodaccess.go b/cluster/prodaccess/prodaccess.go
index 1153bab..2d734f9 100644
--- a/cluster/prodaccess/prodaccess.go
+++ b/cluster/prodaccess/prodaccess.go
@@ -14,7 +14,7 @@
 	"google.golang.org/grpc"
 	"google.golang.org/grpc/credentials"
 
-	"code.hackerspace.pl/cluster/certs"
+	"code.hackerspace.pl/hscloud/cluster/certs"
 	pb "code.hackerspace.pl/hscloud/cluster/prodvider/proto"
 )
 
diff --git a/cluster/prodvider/BUILD.bazel b/cluster/prodvider/BUILD.bazel
index c462541..ff7f64b 100644
--- a/cluster/prodvider/BUILD.bazel
+++ b/cluster/prodvider/BUILD.bazel
@@ -2,7 +2,7 @@
 load("@io_bazel_rules_go//go:def.bzl", "go_binary", "go_library")
 
 go_library(
-    name = "go_default_library",
+    name = "prodvider_lib",
     srcs = [
         "certs.go",
         "crdb.go",
@@ -14,39 +14,39 @@
     importpath = "code.hackerspace.pl/hscloud/cluster/prodvider",
     visibility = ["//visibility:private"],
     deps = [
-        "//cluster/prodvider/proto:go_default_library",
-        "@com_github_cloudflare_cfssl//config:go_default_library",
-        "@com_github_cloudflare_cfssl//csr:go_default_library",
-        "@com_github_cloudflare_cfssl//helpers:go_default_library",
-        "@com_github_cloudflare_cfssl//signer:go_default_library",
-        "@com_github_cloudflare_cfssl//signer/local:go_default_library",
-        "@com_github_golang_glog//:go_default_library",
-        "@in_gopkg_ldap_v3//:go_default_library",
-        "@io_k8s_api//core/v1:go_default_library",
-        "@io_k8s_api//rbac/v1:go_default_library",
-        "@io_k8s_apimachinery//pkg/api/errors:go_default_library",
-        "@io_k8s_apimachinery//pkg/apis/meta/v1:go_default_library",
-        "@io_k8s_client_go//kubernetes:go_default_library",
-        "@io_k8s_client_go//rest:go_default_library",
+        "//cluster/prodvider/proto",
+        "@com_github_cloudflare_cfssl//config",
+        "@com_github_cloudflare_cfssl//csr",
+        "@com_github_cloudflare_cfssl//helpers",
+        "@com_github_cloudflare_cfssl//signer",
+        "@com_github_cloudflare_cfssl//signer/local",
+        "@com_github_go_ldap_ldap_v3//:ldap",
+        "@com_github_golang_glog//:glog",
+        "@io_k8s_api//core/v1:core",
+        "@io_k8s_api//rbac/v1:rbac",
+        "@io_k8s_apimachinery//pkg/api/errors",
+        "@io_k8s_apimachinery//pkg/apis/meta/v1:meta",
+        "@io_k8s_client_go//kubernetes",
+        "@io_k8s_client_go//rest",
         "@org_golang_google_grpc//:go_default_library",
-        "@org_golang_google_grpc//codes:go_default_library",
-        "@org_golang_google_grpc//credentials:go_default_library",
-        "@org_golang_google_grpc//status:go_default_library",
+        "@org_golang_google_grpc//codes",
+        "@org_golang_google_grpc//credentials",
+        "@org_golang_google_grpc//status",
     ],
 )
 
 go_binary(
     name = "prodvider",
-    embed = [":go_default_library"],
+    embed = [":prodvider_lib"],
     visibility = ["//visibility:public"],
 )
 
 container_layer(
     name = "layer_bin",
+    directory = "/cluster/prodvider/",
     files = [
         ":prodvider",
     ],
-    directory = "/cluster/prodvider/",
 )
 
 container_image(
@@ -59,8 +59,8 @@
 
 container_push(
     name = "push",
-    image = ":runtime",
     format = "Docker",
+    image = ":runtime",
     registry = "registry.k0.hswaw.net",
     repository = "q3k/prodvider",
     tag = "1680303245",
diff --git a/cluster/prodvider/crdb.go b/cluster/prodvider/crdb.go
index 348754c..13ff199 100644
--- a/cluster/prodvider/crdb.go
+++ b/cluster/prodvider/crdb.go
@@ -62,7 +62,7 @@
 	signerCert, _ := s.Certificate("", "")
 	req := &csr.CertificateRequest{
 		CN: username,
-		KeyRequest: &csr.BasicKeyRequest{
+		KeyRequest: &csr.KeyRequest{
 			A: "rsa",
 			S: 4096,
 		},
diff --git a/cluster/prodvider/hspki.go b/cluster/prodvider/hspki.go
index fabf84d..e3019c6 100644
--- a/cluster/prodvider/hspki.go
+++ b/cluster/prodvider/hspki.go
@@ -60,7 +60,7 @@
 	signerCert, _ := s.Certificate("", "")
 	req := &csr.CertificateRequest{
 		CN: principal,
-		KeyRequest: &csr.BasicKeyRequest{
+		KeyRequest: &csr.KeyRequest{
 			A: "rsa",
 			S: 4096,
 		},
diff --git a/cluster/prodvider/proto/BUILD.bazel b/cluster/prodvider/proto/BUILD.bazel
index 0817dfb..4abcd01 100644
--- a/cluster/prodvider/proto/BUILD.bazel
+++ b/cluster/prodvider/proto/BUILD.bazel
@@ -17,7 +17,7 @@
 )
 
 go_library(
-    name = "go_default_library",
+    name = "proto",
     embed = [":proto_go_proto"],
     importpath = "code.hackerspace.pl/hscloud/cluster/prodvider/proto",
     visibility = ["//visibility:public"],
diff --git a/cluster/prodvider/service.go b/cluster/prodvider/service.go
index 19f70ed..21b5f57 100644
--- a/cluster/prodvider/service.go
+++ b/cluster/prodvider/service.go
@@ -7,10 +7,10 @@
 	"regexp"
 	"strings"
 
+	ldap "github.com/go-ldap/ldap/v3"
 	"github.com/golang/glog"
 	"google.golang.org/grpc/codes"
 	"google.golang.org/grpc/status"
-	ldap "gopkg.in/ldap.v3"
 
 	pb "code.hackerspace.pl/hscloud/cluster/prodvider/proto"
 )
diff --git a/cluster/tools/BUILD b/cluster/tools/BUILD
index f28be36..0fe5b98 100644
--- a/cluster/tools/BUILD
+++ b/cluster/tools/BUILD
@@ -3,7 +3,7 @@
 
 copy_go_binary(
     name = "kubectl",
-    src = "@io_k8s_kubernetes//cmd/kubectl:kubectl",
+    src = "@io_k8s_kubernetes//cmd/kubectl",
     visibility = ["//visibility:public"],
 )
 
@@ -30,7 +30,7 @@
 
 copy_go_binary(
     name = "cfssl",
-    src = "@com_github_cloudflare_cfssl//cmd/cfssl:cfssl",
+    src = "@com_github_cloudflare_cfssl//cmd/cfssl",
     visibility = ["//visibility:public"],
 )
 
@@ -38,8 +38,7 @@
     name = "rook-s3cmd-config",
     srcs = ["rook-s3cmd-config.sh"],
     data = [
-        "@bazel_tools//tools/bash/runfiles",
-        "@com_github_itchyny_gojq//cmd/gojq",
         ":kubectl",
+        "@bazel_tools//tools/bash/runfiles",
     ],
 )
diff --git a/cluster/tools/kartongips/BUILD.bazel b/cluster/tools/kartongips/BUILD.bazel
index 1a08ee2..fdec6d8 100644
--- a/cluster/tools/kartongips/BUILD.bazel
+++ b/cluster/tools/kartongips/BUILD.bazel
@@ -1,7 +1,7 @@
 load("@io_bazel_rules_go//go:def.bzl", "go_binary", "go_library")
 
 go_library(
-    name = "go_default_library",
+    name = "kartongips_lib",
     srcs = ["main.go"],
     importpath = "code.hackerspace.pl/hscloud/cluster/tools/kartongips",
     visibility = ["//visibility:private"],
@@ -9,14 +9,14 @@
         "code.hackerspace.pl/hscloud/cluster/tools/kartongips.Version": "{STABLE_GIT_VERSION}",
     },
     deps = [
-        "//cluster/tools/kartongips/cmd:go_default_library",
-        "//cluster/tools/kartongips/pkg/kubecfg:go_default_library",
-        "@com_github_sirupsen_logrus//:go_default_library",
+        "//cluster/tools/kartongips/cmd",
+        "//cluster/tools/kartongips/pkg/kubecfg",
+        "@com_github_sirupsen_logrus//:logrus",
     ],
 )
 
 go_binary(
     name = "kartongips",
-    embed = [":go_default_library"],
+    embed = [":kartongips_lib"],
     visibility = ["//visibility:public"],
 )
diff --git a/cluster/tools/kartongips/cmd/BUILD.bazel b/cluster/tools/kartongips/cmd/BUILD.bazel
index a75ee83..e7d3cbf 100644
--- a/cluster/tools/kartongips/cmd/BUILD.bazel
+++ b/cluster/tools/kartongips/cmd/BUILD.bazel
@@ -1,7 +1,7 @@
 load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test")
 
 go_library(
-    name = "go_default_library",
+    name = "cmd",
     srcs = [
         "completion.go",
         "delete.go",
@@ -15,37 +15,36 @@
     importpath = "code.hackerspace.pl/hscloud/cluster/tools/kartongips/cmd",
     visibility = ["//visibility:public"],
     deps = [
-        "//cluster/tools/kartongips/pkg/kubecfg:go_default_library",
-        "//cluster/tools/kartongips/utils:go_default_library",
-        "@com_github_genuinetools_reg//registry:go_default_library",
-        "@com_github_google_go_jsonnet//:go_default_library",
-        "@com_github_mattn_go_isatty//:go_default_library",
-        "@com_github_sirupsen_logrus//:go_default_library",
-        "@com_github_spf13_cobra//:go_default_library",
-        "@io_k8s_apimachinery//pkg/api/meta:go_default_library",
-        "@io_k8s_apimachinery//pkg/apis/meta/v1/unstructured:go_default_library",
-        "@io_k8s_client_go//discovery:go_default_library",
-        "@io_k8s_client_go//dynamic:go_default_library",
-        "@io_k8s_client_go//pkg/version:go_default_library",
-        "@io_k8s_client_go//plugin/pkg/client/auth:go_default_library",
-        "@io_k8s_client_go//restmapper:go_default_library",
-        "@io_k8s_client_go//tools/clientcmd:go_default_library",
-        "@io_k8s_klog//:go_default_library",
-        "@org_golang_x_crypto//ssh/terminal:go_default_library",
+        "//cluster/tools/kartongips/pkg/kubecfg",
+        "//cluster/tools/kartongips/utils",
+        "@com_github_genuinetools_reg//registry",
+        "@com_github_google_go_jsonnet//:go-jsonnet",
+        "@com_github_mattn_go_isatty//:go-isatty",
+        "@com_github_sirupsen_logrus//:logrus",
+        "@com_github_spf13_cobra//:cobra",
+        "@io_k8s_apimachinery//pkg/api/meta",
+        "@io_k8s_apimachinery//pkg/apis/meta/v1/unstructured",
+        "@io_k8s_client_go//discovery",
+        "@io_k8s_client_go//dynamic",
+        "@io_k8s_client_go//plugin/pkg/client/auth",
+        "@io_k8s_client_go//restmapper",
+        "@io_k8s_client_go//tools/clientcmd",
+        "@io_k8s_klog//:klog",
+        "@org_golang_x_crypto//ssh/terminal",
     ],
 )
 
 go_test(
-    name = "go_default_test",
+    name = "cmd_test",
     srcs = [
         "completion_test.go",
         "show_test.go",
         "version_test.go",
     ],
-    embed = [":go_default_library"],
+    embed = [":cmd"],
     deps = [
-        "@com_github_spf13_cobra//:go_default_library",
-        "@com_github_spf13_pflag//:go_default_library",
-        "@in_gopkg_yaml_v2//:go_default_library",
+        "@com_github_spf13_cobra//:cobra",
+        "@com_github_spf13_pflag//:pflag",
+        "@in_gopkg_yaml_v2//:yaml_v2",
     ],
 )
diff --git a/cluster/tools/kartongips/pkg/kubecfg/BUILD.bazel b/cluster/tools/kartongips/pkg/kubecfg/BUILD.bazel
index 6a112b3..234b6f1 100644
--- a/cluster/tools/kartongips/pkg/kubecfg/BUILD.bazel
+++ b/cluster/tools/kartongips/pkg/kubecfg/BUILD.bazel
@@ -1,7 +1,7 @@
 load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test")
 
 go_library(
-    name = "go_default_library",
+    name = "kubecfg",
     srcs = [
         "delete.go",
         "diff.go",
@@ -12,52 +12,52 @@
     importpath = "code.hackerspace.pl/hscloud/cluster/tools/kartongips/pkg/kubecfg",
     visibility = ["//visibility:public"],
     deps = [
-        "//cluster/tools/kartongips/utils:go_default_library",
-        "@com_github_evanphx_json_patch//:go_default_library",
-        "@com_github_mattn_go_isatty//:go_default_library",
-        "@com_github_sergi_go_diff//diffmatchpatch:go_default_library",
-        "@com_github_sirupsen_logrus//:go_default_library",
-        "@in_gopkg_yaml_v2//:go_default_library",
-        "@io_k8s_apiextensions_apiserver//pkg/apis/apiextensions/v1beta1:go_default_library",
-        "@io_k8s_apimachinery//pkg/api/equality:go_default_library",
-        "@io_k8s_apimachinery//pkg/api/errors:go_default_library",
-        "@io_k8s_apimachinery//pkg/api/meta:go_default_library",
-        "@io_k8s_apimachinery//pkg/apis/meta/v1:go_default_library",
-        "@io_k8s_apimachinery//pkg/apis/meta/v1/unstructured:go_default_library",
-        "@io_k8s_apimachinery//pkg/runtime:go_default_library",
-        "@io_k8s_apimachinery//pkg/runtime/schema:go_default_library",
-        "@io_k8s_apimachinery//pkg/util/diff:go_default_library",
-        "@io_k8s_apimachinery//pkg/util/jsonmergepatch:go_default_library",
-        "@io_k8s_apimachinery//pkg/util/sets:go_default_library",
-        "@io_k8s_apimachinery//pkg/util/strategicpatch:go_default_library",
-        "@io_k8s_apimachinery//pkg/util/wait:go_default_library",
-        "@io_k8s_client_go//discovery:go_default_library",
-        "@io_k8s_client_go//dynamic:go_default_library",
-        "@io_k8s_client_go//util/retry:go_default_library",
-        "@io_k8s_kube_openapi//pkg/util/proto:go_default_library",
-        "@io_k8s_kubectl//pkg/util/openapi:go_default_library",
+        "//cluster/tools/kartongips/utils",
+        "@com_github_evanphx_json_patch//:json-patch",
+        "@com_github_mattn_go_isatty//:go-isatty",
+        "@com_github_sergi_go_diff//diffmatchpatch",
+        "@com_github_sirupsen_logrus//:logrus",
+        "@in_gopkg_yaml_v2//:yaml_v2",
+        "@io_k8s_apiextensions_apiserver//pkg/apis/apiextensions/v1beta1",
+        "@io_k8s_apimachinery//pkg/api/equality",
+        "@io_k8s_apimachinery//pkg/api/errors",
+        "@io_k8s_apimachinery//pkg/api/meta",
+        "@io_k8s_apimachinery//pkg/apis/meta/v1:meta",
+        "@io_k8s_apimachinery//pkg/apis/meta/v1/unstructured",
+        "@io_k8s_apimachinery//pkg/runtime",
+        "@io_k8s_apimachinery//pkg/runtime/schema",
+        "@io_k8s_apimachinery//pkg/util/diff",
+        "@io_k8s_apimachinery//pkg/util/jsonmergepatch",
+        "@io_k8s_apimachinery//pkg/util/sets",
+        "@io_k8s_apimachinery//pkg/util/strategicpatch",
+        "@io_k8s_apimachinery//pkg/util/wait",
+        "@io_k8s_client_go//discovery",
+        "@io_k8s_client_go//dynamic",
+        "@io_k8s_client_go//util/retry",
+        "@io_k8s_kube_openapi//pkg/util/proto",
+        "@io_k8s_kubectl//pkg/util/openapi",
     ],
 )
 
 go_test(
-    name = "go_default_test",
+    name = "kubecfg_test",
     srcs = [
         "diff_test.go",
         "update_test.go",
     ],
-    embed = [":go_default_library"],
+    embed = [":kubecfg"],
     deps = [
-        "//cluster/tools/kartongips/utils:go_default_library",
+        "//cluster/tools/kartongips/utils",
         "@com_github_golang_protobuf//proto:go_default_library",
-        "@com_github_googleapis_gnostic//openapiv2:go_default_library",
-        "@com_github_stretchr_testify//require:go_default_library",
-        "@io_k8s_apimachinery//pkg/api/equality:go_default_library",
-        "@io_k8s_apimachinery//pkg/apis/meta/v1:go_default_library",
-        "@io_k8s_apimachinery//pkg/apis/meta/v1/unstructured:go_default_library",
-        "@io_k8s_apimachinery//pkg/runtime/schema:go_default_library",
-        "@io_k8s_apimachinery//pkg/util/diff:go_default_library",
-        "@io_k8s_apimachinery//pkg/util/strategicpatch:go_default_library",
-        "@io_k8s_kube_openapi//pkg/util/proto:go_default_library",
-        "@io_k8s_kubectl//pkg/util/openapi:go_default_library",
+        "@com_github_google_gnostic//openapiv2",
+        "@com_github_stretchr_testify//require",
+        "@io_k8s_apimachinery//pkg/api/equality",
+        "@io_k8s_apimachinery//pkg/apis/meta/v1:meta",
+        "@io_k8s_apimachinery//pkg/apis/meta/v1/unstructured",
+        "@io_k8s_apimachinery//pkg/runtime/schema",
+        "@io_k8s_apimachinery//pkg/util/diff",
+        "@io_k8s_apimachinery//pkg/util/strategicpatch",
+        "@io_k8s_kube_openapi//pkg/util/proto",
+        "@io_k8s_kubectl//pkg/util/openapi",
     ],
 )
diff --git a/cluster/tools/kartongips/pkg/kubecfg/update.go b/cluster/tools/kartongips/pkg/kubecfg/update.go
index d035c2e..0627fcd 100644
--- a/cluster/tools/kartongips/pkg/kubecfg/update.go
+++ b/cluster/tools/kartongips/pkg/kubecfg/update.go
@@ -442,7 +442,7 @@
 }
 
 func walkObjects(ctx context.Context, client dynamic.Interface, disco discovery.DiscoveryInterface, listopts metav1.ListOptions, callback func(runtime.Object) error) error {
-	rsrclists, err := disco.ServerResources()
+	rsrclists, err := disco.ServerPreferredResources()
 	if err != nil {
 		return err
 	}
diff --git a/cluster/tools/kartongips/pkg/kubecfg/update_test.go b/cluster/tools/kartongips/pkg/kubecfg/update_test.go
index cf6e745..575ba66 100644
--- a/cluster/tools/kartongips/pkg/kubecfg/update_test.go
+++ b/cluster/tools/kartongips/pkg/kubecfg/update_test.go
@@ -7,7 +7,7 @@
 	"testing"
 
 	pb_proto "github.com/golang/protobuf/proto"
-	openapi_v2 "github.com/googleapis/gnostic/openapiv2"
+	openapi_v2 "github.com/google/gnostic/openapiv2"
 	apiequality "k8s.io/apimachinery/pkg/api/equality"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
diff --git a/cluster/tools/kartongips/utils/BUILD.bazel b/cluster/tools/kartongips/utils/BUILD.bazel
index d8724f0..c3a7d29 100644
--- a/cluster/tools/kartongips/utils/BUILD.bazel
+++ b/cluster/tools/kartongips/utils/BUILD.bazel
@@ -1,7 +1,7 @@
 load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test")
 
 go_library(
-    name = "go_default_library",
+    name = "utils",
     srcs = [
         "acquire.go",
         "bindata.go",
@@ -16,34 +16,36 @@
     importpath = "code.hackerspace.pl/hscloud/cluster/tools/kartongips/utils",
     visibility = ["//visibility:public"],
     deps = [
-        "@com_github_elazarl_go_bindata_assetfs//:go_default_library",
-        "@com_github_genuinetools_reg//registry:go_default_library",
-        "@com_github_genuinetools_reg//repoutils:go_default_library",
-        "@com_github_ghodss_yaml//:go_default_library",
-        "@com_github_google_go_jsonnet//:go_default_library",
-        "@com_github_google_go_jsonnet//ast:go_default_library",
-        "@com_github_googleapis_gnostic//openapiv2:go_default_library",
-        "@com_github_sirupsen_logrus//:go_default_library",
-        "@io_k8s_apimachinery//pkg/api/errors:go_default_library",
-        "@io_k8s_apimachinery//pkg/api/meta:go_default_library",
-        "@io_k8s_apimachinery//pkg/apis/meta/v1:go_default_library",
-        "@io_k8s_apimachinery//pkg/apis/meta/v1/unstructured:go_default_library",
-        "@io_k8s_apimachinery//pkg/runtime:go_default_library",
-        "@io_k8s_apimachinery//pkg/runtime/schema:go_default_library",
-        "@io_k8s_apimachinery//pkg/util/runtime:go_default_library",
-        "@io_k8s_apimachinery//pkg/util/yaml:go_default_library",
-        "@io_k8s_apimachinery//pkg/version:go_default_library",
-        "@io_k8s_client_go//discovery:go_default_library",
-        "@io_k8s_client_go//dynamic:go_default_library",
-        "@io_k8s_client_go//rest:go_default_library",
-        "@io_k8s_kube_openapi//pkg/util/proto:go_default_library",
-        "@io_k8s_kube_openapi//pkg/util/proto/validation:go_default_library",
-        "@io_k8s_kubectl//pkg/util/openapi:go_default_library",
+        "@com_github_elazarl_go_bindata_assetfs//:go-bindata-assetfs",
+        "@com_github_genuinetools_reg//registry",
+        "@com_github_genuinetools_reg//repoutils",
+        "@com_github_ghodss_yaml//:yaml",
+        "@com_github_google_gnostic//openapiv2",
+        "@com_github_google_go_jsonnet//:go-jsonnet",
+        "@com_github_google_go_jsonnet//ast",
+        "@com_github_sirupsen_logrus//:logrus",
+        "@io_k8s_apimachinery//pkg/api/errors",
+        "@io_k8s_apimachinery//pkg/api/meta",
+        "@io_k8s_apimachinery//pkg/apis/meta/v1:meta",
+        "@io_k8s_apimachinery//pkg/apis/meta/v1/unstructured",
+        "@io_k8s_apimachinery//pkg/runtime",
+        "@io_k8s_apimachinery//pkg/runtime/schema",
+        "@io_k8s_apimachinery//pkg/util/runtime",
+        "@io_k8s_apimachinery//pkg/util/yaml",
+        "@io_k8s_apimachinery//pkg/version",
+        "@io_k8s_client_go//discovery",
+        "@io_k8s_client_go//dynamic",
+        "@io_k8s_client_go//openapi",
+        "@io_k8s_client_go//openapi/cached",
+        "@io_k8s_client_go//rest",
+        "@io_k8s_kube_openapi//pkg/util/proto",
+        "@io_k8s_kube_openapi//pkg/util/proto/validation",
+        "@io_k8s_kubectl//pkg/util/openapi",
     ],
 )
 
 go_test(
-    name = "go_default_test",
+    name = "utils_test",
     srcs = [
         "acquire_test.go",
         "importer_test.go",
@@ -52,23 +54,23 @@
         "openapi_test.go",
         "sort_test.go",
     ],
-    embed = [":go_default_library"],
+    embed = [":utils"],
     deps = [
         "@com_github_golang_protobuf//proto:go_default_library",
-        "@com_github_google_go_jsonnet//:go_default_library",
-        "@com_github_googleapis_gnostic//openapiv2:go_default_library",
-        "@com_github_sirupsen_logrus//:go_default_library",
-        "@io_k8s_apimachinery//pkg/api/equality:go_default_library",
-        "@io_k8s_apimachinery//pkg/api/meta:go_default_library",
-        "@io_k8s_apimachinery//pkg/apis/meta/v1:go_default_library",
-        "@io_k8s_apimachinery//pkg/apis/meta/v1/unstructured:go_default_library",
-        "@io_k8s_apimachinery//pkg/runtime/schema:go_default_library",
-        "@io_k8s_apimachinery//pkg/util/diff:go_default_library",
-        "@io_k8s_apimachinery//pkg/util/errors:go_default_library",
-        "@io_k8s_apimachinery//pkg/version:go_default_library",
-        "@io_k8s_client_go//discovery:go_default_library",
-        "@io_k8s_client_go//discovery/fake:go_default_library",
-        "@io_k8s_client_go//restmapper:go_default_library",
-        "@io_k8s_client_go//testing:go_default_library",
+        "@com_github_google_gnostic//openapiv2",
+        "@com_github_google_go_jsonnet//:go-jsonnet",
+        "@com_github_sirupsen_logrus//:logrus",
+        "@io_k8s_apimachinery//pkg/api/equality",
+        "@io_k8s_apimachinery//pkg/api/meta",
+        "@io_k8s_apimachinery//pkg/apis/meta/v1:meta",
+        "@io_k8s_apimachinery//pkg/apis/meta/v1/unstructured",
+        "@io_k8s_apimachinery//pkg/runtime/schema",
+        "@io_k8s_apimachinery//pkg/util/diff",
+        "@io_k8s_apimachinery//pkg/util/errors",
+        "@io_k8s_apimachinery//pkg/version",
+        "@io_k8s_client_go//discovery",
+        "@io_k8s_client_go//discovery/fake",
+        "@io_k8s_client_go//restmapper",
+        "@io_k8s_client_go//testing",
     ],
 )
diff --git a/cluster/tools/kartongips/utils/client.go b/cluster/tools/kartongips/utils/client.go
index 07cf254..df9bdb8 100644
--- a/cluster/tools/kartongips/utils/client.go
+++ b/cluster/tools/kartongips/utils/client.go
@@ -27,7 +27,7 @@
 	"sync"
 	"syscall"
 
-	openapi_v2 "github.com/googleapis/gnostic/openapiv2"
+	openapi_v2 "github.com/google/gnostic/openapiv2"
 
 	log "github.com/sirupsen/logrus"
 	errorsutil "k8s.io/apimachinery/pkg/api/errors"
@@ -38,6 +38,8 @@
 	"k8s.io/apimachinery/pkg/version"
 	"k8s.io/client-go/discovery"
 	"k8s.io/client-go/dynamic"
+	openapi_v3 "k8s.io/client-go/openapi"
+	cachedopenapi_v3 "k8s.io/client-go/openapi/cached"
 	restclient "k8s.io/client-go/rest"
 )
 
@@ -57,7 +59,9 @@
 	lock                   sync.RWMutex
 	groupToServerResources map[string]*cacheEntry
 	groupList              *metav1.APIGroupList
+	openAPISchema          *openapi_v2.Document
 	cacheValid             bool
+	openapiV3Client        openapi_v3.Client
 }
 
 // Error Constants
@@ -124,12 +128,6 @@
 	return cachedVal.resourceList, cachedVal.err
 }
 
-// ServerResources returns the supported resources for all groups and versions.
-// Deprecated: use ServerGroupsAndResources instead.
-func (d *memcachedDiscoveryClient) ServerResources() ([]*metav1.APIResourceList, error) {
-	return discovery.ServerResources(d)
-}
-
 // ServerGroupsAndResources returns the groups and supported resources for all groups and versions.
 func (d *memcachedDiscoveryClient) ServerGroupsAndResources() ([]*metav1.APIGroup, []*metav1.APIResourceList, error) {
 	return discovery.ServerGroupsAndResources(d)
@@ -163,7 +161,18 @@
 }
 
 func (d *memcachedDiscoveryClient) OpenAPISchema() (*openapi_v2.Document, error) {
-	return d.delegate.OpenAPISchema()
+	d.lock.Lock()
+	defer d.lock.Unlock()
+
+	if d.openAPISchema == nil {
+		schema, err := d.delegate.OpenAPISchema()
+		if err != nil {
+			return nil, err
+		}
+		d.openAPISchema = schema
+	}
+
+	return d.openAPISchema, nil
 }
 
 func (d *memcachedDiscoveryClient) Fresh() bool {
@@ -183,6 +192,28 @@
 	d.cacheValid = false
 	d.groupToServerResources = nil
 	d.groupList = nil
+	d.openAPISchema = nil
+}
+
+// OpenAPIV3 retrieves and parses the OpenAPIV3 specs exposed by the server
+func (d *memcachedDiscoveryClient) OpenAPIV3() openapi_v3.Client {
+	d.lock.Lock()
+	defer d.lock.Unlock()
+
+	if d.openapiV3Client == nil {
+		// Delegate is discovery client created with special HTTP client which
+		// respects E-Tag cache responses to serve cache from disk.
+		d.openapiV3Client = cachedopenapi_v3.NewClient(d.delegate.OpenAPIV3())
+	}
+
+	return d.openapiV3Client
+}
+
+// taken from: https://github.com/kubernetes/client-go/commit/3ac73ea2c834b1268732024766f1e55a5d0327d2#diff-46edd694bf30a54d9f6e202e010134bedfce438de77f57830155b0762eda7bf6R280-R285
+// WithLegacy returns current cached discovery client;
+// current client does not support legacy-only discovery.
+func (d *memcachedDiscoveryClient) WithLegacy() discovery.DiscoveryInterface {
+	return d
 }
 
 // refreshLocked refreshes the state of cache. The caller must hold d.lock for
diff --git a/cluster/tools/kartongips/utils/openapi_test.go b/cluster/tools/kartongips/utils/openapi_test.go
index 80355c3..a0af770 100644
--- a/cluster/tools/kartongips/utils/openapi_test.go
+++ b/cluster/tools/kartongips/utils/openapi_test.go
@@ -22,7 +22,7 @@
 	"testing"
 
 	"github.com/golang/protobuf/proto"
-	openapi_v2 "github.com/googleapis/gnostic/openapiv2"
+	openapi_v2 "github.com/google/gnostic/openapiv2"
 	"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
 	"k8s.io/apimachinery/pkg/runtime/schema"
 	utilerrors "k8s.io/apimachinery/pkg/util/errors"
diff --git a/cluster/tools/kartongips/utils/sort_test.go b/cluster/tools/kartongips/utils/sort_test.go
index ffdfdd4..5a4eea6 100644
--- a/cluster/tools/kartongips/utils/sort_test.go
+++ b/cluster/tools/kartongips/utils/sort_test.go
@@ -21,7 +21,7 @@
 	"sort"
 	"testing"
 
-	openapi_v2 "github.com/googleapis/gnostic/openapiv2"
+	openapi_v2 "github.com/google/gnostic/openapiv2"
 	log "github.com/sirupsen/logrus"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
diff --git a/cluster/tools/tools.go b/cluster/tools/tools.go
new file mode 100644
index 0000000..22784c6
--- /dev/null
+++ b/cluster/tools/tools.go
@@ -0,0 +1,8 @@
+//go:build tools
+
+// +tools
+package tools
+
+import (
+	_ "k8s.io/kubernetes/cmd/kubectl"
+)