sigs.k8s.io/external-dns@v0.14.1/provider/vultr/vultr_test.go (about) 1 /* 2 Copyright 2020 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 vultr 18 19 import ( 20 "context" 21 "os" 22 "reflect" 23 "strings" 24 "testing" 25 26 "github.com/stretchr/testify/assert" 27 "github.com/vultr/govultr/v2" 28 29 "sigs.k8s.io/external-dns/endpoint" 30 "sigs.k8s.io/external-dns/plan" 31 ) 32 33 type mockVultrDomain struct { 34 client *govultr.Client 35 } 36 37 func (m mockVultrDomain) Create(ctx context.Context, domainReq *govultr.DomainReq) (*govultr.Domain, error) { 38 return nil, nil 39 } 40 41 func (m mockVultrDomain) Get(ctx context.Context, domain string) (*govultr.Domain, error) { 42 return nil, nil 43 } 44 45 func (m mockVultrDomain) Update(ctx context.Context, domain, dnsSec string) error { 46 return nil 47 } 48 49 func (m mockVultrDomain) Delete(ctx context.Context, domain string) error { 50 return nil 51 } 52 53 func (m mockVultrDomain) List(ctx context.Context, options *govultr.ListOptions) ([]govultr.Domain, *govultr.Meta, error) { 54 return []govultr.Domain{{Domain: "test.com", DateCreated: "1234"}}, &govultr.Meta{ 55 Total: 1, 56 Links: &govultr.Links{ 57 Next: "", 58 Prev: "", 59 }, 60 }, nil 61 } 62 63 func (m mockVultrDomain) GetSoa(ctx context.Context, domain string) (*govultr.Soa, error) { 64 return nil, nil 65 } 66 67 func (m mockVultrDomain) UpdateSoa(ctx context.Context, domain string, soaReq *govultr.Soa) error { 68 return nil 69 } 70 71 func (m mockVultrDomain) GetDNSSec(ctx context.Context, domain string) ([]string, error) { 72 return nil, nil 73 } 74 75 type mockVultrRecord struct { 76 client *govultr.Client 77 } 78 79 func (m mockVultrRecord) Create(ctx context.Context, domain string, domainRecordReq *govultr.DomainRecordReq) (*govultr.DomainRecord, error) { 80 return nil, nil 81 } 82 83 func (m mockVultrRecord) Get(ctx context.Context, domain, recordID string) (*govultr.DomainRecord, error) { 84 return nil, nil 85 } 86 87 func (m mockVultrRecord) Update(ctx context.Context, domain, recordID string, domainRecordReq *govultr.DomainRecordReq) error { 88 return nil 89 } 90 91 func (m mockVultrRecord) Delete(ctx context.Context, domain, recordID string) error { 92 return nil 93 } 94 95 func (m mockVultrRecord) List(ctx context.Context, domain string, options *govultr.ListOptions) ([]govultr.DomainRecord, *govultr.Meta, error) { 96 return []govultr.DomainRecord{{ID: "123", Type: "A", Name: "test", Data: "192.168.1.1", TTL: 300}}, &govultr.Meta{ 97 Total: 1, 98 Links: &govultr.Links{ 99 Next: "", 100 Prev: "", 101 }, 102 }, nil 103 } 104 105 func TestNewVultrProvider(t *testing.T) { 106 _ = os.Setenv("VULTR_API_KEY", "") 107 _, err := NewVultrProvider(context.Background(), endpoint.NewDomainFilter([]string{"test.vultr.com"}), true) 108 if err != nil { 109 t.Errorf("failed : %s", err) 110 } 111 112 _ = os.Unsetenv("VULTR_API_KEY") 113 _, err = NewVultrProvider(context.Background(), endpoint.NewDomainFilter([]string{"test.vultr.com"}), true) 114 if err == nil { 115 t.Errorf("expected to fail") 116 } 117 } 118 119 func TestVultrProvider_Zones(t *testing.T) { 120 mocked := mockVultrDomain{nil} 121 provider := &VultrProvider{ 122 client: govultr.Client{ 123 Domain: &mocked, 124 }, 125 } 126 127 expected, _, err := provider.client.Domain.List(context.Background(), nil) 128 if err != nil { 129 t.Fatal(err) 130 } 131 132 provider.Zones(context.Background()) 133 zones, err := provider.Zones(context.Background()) 134 if err != nil { 135 t.Fatal(err) 136 } 137 138 if !reflect.DeepEqual(expected, zones) { 139 t.Fatal(err) 140 } 141 } 142 143 func TestVultrProvider_Records(t *testing.T) { 144 mocked := mockVultrRecord{nil} 145 mockedDomain := mockVultrDomain{nil} 146 147 provider := &VultrProvider{ 148 client: govultr.Client{ 149 DomainRecord: &mocked, 150 Domain: &mockedDomain, 151 }, 152 } 153 154 expected, _, _ := provider.client.DomainRecord.List(context.Background(), "test.com", nil) 155 records, err := provider.Records(context.Background()) 156 if err != nil { 157 t.Fatal(err) 158 } 159 160 for _, v := range records { 161 assert.Equal(t, strings.TrimSuffix(v.DNSName, ".test.com"), expected[0].Name) 162 assert.Equal(t, v.RecordType, expected[0].Type) 163 assert.Equal(t, int(v.RecordTTL), expected[0].TTL) 164 } 165 } 166 167 func TestVultrProvider_ApplyChanges(t *testing.T) { 168 changes := &plan.Changes{} 169 mocked := mockVultrRecord{nil} 170 mockedDomain := mockVultrDomain{nil} 171 172 provider := &VultrProvider{ 173 client: govultr.Client{ 174 DomainRecord: &mocked, 175 Domain: &mockedDomain, 176 }, 177 } 178 179 changes.Create = []*endpoint.Endpoint{ 180 {DNSName: "test.com", Targets: endpoint.Targets{"target"}}, 181 {DNSName: "ttl.test.com", Targets: endpoint.Targets{"target"}, RecordTTL: 100}, 182 } 183 184 changes.UpdateNew = []*endpoint.Endpoint{{DNSName: "test.test.com", Targets: endpoint.Targets{"target-new"}, RecordType: "A", RecordTTL: 100}} 185 changes.Delete = []*endpoint.Endpoint{{DNSName: "test.test.com", Targets: endpoint.Targets{"target"}, RecordType: "A"}} 186 err := provider.ApplyChanges(context.Background(), changes) 187 if err != nil { 188 t.Errorf("should not fail, %s", err) 189 } 190 } 191 192 func TestVultrProvider_getRecordID(t *testing.T) { 193 mocked := mockVultrRecord{nil} 194 mockedDomain := mockVultrDomain{nil} 195 196 provider := &VultrProvider{ 197 client: govultr.Client{ 198 DomainRecord: &mocked, 199 Domain: &mockedDomain, 200 }, 201 } 202 203 record := &govultr.DomainRecordReq{ 204 Type: "A", 205 Name: "test.test.com", 206 } 207 id, err := provider.getRecordID(context.Background(), "test.com", record) 208 if err != nil { 209 t.Fatal(err) 210 } 211 212 assert.Equal(t, id, "123") 213 }