object_manager.go raw
1 package ibclient
2
3 import (
4 "encoding/json"
5 "errors"
6 "fmt"
7 "regexp"
8 "strings"
9 )
10
11 // Compile-time interface checks
12 var _ IBObjectManager = new(ObjectManager)
13
14 type IBObjectManager interface {
15 GetDNSView(name string) (*View, error)
16 AllocateIP(netview string, cidr string, ipAddr string, isIPv6 bool, macOrDuid string, name string, comment string, eas EA, clients string, agentCircuitId string, agentRemoteId string, clientIdentifierPrependZero *bool, dhcpClientIdentifier string, disable bool, Options []*Dhcpoption, useOptions bool) (*FixedAddress, error)
17 AllocateNextAvailableIp(name string, objectType string, objectParams map[string]string, params map[string][]string, useEaInheritance bool, ea EA, comment string, disable bool, n *int, ipAddrType string,
18 enableDns bool, enableDhcp bool, macAddr string, duid string, networkView string, dnsView string, useTtl bool, ttl uint32, aliases []string) (interface{}, error)
19 AllocateNetwork(netview string, cidr string, isIPv6 bool, prefixLen uint, comment string, eas EA) (network *Network, err error)
20 AllocateNetworkByEA(netview string, isIPv6 bool, comment string, eas EA, eaMap map[string]string, prefixLen uint, object string) (network *Network, err error)
21 AllocateNetworkContainer(netview string, cidr string, isIPv6 bool, prefixLen uint, comment string, eas EA) (netContainer *NetworkContainer, err error)
22 AllocateNetworkContainerByEA(netview string, isIPv6 bool, comment string, eas EA, eaMap map[string]string, prefixLen uint) (*NetworkContainer, error)
23 CreateARecord(netView string, dnsView string, name string, cidr string, ipAddr string, ttl uint32, useTTL bool, comment string, ea EA) (*RecordA, error)
24 CreateAAAARecord(netView string, dnsView string, recordName string, cidr string, ipAddr string, useTtl bool, ttl uint32, comment string, eas EA) (*RecordAAAA, error)
25 CreateIpv4SharedNetwork(name string, networks []string, networkView string, eas EA, comment string, disable bool, useOptions bool, options []*Dhcpoption) (*SharedNetwork, error)
26 CreateAliasRecord(name string, dnsView string, targetName string, targetType string, comment string, disable bool, ea EA, ttl uint32, useTtl bool) (*RecordAlias, error)
27 CreateDtcPool(comment string, name string, lbPreferredMethod string, lbDynamicRatioPreferred map[string]interface{}, servers []*DtcServerLink, monitors []Monitor, lbPreferredTopology *string, lbAlternateMethod string, lbAlternateTopology *string, lbDynamicRatioAlternate map[string]interface{}, eas EA, autoConsolidatedMonitors bool, userMonitors []map[string]interface{}, availability string, ttl uint32, useTTL bool, disable bool, quorum uint32) (*DtcPool, error)
28 CreateDtcServer(comment string, name string, host string, autoCreateHostRecord bool, disable bool, ea EA, monitors []map[string]interface{}, sniHostname string, useSniHostname bool) (*DtcServer, error)
29 CreateNSRecord(name string, nameServer string, dnsView string, addresses []*ZoneNameServer, msDelegationName string) (*RecordNS, error)
30 CreateZoneAuth(fqdn string, ea EA) (*ZoneAuth, error)
31 CreateCNAMERecord(dnsview string, canonical string, recordname string, useTtl bool, ttl uint32, comment string, eas EA) (*RecordCNAME, error)
32 CreateDefaultNetviews(globalNetview string, localNetview string) (globalNetviewRef string, localNetviewRef string, err error)
33 CreateDtcLbdn(name string, authZones []AuthZonesLink, comment string, disable bool, autoConsolidatedMonitors bool, ea EA,
34 lbMethod string, patterns []string, persistence uint32, pools []*DtcPoolLink, priority uint32, topology *string, types []string, ttl uint32, usettl bool) (*DtcLbdn, error)
35 CreateZoneForward(comment string, disable bool, eas EA, forwardTo NullableNameServers, forwardersOnly bool, forwardingServers *NullableForwardingServers, fqdn string, nsGroup string, view string, zoneFormat string, externalNsGroup string) (*ZoneForward, error)
36 CreateEADefinition(eadef EADefinition) (*EADefinition, error)
37 CreateHostRecord(enabledns bool, enabledhcp bool, recordName string, netview string, dnsview string, ipv4cidr string, ipv6cidr string, ipv4Addr string, ipv6Addr string, macAddr string, duid string, useTtl bool, ttl uint32, comment string, eas EA, aliases []string, disable bool) (*HostRecord, error)
38 CreateMXRecord(dnsView string, fqdn string, mx string, preference uint32, ttl uint32, useTtl bool, comment string, eas EA) (*RecordMX, error)
39 CreateNetwork(netview string, cidr string, isIPv6 bool, comment string, eas EA) (*Network, error)
40 CreateNetworkContainer(netview string, cidr string, isIPv6 bool, comment string, eas EA) (*NetworkContainer, error)
41 CreateNetworkView(name string, comment string, setEas EA) (*NetworkView, error)
42 CreateNetworkRange(comment string, name string, network string, networkView string, startAddr string, endAddr string, disable bool, eas EA, member *Dhcpmember, failOverAssociation string, options []*Dhcpoption, useOptions bool, serverAssociation string, template string, msServer string) (*Range, error)
43 CreatePTRRecord(networkView string, dnsView string, ptrdname string, recordName string, cidr string, ipAddr string, useTtl bool, ttl uint32, comment string, eas EA) (*RecordPTR, error)
44 CreateRangeTemplate(name string, numberOfAdresses uint32, offset uint32, comment string, ea EA,
45 options []*Dhcpoption, useOption bool, serverAssociationType string, failOverAssociation string, member *Dhcpmember, cloudApiCompatible bool, msServer string) (*Rangetemplate, error)
46 CreateSRVRecord(dnsView string, name string, priority uint32, weight uint32, port uint32, target string, ttl uint32, useTtl bool, comment string, eas EA) (*RecordSRV, error)
47 CreateTXTRecord(dnsView string, recordName string, text string, ttl uint32, useTtl bool, comment string, eas EA) (*RecordTXT, error)
48 CreateZoneDelegated(fqdn string, delegateTo NullableNameServers, comment string, disable bool, locked bool, nsGroup string, delegatedTtl uint32, useDelegatedTtl bool, ea EA, view string, zoneFormat string) (*ZoneDelegated, error)
49 DeleteARecord(ref string) (string, error)
50 DeleteNSRecord(ref string) (string, error)
51 DeleteAAAARecord(ref string) (string, error)
52 DeleteAliasRecord(ref string) (string, error)
53 DeleteDtcLbdn(ref string) (string, error)
54 DeleteIpv4SharedNetwork(ref string) (string, error)
55 DeleteDtcPool(ref string) (string, error)
56 DeleteDtcServer(ref string) (string, error)
57 DeleteZoneAuth(ref string) (string, error)
58 DeleteZoneForward(ref string) (string, error)
59 DeleteCNAMERecord(ref string) (string, error)
60 DeleteFixedAddress(ref string) (string, error)
61 DeleteHostRecord(ref string) (string, error)
62 DeleteMXRecord(ref string) (string, error)
63 DeleteNetwork(ref string) (string, error)
64 DeleteNetworkContainer(ref string) (string, error)
65 DeleteNetworkView(ref string) (string, error)
66 DeletePTRRecord(ref string) (string, error)
67 DeleteRangeTemplate(ref string) (string, error)
68 DeleteSRVRecord(ref string) (string, error)
69 DeleteTXTRecord(ref string) (string, error)
70 DeleteZoneDelegated(ref string) (string, error)
71 DeleteNetworkRange(ref string) (string, error)
72 GetARecordByRef(ref string) (*RecordA, error)
73 GetARecord(dnsview string, recordName string, ipAddr string) (*RecordA, error)
74 GetAAAARecord(dnsview string, recordName string, ipAddr string) (*RecordAAAA, error)
75 GetAAAARecordByRef(ref string) (*RecordAAAA, error)
76 GetAliasRecordByRef(ref string) (*RecordAlias, error)
77 GetAllAliasRecord(queryParams *QueryParams) ([]RecordAlias, error)
78 GetCNAMERecord(dnsview string, canonical string, recordName string) (*RecordCNAME, error)
79 GetCNAMERecordByRef(ref string) (*RecordCNAME, error)
80 GetNSRecordByRef(ref string) (*RecordNS, error)
81 GetAllRecordNS(queryParams *QueryParams) ([]RecordNS, error)
82 GetAllDtcPool(queryParams *QueryParams) ([]DtcPool, error)
83 GetDtcPool(name string) (*DtcPool, error)
84 GetAllDtcServer(queryParams *QueryParams) ([]DtcServer, error)
85 GetDtcServer(name string, host string) (*DtcServer, error)
86 GetAllDtcLbdn(queryParams *QueryParams) ([]DtcLbdn, error)
87 GetDtcLbdn(name string) (*DtcLbdn, error)
88 GetDtcLbdnByRef(ref string) (*DtcLbdn, error)
89 GetDtcPoolByRef(ref string) (*DtcPool, error)
90 GetDtcServerByRef(ref string) (*DtcServer, error)
91 GetNetworkRangeByRef(ref string) (*Range, error)
92 GetNetworkRange(queryParams *QueryParams) ([]Range, error)
93 GetEADefinition(name string) (*EADefinition, error)
94 GetFixedAddress(netview string, cidr string, ipAddr string, isIPv6 bool, macOrDuid string) (*FixedAddress, error)
95 GetFixedAddressByRef(ref string) (*FixedAddress, error)
96 GetAllFixedAddress(queryParams *QueryParams, isIpv6 bool) ([]FixedAddress, error)
97 GetHostRecord(netview string, dnsview string, recordName string, ipv4addr string, ipv6addr string) (*HostRecord, error)
98 GetIpv4SharedNetworkByRef(ref string) (*SharedNetwork, error)
99 GetAllIpv4SharedNetwork(queryParams *QueryParams) ([]SharedNetwork, error)
100 SearchHostRecordByAltId(internalId string, ref string, eaNameForInternalId string) (*HostRecord, error)
101 GetHostRecordByRef(ref string) (*HostRecord, error)
102 GetIpAddressFromHostRecord(host HostRecord) (string, error)
103 GetMXRecord(dnsView string, fqdn string, mx string, preference uint32) (*RecordMX, error)
104 GetMXRecordByRef(ref string) (*RecordMX, error)
105 GetNetwork(netview string, cidr string, isIPv6 bool, ea EA) (*Network, error)
106 GetNetworkByRef(ref string) (*Network, error)
107 GetNetworkContainer(netview string, cidr string, isIPv6 bool, eaSearch EA) (*NetworkContainer, error)
108 GetNetworkContainerByRef(ref string) (*NetworkContainer, error)
109 GetNetworkView(name string) (*NetworkView, error)
110 GetNetworkViewByRef(ref string) (*NetworkView, error)
111 GetPTRRecord(dnsview string, ptrdname string, recordName string, ipAddr string) (*RecordPTR, error)
112 GetPTRRecordByRef(ref string) (*RecordPTR, error)
113 GetAllRangeTemplate(queryParams *QueryParams) ([]Rangetemplate, error)
114 GetRangeTemplateByRef(ref string) (*Rangetemplate, error)
115 GetSRVRecord(dnsView string, name string, target string, port uint32) (*RecordSRV, error)
116 GetSRVRecordByRef(ref string) (*RecordSRV, error)
117 GetTXTRecord(dnsview string, name string) (*RecordTXT, error)
118 GetTXTRecordByRef(ref string) (*RecordTXT, error)
119 GetZoneAuthByRef(ref string) (*ZoneAuth, error)
120 GetZoneDelegated(fqdn string) (*ZoneDelegated, error)
121 GetZoneDelegatedByFilters(queryParams *QueryParams) ([]ZoneDelegated, error)
122 GetZoneDelegatedByRef(ref string) (*ZoneDelegated, error)
123 GetZoneForwardByRef(ref string) (*ZoneForward, error)
124 GetZoneForwardFilters(queryParams *QueryParams) ([]ZoneForward, error)
125 GetCapacityReport(name string) ([]CapacityReport, error)
126 GetUpgradeStatus(statusType string) ([]UpgradeStatus, error)
127 GetAllMembers() ([]Member, error)
128 GetGridInfo() ([]Grid, error)
129 GetGridLicense() ([]License, error)
130 SearchObjectByAltId(objType string, internalId string, ref string, eaNameForInternalId string) (interface{}, error)
131 ReleaseIP(netview string, cidr string, ipAddr string, isIPv6 bool, macAddr string) (string, error)
132 UpdateAAAARecord(ref string, netView string, recordName string, cidr string, ipAddr string, useTtl bool, ttl uint32, comment string, setEas EA) (*RecordAAAA, error)
133 UpdateAliasRecord(ref string, name string, dnsView string, targetName string, targetType string, comment string, disable bool, ea EA, ttl uint32, useTtl bool) (*RecordAlias, error)
134 UpdateDtcPool(ref string, comment string, name string, lbPreferredMethod string, lbDynamicRatioPreferred map[string]interface{}, servers []*DtcServerLink, monitors []Monitor, lbPreferredTopology *string, lbAlternateMethod string, lbAlternateTopology *string, lbDynamicRatioAlternate map[string]interface{}, eas EA, autoConsolidatedMonitors bool, availability string, consolidatedMonitors []map[string]interface{}, ttl uint32, useTTL bool, disable bool, quorum uint32) (*DtcPool, error)
135 UpdateDtcServer(ref string, comment string, name string, host string, autoCreateHostRecord bool, disable bool, ea EA, monitors []map[string]interface{}, sniHostName string, useSniHostName bool) (*DtcServer, error)
136 UpdateCNAMERecord(ref string, canonical string, recordName string, useTtl bool, ttl uint32, comment string, setEas EA) (*RecordCNAME, error)
137 UpdateDtcLbdn(ref string, name string, authZones []AuthZonesLink, comment string, disable bool, autoConsolidatedMonitors bool, ea EA,
138 lbMethod string, patterns []string, persistence uint32, pools []*DtcPoolLink, priority uint32, topology *string, types []string, ttl uint32, usettl bool) (*DtcLbdn, error)
139 UpdateFixedAddress(fixedAddrRef string, netview string, name string, cidr string, ipAddr string, matchclient string, macOrDuid string, comment string, eas EA, agentCircuitId string, agentRemoteId string, clientIdentifierPrependZero *bool, dhcpClientIdentifier string, disable bool, Options []*Dhcpoption, useOptions bool) (*FixedAddress, error)
140 UpdateHostRecord(hostRref string, enabledns bool, enabledhcp bool, name string, netview string, dnsView string, ipv4cidr string, ipv6cidr string, ipv4Addr string, ipv6Addr string, macAddress string, duid string, useTtl bool, ttl uint32, comment string, eas EA, aliases []string, disable bool) (*HostRecord, error)
141 UpdateIpv4SharedNetwork(ref string, name string, networks []string, networkView string, comment string, eas EA, disable bool, useOptions bool, options []*Dhcpoption) (*SharedNetwork, error)
142 UpdateMXRecord(ref string, dnsView string, fqdn string, mx string, preference uint32, ttl uint32, useTtl bool, comment string, eas EA) (*RecordMX, error)
143 UpdateNetwork(ref string, setEas EA, comment string) (*Network, error)
144 UpdateNetworkContainer(ref string, setEas EA, comment string) (*NetworkContainer, error)
145 UpdateNetworkView(ref string, name string, comment string, setEas EA) (*NetworkView, error)
146 UpdateNetworkRange(ref string, comment string, name string, network string, startAddr string, endAddr string, disable bool, eas EA, member *Dhcpmember, failOverAssociation string, options []*Dhcpoption, useOptions bool, serverAssociationType string, NetworkView string, msServer string) (*Range, error)
147 UpdatePTRRecord(ref string, netview string, ptrdname string, name string, cidr string, ipAddr string, useTtl bool, ttl uint32, comment string, setEas EA) (*RecordPTR, error)
148 UpdateRangeTemplate(ref string, name string, numberOfAddresses uint32, offset uint32, comment string, ea EA,
149 options []*Dhcpoption, useOption bool, serverAssociationType string, failOverAssociation string, member *Dhcpmember, cloudApiCompatible bool, msServer string) (*Rangetemplate, error)
150 UpdateSRVRecord(ref string, name string, priority uint32, weight uint32, port uint32, target string, ttl uint32, useTtl bool, comment string, eas EA) (*RecordSRV, error)
151 UpdateTXTRecord(ref string, recordName string, text string, ttl uint32, useTtl bool, comment string, eas EA) (*RecordTXT, error)
152 UpdateARecord(ref string, name string, ipAddr string, cidr string, netview string, ttl uint32, useTTL bool, comment string, eas EA) (*RecordA, error)
153 UpdateZoneDelegated(ref string, delegateTo NullableNameServers, comment string, disable bool, locked bool, nsGroup string, delegatedTtl uint32, useDelegatedTtl bool, ea EA) (*ZoneDelegated, error)
154 UpdateNSRecord(ref string, name string, nameServer string, dnsView string, addresses []*ZoneNameServer, msDelegationName string) (*RecordNS, error)
155 UpdateZoneForward(ref string, comment string, disable bool, eas EA, forwardTo NullableNameServers, forwardersOnly bool, forwardingServers *NullableForwardingServers, nsGroup string, externalNsGroup string) (*ZoneForward, error)
156 GetDnsMember(ref string) ([]Dns, error)
157 UpdateDnsStatus(ref string, status bool) (Dns, error)
158 GetDhcpMember(ref string) ([]Dhcp, error)
159 UpdateDhcpStatus(ref string, status bool) (Dhcp, error)
160 }
161
162 const (
163 ARecord = "A"
164 AaaaRecord = "AAAA"
165 CnameRecord = "CNAME"
166 MxRecord = "MX"
167 SrvRecord = "SRV"
168 TxtRecord = "TXT"
169 PtrRecord = "PTR"
170 HostRecordConst = "Host"
171 DnsViewConst = "DNSView"
172 ZoneAuthConst = "ZoneAuth"
173 NetworkViewConst = "NetworkView"
174 NetworkConst = "Network"
175 NetworkContainerConst = "NetworkContainer"
176 ZoneForwardConst = "ZoneForward"
177 ZoneDelegatedConst = "ZoneDelegated"
178 DtcLbdnConst = "DtcLbdn"
179 DtcPoolConst = "DtcPool"
180 DtcServerConst = "DtcServer"
181 NetworkRangeConst = "Range"
182 FixedAddressConst = "FixedAddress"
183 SharedNetworkConst = "SharedNetwork"
184 AliasRecord = "AliasRecord"
185 RangeTemplate = "RangeTemplate"
186 )
187
188 // Map of record type to its corresponding object
189 var getRecordTypeMap = map[string]func(ref string) IBObject{
190 ARecord: func(ref string) IBObject {
191 return NewEmptyRecordA()
192 },
193 AaaaRecord: func(ref string) IBObject {
194 return NewEmptyRecordAAAA()
195 },
196 CnameRecord: func(ref string) IBObject {
197 return NewEmptyRecordCNAME()
198 },
199 MxRecord: func(ref string) IBObject {
200 return NewEmptyRecordMX()
201 },
202 SrvRecord: func(ref string) IBObject {
203 return NewEmptyRecordSRV()
204 },
205 TxtRecord: func(ref string) IBObject {
206 return NewEmptyRecordTXT()
207 },
208 PtrRecord: func(ref string) IBObject {
209 return NewEmptyRecordPTR()
210 },
211 HostRecordConst: func(ref string) IBObject {
212 return NewEmptyHostRecord()
213 },
214 DnsViewConst: func(ref string) IBObject {
215 return NewEmptyDNSView()
216 },
217 ZoneAuthConst: func(ref string) IBObject {
218 zone := &ZoneAuth{}
219 zone.SetReturnFields(append(
220 zone.ReturnFields(),
221 "comment",
222 "ns_group",
223 "soa_default_ttl",
224 "soa_expire",
225 "soa_negative_ttl",
226 "soa_refresh",
227 "soa_retry",
228 "view",
229 "zone_format",
230 "extattrs",
231 ))
232 return zone
233 },
234 NetworkViewConst: func(ref string) IBObject {
235 return NewEmptyNetworkView()
236 },
237 NetworkContainerConst: func(ref string) IBObject {
238 return NewNetworkContainer("", "", false, "", nil)
239 },
240 NetworkConst: func(ref string) IBObject {
241 r := regexp.MustCompile("^ipv6network\\/.+")
242 isIPv6 := r.MatchString(ref)
243 return NewNetwork("", "", isIPv6, "", nil)
244 },
245 ZoneForwardConst: func(ref string) IBObject {
246 zoneForward := &ZoneForward{}
247 zoneForward.SetReturnFields(append(
248 zoneForward.ReturnFields(),
249 "zone_format",
250 "ns_group",
251 "external_ns_group",
252 "comment",
253 "disable",
254 "extattrs",
255 "forwarders_only",
256 "forwarding_servers",
257 ))
258 return zoneForward
259 },
260 ZoneDelegatedConst: func(ref string) IBObject {
261 zoneDelegated := &ZoneDelegated{}
262 zoneDelegated.SetReturnFields(append(
263 zoneDelegated.ReturnFields(),
264 "comment",
265 "disable",
266 "locked",
267 "ns_group",
268 "delegated_ttl",
269 "use_delegated_ttl",
270 "zone_format",
271 "extattrs",
272 ))
273 return zoneDelegated
274 },
275 DtcLbdnConst: func(ref string) IBObject {
276 lbdn := &DtcLbdn{}
277 lbdn.SetReturnFields(append(lbdn.ReturnFields(),
278 "extattrs", "disable", "auto_consolidated_monitors", "auth_zones", "lb_method", "patterns", "persistence", "pools", "priority", "topology", "types", "ttl", "use_ttl"))
279 return lbdn
280 },
281 DtcPoolConst: func(ref string) IBObject {
282 pool := &DtcPool{}
283 pool.SetReturnFields(append(pool.ReturnFields(), "lb_preferred_method", "servers", "lb_dynamic_ratio_preferred", "monitors", "auto_consolidated_monitors",
284 "consolidated_monitors", "disable", "extattrs", "health", "lb_alternate_method", "lb_alternate_topology", "lb_dynamic_ratio_alternate", "lb_preferred_topology", "quorum", "ttl", "use_ttl", "availability"))
285 return pool
286 },
287 DtcServerConst: func(ref string) IBObject {
288 dtcServer := &DtcServer{}
289 dtcServer.SetReturnFields(append(dtcServer.ReturnFields(), "extattrs", "auto_create_host_record", "disable", "health", "monitors", "sni_hostname", "use_sni_hostname"))
290 return dtcServer
291 },
292 NetworkRangeConst: func(ref string) IBObject {
293 return NewEmptyRange()
294 },
295 FixedAddressConst: func(ref string) IBObject {
296 return NewEmptyFixedAddress(false)
297 },
298 SharedNetworkConst: func(ref string) IBObject {
299 return NewEmptyIpv4SharedNetwork()
300 },
301 AliasRecord: func(ref string) IBObject {
302 return NewEmptyAliasRecord()
303 },
304 RangeTemplate: func(ref string) IBObject {
305 return NewEmptyRangeTemplate()
306 },
307 }
308
309 // Map returns the object with search fields with the given record type
310 var getObjectWithSearchFieldsMap = map[string]func(recordType IBObject, objMgr *ObjectManager, sf map[string]string) (interface{}, error){
311 ARecord: func(recordType IBObject, objMgr *ObjectManager, sf map[string]string) (interface{}, error) {
312 var res interface{}
313 if recordType.(*RecordA).Ref != "" {
314 return res, nil
315 }
316 var recordAList []*RecordA
317 err := objMgr.connector.GetObject(NewEmptyRecordA(), "", NewQueryParams(false, sf), &recordAList)
318 if err == nil && len(recordAList) > 0 {
319 res = recordAList[0]
320 }
321 return res, err
322 },
323 AaaaRecord: func(recordType IBObject, objMgr *ObjectManager, sf map[string]string) (interface{}, error) {
324 var res interface{}
325 if recordType.(*RecordAAAA).Ref != "" {
326 return res, nil
327 }
328 var recordAaaList []*RecordAAAA
329 err := objMgr.connector.GetObject(NewEmptyRecordAAAA(), "", NewQueryParams(false, sf), &recordAaaList)
330 if err == nil && len(recordAaaList) > 0 {
331 res = recordAaaList[0]
332 }
333 return res, err
334 },
335 CnameRecord: func(recordType IBObject, objMgr *ObjectManager, sf map[string]string) (interface{}, error) {
336 var res interface{}
337 if recordType.(*RecordCNAME).Ref != "" {
338 return res, nil
339 }
340 var cNameList []*RecordCNAME
341 err := objMgr.connector.GetObject(NewEmptyRecordCNAME(), "", NewQueryParams(false, sf), &cNameList)
342 if err == nil && len(cNameList) > 0 {
343 res = cNameList[0]
344 }
345 return res, err
346 },
347 MxRecord: func(recordType IBObject, objMgr *ObjectManager, sf map[string]string) (interface{}, error) {
348 var res interface{}
349 if recordType.(*RecordMX).Ref != "" {
350 return res, nil
351 }
352 var mxList []*RecordMX
353 err := objMgr.connector.GetObject(NewEmptyRecordMX(), "", NewQueryParams(false, sf), &mxList)
354 if err == nil && len(mxList) > 0 {
355 res = mxList[0]
356 }
357 return res, err
358
359 },
360 SrvRecord: func(recordType IBObject, objMgr *ObjectManager, sf map[string]string) (interface{}, error) {
361 var res interface{}
362 if recordType.(*RecordSRV).Ref != "" {
363 return res, nil
364 }
365 var srvList []*RecordSRV
366 err := objMgr.connector.GetObject(NewEmptyRecordSRV(), "", NewQueryParams(false, sf), &srvList)
367 if err == nil && len(srvList) > 0 {
368 res = srvList[0]
369 }
370 return res, err
371 },
372 TxtRecord: func(recordType IBObject, objMgr *ObjectManager, sf map[string]string) (interface{}, error) {
373 var res interface{}
374 if recordType.(*RecordTXT).Ref != "" {
375 return res, nil
376 }
377 var txtList []*RecordTXT
378 err := objMgr.connector.GetObject(NewEmptyRecordTXT(), "", NewQueryParams(false, sf), &txtList)
379 if err == nil && len(txtList) > 0 {
380 res = txtList[0]
381 }
382 return res, err
383 },
384 PtrRecord: func(recordType IBObject, objMgr *ObjectManager, sf map[string]string) (interface{}, error) {
385 var res interface{}
386 if recordType.(*RecordPTR).Ref != "" {
387 return res, nil
388 }
389 var ptrList []*RecordPTR
390 err := objMgr.connector.GetObject(NewEmptyRecordPTR(), "", NewQueryParams(false, sf), &ptrList)
391 if err == nil && len(ptrList) > 0 {
392 res = ptrList[0]
393 }
394 return res, err
395 },
396 HostRecordConst: func(recordType IBObject, objMgr *ObjectManager, sf map[string]string) (interface{}, error) {
397 var res interface{}
398 if recordType.(*HostRecord).Ref != "" {
399 return res, nil
400 }
401 var hostRecordList []*HostRecord
402 err := objMgr.connector.GetObject(NewEmptyHostRecord(), "", NewQueryParams(false, sf), &hostRecordList)
403 if err == nil && len(hostRecordList) > 0 {
404 res = hostRecordList[0]
405 }
406 return res, err
407 },
408 DnsViewConst: func(recordType IBObject, objMgr *ObjectManager, sf map[string]string) (interface{}, error) {
409 var res interface{}
410 if recordType.(*View).Ref != "" {
411 return res, nil
412 }
413 var dnsViewList []*View
414 err := objMgr.connector.GetObject(NewEmptyDNSView(), "", NewQueryParams(false, sf), &dnsViewList)
415 if err == nil && len(dnsViewList) > 0 {
416 res = dnsViewList[0]
417 }
418 return res, err
419 },
420 ZoneAuthConst: func(recordType IBObject, objMgr *ObjectManager, sf map[string]string) (interface{}, error) {
421 var res interface{}
422 if recordType.(*ZoneAuth).Ref != "" {
423 return res, nil
424 }
425 zoneAuth := recordType.(*ZoneAuth)
426 var zoneAuthList []*ZoneAuth
427 err := objMgr.connector.GetObject(zoneAuth, "", NewQueryParams(false, sf), &zoneAuthList)
428 if err == nil && len(zoneAuthList) > 0 {
429 res = zoneAuthList[0]
430 }
431 return res, err
432 },
433 NetworkViewConst: func(recordType IBObject, objMgr *ObjectManager, sf map[string]string) (interface{}, error) {
434 var res interface{}
435 if recordType.(*NetworkView).Ref != "" {
436 return res, nil
437 }
438 var networkViewList []*NetworkView
439 err := objMgr.connector.GetObject(NewEmptyNetworkView(), "", NewQueryParams(false, sf), &networkViewList)
440 if err == nil && len(networkViewList) > 0 {
441 res = networkViewList[0]
442 }
443 return res, err
444 },
445 // TODO: Do we need to add netview string, cidr string, isIPv6 bool, ea EA to create network container
446 NetworkContainerConst: func(recordType IBObject, objMgr *ObjectManager, sf map[string]string) (interface{}, error) {
447 var res interface{}
448 if recordType.(*NetworkContainer).Ref != "" {
449 return res, nil
450 }
451 var networkContainerList []*NetworkContainer
452 err := objMgr.connector.GetObject(NewNetworkContainer("", "", false, "", nil), "", NewQueryParams(false, sf), &networkContainerList)
453 if err == nil && len(networkContainerList) > 0 {
454 res = networkContainerList[0]
455 }
456 return res, err
457
458 },
459 //TODO: Do we need to add netview string, cidr string, isIPv6 bool, ea EA to create network
460 NetworkConst: func(recordType IBObject, objMgr *ObjectManager, sf map[string]string) (interface{}, error) {
461 var res interface{}
462 if recordType.(*Network).Ref != "" {
463 return res, nil
464 }
465 var networkList []*Network
466 err := objMgr.connector.GetObject(NewNetwork("", "", false, "", nil), "", NewQueryParams(false, sf), &networkList)
467 if err == nil && len(networkList) > 0 {
468 res = networkList[0]
469 }
470 return res, err
471 },
472 ZoneForwardConst: func(recordType IBObject, objMgr *ObjectManager, sf map[string]string) (interface{}, error) {
473 var res interface{}
474 if recordType.(*ZoneForward).Ref != "" {
475 return res, nil
476 }
477 var zoneForwardList []*ZoneForward
478 err := objMgr.connector.GetObject(NewEmptyZoneForward(), "", NewQueryParams(false, sf), &zoneForwardList)
479 if err == nil && len(zoneForwardList) > 0 {
480 res = zoneForwardList[0]
481 }
482 return res, err
483 },
484 ZoneDelegatedConst: func(recordType IBObject, objMgr *ObjectManager, sf map[string]string) (interface{}, error) {
485 var res interface{}
486 if recordType.(*ZoneDelegated).Ref != "" {
487 return res, nil
488 }
489 var zoneDelegatedList []*ZoneDelegated
490 err := objMgr.connector.GetObject(NewEmptyZoneDelegated(), "", NewQueryParams(false, sf), &zoneDelegatedList)
491 if err == nil && len(zoneDelegatedList) > 0 {
492 res = zoneDelegatedList[0]
493 }
494 return res, err
495 },
496 DtcLbdnConst: func(recordType IBObject, objMgr *ObjectManager, sf map[string]string) (interface{}, error) {
497 var res interface{}
498 if recordType.(*DtcLbdn).Ref != "" {
499 return res, nil
500 }
501 var dtcLbdnList []*DtcLbdn
502 err := objMgr.connector.GetObject(NewEmptyDtcLbdn(), "", NewQueryParams(false, sf), &dtcLbdnList)
503 if err == nil && len(dtcLbdnList) > 0 {
504 res = dtcLbdnList[0]
505 }
506 return res, err
507 },
508 DtcPoolConst: func(recordType IBObject, objMgr *ObjectManager, sf map[string]string) (interface{}, error) {
509 var res interface{}
510 if recordType.(*DtcPool).Ref != "" {
511 return res, nil
512 }
513 var dtcPoolList []*DtcPool
514 err := objMgr.connector.GetObject(NewEmptyDtcPool(), "", NewQueryParams(false, sf), &dtcPoolList)
515 if err == nil && len(dtcPoolList) > 0 {
516 res = dtcPoolList[0]
517 }
518 return res, err
519 },
520 DtcServerConst: func(recordType IBObject, objMgr *ObjectManager, sf map[string]string) (interface{}, error) {
521 var res interface{}
522 if recordType.(*DtcServer).Ref != "" {
523 return res, nil
524 }
525 var dtcServerList []*DtcServer
526 err := objMgr.connector.GetObject(NewEmptyDtcServer(), "", NewQueryParams(false, sf), &dtcServerList)
527 if err == nil && len(dtcServerList) > 0 {
528 res = dtcServerList[0]
529 }
530 return res, err
531 },
532 AliasRecord: func(recordType IBObject, objMgr *ObjectManager, sf map[string]string) (interface{}, error) {
533 var res interface{}
534 if recordType.(*RecordAlias).Ref != "" {
535 return res, nil
536 }
537 var aliasList []*RecordAlias
538 err := objMgr.connector.GetObject(NewEmptyAliasRecord(), "", NewQueryParams(false, sf), &aliasList)
539 if err == nil && len(aliasList) > 0 {
540 res = aliasList[0]
541 }
542 return res, err
543 },
544 SharedNetworkConst: func(recordType IBObject, objMgr *ObjectManager, sf map[string]string) (interface{}, error) {
545 var res interface{}
546 if recordType.(*SharedNetwork).Ref != "" {
547 return res, nil
548 }
549 var sharedNetworkList []*SharedNetwork
550 err := objMgr.connector.GetObject(NewEmptyIpv4SharedNetwork(), "", NewQueryParams(false, sf), &sharedNetworkList)
551 if err == nil && len(sharedNetworkList) > 0 {
552 res = sharedNetworkList[0]
553 }
554 return res, err
555 },
556 FixedAddressConst: func(recordType IBObject, objMgr *ObjectManager, sf map[string]string) (interface{}, error) {
557 var res interface{}
558 if recordType.(*FixedAddress).Ref != "" {
559 return res, nil
560 }
561 var fixedAddressList []*FixedAddress
562 err := objMgr.connector.GetObject(NewEmptyFixedAddress(false), "", NewQueryParams(false, sf), &fixedAddressList)
563 if err == nil && len(fixedAddressList) > 0 {
564 res = fixedAddressList[0]
565 }
566 return res, err
567 },
568 NetworkRangeConst: func(recordType IBObject, objMgr *ObjectManager, sf map[string]string) (interface{}, error) {
569 var res interface{}
570 if recordType.(*Range).Ref != "" {
571 return res, nil
572 }
573 var rangeList []*Range
574 err := objMgr.connector.GetObject(NewEmptyRange(), "", NewQueryParams(false, sf), &rangeList)
575 if err == nil && len(rangeList) > 0 {
576 res = rangeList[0]
577 }
578 return res, err
579 },
580 RangeTemplate: func(recordType IBObject, objMgr *ObjectManager, sf map[string]string) (interface{}, error) {
581 var res interface{}
582 if recordType.(*Rangetemplate).Ref != "" {
583 return res, nil
584 }
585 var rangeTemplateList []*Rangetemplate
586 err := objMgr.connector.GetObject(NewEmptyRangeTemplate(), "", NewQueryParams(false, sf), &rangeTemplateList)
587 if err == nil && len(rangeTemplateList) > 0 {
588 res = rangeTemplateList[0]
589 }
590 return res, err
591 },
592 }
593
594 func NewEmptyZoneDelegated() *ZoneDelegated {
595 zoneDelegated := &ZoneDelegated{}
596 zoneDelegated.SetReturnFields(append(zoneDelegated.ReturnFields(), "comment", "disable", "locked", "ns_group", "delegated_ttl", "extattrs", "zone_format"))
597 return zoneDelegated
598 }
599
600 type ObjectManager struct {
601 connector IBConnector
602 cmpType string
603 tenantID string
604 }
605
606 func NewObjectManager(connector IBConnector, cmpType string, tenantID string) IBObjectManager {
607 objMgr := &ObjectManager{}
608
609 objMgr.connector = connector
610 objMgr.cmpType = cmpType
611 objMgr.tenantID = tenantID
612
613 return objMgr
614 }
615
616 // CreateMultiObject unmarshals the result into slice of maps
617 func (objMgr *ObjectManager) CreateMultiObject(req *MultiRequest) ([]map[string]interface{}, error) {
618
619 conn := objMgr.connector.(*Connector)
620 queryParams := NewQueryParams(false, nil)
621 res, err := conn.makeRequest(CREATE, req, "", queryParams)
622
623 if err != nil {
624 return nil, err
625 }
626
627 var result []map[string]interface{}
628 err = json.Unmarshal(res, &result)
629
630 if err != nil {
631 return nil, err
632 }
633
634 return result, nil
635 }
636
637 // GetUpgradeStatus returns the grid upgrade information
638 func (objMgr *ObjectManager) GetUpgradeStatus(statusType string) ([]UpgradeStatus, error) {
639 var res []UpgradeStatus
640
641 if statusType == "" {
642 // TODO option may vary according to the WAPI version, need to
643 // throw relevant error.
644 msg := fmt.Sprintf("Status type can not be nil")
645 return res, errors.New(msg)
646 }
647 upgradestatus := NewUpgradeStatus(UpgradeStatus{})
648
649 sf := map[string]string{
650 "type": statusType,
651 }
652 queryParams := NewQueryParams(false, sf)
653 err := objMgr.connector.GetObject(upgradestatus, "", queryParams, &res)
654
655 return res, err
656 }
657
658 // GetAllMembers returns all members information
659 func (objMgr *ObjectManager) GetAllMembers() ([]Member, error) {
660 var res []Member
661
662 memberObj := NewMember(Member{})
663 err := objMgr.connector.GetObject(
664 memberObj, "", NewQueryParams(false, nil), &res,
665 )
666 return res, err
667 }
668
669 // GetCapacityReport returns all capacity for members
670 func (objMgr *ObjectManager) GetCapacityReport(name string) ([]CapacityReport, error) {
671 var res []CapacityReport
672
673 capacityReport := NewCapcityReport(CapacityReport{})
674
675 sf := map[string]string{
676 "name": name,
677 }
678 queryParams := NewQueryParams(false, sf)
679 err := objMgr.connector.GetObject(capacityReport, "", queryParams, &res)
680 return res, err
681 }
682
683 // GetLicense returns the license details for member
684 func (objMgr *ObjectManager) GetLicense() ([]License, error) {
685 var res []License
686
687 licenseObj := NewLicense(License{})
688 err := objMgr.connector.GetObject(
689 licenseObj, "", NewQueryParams(false, nil), &res,
690 )
691 return res, err
692 }
693
694 // GetLicense returns the license details for grid
695 func (objMgr *ObjectManager) GetGridLicense() ([]License, error) {
696 var res []License
697
698 licenseObj := NewGridLicense(License{})
699 err := objMgr.connector.GetObject(
700 licenseObj, "", NewQueryParams(false, nil), &res,
701 )
702 return res, err
703 }
704
705 // GetGridInfo returns the details for grid
706 func (objMgr *ObjectManager) GetGridInfo() ([]Grid, error) {
707 var res []Grid
708
709 gridObj := NewGrid(Grid{})
710 err := objMgr.connector.GetObject(
711 gridObj, "", NewQueryParams(false, nil), &res,
712 )
713 return res, err
714 }
715
716 // CreateZoneAuth creates zones and subs by passing fqdn
717 func (objMgr *ObjectManager) CreateZoneAuth(
718 fqdn string,
719 eas EA) (*ZoneAuth, error) {
720
721 zoneAuth := NewZoneAuth(
722 ZoneAuth{
723 Fqdn: fqdn,
724 Ea: eas},
725 )
726
727 ref, err := objMgr.connector.CreateObject(zoneAuth)
728 zoneAuth.Ref = ref
729 return zoneAuth, err
730 }
731
732 // Retreive a authortative zone by ref
733 func (objMgr *ObjectManager) GetZoneAuthByRef(ref string) (*ZoneAuth, error) {
734 res := NewZoneAuth(ZoneAuth{})
735
736 if ref == "" {
737 return nil, fmt.Errorf("empty reference to an object is not allowed")
738 }
739
740 err := objMgr.connector.GetObject(
741 res, ref, NewQueryParams(false, nil), res,
742 )
743 return res, err
744 }
745
746 // DeleteZoneAuth deletes an auth zone
747 func (objMgr *ObjectManager) DeleteZoneAuth(ref string) (string, error) {
748 return objMgr.connector.DeleteObject(ref)
749 }
750
751 // GetZoneAuth returns the authoritatives zones
752 func (objMgr *ObjectManager) GetZoneAuth() ([]ZoneAuth, error) {
753 var res []ZoneAuth
754
755 zoneAuth := NewZoneAuth(ZoneAuth{})
756 err := objMgr.connector.GetObject(
757 zoneAuth, "", NewQueryParams(false, nil), &res,
758 )
759
760 return res, err
761 }
762
763 // GetZoneDelegatedByRef returns the delegated zone by ref
764 func (objMgr *ObjectManager) GetZoneDelegatedByRef(ref string) (*ZoneDelegated, error) {
765 zoneDelegated := NewZoneDelegated(ZoneDelegated{})
766 err := objMgr.connector.GetObject(
767 zoneDelegated, ref, NewQueryParams(false, nil), &zoneDelegated)
768 if err != nil {
769 return nil, err
770 }
771 return zoneDelegated, nil
772 }
773
774 // GetZoneDelegated returns the delegated zone
775 func (objMgr *ObjectManager) GetZoneDelegated(fqdn string) (*ZoneDelegated, error) {
776 if len(fqdn) == 0 {
777 return nil, nil
778 }
779 var res []ZoneDelegated
780
781 zoneDelegated := NewZoneDelegated(ZoneDelegated{})
782
783 sf := map[string]string{
784 "fqdn": fqdn,
785 }
786 queryParams := NewQueryParams(false, sf)
787 err := objMgr.connector.GetObject(zoneDelegated, "", queryParams, &res)
788
789 if err != nil || res == nil || len(res) == 0 {
790 return nil, err
791 }
792
793 return &res[0], nil
794 }
795
796 // GetZoneDelegateByFiletrs returns the delegated zone by filters
797 func (objMgr *ObjectManager) GetZoneDelegatedByFilters(queryParams *QueryParams) ([]ZoneDelegated, error) {
798 var res []ZoneDelegated
799
800 zoneDelegated := NewEmptyZoneDelegated()
801 err := objMgr.connector.GetObject(zoneDelegated, "", queryParams, &res)
802 if err != nil {
803 return nil, err
804 }
805 return res, err
806 }
807
808 // CreateZoneDelegated creates delegated zone
809 func (objMgr *ObjectManager) CreateZoneDelegated(fqdn string, delegateTo NullableNameServers, comment string,
810 disable bool, locked bool, nsGroup string, delegatedTtl uint32, useDelegatedTtl bool, ea EA, view string, zoneFormat string) (*ZoneDelegated, error) {
811
812 if fqdn == "" {
813 return nil, fmt.Errorf("FQDN is required to create zone-delegated")
814 }
815 if view == "" {
816 view = "default"
817 }
818 if zoneFormat == "" {
819 zoneFormat = "FORWARD"
820 }
821 zoneDelegated := NewZoneDelegated(
822 ZoneDelegated{
823 Fqdn: fqdn,
824 DelegateTo: delegateTo,
825 Comment: &comment,
826 Disable: &disable,
827 Locked: &locked,
828 DelegatedTtl: &delegatedTtl,
829 UseDelegatedTtl: &useDelegatedTtl,
830 Ea: ea,
831 View: &view,
832 ZoneFormat: zoneFormat,
833 },
834 )
835 if nsGroup != "" {
836 zoneDelegated.NsGroup = &nsGroup
837 } else {
838 zoneDelegated.NsGroup = nil
839 }
840 ref, err := objMgr.connector.CreateObject(zoneDelegated)
841 zoneDelegated.Ref = ref
842
843 return zoneDelegated, err
844 }
845
846 // UpdateZoneDelegated updates delegated zone
847 func (objMgr *ObjectManager) UpdateZoneDelegated(
848 ref string,
849 delegateTo NullableNameServers,
850 comment string,
851 disable bool,
852 locked bool,
853 nsGroup string,
854 delegatedTtl uint32,
855 useDelegatedTtl bool,
856 ea EA) (*ZoneDelegated, error) {
857
858 zoneDelegated := NewZoneDelegated(
859 ZoneDelegated{
860 DelegateTo: delegateTo,
861 Comment: &comment,
862 Disable: &disable,
863 Locked: &locked,
864 DelegatedTtl: &delegatedTtl,
865 UseDelegatedTtl: &useDelegatedTtl,
866 Ea: ea,
867 Ref: ref,
868 },
869 )
870
871 if nsGroup != "" {
872 zoneDelegated.NsGroup = &nsGroup
873 } else {
874 zoneDelegated.NsGroup = nil
875 }
876 newRef, err := objMgr.connector.UpdateObject(zoneDelegated, ref)
877 zoneDelegated.Ref = newRef
878 return zoneDelegated, err
879 }
880
881 // DeleteZoneDelegated deletes delegated zone
882 func (objMgr *ObjectManager) DeleteZoneDelegated(ref string) (string, error) {
883 return objMgr.connector.DeleteObject(ref)
884 }
885
886 // SearchObjectByAltId is a generic function to search object by alternate id
887 func (objMgr *ObjectManager) SearchObjectByAltId(
888 objType string, ref string, internalId string, eaNameForInternalId string) (interface{}, error) {
889 var (
890 err error
891 recordType IBObject
892 res interface{}
893 )
894 val, ok := getRecordTypeMap[objType]
895 if !ok {
896 return nil, fmt.Errorf("unknown record type")
897 }
898 recordType = val(ref)
899
900 if ref != "" {
901 // Fetching object by reference
902 if err := objMgr.connector.GetObject(recordType, ref, NewQueryParams(false, nil), &res); err != nil {
903 if _, ok := err.(*NotFoundError); !ok {
904 return nil, err
905 }
906 }
907 success, err := validateObjByInternalId(res, internalId, eaNameForInternalId)
908 if err != nil {
909 return nil, err
910 } else if success {
911 return res, nil
912 }
913 }
914
915 sf := map[string]string{
916 fmt.Sprintf("*%s", eaNameForInternalId): internalId,
917 }
918
919 // Fetch the object by search fields
920 getObjectWithSearchFields, ok := getObjectWithSearchFieldsMap[objType]
921 if !ok {
922 return nil, fmt.Errorf("unknown record type")
923 }
924 res, err = getObjectWithSearchFields(recordType, objMgr, sf)
925 if err != nil {
926 return nil, err
927 }
928 if res == nil {
929 return nil, NewNotFoundError("record not found")
930 }
931
932 return &res, nil
933 }
934
935 // validateObjByInternalId validates the object by comparing the given internal with the object's internal id
936 func validateObjByInternalId(res interface{}, internalId, eaNameForInternalId string) (bool, error) {
937 var success bool
938 if res == nil {
939 return success, nil
940 } else if strings.TrimSpace(internalId) == "" {
941 // return object if internal id is empty
942 success = true
943 return success, nil
944 }
945 byteObj, err := json.Marshal(res)
946 if err != nil {
947 return success, fmt.Errorf("error marshaling JSON: %v", err)
948 }
949 obj := make(map[string]interface{})
950 err = json.Unmarshal(byteObj, &obj)
951 if err != nil {
952 return success, fmt.Errorf("error unmarshaling JSON: %v", err)
953 }
954 extAttrs, err := getInterfaceValueFromMap(obj, "extattrs")
955 if err == nil {
956 resInternalId, err := getInterfaceValueFromMap(extAttrs, eaNameForInternalId)
957 if err == nil && resInternalId["value"] != nil && resInternalId["value"].(string) == internalId {
958 // return object if object's internal id matches with the given internal id
959 success = true
960 return success, nil
961 }
962 return success, err
963 }
964 return success, err
965 }
966
967 // getInterfaceValueFromMap returns the value, after converting it into a map[string]interface{}, of the given key from the map
968 func getInterfaceValueFromMap(m map[string]interface{}, key string) (map[string]interface{}, error) {
969 if val, ok := m[key]; ok && val != nil {
970 res := val.(map[string]interface{})
971 return res, nil
972 }
973 return nil, fmt.Errorf("key %s not found in map", key)
974 }
975