-
Notifications
You must be signed in to change notification settings - Fork 367
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
22 changed files
with
744 additions
and
59 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,73 @@ | ||
import re | ||
from django import forms | ||
from django.utils.translation import ugettext_lazy as _ | ||
|
||
|
||
class AddInterface(forms.Form): | ||
name = forms.CharField(max_length=10, required=True) | ||
itype = forms.ChoiceField(required=True, choices=(('bridge', 'bridge'), ('ethernet', 'ethernet'))) | ||
start_mode = forms.ChoiceField(required=True, | ||
choices=(('none', 'none'), ('onboot', 'onboot'), ('hotplug', 'hotplug'))) | ||
netdev = forms.CharField(max_length=15, required=True) | ||
ipv4_type = forms.ChoiceField(required=True, choices=(('dhcp', 'dhcp'), ('static', 'static'), ('none', 'none'))) | ||
ipv4_addr = forms.CharField(max_length=18, required=False) | ||
ipv4_gw = forms.CharField(max_length=15, required=False) | ||
ipv6_type = forms.ChoiceField(required=True, choices=(('dhcp', 'dhcp'), ('static', 'static'), ('none', 'none'))) | ||
ipv6_addr = forms.CharField(max_length=100, required=False) | ||
ipv6_gw = forms.CharField(max_length=100, required=False) | ||
stp = forms.ChoiceField(required=False, choices=(('on', 'on'), ('off', 'off'))) | ||
delay = forms.IntegerField(required=False) | ||
|
||
def clean_ipv4_addr(self): | ||
ipv4_addr = self.cleaned_data['ipv4_addr'] | ||
have_symbol = re.match('^[0-9./]+$', ipv4_addr) | ||
if not have_symbol: | ||
raise forms.ValidationError(_('The ipv4 must not contain any special characters')) | ||
elif len(ipv4_addr) > 20: | ||
raise forms.ValidationError(_('The ipv4 must not exceed 20 characters')) | ||
return ipv4_addr | ||
|
||
def clean_ipv4_gw(self): | ||
ipv4_gw = self.cleaned_data['ipv4_gw'] | ||
have_symbol = re.match('^[0-9.]+$', ipv4_gw) | ||
if not have_symbol: | ||
raise forms.ValidationError(_('The ipv4 gateway must not contain any special characters')) | ||
elif len(ipv4_gw) > 20: | ||
raise forms.ValidationError(_('The ipv4 gateway must not exceed 20 characters')) | ||
return ipv4_gw | ||
|
||
def clean_ipv6_addr(self): | ||
ipv6_addr = self.cleaned_data['ipv6_addr'] | ||
have_symbol = re.match('^[0-9a-f./:]+$', ipv6_addr) | ||
if not have_symbol: | ||
raise forms.ValidationError(_('The ipv6 must not contain any special characters')) | ||
elif len(ipv6_addr) > 100: | ||
raise forms.ValidationError(_('The ipv6 must not exceed 100 characters')) | ||
return ipv6_addr | ||
|
||
def clean_ipv6_gw(self): | ||
ipv6_gw = self.cleaned_data['ipv6_gw'] | ||
have_symbol = re.match('^[0-9.]+$', ipv6_gw) | ||
if not have_symbol: | ||
raise forms.ValidationError(_('The ipv6 gateway must not contain any special characters')) | ||
elif len(ipv6_gw) > 100: | ||
raise forms.ValidationError(_('The ipv6 gateway must not exceed 100 characters')) | ||
return ipv6_gw | ||
|
||
def clean_name(self): | ||
name = self.cleaned_data['name'] | ||
have_symbol = re.match('^[a-z0-9.]+$', name) | ||
if not have_symbol: | ||
raise forms.ValidationError(_('The interface must not contain any special characters')) | ||
elif len(name) > 10: | ||
raise forms.ValidationError(_('The interface must not exceed 10 characters')) | ||
return name | ||
|
||
def clean_netdev(self): | ||
netdev = self.cleaned_data['netdev'] | ||
have_symbol = re.match('^[a-z0-9.]+$', netdev) | ||
if not have_symbol: | ||
raise forms.ValidationError(_('The interface must not contain any special characters')) | ||
elif len(netdev) > 10: | ||
raise forms.ValidationError(_('The interface must not exceed 10 characters')) | ||
return netdev |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,3 +1,97 @@ | ||
from django.shortcuts import render | ||
from django.http import HttpResponseRedirect | ||
from django.core.urlresolvers import reverse | ||
from computes.models import Compute | ||
from interfaces.forms import AddInterface | ||
from vrtManager.interface import wvmInterface, wvmInterfaces | ||
from libvirt import libvirtError | ||
|
||
# Create your views here. | ||
|
||
def interfaces(request, compute_id): | ||
""" | ||
:param request: | ||
:return: | ||
""" | ||
|
||
if not request.user.is_authenticated(): | ||
return HttpResponseRedirect(reverse('index')) | ||
|
||
errors = [] | ||
ifaces_all = [] | ||
compute = Compute.objects.get(id=compute_id) | ||
|
||
try: | ||
conn = wvmInterfaces(compute.hostname, | ||
compute.login, | ||
compute.password, | ||
compute.type) | ||
ifaces = conn.get_ifaces() | ||
try: | ||
netdevs = conn.get_net_device() | ||
except: | ||
netdevs = ['eth0', 'eth1'] | ||
|
||
for iface in ifaces: | ||
ifaces_all.append(conn.get_iface_info(iface)) | ||
|
||
if request.method == 'POST': | ||
if 'create' in request.POST: | ||
form = AddInterface(request.POST) | ||
if form.is_valid(): | ||
data = form.cleaned_data | ||
conn.create_iface(data['name'], data['itype'], data['start_mode'], data['netdev'], | ||
data['ipv4_type'], data['ipv4_addr'], data['ipv4_gw'], | ||
data['ipv6_type'], data['ipv6_addr'], data['ipv6_gw'], | ||
data['stp'], data['delay']) | ||
return HttpResponseRedirect(request.get_full_path()) | ||
conn.close() | ||
except libvirtError as err: | ||
errors.append(err) | ||
|
||
return render(request, 'interfaces.html', locals()) | ||
|
||
|
||
def interface(request, compute_id, iface): | ||
""" | ||
:param request: | ||
:return: | ||
""" | ||
|
||
if not request.user.is_authenticated(): | ||
return HttpResponseRedirect(reverse('index')) | ||
|
||
errors = [] | ||
ifaces_all = [] | ||
compute = Compute.objects.get(id=compute_id) | ||
|
||
try: | ||
conn = wvmInterface(compute.hostname, | ||
compute.login, | ||
compute.password, | ||
compute.type, | ||
iface) | ||
start_mode = conn.get_start_mode() | ||
state = conn.is_active() | ||
mac = conn.get_mac() | ||
itype = conn.get_type() | ||
ipv4 = conn.get_ipv4() | ||
ipv4_type = conn.get_ipv4_type() | ||
ipv6 = conn.get_ipv6() | ||
ipv6_type = conn.get_ipv6_type() | ||
bridge = conn.get_bridge() | ||
|
||
if request.method == 'POST': | ||
if 'stop' in request.POST: | ||
conn.stop_iface() | ||
return HttpResponseRedirect(request.get_full_path()) | ||
if 'start' in request.POST: | ||
conn.start_iface() | ||
return HttpResponseRedirect(request.get_full_path()) | ||
if 'delete' in request.POST: | ||
conn.delete_iface() | ||
return HttpResponseRedirect(reverse('interfaces', args=[host_id])) | ||
conn.close() | ||
except libvirtError as err: | ||
errors.append(err) | ||
|
||
return render(request, 'interface.html', locals()) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,43 @@ | ||
import re | ||
from django import forms | ||
from django.utils.translation import ugettext_lazy as _ | ||
|
||
|
||
class AddNetPool(forms.Form): | ||
name = forms.CharField(error_messages={'required': _('No pool name has been entered')}, | ||
max_length=20) | ||
subnet = forms.CharField(error_messages={'required': _('No subnet has been entered')}, | ||
max_length=20) | ||
forward = forms.CharField(max_length=100) | ||
dhcp = forms.BooleanField(required=False) | ||
fixed = forms.BooleanField(required=False) | ||
bridge_name = forms.CharField(max_length=20, required=False) | ||
openvswitch = forms.BooleanField(required=False) | ||
|
||
def clean_name(self): | ||
name = self.cleaned_data['name'] | ||
have_symbol = re.match('^[a-zA-Z0-9._-]+$', name) | ||
if not have_symbol: | ||
raise forms.ValidationError(_('The pool name must not contain any special characters')) | ||
elif len(name) > 20: | ||
raise forms.ValidationError(_('The pool name must not exceed 20 characters')) | ||
return name | ||
|
||
def clean_subnet(self): | ||
subnet = self.cleaned_data['subnet'] | ||
have_symbol = re.match('^[0-9./]+$', subnet) | ||
if not have_symbol: | ||
raise forms.ValidationError(_('The pool subnet must not contain any special characters')) | ||
elif len(subnet) > 20: | ||
raise forms.ValidationError(_('The pool subnet must not exceed 20 characters')) | ||
return subnet | ||
|
||
def clean_bridge_name(self): | ||
bridge_name = self.cleaned_data['bridge_name'] | ||
if self.cleaned_data['forward'] == 'bridge': | ||
have_symbol = re.match('^[a-zA-Z0-9._-]+$', bridge_name) | ||
if not have_symbol: | ||
raise forms.ValidationError(_('The pool bridge name must not contain any special characters')) | ||
elif len(bridge_name) > 20: | ||
raise forms.ValidationError(_('The pool bridge name must not exceed 20 characters')) | ||
return bridge_name |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,3 +1,121 @@ | ||
from django.shortcuts import render | ||
from django.http import HttpResponseRedirect | ||
from django.utils.translation import ugettext_lazy as _ | ||
from django.core.urlresolvers import reverse | ||
from computes.models import Compute | ||
from networks.forms import AddNetPool | ||
from vrtManager.network import wvmNetwork, wvmNetworks | ||
from vrtManager.network import network_size | ||
from libvirt import libvirtError | ||
|
||
# Create your views here. | ||
|
||
def networks(request, compute_id): | ||
""" | ||
:param request: | ||
:return: | ||
""" | ||
|
||
if not request.user.is_authenticated(): | ||
return HttpResponseRedirect(reverse('index')) | ||
|
||
errors = [] | ||
compute = Compute.objects.get(id=compute_id) | ||
|
||
try: | ||
conn = wvmNetworks(compute.hostname, | ||
compute.login, | ||
compute.password, | ||
compute.type) | ||
networks = conn.get_networks_info() | ||
|
||
if request.method == 'POST': | ||
if 'create' in request.POST: | ||
form = AddNetPool(request.POST) | ||
if form.is_valid(): | ||
data = form.cleaned_data | ||
if data['name'] in networks: | ||
msg = _("Pool name already in use") | ||
errors.append(msg) | ||
if data['forward'] == 'bridge' and data['bridge_name'] == '': | ||
errors.append('Please enter bridge name') | ||
try: | ||
gateway, netmask, dhcp = network_size(data['subnet'], data['dhcp']) | ||
except: | ||
msg = _("Input subnet pool error") | ||
errors.append(msg) | ||
if not errors: | ||
conn.create_network(data['name'], data['forward'], gateway, netmask, | ||
dhcp, data['bridge_name'], data['openvswitch'], data['fixed']) | ||
return HttpResponseRedirect(reverse('network', args=[host_id, data['name']])) | ||
conn.close() | ||
except libvirtError as err: | ||
errors.append(err) | ||
|
||
return render(request, 'network.html', locals()) | ||
|
||
|
||
def network(request, compute_id, pool): | ||
""" | ||
:param request: | ||
:return: | ||
""" | ||
|
||
if not request.user.is_authenticated(): | ||
return HttpResponseRedirect(reverse('index')) | ||
|
||
errors = [] | ||
compute = Compute.objects.get(id=compute_id) | ||
|
||
try: | ||
conn = wvmNetwork(compute.hostname, | ||
compute.login, | ||
compute.password, | ||
compute.type, | ||
pool) | ||
networks = conn.get_networks() | ||
state = conn.is_active() | ||
device = conn.get_bridge_device() | ||
autostart = conn.get_autostart() | ||
ipv4_forward = conn.get_ipv4_forward() | ||
ipv4_dhcp_range_start = conn.get_ipv4_dhcp_range_start() | ||
ipv4_dhcp_range_end = conn.get_ipv4_dhcp_range_end() | ||
ipv4_network = conn.get_ipv4_network() | ||
fixed_address = conn.get_mac_ipaddr() | ||
except libvirtError as err: | ||
errors.append(err) | ||
|
||
if request.method == 'POST': | ||
if 'start' in request.POST: | ||
try: | ||
conn.start() | ||
return HttpResponseRedirect(request.get_full_path()) | ||
except libvirtError as error_msg: | ||
errors.append(error_msg.message) | ||
if 'stop' in request.POST: | ||
try: | ||
conn.stop() | ||
return HttpResponseRedirect(request.get_full_path()) | ||
except libvirtError as error_msg: | ||
errors.append(error_msg.message) | ||
if 'delete' in request.POST: | ||
try: | ||
conn.delete() | ||
return HttpResponseRedirect(reverse('networks', args=[host_id])) | ||
except libvirtError as error_msg: | ||
errors.append(error_msg.message) | ||
if 'set_autostart' in request.POST: | ||
try: | ||
conn.set_autostart(1) | ||
return HttpResponseRedirect(request.get_full_path()) | ||
except libvirtError as error_msg: | ||
errors.append(error_msg.message) | ||
if 'unset_autostart' in request.POST: | ||
try: | ||
conn.set_autostart(0) | ||
return HttpResponseRedirect(request.get_full_path()) | ||
except libvirtError as error_msg: | ||
errors.append(error_msg.message) | ||
|
||
conn.close() | ||
|
||
return render(request, 'network.html', locals()) |
Oops, something went wrong.