-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.go
99 lines (75 loc) · 2.41 KB
/
main.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
package main
import (
"fmt"
"regexp"
"strings"
"github.com/DaviAraujoCC/dns-manager-gke/command"
"github.com/DaviAraujoCC/dns-manager-gke/config"
"github.com/DaviAraujoCC/dns-manager-gke/gcp"
"github.com/DaviAraujoCC/dns-manager-gke/k8s/controller"
log "github.com/sirupsen/logrus"
"github.com/spf13/viper"
"google.golang.org/api/dns/v1"
corev1 "k8s.io/api/core/v1"
)
func main() {
log.Info("Starting DNS Manager")
cfg, err := config.New()
if err != nil {
log.Fatal(err)
}
log.Info("Gathering info about cluster...")
obj, err := controller.NewObjectsController(cfg.Namespace)
if err != nil {
log.Fatal(err)
}
k8sServices, err := obj.ListServices()
if err != nil {
log.Fatal(err)
}
log.Info("Gathering info about DNS...")
dnsGCPService, err := gcp.NewDnsService(cfg.ProjectId, cfg.ManagedZone)
if err != nil {
log.Fatal(err)
}
entries, err := dnsGCPService.ListRecordSetEntries()
if err != nil {
log.Fatal(err)
}
validDNSEntries := getValidDnsEntries(entries)
validServices := getValidServices(k8sServices)
//update dns for services if necessary (ip doesn't match)
command.CheckUpdateDnsEntries(validServices, validDNSEntries, dnsGCPService)
//create dns for services if necessary (dns doesn't present)
command.CheckCreateDnsEntries(validServices, validDNSEntries, dnsGCPService)
if !viper.GetBool("IGNORE_DELETE_RECORD") {
//delete dns for services if necessary (service doesn't exist)
command.CheckDeleteDnsEntries(validServices, validDNSEntries, dnsGCPService)
}
log.Info("OK")
}
func getValidServices(services *corev1.ServiceList) map[string]string {
var validServices = make(map[string]string)
for _, s := range services.Items {
if s.Spec.Type == "LoadBalancer" && s.Status.LoadBalancer.Ingress != nil {
validServices[s.Name] = s.Status.LoadBalancer.Ingress[0].IP
}
}
return validServices
}
func getValidDnsEntries(entries *dns.ResourceRecordSetsListResponse) map[string]string {
var validDnsEntries = make(map[string]string)
for _, e := range entries.Rrsets {
dnsSuffix := strings.Split(e.Name, ".")[1:]
dnsSuffixN := strings.Join(dnsSuffix[:len(dnsSuffix)-1], ".")
if e.Type == "A" && len(e.Rrdatas) > 0 && match(viper.GetString("DNS_SUFFIX"), dnsSuffixN) {
validDnsEntries[e.Name] = e.Rrdatas[0]
}
}
return validDnsEntries
}
func match(v, s string) bool {
regexString := fmt.Sprintf("^%s\\.$", s)
regex, _ := regexp.MatchString(regexString, v)
return regex
}