object_manager_fixed_address.go raw

   1  package ibclient
   2  
   3  import (
   4  	"fmt"
   5  	"net"
   6  	"regexp"
   7  )
   8  
   9  func (objMgr *ObjectManager) AllocateIP(
  10  	netview string,
  11  	cidr string,
  12  	ipAddr string,
  13  	isIPv6 bool,
  14  	macOrDuid string,
  15  	name string,
  16  	comment string,
  17  	eas EA,
  18  	clients string,
  19  	agentCircuitId string,
  20  	agentRemoteId string,
  21  	clientIdentifierPrependZero *bool,
  22  	dhcpClientIdentifier string,
  23  	disable bool,
  24  	Options []*Dhcpoption,
  25  	useOptions bool,
  26  ) (*FixedAddress, error) {
  27  
  28  	if isIPv6 {
  29  		if len(macOrDuid) == 0 {
  30  			return nil, fmt.Errorf("the DUID field cannot be left empty")
  31  		}
  32  	} else {
  33  		if len(macOrDuid) == 0 && clients == "" {
  34  			macOrDuid = MACADDR_ZERO
  35  		}
  36  	}
  37  	if ipAddr == "" && cidr != "" {
  38  		if netview == "" {
  39  			netview = "default"
  40  		}
  41  		ipAddr = fmt.Sprintf("func:nextavailableip:%s,%s", cidr, netview)
  42  	}
  43  
  44  	var clientsPointer *string
  45  	if clients != "" {
  46  		clientsPointer = &clients
  47  	}
  48  	var agentCircuitIdPointer *string
  49  	if agentCircuitId != "" {
  50  		agentCircuitIdPointer = &agentCircuitId
  51  	}
  52  	var agentRemoteIdPointer *string
  53  	if agentRemoteId != "" {
  54  		agentRemoteIdPointer = &agentRemoteId
  55  	}
  56  	var clientIdentifierPrependZeroPointer *bool
  57  	if clientIdentifierPrependZero != nil {
  58  		clientIdentifierPrependZeroPointer = clientIdentifierPrependZero
  59  	}
  60  	var dhcpClientIdentifierPointer *string
  61  	if dhcpClientIdentifier != "" {
  62  		dhcpClientIdentifierPointer = &dhcpClientIdentifier
  63  	}
  64  	fixedAddr := NewFixedAddress(
  65  		netview, name, ipAddr, cidr, macOrDuid, clientsPointer, eas, "", isIPv6, comment, agentCircuitIdPointer, agentRemoteIdPointer, clientIdentifierPrependZeroPointer, dhcpClientIdentifierPointer, disable, Options, useOptions)
  66  	ref, err := objMgr.connector.CreateObject(fixedAddr)
  67  	if err != nil {
  68  		return nil, err
  69  	}
  70  
  71  	fixedAddr.Ref = ref
  72  	fixedAddr, err = objMgr.GetFixedAddressByRef(ref)
  73  
  74  	return fixedAddr, err
  75  }
  76  
  77  func (objMgr *ObjectManager) GetFixedAddress(netview string, cidr string, ipAddr string, isIpv6 bool, macOrDuid string) (*FixedAddress, error) {
  78  	var res []FixedAddress
  79  
  80  	fixedAddr := NewEmptyFixedAddress(isIpv6)
  81  	sf := map[string]string{
  82  		"network_view": netview,
  83  		"network":      cidr,
  84  	}
  85  	if isIpv6 {
  86  		sf["ipv6addr"] = ipAddr
  87  		if macOrDuid != "" {
  88  			sf["duid"] = macOrDuid
  89  		}
  90  	} else {
  91  		sf["ipv4addr"] = ipAddr
  92  		if macOrDuid != "" {
  93  			sf["mac"] = macOrDuid
  94  		}
  95  	}
  96  
  97  	queryParams := NewQueryParams(false, sf)
  98  	err := objMgr.connector.GetObject(fixedAddr, "", queryParams, &res)
  99  
 100  	if err != nil || res == nil || len(res) == 0 {
 101  		return nil, err
 102  	}
 103  
 104  	return &res[0], nil
 105  }
 106  
 107  func (objMgr *ObjectManager) GetFixedAddressByRef(ref string) (*FixedAddress, error) {
 108  	r := regexp.MustCompile("^ipv6fixedaddress/.+")
 109  	isIPv6 := r.MatchString(ref)
 110  
 111  	fixedAddr := NewEmptyFixedAddress(isIPv6)
 112  	err := objMgr.connector.GetObject(
 113  		fixedAddr, ref, NewQueryParams(false, nil), &fixedAddr)
 114  	return fixedAddr, err
 115  }
 116  
 117  func (objMgr *ObjectManager) UpdateFixedAddress(
 118  	fixedAddrRef string,
 119  	netview string,
 120  	name string,
 121  	cidr string,
 122  	ipAddr string,
 123  	matchClient string,
 124  	macOrDuid string,
 125  	comment string,
 126  	eas EA,
 127  	agentCircuitId string,
 128  	agentRemoteId string,
 129  	clientIdentifierPrependZero *bool,
 130  	dhcpClientIdentifier string,
 131  	disable bool,
 132  	Options []*Dhcpoption,
 133  	useOptions bool,
 134  ) (*FixedAddress, error) {
 135  
 136  	r := regexp.MustCompile("^ipv6fixedaddress/.+")
 137  	isIPv6 := r.MatchString(fixedAddrRef)
 138  	if !isIPv6 {
 139  		if !validateMatchClient(matchClient) {
 140  			return nil, fmt.Errorf("wrong value for match_client passed %s \n ", matchClient)
 141  		}
 142  	}
 143  	var clientsPointer *string
 144  	if matchClient != "" {
 145  		clientsPointer = &matchClient
 146  	}
 147  	var agentCircuitIdPointer *string
 148  	if agentCircuitId != "" {
 149  		agentCircuitIdPointer = &agentCircuitId
 150  	}
 151  	var agentRemoteIdPointer *string
 152  	if agentRemoteId != "" {
 153  		agentRemoteIdPointer = &agentRemoteId
 154  	}
 155  	var clientIdentifierPrependZeroPointer *bool
 156  	if clientIdentifierPrependZero != nil {
 157  		clientIdentifierPrependZeroPointer = clientIdentifierPrependZero
 158  	}
 159  	var dhcpClientIdentifierPointer *string
 160  	if dhcpClientIdentifier != "" {
 161  		dhcpClientIdentifierPointer = &dhcpClientIdentifier
 162  	}
 163  	updateFixedAddr := NewFixedAddress(
 164  		"", name, "", "",
 165  		macOrDuid, clientsPointer, eas, fixedAddrRef, isIPv6, comment, agentCircuitIdPointer, agentRemoteIdPointer, clientIdentifierPrependZeroPointer, dhcpClientIdentifierPointer, disable, Options, useOptions)
 166  
 167  	if ipAddr == "" {
 168  		if cidr != "" {
 169  			ipAddress, _, err := net.ParseCIDR(cidr)
 170  			if err != nil {
 171  				return nil, fmt.Errorf("cannot parse CIDR value: %s", err.Error())
 172  			}
 173  			if netview == "" {
 174  				netview = "default"
 175  			}
 176  			if isIPv6 {
 177  				if ipAddress.To4() != nil || ipAddress.To16() == nil {
 178  					return nil, fmt.Errorf("CIDR value must be an IPv6 CIDR, not an IPv4 one")
 179  				}
 180  				updateFixedAddr.IPv6Address = fmt.Sprintf("func:nextavailableip:%s,%s", cidr, netview)
 181  				updateFixedAddr.Cidr = cidr
 182  				updateFixedAddr.NetviewName = netview
 183  			} else {
 184  				if ipAddress.To4() == nil {
 185  					return nil, fmt.Errorf("CIDR value must be an IPv4 CIDR, not an IPv6 one")
 186  				}
 187  				updateFixedAddr.IPv4Address = fmt.Sprintf("func:nextavailableip:%s,%s", cidr, netview)
 188  				updateFixedAddr.Cidr = cidr
 189  				updateFixedAddr.NetviewName = netview
 190  			}
 191  		}
 192  	} else {
 193  		ipAddress := net.ParseIP(ipAddr)
 194  		if ipAddress == nil {
 195  			return nil, fmt.Errorf("IP address for the record is not valid")
 196  		}
 197  		if isIPv6 {
 198  			if ipAddress.To4() != nil || ipAddress.To16() == nil {
 199  				return nil, fmt.Errorf("IP address must be an IPv6 address, not an IPv4 one")
 200  			}
 201  			updateFixedAddr.IPv6Address = ipAddr
 202  			updateFixedAddr.Cidr = cidr
 203  			updateFixedAddr.NetviewName = netview
 204  		} else {
 205  			if ipAddress.To4() == nil {
 206  				return nil, fmt.Errorf("IP address must be an IPv4 address, not an IPv6 one")
 207  			}
 208  			updateFixedAddr.IPv4Address = ipAddr
 209  			updateFixedAddr.Cidr = cidr
 210  			updateFixedAddr.NetviewName = netview
 211  		}
 212  	}
 213  	refResp, err := objMgr.connector.UpdateObject(updateFixedAddr, fixedAddrRef)
 214  	if err != nil {
 215  		return nil, err
 216  	}
 217  	updateFixedAddr.Ref = refResp
 218  	updateFixedAddr, err = objMgr.GetFixedAddressByRef(refResp)
 219  	if err != nil {
 220  		return nil, err
 221  	}
 222  	return updateFixedAddr, nil
 223  }
 224  
 225  func (objMgr *ObjectManager) ReleaseIP(netview string, cidr string, ipAddr string, isIpv6 bool, macOrDuid string) (string, error) {
 226  	fixAddress, _ := objMgr.GetFixedAddress(netview, cidr, ipAddr, isIpv6, macOrDuid)
 227  	if fixAddress == nil {
 228  		return "", nil
 229  	}
 230  	return objMgr.connector.DeleteObject(fixAddress.Ref)
 231  }
 232  
 233  func (objMgr *ObjectManager) DeleteFixedAddress(ref string) (string, error) {
 234  	return objMgr.connector.DeleteObject(ref)
 235  }
 236  
 237  func (objMgr *ObjectManager) GetAllFixedAddress(queryParams *QueryParams, isIpv6 bool) ([]FixedAddress, error) {
 238  	var res []FixedAddress
 239  	fixedAddress := NewEmptyFixedAddress(isIpv6)
 240  	err := objMgr.connector.GetObject(fixedAddress, "", queryParams, &res)
 241  	if err != nil {
 242  		return nil, fmt.Errorf("failed getting fixed address: %s", err)
 243  	}
 244  	return res, nil
 245  }
 246