Skip to content

Commit 4e8c03f

Browse files
authored
Merge pull request #13 from slntopp/dev-public-and-private-vn
public and private vns
2 parents 418163a + c76a28f commit 4e8c03f

File tree

5 files changed

+116
-16
lines changed

5 files changed

+116
-16
lines changed

pkg/driver/monitoring_helpers.go

+24-1
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,30 @@ func MonitorNetworks(log *zap.Logger, c *ONeClient) (res *structpb.Value, err er
166166
return state
167167
}()
168168

169-
state["private_vnet"] = map[string]interface{}{"error": "Private VNet Pool Monitoring not implemented"}
169+
state["private_vnet_tmpl"] = func() (state map[string]interface{}) {
170+
state = map[string]interface{}{}
171+
private_vnet_tmpl_id, ok := c.vars[PRIVATE_VN_TEMPLATE]
172+
if !ok {
173+
state["error"] = "VNet Template is not set"
174+
return state
175+
}
176+
177+
id, err := GetVarValue(private_vnet_tmpl_id, "default")
178+
if err != nil {
179+
state["error"] = err.Error()
180+
return state
181+
}
182+
vn_tmpl, err := c.ctrl.VNTemplate(int(id.GetNumberValue())).Info(true)
183+
if err != nil {
184+
state["error"] = err.Error()
185+
return state
186+
}
187+
188+
state["id"] = vn_tmpl.ID
189+
state["name"] = vn_tmpl.Name
190+
log.Debug("private_vnet_tmpl", zap.Any("state", state))
191+
return state
192+
}()
170193

171194
return structpb.NewValue(state)
172195
}

pkg/driver/template.go

+13-2
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,17 @@ func (c *ONeClient) InstantiateTemplateHelper(instance *instpb.Instance, group_d
149149
tmpl.AddCtx(keys.NetworkCtx, "YES")
150150
}
151151

152+
private_vn := int(group_data["private_vn"].GetNumberValue())
153+
for i := 0; i < int(resources["ips_private"].GetNumberValue()); i++ {
154+
nic := tmpl.AddNIC()
155+
nic.Add(shared.NetworkID, private_vn)
156+
}
157+
// OpenNebula won't generate Networking context without this key set to YES
158+
// so most templates won't generate network interfaces inside the VM
159+
if int(resources["ips_private"].GetNumberValue()) > 0 {
160+
tmpl.AddCtx(keys.NetworkCtx, "YES")
161+
}
162+
152163
tmpl_string := tmpl.String()
153164
c.log.Debug("Resulting Template", zap.String("template", tmpl_string))
154165
vmid, err = c.InstantiateTemplate(template_id, vmname, tmpl_string, false)
@@ -161,7 +172,7 @@ func (c *ONeClient) InstantiateTemplateHelper(instance *instpb.Instance, group_d
161172
return vmid, nil
162173
}
163174

164-
func (c *ONeClient) InstantiateTemplate(id int, vmname, tmpl string, pending bool) (vmid int, err error ){
175+
func (c *ONeClient) InstantiateTemplate(id int, vmname, tmpl string, pending bool) (vmid int, err error) {
165176
tc := c.ctrl.Template(id)
166177
return tc.Instantiate(vmname, pending, tmpl, false)
167-
}
178+
}

pkg/driver/vars.go

+3-1
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@ var (
2929
SCHED_DS = "sched_ds"
3030
// OpenNebula Super VNet public IP addresses to be reserved from
3131
PUBLIC_IP_POOL = "public_ip_pool"
32+
// OpenNebula Super VNet private IP addresses to be reserved from
33+
PRIVATE_VN_TEMPLATE = "private_vnet_tmpl"
3234

3335
// OpenNebula VM Name Data Key
3436
DATA_VM_NAME = "vm_name"
@@ -47,4 +49,4 @@ func GetVarValue(in *proto.Var, key string) (r *structpb.Value, err error) {
4749
return r, nil
4850
}
4951
return nil, fmt.Errorf("keys '%s' and 'default' are not set", key)
50-
}
52+
}

pkg/driver/vnet.go

+51-7
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,8 @@ import (
2525
)
2626

2727
var (
28-
USER_PUBLIC_VNET_NAME_PATTERN = "user-%d-pub-vnet"
28+
USER_PUBLIC_VNET_NAME_PATTERN = "user-%d-pub-vnet"
29+
USER_PRIVATE_VNET_NAME_PATTERN = "user-%d-private-vnet"
2930
)
3031

3132
func (c *ONeClient) ReservePublicIP(u, n int) (pool_id int, err error) {
@@ -46,30 +47,68 @@ func (c *ONeClient) ReservePublicIP(u, n int) (pool_id int, err error) {
4647
if err != nil {
4748
user_pub_net_id = -1
4849
}
49-
for i := 0; i < n; i++ {
50+
/*for i := 0; i < n; i++ {
5051
user_pub_net_id, err = c.ReserveVNet(
5152
public_pool.ID, 1, user_pub_net_id,
5253
fmt.Sprintf(USER_PUBLIC_VNET_NAME_PATTERN, u))
5354
if err != nil {
5455
return -1, err
5556
}
57+
}*/
58+
user_pub_net_id, err = c.ReserveVNet(
59+
public_pool.ID, n, user_pub_net_id,
60+
fmt.Sprintf(USER_PUBLIC_VNET_NAME_PATTERN, u))
61+
if err != nil {
62+
return -1, err
5663
}
57-
64+
5865
c.Chown(
5966
"vn", user_pub_net_id,
60-
u, int(c.secrets["group"].GetNumberValue()) )
67+
u, int(c.secrets["group"].GetNumberValue()))
6168
c.Chmod(
6269
"vn", user_pub_net_id,
6370
&shared.Permissions{
6471
1, 1, 0,
6572
0, 0, 0,
66-
0, 0, 0 },
73+
0, 0, 0},
6774
)
6875
c.UpdateVNet(user_pub_net_id, "TYPE=\"PUBLIC\"", parameters.Merge)
6976

7077
return user_pub_net_id, nil
7178
}
7279

80+
func (c *ONeClient) ReservePrivateIP(u int) (pool_id int, err error) {
81+
private_tmpl_id, ok := c.vars[PRIVATE_VN_TEMPLATE]
82+
if !ok {
83+
return -1, errors.New("VNet Tmpl ID is not set")
84+
}
85+
86+
id, err := GetVarValue(private_tmpl_id, "default")
87+
if err != nil {
88+
return -1, err
89+
}
90+
91+
//extra := fmt.Sprintf("VLAN_ID=%d", ar)
92+
user_private_net_id, err := c.ctrl.VNTemplate(int(id.GetNumberValue())).Instantiate(fmt.Sprintf(USER_PRIVATE_VNET_NAME_PATTERN, u), "VLAN_ID=0")
93+
if err != nil {
94+
user_private_net_id = -1
95+
}
96+
97+
c.Chown(
98+
"vn", user_private_net_id,
99+
u, int(c.secrets["group"].GetNumberValue()))
100+
c.Chmod(
101+
"vn", user_private_net_id,
102+
&shared.Permissions{
103+
1, 1, 0,
104+
0, 0, 0,
105+
0, 0, 0},
106+
)
107+
c.UpdateVNet(user_private_net_id, "TYPE=\"PRIVATE\"", parameters.Merge)
108+
109+
return user_private_net_id, nil
110+
}
111+
73112
func (c *ONeClient) GetVNet(id int) (*vnet.VirtualNetwork, error) {
74113
vnc := c.ctrl.VirtualNetwork(id)
75114
return vnc.Info(true)
@@ -80,7 +119,12 @@ func (c *ONeClient) GetUserPublicVNet(user int) (id int, err error) {
80119
return vnsc.ByName(fmt.Sprintf(USER_PUBLIC_VNET_NAME_PATTERN, user))
81120
}
82121

83-
func(c *ONeClient) UpdateVNet(id int, tmpl string, uType parameters.UpdateType) error {
122+
func (c *ONeClient) GetUserPrivateVNet(user int) (id int, err error) {
123+
vnsc := c.ctrl.VirtualNetworks()
124+
return vnsc.ByName(fmt.Sprintf(USER_PRIVATE_VNET_NAME_PATTERN, user))
125+
}
126+
127+
func (c *ONeClient) UpdateVNet(id int, tmpl string, uType parameters.UpdateType) error {
84128
vnc := c.ctrl.VirtualNetwork(id)
85129
return vnc.Update(tmpl, uType)
86130
}
@@ -100,4 +144,4 @@ func (c *ONeClient) ReserveVNet(id, size, to int, name string) (int, error) {
100144
tmpl += fmt.Sprintf("VNET=%d", to)
101145
}
102146
return vnc.Reserve(tmpl)
103-
}
147+
}

