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  }