Code cleanup: remove updating ssh keys on live VMs

This commit is contained in:
PCoder 2019-06-25 02:11:57 +02:00
parent 39549d5e36
commit 08608c726f
5 changed files with 4 additions and 229 deletions

View file

@ -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)
)

View file

@ -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');

View file

@ -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">&times;</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">

View file

@ -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(),

View file

@ -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')