diff --git a/.DS_Store b/.DS_Store index 5008ddf..32f4520 100644 Binary files a/.DS_Store and b/.DS_Store differ diff --git a/moc_ui/.DS_Store b/moc_ui/.DS_Store index 6328399..19a7c06 100644 Binary files a/moc_ui/.DS_Store and b/moc_ui/.DS_Store differ diff --git a/moc_ui/auth.py b/moc_ui/auth.py index f165cae..69ec7fc 100644 --- a/moc_ui/auth.py +++ b/moc_ui/auth.py @@ -1,24 +1,33 @@ from os import environ as env # Client package -import novaclient.v1_1.client as nvclient -import glanceclient.v2.client as glclient -import keystoneclient.v2_0.client as ksclient +#import novaclient.v1_1.client as nvclient + +#from novaclient import client as nvclient + +#import glanceclient.v2.client as glclient +#import keystoneclient.v2_0.client as ksclient # from keystoneclient.auth.identity import v2 -from keystoneclient import session -from novaclient import client + +from keystoneauth1.identity import v3 + +from keystoneauth1 import session + +from keystoneclient.v3 import client as ksclient +from novaclient import client as nvclient +from glanceclient import client as glclient # Socks -import socks -import socket +#import socks +#import socket # Set up SOCKS proxy usage: -s = socks.socksocket() +#s = socks.socksocket() # Set up the Port number as the one used for connecting Harvard Cluster -socks.set_default_proxy(socks.SOCKS5, 'localhost', 5507) -socket.socket = socks.socksocket +#socks.set_default_proxy(socks.SOCKS5, 'localhost', 5507) +#socket.socket = socks.socksocket # Log User to his/her associated Tenant def loginTenant(request, tenant_name): @@ -28,41 +37,76 @@ def loginTenant(request, tenant_name): username = request.session['username'] password = request.session['password'] - + auth_url = 'https://engage1.massopencloud.org:5000/v3/' + print 'lucas-test-auth-loginTenant' - keystone = ksclient.Client(auth_url = 'http://140.247.152.207:5000/v2.0', username = username, - password = password, tenant_name = tenant_name) + + unscoped_auth = v3.Password(auth_url = auth_url, username = username, password = password, user_domain_name="Default", unscoped=True) + unscoped_sess=session.Session(auth=unscoped_auth) + unscoped_token=unscoped_sess.get_token() + auth=v3.Token(auth_url = auth_url,token=unscoped_token) + sess=session.Session(auth=auth) + #scoped_token=sess.get_token() + keystone = ksclient.Client(session=sess) + # keystone = ksclient.Client(auth_url = 'https://engage1.massopencloud.org:5000/v2.0/', username = username, + # password = password, tenant_name = tenant_name) print 'lucas-test-auth-loginTenant-succesfully' - nova = nvclient.Client(auth_url = 'http://140.247.152.207:5000/v2.0', - username = username, - api_key = password, - project_id = tenant_name) - glance_endpoint = keystone.service_catalog.url_for(service_type='image') - glance = glclient.Client(glance_endpoint, token = keystone.auth_token) + # nova = nvclient.Client('2', auth_url = 'https://engage1.massopencloud.org:5000/v2.0/', + # username = username, + # api_key = password, + # project_id = tenant_name) + nova = nvclient.Client('2', session=sess) + glance = glclient.Client('2', session=sess) return {'keystone': keystone, 'nova': nova, 'glance': glance} def get_keystone(request, tenant_name): username = request.session['username'] password = request.session['password'] - keystone = ksclient.Client(auth_url = 'http://140.247.152.207:5000/v2.0', username = username, - password = password, tenant_name = tenant_name) + auth_url = 'https://engage1.massopencloud.org:5000/v3/' + # keystone = ksclient.Client(auth_url = 'https://engage1.massopencloud.org:5000/v2.0/', username = username, + # password = password, tenant_name = tenant_name) + unscoped_auth = v3.Password(auth_url = auth_url, username = username, password = password, user_domain_name="Default", unscoped=True) + unscoped_sess=session.Session(auth=unscoped_auth) + unscoped_token=unscoped_sess.get_token() + auth=v3.Token(auth_url = auth_url,token=unscoped_token) + sess=session.Session(auth=auth) + #scoped_token=sess.get_token() + keystone = ksclient.Client(session=sess) return keystone def get_nova(request, tenant_name): username = request.session['username'] password = request.session['password'] - nova = nvclient.Client(auth_url = 'http://140.247.152.207:5000/v2.0', - username = username, - api_key = password, - project_id = tenant_name) + auth_url = 'https://engage1.massopencloud.org:5000/v3/' + + unscoped_auth = v3.Password(auth_url = auth_url, username = username, + password = password, user_domain_name="Default", unscoped=True) + unscoped_sess=session.Session(auth=unscoped_auth) + unscoped_token=unscoped_sess.get_token() + auth=v3.Token(auth_url = auth_url,token=unscoped_token) + sess=session.Session(auth=auth) + nova = nvclient.Client('2', session=sess) + # nova = nvclient.Client('2', auth_url = 'https://engage1.massopencloud.org:5000/v2.0/', + # username = username, + # api_key = password, + # project_id = tenant_name) return nova def get_glance(request, tenant_name): username = request.session['username'] password = request.session['password'] - glance_endpoint = keystone.service_catalog.url_for(service_type='image') - glance = glclient.Client(glance_endpoint, token = keystone.auth_token) - return {'keystone': keystone, 'nova': nova, 'glance': glance} + auth_url = 'https://engage1.massopencloud.org:5000/v3/' + + # keystone = get_keystone(request,tenant_name) + # nova = get_nova(request,tenant_name) + unscoped_auth = v3.Password(auth_url = auth_url, username = username, + password = password, user_domain_name="Default", unscoped=True) + unscoped_sess=session.Session(auth=unscoped_auth) + unscoped_token=unscoped_sess.get_token() + auth=v3.Token(auth_url = auth_url,token=unscoped_token) + sess=session.Session(auth=auth) + glance = glclient.Client('2', session=sess) + return glance @@ -73,7 +117,7 @@ def get_glance(request, tenant_name): # print 'lucas-test-auth-loginUser' # keystone = ksclient.Client( -# auth_url = 'http://140.247.152.207:5000/v2.0', +# auth_url = 'https://engage1.massopencloud.org:5000/v2.0/', # username = username, # password = password) # print 'lucas-test-auth-loginUser-succesfully' @@ -81,7 +125,7 @@ def get_glance(request, tenant_name): # def _loginTenant (request, username, password, tenant_name): -# auth_url = 'http://140.247.152.207:5000/v2.0' +# auth_url = 'https://engage1.massopencloud.org:5000/v2.0/' # auth = v2.Password(auth_url = auth_url, username = username, password = password, tenant_name = tenant_name) # sess = session.Session(auth=auth) # nova = client.Client('1.1', session=sess) diff --git a/moc_ui/dicts.py b/moc_ui/dicts.py index fc1c8a1..9feeaec 100644 --- a/moc_ui/dicts.py +++ b/moc_ui/dicts.py @@ -10,11 +10,16 @@ login_buttons = [{'name': 'Login', 'type': 'submit', 'action': '/login/', 'class': 'btn-primary'}, {'name': 'Register', 'type': 'modal', 'data_target': '#createUser', 'class': 'btn-success'}] - login_data = {'name': 'MassOpenCloud Login', 'action': '/login', 'method': 'post', 'button_list': login_buttons} -reg_modal = {'id': 'createUser', 'action': '/register', 'method': 'post', 'title': 'Register User'} +reg_modal = {'id': 'createUser', 'action': '/register', 'method': 'post', 'title': 'Register User'} + +#CONTROL PAGE +vm_buttons = {'name': 'Create', 'type': 'modal', 'data_target': '#createVM', 'class': 'btn-success'} + +vm_data = {'name': 'Create a VM', 'action': '/createVM', 'method': 'post', 'button_list': vm_buttons} +vm_modal = {'id': 'create VM', 'action': '/createVM', 'method': 'post', 'title': 'Create a New VM'} # CLOUDS PAGE test_vm_list_1 = [{'name': 'hadoop master', 'state': '=)', 'provider': 'HU-prod', 'image': 'centOS 7'}, diff --git a/moc_ui/fixtures/projects.json b/moc_ui/fixtures/projects.json index cf34230..9d4747a 100644 --- a/moc_ui/fixtures/projects.json +++ b/moc_ui/fixtures/projects.json @@ -3,7 +3,7 @@ "model": "moc_ui.ClusterProject", "pk": 1, "fields": { - "name": "ui", + "name": "atmosphere", "token": "" } }, @@ -11,7 +11,7 @@ "model": "moc_ui.ClusterProject", "pk": 2, "fields": { - "name": "bit_coin_farm", + "name": "another_dummy_project", "token": "" } } diff --git a/moc_ui/fixtures/service_list.json b/moc_ui/fixtures/service_list.json index d57af1f..d75b752 100644 --- a/moc_ui/fixtures/service_list.json +++ b/moc_ui/fixtures/service_list.json @@ -115,7 +115,7 @@ "pk": 11, "fields": { "name": "Hadoop", - "service_type": "Service", + "service_type": "Compute", "description" : "Apache Hadoop", "logo_url":"/static/hadoop.jpg", "availability":"True" @@ -143,18 +143,59 @@ "availability":"True" } }, - { + { + "model": "moc_ui.service", + "pk": 14, + "fields": { + "name": "Ubuntu", + "service_type": "Service", + "description" : "Ubuntu vm image", + "logo_url":"/static/Ubuntu.jpg", + "availability":"True", + "image_name" : "Ubuntu 14.04.2 LTS (Trusty Tahr) x86_64" + + } + }, + { + "model": "moc_ui.service", + "pk": 15, + "fields": { + "name": "CentOS", + "service_type": "Service", + "description" : "CentOS vm image", + "logo_url":"/static/CentOS.png", + "availability":"True", + "image_name" : "CentOS-7-x86_64-GenericCloud-1503.qcow2" + + + } + }, + { + "model": "moc_ui.service", + "pk": 16, + "fields": { + "name": "Fedora", + "service_type": "Service", + "description" : "Fedora VM image", + "logo_url":"/static/Fedora.jpg", + "availability":"True", + "image_name" : "Fedora-Cloud-Base-20141203-21.x86_64.qcow2" + + + } + }, + { "model": "moc_ui.uiproject", "pk": 1, "fields": { - "name": "big_data" + "name": "ui" } }, { "model": "moc_ui.uiproject", "pk": 2, "fields": { - "name": "webservers" + "name": "another_one" } }, { diff --git a/moc_ui/fixtures/users.json b/moc_ui/fixtures/users.json index 41cedbf..73d798e 100644 --- a/moc_ui/fixtures/users.json +++ b/moc_ui/fixtures/users.json @@ -2,7 +2,7 @@ { "model":"moc_ui.user", "fields": { - "user_name": "xuh", + "user_name": "xuh@bu.edu", "password_hash": "$6$rounds=100000$wroWL0h4EVKrnMEa$UzEFNumbOj2mmDxlRfXM8DQ3FRuWxakNFL43NJxCRYQSfRDzj4wPuWiHAvyY6hPZu5YgL8qnAIfrgbRcD0U2C0" } } diff --git a/moc_ui/forms.py b/moc_ui/forms.py index 753a21b..c347796 100644 --- a/moc_ui/forms.py +++ b/moc_ui/forms.py @@ -3,9 +3,9 @@ from django.http import HttpResponseRedirect import models -import novaclient.v1_1.client as nvclient -import glanceclient.v2.client as glclient -import keystoneclient.v2_0.client as ksclient +# import novaclient.v1_1.client as nvclient +# import glanceclient.v2.client as glclient +# import keystoneclient.v2_0.client as ksclient import ui_api as api class Login(forms.Form): @@ -180,25 +180,51 @@ class Meta: # vm actions class Create_VM(forms.Form): - name = forms.CharField() - cluster_projects = [] - for p in models.ClusterProject.objects.all().values('name').distinct(): #for all - cluster_projects.append((p['name'], p['name'])) - cluster_project = forms.ChoiceField(widget=forms.Select, choices=cluster_projects) - - #nova = api.get_nova(request, project) #get nova object - - #image choices - #image_choices = [] - #for option in nova.images.list(): - # image_coices.append(str(option.name)) - #imageName = forms.ChoiceField(widget=forms.Select, choices=image_choices) - - #flavor choices - #flavor_choices = [] - #for option in nova.flavors.list(): - # flavor_choices.append(str(option.name)) - #flavorName = forms.ChoiceField(widget=forms.Select, choices=flavor_choices) + + # def __init__(self,request,*args,**kwargs): + # super (Create_VM, self).__init__(*args,**kwargs) + + # self.fields['name'] = forms.CharField() + service_list = [] + try: + services = models.ClusterProject_service.objects.all() + for service in services: + print service + + print service_list + except Exception as e: + print 'err' + print e + name = forms.CharField() + + + # self.fields['image'] = forms.ChoiceField(widget =forms.Select, choices = ([(ubuntu,ubuntu),(centos,centos)])) + # image = forms.ChoiceField(widget =forms.Select, choices = ([(ubuntu,ubuntu),(centos,centos)])) + image = forms.ModelChoiceField(queryset = services, initial = 0) + + # flavor_list = models.Service.objects.values('flavor') + + # medium = flavor_list[13]['flavor'] + # tiny = flavor_list[14]['flavor'] + + m = 'm1.medium' + t = 'm1.tiny' + l = 'm1.large' + s = 'm1.small' + x = 'm1.xlarge' + # self.fields['flavor'] = forms.ChoiceField(widget = forms.Select, choices = ([(m,m),(t,t),(l,l)])) + flavor = forms.ChoiceField(widget = forms.Select, choices = ([(m,m),(x,x),(l,l),(s,s),(t,t)])) + + + def save(self, request, force_insert=False, force_update=False, commit=True): + + name = self.cleaned_data['name'] + image = str(self.cleaned_data['image']) + flavor = self.cleaned_data['flavor'] + nova = api.get_nova(request, 'ui') + + api.createVM(nova, name, image, flavor) + class Delete_VM(forms.Form): name = forms.CharField() diff --git a/moc_ui/html_helpers.py b/moc_ui/html_helpers.py index 3a55fd6..c161923 100644 --- a/moc_ui/html_helpers.py +++ b/moc_ui/html_helpers.py @@ -13,8 +13,12 @@ def project_modals(request): {'id':'add_Cluster_Project', 'action':'/create/ClusterProject', 'title':'Add Cluster Project', 'form':forms.ClusterProject()}, {'id':'delete_Cluster_Project', 'action':'/delete/ClusterProject', - 'title':'Delete Cluster Project', 'form':forms.ClusterProject()}, - #{'id':'createVM', 'title':'Create VM', 'form':forms.create_VM()}, - {'id':'deleteVM', 'action':'/delete/Cluster', - 'title':'Delete VM', 'form':forms.Delete_VM()}, + 'title':'Delete Cluster Project', 'form':forms.ClusterProject()} + ] +def vm_modals(request): + return [{'id':'createVM', 'action' : '/createVM/ui', + 'title':'Create VM', 'form':forms.Create_VM()}, + {'id':'deleteVM', 'action':'/deleteVM', + 'title':'Delete VM', 'form':forms.Delete_VM()} + ] \ No newline at end of file diff --git a/moc_ui/models.py b/moc_ui/models.py index 5e98aac..44ff059 100644 --- a/moc_ui/models.py +++ b/moc_ui/models.py @@ -44,10 +44,18 @@ class Service(models.Model): description = models.CharField(max_length=DEFAULT_FIELD_LEN) logo_url = models.CharField(max_length=DEFAULT_FIELD_LEN) availability = models.BooleanField(default=False) - + image_name = models.CharField(max_length = DEFAULT_FIELD_LEN) + def __unicode__(self): return self.name +# Flavor for VM +# class Flavor (models.Model): +# flavor = models.CharField(max_length=DEFAULT_FIELD_LEN) +# def __unicode__ (self): +# return self.name + + # Cluster information class Cluster(models.Model): """An openstack installation available to users.""" @@ -78,7 +86,7 @@ class UIProject(models.Model): def __unicode__(self): return self.name -# Defining the relation. +# Joint_table for Service and Project class UIProject_service_list(models.Model): TYPE_CHOICES = (('NOR','normal'), ('DEA', 'default')) project = models.ForeignKey(UIProject) @@ -153,5 +161,5 @@ class ClusterProject_service(models.Model): service = models.ForeignKey(Service) def __unicode__(self): - return 'Project Name: ' + self.project.name + ' Servise Name: ' + self.service.name + (" default selection. " if self.default else "") + return self.service.image_name diff --git a/moc_ui/templates/control.html b/moc_ui/templates/control.html index 7d1752f..a5021f9 100644 --- a/moc_ui/templates/control.html +++ b/moc_ui/templates/control.html @@ -16,7 +16,29 @@

