github.com/infobloxopen/infoblox-go-client@v1.1.1/object_manager.go (about)

     1  package ibclient
     2  
     3  import (
     4  	"encoding/json"
     5  	"errors"
     6  	"fmt"
     7  	"regexp"
     8  )
     9  
    10  type IBObjectManager interface {
    11  	AllocateIP(netview string, cidr string, ipAddr string, macAddress string, name string, ea EA) (*FixedAddress, error)
    12  	AllocateNetwork(netview string, cidr string, prefixLen uint, name string) (network *Network, err error)
    13  	CreateARecord(netview string, dnsview string, recordname string, cidr string, ipAddr string, ea EA) (*RecordA, error)
    14  	CreateZoneAuth(fqdn string, ea EA) (*ZoneAuth, error)
    15  	CreateCNAMERecord(canonical string, recordname string, dnsview string, ea EA) (*RecordCNAME, error)
    16  	CreateDefaultNetviews(globalNetview string, localNetview string) (globalNetviewRef string, localNetviewRef string, err error)
    17  	CreateEADefinition(eadef EADefinition) (*EADefinition, error)
    18  	CreateHostRecord(enabledns bool, recordName string, netview string, dnsview string, cidr string, ipAddr string, macAddress string, ea EA) (*HostRecord, error)
    19  	CreateNetwork(netview string, cidr string, name string) (*Network, error)
    20  	CreateNetworkContainer(netview string, cidr string) (*NetworkContainer, error)
    21  	CreateNetworkView(name string) (*NetworkView, error)
    22  	CreatePTRRecord(netview string, dnsview string, recordname string, cidr string, ipAddr string, ea EA) (*RecordPTR, error)
    23  	DeleteARecord(ref string) (string, error)
    24  	DeleteZoneAuth(ref string) (string, error)
    25  	DeleteCNAMERecord(ref string) (string, error)
    26  	DeleteFixedAddress(ref string) (string, error)
    27  	DeleteHostRecord(ref string) (string, error)
    28  	DeleteNetwork(ref string, netview string) (string, error)
    29  	DeleteNetworkView(ref string) (string, error)
    30  	DeletePTRRecord(ref string) (string, error)
    31  	GetARecordByRef(ref string) (*RecordA, error)
    32  	GetCNAMERecordByRef(ref string) (*RecordA, error)
    33  	GetEADefinition(name string) (*EADefinition, error)
    34  	GetFixedAddress(netview string, cidr string, ipAddr string, macAddr string) (*FixedAddress, error)
    35  	GetFixedAddressByRef(ref string) (*FixedAddress, error)
    36  	GetHostRecord(recordName string) (*HostRecord, error)
    37  	GetHostRecordByRef(ref string) (*HostRecord, error)
    38  	GetIpAddressFromHostRecord(host HostRecord) (string, error)
    39  	GetNetwork(netview string, cidr string, ea EA) (*Network, error)
    40  	GetNetworkContainer(netview string, cidr string) (*NetworkContainer, error)
    41  	GetNetworkView(name string) (*NetworkView, error)
    42  	GetPTRRecordByRef(ref string) (*RecordPTR, error)
    43  	GetZoneAuthByRef(ref string) (*ZoneAuth, error)
    44  	ReleaseIP(netview string, cidr string, ipAddr string, macAddr string) (string, error)
    45  	UpdateFixedAddress(fixedAddrRef string, matchclient string, macAddress string, vmID string, vmName string) (*FixedAddress, error)
    46  	UpdateHostRecord(hostRref string, ipAddr string, macAddress string, vmID string, vmName string) (string, error)
    47  	UpdateNetworkViewEA(ref string, addEA EA, removeEA EA) error
    48  	UpdateARecord(aRecordRef string, netview string, recordname string, cidr string, ipAddr string, ea EA) (*RecordA, error)
    49  	UpdateCNAMERecord(cnameRef string, canonical string, recordname string, dnsview string, ea EA) (*RecordCNAME, error)
    50  }
    51  
    52  type ObjectManager struct {
    53  	connector IBConnector
    54  	cmpType   string
    55  	tenantID  string
    56  	// If OmitCloudAttrs is true no extra attributes for cloud are set
    57  	OmitCloudAttrs bool
    58  }
    59  
    60  func NewObjectManager(connector IBConnector, cmpType string, tenantID string) *ObjectManager {
    61  	objMgr := new(ObjectManager)
    62  
    63  	objMgr.connector = connector
    64  	objMgr.cmpType = cmpType
    65  	objMgr.tenantID = tenantID
    66  
    67  	return objMgr
    68  }
    69  
    70  func (objMgr *ObjectManager) getBasicEA(cloudAPIOwned Bool) EA {
    71  	ea := make(EA)
    72  	if !objMgr.OmitCloudAttrs {
    73  		ea["Cloud API Owned"] = cloudAPIOwned
    74  		ea["CMP Type"] = objMgr.cmpType
    75  		ea["Tenant ID"] = objMgr.tenantID
    76  	}
    77  	return ea
    78  }
    79  
    80  func (objMgr *ObjectManager) extendEA(ea EA) EA {
    81  	eas := objMgr.getBasicEA(true)
    82  	for k, v := range ea {
    83  		eas[k] = v
    84  	}
    85  	return eas
    86  }
    87  
    88  func (objMgr *ObjectManager) CreateNetworkView(name string) (*NetworkView, error) {
    89  	networkView := NewNetworkView(NetworkView{
    90  		Name: name,
    91  		Ea:   objMgr.getBasicEA(false)})
    92  
    93  	ref, err := objMgr.connector.CreateObject(networkView)
    94  	networkView.Ref = ref
    95  
    96  	return networkView, err
    97  }
    98  
    99  func (objMgr *ObjectManager) makeNetworkView(netviewName string) (netviewRef string, err error) {
   100  	var netviewObj *NetworkView
   101  	if netviewObj, err = objMgr.GetNetworkView(netviewName); err != nil {
   102  		return
   103  	}
   104  	if netviewObj == nil {
   105  		if netviewObj, err = objMgr.CreateNetworkView(netviewName); err != nil {
   106  			return
   107  		}
   108  	}
   109  
   110  	netviewRef = netviewObj.Ref
   111  
   112  	return
   113  }
   114  
   115  func (objMgr *ObjectManager) CreateDefaultNetviews(globalNetview string, localNetview string) (globalNetviewRef string, localNetviewRef string, err error) {
   116  	if globalNetviewRef, err = objMgr.makeNetworkView(globalNetview); err != nil {
   117  		return
   118  	}
   119  
   120  	if localNetviewRef, err = objMgr.makeNetworkView(localNetview); err != nil {
   121  		return
   122  	}
   123  
   124  	return
   125  }
   126  
   127  func (objMgr *ObjectManager) CreateNetwork(netview string, cidr string, name string) (*Network, error) {
   128  	network := NewNetwork(Network{
   129  		NetviewName: netview,
   130  		Cidr:        cidr,
   131  		Ea:          objMgr.getBasicEA(true)})
   132  
   133  	if name != "" {
   134  		network.Ea["Network Name"] = name
   135  	}
   136  	ref, err := objMgr.connector.CreateObject(network)
   137  	if err != nil {
   138  		return nil, err
   139  	}
   140  	network.Ref = ref
   141  
   142  	return network, err
   143  }
   144  
   145  func (objMgr *ObjectManager) CreateNetworkContainer(netview string, cidr string) (*NetworkContainer, error) {
   146  	container := NewNetworkContainer(NetworkContainer{
   147  		NetviewName: netview,
   148  		Cidr:        cidr,
   149  		Ea:          objMgr.getBasicEA(true)})
   150  
   151  	ref, err := objMgr.connector.CreateObject(container)
   152  	container.Ref = ref
   153  
   154  	return container, err
   155  }
   156  
   157  func (objMgr *ObjectManager) GetNetworkView(name string) (*NetworkView, error) {
   158  	var res []NetworkView
   159  
   160  	netview := NewNetworkView(NetworkView{Name: name})
   161  
   162  	err := objMgr.connector.GetObject(netview, "", &res)
   163  
   164  	if err != nil || res == nil || len(res) == 0 {
   165  		return nil, err
   166  	}
   167  
   168  	return &res[0], nil
   169  }
   170  
   171  func (objMgr *ObjectManager) UpdateNetworkViewEA(ref string, addEA EA, removeEA EA) error {
   172  	var res NetworkView
   173  
   174  	nv := NetworkView{}
   175  	nv.returnFields = []string{"extattrs"}
   176  	err := objMgr.connector.GetObject(&nv, ref, &res)
   177  
   178  	if err != nil {
   179  		return err
   180  	}
   181  
   182  	for k, v := range addEA {
   183  		res.Ea[k] = v
   184  	}
   185  
   186  	for k := range removeEA {
   187  		_, ok := res.Ea[k]
   188  		if ok {
   189  			delete(res.Ea, k)
   190  		}
   191  	}
   192  
   193  	_, err = objMgr.connector.UpdateObject(&res, ref)
   194  	return err
   195  }
   196  
   197  func BuildNetworkViewFromRef(ref string) *NetworkView {
   198  	// networkview/ZG5zLm5ldHdvcmtfdmlldyQyMw:global_view/false
   199  	r := regexp.MustCompile(`networkview/\w+:([^/]+)/\w+`)
   200  	m := r.FindStringSubmatch(ref)
   201  
   202  	if m == nil {
   203  		return nil
   204  	}
   205  
   206  	return &NetworkView{
   207  		Ref:  ref,
   208  		Name: m[1],
   209  	}
   210  }
   211  
   212  func BuildNetworkFromRef(ref string) *Network {
   213  	// network/ZG5zLm5ldHdvcmskODkuMC4wLjAvMjQvMjU:89.0.0.0/24/global_view
   214  	r := regexp.MustCompile(`network/\w+:(\d+\.\d+\.\d+\.\d+/\d+)/(.+)`)
   215  	m := r.FindStringSubmatch(ref)
   216  
   217  	if m == nil {
   218  		return nil
   219  	}
   220  
   221  	return &Network{
   222  		Ref:         ref,
   223  		NetviewName: m[2],
   224  		Cidr:        m[1],
   225  	}
   226  }
   227  
   228  func (objMgr *ObjectManager) GetNetwork(netview string, cidr string, ea EA) (*Network, error) {
   229  	var res []Network
   230  
   231  	network := NewNetwork(Network{
   232  		NetviewName: netview})
   233  
   234  	if cidr != "" {
   235  		network.Cidr = cidr
   236  	}
   237  
   238  	if ea != nil && len(ea) > 0 {
   239  		network.eaSearch = EASearch(ea)
   240  	}
   241  
   242  	err := objMgr.connector.GetObject(network, "", &res)
   243  
   244  	if err != nil || res == nil || len(res) == 0 {
   245  		return nil, err
   246  	}
   247  
   248  	return &res[0], nil
   249  }
   250  
   251  func (objMgr *ObjectManager) GetNetworkwithref(ref string) (*Network, error) {
   252  	network := NewNetwork(Network{})
   253  	err := objMgr.connector.GetObject(network, ref, &network)
   254  	return network, err
   255  }
   256  
   257  func (objMgr *ObjectManager) GetNetworkContainer(netview string, cidr string) (*NetworkContainer, error) {
   258  	var res []NetworkContainer
   259  
   260  	nwcontainer := NewNetworkContainer(NetworkContainer{
   261  		NetviewName: netview,
   262  		Cidr:        cidr})
   263  
   264  	err := objMgr.connector.GetObject(nwcontainer, "", &res)
   265  
   266  	if err != nil || res == nil || len(res) == 0 {
   267  		return nil, err
   268  	}
   269  
   270  	return &res[0], nil
   271  }
   272  
   273  func GetIPAddressFromRef(ref string) string {
   274  	// fixedaddress/ZG5zLmJpbmRfY25h:12.0.10.1/external
   275  	r := regexp.MustCompile(`fixedaddress/\w+:(\d+\.\d+\.\d+\.\d+)/.+`)
   276  	m := r.FindStringSubmatch(ref)
   277  
   278  	if m != nil {
   279  		return m[1]
   280  	}
   281  	return ""
   282  }
   283  
   284  func (objMgr *ObjectManager) AllocateIP(netview string, cidr string, ipAddr string, macAddress string, name string, ea EA) (*FixedAddress, error) {
   285  	if len(macAddress) == 0 {
   286  		macAddress = MACADDR_ZERO
   287  	}
   288  
   289  	eas := objMgr.extendEA(ea)
   290  
   291  	fixedAddr := NewFixedAddress(FixedAddress{
   292  		NetviewName: netview,
   293  		Cidr:        cidr,
   294  		Mac:         macAddress,
   295  		Name:        name,
   296  		Ea:          eas})
   297  
   298  	if ipAddr == "" {
   299  		fixedAddr.IPAddress = fmt.Sprintf("func:nextavailableip:%s,%s", cidr, netview)
   300  	} else {
   301  		fixedAddr.IPAddress = ipAddr
   302  	}
   303  
   304  	ref, err := objMgr.connector.CreateObject(fixedAddr)
   305  	fixedAddr.Ref = ref
   306  	fixedAddr.IPAddress = GetIPAddressFromRef(ref)
   307  
   308  	return fixedAddr, err
   309  }
   310  
   311  func (objMgr *ObjectManager) AllocateNetwork(netview string, cidr string, prefixLen uint, name string) (network *Network, err error) {
   312  	network = nil
   313  
   314  	networkReq := NewNetwork(Network{
   315  		NetviewName: netview,
   316  		Cidr:        fmt.Sprintf("func:nextavailablenetwork:%s,%s,%d", cidr, netview, prefixLen),
   317  		Ea:          objMgr.getBasicEA(true)})
   318  	if name != "" {
   319  		networkReq.Ea["Network Name"] = name
   320  	}
   321  
   322  	ref, err := objMgr.connector.CreateObject(networkReq)
   323  	if err == nil && len(ref) > 0 {
   324  		network = BuildNetworkFromRef(ref)
   325  	}
   326  
   327  	return
   328  }
   329  
   330  func (objMgr *ObjectManager) GetFixedAddress(netview string, cidr string, ipAddr string, macAddr string) (*FixedAddress, error) {
   331  	var res []FixedAddress
   332  
   333  	fixedAddr := NewFixedAddress(FixedAddress{
   334  		NetviewName: netview,
   335  		Cidr:        cidr,
   336  		IPAddress:   ipAddr})
   337  
   338  	if macAddr != "" {
   339  		fixedAddr.Mac = macAddr
   340  	}
   341  
   342  	err := objMgr.connector.GetObject(fixedAddr, "", &res)
   343  
   344  	if err != nil || res == nil || len(res) == 0 {
   345  		return nil, err
   346  	}
   347  
   348  	return &res[0], nil
   349  }
   350  
   351  func (objMgr *ObjectManager) GetFixedAddressByRef(ref string) (*FixedAddress, error) {
   352  	fixedAddr := NewFixedAddress(FixedAddress{})
   353  	err := objMgr.connector.GetObject(fixedAddr, ref, &fixedAddr)
   354  	return fixedAddr, err
   355  }
   356  
   357  func (objMgr *ObjectManager) DeleteFixedAddress(ref string) (string, error) {
   358  	return objMgr.connector.DeleteObject(ref)
   359  }
   360  
   361  // validation  for match_client
   362  func validateMatchClient(value string) bool {
   363  	match_client := [5]string{"MAC_ADDRESS", "CLIENT_ID", "RESERVED", "CIRCUIT_ID", "REMOTE_ID"}
   364  
   365  	for _, val := range match_client {
   366  		if val == value {
   367  			return true
   368  		}
   369  	}
   370  	return false
   371  }
   372  
   373  func (objMgr *ObjectManager) UpdateFixedAddress(fixedAddrRef string, matchClient string, macAddress string, vmID string, vmName string) (*FixedAddress, error) {
   374  	updateFixedAddr := NewFixedAddress(FixedAddress{Ref: fixedAddrRef})
   375  
   376  	if len(macAddress) != 0 {
   377  		updateFixedAddr.Mac = macAddress
   378  	}
   379  
   380  	ea := objMgr.getBasicEA(true)
   381  	if vmID != "" {
   382  		ea["VM ID"] = vmID
   383  		updateFixedAddr.Ea = ea
   384  	}
   385  	if vmName != "" {
   386  		ea["VM Name"] = vmName
   387  		updateFixedAddr.Ea = ea
   388  	}
   389  	if matchClient != "" {
   390  		if validateMatchClient(matchClient) {
   391  			updateFixedAddr.MatchClient = matchClient
   392  		} else {
   393  			return nil, fmt.Errorf("wrong value for match_client passed %s \n ", matchClient)
   394  		}
   395  	}
   396  
   397  	refResp, err := objMgr.connector.UpdateObject(updateFixedAddr, fixedAddrRef)
   398  	updateFixedAddr.Ref = refResp
   399  	return updateFixedAddr, err
   400  }
   401  
   402  func (objMgr *ObjectManager) ReleaseIP(netview string, cidr string, ipAddr string, macAddr string) (string, error) {
   403  	fixAddress, _ := objMgr.GetFixedAddress(netview, cidr, ipAddr, macAddr)
   404  	if fixAddress == nil {
   405  		return "", nil
   406  	}
   407  	return objMgr.connector.DeleteObject(fixAddress.Ref)
   408  }
   409  
   410  func (objMgr *ObjectManager) DeleteNetwork(ref string, netview string) (string, error) {
   411  	network := BuildNetworkFromRef(ref)
   412  	if network != nil && network.NetviewName == netview {
   413  		return objMgr.connector.DeleteObject(ref)
   414  	}
   415  
   416  	return "", nil
   417  }
   418  
   419  func (objMgr *ObjectManager) DeleteNetworkView(ref string) (string, error) {
   420  	return objMgr.connector.DeleteObject(ref)
   421  }
   422  
   423  func (objMgr *ObjectManager) GetEADefinition(name string) (*EADefinition, error) {
   424  	var res []EADefinition
   425  
   426  	eadef := NewEADefinition(EADefinition{Name: name})
   427  
   428  	err := objMgr.connector.GetObject(eadef, "", &res)
   429  
   430  	if err != nil || res == nil || len(res) == 0 {
   431  		return nil, err
   432  	}
   433  
   434  	return &res[0], nil
   435  }
   436  
   437  func (objMgr *ObjectManager) CreateEADefinition(eadef EADefinition) (*EADefinition, error) {
   438  	newEadef := NewEADefinition(eadef)
   439  
   440  	ref, err := objMgr.connector.CreateObject(newEadef)
   441  	newEadef.Ref = ref
   442  
   443  	return newEadef, err
   444  }
   445  
   446  func (objMgr *ObjectManager) CreateHostRecord(enabledns bool, recordName string, netview string, dnsview string, cidr string, ipAddr string, macAddress string, ea EA) (*HostRecord, error) {
   447  
   448  	eas := objMgr.extendEA(ea)
   449  
   450  	recordHostIpAddr := NewHostRecordIpv4Addr(HostRecordIpv4Addr{Mac: macAddress})
   451  
   452  	if ipAddr == "" {
   453  		recordHostIpAddr.Ipv4Addr = fmt.Sprintf("func:nextavailableip:%s,%s", cidr, netview)
   454  	} else {
   455  		recordHostIpAddr.Ipv4Addr = ipAddr
   456  	}
   457  	enableDNS := new(bool)
   458  	*enableDNS = enabledns
   459  	recordHostIpAddrSlice := []HostRecordIpv4Addr{*recordHostIpAddr}
   460  	recordHost := NewHostRecord(HostRecord{
   461  		Name:        recordName,
   462  		EnableDns:   enableDNS,
   463  		NetworkView: netview,
   464  		View:        dnsview,
   465  		Ipv4Addrs:   recordHostIpAddrSlice,
   466  		Ea:          eas})
   467  
   468  	ref, err := objMgr.connector.CreateObject(recordHost)
   469  	if err != nil {
   470  		return nil, err
   471  	}
   472  	recordHost.Ref = ref
   473  	err = objMgr.connector.GetObject(recordHost, ref, &recordHost)
   474  	return recordHost, err
   475  }
   476  
   477  func (objMgr *ObjectManager) GetHostRecordByRef(ref string) (*HostRecord, error) {
   478  	recordHost := NewHostRecord(HostRecord{})
   479  	err := objMgr.connector.GetObject(recordHost, ref, &recordHost)
   480  	return recordHost, err
   481  }
   482  
   483  func (objMgr *ObjectManager) GetHostRecord(recordName string) (*HostRecord, error) {
   484  	var res []HostRecord
   485  
   486  	recordHost := NewHostRecord(HostRecord{})
   487  	if recordName != "" {
   488  		recordHost.Name = recordName
   489  	}
   490  
   491  	err := objMgr.connector.GetObject(recordHost, "", &res)
   492  
   493  	if err != nil || res == nil || len(res) == 0 {
   494  		return nil, err
   495  	}
   496  	return &res[0], err
   497  
   498  }
   499  
   500  func (objMgr *ObjectManager) GetIpAddressFromHostRecord(host HostRecord) (string, error) {
   501  	err := objMgr.connector.GetObject(&host, host.Ref, &host)
   502  	return host.Ipv4Addrs[0].Ipv4Addr, err
   503  }
   504  
   505  func (objMgr *ObjectManager) UpdateHostRecord(hostRref string, ipAddr string, macAddress string, vmID string, vmName string) (string, error) {
   506  
   507  	recordHostIpAddr := NewHostRecordIpv4Addr(HostRecordIpv4Addr{Mac: macAddress, Ipv4Addr: ipAddr})
   508  	recordHostIpAddrSlice := []HostRecordIpv4Addr{*recordHostIpAddr}
   509  	updateHostRecord := NewHostRecord(HostRecord{Ipv4Addrs: recordHostIpAddrSlice})
   510  
   511  	ea := objMgr.getBasicEA(true)
   512  	if vmID != "" {
   513  		ea["VM ID"] = vmID
   514  		updateHostRecord.Ea = ea
   515  	}
   516  
   517  	if vmName != "" {
   518  		ea["VM Name"] = vmName
   519  		updateHostRecord.Ea = ea
   520  	}
   521  	ref, err := objMgr.connector.UpdateObject(updateHostRecord, hostRref)
   522  	return ref, err
   523  }
   524  
   525  func (objMgr *ObjectManager) DeleteHostRecord(ref string) (string, error) {
   526  	return objMgr.connector.DeleteObject(ref)
   527  }
   528  
   529  func (objMgr *ObjectManager) CreateARecord(netview string, dnsview string, recordname string, cidr string, ipAddr string, ea EA) (*RecordA, error) {
   530  
   531  	eas := objMgr.extendEA(ea)
   532  
   533  	recordA := NewRecordA(RecordA{
   534  		View: dnsview,
   535  		Name: recordname,
   536  		Ea:   eas})
   537  
   538  	if ipAddr == "" {
   539  		recordA.Ipv4Addr = fmt.Sprintf("func:nextavailableip:%s,%s", cidr, netview)
   540  	} else {
   541  		recordA.Ipv4Addr = ipAddr
   542  	}
   543  	ref, err := objMgr.connector.CreateObject(recordA)
   544  	recordA.Ref = ref
   545  	return recordA, err
   546  }
   547  
   548  func (objMgr *ObjectManager) GetARecordByRef(ref string) (*RecordA, error) {
   549  	recordA := NewRecordA(RecordA{})
   550  	err := objMgr.connector.GetObject(recordA, ref, &recordA)
   551  	return recordA, err
   552  }
   553  
   554  func (objMgr *ObjectManager) UpdateARecord(aRecordRef string, netview string, recordname string, cidr string, ipAddr string, ea EA) (*RecordA, error) {
   555  	updateRecordA := NewRecordA(RecordA{Ref: aRecordRef})
   556  	updateRecordA.Name = recordname
   557  	if ipAddr != "" {
   558  		updateRecordA.Ipv4Addr = ipAddr
   559  	} else {
   560  		updateRecordA.Ipv4Addr = fmt.Sprintf("func:nextavailableip:%s,%s", cidr, netview)
   561  	}
   562  	updateRecordA.Ea = ea
   563  	refResp, err := objMgr.connector.UpdateObject(updateRecordA, aRecordRef)
   564  	updateRecordA.Ref = refResp
   565  	return updateRecordA, err
   566  }
   567  
   568  func (objMgr *ObjectManager) DeleteARecord(ref string) (string, error) {
   569  	return objMgr.connector.DeleteObject(ref)
   570  }
   571  
   572  func (objMgr *ObjectManager) CreateCNAMERecord(canonical string, recordname string, dnsview string, ea EA) (*RecordCNAME, error) {
   573  
   574  	eas := objMgr.extendEA(ea)
   575  
   576  	recordCNAME := NewRecordCNAME(RecordCNAME{
   577  		View:      dnsview,
   578  		Name:      recordname,
   579  		Canonical: canonical,
   580  		Ea:        eas})
   581  
   582  	ref, err := objMgr.connector.CreateObject(recordCNAME)
   583  	recordCNAME.Ref = ref
   584  	return recordCNAME, err
   585  }
   586  
   587  func (objMgr *ObjectManager) GetCNAMERecordByRef(ref string) (*RecordCNAME, error) {
   588  	recordCNAME := NewRecordCNAME(RecordCNAME{})
   589  	err := objMgr.connector.GetObject(recordCNAME, ref, &recordCNAME)
   590  	return recordCNAME, err
   591  }
   592  
   593  func (objMgr *ObjectManager) UpdateCNAMERecord(cnameRef string, canonical string, recordname string, dnsview string, ea EA) (*RecordCNAME, error) {
   594  	updateRecordCNAME := NewRecordCNAME(RecordCNAME{Ref: cnameRef})
   595  	updateRecordCNAME.Canonical = canonical
   596  	updateRecordCNAME.Name = recordname
   597  	updateRecordCNAME.Ea = ea
   598  	refResp, err := objMgr.connector.UpdateObject(updateRecordCNAME, cnameRef)
   599  	updateRecordCNAME.Ref = refResp
   600  	return updateRecordCNAME, err
   601  }
   602  
   603  func (objMgr *ObjectManager) DeleteCNAMERecord(ref string) (string, error) {
   604  	return objMgr.connector.DeleteObject(ref)
   605  }
   606  
   607  // Creates TXT Record. Use TTL of 0 to inherit TTL from the Zone
   608  func (objMgr *ObjectManager) CreateTXTRecord(recordname string, text string, ttl uint, dnsview string) (*RecordTXT, error) {
   609  
   610  	recordTXT := NewRecordTXT(RecordTXT{
   611  		View: dnsview,
   612  		Name: recordname,
   613  		Text: text,
   614  		Ttl:  ttl,
   615  	})
   616  
   617  	ref, err := objMgr.connector.CreateObject(recordTXT)
   618  	recordTXT.Ref = ref
   619  	return recordTXT, err
   620  }
   621  
   622  func (objMgr *ObjectManager) GetTXTRecordByRef(ref string) (*RecordTXT, error) {
   623  	recordTXT := NewRecordTXT(RecordTXT{})
   624  	err := objMgr.connector.GetObject(recordTXT, ref, &recordTXT)
   625  	return recordTXT, err
   626  }
   627  
   628  func (objMgr *ObjectManager) GetTXTRecord(name string) (*RecordTXT, error) {
   629  	if name == "" {
   630  		return nil, fmt.Errorf("name can not be empty")
   631  	}
   632  	var res []RecordTXT
   633  
   634  	recordTXT := NewRecordTXT(RecordTXT{Name: name})
   635  
   636  	err := objMgr.connector.GetObject(recordTXT, "", &res)
   637  
   638  	if err != nil || res == nil || len(res) == 0 {
   639  		return nil, err
   640  	}
   641  
   642  	return &res[0], nil
   643  }
   644  
   645  func (objMgr *ObjectManager) UpdateTXTRecord(recordname string, text string) (*RecordTXT, error) {
   646  	var res []RecordTXT
   647  
   648  	recordTXT := NewRecordTXT(RecordTXT{Name: recordname})
   649  
   650  	err := objMgr.connector.GetObject(recordTXT, "", &res)
   651  
   652  	if len(res) == 0 {
   653  		return nil, nil
   654  	}
   655  
   656  	res[0].Text = text
   657  
   658  	res[0].Zone = "" //  set the Zone value to "" as its a non writable field
   659  
   660  	_, err = objMgr.connector.UpdateObject(&res[0], res[0].Ref)
   661  
   662  	if err != nil || res == nil || len(res) == 0 {
   663  		return nil, err
   664  	}
   665  
   666  	return &res[0], nil
   667  }
   668  
   669  func (objMgr *ObjectManager) DeleteTXTRecord(ref string) (string, error) {
   670  	return objMgr.connector.DeleteObject(ref)
   671  }
   672  
   673  func (objMgr *ObjectManager) CreatePTRRecord(netview string, dnsview string, recordname string, cidr string, ipAddr string, ea EA) (*RecordPTR, error) {
   674  
   675  	eas := objMgr.extendEA(ea)
   676  
   677  	recordPTR := NewRecordPTR(RecordPTR{
   678  		View:     dnsview,
   679  		PtrdName: recordname,
   680  		Ea:       eas})
   681  
   682  	if ipAddr == "" {
   683  		recordPTR.Ipv4Addr = fmt.Sprintf("func:nextavailableip:%s,%s", cidr, netview)
   684  	} else {
   685  		recordPTR.Ipv4Addr = ipAddr
   686  	}
   687  	ref, err := objMgr.connector.CreateObject(recordPTR)
   688  	recordPTR.Ref = ref
   689  	return recordPTR, err
   690  }
   691  
   692  func (objMgr *ObjectManager) GetPTRRecordByRef(ref string) (*RecordPTR, error) {
   693  	recordPTR := NewRecordPTR(RecordPTR{})
   694  	err := objMgr.connector.GetObject(recordPTR, ref, &recordPTR)
   695  	return recordPTR, err
   696  }
   697  
   698  func (objMgr *ObjectManager) DeletePTRRecord(ref string) (string, error) {
   699  	return objMgr.connector.DeleteObject(ref)
   700  }
   701  
   702  // CreateMultiObject unmarshals the result into slice of maps
   703  func (objMgr *ObjectManager) CreateMultiObject(req *MultiRequest) ([]map[string]interface{}, error) {
   704  
   705  	conn := objMgr.connector.(*Connector)
   706  	queryParams := QueryParams{forceProxy: false}
   707  	res, err := conn.makeRequest(CREATE, req, "", queryParams)
   708  
   709  	if err != nil {
   710  		return nil, err
   711  	}
   712  
   713  	var result []map[string]interface{}
   714  	err = json.Unmarshal(res, &result)
   715  
   716  	if err != nil {
   717  		return nil, err
   718  	}
   719  
   720  	return result, nil
   721  }
   722  
   723  // GetUpgradeStatus returns the grid upgrade information
   724  func (objMgr *ObjectManager) GetUpgradeStatus(statusType string) ([]UpgradeStatus, error) {
   725  	var res []UpgradeStatus
   726  
   727  	if statusType == "" {
   728  		// TODO option may vary according to the WAPI version, need to
   729  		// throw relevant  error.
   730  		msg := fmt.Sprintf("Status type can not be nil")
   731  		return res, errors.New(msg)
   732  	}
   733  	upgradestatus := NewUpgradeStatus(UpgradeStatus{Type: statusType})
   734  	err := objMgr.connector.GetObject(upgradestatus, "", &res)
   735  
   736  	return res, err
   737  }
   738  
   739  // GetAllMembers returns all members information
   740  func (objMgr *ObjectManager) GetAllMembers() ([]Member, error) {
   741  	var res []Member
   742  
   743  	memberObj := NewMember(Member{})
   744  	err := objMgr.connector.GetObject(memberObj, "", &res)
   745  	return res, err
   746  }
   747  
   748  // GetCapacityReport returns all capacity for members
   749  func (objMgr *ObjectManager) GetCapacityReport(name string) ([]CapacityReport, error) {
   750  	var res []CapacityReport
   751  
   752  	capacityObj := CapacityReport{Name: name}
   753  	capacityReport := NewCapcityReport(capacityObj)
   754  	err := objMgr.connector.GetObject(capacityReport, "", &res)
   755  	return res, err
   756  }
   757  
   758  // GetLicense returns the license details for member
   759  func (objMgr *ObjectManager) GetLicense() ([]License, error) {
   760  	var res []License
   761  
   762  	licenseObj := NewLicense(License{})
   763  	err := objMgr.connector.GetObject(licenseObj, "", &res)
   764  	return res, err
   765  }
   766  
   767  // GetLicense returns the license details for grid
   768  func (objMgr *ObjectManager) GetGridLicense() ([]License, error) {
   769  	var res []License
   770  
   771  	licenseObj := NewGridLicense(License{})
   772  	err := objMgr.connector.GetObject(licenseObj, "", &res)
   773  	return res, err
   774  }
   775  
   776  // GetGridInfo returns the details for grid
   777  func (objMgr *ObjectManager) GetGridInfo() ([]Grid, error) {
   778  	var res []Grid
   779  
   780  	gridObj := NewGrid(Grid{})
   781  	err := objMgr.connector.GetObject(gridObj, "", &res)
   782  	return res, err
   783  }
   784  
   785  // CreateZoneAuth creates zones and subs by passing fqdn
   786  func (objMgr *ObjectManager) CreateZoneAuth(fqdn string, ea EA) (*ZoneAuth, error) {
   787  
   788  	eas := objMgr.extendEA(ea)
   789  
   790  	zoneAuth := NewZoneAuth(ZoneAuth{
   791  		Fqdn: fqdn,
   792  		Ea:   eas})
   793  
   794  	ref, err := objMgr.connector.CreateObject(zoneAuth)
   795  	zoneAuth.Ref = ref
   796  	return zoneAuth, err
   797  }
   798  
   799  // Retreive a authortative zone by ref
   800  func (objMgr *ObjectManager) GetZoneAuthByRef(ref string) (ZoneAuth, error) {
   801  	var res ZoneAuth
   802  
   803  	if ref == "" {
   804  		return res, nil
   805  	}
   806  	zoneAuth := NewZoneAuth(ZoneAuth{})
   807  
   808  	err := objMgr.connector.GetObject(zoneAuth, ref, &res)
   809  	return res, err
   810  }
   811  
   812  // DeleteZoneAuth deletes an auth zone
   813  func (objMgr *ObjectManager) DeleteZoneAuth(ref string) (string, error) {
   814  	return objMgr.connector.DeleteObject(ref)
   815  }
   816  
   817  // GetZoneAuth returns the authoritatives zones
   818  func (objMgr *ObjectManager) GetZoneAuth() ([]ZoneAuth, error) {
   819  	var res []ZoneAuth
   820  
   821  	zoneAuth := NewZoneAuth(ZoneAuth{})
   822  	err := objMgr.connector.GetObject(zoneAuth, "", &res)
   823  
   824  	return res, err
   825  }
   826  
   827  // GetZoneDelegated returns the delegated zone
   828  func (objMgr *ObjectManager) GetZoneDelegated(fqdn string) (*ZoneDelegated, error) {
   829  	if len(fqdn) == 0 {
   830  		return nil, nil
   831  	}
   832  	var res []ZoneDelegated
   833  
   834  	zoneDelegated := NewZoneDelegated(ZoneDelegated{Fqdn: fqdn})
   835  
   836  	err := objMgr.connector.GetObject(zoneDelegated, "", &res)
   837  
   838  	if err != nil || res == nil || len(res) == 0 {
   839  		return nil, err
   840  	}
   841  
   842  	return &res[0], nil
   843  }
   844  
   845  // CreateZoneDelegated creates delegated zone
   846  func (objMgr *ObjectManager) CreateZoneDelegated(fqdn string, delegate_to []NameServer) (*ZoneDelegated, error) {
   847  	zoneDelegated := NewZoneDelegated(ZoneDelegated{
   848  		Fqdn:       fqdn,
   849  		DelegateTo: delegate_to})
   850  
   851  	ref, err := objMgr.connector.CreateObject(zoneDelegated)
   852  	zoneDelegated.Ref = ref
   853  
   854  	return zoneDelegated, err
   855  }
   856  
   857  // UpdateZoneDelegated updates delegated zone
   858  func (objMgr *ObjectManager) UpdateZoneDelegated(ref string, delegate_to []NameServer) (*ZoneDelegated, error) {
   859  	zoneDelegated := NewZoneDelegated(ZoneDelegated{
   860  		Ref:        ref,
   861  		DelegateTo: delegate_to})
   862  
   863  	refResp, err := objMgr.connector.UpdateObject(zoneDelegated, ref)
   864  	zoneDelegated.Ref = refResp
   865  	return zoneDelegated, err
   866  }
   867  
   868  // DeleteZoneDelegated deletes delegated zone
   869  func (objMgr *ObjectManager) DeleteZoneDelegated(ref string) (string, error) {
   870  	return objMgr.connector.DeleteObject(ref)
   871  }