object_manager_network.go raw

   1  package ibclient
   2  
   3  import (
   4  	"fmt"
   5  	"regexp"
   6  )
   7  
   8  func (objMgr *ObjectManager) CreateNetwork(netview string, cidr string, isIPv6 bool, comment string, eas EA) (*Network, error) {
   9  	network := NewNetwork(netview, cidr, isIPv6, comment, eas)
  10  
  11  	ref, err := objMgr.connector.CreateObject(network)
  12  	if err != nil {
  13  		return nil, err
  14  	}
  15  	network.Ref = ref
  16  
  17  	return network, err
  18  }
  19  
  20  func (objMgr *ObjectManager) AllocateNetwork(
  21  	netview string,
  22  	cidr string,
  23  	isIPv6 bool,
  24  	prefixLen uint,
  25  	comment string,
  26  	eas EA) (network *Network, err error) {
  27  
  28  	network = nil
  29  	cidr = fmt.Sprintf("func:nextavailablenetwork:%s,%s,%d", cidr, netview, prefixLen)
  30  	networkReq := NewNetwork(netview, cidr, isIPv6, comment, eas)
  31  
  32  	ref, err := objMgr.connector.CreateObject(networkReq)
  33  	if err == nil {
  34  		if isIPv6 {
  35  			network, err = BuildIPv6NetworkFromRef(ref)
  36  		} else {
  37  			network, err = BuildNetworkFromRef(ref)
  38  		}
  39  	}
  40  
  41  	return
  42  }
  43  
  44  func (objMgr *ObjectManager) AllocateNextAvailableIp(
  45  	name string,
  46  	objectType string,
  47  	objectParams map[string]string,
  48  	params map[string][]string,
  49  	useEaInheritance bool,
  50  	ea EA,
  51  	comment string,
  52  	disable bool,
  53  	n *int, ipAddrType string,
  54  	enableDns bool, enableDhcp bool,
  55  	macAddr string, duid string,
  56  	networkView string, dnsView string,
  57  	useTtl bool, ttl uint32, aliases []string) (interface{}, error) {
  58  
  59  	networkIp := NewIpNextAvailable(name, objectType, objectParams, params, useEaInheritance, ea, comment, disable, n, ipAddrType,
  60  		enableDns, enableDhcp, macAddr, duid, networkView, dnsView, useTtl, ttl, aliases)
  61  
  62  	ref, err := objMgr.connector.CreateObject(networkIp)
  63  	if err != nil {
  64  		return nil, err
  65  	}
  66  
  67  	switch objectType {
  68  	case "record:a":
  69  		return objMgr.GetARecordByRef(ref)
  70  	case "record:aaaa":
  71  		return objMgr.GetAAAARecordByRef(ref)
  72  	case "record:host":
  73  		return objMgr.GetHostRecordByRef(ref)
  74  	}
  75  
  76  	return nil, err
  77  }
  78  
  79  func (objMgr *ObjectManager) AllocateNetworkByEA(
  80  	netview string, isIPv6 bool, comment string, eas EA, eaMap map[string]string, prefixLen uint, object string) (network *Network, err error) {
  81  
  82  	var (
  83  		containerObject string
  84  		objectType      string
  85  	)
  86  
  87  	objectType = getNetworkObjectType(isIPv6, "network", "ipv6network")
  88  
  89  	if object == "network" {
  90  		containerObject = getNetworkObjectType(isIPv6, "network", "ipv6network")
  91  	} else {
  92  		containerObject = getNetworkObjectType(isIPv6, "networkcontainer", "ipv6networkcontainer")
  93  	}
  94  
  95  	nextAvailableNetworkInfo := NetworkContainerNextAvailableInfo{
  96  		Function:     "next_available_network",
  97  		ResultField:  "networks",
  98  		Object:       containerObject,
  99  		ObjectParams: eaMap,
 100  		Params:       map[string]uint{"cidr": prefixLen},
 101  	}
 102  
 103  	nextAvailableNetwork := NetworkContainerNextAvailable{
 104  		Network:     &nextAvailableNetworkInfo,
 105  		objectType:  objectType,
 106  		Comment:     comment,
 107  		Ea:          eas,
 108  		NetviewName: netview,
 109  	}
 110  
 111  	ref, err := objMgr.connector.CreateObject(&nextAvailableNetwork)
 112  	if err == nil {
 113  		if isIPv6 {
 114  			network, err = BuildIPv6NetworkFromRef(ref)
 115  		} else {
 116  			network, err = BuildNetworkFromRef(ref)
 117  		}
 118  	}
 119  	return
 120  }
 121  
 122  func (objMgr *ObjectManager) GetNetwork(netview string, cidr string, isIPv6 bool, ea EA) (*Network, error) {
 123  	if netview != "" && cidr != "" {
 124  		var res []Network
 125  
 126  		network := NewNetwork(netview, cidr, isIPv6, "", ea)
 127  
 128  		network.Cidr = cidr
 129  
 130  		if ea != nil && len(ea) > 0 {
 131  			network.eaSearch = EASearch(ea)
 132  		}
 133  
 134  		sf := map[string]string{
 135  			"network_view": netview,
 136  			"network":      cidr,
 137  		}
 138  		queryParams := NewQueryParams(false, sf)
 139  		err := objMgr.connector.GetObject(network, "", queryParams, &res)
 140  
 141  		if err != nil {
 142  			return nil, err
 143  		} else if res == nil || len(res) == 0 {
 144  			return nil, NewNotFoundError(
 145  				fmt.Sprintf(
 146  					"Network with cidr: %s in network view: %s is not found.",
 147  					cidr, netview))
 148  		}
 149  
 150  		return &res[0], nil
 151  	} else {
 152  		err := fmt.Errorf("both network view and cidr values are required")
 153  		return nil, err
 154  	}
 155  }
 156  
 157  func (objMgr *ObjectManager) GetNetworkByRef(ref string) (*Network, error) {
 158  	r := regexp.MustCompile("^ipv6network\\/.+")
 159  	isIPv6 := r.MatchString(ref)
 160  
 161  	network := NewNetwork("", "", isIPv6, "", nil)
 162  	err := objMgr.connector.GetObject(network, ref, NewQueryParams(false, nil), network)
 163  	return network, err
 164  }
 165  
 166  // UpdateNetwork updates comment and EA parameters.
 167  // EAs which exist will be updated,
 168  // those which do exist but not in setEas map, will be deleted,
 169  // EAs which do not exist will be created as new.
 170  func (objMgr *ObjectManager) UpdateNetwork(
 171  	ref string,
 172  	setEas EA,
 173  	comment string) (*Network, error) {
 174  
 175  	r := regexp.MustCompile("^ipv6network\\/.+")
 176  	isIPv6 := r.MatchString(ref)
 177  
 178  	nw := NewNetwork("", "", isIPv6, "", nil)
 179  	err := objMgr.connector.GetObject(
 180  		nw, ref, NewQueryParams(false, nil), nw)
 181  
 182  	if err != nil {
 183  		return nil, err
 184  	}
 185  
 186  	nw.Ea = setEas
 187  	nw.Comment = comment
 188  
 189  	// Network view is not allowed to be updated,
 190  	// thus making its name empty (will not appear among data which we update).
 191  	netViewSaved := nw.NetviewName
 192  	nw.NetviewName = ""
 193  
 194  	newRef, err := objMgr.connector.UpdateObject(nw, ref)
 195  	if err != nil {
 196  		return nil, err
 197  	}
 198  
 199  	nw.Ref = newRef
 200  	nw.NetviewName = netViewSaved
 201  
 202  	return nw, nil
 203  }
 204  
 205  func (objMgr *ObjectManager) DeleteNetwork(ref string) (string, error) {
 206  	return objMgr.connector.DeleteObject(ref)
 207  }
 208