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