mirror of https://github.com/kubernetes/kops.git
kops delete will also delete the DNS entries for GCE
This commit is contained in:
parent
302bc54782
commit
eb3bb41c6b
|
|
@ -9,10 +9,12 @@ go_library(
|
||||||
importpath = "k8s.io/kops/pkg/resources/gce",
|
importpath = "k8s.io/kops/pkg/resources/gce",
|
||||||
visibility = ["//visibility:public"],
|
visibility = ["//visibility:public"],
|
||||||
deps = [
|
deps = [
|
||||||
|
"//pkg/dns:go_default_library",
|
||||||
"//pkg/resources:go_default_library",
|
"//pkg/resources:go_default_library",
|
||||||
"//upup/pkg/fi:go_default_library",
|
"//upup/pkg/fi:go_default_library",
|
||||||
"//upup/pkg/fi/cloudup/gce:go_default_library",
|
"//upup/pkg/fi/cloudup/gce:go_default_library",
|
||||||
"//vendor/google.golang.org/api/compute/v0.beta:go_default_library",
|
"//vendor/google.golang.org/api/compute/v0.beta:go_default_library",
|
||||||
|
"//vendor/google.golang.org/api/dns/v1:go_default_library",
|
||||||
"//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library",
|
"//vendor/k8s.io/apimachinery/pkg/util/sets:go_default_library",
|
||||||
"//vendor/k8s.io/klog:go_default_library",
|
"//vendor/k8s.io/klog:go_default_library",
|
||||||
],
|
],
|
||||||
|
|
|
||||||
|
|
@ -22,8 +22,10 @@ import (
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
compute "google.golang.org/api/compute/v0.beta"
|
compute "google.golang.org/api/compute/v0.beta"
|
||||||
|
clouddns "google.golang.org/api/dns/v1"
|
||||||
"k8s.io/apimachinery/pkg/util/sets"
|
"k8s.io/apimachinery/pkg/util/sets"
|
||||||
"k8s.io/klog"
|
"k8s.io/klog"
|
||||||
|
"k8s.io/kops/pkg/dns"
|
||||||
"k8s.io/kops/pkg/resources"
|
"k8s.io/kops/pkg/resources"
|
||||||
"k8s.io/kops/upup/pkg/fi"
|
"k8s.io/kops/upup/pkg/fi"
|
||||||
"k8s.io/kops/upup/pkg/fi/cloudup/gce"
|
"k8s.io/kops/upup/pkg/fi/cloudup/gce"
|
||||||
|
|
@ -42,6 +44,7 @@ const (
|
||||||
typeAddress = "Address"
|
typeAddress = "Address"
|
||||||
typeRoute = "Route"
|
typeRoute = "Route"
|
||||||
typeSubnet = "Subnet"
|
typeSubnet = "Subnet"
|
||||||
|
typeDNSRecord = "DNSRecord"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Maximum number of `-` separated tokens in a name
|
// Maximum number of `-` separated tokens in a name
|
||||||
|
|
@ -796,25 +799,80 @@ func (d *clusterDiscoveryGCE) matchesClusterNameMultipart(name string, maxParts
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
func (d *clusterDiscoveryGCE) listGCEDNSZone() ([]*resources.Resource, error) {
|
func (d *clusterDiscoveryGCE) clusterDNSName() string {
|
||||||
// We never delete the hosted zone, because it is usually shared and we don't create it
|
return d.clusterName + "."
|
||||||
return nil, nil
|
}
|
||||||
// TODO: When shared resource PR lands, reintroduce
|
|
||||||
//if dns.IsGossipHostname(d.clusterName) {
|
func (d *clusterDiscoveryGCE) isKopsManagedDNSName(name string) bool {
|
||||||
// return nil, nil
|
prefix := []string{`api`, `api.internal`, `bastion`}
|
||||||
//}
|
for _, p := range prefix {
|
||||||
//zone, err := d.findDNSZone()
|
if name == p+"."+d.clusterDNSName() {
|
||||||
//if err != nil {
|
return true
|
||||||
// return nil, err
|
}
|
||||||
//}
|
}
|
||||||
//
|
return false
|
||||||
//return []*resources.Resource{
|
}
|
||||||
// {
|
|
||||||
// Name: zone.Name(),
|
func (d *clusterDiscoveryGCE) listGCEDNSZone() ([]*resources.Resource, error) {
|
||||||
// ID: zone.Name(),
|
|
||||||
// Type: "DNS Zone",
|
if dns.IsGossipHostname(d.clusterName) {
|
||||||
// Deleter: d.deleteDNSZone,
|
return nil, nil
|
||||||
// Obj: zone,
|
}
|
||||||
// },
|
|
||||||
//}, nil
|
var resourceTrackers []*resources.Resource
|
||||||
|
|
||||||
|
zoneResponse, err := d.gceCloud.CloudDNS().ManagedZones.List(d.gceCloud.Project()).Do()
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("error getting GCE DNS zones %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, zone := range zoneResponse.ManagedZones {
|
||||||
|
if !strings.HasSuffix(d.clusterDNSName(), zone.DnsName) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
response, err := d.gceCloud.CloudDNS().ResourceRecordSets.List(d.gceCloud.Project(), zone.Name).Do()
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("error getting GCE DNS zone data %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, record := range response.Rrsets {
|
||||||
|
// adapted from AWS implementation
|
||||||
|
if record.Type != "A" {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
if d.isKopsManagedDNSName(record.Name) {
|
||||||
|
resource := resources.Resource{
|
||||||
|
Name: zone.Name,
|
||||||
|
ID: record.Name,
|
||||||
|
Type: typeDNSRecord,
|
||||||
|
GroupDeleter: deleteDNSRecords,
|
||||||
|
GroupKey: zone.Name,
|
||||||
|
Obj: record,
|
||||||
|
}
|
||||||
|
resourceTrackers = append(resourceTrackers, &resource)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return resourceTrackers, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func deleteDNSRecords(cloud fi.Cloud, r []*resources.Resource) error {
|
||||||
|
c := cloud.(gce.GCECloud)
|
||||||
|
var records []*clouddns.ResourceRecordSet
|
||||||
|
var zoneName string
|
||||||
|
|
||||||
|
for _, record := range r {
|
||||||
|
r := record.Obj.(*clouddns.ResourceRecordSet)
|
||||||
|
zoneName = record.Name
|
||||||
|
records = append(records, r)
|
||||||
|
}
|
||||||
|
|
||||||
|
change := clouddns.Change{Deletions: records, Kind: "dns#change", IsServing: true}
|
||||||
|
_, err := c.CloudDNS().Changes.Create(c.Project(), zoneName, &change).Do()
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("error deleting GCE DNS resource record set %v", err)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -27,6 +27,7 @@ go_library(
|
||||||
"//vendor/golang.org/x/net/context:go_default_library",
|
"//vendor/golang.org/x/net/context:go_default_library",
|
||||||
"//vendor/golang.org/x/oauth2/google:go_default_library",
|
"//vendor/golang.org/x/oauth2/google:go_default_library",
|
||||||
"//vendor/google.golang.org/api/compute/v0.beta:go_default_library",
|
"//vendor/google.golang.org/api/compute/v0.beta:go_default_library",
|
||||||
|
"//vendor/google.golang.org/api/dns/v1:go_default_library",
|
||||||
"//vendor/google.golang.org/api/googleapi:go_default_library",
|
"//vendor/google.golang.org/api/googleapi:go_default_library",
|
||||||
"//vendor/google.golang.org/api/iam/v1:go_default_library",
|
"//vendor/google.golang.org/api/iam/v1:go_default_library",
|
||||||
"//vendor/google.golang.org/api/oauth2/v2:go_default_library",
|
"//vendor/google.golang.org/api/oauth2/v2:go_default_library",
|
||||||
|
|
|
||||||
|
|
@ -26,6 +26,7 @@ import (
|
||||||
"golang.org/x/net/context"
|
"golang.org/x/net/context"
|
||||||
"golang.org/x/oauth2/google"
|
"golang.org/x/oauth2/google"
|
||||||
compute "google.golang.org/api/compute/v0.beta"
|
compute "google.golang.org/api/compute/v0.beta"
|
||||||
|
"google.golang.org/api/dns/v1"
|
||||||
"google.golang.org/api/iam/v1"
|
"google.golang.org/api/iam/v1"
|
||||||
oauth2 "google.golang.org/api/oauth2/v2"
|
oauth2 "google.golang.org/api/oauth2/v2"
|
||||||
"google.golang.org/api/storage/v1"
|
"google.golang.org/api/storage/v1"
|
||||||
|
|
@ -41,6 +42,7 @@ type GCECloud interface {
|
||||||
Compute() *compute.Service
|
Compute() *compute.Service
|
||||||
Storage() *storage.Service
|
Storage() *storage.Service
|
||||||
IAM() *iam.Service
|
IAM() *iam.Service
|
||||||
|
CloudDNS() *dns.Service
|
||||||
|
|
||||||
Project() string
|
Project() string
|
||||||
WaitForOp(op *compute.Operation) error
|
WaitForOp(op *compute.Operation) error
|
||||||
|
|
@ -60,6 +62,7 @@ type gceCloudImplementation struct {
|
||||||
compute *compute.Service
|
compute *compute.Service
|
||||||
storage *storage.Service
|
storage *storage.Service
|
||||||
iam *iam.Service
|
iam *iam.Service
|
||||||
|
dns *dns.Service
|
||||||
|
|
||||||
region string
|
region string
|
||||||
project string
|
project string
|
||||||
|
|
@ -141,6 +144,12 @@ func NewGCECloud(region string, project string, labels map[string]string) (GCECl
|
||||||
}
|
}
|
||||||
c.iam = iamService
|
c.iam = iamService
|
||||||
|
|
||||||
|
dnsService, err := dns.New(client)
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("error building DNS API client: %v", err)
|
||||||
|
}
|
||||||
|
c.dns = dnsService
|
||||||
|
|
||||||
gceCloudInstances[region+"::"+project] = c
|
gceCloudInstances[region+"::"+project] = c
|
||||||
|
|
||||||
{
|
{
|
||||||
|
|
@ -186,6 +195,11 @@ func (c *gceCloudImplementation) IAM() *iam.Service {
|
||||||
return c.iam
|
return c.iam
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// NameService returns the DNS client
|
||||||
|
func (c *gceCloudImplementation) CloudDNS() *dns.Service {
|
||||||
|
return c.dns
|
||||||
|
}
|
||||||
|
|
||||||
// Region returns private struct element region.
|
// Region returns private struct element region.
|
||||||
func (c *gceCloudImplementation) Region() string {
|
func (c *gceCloudImplementation) Region() string {
|
||||||
return c.region
|
return c.region
|
||||||
|
|
|
||||||
|
|
@ -20,6 +20,7 @@ import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
compute "google.golang.org/api/compute/v0.beta"
|
compute "google.golang.org/api/compute/v0.beta"
|
||||||
|
"google.golang.org/api/dns/v1"
|
||||||
"google.golang.org/api/iam/v1"
|
"google.golang.org/api/iam/v1"
|
||||||
"google.golang.org/api/storage/v1"
|
"google.golang.org/api/storage/v1"
|
||||||
v1 "k8s.io/api/core/v1"
|
v1 "k8s.io/api/core/v1"
|
||||||
|
|
@ -105,6 +106,12 @@ func (c *mockGCECloud) IAM() *iam.Service {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// NameService returns the DNS client
|
||||||
|
func (c *mockGCECloud) CloudDNS() *dns.Service {
|
||||||
|
klog.Fatalf("mockGCECloud::CloudDNS not implemented")
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
// WaitForOp implements GCECloud::WaitForOp
|
// WaitForOp implements GCECloud::WaitForOp
|
||||||
func (c *mockGCECloud) WaitForOp(op *compute.Operation) error {
|
func (c *mockGCECloud) WaitForOp(op *compute.Operation) error {
|
||||||
return fmt.Errorf("mockGCECloud::WaitForOp not implemented")
|
return fmt.Errorf("mockGCECloud::WaitForOp not implemented")
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue