m/{node,proto}: implement Node Labels

Nodes can now have Labels attached to them. These are string key/value
data designed after Kubernetes labels. They are meant to be used to
attach metadata to nodes, for example external IDs, nicknames or
geographical information.

This change implements just the core functionality: storing them within
etcd, retrieving them via management and curator APIs, and mutating them
via a new management RPC.

Followup changes will impelement provisioning labels at
bootstrap/registration time and accessing label data from metroctl.

Change-Id: I556b452a65061294e7c51037723a6db31d587716
Reviewed-on: https://review.monogon.dev/c/monogon/+/3101
Reviewed-by: Jan Schär <jan@monogon.tech>
Tested-by: Jenkins CI
diff --git a/metropolis/node/BUILD.bazel b/metropolis/node/BUILD.bazel
index 609bcd4..876dbfc 100644
--- a/metropolis/node/BUILD.bazel
+++ b/metropolis/node/BUILD.bazel
@@ -1,4 +1,4 @@
-load("@io_bazel_rules_go//go:def.bzl", "go_library")
+load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test")
 load("//metropolis/node/build:def.bzl", "erofs_image", "verity_image")
 load("//metropolis/node/build:efi.bzl", "efi_unified_kernel_image")
 load("//metropolis/node/build/mkimage:def.bzl", "node_image")
@@ -8,6 +8,7 @@
     name = "node",
     srcs = [
         "ids.go",
+        "labels.go",
         "net_ips.go",
         "net_protocols.go",
         "ports.go",
@@ -139,3 +140,9 @@
     os_name = "Metropolis Node",
     stamp_var = "STABLE_MONOGON_metropolis_version",
 )
+
+go_test(
+    name = "node_test",
+    srcs = ["labels_test.go"],
+    embed = [":node"],
+)