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…
Reference in a new issue