object_manager_network_container.go raw
1 package ibclient
2
3 import (
4 "fmt"
5 "regexp"
6 )
7
8 func (objMgr *ObjectManager) CreateNetworkContainer(netview string, cidr string, isIPv6 bool, comment string, eas EA) (*NetworkContainer, error) {
9 container := NewNetworkContainer(netview, cidr, isIPv6, comment, eas)
10
11 ref, err := objMgr.connector.CreateObject(container)
12 if err != nil {
13 return nil, err
14 }
15
16 container.Ref = ref
17 return container, nil
18 }
19
20 // TODO normalize IPv4 and IPv6 addresses
21 func (objMgr *ObjectManager) GetNetworkContainer(netview string, cidr string, isIPv6 bool, eaSearch EA) (*NetworkContainer, error) {
22 var res []NetworkContainer
23
24 nc := NewNetworkContainer(netview, cidr, isIPv6, "", nil)
25 nc.eaSearch = EASearch(eaSearch)
26 sf := map[string]string{
27 "network_view": netview,
28 "network": cidr,
29 }
30 queryParams := NewQueryParams(false, sf)
31 err := objMgr.connector.GetObject(nc, "", queryParams, &res)
32 if err != nil {
33 return nil, err
34 } else if res == nil || len(res) == 0 {
35 return nil, NewNotFoundError("network container not found")
36 }
37
38 return &res[0], nil
39 }
40
41 func (objMgr *ObjectManager) GetNetworkContainerByRef(ref string) (*NetworkContainer, error) {
42 nc := NewNetworkContainer("", "", false, "", nil)
43
44 err := objMgr.connector.GetObject(
45 nc, ref, NewQueryParams(false, nil), nc)
46 if err != nil {
47 return nil, err
48 }
49
50 return nc, nil
51 }
52
53 func (objMgr *ObjectManager) UpdateNetworkContainer(
54 ref string,
55 setEas EA,
56 comment string) (*NetworkContainer, error) {
57
58 nc := &NetworkContainer{}
59 nc.returnFields = []string{"extattrs", "comment"}
60
61 err := objMgr.connector.GetObject(
62 nc, ref, NewQueryParams(false, nil), nc)
63 if err != nil {
64 return nil, err
65 }
66
67 nc.Ea = setEas
68 nc.Comment = comment
69
70 // Network view is not allowed to be updated,
71 // thus making its name empty (will not appear among data which we update).
72 netViewSaved := nc.NetviewName
73 nc.NetviewName = ""
74
75 reference, err := objMgr.connector.UpdateObject(nc, ref)
76 if err != nil {
77 return nil, err
78 }
79
80 nc.Ref = reference
81 nc.NetviewName = netViewSaved
82
83 return nc, nil
84 }
85
86 func (objMgr *ObjectManager) AllocateNetworkContainer(
87 netview string,
88 cidr string,
89 isIPv6 bool,
90 prefixLen uint,
91 comment string,
92 eas EA) (*NetworkContainer, error) {
93
94 containerInfo := NewNetworkContainerNextAvailableInfo(netview, cidr, prefixLen, isIPv6)
95 container := NewNetworkContainerNextAvailable(containerInfo, isIPv6, comment, eas)
96
97 ref, err := objMgr.connector.CreateObject(container)
98
99 if err != nil {
100 return nil, err
101 }
102
103 if isIPv6 {
104 return BuildIPv6NetworkContainerFromRef(ref)
105 } else {
106 return BuildNetworkContainerFromRef(ref)
107 }
108 }
109
110 func (objMgr *ObjectManager) AllocateNetworkContainerByEA(
111 netview string, isIPv6 bool, comment string, eas EA, eaMap map[string]string, prefixLen uint) (*NetworkContainer, error) {
112
113 var object string
114 object = getNetworkObjectType(isIPv6, "networkcontainer", "ipv6networkcontainer")
115
116 nextAvailableNetworkInfo := NetworkContainerNextAvailableInfo{
117 Function: "next_available_network",
118 ResultField: "networks",
119 Object: object,
120 ObjectParams: eaMap,
121 Params: map[string]uint{"cidr": prefixLen},
122 }
123
124 net := NetworkContainerNextAvailable{
125 Network: &nextAvailableNetworkInfo,
126 objectType: object,
127 Comment: comment,
128 Ea: eas,
129 NetviewName: netview,
130 }
131 ref, err := objMgr.connector.CreateObject(&net)
132
133 if err != nil {
134 return nil, err
135 }
136 if isIPv6 {
137 return BuildIPv6NetworkContainerFromRef(ref)
138 } else {
139 return BuildNetworkContainerFromRef(ref)
140 }
141 }
142
143 func (objMgr *ObjectManager) DeleteNetworkContainer(ref string) (string, error) {
144 ncRegExp := regexp.MustCompile("^(ipv6)?networkcontainer\\/.+")
145 if !ncRegExp.MatchString(ref) {
146 return "", fmt.Errorf("'ref' does not reference a network container")
147 }
148
149 return objMgr.connector.DeleteObject(ref)
150 }
151