pkg/server/server.go

+25-5
Original file line numberDiff line numberDiff line change
@@ -156,12 +156,12 @@ func (s *DriverServiceServer) PrepareService(ctx context.Context, igroup *ipb.In
156156
public_ips_amount = int(resources["ips_public"].GetNumberValue())
157157
}
158158

159-
var free int = 0
159+
var freePubIps int = 0
160160
if data["public_ips_free"] != nil {
161-
free = int(data["public_ips_free"].GetNumberValue())
161+
freePubIps = int(data["public_ips_free"].GetNumberValue())
162162
}
163-
if public_ips_amount > 0 && public_ips_amount > free {
164-
public_ips_amount -= free
163+
if public_ips_amount > 0 && public_ips_amount > freePubIps {
164+
public_ips_amount -= freePubIps
165165
public_ips_pool_id, err := client.ReservePublicIP(oneID, public_ips_amount)
166166
if err != nil {
167167
s.log.Debug("Couldn't reserve Public IP addresses",
@@ -175,7 +175,26 @@ func (s *DriverServiceServer) PrepareService(ctx context.Context, igroup *ipb.In
175175
}
176176
data["public_ips_total"] = structpb.NewNumberValue(total)
177177

178-
data["public_ips_free"] = structpb.NewNumberValue(float64(free + public_ips_amount))
178+
data["public_ips_free"] = structpb.NewNumberValue(float64(freePubIps + public_ips_amount))
179+
}
180+
181+
var private_ips_amount int = 0
182+
if resources["ips_private"] != nil {
183+
private_ips_amount = int(resources["ips_private"].GetNumberValue())
184+
}
185+
186+
/*var address_range_id int = -1
187+
if data["address_range_id"] != nil {
188+
address_range_id = int(data["address_range_id"].GetNumberValue())
189+
}*/
190+
if private_ips_amount > 0 {
191+
private_ips_pool_id, err := client.ReservePrivateIP(oneID)
192+
if err != nil {
193+
s.log.Debug("Couldn't reserve Private IP addresses",
194+
zap.Error(err), zap.Int("amount", private_ips_amount), zap.Int("user", oneID))
195+
return nil, status.Error(codes.Internal, "Couldn't reserve Private IP addresses")
196+
}
197+
data["private_vn"] = structpb.NewNumberValue(float64(private_ips_pool_id))
179198
}
180199

181200
return data, nil
@@ -212,6 +231,7 @@ func (s *DriverServiceServer) Up(ctx context.Context, input *pb.UpRequest) (*pb.
212231
log.Error("Error Preparing Service", zap.Any("group", igroup), zap.Error(err))
213232
return nil, err
214233
}
234+
215235
userid := int(data["userid"].GetNumberValue())
216236
for _, instance := range igroup.GetInstances() {
217237
token, err := auth.MakeTokenInstance(instance.GetUuid())

0 commit comments

Comments
 (0)