sigs.k8s.io/external-dns@v0.14.1/provider/tencentcloud/cloudapi/mockapi.go (about)

     1  /*
     2  Copyright 2022 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 cloudapi
    18  
    19  import (
    20  	"math/rand"
    21  
    22  	"github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common"
    23  	dnspod "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/dnspod/v20210323"
    24  	privatedns "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/privatedns/v20201028"
    25  )
    26  
    27  type mockAPIService struct {
    28  	privateZones       []*privatedns.PrivateZone
    29  	privateZoneRecords map[string][]*privatedns.PrivateZoneRecord
    30  
    31  	dnspodDomains []*dnspod.DomainListItem
    32  	dnspodRecords map[string][]*dnspod.RecordListItem
    33  }
    34  
    35  func NewMockService(privateZones []*privatedns.PrivateZone, privateZoneRecords map[string][]*privatedns.PrivateZoneRecord, dnspodDomains []*dnspod.DomainListItem, dnspodRecords map[string][]*dnspod.RecordListItem) *mockAPIService {
    36  	return &mockAPIService{
    37  		privateZones:       privateZones,
    38  		privateZoneRecords: privateZoneRecords,
    39  		dnspodDomains:      dnspodDomains,
    40  		dnspodRecords:      dnspodRecords,
    41  	}
    42  }
    43  
    44  ////////////////////////////////////////////////////////////////
    45  // PrivateDns API
    46  ////////////////////////////////////////////////////////////////
    47  
    48  func (api *mockAPIService) CreatePrivateZoneRecord(request *privatedns.CreatePrivateZoneRecordRequest) (response *privatedns.CreatePrivateZoneRecordResponse, err error) {
    49  	randomRecordId := RandStringRunes(8)
    50  	if _, exist := api.privateZoneRecords[*request.ZoneId]; !exist {
    51  		api.privateZoneRecords[*request.ZoneId] = make([]*privatedns.PrivateZoneRecord, 0)
    52  	}
    53  	if request.TTL == nil {
    54  		request.TTL = common.Int64Ptr(300)
    55  	}
    56  	api.privateZoneRecords[*request.ZoneId] = append(api.privateZoneRecords[*request.ZoneId], &privatedns.PrivateZoneRecord{
    57  		RecordId:    common.StringPtr(randomRecordId),
    58  		ZoneId:      request.ZoneId,
    59  		SubDomain:   request.SubDomain,
    60  		RecordType:  request.RecordType,
    61  		RecordValue: request.RecordValue,
    62  		TTL:         request.TTL,
    63  	})
    64  	return response, nil
    65  }
    66  
    67  func (api *mockAPIService) DeletePrivateZoneRecord(request *privatedns.DeletePrivateZoneRecordRequest) (response *privatedns.DeletePrivateZoneRecordResponse, err error) {
    68  	result := make([]*privatedns.PrivateZoneRecord, 0)
    69  	if _, exist := api.privateZoneRecords[*request.ZoneId]; !exist {
    70  		return response, nil
    71  	}
    72  	for _, privateZoneRecord := range api.privateZoneRecords[*request.ZoneId] {
    73  		deleteflag := false
    74  		if request.RecordIdSet != nil && len(request.RecordIdSet) != 0 {
    75  			for _, recordId := range request.RecordIdSet {
    76  				if *privateZoneRecord.RecordId == *recordId {
    77  					deleteflag = true
    78  					break
    79  				}
    80  			}
    81  		}
    82  		if request.RecordId != nil && *request.RecordId == *privateZoneRecord.RecordId {
    83  			deleteflag = true
    84  		}
    85  		if !deleteflag {
    86  			result = append(result, privateZoneRecord)
    87  		}
    88  	}
    89  	api.privateZoneRecords[*request.ZoneId] = result
    90  	return response, nil
    91  }
    92  
    93  func (api *mockAPIService) ModifyPrivateZoneRecord(request *privatedns.ModifyPrivateZoneRecordRequest) (response *privatedns.ModifyPrivateZoneRecordResponse, err error) {
    94  	if _, exist := api.privateZoneRecords[*request.ZoneId]; !exist {
    95  		return response, nil
    96  	}
    97  	for _, privateZoneRecord := range api.privateZoneRecords[*request.ZoneId] {
    98  		if *privateZoneRecord.RecordId != *request.RecordId {
    99  			continue
   100  		}
   101  		privateZoneRecord.ZoneId = request.ZoneId
   102  		privateZoneRecord.SubDomain = request.SubDomain
   103  		privateZoneRecord.RecordType = request.RecordType
   104  		privateZoneRecord.RecordValue = request.RecordValue
   105  		privateZoneRecord.TTL = request.TTL
   106  	}
   107  	return response, nil
   108  }
   109  
   110  func (api *mockAPIService) DescribePrivateZoneList(request *privatedns.DescribePrivateZoneListRequest) (response *privatedns.DescribePrivateZoneListResponse, err error) {
   111  	response = privatedns.NewDescribePrivateZoneListResponse()
   112  	response.Response = &privatedns.DescribePrivateZoneListResponseParams{
   113  		TotalCount:     common.Int64Ptr(int64(len(api.privateZones))),
   114  		PrivateZoneSet: api.privateZones,
   115  	}
   116  	return response, nil
   117  }
   118  
   119  func (api *mockAPIService) DescribePrivateZoneRecordList(request *privatedns.DescribePrivateZoneRecordListRequest) (response *privatedns.DescribePrivateZoneRecordListResponse, err error) {
   120  	response = privatedns.NewDescribePrivateZoneRecordListResponse()
   121  	response.Response = &privatedns.DescribePrivateZoneRecordListResponseParams{}
   122  	if _, exist := api.privateZoneRecords[*request.ZoneId]; !exist {
   123  		response.Response.TotalCount = common.Int64Ptr(0)
   124  		response.Response.RecordSet = make([]*privatedns.PrivateZoneRecord, 0)
   125  		return response, nil
   126  	}
   127  	response.Response.TotalCount = common.Int64Ptr(int64(len(api.privateZoneRecords[*request.ZoneId])))
   128  	response.Response.RecordSet = api.privateZoneRecords[*request.ZoneId]
   129  	return response, nil
   130  }
   131  
   132  ////////////////////////////////////////////////////////////////
   133  // DnsPod API
   134  ////////////////////////////////////////////////////////////////
   135  
   136  func (api *mockAPIService) DescribeDomainList(request *dnspod.DescribeDomainListRequest) (response *dnspod.DescribeDomainListResponse, err error) {
   137  	response = dnspod.NewDescribeDomainListResponse()
   138  	response.Response = &dnspod.DescribeDomainListResponseParams{
   139  		DomainCountInfo: &dnspod.DomainCountInfo{
   140  			AllTotal: common.Uint64Ptr(uint64(len(api.dnspodDomains))),
   141  		},
   142  		DomainList: api.dnspodDomains,
   143  	}
   144  	response.Response.DomainList = api.dnspodDomains
   145  	response.Response.DomainCountInfo = &dnspod.DomainCountInfo{
   146  		AllTotal: common.Uint64Ptr(uint64(len(api.dnspodDomains))),
   147  	}
   148  	return response, nil
   149  }
   150  
   151  func (api *mockAPIService) DescribeRecordList(request *dnspod.DescribeRecordListRequest) (response *dnspod.DescribeRecordListResponse, err error) {
   152  	response = dnspod.NewDescribeRecordListResponse()
   153  	response.Response = &dnspod.DescribeRecordListResponseParams{}
   154  	if _, exist := api.dnspodRecords[*request.Domain]; !exist {
   155  		response.Response.RecordList = make([]*dnspod.RecordListItem, 0)
   156  		response.Response.RecordCountInfo = &dnspod.RecordCountInfo{
   157  			TotalCount: common.Uint64Ptr(uint64(0)),
   158  		}
   159  		return response, nil
   160  	}
   161  	response.Response.RecordList = api.dnspodRecords[*request.Domain]
   162  	response.Response.RecordCountInfo = &dnspod.RecordCountInfo{
   163  		TotalCount: common.Uint64Ptr(uint64(len(api.dnspodRecords[*request.Domain]))),
   164  	}
   165  	return response, nil
   166  }
   167  
   168  func (api *mockAPIService) CreateRecord(request *dnspod.CreateRecordRequest) (response *dnspod.CreateRecordResponse, err error) {
   169  	randomRecordId := RandUint64()
   170  	if _, exist := api.dnspodRecords[*request.Domain]; !exist {
   171  		api.dnspodRecords[*request.Domain] = make([]*dnspod.RecordListItem, 0)
   172  	}
   173  	if request.TTL == nil {
   174  		request.TTL = common.Uint64Ptr(300)
   175  	}
   176  	api.dnspodRecords[*request.Domain] = append(api.dnspodRecords[*request.Domain], &dnspod.RecordListItem{
   177  		RecordId: common.Uint64Ptr(randomRecordId),
   178  		Value:    request.Value,
   179  		TTL:      request.TTL,
   180  		Name:     request.SubDomain,
   181  		Line:     request.RecordLine,
   182  		LineId:   request.RecordLineId,
   183  		Type:     request.RecordType,
   184  	})
   185  	return response, nil
   186  }
   187  
   188  func (api *mockAPIService) DeleteRecord(request *dnspod.DeleteRecordRequest) (response *dnspod.DeleteRecordResponse, err error) {
   189  	result := make([]*dnspod.RecordListItem, 0)
   190  	if _, exist := api.dnspodRecords[*request.Domain]; !exist {
   191  		return response, nil
   192  	}
   193  	for _, zoneRecord := range api.dnspodRecords[*request.Domain] {
   194  		deleteflag := false
   195  		if request.RecordId != nil && *request.RecordId == *zoneRecord.RecordId {
   196  			deleteflag = true
   197  		}
   198  		if !deleteflag {
   199  			result = append(result, zoneRecord)
   200  		}
   201  	}
   202  	api.dnspodRecords[*request.Domain] = result
   203  	return response, nil
   204  }
   205  
   206  func (api *mockAPIService) ModifyRecord(request *dnspod.ModifyRecordRequest) (response *dnspod.ModifyRecordResponse, err error) {
   207  	if _, exist := api.dnspodRecords[*request.Domain]; !exist {
   208  		return response, nil
   209  	}
   210  	for _, zoneRecord := range api.dnspodRecords[*request.Domain] {
   211  		if *zoneRecord.RecordId != *request.RecordId {
   212  			continue
   213  		}
   214  		zoneRecord.Type = request.RecordType
   215  		zoneRecord.Name = request.SubDomain
   216  		zoneRecord.Value = request.Value
   217  		zoneRecord.TTL = request.TTL
   218  	}
   219  	return response, nil
   220  }
   221  
   222  var letterRunes = []byte("abcdefghijklmnopqrstuvwxyz")
   223  
   224  func RandStringRunes(n int) string {
   225  	b := make([]byte, n)
   226  	for i := range b {
   227  		b[i] = letterRunes[rand.Intn(len(letterRunes))]
   228  	}
   229  	return string(b)
   230  }
   231  
   232  func RandUint64() uint64 {
   233  	return rand.Uint64()
   234  }