{{project}}'s control panel

-
+
+ + + + + + + + + M + + + + N + + + + S + +
@@ -24,7 +46,7 @@

{{project}}'s control panel

-
+
-

{{project}}'s VMs

+ - - - + + + - - + Default VM + -->
@@ -70,8 +84,8 @@

{{project}}'s VMs

Status Image Flavour - Network - VNC + + Actions @@ -83,8 +97,8 @@

{{project}}'s VMs

{{vm.status}} {{vm.image}} {{vm.flavor}} - {{vm.network}} - {{vm.vnc}} + +
{% if vm.status = 'ACTIVE' %} @@ -125,12 +139,10 @@

{{project}}'s VMs

- {% for form_data in cloud_modals %} - {% include "modals/cloudModal.html" %} + {% for form_data in vm_modals %} + {% include "modals/projectModal.html" %} {% endfor %} - {% include "modals/createVM.html" %} -
{% endfor %} {% endblock %} diff --git a/moc_ui/templates/network.html b/moc_ui/templates/network.html index 56a92c4..22070e6 100644 --- a/moc_ui/templates/network.html +++ b/moc_ui/templates/network.html @@ -18,92 +18,9 @@

{{request.session.user_name}}'s network<

-
-
-

{{project}}'s Virtual Machine

-
-
- - - -
-
-
- -
-
-

