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 }