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 time import sleep
 | 
			
		||||
 | 
			
		||||
from celery import current_task
 | 
			
		||||
from celery.exceptions import MaxRetriesExceededError
 | 
			
		||||
| 
						 | 
				
			
			@ -193,6 +192,7 @@ def create_vm_task(self, vm_template_id, user, specs, template, order_id):
 | 
			
		|||
            email.send()
 | 
			
		||||
 | 
			
		||||
            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)
 | 
			
		||||
    except Exception as e:
 | 
			
		||||
        logger.error(str(e))
 | 
			
		||||
| 
						 | 
				
			
			@ -215,84 +215,3 @@ def create_vm_task(self, vm_template_id, user, specs, template, order_id):
 | 
			
		|||
            return
 | 
			
		||||
 | 
			
		||||
    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;
 | 
			
		||||
    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>
 | 
			
		||||
		</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 -->
 | 
			
		||||
	<div class="modal fade" id="confirm-cancel" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
 | 
			
		||||
    <div class="modal-dialog">
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -10,7 +10,7 @@ from .views import (
 | 
			
		|||
    HostingPricingView, CreateVirtualMachinesView, HostingBillListView,
 | 
			
		||||
    HostingBillDetailView, SSHKeyDeleteView, SSHKeyCreateView, SSHKeyListView,
 | 
			
		||||
    SSHKeyChoiceView, DashboardView, SettingsView, ResendActivationEmailView,
 | 
			
		||||
    InvoiceListView, InvoiceDetailView, AddSshKeyToVMView
 | 
			
		||||
    InvoiceListView, InvoiceDetailView
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
urlpatterns = [
 | 
			
		||||
| 
						 | 
				
			
			@ -41,8 +41,6 @@ urlpatterns = [
 | 
			
		|||
        VirtualMachinesPlanListView.as_view(), name='virtual_machines'),
 | 
			
		||||
    url(r'my-virtual-machines/(?P<pk>\d+)/?$', VirtualMachineView.as_view(),
 | 
			
		||||
        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(),
 | 
			
		||||
        name='ssh_keys'),
 | 
			
		||||
    url(r'ssh_keys_choice/?$', SSHKeyChoiceView.as_view(),
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2,7 +2,6 @@ import logging
 | 
			
		|||
import uuid
 | 
			
		||||
from datetime import datetime
 | 
			
		||||
from time import sleep
 | 
			
		||||
from urllib import parse
 | 
			
		||||
 | 
			
		||||
from django import forms
 | 
			
		||||
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.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 hosting.models import UserCardDetail
 | 
			
		||||
from membership.models import CustomUser, StripeCustomer
 | 
			
		||||
| 
						 | 
				
			
			@ -1514,59 +1512,6 @@ class CreateVirtualMachinesView(LoginRequiredMixin, View):
 | 
			
		|||
        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):
 | 
			
		||||
    template_name = "hosting/virtual_machine_detail.html"
 | 
			
		||||
    login_url = reverse_lazy('hosting:login')
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue