Code cleanup: remove updating ssh keys on live VMs
This commit is contained in:
		
					parent
					
						
							
								39549d5e36
							
						
					
				
			
			
				commit
				
					
						08608c726f
					
				
			
		
					 5 changed files with 4 additions and 229 deletions
				
			
		|  | @ -1,5 +1,4 @@ | ||||||
| from datetime import datetime | from datetime import datetime | ||||||
| from time import sleep |  | ||||||
| 
 | 
 | ||||||
| from celery import current_task | from celery import current_task | ||||||
| from celery.exceptions import MaxRetriesExceededError | from celery.exceptions import MaxRetriesExceededError | ||||||
|  | @ -193,6 +192,7 @@ def create_vm_task(self, vm_template_id, user, specs, template, order_id): | ||||||
|             email.send() |             email.send() | ||||||
| 
 | 
 | ||||||
|             logger.debug("New VM ID is {vm_id}".format(vm_id=vm_id)) |             logger.debug("New VM ID is {vm_id}".format(vm_id=vm_id)) | ||||||
|  |             if vm_id > 0: | ||||||
|                 get_or_create_vm_detail(custom_user, manager, vm_id) |                 get_or_create_vm_detail(custom_user, manager, vm_id) | ||||||
|     except Exception as e: |     except Exception as e: | ||||||
|         logger.error(str(e)) |         logger.error(str(e)) | ||||||
|  | @ -215,84 +215,3 @@ def create_vm_task(self, vm_template_id, user, specs, template, order_id): | ||||||
|             return |             return | ||||||
| 
 | 
 | ||||||
|     return vm_id |     return vm_id | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| @app.task(bind=True, max_retries=settings.CELERY_MAX_RETRIES) |  | ||||||
| def save_ssh_key_in_vm_template_task(self, user, vm_id, ssh_key_str): |  | ||||||
|     logger.debug("Inside save_ssh_key_in_vm_template_task %s" % vm_id) |  | ||||||
| 
 |  | ||||||
|     on_user = user.get('email') |  | ||||||
|     on_pass = user.get('pass') |  | ||||||
| 
 |  | ||||||
|     if on_user is None or on_pass is None: |  | ||||||
|         logger.error( |  | ||||||
|             "Either email or password not supplied. Can't save ssh key" |  | ||||||
|         ) |  | ||||||
|         return |  | ||||||
| 
 |  | ||||||
|     manager = OpenNebulaManager(email=on_user, password=on_pass) |  | ||||||
| 
 |  | ||||||
|     # poweroff the vm |  | ||||||
|     vm = manager.power_off_vm(vm_id) |  | ||||||
| 
 |  | ||||||
|     powered_off = False |  | ||||||
|     for t in range(15): |  | ||||||
|         vm = manager.get_vm(vm_id) |  | ||||||
|         if vm.str_state == 'POWEROFF': |  | ||||||
|             logger.debug( |  | ||||||
|                 "VM %s has been powered off. Now adding ssh keys" % vm.id |  | ||||||
|             ) |  | ||||||
|             powered_off = True |  | ||||||
|             break |  | ||||||
|         else: |  | ||||||
|             logger.debug( |  | ||||||
|                 "VM {} has state {}. Waiting 2 more seconds to see if it "  |  | ||||||
|                 "powers off".format(vm.id, vm.str_state) |  | ||||||
|             ) |  | ||||||
|             sleep(2) |  | ||||||
| 
 |  | ||||||
|     if powered_off: |  | ||||||
|         logger.debug( |  | ||||||
|             "VM %s was powered off by api call" % vm.id |  | ||||||
|         ) |  | ||||||
|         if manager.save_key_in_vm_template(vm_id=vm_id, ssh_key=ssh_key_str) > 0: |  | ||||||
|             logger.debug( |  | ||||||
|                 "Added ssh_keys of user %s to VM %s successfully" % |  | ||||||
|                 (on_user, vm_id) |  | ||||||
|             ) |  | ||||||
|             manager.resume(vm_id) |  | ||||||
|             lang = 'en-us' |  | ||||||
|             if user.get('language') is not None: |  | ||||||
|                 logger.debug( |  | ||||||
|                     "Language is set to {}".format(user.get('language'))) |  | ||||||
|                 lang = user.get('language') |  | ||||||
|             translation.activate(lang) |  | ||||||
|             # Send notification to the user as soon as VM has been booked |  | ||||||
|             context = { |  | ||||||
|                 'page_header': str(_("Adding of SSH key completed")), |  | ||||||
|                 'base_url': "{0}://{1}".format(user.get('request_scheme'), |  | ||||||
|                                                user.get('request_host')), |  | ||||||
|                 'vm_detail_url': reverse('hosting:virtual_machines', |  | ||||||
|                                      kwargs={'pk': vm_id}), |  | ||||||
|                 'vm_name': vm.name |  | ||||||
|             } |  | ||||||
|             email_data = { |  | ||||||
|                 'subject': context.get('page_header'), |  | ||||||
|                 'to': user.get('email'), |  | ||||||
|                 'context': context, |  | ||||||
|                 'template_name': 'ssh_key_added_to_vm', |  | ||||||
|                 'template_path': 'hosting/emails/', |  | ||||||
|                 'from_address': settings.DCL_SUPPORT_FROM_ADDRESS, |  | ||||||
|             } |  | ||||||
|             email = BaseEmail(**email_data) |  | ||||||
|             email.send() |  | ||||||
|         else: |  | ||||||
|             logger.error( |  | ||||||
|                 "There was an error updating ssh keys of the VM %s" % vm_id |  | ||||||
|             ) |  | ||||||
|     else: |  | ||||||
|         logger.error( |  | ||||||
|             "VM {} did not poweroff within 30 seconds after the poweroff api " |  | ||||||
|             "call. Please, ask the admin to poweroff and add the key " |  | ||||||
|             "manually.".format(vm_id) |  | ||||||
|         ) |  | ||||||
|  |  | ||||||
|  | @ -81,58 +81,6 @@ $(document).ready(function() { | ||||||
|             }) |             }) | ||||||
|     }); |     }); | ||||||
| 
 | 
 | ||||||
|     $('#modal-add-ssh-key-button').click(function(e) { |  | ||||||
|         var url = $('#add_ssh_key_to_vm_form').attr('action'); |  | ||||||
|         console.log("Url to POST " + url); |  | ||||||
| 
 |  | ||||||
|         // Declare a checkbox array
 |  | ||||||
|         var chkArray = []; |  | ||||||
|         var encoded_data =""; |  | ||||||
| 
 |  | ||||||
|         // Look for all checkboxes that have a specific class and was checked
 |  | ||||||
|         $(".chk-ssh-key:checked").each(function() { |  | ||||||
|             chkArray.push($(this).val()); |  | ||||||
|         }); |  | ||||||
|         encoded_data = encodeURIComponent(chkArray.join(",")); |  | ||||||
|         console.log("Encoded data = " + encoded_data); |  | ||||||
| 
 |  | ||||||
|         fa_icon = $('#ssh-key-modal-icon'); |  | ||||||
|         modal_btn = $('#modal-add-ssh-key-button'); |  | ||||||
|         modal_btn.prop("disabled", true); |  | ||||||
|         modal_btn.html('<i class="fa fa-cog fa-spin" aria-hidden="true"></i>'); |  | ||||||
|         $.post(url, {selected_key: encoded_data}) |  | ||||||
|             .done(function(data) { |  | ||||||
|                 console.log("Request Done"); |  | ||||||
|                 modal_btn.prop("disabled", false); |  | ||||||
|                 modal_btn.html("OK"); |  | ||||||
|                 if (data.status === true) { |  | ||||||
|                     fa_icon.html('<i class="checkmark" aria-hidden="true"></i>'); |  | ||||||
|                 } else { |  | ||||||
|                     fa_icon.html('<i class="fa fa-close" aria-hidden="true"></i>'); |  | ||||||
|                     modal_btn.attr('class', '').addClass('btn btn-danger btn-ok btn-wide'); |  | ||||||
|                 } |  | ||||||
|                 console.log("title = " + data.msg_title); |  | ||||||
|                 console.log("desc = " + data.msg_body); |  | ||||||
|                 $('#ssh-key-modal-title').text(data.msg_title); |  | ||||||
|                 $('#ssh-key-modal-description').html(data.msg_body); |  | ||||||
|                 console.log("Request Done end"); |  | ||||||
|             }) |  | ||||||
|             .fail(function(data) { |  | ||||||
|                 console.log("Request Failed"); |  | ||||||
|                 console.log("title " + data.msg_title); |  | ||||||
|                 console.log("body " + data.msg_body); |  | ||||||
|                 modal_btn.attr('class', '').addClass('btn btn-danger btn-ok btn-wide'); |  | ||||||
|                 $('#ssh-key-modal-title').text(data.msg_title); |  | ||||||
|                 $('#ssh-key-modal-description').html(data.msg_body); |  | ||||||
|             }) |  | ||||||
|             .always(function () { |  | ||||||
|                 console.log("changing href to location: " + location); |  | ||||||
|                 $('#modal-add-ssh-key-button').unbind('click').click(function () { |  | ||||||
|                     location.reload(); |  | ||||||
|                 }); |  | ||||||
|             }) |  | ||||||
|     }); |  | ||||||
| 
 |  | ||||||
|     var hash = window.location.hash; |     var hash = window.location.hash; | ||||||
|     hash && $('ul.nav a[href="' + hash + '"]').tab('show'); |     hash && $('ul.nav a[href="' + hash + '"]').tab('show'); | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -113,41 +113,6 @@ | ||||||
| 			<a class="btn btn-vm-back" href="{% url 'hosting:virtual_machines' %}">{% trans "BACK TO LIST" %}</a> | 			<a class="btn btn-vm-back" href="{% url 'hosting:virtual_machines' %}">{% trans "BACK TO LIST" %}</a> | ||||||
| 		</div> | 		</div> | ||||||
| 	</div> | 	</div> | ||||||
| 	<!-- Add SSH Modal --> |  | ||||||
| 	<div class="modal fade" id="modal-add-ssh-key" tabindex="-1" role="dialog" aria-hidden="true"> |  | ||||||
|     <div class="modal-dialog"> |  | ||||||
|       <div class="modal-content"> |  | ||||||
| 		  <div id="add-ssh-key-orig"> |  | ||||||
|             <form method="POST" id="add_ssh_key_to_vm_form" class="cancel-form" action="{% url 'hosting:add_key_vm' virtual_machine.vm_id %}"> |  | ||||||
|                 {% csrf_token %} |  | ||||||
| 
 |  | ||||||
