Skip to content

Commit

Permalink
add util func to parse rdata. formatting
Browse files Browse the repository at this point in the history
  • Loading branch information
edglynes committed Apr 2, 2020
1 parent c29f76d commit 8e5cc3a
Show file tree
Hide file tree
Showing 3 changed files with 234 additions and 62 deletions.
175 changes: 175 additions & 0 deletions configdns-v2/record_lookup.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import (
"github.com/akamai/AkamaiOPEN-edgegrid-golang/client-v1"
edge "github.com/akamai/AkamaiOPEN-edgegrid-golang/edgegrid"
"net"
"sort"
"strconv"
"strings"
)
Expand Down Expand Up @@ -305,3 +306,177 @@ func GetRdata(zone string, name string, record_type string) ([]string, error) {
}
return rdata, nil
}

// Utility method to parse RData in context of type. Return map of fields and values
func ParseRData(rtype string, rdata []string) map[string]interface{} {

fieldMap := make(map[string]interface{}, 0)
if len(rdata) == 0 {
return fieldMap
}
newrdata := make([]string, 0, len(rdata))

switch rtype {
case "AFSDB":
parts := strings.Split(rdata[0], " ")
fieldMap["subtype"], _ = strconv.Atoi(parts[0])
for _, rcontent := range rdata {
parts := strings.Split(rcontent, " ")
newrdata = append(newrdata, parts[1])
}
fieldMap["target"] = newrdata

case "DNSKEY":
for _, rcontent := range rdata {
parts := strings.Split(rcontent, " ")
fieldMap["flags"], _ = strconv.Atoi(parts[0])
fieldMap["protocol"], _ = strconv.Atoi(parts[1])
fieldMap["algorithm"], _ = strconv.Atoi(parts[2])
fieldMap["key"] = parts[3]
break
}

case "DS":
for _, rcontent := range rdata {
parts := strings.Split(rcontent, " ")
fieldMap["keytag"], _ = strconv.Atoi(parts[0])
fieldMap["digest_type"], _ = strconv.Atoi(parts[1])
fieldMap["algorithm"], _ = strconv.Atoi(parts[2])
fieldMap["digest"] = parts[3]
break
}

case "HINFO":
for _, rcontent := range rdata {
parts := strings.Split(rcontent, " ")
fieldMap["hardware"] = parts[0]
fieldMap["software"] = parts[1]
break
}

case "MX":
sort.Strings(rdata)
parts := strings.Split(rdata[0], " ")
fieldMap["priority"], _ = strconv.Atoi(parts[0])
if len(rdata) > 1 {
parts = strings.Split(rdata[1], " ")
tpri, _ := strconv.Atoi(parts[0])
fieldMap["priority_increment"] = tpri - fieldMap["priority"].(int)
}
for _, rcontent := range rdata {
parts := strings.Split(rcontent, " ")
newrdata = append(newrdata, parts[1])
}
sort.Strings(newrdata)
fieldMap["target"] = newrdata

case "NAPTR":
for _, rcontent := range rdata {
parts := strings.Split(rcontent, " ")
fieldMap["order"], _ = strconv.Atoi(parts[0])
fieldMap["preference"], _ = strconv.Atoi(parts[1])
fieldMap["flagsnaptr"] = parts[2]
fieldMap["regexp"] = parts[3]
fieldMap["replacement"] = parts[4]
fieldMap["service"] = parts[5]
break
}

case "NSEC3":
for _, rcontent := range rdata {
parts := strings.Split(rcontent, " ")
fieldMap["flags"], _ = strconv.Atoi(parts[0])
fieldMap["algorithm"], _ = strconv.Atoi(parts[1])
fieldMap["iterations"], _ = strconv.Atoi(parts[2])
fieldMap["salt"] = parts[3]
fieldMap["next_hashed_owner_name"] = parts[4]
fieldMap["type_bitmaps"] = parts[5]
break
}

case "NSEC3PARAM":
for _, rcontent := range rdata {
parts := strings.Split(rcontent, " ")
fieldMap["flags"], _ = strconv.Atoi(parts[0])
fieldMap["algorithm"], _ = strconv.Atoi(parts[1])
fieldMap["iterations"], _ = strconv.Atoi(parts[2])
fieldMap["salt"] = parts[3]
break
}

case "RP":
for _, rcontent := range rdata {
parts := strings.Split(rcontent, " ")
fieldMap["mailbox"] = parts[0]
fieldMap["txt"] = parts[1]
break
}

case "RRSIG":
for _, rcontent := range rdata {
parts := strings.Split(rcontent, " ")
fieldMap["type_covered"] = parts[0]
fieldMap["algorithm"], _ = strconv.Atoi(parts[1])
fieldMap["labels"], _ = strconv.Atoi(parts[2])
fieldMap["original_ttl"], _ = strconv.Atoi(parts[3])
fieldMap["expiration"] = parts[4]
fieldMap["inception"] = parts[5]
fieldMap["signature"] = parts[6]
fieldMap["signer"] = parts[7]
fieldMap["keytag"], _ = strconv.Atoi(parts[8])
break
}

case "SRV":
// pull out some fields
parts := strings.Split(rdata[0], " ")
fieldMap["priority"], _ = strconv.Atoi(parts[0])
fieldMap["weight"], _ = strconv.Atoi(parts[1])
fieldMap["port"], _ = strconv.Atoi(parts[2])
// populate target
for _, rcontent := range rdata {
parts := strings.Split(rcontent, " ")
newrdata = append(newrdata, parts[3])
}
fieldMap["target"] = newrdata

case "SSHFP":
for _, rcontent := range rdata {
parts := strings.Split(rcontent, " ")
fieldMap["algorithm"], _ = strconv.Atoi(parts[0])
fieldMap["fingerprint_type"], _ = strconv.Atoi(parts[1])
fieldMap["fingerprint"] = parts[2]
break
}

case "SOA":
for _, rcontent := range rdata {
parts := strings.Split(rcontent, " ")
fieldMap["name_server"] = parts[0]
fieldMap["email_address"] = parts[1]
fieldMap["serial"], _ = strconv.Atoi(parts[2])
fieldMap["refresh"], _ = strconv.Atoi(parts[3])
fieldMap["retry"], _ = strconv.Atoi(parts[4])
fieldMap["expiry"], _ = strconv.Atoi(parts[5])
fieldMap["nxdomain_ttl"], _ = strconv.Atoi(parts[6])
break
}

case "AKAMAICDN":
fieldMap["edge_hostname"] = rdata[0]

case "AKAMAITLC":
parts := strings.Split(rdata[0], " ")
fieldMap["answer_type"] = parts[0]
fieldMap["dns_name"] = parts[1]

default:
for _, rcontent := range rdata {
newrdata = append(newrdata, rcontent)
}
fieldMap["target"] = newrdata
}

return fieldMap

}
89 changes: 44 additions & 45 deletions configdns-v2/record_test.go
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
package dnsv2

import (
"testing"
"fmt"
"github.com/stretchr/testify/assert"
"gopkg.in/h2non/gock.v1"
"testing"
)

func TestRecord_ContainsHelper(t *testing.T) {
Expand Down Expand Up @@ -150,17 +150,17 @@ func TestRecord_AllRecords_WrongTypes(t *testing.T) {

func TestGetRecordsetsNoArgs(t *testing.T) {

dnsTestZone := "testzone.com"
dnsTestZone := "testzone.com"

defer gock.Off()
defer gock.Off()

mock := gock.New(fmt.Sprintf("https://akaa-baseurl-xxxxxxxxxxx-xxxxxxxxxxxxx.luna.akamaiapis.net/config-dns/v2/zones/%s/recordsets", dnsTestZone))
mock.
Get(fmt.Sprintf("/config-dns/v2/zones/%s/recordsets", dnsTestZone)).
HeaderPresent("Authorization").
Reply(200).
SetHeader("Content-Type", "application/json;charset=UTF-8").
BodyString(fmt.Sprintf(`{
mock := gock.New(fmt.Sprintf("https://akaa-baseurl-xxxxxxxxxxx-xxxxxxxxxxxxx.luna.akamaiapis.net/config-dns/v2/zones/%s/recordsets", dnsTestZone))
mock.
Get(fmt.Sprintf("/config-dns/v2/zones/%s/recordsets", dnsTestZone)).
HeaderPresent("Authorization").
Reply(200).
SetHeader("Content-Type", "application/json;charset=UTF-8").
BodyString(fmt.Sprintf(`{
"metadata": {
"lastPage": 1,
"page": 1,
Expand All @@ -187,27 +187,27 @@ func TestGetRecordsetsNoArgs(t *testing.T) {
}]
}`))

Init(config)
Init(config)
recordsets, err := GetRecordsets(dnsTestZone)
assert.NoError(t, err)
assert.Equal(t, assert.IsType(t, &RecordSetResponse{}, recordsets), true)
assert.Equal(t, len(recordsets.Recordsets), 2)
assert.NoError(t, err)
assert.Equal(t, assert.IsType(t, &RecordSetResponse{}, recordsets), true)
assert.Equal(t, len(recordsets.Recordsets), 2)

}

func TestGetRecordsets(t *testing.T) {

dnsTestZone := "testzone.com"
dnsTestZone := "testzone.com"

defer gock.Off()
defer gock.Off()

mock := gock.New(fmt.Sprintf("https://akaa-baseurl-xxxxxxxxxxx-xxxxxxxxxxxxx.luna.akamaiapis.net/config-dns/v2/zones/%s/recordsets", dnsTestZone))
mock.
Get(fmt.Sprintf("/config-dns/v2/zones/%s/recordsets", dnsTestZone)).
HeaderPresent("Authorization").
Reply(200).
SetHeader("Content-Type", "application/json;charset=UTF-8").
BodyString(fmt.Sprintf(`{
mock := gock.New(fmt.Sprintf("https://akaa-baseurl-xxxxxxxxxxx-xxxxxxxxxxxxx.luna.akamaiapis.net/config-dns/v2/zones/%s/recordsets", dnsTestZone))
mock.
Get(fmt.Sprintf("/config-dns/v2/zones/%s/recordsets", dnsTestZone)).
HeaderPresent("Authorization").
Reply(200).
SetHeader("Content-Type", "application/json;charset=UTF-8").
BodyString(fmt.Sprintf(`{
"metadata": {
"lastPage": 1,
"page": 1,
Expand All @@ -226,30 +226,30 @@ func TestGetRecordsets(t *testing.T) {
}]
}`))

Init(config)
Init(config)
qargs := RecordsetQueryArgs{Search: "east.testzone.com", SortBy: "name"}
recordsets, err := GetRecordsets(dnsTestZone, qargs)
assert.NoError(t, err)
assert.Equal(t, assert.IsType(t, &RecordSetResponse{}, recordsets), true)
assert.Equal(t, len(recordsets.Recordsets), 1)
recordsets, err := GetRecordsets(dnsTestZone, qargs)
assert.NoError(t, err)
assert.Equal(t, assert.IsType(t, &RecordSetResponse{}, recordsets), true)
assert.Equal(t, len(recordsets.Recordsets), 1)

}

func TestGetRecord(t *testing.T) {

dnsTestZone := "testzone.com"
dnsTestRecordName := "east.testzone.com"
dnsTestRecordType := "CNAME"
dnsTestZone := "testzone.com"
dnsTestRecordName := "east.testzone.com"
dnsTestRecordType := "CNAME"

defer gock.Off()
defer gock.Off()

mock := gock.New(fmt.Sprintf("https://akaa-baseurl-xxxxxxxxxxx-xxxxxxxxxxxxx.luna.akamaiapis.net/config-dns/v2/zones/%s/names/%s/types/%s", dnsTestZone, dnsTestRecordName, dnsTestRecordType))
mock.
Get(fmt.Sprintf("/config-dns/v2/zones/%s/names/%s/types/%s", dnsTestZone, dnsTestRecordName, dnsTestRecordType)).
HeaderPresent("Authorization").
Reply(200).
SetHeader("Content-Type", "application/json;charset=UTF-8").
BodyString(fmt.Sprintf(`{
mock := gock.New(fmt.Sprintf("https://akaa-baseurl-xxxxxxxxxxx-xxxxxxxxxxxxx.luna.akamaiapis.net/config-dns/v2/zones/%s/names/%s/types/%s", dnsTestZone, dnsTestRecordName, dnsTestRecordType))
mock.
Get(fmt.Sprintf("/config-dns/v2/zones/%s/names/%s/types/%s", dnsTestZone, dnsTestRecordName, dnsTestRecordType)).
HeaderPresent("Authorization").
Reply(200).
SetHeader("Content-Type", "application/json;charset=UTF-8").
BodyString(fmt.Sprintf(`{
"name": "east.testzone.com",
"rdata": [
"east.testzone.com.edgesuite.net."
Expand All @@ -258,11 +258,10 @@ func TestGetRecord(t *testing.T) {
"type": "CNAME"
}`))

Init(config)
testrecord, err := GetRecord(dnsTestZone, dnsTestRecordName, "CNAME")
assert.NoError(t, err)
assert.Equal(t, assert.IsType(t, &RecordBody{}, testrecord), true)
assert.Equal(t, testrecord.Name, dnsTestRecordName)
Init(config)
testrecord, err := GetRecord(dnsTestZone, dnsTestRecordName, "CNAME")
assert.NoError(t, err)
assert.Equal(t, assert.IsType(t, &RecordBody{}, testrecord), true)
assert.Equal(t, testrecord.Name, dnsTestRecordName)

}

32 changes: 15 additions & 17 deletions configdns-v2/zone_test.go
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
package dnsv2

import (
"testing"
"fmt"
"github.com/akamai/AkamaiOPEN-edgegrid-golang/jsonhooks-v1"
"github.com/stretchr/testify/assert"
"gopkg.in/h2non/gock.v1"
"testing"
)

func TestZone_JSON(t *testing.T) {
Expand Down Expand Up @@ -52,27 +52,25 @@ func TestGetZoneNames(t *testing.T) {

func TestGetZoneNameTypes(t *testing.T) {

dnsTestZone := "testzone.com"
dnsTestZone := "testzone.com"
dnsTestRecordName := "test.testzone.com"

defer gock.Off()
defer gock.Off()

mock := gock.New(fmt.Sprintf("https://akaa-baseurl-xxxxxxxxxxx-xxxxxxxxxxxxx.luna.akamaiapis.net/config-dns/v2/zones/%s/names/%s/types", dnsTestZone, dnsTestRecordName))
mock.
Get(fmt.Sprintf("/config-dns/v2/zones/%s/names/%s/types", dnsTestZone, dnsTestRecordName)).
HeaderPresent("Authorization").
Reply(200).
SetHeader("Content-Type", "application/json;charset=UTF-8").
BodyString(fmt.Sprintf(`{
mock := gock.New(fmt.Sprintf("https://akaa-baseurl-xxxxxxxxxxx-xxxxxxxxxxxxx.luna.akamaiapis.net/config-dns/v2/zones/%s/names/%s/types", dnsTestZone, dnsTestRecordName))
mock.
Get(fmt.Sprintf("/config-dns/v2/zones/%s/names/%s/types", dnsTestZone, dnsTestRecordName)).
HeaderPresent("Authorization").
Reply(200).
SetHeader("Content-Type", "application/json;charset=UTF-8").
BodyString(fmt.Sprintf(`{
"types":["CNAME", "AKAMAICDN"]
}`))

Init(config)
typeList, err := GetZoneNameTypes(dnsTestRecordName, dnsTestZone)
assert.NoError(t, err)
assert.Equal(t, assert.IsType(t, &ZoneNameTypesResponse{}, typeList), true)
assert.Equal(t, len(typeList.Types), 2)
Init(config)
typeList, err := GetZoneNameTypes(dnsTestRecordName, dnsTestZone)
assert.NoError(t, err)
assert.Equal(t, assert.IsType(t, &ZoneNameTypesResponse{}, typeList), true)
assert.Equal(t, len(typeList.Types), 2)

}


0 comments on commit 8e5cc3a

Please sign in to comment.