diff --git a/computes/forms.py b/computes/forms.py new file mode 100644 index 0000000..a626106 --- /dev/null +++ b/computes/forms.py @@ -0,0 +1,164 @@ +import re +from django import forms +from django.utils.translation import ugettext_lazy as _ +from computes.models import Compute + + +class ComputeAddTcpForm(forms.Form): + name = forms.CharField(error_messages={'required': _('No hostname has been entered')}, + max_length=20) + hostname = forms.CharField(error_messages={'required': _('No IP / Domain name has been entered')}, + max_length=100) + login = forms.CharField(error_messages={'required': _('No login has been entered')}, + max_length=100) + password = forms.CharField(error_messages={'required': _('No password has been entered')}, + max_length=100) + + def clean_name(self): + name = self.cleaned_data['name'] + have_symbol = re.match('[^a-zA-Z0-9._-]+', name) + if have_symbol: + raise forms.ValidationError(_('The host name must not contain any special characters')) + elif len(name) > 20: + raise forms.ValidationError(_('The host name must not exceed 20 characters')) + try: + Compute.objects.get(name=name) + except Compute.DoesNotExist: + return name + raise forms.ValidationError(_('This host is already connected')) + + def clean_hostname(self): + hostname = self.cleaned_data['hostname'] + have_symbol = re.match('[^a-z0-9.-]+', hostname) + wrong_ip = re.match('^0.|^255.', hostname) + if have_symbol: + raise forms.ValidationError(_('Hostname must contain only numbers, or the domain name separated by "."')) + elif wrong_ip: + raise forms.ValidationError(_('Wrong IP address')) + try: + Compute.objects.get(hostname=hostname) + except Compute.DoesNotExist: + return hostname + raise forms.ValidationError(_('This host is already connected')) + + +class ComputeAddSshForm(forms.Form): + name = forms.CharField(error_messages={'required': _('No hostname has been entered')}, + max_length=20) + hostname = forms.CharField(error_messages={'required': _('No IP / Domain name has been entered')}, + max_length=100) + login = forms.CharField(error_messages={'required': _('No login has been entered')}, + max_length=20) + + def clean_name(self): + name = self.cleaned_data['name'] + have_symbol = re.match('[^a-zA-Z0-9._-]+', name) + if have_symbol: + raise forms.ValidationError(_('The name of the host must not contain any special characters')) + elif len(name) > 20: + raise forms.ValidationError(_('The name of the host must not exceed 20 characters')) + try: + Compute.objects.get(name=name) + except Compute.DoesNotExist: + return name + raise forms.ValidationError(_('This host is already connected')) + + def clean_hostname(self): + hostname = self.cleaned_data['hostname'] + have_symbol = re.match('[^a-zA-Z0-9._-]+', hostname) + wrong_ip = re.match('^0.|^255.', hostname) + if have_symbol: + raise forms.ValidationError(_('Hostname must contain only numbers, or the domain name separated by "."')) + elif wrong_ip: + raise forms.ValidationError(_('Wrong IP address')) + try: + Compute.objects.get(hostname=hostname) + except Compute.DoesNotExist: + return hostname + raise forms.ValidationError(_('This host is already connected')) + + +class ComputeAddTlsForm(forms.Form): + name = forms.CharField(error_messages={'required': _('No hostname has been entered')}, + max_length=20) + hostname = forms.CharField(error_messages={'required': _('No IP / Domain name has been entered')}, + max_length=100) + login = forms.CharField(error_messages={'required': _('No login has been entered')}, + max_length=100) + password = forms.CharField(error_messages={'required': _('No password has been entered')}, + max_length=100) + + def clean_name(self): + name = self.cleaned_data['name'] + have_symbol = re.match('[^a-zA-Z0-9._-]+', name) + if have_symbol: + raise forms.ValidationError(_('The host name must not contain any special characters')) + elif len(name) > 20: + raise forms.ValidationError(_('The host name must not exceed 20 characters')) + try: + Compute.objects.get(name=name) + except Compute.DoesNotExist: + return name + raise forms.ValidationError(_('This host is already connected')) + + def clean_hostname(self): + hostname = self.cleaned_data['hostname'] + have_symbol = re.match('[^a-z0-9.-]+', hostname) + wrong_ip = re.match('^0.|^255.', hostname) + if have_symbol: + raise forms.ValidationError(_('Hostname must contain only numbers, or the domain name separated by "."')) + elif wrong_ip: + raise forms.ValidationError(_('Wrong IP address')) + try: + Compute.objects.get(hostname=hostname) + except Compute.DoesNotExist: + return hostname + raise forms.ValidationError(_('This host is already connected')) + + +class ComputeEditHostForm(forms.Form): + host_id = forms.CharField() + name = forms.CharField(error_messages={'required': _('No hostname has been entered')}, + max_length=20) + hostname = forms.CharField(error_messages={'required': _('No IP / Domain name has been entered')}, + max_length=100) + login = forms.CharField(error_messages={'required': _('No login has been entered')}, + max_length=100) + password = forms.CharField(max_length=100) + + def clean_name(self): + name = self.cleaned_data['name'] + have_symbol = re.match('[^a-zA-Z0-9._-]+', name) + if have_symbol: + raise forms.ValidationError(_('The name of the host must not contain any special characters')) + elif len(name) > 20: + raise forms.ValidationError(_('The name of the host must not exceed 20 characters')) + return name + + def clean_hostname(self): + hostname = self.cleaned_data['hostname'] + have_symbol = re.match('[^a-zA-Z0-9._-]+', hostname) + wrong_ip = re.match('^0.|^255.', hostname) + if have_symbol: + raise forms.ValidationError(_('Hostname must contain only numbers, or the domain name separated by "."')) + elif wrong_ip: + raise forms.ValidationError(_('Wrong IP address')) + return hostname + + +class ComputeAddSocketForm(forms.Form): + name = forms.CharField(error_messages={'required': _('No hostname has been entered')}, + max_length=20) + + def clean_name(self): + name = self.cleaned_data['name'] + have_symbol = re.match('[^a-zA-Z0-9._-]+', name) + if have_symbol: + raise forms.ValidationError(_('The host name must not contain any special characters')) + elif len(name) > 20: + raise forms.ValidationError(_('The host name must not exceed 20 characters')) + try: + Compute.objects.get(name=name) + except Compute.DoesNotExist: + return name + raise forms.ValidationError(_('This host is already connected')) diff --git a/computes/views.py b/computes/views.py index be8558e..699909a 100644 --- a/computes/views.py +++ b/computes/views.py @@ -2,8 +2,10 @@ from django.http import HttpResponseRedirect from django.core.urlresolvers import reverse from django.shortcuts import render from computes.models import Compute +from instances.models import Instance +from computes.forms import ComputeAddTcpForm, ComputeAddSshForm, ComputeEditHostForm, ComputeAddTlsForm, ComputeAddSocketForm from vrtManager.hostdetails import wvmHostDetails -from vrtManager.connection import connection_manager +from vrtManager.connection import CONN_SSH, CONN_TCP, CONN_TLS, CONN_SOCKET, connection_manager from libvirt import libvirtError @@ -38,6 +40,71 @@ def computes(request): computes = Compute.objects.filter() computes_info = get_hosts_status(computes) + if request.method == 'POST': + if 'host_del' in request.POST: + compute_id = request.POST.get('host_id', '') + try: + del_inst_on_host = Instance.objects.filter(compute_id=compute_id) + del_inst_on_host.delete() + finally: + del_host = Compute.objects.get(id=compute_id) + del_host.delete() + return HttpResponseRedirect(request.get_full_path()) + if 'host_tcp_add' in request.POST: + form = ComputeAddTcpForm(request.POST) + if form.is_valid(): + data = form.cleaned_data + new_tcp_host = Compute(name=data['name'], + hostname=data['hostname'], + type=CONN_TCP, + login=data['login'], + password=data['password']) + new_tcp_host.save() + return HttpResponseRedirect(request.get_full_path()) + if 'host_ssh_add' in request.POST: + form = ComputeAddSshForm(request.POST) + if form.is_valid(): + data = form.cleaned_data + new_ssh_host = Compute(name=data['name'], + hostname=data['hostname'], + type=CONN_SSH, + login=data['login']) + new_ssh_host.save() + return HttpResponseRedirect(request.get_full_path()) + if 'host_tls_add' in request.POST: + form = ComputeAddTlsForm(request.POST) + if form.is_valid(): + data = form.cleaned_data + new_tls_host = Compute(name=data['name'], + hostname=data['hostname'], + type=CONN_TLS, + login=data['login'], + password=data['password']) + new_tls_host.save() + return HttpResponseRedirect(request.get_full_path()) + if 'host_socket_add' in request.POST: + form = ComputeAddSocketForm(request.POST) + if form.is_valid(): + data = form.cleaned_data + new_socket_host = Compute(name=data['name'], + hostname='localhost', + type=CONN_SOCKET, + login='', + password='') + new_socket_host.save() + return HttpResponseRedirect(request.get_full_path()) + if 'host_edit' in request.POST: + form = ComputeEditHostForm(request.POST) + if form.is_valid(): + data = form.cleaned_data + compute_edit = Compute.objects.get(id=data['host_id']) + compute_edit.name = data['name'] + compute_edit.hostname = data['hostname'] + compute_edit.login = data['login'] + compute_edit.password = data['password'] + compute_edit.save() + return HttpResponseRedirect(request.get_full_path()) + return render(request, 'computes.html', locals()) def overview(request, compute_id): diff --git a/templates/computes.html b/templates/computes.html index d97bb9c..399afd5 100644 --- a/templates/computes.html +++ b/templates/computes.html @@ -63,34 +63,25 @@