| 				<div class="modal-header"> |  | ||||||
| 					<button type="button" class="close" data-dismiss="modal" aria-label="Confirm"><span aria-hidden="true">×</span></button> |  | ||||||
| 				</div> |  | ||||||
|       	        <div class="modal-body"> |  | ||||||
| 					<div class="modal-icon" id="ssh-key-modal-icon"><i class="fa fa-key" aria-hidden="true"></i></div> |  | ||||||
| 					<h4 class="modal-title" id="ssh-key-modal-title">{% trans "Select the keys that you want to add to the VM" %}</h4> |  | ||||||
| 					<div class="modal-text" id="ssh-key-modal-description"> |  | ||||||
| 						<p> |  | ||||||
| 							<ul> |  | ||||||
| 								{% for key in keys %} |  | ||||||
| 									<li><input type="checkbox" name="selected_key" value="{{key.name}}" class="chk-ssh-key">{{key.name}}</li> |  | ||||||
| 								{% endfor %} |  | ||||||
| 							</ul> |  | ||||||
| 						</p> |  | ||||||
| 						<p>{% trans "The VM will reboot with the new key(s) installed. OK ?" %}</p> |  | ||||||
| 						<p><strong>{{virtual_machine.name}}</strong></p> |  | ||||||
| 					</div> |  | ||||||
|                     <div class="modal-footer"> |  | ||||||
|                         <a class="btn btn-ok btn-wide btn-vm-back" id="modal-add-ssh-key-button">{% trans "OK" %}</a> |  | ||||||
|                     </div> |  | ||||||
|                 </div> |  | ||||||
|             </form> |  | ||||||
|           </div> |  | ||||||
|       </div> |  | ||||||
|     </div> |  | ||||||
| 	</div> |  | ||||||
| 	<!-- / Add ssh key Modal --> |  | ||||||
| 	<!-- Cancel Modal --> | 	<!-- Cancel Modal --> | ||||||
| 	<div class="modal fade" id="confirm-cancel" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true"> | 	<div class="modal fade" id="confirm-cancel" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true"> | ||||||
|     <div class="modal-dialog"> |     <div class="modal-dialog"> | ||||||
|  |  | ||||||
|  | @ -10,7 +10,7 @@ from .views import ( | ||||||
|     HostingPricingView, CreateVirtualMachinesView, HostingBillListView, |     HostingPricingView, CreateVirtualMachinesView, HostingBillListView, | ||||||
|     HostingBillDetailView, SSHKeyDeleteView, SSHKeyCreateView, SSHKeyListView, |     HostingBillDetailView, SSHKeyDeleteView, SSHKeyCreateView, SSHKeyListView, | ||||||
|     SSHKeyChoiceView, DashboardView, SettingsView, ResendActivationEmailView, |     SSHKeyChoiceView, DashboardView, SettingsView, ResendActivationEmailView, | ||||||
|     InvoiceListView, InvoiceDetailView, AddSshKeyToVMView |     InvoiceListView, InvoiceDetailView | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| urlpatterns = [ | urlpatterns = [ | ||||||
|  | @ -41,8 +41,6 @@ urlpatterns = [ | ||||||
|         VirtualMachinesPlanListView.as_view(), name='virtual_machines'), |         VirtualMachinesPlanListView.as_view(), name='virtual_machines'), | ||||||
|     url(r'my-virtual-machines/(?P<pk>\d+)/?$', VirtualMachineView.as_view(), |     url(r'my-virtual-machines/(?P<pk>\d+)/?$', VirtualMachineView.as_view(), | ||||||
|         name='virtual_machines'), |         name='virtual_machines'), | ||||||
|     url(r'add-key-vm/(?P<pk>\d+)/?$', AddSshKeyToVMView.as_view(), |  | ||||||
|         name='add_key_vm'), |  | ||||||
|     url(r'ssh_keys/?$', SSHKeyListView.as_view(), |     url(r'ssh_keys/?$', SSHKeyListView.as_view(), | ||||||
|         name='ssh_keys'), |         name='ssh_keys'), | ||||||
|     url(r'ssh_keys_choice/?$', SSHKeyChoiceView.as_view(), |     url(r'ssh_keys_choice/?$', SSHKeyChoiceView.as_view(), | ||||||
|  |  | ||||||
|  | @ -2,7 +2,6 @@ import logging | ||||||
| import uuid | import uuid | ||||||
| from datetime import datetime | from datetime import datetime | ||||||
| from time import sleep | from time import sleep | ||||||
| from urllib import parse |  | ||||||
| 
 | 
 | ||||||
| from django import forms | from django import forms | ||||||
| from django.conf import settings | from django.conf import settings | ||||||
|  | @ -35,7 +34,6 @@ from stored_messages.settings import stored_messages_settings | ||||||
| 
 | 
 | ||||||
| from datacenterlight.cms_models import DCLCalculatorPluginModel | from datacenterlight.cms_models import DCLCalculatorPluginModel | ||||||
| from datacenterlight.models import VMTemplate, VMPricing | from datacenterlight.models import VMTemplate, VMPricing | ||||||
| from datacenterlight.tasks import save_ssh_key_in_vm_template_task |  | ||||||
| from datacenterlight.utils import create_vm, get_cms_integration | from datacenterlight.utils import create_vm, get_cms_integration | ||||||
| from hosting.models import UserCardDetail | from hosting.models import UserCardDetail | ||||||
| from membership.models import CustomUser, StripeCustomer | from membership.models import CustomUser, StripeCustomer | ||||||
|  | @ -1514,59 +1512,6 @@ class CreateVirtualMachinesView(LoginRequiredMixin, View): | ||||||
|         return redirect(reverse('hosting:payment')) |         return redirect(reverse('hosting:payment')) | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| class AddSshKeyToVMView(LoginRequiredMixin, View): |  | ||||||
| 
 |  | ||||||
|     def respond_with_error(self): |  | ||||||
|         response = {'status': False} |  | ||||||
|         response['msg_title'] = str(_("No ssh keys provided")) |  | ||||||
|         response['msg_body'] = str( |  | ||||||
|             _("Please retry and select one of the keys")) |  | ||||||
|         json_response = JsonResponse(response) |  | ||||||
|         return json_response |  | ||||||
| 
 |  | ||||||
|     @method_decorator(decorators) |  | ||||||
|     def post(self, request, *args, **kwargs): |  | ||||||
|         try: |  | ||||||
|             vm_id = int(self.kwargs.get('pk')) |  | ||||||
|         except ValueError as ve: |  | ||||||
|             logger.error("Value error {}".format(str(ve))) |  | ||||||
|             return self.respond_with_error() |  | ||||||
|         if 'selected_key' not in request.POST: |  | ||||||
|             return self.respond_with_error() |  | ||||||
|         else: |  | ||||||
|             posted_keys = parse.unquote_plus(request.POST['selected_key']) |  | ||||||
|             if posted_keys.strip() == "": |  | ||||||
|                 return self.respond_with_error() |  | ||||||
|             keys = posted_keys.split(",") |  | ||||||
|             uh_keys = [ |  | ||||||
|                 UserHostingKey.objects.get( |  | ||||||
|                     user=request.user, name=key) |  | ||||||
|                 for key in keys if key is not None and key is not "" |  | ||||||
|             ] |  | ||||||
|             # Add public_keys to vm_id now |  | ||||||
|             public_keys = [uh_key.public_key for uh_key in uh_keys] |  | ||||||
|             keys_str = '\n'.join(public_keys) |  | ||||||
|             user = { |  | ||||||
|                 'email': request.user.email, |  | ||||||
|                 'pass': request.user.password, |  | ||||||
|                 'request_scheme': request.scheme, |  | ||||||
|                 'request_host': request.get_host(), |  | ||||||
|                 'language': get_language(), |  | ||||||
|             } |  | ||||||
|             save_ssh_key_in_vm_template_task.delay(user,vm_id, keys_str) |  | ||||||
|             response = dict() |  | ||||||
|             response['status'] = True |  | ||||||
|             response['msg_title'] = str(_( |  | ||||||
|                 "Adding of your SSH key add is under process" |  | ||||||
|             )) |  | ||||||
|             response['msg_body'] = str(_( |  | ||||||
|                 "Your keys %s will be added to the VM in the next couple of " |  | ||||||
|                 "minutes. You will receive a confirmation email once this has " |  | ||||||
|                 "been done. Thank you." % posted_keys |  | ||||||
|             )) |  | ||||||
|             return JsonResponse(response) |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| class VirtualMachineView(LoginRequiredMixin, View): | class VirtualMachineView(LoginRequiredMixin, View): | ||||||
|     template_name = "hosting/virtual_machine_detail.html" |     template_name = "hosting/virtual_machine_detail.html" | ||||||
|     login_url = reverse_lazy('hosting:login') |     login_url = reverse_lazy('hosting:login') | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue