Skip to content
This repository has been archived by the owner on Jun 12, 2023. It is now read-only.

Commit

Permalink
Merge pull request #3 from prashant-Exzeo/master
Browse files Browse the repository at this point in the history
[ACSS-9434] - Added new filter to fetch hosted zones.
  • Loading branch information
iprashantjain authored Jul 18, 2019
2 parents a891c0d + 20fbfb0 commit f6da17f
Show file tree
Hide file tree
Showing 3 changed files with 194 additions and 1 deletion.
83 changes: 83 additions & 0 deletions awslib/hostedzone.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
package awslib

import (
"github.com/aws/aws-sdk-go/aws/session"
"github.com/aws/aws-sdk-go/service/route53"
"github.com/jpillora/backoff"
"time"
)

// GetAllInstances returns a complete list of instances for a given session
func GetAllHostedZones(sess *session.Session) ([]*route53.HostedZone, error) {

b := &backoff.Backoff{
//These are the defaults
Min: 10 * time.Millisecond,
Max: 1 * time.Second,
Factor: 2,
Jitter: false,
}

zones := make([]*route53.HostedZone, 0);
var nextPageExists = true
request := &route53.ListHostedZonesInput{}

r53 := route53.New(sess)

for nextPageExists {
response , err := r53.ListHostedZones(request)
if err != nil {
time.Sleep(b.Duration())
}else {
for recordIndex := range response.HostedZones {
zones = append(zones ,response.HostedZones[recordIndex]);
}
if response.IsTruncated == nil || !*response.IsTruncated {
nextPageExists = false
break
}
// Setting next page.
request.Marker = response.NextMarker
}
}
return zones, nil;
}

// GetHostedZoneRecords returns the hostedzonesRecords for a particular hostedZoneId
func GetHostedZoneRecords(sess *session.Session, hostedZoneId string) ([]*route53.ResourceRecordSet, error) {
var nextPageExists = true

b := &backoff.Backoff{
//These are the defaults
Min: 10 * time.Millisecond,
Max: 1 * time.Second,
Factor: 2,
Jitter: false,
}

records := make([]*route53.ResourceRecordSet, 0)
request := &route53.ListResourceRecordSetsInput{
HostedZoneId: &hostedZoneId,
}

r53 := route53.New(sess)

for nextPageExists {

response , err := r53.ListResourceRecordSets(request)
if err != nil {
time.Sleep(b.Duration())
}else {
records = append(records, response.ResourceRecordSets...)
if response.IsTruncated == nil || !*response.IsTruncated {
nextPageExists = false
break
}
// Setting next page.
request.StartRecordName = response.NextRecordName
request.StartRecordIdentifier = response.NextRecordIdentifier
request.StartRecordType = response.NextRecordType
}
}
return records, nil
}
17 changes: 17 additions & 0 deletions cmd/aws.go
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,11 @@ var awsCmd = &cobra.Command{
if err != nil {
return
}
case "hostedzone":
err := collectHostedZone(col, result)
if err != nil {
return
}
default:
err := collectEC2(col, result)
if err != nil {
Expand Down Expand Up @@ -98,6 +103,7 @@ func validateAWSFilter(filter string) bool {
validSlice := []string{
"ec2",
"rds",
"hostedzone",
"",
}
for _, service := range validSlice {
Expand All @@ -119,6 +125,17 @@ func collectEC2(col collector.AWSCollector, result map[string]interface{}) error
return nil
}

func collectHostedZone(col collector.AWSCollector, result map[string]interface{}) error {
instances, err := col.CollectZones()
if err != nil {
fmt.Printf("Failed to gather HostedZones Data: %v\n", err)
return err
}
fmt.Printf("Gathered HostedZone data across all regions\n")
result["hostedzones"] = instances
return nil
}

func collectRDS(col collector.AWSCollector, result map[string]interface{}) error {
instances, err := col.CollectRDS()
if err != nil {
Expand Down
95 changes: 94 additions & 1 deletion collector/awscollect.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,9 @@ import (
"fmt"
"strings"
"sync"

"time"
"github.com/aws/aws-sdk-go/service/route53"
"github.com/jpillora/backoff"
"github.com/adobe/cloudinventory/awslib"
"github.com/aws/aws-sdk-go/aws/credentials"
"github.com/aws/aws-sdk-go/aws/session"
Expand Down Expand Up @@ -132,6 +134,91 @@ func (col AWSCollector) CollectEC2() (map[string][]*ec2.Instance, error) {
return instances, nil
}

// CollectZones returns a hostedZones
func (col AWSCollector) CollectZones() ([]*route53.HostedZone, error) {

b := &backoff.Backoff{
//These are the defaults
Min: 10 * time.Millisecond,
Max: 1 * time.Second,
Factor: 2,
Jitter: false,
}

zones := make([]*route53.HostedZone, 0);
var nextPageExists = true
request := &route53.ListHostedZonesInput{}

var route53Session *session.Session

for _, session := range col.sessions {
route53Session = session
}
r53 := route53.New(route53Session)

for nextPageExists {
response , err := r53.ListHostedZones(request)
if err != nil {
time.Sleep(b.Duration())
}else {
for recordIndex := range response.HostedZones {
zones = append(zones ,response.HostedZones[recordIndex]);
}
if response.IsTruncated == nil || !*response.IsTruncated {
nextPageExists = false
break
}
// Setting next page.
request.Marker = response.NextMarker;
}
}
return zones, nil;
}

// GetHostedZoneRecords returns the hostedzonesRecords for a particular hostedZoneId
func (col AWSCollector) GetHostedZoneRecords(hostedZoneId string) ([]*route53.ResourceRecordSet, error) {
var nextPageExists = true

b := &backoff.Backoff{
//These are the defaults
Min: 10 * time.Millisecond,
Max: 1 * time.Second,
Factor: 2,
Jitter: false,
}

var route53Session *session.Session

for _, session := range col.sessions {
route53Session = session
}
r53 := route53.New(route53Session)

records := make([]*route53.ResourceRecordSet, 0)
request := &route53.ListResourceRecordSetsInput{
HostedZoneId: &hostedZoneId,
}

for nextPageExists {

response , err := r53.ListResourceRecordSets(request)
if err != nil {
time.Sleep(b.Duration())
}else {
records = append(records, response.ResourceRecordSets...)
if response.IsTruncated == nil || !*response.IsTruncated {
nextPageExists = false
break
}
// Setting next page.
request.StartRecordName = response.NextRecordName
request.StartRecordIdentifier = response.NextRecordIdentifier
request.StartRecordType = response.NextRecordType
}
}
return records, nil
}

// CollectRDS returns a concurrently collected RDS inventory for all the regions
func (col AWSCollector) CollectRDS() (map[string][]*rds.DBInstance, error) {
instances := make(map[string][]*rds.DBInstance)
Expand Down Expand Up @@ -190,3 +277,9 @@ func CollectEC2PerSession(sess *session.Session) ([]*ec2.Instance, error) {
instances, err := awslib.GetAllInstances(sess)
return instances, err
}

// CollectEC2PerSession returns an EC2 inventory for a given session
func CollectHostedZonePerSession(sess *session.Session) ([]*route53.HostedZone, error) {
instances, err := awslib.GetAllHostedZones(sess)
return instances, err
}

0 comments on commit f6da17f

Please sign in to comment.