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 }