diff --git a/pkg/resources/dump.go b/pkg/resources/dump.go index b43d58968d..f093467cd8 100644 --- a/pkg/resources/dump.go +++ b/pkg/resources/dump.go @@ -51,7 +51,7 @@ func BuildDump(ctx context.Context, cloud fi.Cloud, resources map[string]*Resour for k, r := range resources { if r.Dumper == nil { - klog.V(8).Infof("skipping dump of %q (does not implement Dumpable)", k) + klog.V(8).Infof("skipping dump of %q (does not have Dumper)", k) continue } diff --git a/pkg/resources/hetzner/resources.go b/pkg/resources/hetzner/resources.go index 24c0fbc286..1e8a9d739f 100644 --- a/pkg/resources/hetzner/resources.go +++ b/pkg/resources/hetzner/resources.go @@ -23,6 +23,7 @@ import ( "github.com/hetznercloud/hcloud-go/hcloud" "k8s.io/klog/v2" + "k8s.io/kops/pkg/apis/kops" "k8s.io/kops/pkg/resources" "k8s.io/kops/upup/pkg/fi" "k8s.io/kops/upup/pkg/fi/cloudup/hetzner" @@ -177,6 +178,7 @@ func listServers(cloud fi.Cloud, clusterName string) ([]*resources.Resource, err ID: strconv.Itoa(server.ID), Type: resourceTypeServer, Deleter: deleteServer, + Dumper: dumpServer, Obj: server, } @@ -293,3 +295,48 @@ func deleteVolume(cloud fi.Cloud, r *resources.Resource) error { return nil } + +func dumpServer(op *resources.DumpOperation, r *resources.Resource) error { + server := r.Obj.(*hcloud.Server) + + data := make(map[string]interface{}) + data["id"] = r.ID + data["type"] = r.Type + data["raw"] = r.Obj + op.Dump.Resources = append(op.Dump.Resources, data) + + i := &resources.Instance{ + Name: r.ID, + } + if ip := server.PublicNet.IPv4.IP; ip != nil { + i.PublicAddresses = append(i.PublicAddresses, ip.String()) + } + if ip := server.PublicNet.IPv6.IP; ip != nil { + i.PublicAddresses = append(i.PublicAddresses, ip.String()) + } + for _, network := range server.PrivateNet { + if ip := network.IP; ip != nil { + i.PrivateAddresses = append(i.PrivateAddresses, ip.String()) + } + } + + for key, value := range server.Labels { + if key == hetzner.TagKubernetesInstanceRole { + role := kops.InstanceGroupRole(value) + switch role { + case kops.InstanceGroupRoleControlPlane: + i.Roles = append(i.Roles, string(role)) + case kops.InstanceGroupRoleNode: + i.Roles = append(i.Roles, string(role)) + case kops.InstanceGroupRoleAPIServer: + i.Roles = append(i.Roles, string(role)) + default: + klog.Warningf("Unknown node role %q for server %s(%d)", value, server.Name, server.ID) + } + } + } + + op.Dump.Instances = append(op.Dump.Instances, i) + + return nil +} diff --git a/upup/pkg/fi/cloudup/hetzner/utils.go b/upup/pkg/fi/cloudup/hetzner/utils.go index d05322b6fe..a1822867e2 100644 --- a/upup/pkg/fi/cloudup/hetzner/utils.go +++ b/upup/pkg/fi/cloudup/hetzner/utils.go @@ -34,7 +34,7 @@ func FindRegion(cluster *kops.Cluster) (string, error) { case "ash": zoneRegion = "us-east" default: - return "", fmt.Errorf("unknown zone: %q", subnet.Zone) + return "", fmt.Errorf("unknown zone %q for hetzner cloud, known zones are fsn1, nbg1, hel1, ash", subnet.Zone) } if region != "" && zoneRegion != region {