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