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