sigs.k8s.io/external-dns@v0.14.1/provider/ultradns/ultradns_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 ultradns 18 19 import ( 20 "context" 21 "encoding/json" 22 "fmt" 23 "log" 24 "net/http" 25 "os" 26 "reflect" 27 _ "strings" 28 "testing" 29 30 "github.com/stretchr/testify/assert" 31 udnssdk "github.com/ultradns/ultradns-sdk-go" 32 "sigs.k8s.io/external-dns/endpoint" 33 "sigs.k8s.io/external-dns/plan" 34 ) 35 36 type mockUltraDNSZone struct { 37 client *udnssdk.Client 38 } 39 40 func (m *mockUltraDNSZone) SelectWithOffsetWithLimit(k *udnssdk.ZoneKey, offset int, limit int) (zones []udnssdk.Zone, ResultInfo udnssdk.ResultInfo, resp *http.Response, err error) { 41 zones = []udnssdk.Zone{} 42 zone := udnssdk.Zone{} 43 zoneJson := ` 44 { 45 "properties": { 46 "name":"test-ultradns-provider.com.", 47 "accountName":"teamrest", 48 "type":"PRIMARY", 49 "dnssecStatus":"UNSIGNED", 50 "status":"ACTIVE", 51 "owner":"teamrest", 52 "resourceRecordCount":7, 53 "lastModifiedDateTime":"" 54 } 55 }` 56 if err := json.Unmarshal([]byte(zoneJson), &zone); err != nil { 57 log.Fatal(err) 58 } 59 60 zones = append(zones, zone) 61 return zones, udnssdk.ResultInfo{}, nil, nil 62 } 63 64 type mockUltraDNSRecord struct { 65 client *udnssdk.Client 66 } 67 68 func (m *mockUltraDNSRecord) Create(k udnssdk.RRSetKey, rrset udnssdk.RRSet) (*http.Response, error) { 69 return nil, nil 70 } 71 72 func (m *mockUltraDNSRecord) Select(k udnssdk.RRSetKey) ([]udnssdk.RRSet, error) { 73 return []udnssdk.RRSet{{ 74 OwnerName: "test-ultradns-provider.com.", 75 RRType: endpoint.RecordTypeA, 76 RData: []string{"1.1.1.1"}, 77 TTL: 86400, 78 }}, nil 79 } 80 81 func (m *mockUltraDNSRecord) SelectWithOffset(k udnssdk.RRSetKey, offset int) ([]udnssdk.RRSet, udnssdk.ResultInfo, *http.Response, error) { 82 return nil, udnssdk.ResultInfo{}, nil, nil 83 } 84 85 func (m *mockUltraDNSRecord) Update(udnssdk.RRSetKey, udnssdk.RRSet) (*http.Response, error) { 86 return nil, nil 87 } 88 89 func (m *mockUltraDNSRecord) Delete(k udnssdk.RRSetKey) (*http.Response, error) { 90 return nil, nil 91 } 92 93 func (m *mockUltraDNSRecord) SelectWithOffsetWithLimit(k udnssdk.RRSetKey, offset int, limit int) (rrsets []udnssdk.RRSet, ResultInfo udnssdk.ResultInfo, resp *http.Response, err error) { 94 return []udnssdk.RRSet{{ 95 OwnerName: "test-ultradns-provider.com.", 96 RRType: endpoint.RecordTypeA, 97 RData: []string{"1.1.1.1"}, 98 TTL: 86400, 99 }}, udnssdk.ResultInfo{}, nil, nil 100 } 101 102 // NewUltraDNSProvider Test scenario 103 func TestNewUltraDNSProvider(t *testing.T) { 104 _ = os.Setenv("ULTRADNS_USERNAME", "") 105 _ = os.Setenv("ULTRADNS_PASSWORD", "") 106 _ = os.Setenv("ULTRADNS_BASEURL", "") 107 _ = os.Setenv("ULTRADNS_ACCOUNTNAME", "") 108 _, err := NewUltraDNSProvider(endpoint.NewDomainFilter([]string{"test-ultradns-provider.com"}), true) 109 assert.Nil(t, err) 110 111 _ = os.Unsetenv("ULTRADNS_PASSWORD") 112 _ = os.Unsetenv("ULTRADNS_USERNAME") 113 _ = os.Unsetenv("ULTRADNS_BASEURL") 114 _ = os.Unsetenv("ULTRADNS_ACCOUNTNAME") 115 _, err = NewUltraDNSProvider(endpoint.NewDomainFilter([]string{"test-ultradns-provider.com"}), true) 116 assert.NotNilf(t, err, "Expected to fail %s", "formatted") 117 } 118 119 // zones function test scenario 120 func TestUltraDNSProvider_Zones(t *testing.T) { 121 mocked := mockUltraDNSZone{} 122 provider := &UltraDNSProvider{ 123 client: udnssdk.Client{ 124 Zone: &mocked, 125 }, 126 } 127 128 zoneKey := &udnssdk.ZoneKey{ 129 Zone: "", 130 AccountName: "teamrest", 131 } 132 133 expected, _, _, err := provider.client.Zone.SelectWithOffsetWithLimit(zoneKey, 0, 1000) 134 assert.Nil(t, err) 135 zones, err := provider.Zones(context.Background()) 136 assert.Nil(t, err) 137 assert.Equal(t, reflect.DeepEqual(expected, zones), true) 138 } 139 140 // Records function test case 141 func TestUltraDNSProvider_Records(t *testing.T) { 142 mocked := mockUltraDNSRecord{} 143 mockedDomain := mockUltraDNSZone{} 144 145 provider := &UltraDNSProvider{ 146 client: udnssdk.Client{ 147 RRSets: &mocked, 148 Zone: &mockedDomain, 149 }, 150 } 151 rrsetKey := udnssdk.RRSetKey{} 152 expected, _, _, err := provider.client.RRSets.SelectWithOffsetWithLimit(rrsetKey, 0, 1000) 153 records, err := provider.Records(context.Background()) 154 assert.Nil(t, err) 155 for _, v := range records { 156 assert.Equal(t, fmt.Sprintf("%s.", v.DNSName), expected[0].OwnerName) 157 assert.Equal(t, v.RecordType, expected[0].RRType) 158 assert.Equal(t, int(v.RecordTTL), expected[0].TTL) 159 } 160 } 161 162 // ApplyChanges function testcase 163 func TestUltraDNSProvider_ApplyChanges(t *testing.T) { 164 changes := &plan.Changes{} 165 mocked := mockUltraDNSRecord{nil} 166 mockedDomain := mockUltraDNSZone{nil} 167 168 provider := &UltraDNSProvider{ 169 client: udnssdk.Client{ 170 RRSets: &mocked, 171 Zone: &mockedDomain, 172 }, 173 } 174 175 changes.Create = []*endpoint.Endpoint{ 176 {DNSName: "test-ultradns-provider.com", Targets: endpoint.Targets{"1.1.1.1"}, RecordType: "A"}, 177 {DNSName: "ttl.test-ultradns-provider.com", Targets: endpoint.Targets{"1.1.1.1"}, RecordType: "A", RecordTTL: 100}, 178 } 179 changes.Create = []*endpoint.Endpoint{{DNSName: "test-ultradns-provider.com", Targets: endpoint.Targets{"1.1.1.2"}, RecordType: "A"}} 180 changes.UpdateNew = []*endpoint.Endpoint{{DNSName: "test-ultradns-provider.com", Targets: endpoint.Targets{"1.1.2.2"}, RecordType: "A", RecordTTL: 100}} 181 changes.UpdateNew = []*endpoint.Endpoint{{DNSName: "test-ultradns-provider.com", Targets: endpoint.Targets{"1.1.2.2", "1.1.2.3", "1.1.2.4"}, RecordType: "A", RecordTTL: 100}} 182 changes.Delete = []*endpoint.Endpoint{{DNSName: "test-ultradns-provider.com", Targets: endpoint.Targets{"1.1.2.2", "1.1.2.3", "1.1.2.4"}, RecordType: "A", RecordTTL: 100}} 183 changes.Delete = []*endpoint.Endpoint{{DNSName: "ttl.test-ultradns-provider.com", Targets: endpoint.Targets{"1.1.1.1"}, RecordType: "A", RecordTTL: 100}} 184 err := provider.ApplyChanges(context.Background(), changes) 185 assert.Nilf(t, err, "Should not fail %s", "formatted") 186 } 187 188 // Testing function getSpecificRecord 189 func TestUltraDNSProvider_getSpecificRecord(t *testing.T) { 190 mocked := mockUltraDNSRecord{nil} 191 mockedDomain := mockUltraDNSZone{nil} 192 193 provider := &UltraDNSProvider{ 194 client: udnssdk.Client{ 195 RRSets: &mocked, 196 Zone: &mockedDomain, 197 }, 198 } 199 200 recordSetKey := udnssdk.RRSetKey{ 201 Zone: "test-ultradns-provider.com.", 202 Type: "A", 203 Name: "teamrest", 204 } 205 err := provider.getSpecificRecord(context.Background(), recordSetKey) 206 assert.Nil(t, err) 207 } 208 209 // Fail case scenario testing where CNAME and TXT Record name are same 210 func TestUltraDNSProvider_ApplyChangesCNAME(t *testing.T) { 211 changes := &plan.Changes{} 212 mocked := mockUltraDNSRecord{nil} 213 mockedDomain := mockUltraDNSZone{nil} 214 215 provider := &UltraDNSProvider{ 216 client: udnssdk.Client{ 217 RRSets: &mocked, 218 Zone: &mockedDomain, 219 }, 220 } 221 222 changes.Create = []*endpoint.Endpoint{ 223 {DNSName: "test-ultradns-provider.com", Targets: endpoint.Targets{"1.1.1.1"}, RecordType: "CNAME"}, 224 {DNSName: "test-ultradns-provider.com", Targets: endpoint.Targets{"1.1.1.1"}, RecordType: "TXT"}, 225 } 226 227 err := provider.ApplyChanges(context.Background(), changes) 228 assert.NotNil(t, err) 229 } 230 231 // This will work if you would set the environment variables such as "ULTRADNS_INTEGRATION" and zone should be available "kubernetes-ultradns-provider-test.com" 232 func TestUltraDNSProvider_ApplyChanges_Integration(t *testing.T) { 233 _, ok := os.LookupEnv("ULTRADNS_INTEGRATION") 234 if !ok { 235 log.Printf("Skipping test") 236 } else { 237 238 providerUltradns, err := NewUltraDNSProvider(endpoint.NewDomainFilter([]string{"kubernetes-ultradns-provider-test.com"}), false) 239 changes := &plan.Changes{} 240 changes.Create = []*endpoint.Endpoint{ 241 {DNSName: "kubernetes-ultradns-provider-test.com", Targets: endpoint.Targets{"1.1.1.1"}, RecordType: "A"}, 242 {DNSName: "ttl.kubernetes-ultradns-provider-test.com", Targets: endpoint.Targets{"2001:0db8:85a3:0000:0000:8a2e:0370:7334"}, RecordType: "AAAA", RecordTTL: 100}, 243 } 244 245 err = providerUltradns.ApplyChanges(context.Background(), changes) 246 assert.Nil(t, err) 247 248 rrsetKey := udnssdk.RRSetKey{ 249 Zone: "kubernetes-ultradns-provider-test.com.", 250 Name: "kubernetes-ultradns-provider-test.com.", 251 Type: "A", 252 } 253 254 rrsets, _ := providerUltradns.client.RRSets.Select(rrsetKey) 255 assert.Equal(t, rrsets[0].RData[0], "1.1.1.1") 256 257 rrsetKey = udnssdk.RRSetKey{ 258 Zone: "kubernetes-ultradns-provider-test.com.", 259 Name: "ttl.kubernetes-ultradns-provider-test.com.", 260 Type: "AAAA", 261 } 262 263 rrsets, _ = providerUltradns.client.RRSets.Select(rrsetKey) 264 assert.Equal(t, rrsets[0].RData[0], "2001:db8:85a3:0:0:8a2e:370:7334") 265 266 changes = &plan.Changes{} 267 changes.UpdateNew = []*endpoint.Endpoint{ 268 {DNSName: "kubernetes-ultradns-provider-test.com", Targets: endpoint.Targets{"1.1.2.2"}, RecordType: "A", RecordTTL: 100}, 269 {DNSName: "ttl.kubernetes-ultradns-provider-test.com", Targets: endpoint.Targets{"2001:0db8:85a3:0000:0000:8a2e:0370:7335"}, RecordType: "AAAA", RecordTTL: 100}, 270 } 271 err = providerUltradns.ApplyChanges(context.Background(), changes) 272 assert.Nil(t, err) 273 274 rrsetKey = udnssdk.RRSetKey{ 275 Zone: "kubernetes-ultradns-provider-test.com.", 276 Name: "kubernetes-ultradns-provider-test.com.", 277 Type: "A", 278 } 279 280 rrsets, _ = providerUltradns.client.RRSets.Select(rrsetKey) 281 assert.Equal(t, rrsets[0].RData[0], "1.1.2.2") 282 283 rrsetKey = udnssdk.RRSetKey{ 284 Zone: "kubernetes-ultradns-provider-test.com.", 285 Name: "ttl.kubernetes-ultradns-provider-test.com.", 286 Type: "AAAA", 287 } 288 289 rrsets, _ = providerUltradns.client.RRSets.Select(rrsetKey) 290 assert.Equal(t, rrsets[0].RData[0], "2001:db8:85a3:0:0:8a2e:370:7335") 291 292 changes = &plan.Changes{} 293 changes.Delete = []*endpoint.Endpoint{ 294 {DNSName: "ttl.kubernetes-ultradns-provider-test.com", Targets: endpoint.Targets{"2001:0db8:85a3:0000:0000:8a2e:0370:7335"}, RecordType: "AAAA", RecordTTL: 100}, 295 {DNSName: "kubernetes-ultradns-provider-test.com", Targets: endpoint.Targets{"1.1.2.2"}, RecordType: "A", RecordTTL: 100}, 296 } 297 298 err = providerUltradns.ApplyChanges(context.Background(), changes) 299 assert.Nil(t, err) 300 301 resp, _ := providerUltradns.client.Do("GET", "zones/kubernetes-ultradns-provider-test.com./rrsets/AAAA/ttl.kubernetes-ultradns-provider-test.com.", nil, udnssdk.RRSetListDTO{}) 302 assert.Equal(t, resp.Status, "404 Not Found") 303 304 resp, _ = providerUltradns.client.Do("GET", "zones/kubernetes-ultradns-provider-test.com./rrsets/A/kubernetes-ultradns-provider-test.com.", nil, udnssdk.RRSetListDTO{}) 305 assert.Equal(t, resp.Status, "404 Not Found") 306 307 } 308 } 309 310 // This will work if you would set the environment variables such as "ULTRADNS_INTEGRATION" and zone should be available "kubernetes-ultradns-provider-test.com" for multiple target 311 func TestUltraDNSProvider_ApplyChanges_MultipleTarget_integeration(t *testing.T) { 312 _, ok := os.LookupEnv("ULTRADNS_INTEGRATION") 313 if !ok { 314 log.Printf("Skipping test") 315 } else { 316 317 provider, err := NewUltraDNSProvider(endpoint.NewDomainFilter([]string{"kubernetes-ultradns-provider-test.com"}), false) 318 changes := &plan.Changes{} 319 changes.Create = []*endpoint.Endpoint{ 320 {DNSName: "kubernetes-ultradns-provider-test.com", Targets: endpoint.Targets{"1.1.1.1", "1.1.2.2"}, RecordType: "A"}, 321 } 322 323 err = provider.ApplyChanges(context.Background(), changes) 324 assert.Nil(t, err) 325 326 rrsetKey := udnssdk.RRSetKey{ 327 Zone: "kubernetes-ultradns-provider-test.com.", 328 Name: "kubernetes-ultradns-provider-test.com.", 329 Type: "A", 330 } 331 332 rrsets, _ := provider.client.RRSets.Select(rrsetKey) 333 assert.Equal(t, rrsets[0].RData, []string{"1.1.1.1", "1.1.2.2"}) 334 335 changes = &plan.Changes{} 336 changes.UpdateNew = []*endpoint.Endpoint{{DNSName: "kubernetes-ultradns-provider-test.com", Targets: endpoint.Targets{"1.1.2.2", "192.168.0.24", "1.2.3.4"}, RecordType: "A", RecordTTL: 100}} 337 338 err = provider.ApplyChanges(context.Background(), changes) 339 assert.Nil(t, err) 340 341 rrsetKey = udnssdk.RRSetKey{ 342 Zone: "kubernetes-ultradns-provider-test.com.", 343 Name: "kubernetes-ultradns-provider-test.com.", 344 Type: "A", 345 } 346 347 rrsets, _ = provider.client.RRSets.Select(rrsetKey) 348 assert.Equal(t, rrsets[0].RData, []string{"1.1.2.2", "192.168.0.24", "1.2.3.4"}) 349 350 changes = &plan.Changes{} 351 changes.UpdateNew = []*endpoint.Endpoint{{DNSName: "kubernetes-ultradns-provider-test.com", Targets: endpoint.Targets{"1.1.2.2"}, RecordType: "A", RecordTTL: 100}} 352 353 err = provider.ApplyChanges(context.Background(), changes) 354 355 assert.Nil(t, err) 356 357 rrsetKey = udnssdk.RRSetKey{ 358 Zone: "kubernetes-ultradns-provider-test.com.", 359 Name: "kubernetes-ultradns-provider-test.com.", 360 Type: "A", 361 } 362 363 rrsets, _ = provider.client.RRSets.Select(rrsetKey) 364 assert.Equal(t, rrsets[0].RData, []string{"1.1.2.2"}) 365 366 changes = &plan.Changes{} 367 changes.Delete = []*endpoint.Endpoint{{DNSName: "kubernetes-ultradns-provider-test.com", Targets: endpoint.Targets{"1.1.2.2", "192.168.0.24"}, RecordType: "A"}} 368 369 err = provider.ApplyChanges(context.Background(), changes) 370 371 assert.Nil(t, err) 372 373 resp, _ := provider.client.Do("GET", "zones/kubernetes-ultradns-provider-test.com./rrsets/A/kubernetes-ultradns-provider-test.com.", nil, udnssdk.RRSetListDTO{}) 374 assert.Equal(t, resp.Status, "404 Not Found") 375 376 } 377 } 378 379 // Test case to check sbpool creation 380 func TestUltraDNSProvider_newSBPoolObjectCreation(t *testing.T) { 381 mocked := mockUltraDNSRecord{nil} 382 mockedDomain := mockUltraDNSZone{nil} 383 384 provider := &UltraDNSProvider{ 385 client: udnssdk.Client{ 386 RRSets: &mocked, 387 Zone: &mockedDomain, 388 }, 389 } 390 sbpoolRDataList := []udnssdk.SBRDataInfo{} 391 changes := &plan.Changes{} 392 changes.UpdateNew = []*endpoint.Endpoint{{DNSName: "kubernetes-ultradns-provider-test.com.", Targets: endpoint.Targets{"1.1.2.2", "192.168.0.24"}, RecordType: "A", RecordTTL: 100}} 393 changesList := &UltraDNSChanges{ 394 Action: "UPDATE", 395 ResourceRecordSetUltraDNS: udnssdk.RRSet{ 396 RRType: "A", 397 OwnerName: "kubernetes-ultradns-provider-test.com.", 398 RData: []string{"1.1.2.2", "192.168.0.24"}, 399 TTL: 100, 400 }, 401 } 402 403 for range changesList.ResourceRecordSetUltraDNS.RData { 404 405 rrdataInfo := udnssdk.SBRDataInfo{ 406 RunProbes: true, 407 Priority: 1, 408 State: "NORMAL", 409 Threshold: 1, 410 Weight: nil, 411 } 412 sbpoolRDataList = append(sbpoolRDataList, rrdataInfo) 413 } 414 sbPoolObject := udnssdk.SBPoolProfile{ 415 Context: udnssdk.SBPoolSchema, 416 Order: "ROUND_ROBIN", 417 Description: "kubernetes-ultradns-provider-test.com.", 418 MaxActive: 2, 419 MaxServed: 2, 420 RDataInfo: sbpoolRDataList, 421 RunProbes: true, 422 ActOnProbes: true, 423 } 424 425 actualSBPoolObject, _ := provider.newSBPoolObjectCreation(context.Background(), changesList) 426 assert.Equal(t, sbPoolObject, actualSBPoolObject) 427 } 428 429 // Testcase to check fail scenario for multiple AAAA targets 430 func TestUltraDNSProvider_MultipleTargetAAAA(t *testing.T) { 431 _, ok := os.LookupEnv("ULTRADNS_INTEGRATION") 432 if !ok { 433 log.Printf("Skipping test") 434 } else { 435 _ = os.Setenv("ULTRADNS_POOL_TYPE", "sbpool") 436 437 provider, _ := NewUltraDNSProvider(endpoint.NewDomainFilter([]string{"kubernetes-ultradns-provider-test.com"}), false) 438 changes := &plan.Changes{} 439 changes.Create = []*endpoint.Endpoint{ 440 {DNSName: "ttl.kubernetes-ultradns-provider-test.com", Targets: endpoint.Targets{"2001:0db8:85a3:0000:0000:8a2e:0370:7334", "2001:0db8:85a3:0000:0000:8a2e:0370:7335"}, RecordType: "AAAA", RecordTTL: 100}, 441 } 442 err := provider.ApplyChanges(context.Background(), changes) 443 assert.NotNilf(t, err, "We wanted it to fail since multiple AAAA targets are not allowed %s", "formatted") 444 445 resp, _ := provider.client.Do("GET", "zones/kubernetes-ultradns-provider-test.com./rrsets/AAAA/ttl.kubernetes-ultradns-provider-test.com.", nil, udnssdk.RRSetListDTO{}) 446 assert.Equal(t, resp.Status, "404 Not Found") 447 _ = os.Unsetenv("ULTRADNS_POOL_TYPE") 448 } 449 } 450 451 // Testcase to check fail scenario for multiple AAAA targets 452 func TestUltraDNSProvider_MultipleTargetAAAARDPool(t *testing.T) { 453 _, ok := os.LookupEnv("ULTRADNS_INTEGRATION") 454 if !ok { 455 log.Printf("Skipping test") 456 } else { 457 _ = os.Setenv("ULTRADNS_POOL_TYPE", "rdpool") 458 provider, _ := NewUltraDNSProvider(endpoint.NewDomainFilter([]string{"kubernetes-ultradns-provider-test.com"}), false) 459 changes := &plan.Changes{} 460 changes.Create = []*endpoint.Endpoint{ 461 {DNSName: "ttl.kubernetes-ultradns-provider-test.com", Targets: endpoint.Targets{"2001:0db8:85a3:0000:0000:8a2e:0370:7334", "2001:0db8:85a3:0000:0000:8a2e:0370:7335"}, RecordType: "AAAA", RecordTTL: 100}, 462 } 463 err := provider.ApplyChanges(context.Background(), changes) 464 assert.Nilf(t, err, " multiple AAAA targets are allowed when pool is RDPool %s", "formatted") 465 466 resp, _ := provider.client.Do("GET", "zones/kubernetes-ultradns-provider-test.com./rrsets/AAAA/ttl.kubernetes-ultradns-provider-test.com.", nil, udnssdk.RRSetListDTO{}) 467 assert.Equal(t, resp.Status, "200 OK") 468 469 changes = &plan.Changes{} 470 changes.Delete = []*endpoint.Endpoint{{DNSName: "ttl.kubernetes-ultradns-provider-test.com", Targets: endpoint.Targets{"2001:0db8:85a3:0000:0000:8a2e:0370:7334", "2001:0db8:85a3:0000:0000:8a2e:0370:7335"}, RecordType: "AAAA"}} 471 472 err = provider.ApplyChanges(context.Background(), changes) 473 474 assert.Nil(t, err) 475 476 resp, _ = provider.client.Do("GET", "zones/kubernetes-ultradns-provider-test.com./rrsets/A/kubernetes-ultradns-provider-test.com.", nil, udnssdk.RRSetListDTO{}) 477 assert.Equal(t, resp.Status, "404 Not Found") 478 479 } 480 } 481 482 // Test case to check multiple CNAME targets. 483 func TestUltraDNSProvider_MultipleTargetCNAME(t *testing.T) { 484 _, ok := os.LookupEnv("ULTRADNS_INTEGRATION") 485 if !ok { 486 log.Printf("Skipping test") 487 } else { 488 provider, err := NewUltraDNSProvider(endpoint.NewDomainFilter([]string{"kubernetes-ultradns-provider-test.com"}), false) 489 changes := &plan.Changes{} 490 491 changes.Create = []*endpoint.Endpoint{ 492 {DNSName: "ttl.kubernetes-ultradns-provider-test.com", Targets: endpoint.Targets{"nginx.loadbalancer.com.", "nginx1.loadbalancer.com."}, RecordType: "CNAME", RecordTTL: 100}, 493 } 494 err = provider.ApplyChanges(context.Background(), changes) 495 496 assert.NotNilf(t, err, "We wanted it to fail since multiple CNAME targets are not allowed %s", "formatted") 497 498 resp, _ := provider.client.Do("GET", "zones/kubernetes-ultradns-provider-test.com./rrsets/CNAME/kubernetes-ultradns-provider-test.com.", nil, udnssdk.RRSetListDTO{}) 499 assert.Equal(t, resp.Status, "404 Not Found") 500 } 501 } 502 503 // Testing creation of RD Pool 504 func TestUltraDNSProvider_newRDPoolObjectCreation(t *testing.T) { 505 mocked := mockUltraDNSRecord{nil} 506 mockedDomain := mockUltraDNSZone{nil} 507 508 provider := &UltraDNSProvider{ 509 client: udnssdk.Client{ 510 RRSets: &mocked, 511 Zone: &mockedDomain, 512 }, 513 } 514 changes := &plan.Changes{} 515 changes.UpdateNew = []*endpoint.Endpoint{{DNSName: "kubernetes-ultradns-provider-test.com.", Targets: endpoint.Targets{"1.1.2.2", "192.168.0.24"}, RecordType: "A", RecordTTL: 100}} 516 changesList := &UltraDNSChanges{ 517 Action: "UPDATE", 518 ResourceRecordSetUltraDNS: udnssdk.RRSet{ 519 RRType: "A", 520 OwnerName: "kubernetes-ultradns-provider-test.com.", 521 RData: []string{"1.1.2.2", "192.168.0.24"}, 522 TTL: 100, 523 }, 524 } 525 rdPoolObject := udnssdk.RDPoolProfile{ 526 Context: udnssdk.RDPoolSchema, 527 Order: "ROUND_ROBIN", 528 Description: "kubernetes-ultradns-provider-test.com.", 529 } 530 531 actualRDPoolObject, _ := provider.newRDPoolObjectCreation(context.Background(), changesList) 532 assert.Equal(t, rdPoolObject, actualRDPoolObject) 533 } 534 535 // Testing Failure scenarios over NewUltraDNS Provider 536 func TestNewUltraDNSProvider_FailCases(t *testing.T) { 537 _ = os.Setenv("ULTRADNS_USERNAME", "") 538 _ = os.Setenv("ULTRADNS_PASSWORD", "") 539 _ = os.Setenv("ULTRADNS_BASEURL", "") 540 _ = os.Setenv("ULTRADNS_ACCOUNTNAME", "") 541 _ = os.Setenv("ULTRADNS_POOL_TYPE", "xyz") 542 _, err := NewUltraDNSProvider(endpoint.NewDomainFilter([]string{"test-ultradns-provider.com"}), true) 543 assert.NotNilf(t, err, "Pool Type other than given type not working %s", "formatted") 544 545 _ = os.Setenv("ULTRADNS_USERNAME", "") 546 _ = os.Setenv("ULTRADNS_PASSWORD", "") 547 _ = os.Setenv("ULTRADNS_BASEURL", "") 548 _ = os.Setenv("ULTRADNS_ACCOUNTNAME", "") 549 _ = os.Setenv("ULTRADNS_ENABLE_PROBING", "adefg") 550 _, err = NewUltraDNSProvider(endpoint.NewDomainFilter([]string{"test-ultradns-provider.com"}), true) 551 assert.NotNilf(t, err, "Probe value other than given values not working %s", "formatted") 552 553 _ = os.Setenv("ULTRADNS_USERNAME", "") 554 _ = os.Setenv("ULTRADNS_PASSWORD", "") 555 _ = os.Setenv("ULTRADNS_BASEURL", "") 556 _ = os.Setenv("ULTRADNS_ACCOUNTNAME", "") 557 _ = os.Setenv("ULTRADNS_ENABLE_ACTONPROBE", "adefg") 558 _, err = NewUltraDNSProvider(endpoint.NewDomainFilter([]string{"test-ultradns-provider.com"}), true) 559 assert.NotNilf(t, err, "ActOnProbe value other than given values not working %s", "formatted") 560 561 _ = os.Setenv("ULTRADNS_USERNAME", "") 562 _ = os.Setenv("ULTRADNS_BASEURL", "") 563 _ = os.Unsetenv("ULTRADNS_PASSWORD") 564 _ = os.Setenv("ULTRADNS_ACCOUNTNAME", "") 565 _, err = NewUltraDNSProvider(endpoint.NewDomainFilter([]string{"test-ultradns-provider.com"}), true) 566 assert.NotNilf(t, err, "Expected to give error if password is not set %s", "formatted") 567 568 _ = os.Setenv("ULTRADNS_USERNAME", "") 569 _ = os.Setenv("ULTRADNS_PASSWORD", "") 570 _ = os.Unsetenv("ULTRADNS_BASEURL") 571 _ = os.Setenv("ULTRADNS_ACCOUNTNAME", "") 572 _, err = NewUltraDNSProvider(endpoint.NewDomainFilter([]string{"test-ultradns-provider.com"}), true) 573 assert.NotNilf(t, err, "Expected to give error if baseurl is not set %s", "formatted") 574 575 _ = os.Setenv("ULTRADNS_USERNAME", "") 576 _ = os.Setenv("ULTRADNS_BASEURL", "") 577 _ = os.Setenv("ULTRADNS_PASSWORD", "") 578 _ = os.Unsetenv("ULTRADNS_ACCOUNTNAME") 579 _ = os.Unsetenv("ULTRADNS_ENABLE_ACTONPROBE") 580 _ = os.Unsetenv("ULTRADNS_ENABLE_PROBING") 581 _ = os.Unsetenv("ULTRADNS_POOL_TYPE") 582 _, accounterr := NewUltraDNSProvider(endpoint.NewDomainFilter([]string{"test-ultradns-provider.com"}), true) 583 assert.Nil(t, accounterr) 584 } 585 586 // Testing success scenarios for newly introduced environment variables 587 func TestNewUltraDNSProvider_NewEnvVariableSuccessCases(t *testing.T) { 588 _ = os.Setenv("ULTRADNS_USERNAME", "") 589 _ = os.Setenv("ULTRADNS_PASSWORD", "") 590 _ = os.Setenv("ULTRADNS_BASEURL", "") 591 _ = os.Setenv("ULTRADNS_ACCOUNTNAME", "") 592 _ = os.Setenv("ULTRADNS_POOL_TYPE", "rdpool") 593 _, err := NewUltraDNSProvider(endpoint.NewDomainFilter([]string{"test-ultradns-provider.com"}), true) 594 assert.Nilf(t, err, "Pool Type not working in proper scenario %s", "formatted") 595 596 _ = os.Setenv("ULTRADNS_USERNAME", "") 597 _ = os.Setenv("ULTRADNS_PASSWORD", "") 598 _ = os.Setenv("ULTRADNS_BASEURL", "") 599 _ = os.Setenv("ULTRADNS_ACCOUNTNAME", "") 600 _ = os.Setenv("ULTRADNS_ENABLE_PROBING", "false") 601 _, err1 := NewUltraDNSProvider(endpoint.NewDomainFilter([]string{"test-ultradns-provider.com"}), true) 602 assert.Nilf(t, err1, "Probe given value is not working %s", "formatted") 603 604 _ = os.Setenv("ULTRADNS_USERNAME", "") 605 _ = os.Setenv("ULTRADNS_PASSWORD", "") 606 _ = os.Setenv("ULTRADNS_BASEURL", "") 607 _ = os.Setenv("ULTRADNS_ACCOUNTNAME", "") 608 _ = os.Setenv("ULTRADNS_ENABLE_ACTONPROBE", "true") 609 _, err2 := NewUltraDNSProvider(endpoint.NewDomainFilter([]string{"test-ultradns-provider.com"}), true) 610 assert.Nilf(t, err2, "ActOnProbe given value is not working %s", "formatted") 611 } 612 613 // Base64 Bad string decoding scenario 614 func TestNewUltraDNSProvider_Base64DecodeFailcase(t *testing.T) { 615 _ = os.Setenv("ULTRADNS_USERNAME", "") 616 _ = os.Setenv("ULTRADNS_PASSWORD", "12345") 617 _ = os.Setenv("ULTRADNS_BASEURL", "") 618 _ = os.Setenv("ULTRADNS_ACCOUNTNAME", "") 619 _ = os.Setenv("ULTRADNS_ENABLE_ACTONPROBE", "true") 620 _, err := NewUltraDNSProvider(endpoint.NewDomainFilter([]string{"test-ultradns-provider.com"}), true) 621 assert.NotNilf(t, err, "Base64 decode should fail in this case %s", "formatted") 622 } 623 624 func TestUltraDNSProvider_PoolConversionCase(t *testing.T) { 625 _, ok := os.LookupEnv("ULTRADNS_INTEGRATION") 626 if !ok { 627 log.Printf("Skipping test") 628 } else { 629 // Creating SBPool Record 630 _ = os.Setenv("ULTRADNS_POOL_TYPE", "sbpool") 631 provider, _ := NewUltraDNSProvider(endpoint.NewDomainFilter([]string{"kubernetes-ultradns-provider-test.com"}), false) 632 changes := &plan.Changes{} 633 changes.Create = []*endpoint.Endpoint{{DNSName: "ttl.kubernetes-ultradns-provider-test.com", Targets: endpoint.Targets{"1.1.1.1", "1.2.3.4"}, RecordType: "A", RecordTTL: 100}} 634 err := provider.ApplyChanges(context.Background(), changes) 635 assert.Nilf(t, err, " multiple A record creation with SBPool %s", "formatted") 636 637 resp, _ := provider.client.Do("GET", "zones/kubernetes-ultradns-provider-test.com./rrsets/A/ttl.kubernetes-ultradns-provider-test.com.", nil, udnssdk.RRSetListDTO{}) 638 assert.Equal(t, resp.Status, "200 OK") 639 640 // Converting to RD Pool 641 _ = os.Setenv("ULTRADNS_POOL_TYPE", "rdpool") 642 provider, _ = NewUltraDNSProvider(endpoint.NewDomainFilter([]string{"kubernetes-ultradns-provider-test.com"}), false) 643 changes = &plan.Changes{} 644 changes.UpdateNew = []*endpoint.Endpoint{{DNSName: "ttl.kubernetes-ultradns-provider-test.com", Targets: endpoint.Targets{"1.1.1.1", "1.2.3.5"}, RecordType: "A"}} 645 err = provider.ApplyChanges(context.Background(), changes) 646 assert.Nil(t, err) 647 resp, _ = provider.client.Do("GET", "zones/kubernetes-ultradns-provider-test.com./rrsets/A/ttl.kubernetes-ultradns-provider-test.com.", nil, udnssdk.RRSetListDTO{}) 648 assert.Equal(t, resp.Status, "200 OK") 649 650 // Converting back to SB Pool 651 _ = os.Setenv("ULTRADNS_POOL_TYPE", "sbpool") 652 provider, _ = NewUltraDNSProvider(endpoint.NewDomainFilter([]string{"kubernetes-ultradns-provider-test.com"}), false) 653 changes = &plan.Changes{} 654 changes.UpdateNew = []*endpoint.Endpoint{{DNSName: "ttl.kubernetes-ultradns-provider-test.com", Targets: endpoint.Targets{"1.1.1.1", "1.2.3.4"}, RecordType: "A"}} 655 err = provider.ApplyChanges(context.Background(), changes) 656 assert.Nil(t, err) 657 resp, _ = provider.client.Do("GET", "zones/kubernetes-ultradns-provider-test.com./rrsets/A/ttl.kubernetes-ultradns-provider-test.com.", nil, udnssdk.RRSetListDTO{}) 658 assert.Equal(t, resp.Status, "200 OK") 659 660 // Deleting Record 661 changes = &plan.Changes{} 662 changes.Delete = []*endpoint.Endpoint{{DNSName: "ttl.kubernetes-ultradns-provider-test.com", Targets: endpoint.Targets{"1.1.1.1", "1.2.3.4"}, RecordType: "A"}} 663 err = provider.ApplyChanges(context.Background(), changes) 664 assert.Nil(t, err) 665 resp, _ = provider.client.Do("GET", "zones/kubernetes-ultradns-provider-test.com./rrsets/A/kubernetes-ultradns-provider-test.com.", nil, udnssdk.RRSetListDTO{}) 666 assert.Equal(t, resp.Status, "404 Not Found") 667 } 668 } 669 670 func TestUltraDNSProvider_DomainFilter(t *testing.T) { 671 _, ok := os.LookupEnv("ULTRADNS_INTEGRATION") 672 if !ok { 673 log.Printf("Skipping test") 674 } else { 675 provider, _ := NewUltraDNSProvider(endpoint.NewDomainFilter([]string{"kubernetes-ultradns-provider-test.com", "kubernetes-ultradns-provider-test.com"}), true) 676 zones, err := provider.Zones(context.Background()) 677 assert.Equal(t, zones[0].Properties.Name, "kubernetes-ultradns-provider-test.com.") 678 assert.Equal(t, zones[1].Properties.Name, "kubernetes-ultradns-provider-test.com.") 679 assert.Nilf(t, err, " Multiple domain filter failed %s", "formatted") 680 681 provider, _ = NewUltraDNSProvider(endpoint.NewDomainFilter([]string{}), true) 682 zones, err = provider.Zones(context.Background()) 683 assert.Nilf(t, err, " Multiple domain filter failed %s", "formatted") 684 685 } 686 } 687 688 func TestUltraDNSProvider_DomainFiltersZonesFailCase(t *testing.T) { 689 _, ok := os.LookupEnv("ULTRADNS_INTEGRATION") 690 if !ok { 691 log.Printf("Skipping test") 692 } else { 693 provider, _ := NewUltraDNSProvider(endpoint.NewDomainFilter([]string{"kubernetes-ultradns-provider-test.com", "kubernetes-uldsvdsvadvvdsvadvstradns-provider-test.com"}), true) 694 _, err := provider.Zones(context.Background()) 695 assert.NotNilf(t, err, " Multiple domain filter failed %s", "formatted") 696 } 697 } 698 699 // zones function with domain filter test scenario 700 func TestUltraDNSProvider_DomainFilterZonesMocked(t *testing.T) { 701 mocked := mockUltraDNSZone{} 702 provider := &UltraDNSProvider{ 703 client: udnssdk.Client{ 704 Zone: &mocked, 705 }, 706 domainFilter: endpoint.NewDomainFilter([]string{"test-ultradns-provider.com."}), 707 } 708 709 zoneKey := &udnssdk.ZoneKey{ 710 Zone: "test-ultradns-provider.com.", 711 AccountName: "", 712 } 713 714 // When AccountName not given 715 expected, _, _, err := provider.client.Zone.SelectWithOffsetWithLimit(zoneKey, 0, 1000) 716 assert.Nil(t, err) 717 zones, err := provider.Zones(context.Background()) 718 assert.Nil(t, err) 719 assert.Equal(t, reflect.DeepEqual(expected, zones), true) 720 accountName = "teamrest" 721 // When AccountName is set 722 provider = &UltraDNSProvider{ 723 client: udnssdk.Client{ 724 Zone: &mocked, 725 }, 726 domainFilter: endpoint.NewDomainFilter([]string{"test-ultradns-provider.com."}), 727 } 728 729 zoneKey = &udnssdk.ZoneKey{ 730 Zone: "test-ultradns-provider.com.", 731 AccountName: "teamrest", 732 } 733 734 expected, _, _, err = provider.client.Zone.SelectWithOffsetWithLimit(zoneKey, 0, 1000) 735 assert.Nil(t, err) 736 zones, err = provider.Zones(context.Background()) 737 assert.Nil(t, err) 738 assert.Equal(t, reflect.DeepEqual(expected, zones), true) 739 740 // When zone is not given but account is provided 741 provider = &UltraDNSProvider{ 742 client: udnssdk.Client{ 743 Zone: &mocked, 744 }, 745 } 746 747 zoneKey = &udnssdk.ZoneKey{ 748 AccountName: "teamrest", 749 } 750 751 expected, _, _, err = provider.client.Zone.SelectWithOffsetWithLimit(zoneKey, 0, 1000) 752 assert.Nil(t, err) 753 zones, err = provider.Zones(context.Background()) 754 assert.Nil(t, err) 755 assert.Equal(t, reflect.DeepEqual(expected, zones), true) 756 }