From d8c758bdf40ff883a235e278577fff532eecbd0c Mon Sep 17 00:00:00 2001 From: ykdh Date: Thu, 21 Jul 2022 17:29:03 +0800 Subject: [PATCH] feat(region): dns records convert to zone file --- cmd/climc/shell/compute/dnszone.go | 16 ++++++++++++++++ pkg/compute/models/dns_recordsets.go | 12 ++++++++++++ pkg/compute/models/dns_zones.go | 16 ++++++++++++++++ 3 files changed, 44 insertions(+) diff --git a/cmd/climc/shell/compute/dnszone.go b/cmd/climc/shell/compute/dnszone.go index cab2a9e9b1..227b52a91e 100644 --- a/cmd/climc/shell/compute/dnszone.go +++ b/cmd/climc/shell/compute/dnszone.go @@ -15,6 +15,11 @@ package compute import ( + "fmt" + + "yunion.io/x/jsonutils" + "yunion.io/x/log" + "yunion.io/x/onecloud/cmd/climc/shell" modules "yunion.io/x/onecloud/pkg/mcclient/modules/compute" "yunion.io/x/onecloud/pkg/mcclient/options" @@ -34,4 +39,15 @@ func init() { cmd.Perform("purge", &options.SDnsZoneIdOptions{}) cmd.Perform("add-vpcs", &options.DnsZoneAddVpcsOptions{}) cmd.Perform("remove-vpcs", &options.DnsZoneRemoveVpcsOptions{}) + cmd.GetWithCustomShow("exports", func(result jsonutils.JSONObject) { + rr := make(map[string]string) + err := result.Unmarshal(&rr) + if err != nil { + log.Errorf("error: %v", err) + return + } + for _, v := range rr { + fmt.Printf("%s\n", v) + } + }, &options.SDnsZoneIdOptions{}) } diff --git a/pkg/compute/models/dns_recordsets.go b/pkg/compute/models/dns_recordsets.go index a41ff5ba52..974b5bbb6d 100644 --- a/pkg/compute/models/dns_recordsets.go +++ b/pkg/compute/models/dns_recordsets.go @@ -346,6 +346,18 @@ func (manager *SDnsRecordSetManager) FetchCustomizeColumns( return rows } +func (self *SDnsRecordSet) ToZoneLine() string { + result := self.Name + "\t" + fmt.Sprint(self.TTL) + "\tIN\t" + self.DnsType + "\t" + if self.MxPriority != 0 { + result += fmt.Sprint(self.MxPriority) + "\t" + } + result += self.DnsValue + if self.DnsType == "CNAME" || self.DnsType == "MX" || self.DnsType == "SRV" { + result += "." + } + return result +} + func (self *SDnsRecordSet) Delete(ctx context.Context, userCred mcclient.TokenCredential) error { policies, err := self.GetDnsTrafficPolicies() if err != nil { diff --git a/pkg/compute/models/dns_zones.go b/pkg/compute/models/dns_zones.go index cd4a4fe3fe..cd7fd48409 100644 --- a/pkg/compute/models/dns_zones.go +++ b/pkg/compute/models/dns_zones.go @@ -578,6 +578,22 @@ func (self *SDnsZone) RealDelete(ctx context.Context, userCred mcclient.TokenCre return self.SEnabledStatusInfrasResourceBase.Delete(ctx, userCred) } +func (self *SDnsZone) GetDetailsExports(ctx context.Context, userCred mcclient.TokenCredential, query jsonutils.JSONObject) (jsonutils.JSONObject, error) { + records, err := self.GetDnsRecordSets() + if err != nil { + return nil, errors.Wrapf(err, "GetDnsRecordSets") + } + result := "$ORIGIN " + self.Name + ".\n" + lines := []string{} + for _, record := range records { + lines = append(lines, record.ToZoneLine()) + } + result += strings.Join(lines, "\n") + rr := make(map[string]string) + rr["zone"] = result + return jsonutils.Marshal(rr), nil +} + func (self *SDnsZone) GetDnsRecordSets() ([]SDnsRecordSet, error) { records := []SDnsRecordSet{} q := DnsRecordSetManager.Query().Equals("dns_zone_id", self.Id)