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 @@
| Name | -ID | -Status | -Image | -Flavour | -Network | -VNC | -Actions | -
| {{vm.name}} | -{{vm.id}} | -{{vm.status}} | -{{vm.image}} | -{{vm.flavor}} | -{{vm.network}} | -{{vm.vnc}} | -- - | -