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/dc/arista-proxy/BUILD.bazel b/dc/arista-proxy/BUILD.bazel
index e337068..9acae47 100644
--- a/dc/arista-proxy/BUILD.bazel
+++ b/dc/arista-proxy/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 = "arista-proxy_lib",
     srcs = [
         "main.go",
         "service.go",
@@ -9,17 +9,17 @@
     importpath = "code.hackerspace.pl/hscloud/dc/arista-proxy",
     visibility = ["//visibility:private"],
     deps = [
-        "//dc/arista-proxy/proto:go_default_library",
-        "//go/mirko:go_default_library",
-        "@com_github_golang_glog//:go_default_library",
-        "@com_github_q3k_cursedjsonrpc//:go_default_library",
-        "@org_golang_google_grpc//codes:go_default_library",
-        "@org_golang_google_grpc//status:go_default_library",
+        "//dc/arista-proxy/proto",
+        "//go/mirko",
+        "@com_github_golang_glog//:glog",
+        "@com_github_q3k_cursedjsonrpc//:cursedjsonrpc",
+        "@org_golang_google_grpc//codes",
+        "@org_golang_google_grpc//status",
     ],
 )
 
 go_binary(
     name = "arista-proxy",
-    embed = [":go_default_library"],
+    embed = [":arista-proxy_lib"],
     visibility = ["//visibility:public"],
 )
diff --git a/dc/arista-proxy/main.go b/dc/arista-proxy/main.go
index ed4a9b3..15c9262 100644
--- a/dc/arista-proxy/main.go
+++ b/dc/arista-proxy/main.go
@@ -6,7 +6,7 @@
 
 	"code.hackerspace.pl/hscloud/go/mirko"
 	"github.com/golang/glog"
-	"github.com/q3k/cursedjsonrpc"
+	cursedjsonrpc "github.com/q3k/cursedjsonrpc"
 
 	pb "code.hackerspace.pl/hscloud/dc/arista-proxy/proto"
 )
diff --git a/dc/arista-proxy/proto/BUILD.bazel b/dc/arista-proxy/proto/BUILD.bazel
index 2df4f58..cb390ab 100644
--- a/dc/arista-proxy/proto/BUILD.bazel
+++ b/dc/arista-proxy/proto/BUILD.bazel
@@ -1,3 +1,4 @@
+load("@rules_proto//proto:defs.bzl", "proto_library")
 load("@io_bazel_rules_go//go:def.bzl", "go_library")
 load("@io_bazel_rules_go//proto:def.bzl", "go_proto_library")
 
@@ -16,7 +17,7 @@
 )
 
 go_library(
-    name = "go_default_library",
+    name = "proto",
     embed = [":proto_go_proto"],
     importpath = "code.hackerspace.pl/hscloud/dc/arista-proxy/proto",
     visibility = ["//visibility:public"],
diff --git a/dc/cmc-proxy/BUILD.bazel b/dc/cmc-proxy/BUILD.bazel
index b2f68ca..92b9bc3 100644
--- a/dc/cmc-proxy/BUILD.bazel
+++ b/dc/cmc-proxy/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 = "cmc-proxy_lib",
     srcs = [
         "client.go",
         "main.go",
@@ -9,17 +9,17 @@
     importpath = "code.hackerspace.pl/hscloud/dc/cmc-proxy",
     visibility = ["//visibility:private"],
     deps = [
-        "//dc/cmc-proxy/proto:go_default_library",
-        "//go/mirko:go_default_library",
-        "@com_github_cenkalti_backoff//:go_default_library",
-        "@com_github_golang_glog//:go_default_library",
-        "@org_golang_google_grpc//codes:go_default_library",
-        "@org_golang_google_grpc//status:go_default_library",
+        "//dc/cmc-proxy/proto",
+        "//go/mirko",
+        "@com_github_cenkalti_backoff//:backoff",
+        "@com_github_golang_glog//:glog",
+        "@org_golang_google_grpc//codes",
+        "@org_golang_google_grpc//status",
     ],
 )
 
 go_binary(
     name = "cmc-proxy",
-    embed = [":go_default_library"],
+    embed = [":cmc-proxy_lib"],
     visibility = ["//visibility:public"],
 )
diff --git a/dc/cmc-proxy/proto/BUILD.bazel b/dc/cmc-proxy/proto/BUILD.bazel
index 14b0569..4723b22 100644
--- a/dc/cmc-proxy/proto/BUILD.bazel
+++ b/dc/cmc-proxy/proto/BUILD.bazel
@@ -1,3 +1,4 @@
+load("@rules_proto//proto:defs.bzl", "proto_library")
 load("@io_bazel_rules_go//go:def.bzl", "go_library")
 load("@io_bazel_rules_go//proto:def.bzl", "go_proto_library")
 
@@ -16,7 +17,7 @@
 )
 
 go_library(
-    name = "go_default_library",
+    name = "proto",
     embed = [":proto_go_proto"],
     importpath = "code.hackerspace.pl/hscloud/dc/cmc-proxy/proto",
     visibility = ["//visibility:public"],
diff --git a/dc/m6220-proxy/BUILD.bazel b/dc/m6220-proxy/BUILD.bazel
index 1d737b5..d52c6ce 100644
--- a/dc/m6220-proxy/BUILD.bazel
+++ b/dc/m6220-proxy/BUILD.bazel
@@ -1,27 +1,24 @@
 load("@io_bazel_rules_go//go:def.bzl", "go_binary", "go_library")
 
 go_library(
-    name = "go_default_library",
-    srcs = [
-        "cli.go",
-        "main.go",
-    ],
+    name = "m6220-proxy_lib",
+    srcs = ["main.go"],
     importpath = "code.hackerspace.pl/hscloud/dc/m6220-proxy",
     visibility = ["//visibility:private"],
     deps = [
-        "//dc/m6220-proxy/proto:go_default_library",
-        "//dc/proto:go_default_library",
-        "//go/mirko:go_default_library",
-        "@com_github_golang_glog//:go_default_library",
-        "@com_github_ziutek_telnet//:go_default_library",
-        "@org_golang_google_grpc//codes:go_default_library",
-        "@org_golang_google_grpc//status:go_default_library",
-        "@org_golang_x_net//trace:go_default_library",
+        "//dc/m6220-proxy/cli",
+        "//dc/m6220-proxy/proto",
+        "//dc/proto",
+        "//go/mirko",
+        "@com_github_golang_glog//:glog",
+        "@com_github_ziutek_telnet//:telnet",
+        "@org_golang_google_grpc//codes",
+        "@org_golang_google_grpc//status",
     ],
 )
 
 go_binary(
     name = "m6220-proxy",
-    embed = [":go_default_library"],
+    embed = [":m6220-proxy_lib"],
     visibility = ["//visibility:public"],
 )
diff --git a/dc/m6220-proxy/cli/BUILD.bazel b/dc/m6220-proxy/cli/BUILD.bazel
index 7ba74a4..390748a 100644
--- a/dc/m6220-proxy/cli/BUILD.bazel
+++ b/dc/m6220-proxy/cli/BUILD.bazel
@@ -6,8 +6,7 @@
     importpath = "code.hackerspace.pl/hscloud/dc/m6220-proxy/cli",
     visibility = ["//visibility:public"],
     deps = [
-        "@com_github_golang_glog//:go_default_library",
-        "@com_github_ziutek_telnet//:go_default_library",
-        "@org_golang_x_net//trace:go_default_library",
+        "@com_github_ziutek_telnet//:telnet",
+        "@org_golang_x_net//trace",
     ],
 )
diff --git a/dc/m6220-proxy/main.go b/dc/m6220-proxy/main.go
index f4c348b..4a63cc9 100644
--- a/dc/m6220-proxy/main.go
+++ b/dc/m6220-proxy/main.go
@@ -8,14 +8,15 @@
 	"strconv"
 	"strings"
 
-	"code.hackerspace.pl/hscloud/go/mirko"
 	"github.com/golang/glog"
 	"github.com/ziutek/telnet"
 	"google.golang.org/grpc/codes"
 	"google.golang.org/grpc/status"
 
+	"code.hackerspace.pl/hscloud/dc/m6220-proxy/cli"
 	pb "code.hackerspace.pl/hscloud/dc/m6220-proxy/proto"
 	dpb "code.hackerspace.pl/hscloud/dc/proto"
+	"code.hackerspace.pl/hscloud/go/mirko"
 )
 
 var (
@@ -32,7 +33,7 @@
 	connectionSemaphore chan int
 }
 
-func (s *service) connect() (*cliClient, error) {
+func (s *service) connect() (*cli.Client, error) {
 	s.connectionSemaphore <- 1
 	conn, err := telnet.Dial("tcp", flagSwitchAddress)
 	if err != nil {
@@ -40,7 +41,7 @@
 		return nil, err
 	}
 
-	cli := newCliClient(conn, flagSwitchUsername, flagSwitchPassword)
+	cli := cli.NewClient(conn, flagSwitchUsername, flagSwitchPassword)
 	return cli, nil
 }
 
@@ -59,7 +60,7 @@
 	}
 	defer s.disconnect()
 
-	lines, effective, err := cli.runCommand(ctx, req.Command)
+	lines, effective, err := cli.RunCommand(ctx, req.Command)
 	if err != nil {
 		return nil, err
 	}
@@ -227,7 +228,7 @@
 	defer s.disconnect()
 	res := &dpb.GetPortsResponse{}
 
-	statusLines, _, err := cli.runCommand(ctx, "show interface status")
+	statusLines, _, err := cli.RunCommand(ctx, "show interface status")
 	if err != nil {
 		return nil, status.Error(codes.Unavailable, "could not get interface status from switch")
 	}
