/
openstack_dns.go
110 lines (90 loc) · 2.48 KB
/
openstack_dns.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
100
101
102
103
104
105
106
107
108
109
110
//go:build openstack || !onlyprovider
package openstack
import (
"os"
"github.com/gophercloud/gophercloud"
"github.com/gophercloud/gophercloud/openstack"
"github.com/gophercloud/gophercloud/openstack/dns/v2/recordsets"
"github.com/gophercloud/gophercloud/openstack/dns/v2/zones"
"github.com/nanovms/ops/lepton"
"github.com/nanovms/ops/types"
)
// FindOrCreateZoneIDByName searches for a DNS zone with the name passed by argument and if it doesn't exist it creates one
func (o *OpenStack) FindOrCreateZoneIDByName(config *types.Config, dnsName string) (string, error) {
dnsClient, err := o.getDNSClient()
if err != nil {
return "", err
}
var zoneID string
opts := zones.ListOpts{
Name: dnsName + ".",
}
allPages, err := zones.List(dnsClient, opts).AllPages()
if err != nil {
return "", err
}
allZones, err := zones.ExtractZones(allPages)
if err != nil {
return "", err
}
if len(allZones) == 0 {
createOpts := zones.CreateOpts{
Name: dnsName + ".",
Email: "admin@" + dnsName,
}
zone, err := zones.Create(dnsClient, createOpts).Extract()
if err != nil {
return "", err
}
zoneID = zone.ID
} else {
zoneID = allZones[0].ID
}
return zoneID, nil
}
// DeleteZoneRecordIfExists deletes a record from a DNS zone if it exists
func (o *OpenStack) DeleteZoneRecordIfExists(config *types.Config, zoneID string, recordName string) error {
dnsClient, err := o.getDNSClient()
if err != nil {
return err
}
listOpts := recordsets.ListOpts{
Type: "A",
Name: recordName,
}
allPages, err := recordsets.ListByZone(dnsClient, zoneID, listOpts).AllPages()
allRecords, err := recordsets.ExtractRecordSets(allPages)
if err != nil {
return err
}
for _, record := range allRecords {
err := recordsets.Delete(dnsClient, zoneID, record.ID).ExtractErr()
if err != nil {
return err
}
}
return nil
}
// CreateZoneRecord creates a record in a DNS zone
func (o *OpenStack) CreateZoneRecord(config *types.Config, zoneID string, record *lepton.DNSRecord) error {
dnsClient, err := o.getDNSClient()
if err != nil {
return err
}
createOpts := recordsets.CreateOpts{
Name: record.Name,
Records: []string{record.IP},
TTL: record.TTL,
Type: record.Type,
}
_, err = recordsets.Create(dnsClient, zoneID, createOpts).Extract()
if err != nil {
return err
}
return nil
}
func (o *OpenStack) getDNSClient() (*gophercloud.ServiceClient, error) {
return openstack.NewDNSV2(o.provider, gophercloud.EndpointOpts{
Region: os.Getenv("OS_REGION_NAME"),
})
}