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  }