@@ -238,7 +239,7 @@
 	}
 
 	for _, port := range res.Ports {
-		configLines, _, err := cli.runCommand(ctx, "show run interface "+port.Name)
+		configLines, _, err := cli.RunCommand(ctx, "show run interface "+port.Name)
 		if err != nil {
 			return nil, status.Error(codes.Unavailable, "could not get interface config from switch")
 		}
diff --git a/dc/m6220-proxy/proto/BUILD.bazel b/dc/m6220-proxy/proto/BUILD.bazel
index 4e0ae7e..5049bc5 100644
--- a/dc/m6220-proxy/proto/BUILD.bazel
+++ b/dc/m6220-proxy/proto/BUILD.bazel
@@ -1,3 +1,4 @@
+load("@rules_proto//proto:defs.bzl", "proto_library")
 load("@io_bazel_rules_go//go:def.bzl", "go_library")
 load("@io_bazel_rules_go//proto:def.bzl", "go_proto_library")
 
@@ -16,7 +17,7 @@
 )
 
 go_library(
-    name = "go_default_library",
+    name = "proto",
     embed = [":proto_go_proto"],
     importpath = "code.hackerspace.pl/hscloud/dc/m6220-proxy/proto",
     visibility = ["//visibility:public"],
diff --git a/dc/proto/BUILD.bazel b/dc/proto/BUILD.bazel
index cfee72e..1049608 100644
--- a/dc/proto/BUILD.bazel
+++ b/dc/proto/BUILD.bazel
@@ -1,3 +1,4 @@
+load("@rules_proto//proto:defs.bzl", "proto_library")
 load("@io_bazel_rules_go//go:def.bzl", "go_library")
 load("@io_bazel_rules_go//proto:def.bzl", "go_proto_library")
 
@@ -16,7 +17,7 @@
 )
 
 go_library(
-    name = "go_default_library",
+    name = "proto",
     embed = [":proto_go_proto"],
     importpath = "code.hackerspace.pl/hscloud/dc/proto",
     visibility = ["//visibility:public"],
diff --git a/dc/topo/BUILD.bazel b/dc/topo/BUILD.bazel
index 83673e3..3cb0fb7 100644
--- a/dc/topo/BUILD.bazel
+++ b/dc/topo/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 = "topo_lib",
     srcs = [
         "main.go",
         "service.go",
@@ -9,23 +9,23 @@
     importpath = "code.hackerspace.pl/hscloud/dc/topo",
     visibility = ["//visibility:private"],
     deps = [
-        "//dc/proto:go_default_library",
-        "//dc/topo/assets:go_default_library",
-        "//dc/topo/graph:go_default_library",
-        "//dc/topo/proto:go_default_library",
-        "//dc/topo/state:go_default_library",
-        "//go/mirko:go_default_library",
-        "//go/statusz:go_default_library",
-        "@com_github_digitalocean_go_netbox//netbox:go_default_library",
-        "@com_github_digitalocean_go_netbox//netbox/client:go_default_library",
-        "@com_github_golang_glog//:go_default_library",
+        "//dc/proto",
+        "//dc/topo/assets",
+        "//dc/topo/graph",
+        "//dc/topo/proto",
+        "//dc/topo/state",
+        "//go/mirko",
+        "//go/statusz",
+        "@com_github_digitalocean_go_netbox//netbox",
+        "@com_github_digitalocean_go_netbox//netbox/client",
+        "@com_github_fvbommel_sortorder//:sortorder",
+        "@com_github_golang_glog//:glog",
         "@com_github_golang_protobuf//proto:go_default_library",
-        "@ml_vbom_util//sortorder:go_default_library",
     ],
 )
 
 go_binary(
     name = "topo",
-    embed = [":go_default_library"],
+    embed = [":topo_lib"],
     visibility = ["//visibility:public"],
 )
diff --git a/dc/topo/assets/BUILD.bazel b/dc/topo/assets/BUILD.bazel
index 401487b..21d49f9 100644
--- a/dc/topo/assets/BUILD.bazel
+++ b/dc/topo/assets/BUILD.bazel
@@ -2,16 +2,16 @@
 load("@io_bazel_rules_go//extras:embed_data.bzl", "go_embed_data")
 
 go_embed_data(
-    name = "assets",
+    name = "assets_embed",
     srcs = glob(["*.js"]),
-    package = "assets",
     flatten = True,
+    package = "assets",
 )
 
 # keep
 go_library(
-    name = "go_default_library",
-    srcs = [":assets"],
+    name = "assets",
+    srcs = [":assets_embed"],
     importpath = "code.hackerspace.pl/hscloud/dc/topo/assets",
     visibility = ["//dc/topo:__pkg__"],
 )
diff --git a/dc/topo/graph/BUILD.bazel b/dc/topo/graph/BUILD.bazel
index 26a5fc2..fd93c4c 100644
--- a/dc/topo/graph/BUILD.bazel
+++ b/dc/topo/graph/BUILD.bazel
@@ -1,15 +1,15 @@
 load("@io_bazel_rules_go//go:def.bzl", "go_library")
 
 go_library(
-    name = "go_default_library",
+    name = "graph",
     srcs = ["graph.go"],
     importpath = "code.hackerspace.pl/hscloud/dc/topo/graph",
     visibility = ["//visibility:public"],
     deps = [
-        "//dc/topo/proto:go_default_library",
-        "@com_github_digitalocean_go_netbox//netbox/client:go_default_library",
-        "@com_github_digitalocean_go_netbox//netbox/client/dcim:go_default_library",
-        "@com_github_digitalocean_go_netbox//netbox/models:go_default_library",
-        "@com_github_golang_glog//:go_default_library",
+        "//dc/topo/proto",
+        "@com_github_digitalocean_go_netbox//netbox/client",
+        "@com_github_digitalocean_go_netbox//netbox/client/dcim",
+        "@com_github_digitalocean_go_netbox//netbox/models",
+        "@com_github_golang_glog//:glog",
     ],
 )
diff --git a/dc/topo/graph/graph.go b/dc/topo/graph/graph.go
index 4d31f39..288d306 100644
--- a/dc/topo/graph/graph.go
+++ b/dc/topo/graph/graph.go
@@ -142,7 +142,7 @@
 
 }
 
