sigs.k8s.io/external-dns@v0.14.1/provider/akamai/akamai_test.go (about)

     1  /*
     2  Copyright 2017 The Kubernetes Authors.
     3  
     4  Licensed under the Apache License, Version 2.0 (the "License");
     5  you may not use this file except in compliance with the License.
     6  You may obtain a copy of the License at
     7  
     8      http://www.apache.org/licenses/LICENSE-2.0
     9  
    10  Unless required by applicable law or agreed to in writing, software
    11  distributed under the License is distributed on an "AS IS" BASIS,
    12  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    13  See the License for the specific language governing permissions and
    14  limitations under the License.
    15  */
    16  
    17  package akamai
    18  
    19  import (
    20  	"context"
    21  	"encoding/json"
    22  	"testing"
    23  
    24  	log "github.com/sirupsen/logrus"
    25  
    26  	dns "github.com/akamai/AkamaiOPEN-edgegrid-golang/configdns-v2"
    27  	"github.com/stretchr/testify/assert"
    28  	"sigs.k8s.io/external-dns/endpoint"
    29  	"sigs.k8s.io/external-dns/plan"
    30  	"sigs.k8s.io/external-dns/provider"
    31  )
    32  
    33  type edgednsStubData struct {
    34  	objType       string // zone, record, recordsets
    35  	output        []interface{}
    36  	updateRecords []interface{}
    37  	createRecords []interface{}
    38  }
    39  
    40  type edgednsStub struct {
    41  	stubData map[string]edgednsStubData
    42  }
    43  
    44  func newStub() *edgednsStub {
    45  	return &edgednsStub{
    46  		stubData: make(map[string]edgednsStubData),
    47  	}
    48  }
    49  
    50  func createAkamaiStubProvider(stub *edgednsStub, domfilter endpoint.DomainFilter, idfilter provider.ZoneIDFilter) (*AkamaiProvider, error) {
    51  	akamaiConfig := AkamaiConfig{
    52  		DomainFilter:          domfilter,
    53  		ZoneIDFilter:          idfilter,
    54  		ServiceConsumerDomain: "testzone.com",
    55  		ClientToken:           "test_token",
    56  		ClientSecret:          "test_client_secret",
    57  		AccessToken:           "test_access_token",
    58  	}
    59  
    60  	prov, err := NewAkamaiProvider(akamaiConfig, stub)
    61  	aprov := prov.(*AkamaiProvider)
    62  	return aprov, err
    63  }
    64  
    65  func (r *edgednsStub) createStubDataEntry(objtype string) {
    66  	log.Debugf("Creating stub data entry")
    67  	if _, exists := r.stubData[objtype]; !exists {
    68  		r.stubData[objtype] = edgednsStubData{objType: objtype}
    69  	}
    70  
    71  	return
    72  }
    73  
    74  func (r *edgednsStub) setOutput(objtype string, output []interface{}) {
    75  	log.Debugf("Setting output to %v", output)
    76  	r.createStubDataEntry(objtype)
    77  	stubdata := r.stubData[objtype]
    78  	stubdata.output = output
    79  	r.stubData[objtype] = stubdata
    80  
    81  	return
    82  }
    83  
    84  func (r *edgednsStub) setUpdateRecords(objtype string, records []interface{}) {
    85  	log.Debugf("Setting updaterecords to %v", records)
    86  	r.createStubDataEntry(objtype)
    87  	stubdata := r.stubData[objtype]
    88  	stubdata.updateRecords = records
    89  	r.stubData[objtype] = stubdata
    90  
    91  	return
    92  }
    93  
    94  func (r *edgednsStub) setCreateRecords(objtype string, records []interface{}) {
    95  	log.Debugf("Setting createrecords to %v", records)
    96  	r.createStubDataEntry(objtype)
    97  	stubdata := r.stubData[objtype]
    98  	stubdata.createRecords = records
    99  	r.stubData[objtype] = stubdata
   100  
   101  	return
   102  }
   103  
   104  func (r *edgednsStub) ListZones(queryArgs dns.ZoneListQueryArgs) (*dns.ZoneListResponse, error) {
   105  	log.Debugf("Entering ListZones")
   106  	// Ignore Metadata`
   107  	resp := &dns.ZoneListResponse{}
   108  	zones := make([]*dns.ZoneResponse, 0)
   109  	for _, zname := range r.stubData["zone"].output {
   110  		log.Debugf("Processing output: %v", zname)
   111  		zn := &dns.ZoneResponse{Zone: zname.(string), ContractId: "contract"}
   112  		log.Debugf("Created Zone Object: %v", zn)
   113  		zones = append(zones, zn)
   114  	}
   115  	resp.Zones = zones
   116  	return resp, nil
   117  }
   118  
   119  func (r *edgednsStub) GetRecordsets(zone string, queryArgs dns.RecordsetQueryArgs) (*dns.RecordSetResponse, error) {
   120  	log.Debugf("Entering GetRecordsets")
   121  	// Ignore Metadata`
   122  	resp := &dns.RecordSetResponse{}
   123  	sets := make([]dns.Recordset, 0)
   124  	for _, rec := range r.stubData["recordset"].output {
   125  		rset := rec.(dns.Recordset)
   126  		sets = append(sets, rset)
   127  	}
   128  	resp.Recordsets = sets
   129  
   130  	return resp, nil
   131  }
   132  
   133  func (r *edgednsStub) CreateRecordsets(recordsets *dns.Recordsets, zone string, reclock bool) error {
   134  	return nil
   135  }
   136  
   137  func (r *edgednsStub) GetRecord(zone string, name string, record_type string) (*dns.RecordBody, error) {
   138  	resp := &dns.RecordBody{}
   139  
   140  	return resp, nil
   141  }
   142  
   143  func (r *edgednsStub) DeleteRecord(record *dns.RecordBody, zone string, recLock bool) error {
   144  	return nil
   145  }
   146  
   147  func (r *edgednsStub) UpdateRecord(record *dns.RecordBody, zone string, recLock bool) error {
   148  	return nil
   149  }
   150  
   151  // Test FetchZones
   152  func TestFetchZonesZoneIDFilter(t *testing.T) {
   153  	stub := newStub()
   154  	domfilter := endpoint.DomainFilter{}
   155  	idfilter := provider.NewZoneIDFilter([]string{"Test"})
   156  	c, err := createAkamaiStubProvider(stub, domfilter, idfilter)
   157  	assert.Nil(t, err)
   158  	stub.setOutput("zone", []interface{}{"test1.testzone.com", "test2.testzone.com"})
   159  
   160  	x, _ := c.fetchZones()
   161  	y, _ := json.Marshal(x)
   162  	if assert.NotNil(t, y) {
   163  		assert.Equal(t, "{\"zones\":[{\"contractId\":\"contract\",\"zone\":\"test1.testzone.com\"},{\"contractId\":\"contract\",\"zone\":\"test2.testzone.com\"}]}", string(y))
   164  	}
   165  }
   166  
   167  func TestFetchZonesEmpty(t *testing.T) {
   168  	stub := newStub()
   169  	domfilter := endpoint.NewDomainFilter([]string{"Nonexistent"})
   170  	idfilter := provider.NewZoneIDFilter([]string{"Nonexistent"})
   171  	c, err := createAkamaiStubProvider(stub, domfilter, idfilter)
   172  	assert.Nil(t, err)
   173  	stub.setOutput("zone", []interface{}{})
   174  
   175  	x, _ := c.fetchZones()
   176  	y, _ := json.Marshal(x)
   177  	if assert.NotNil(t, y) {
   178  		assert.Equal(t, "{\"zones\":[]}", string(y))
   179  	}
   180  }
   181  
   182  // TestAkamaiRecords tests record endpoint
   183  func TestAkamaiRecords(t *testing.T) {
   184  	stub := newStub()
   185  	domfilter := endpoint.DomainFilter{}
   186  	idfilter := provider.ZoneIDFilter{}
   187  	c, err := createAkamaiStubProvider(stub, domfilter, idfilter)
   188  	assert.Nil(t, err)
   189  	stub.setOutput("zone", []interface{}{"test1.testzone.com"})
   190  	recordsets := make([]interface{}, 0)
   191  	recordsets = append(recordsets, dns.Recordset{
   192  		Name:  "www.example.com",
   193  		Type:  endpoint.RecordTypeA,
   194  		Rdata: []string{"10.0.0.2", "10.0.0.3"},
   195  	})
   196  	recordsets = append(recordsets, dns.Recordset{
   197  		Name:  "www.example.com",
   198  		Type:  endpoint.RecordTypeTXT,
   199  		Rdata: []string{"heritage=external-dns,external-dns/owner=default"},
   200  	})
   201  	recordsets = append(recordsets, dns.Recordset{
   202  		Name:  "www.exclude.me",
   203  		Type:  endpoint.RecordTypeA,
   204  		Rdata: []string{"192.168.0.1", "192.168.0.2"},
   205  	})
   206  	stub.setOutput("recordset", recordsets)
   207  	endpoints := make([]*endpoint.Endpoint, 0)
   208  	endpoints = append(endpoints, endpoint.NewEndpoint("www.example.com", endpoint.RecordTypeA, "10.0.0.2", "10.0.0.3"))
   209  	endpoints = append(endpoints, endpoint.NewEndpoint("www.example.com", endpoint.RecordTypeTXT, "heritage=external-dns,external-dns/owner=default"))
   210  	endpoints = append(endpoints, endpoint.NewEndpoint("www.exclude.me", endpoint.RecordTypeA, "192.168.0.1", "192.168.0.2"))
   211  
   212  	x, _ := c.Records(context.Background())
   213  	if assert.NotNil(t, x) {
   214  		assert.Equal(t, endpoints, x)
   215  	}
   216  }
   217  
   218  func TestAkamaiRecordsEmpty(t *testing.T) {
   219  	stub := newStub()
   220  	domfilter := endpoint.DomainFilter{}
   221  	idfilter := provider.NewZoneIDFilter([]string{"Nonexistent"})
   222  	c, err := createAkamaiStubProvider(stub, domfilter, idfilter)
   223  	assert.Nil(t, err)
   224  	stub.setOutput("zone", []interface{}{"test1.testzone.com"})
   225  	recordsets := make([]interface{}, 0)
   226  	stub.setOutput("recordset", recordsets)
   227  
   228  	x, _ := c.Records(context.Background())
   229  	assert.Nil(t, x)
   230  }
   231  
   232  func TestAkamaiRecordsFilters(t *testing.T) {
   233  	stub := newStub()
   234  	domfilter := endpoint.NewDomainFilter([]string{"www.exclude.me"})
   235  	idfilter := provider.ZoneIDFilter{}
   236  	c, err := createAkamaiStubProvider(stub, domfilter, idfilter)
   237  	assert.Nil(t, err)
   238  	stub.setOutput("zone", []interface{}{"www.exclude.me"})
   239  	recordsets := make([]interface{}, 0)
   240  	recordsets = append(recordsets, dns.Recordset{
   241  		Name:  "www.example.com",
   242  		Type:  endpoint.RecordTypeA,
   243  		Rdata: []string{"10.0.0.2", "10.0.0.3"},
   244  	})
   245  	recordsets = append(recordsets, dns.Recordset{
   246  		Name:  "www.exclude.me",
   247  		Type:  endpoint.RecordTypeA,
   248  		Rdata: []string{"192.168.0.1", "192.168.0.2"},
   249  	})
   250  	stub.setOutput("recordset", recordsets)
   251  	endpoints := make([]*endpoint.Endpoint, 0)
   252  	endpoints = append(endpoints, endpoint.NewEndpoint("www.exclude.me", endpoint.RecordTypeA, "192.168.0.1", "192.168.0.2"))
   253  
   254  	x, _ := c.Records(context.Background())
   255  	if assert.NotNil(t, x) {
   256  		assert.Equal(t, endpoints, x)
   257  	}
   258  }
   259  
   260  // TestCreateRecords tests create function
   261  // (p AkamaiProvider) createRecordsets(zoneNameIDMapper provider.ZoneIDName, endpoints []*endpoint.Endpoint) error
   262  func TestCreateRecords(t *testing.T) {
   263  	stub := newStub()
   264  	domfilter := endpoint.DomainFilter{}
   265  	idfilter := provider.ZoneIDFilter{}
   266  	c, err := createAkamaiStubProvider(stub, domfilter, idfilter)
   267  	assert.Nil(t, err)
   268  
   269  	zoneNameIDMapper := provider.ZoneIDName{"example.com": "example.com"}
   270  	endpoints := make([]*endpoint.Endpoint, 0)
   271  	endpoints = append(endpoints, endpoint.NewEndpoint("www.example.com", endpoint.RecordTypeA, "10.0.0.2", "10.0.0.3"))
   272  	endpoints = append(endpoints, endpoint.NewEndpoint("www.example.com", endpoint.RecordTypeTXT, "heritage=external-dns,external-dns/owner=default"))
   273  
   274  	err = c.createRecordsets(zoneNameIDMapper, endpoints)
   275  	assert.Nil(t, err)
   276  }
   277  
   278  func TestCreateRecordsDomainFilter(t *testing.T) {
   279  	stub := newStub()
   280  	domfilter := endpoint.DomainFilter{}
   281  	idfilter := provider.ZoneIDFilter{}
   282  	c, err := createAkamaiStubProvider(stub, domfilter, idfilter)
   283  	assert.Nil(t, err)
   284  
   285  	zoneNameIDMapper := provider.ZoneIDName{"example.com": "example.com"}
   286  	endpoints := make([]*endpoint.Endpoint, 0)
   287  	endpoints = append(endpoints, endpoint.NewEndpoint("www.example.com", endpoint.RecordTypeA, "10.0.0.2", "10.0.0.3"))
   288  	endpoints = append(endpoints, endpoint.NewEndpoint("www.example.com", endpoint.RecordTypeTXT, "heritage=external-dns,external-dns/owner=default"))
   289  	exclude := append(endpoints, endpoint.NewEndpoint("www.exclude.me", endpoint.RecordTypeA, "10.0.0.2", "10.0.0.3"))
   290  
   291  	err = c.createRecordsets(zoneNameIDMapper, exclude)
   292  	assert.Nil(t, err)
   293  }
   294  
   295  // TestDeleteRecords validate delete
   296  func TestDeleteRecords(t *testing.T) {
   297  	stub := newStub()
   298  	domfilter := endpoint.DomainFilter{}
   299  	idfilter := provider.ZoneIDFilter{}
   300  	c, err := createAkamaiStubProvider(stub, domfilter, idfilter)
   301  	assert.Nil(t, err)
   302  
   303  	zoneNameIDMapper := provider.ZoneIDName{"example.com": "example.com"}
   304  	endpoints := make([]*endpoint.Endpoint, 0)
   305  	endpoints = append(endpoints, endpoint.NewEndpoint("www.example.com", endpoint.RecordTypeA, "10.0.0.2", "10.0.0.3"))
   306  	endpoints = append(endpoints, endpoint.NewEndpoint("www.example.com", endpoint.RecordTypeTXT, "heritage=external-dns,external-dns/owner=default"))
   307  
   308  	err = c.deleteRecordsets(zoneNameIDMapper, endpoints)
   309  	assert.Nil(t, err)
   310  }
   311  
   312  func TestDeleteRecordsDomainFilter(t *testing.T) {
   313  	stub := newStub()
   314  	domfilter := endpoint.NewDomainFilter([]string{"example.com"})
   315  	idfilter := provider.ZoneIDFilter{}
   316  	c, err := createAkamaiStubProvider(stub, domfilter, idfilter)
   317  	assert.Nil(t, err)
   318  
   319  	zoneNameIDMapper := provider.ZoneIDName{"example.com": "example.com"}
   320  	endpoints := make([]*endpoint.Endpoint, 0)
   321  	endpoints = append(endpoints, endpoint.NewEndpoint("www.example.com", endpoint.RecordTypeA, "10.0.0.2", "10.0.0.3"))
   322  	endpoints = append(endpoints, endpoint.NewEndpoint("www.example.com", endpoint.RecordTypeTXT, "heritage=external-dns,external-dns/owner=default"))
   323  	exclude := append(endpoints, endpoint.NewEndpoint("www.exclude.me", endpoint.RecordTypeA, "10.0.0.2", "10.0.0.3"))
   324  
   325  	err = c.deleteRecordsets(zoneNameIDMapper, exclude)
   326  	assert.Nil(t, err)
   327  }
   328  
   329  // Test record update func
   330  func TestUpdateRecords(t *testing.T) {
   331  	stub := newStub()
   332  	domfilter := endpoint.DomainFilter{}
   333  	idfilter := provider.ZoneIDFilter{}
   334  	c, err := createAkamaiStubProvider(stub, domfilter, idfilter)
   335  	assert.Nil(t, err)
   336  
   337  	zoneNameIDMapper := provider.ZoneIDName{"example.com": "example.com"}
   338  	endpoints := make([]*endpoint.Endpoint, 0)
   339  	endpoints = append(endpoints, endpoint.NewEndpoint("www.example.com", endpoint.RecordTypeA, "10.0.0.2", "10.0.0.3"))
   340  	endpoints = append(endpoints, endpoint.NewEndpoint("www.example.com", endpoint.RecordTypeTXT, "heritage=external-dns,external-dns/owner=default"))
   341  
   342  	err = c.updateNewRecordsets(zoneNameIDMapper, endpoints)
   343  	assert.Nil(t, err)
   344  }
   345  
   346  func TestUpdateRecordsDomainFilter(t *testing.T) {
   347  	stub := newStub()
   348  	domfilter := endpoint.NewDomainFilter([]string{"example.com"})
   349  	idfilter := provider.ZoneIDFilter{}
   350  	c, err := createAkamaiStubProvider(stub, domfilter, idfilter)
   351  	assert.Nil(t, err)
   352  
   353  	zoneNameIDMapper := provider.ZoneIDName{"example.com": "example.com"}
   354  	endpoints := make([]*endpoint.Endpoint, 0)
   355  	endpoints = append(endpoints, endpoint.NewEndpoint("www.example.com", endpoint.RecordTypeA, "10.0.0.2", "10.0.0.3"))
   356  	endpoints = append(endpoints, endpoint.NewEndpoint("www.example.com", endpoint.RecordTypeTXT, "heritage=external-dns,external-dns/owner=default"))
   357  	exclude := append(endpoints, endpoint.NewEndpoint("www.exclude.me", endpoint.RecordTypeA, "10.0.0.2", "10.0.0.3"))
   358  
   359  	err = c.updateNewRecordsets(zoneNameIDMapper, exclude)
   360  	assert.Nil(t, err)
   361  }
   362  
   363  func TestAkamaiApplyChanges(t *testing.T) {
   364  	stub := newStub()
   365  	domfilter := endpoint.NewDomainFilter([]string{"example.com"})
   366  	idfilter := provider.ZoneIDFilter{}
   367  	c, err := createAkamaiStubProvider(stub, domfilter, idfilter)
   368  	assert.Nil(t, err)
   369  
   370  	stub.setOutput("zone", []interface{}{"example.com"})
   371  	changes := &plan.Changes{}
   372  	changes.Create = []*endpoint.Endpoint{
   373  		{DNSName: "www.example.com", RecordType: "A", Targets: endpoint.Targets{"target"}, RecordTTL: 300},
   374  		{DNSName: "test.example.com", RecordType: "A", Targets: endpoint.Targets{"target"}, RecordTTL: 300},
   375  		{DNSName: "test.this.example.com", RecordType: "A", Targets: endpoint.Targets{"127.0.0.1"}, RecordTTL: 300},
   376  		{DNSName: "www.example.com", RecordType: "TXT", Targets: endpoint.Targets{"heritage=external-dns,external-dns/owner=default"}, RecordTTL: 300},
   377  		{DNSName: "test.example.com", RecordType: "TXT", Targets: endpoint.Targets{"heritage=external-dns,external-dns/owner=default"}, RecordTTL: 300},
   378  		{DNSName: "test.this.example.com", RecordType: "TXT", Targets: endpoint.Targets{"heritage=external-dns,external-dns/owner=default"}, RecordTTL: 300},
   379  		{DNSName: "another.example.com", RecordType: "A", Targets: endpoint.Targets{"target"}},
   380  	}
   381  	changes.Delete = []*endpoint.Endpoint{{DNSName: "delete.example.com", RecordType: "A", Targets: endpoint.Targets{"target"}, RecordTTL: 300}}
   382  	changes.UpdateOld = []*endpoint.Endpoint{{DNSName: "old.example.com", RecordType: "A", Targets: endpoint.Targets{"target-old"}, RecordTTL: 300}}
   383  	changes.UpdateNew = []*endpoint.Endpoint{{DNSName: "update.example.com", Targets: endpoint.Targets{"target-new"}, RecordType: "CNAME", RecordTTL: 300}}
   384  	apply := c.ApplyChanges(context.Background(), changes)
   385  	assert.Nil(t, apply)
   386  }