{{project}}'s VMs

- - - - - - - - - - - - -
- - - - - - - - - - - - - - - - {% for vm in vms %} - - - - - - - - - - - {% endfor %} - -
NameIDStatusImageFlavourNetworkVNCActions
{{vm.name}}{{vm.id}}{{vm.status}}{{vm.image}}{{vm.flavor}}{{vm.network}}{{vm.vnc}} -
- {% if vm.status = 'ACTIVE' %} - - - - {% else %} - - - - {% endif %} - - - - {% if vm.status = 'SHUTOFF' %} - - - - {% else %} - - - - {% endif %} -
-
-
- +
+ diff --git a/moc_ui/templates/storage.html b/moc_ui/templates/storage.html new file mode 100644 index 0000000..e94757e --- /dev/null +++ b/moc_ui/templates/storage.html @@ -0,0 +1,32 @@ +{% extends "base.html" %} + +{% block title %}{{request.session.user_name}}'s Storage{% endblock %} + +{% block content %} +{% for project in project %} +
+ +
+
+
+
+
+
+
+

{{request.session.user_name}}'s storage

+
+
+
+
+ +
+ + +
+
+
+
+{% endfor %} +{% endblock %} + diff --git a/moc_ui/ui_api.py b/moc_ui/ui_api.py index 1d1b716..15bf01c 100644 --- a/moc_ui/ui_api.py +++ b/moc_ui/ui_api.py @@ -38,8 +38,7 @@ def listVMs(nova): 'status':server.status, 'image':nova.images.get(server.image[u'id']).name, 'flavor':nova.flavors.get(server.flavor[u'id']).name, - 'network':network, - 'vnc':'-' + # 'network':network } ''' if server.status != 'BUILD': @@ -64,8 +63,8 @@ def _listVMs(): 'status':server.status, 'image':nova.images.get(server.image[u'id']).name, 'flavor':nova.flavors.get(server.flavor[u'id']).name, - 'network':'-', - 'vnc':'-' + # 'network':'-', + # 'vnc':'-' } if server.status != 'BUILD': vm['vnc'] = server.get_vnc_console('novnc')[u'console'][u'url'] @@ -101,14 +100,11 @@ def listFlavors(nova): flavors.append(flavor) return flavors -def createVM(nova, VMname, imageName, flavorName): - """ - Create VM on current tenant with specified information - """ - image = nova.images.find(name=imageName) - fl = nova.flavors.find(name=flavorName) +def createVM(nova, name, image, flavor): + imageVM = nova.images.find(name=image) + fl = nova.flavors.find(name=flavor) nics = [{"net-id": nova.networks.list()[0].id, "v4-fixed-ip": ''}] - nova.servers.create(VMname, image=image, flavor=fl, meta=None, files=None, nics=nics) + nova.servers.create(name, image=imageVM, flavor=fl, meta=None, files=None, nics=nics) def createDefault(nova): fl = nova.flavors.find(name='m1.small') diff --git a/moc_ui/urls.py b/moc_ui/urls.py index 8a948ce..25ebd2c 100644 --- a/moc_ui/urls.py +++ b/moc_ui/urls.py @@ -22,8 +22,10 @@ url(r'^market\/(?P.+)\/(?P.+)\/(?Ptoggle_active|toggle_default)\/?$', market), # project control page url(r'^control\/(?P.+)?\/$', control), - # + # network page url(r'^network\/(?P.+)?\/$', network), + # storage page + url(r'^storage\/(?P.+)?\/$', storage), #VM pause/unpause url(r'^VM_active_state_toggle\/(?P.+)?\/(?P.+)\/?$', VM_active_state_toggle), #VM default add @@ -48,7 +50,7 @@ url(r'^create/(?P.+)', create_object), url(r'^delete/(?P.+)', delete_object), # VM creatoin - url(r'^VM_add', VM_add), + url(r'^createVM\/(?P.+)', create_VM), # projects control # url(r'^createProject', createProject), # url(r'^deleteProject', deleteProject), diff --git a/moc_ui/views.py b/moc_ui/views.py index 6f444ef..422a85c 100644 --- a/moc_ui/views.py +++ b/moc_ui/views.py @@ -51,7 +51,7 @@ def helps(request): def projects(request): - tenant = api.joinTenant(request, 'ui') + tenant = api.joinTenant(request, 'atmosphere') project_name = models.ClusterProject.objects.all() project_list = [] for project in project_name: @@ -63,82 +63,29 @@ def projects(request): ## Project Control Page def control(request, project): - - createVMform = forms.Create_VM() + vms = api.listVMs(api.get_nova(request, project)) return render(request, 'control.html', {'project': [project], 'vms': vms, - 'createVMform': createVMform }) + 'vm_modals': html.vm_modals(request) + }) ## Network Page def network(request, project): - createVMform = forms.Create_VM() - vms = api.listVMs(api.get_nova(request, project)) + return render(request, 'network.html', - {'project': [project] , 'vms': vms, - 'createVMform': createVMform }) - - -# VM CONTROLS -def VM_active_state_toggle (request, project, VMid): - print (project, VMid) - print VMid[len(VMid)-1] - print VMid[:len(VMid)-1] - if VMid[len(VMid)-1] == '/': - VMid = VMid[:len(VMid)-1] - nova = api.get_nova(request, project) - api.VM_active_state_toggle(nova, VMid) - return HttpResponseRedirect('/control/' + project + '/') - -# VM Delete -def VM_delete(request, project, VMid): - print (project, VMid) #debugging - if VMid[len(VMid)-1] == '/': #strip ending / - VMid = VMid[:len(VMid)-1] - nova = api.get_nova(request, project) #get nova object - api.delete(nova, VMid) #delete specified Nova object - return HttpResponseRedirect('/control/' + project + '/') #back to control + {'project': [project]}) -# VM start -def VM_start(request, project, VMid): - print (project, VMid) #debugging - if VMid[len(VMid)-1] == '/': #strip ending / - VMid = VMid[:len(VMid)-1] - nova = api.get_nova(request, project) #get nova object - api.startVM(nova, VMid) #start specified Nova object - return HttpResponseRedirect('/control/' + project + '/') #back to control +## Network Page +def storage(request, project): + -# VM stop -def VM_stop(request, project, VMid): - print (project, VMid) #debugging - if VMid[len(VMid)-1] == '/': #strip ending / - VMid = VMid[:len(VMid)-1] - nova = api.get_nova(request, project) #get nova object - api.stopVM(nova, VMid) #stop specified Nova object - return HttpResponseRedirect('/control/' + project + '/') #back to control + return render(request, 'storage.html', + {'project': [project]}) -# VM add default -def VM_add_default(request, project): - print (project) - nova = api.get_nova(request, project) #get nova object - api.createDefault(nova) - return HttpResponseRedirect('/control/' + project + '/') #back to control - -# VM add custom -def VM_add(request, project, VMname, imageName, flavorName): - print (project, VMname, imageName, flavorName) #debugging -# if request.method == 'POST': -# form = forms.Create_VM(request.POST) -# if form.is_valid(): -# print "form is valid." -# nameVM = form.cleaned_data['VM_name'] -# nameFlavor - nova = api.get_nova(request, project) #get nova object - api.createVM(nova, VMname, imageName, flavorName) #add specified Nova object - return HttpResponseRedirect('/control/' + project + '/') #back to control #def login(request): # """View to Login a user @@ -447,3 +394,71 @@ def control_vm(request, action, vm_name): # check that the user has privalidge on vm # actually do the action pass + +# VM CONTROLS +def VM_active_state_toggle (request, project, VMid): + print (project, VMid) + print VMid[len(VMid)-1] + print VMid[:len(VMid)-1] + if VMid[len(VMid)-1] == '/': + VMid = VMid[:len(VMid)-1] + nova = api.get_nova(request, project) + api.VM_active_state_toggle(nova, VMid) + return HttpResponseRedirect('/control/' + project + '/') + +# VM Delete +def VM_delete(request, project, VMid): + print (project, VMid) #debugging + if VMid[len(VMid)-1] == '/': #strip ending / + VMid = VMid[:len(VMid)-1] + nova = api.get_nova(request, project) #get nova object + api.delete(nova, VMid) #delete specified Nova object + return HttpResponseRedirect('/control/' + project + '/') #back to control + +# VM start +def VM_start(request, project, VMid): + print (project, VMid) #debugging + if VMid[len(VMid)-1] == '/': #strip ending / + VMid = VMid[:len(VMid)-1] + nova = api.get_nova(request, project) #get nova object + api.startVM(nova, VMid) #start specified Nova object + return HttpResponseRedirect('/control/' + project + '/') #back to control + +# VM stop +def VM_stop(request, project, VMid): + print (project, VMid) #debugging + if VMid[len(VMid)-1] == '/': #strip ending / + VMid = VMid[:len(VMid)-1] + nova = api.get_nova(request, project) #get nova object + api.stopVM(nova, VMid) #stop specified Nova object + return HttpResponseRedirect('/control/' + project + '/') #back to control + +# VM add default +def VM_add_default(request, project): + print (project) + nova = api.get_nova(request, project) #get nova object + api.createDefault(nova) + return HttpResponseRedirect('/control/' + project + '/') #back to control + +# VM add custom +def create_VM(request, project): + print 'lucas-test-enter-view-create_VM' + if request.method == 'POST': + form = forms.Create_VM(request.POST) + + if form.is_valid(): + print 'lucas-test-view-create_VM_beforeSave' + try: + form.save(request) + except Exception as e: + print "Hit exception:" + print e + + print 'lucas-test-view-create_VM_afterSave' + else: + for field in form: + print "%s: %s" % (field.label_tag(), field.value()) + + print form.errors + + return HttpResponseRedirect('/control/' + project + '/') \ No newline at end of file diff --git a/static/CentOS.png b/static/CentOS.png new file mode 100644 index 0000000..85314ef Binary files /dev/null and b/static/CentOS.png differ diff --git a/static/Fedora.jpg b/static/Fedora.jpg new file mode 100644 index 0000000..2cea600 Binary files /dev/null and b/static/Fedora.jpg differ diff --git a/static/Ubuntu.jpg b/static/Ubuntu.jpg new file mode 100644 index 0000000..a2d3008 Binary files /dev/null and b/static/Ubuntu.jpg differ diff --git "a/static/http:\\\\www.google.com\\url?sa=i&rct=j&q=&esrc=s&source=images&cd=&ved=0CAcQjRw&url=http%3A%2F%2Fwww.zazzle.com%2Fubuntu%2Blogo%2Bstickers&ei=c-pUVeiLBcOwggTC5oHIBQ&bvm=bv.93112503,d.eXY&psig=AFQjCNFHa9hfkVKppY3gtkUY9k1dSbJpAA&ust=1431714354270359.desktop" "b/static/http:\\\\www.google.com\\url?sa=i&rct=j&q=&esrc=s&source=images&cd=&ved=0CAcQjRw&url=http%3A%2F%2Fwww.zazzle.com%2Fubuntu%2Blogo%2Bstickers&ei=c-pUVeiLBcOwggTC5oHIBQ&bvm=bv.93112503,d.eXY&psig=AFQjCNFHa9hfkVKppY3gtkUY9k1dSbJpAA&ust=1431714354270359.desktop" new file mode 100644 index 0000000..8665b75 --- /dev/null +++ "b/static/http:\\\\www.google.com\\url?sa=i&rct=j&q=&esrc=s&source=images&cd=&ved=0CAcQjRw&url=http%3A%2F%2Fwww.zazzle.com%2Fubuntu%2Blogo%2Bstickers&ei=c-pUVeiLBcOwggTC5oHIBQ&bvm=bv.93112503,d.eXY&psig=AFQjCNFHa9hfkVKppY3gtkUY9k1dSbJpAA&ust=1431714354270359.desktop" @@ -0,0 +1,6 @@ +[Desktop Entry] +Encoding=UTF-8 +Name=Link to http://www.google.com/url?sa=i&rct=j&q=&esrc=s&source=images&cd=&ved=0CAcQjRw&url=http%3A%2F%2Fwww.zazzle.com%2Fubuntu%2Blogo%2Bstickers&ei=c-pUVeiLBcOwggTC5oHIBQ&bvm=bv.93112503,d.eXY&psig=AFQjCNFHa9hfkVKppY3gtkUY9k1dSbJpAA&ust=1431714354270359 +Type=Link +URL=http://www.google.com/url?sa=i&rct=j&q=&esrc=s&source=images&cd=&ved=0CAcQjRw&url=http%3A%2F%2Fwww.zazzle.com%2Fubuntu%2Blogo%2Bstickers&ei=c-pUVeiLBcOwggTC5oHIBQ&bvm=bv.93112503,d.eXY&psig=AFQjCNFHa9hfkVKppY3gtkUY9k1dSbJpAA&ust=1431714354270359 +Icon=text-html diff --git a/syncdb.sh b/syncdb.sh index ca1a29f..3c53c0f 100755 --- a/syncdb.sh +++ b/syncdb.sh @@ -1,6 +1,6 @@ rm db.sqlite3 python manage.py syncdb -python manage.py loaddata inital_data.json +# python manage.py loaddata initial_data.json python manage.py loaddata service_list.json python manage.py loaddata projects.json python manage.py loaddata users.json