-func (g *Graph) FeedFromNetbox(ctx context.Context, nb *client.NetBox) error {
+func (g *Graph) FeedFromNetbox(ctx context.Context, nb *client.NetBoxAPI) error {
 	// Clear all connections first, because it's easier that way.
 	for _, machine := range g.Machines {
 		for _, port := range machine.Ports {
@@ -169,18 +169,18 @@
 			return fmt.Errorf("while querying information about %q: %v", machine.Name, err)
 		}
 		for _, connection := range res.Payload.Results {
-			ia := connection.InterfaceA
-			ib := connection.InterfaceB
+			ia := connection.Interfacea
+			ib := connection.Interfaceb
 			if ia == nil || ib == nil {
 				continue
 			}
 
 			// Find which way this thing actually connects.
-			var thisSide, otherSide *models.PeerInterface
-			if ia.Device.Name == machine.Name {
+			var thisSide, otherSide *models.NestedInterface
+			if ia.Device.Name != nil && *ia.Device.Name == machine.Name {
 				thisSide = ia
 				otherSide = ib
-			} else if ib.Device.Name == machine.Name {
+			} else if ib.Device.Name != nil && *ib.Device.Name == machine.Name {
 				thisSide = ib
 				otherSide = ia
 			} else {
@@ -192,9 +192,9 @@
 			if !ok {
 				continue
 			}
-			sw, ok := g.Switches[otherSide.Device.Name]
+			sw, ok := g.Switches[*otherSide.Device.Name]
 			if !ok {
-				glog.Warningf("Machine %q port %q is managed but connected to unknown device %q", machine.Name, thisPort.Name, otherSide.Device.Name)
+				glog.Warningf("Machine %q port %q is managed but connected to unknown device %q", machine.Name, thisPort.Name, *otherSide.Device.Name)
 				continue
 			}
 			otherPort, ok := sw.Ports[*otherSide.Name]
diff --git a/dc/topo/proto/BUILD.bazel b/dc/topo/proto/BUILD.bazel
index 3caae5b..488dea9 100644
--- a/dc/topo/proto/BUILD.bazel
+++ b/dc/topo/proto/BUILD.bazel
@@ -1,3 +1,4 @@
+load("@rules_proto//proto:defs.bzl", "proto_library")
 load("@io_bazel_rules_go//go:def.bzl", "go_library")
 load("@io_bazel_rules_go//proto:def.bzl", "go_proto_library")
 
@@ -15,7 +16,7 @@
 )
 
 go_library(
-    name = "go_default_library",
+    name = "proto",
     embed = [":proto_go_proto"],
     importpath = "code.hackerspace.pl/hscloud/dc/topo/proto",
     visibility = ["//visibility:public"],
diff --git a/dc/topo/service.go b/dc/topo/service.go
index 84eda5d..97a74dd 100644
--- a/dc/topo/service.go
+++ b/dc/topo/service.go
@@ -7,7 +7,7 @@
 	"sort"
 	"strings"
 
-	"vbom.ml/util/sortorder"
+	"github.com/fvbommel/sortorder"
 
 	"code.hackerspace.pl/hscloud/go/mirko"
 	"code.hackerspace.pl/hscloud/go/statusz"
diff --git a/dc/topo/state/BUILD.bazel b/dc/topo/state/BUILD.bazel
index fefb3ef..6cb8d59 100644
--- a/dc/topo/state/BUILD.bazel
+++ b/dc/topo/state/BUILD.bazel
@@ -1,14 +1,14 @@
 load("@io_bazel_rules_go//go:def.bzl", "go_library")
 
 go_library(
-    name = "go_default_library",
+    name = "state",
     srcs = ["state.go"],
     importpath = "code.hackerspace.pl/hscloud/dc/topo/state",
     visibility = ["//visibility:public"],
     deps = [
-        "//dc/proto:go_default_library",
-        "//dc/topo/proto:go_default_library",
-        "//go/pki:go_default_library",
+        "//dc/proto",
+        "//dc/topo/proto",
+        "//go/pki",
         "@org_golang_google_grpc//:go_default_library",
     ],
 )