Merge pull request #655 from pcoder/task/5473/ping_before_cdist
Task/5473/ping before cdist
This commit is contained in:
		
				commit
				
					
						438a6ab4e4
					
				
			
		
					 3 changed files with 64 additions and 7 deletions
				
			
		|  | @ -8,13 +8,16 @@ from django.core.mail import EmailMessage | ||||||
| from django.core.urlresolvers import reverse | from django.core.urlresolvers import reverse | ||||||
| from django.utils import translation | from django.utils import translation | ||||||
| from django.utils.translation import ugettext_lazy as _ | from django.utils.translation import ugettext_lazy as _ | ||||||
|  | from time import sleep | ||||||
| 
 | 
 | ||||||
| from dynamicweb.celery import app | from dynamicweb.celery import app | ||||||
| from hosting.models import HostingOrder | from hosting.models import HostingOrder | ||||||
| from membership.models import CustomUser | from membership.models import CustomUser | ||||||
| from opennebula_api.models import OpenNebulaManager | from opennebula_api.models import OpenNebulaManager | ||||||
| from opennebula_api.serializers import VirtualMachineSerializer | from opennebula_api.serializers import VirtualMachineSerializer | ||||||
| from utils.hosting_utils import get_all_public_keys, get_or_create_vm_detail | from utils.hosting_utils import ( | ||||||
|  |     get_all_public_keys, get_or_create_vm_detail, ping_ok | ||||||
|  | ) | ||||||
| from utils.mailer import BaseEmail | from utils.mailer import BaseEmail | ||||||
| from utils.stripe_utils import StripeUtils | from utils.stripe_utils import StripeUtils | ||||||
| from .models import VMPricing | from .models import VMPricing | ||||||
|  | @ -203,12 +206,45 @@ def create_vm_task(self, vm_template_id, user, specs, template, order_id): | ||||||
|                                 host=vm_ipv6, num_keys=len(keys) |                                 host=vm_ipv6, num_keys=len(keys) | ||||||
|                             ) |                             ) | ||||||
|                         ) |                         ) | ||||||
|                         # Let's delay the task by 75 seconds to be sure |                         # Let's wait until the IP responds to ping before we | ||||||
|                         # that we run the cdist configure after the host |                         # run the cdist configure on the host | ||||||
|                         # is up |                         did_manage_public_key = False | ||||||
|                         manager.manage_public_key( |                         for i in range(0, 15): | ||||||
|                             keys, hosts=[vm_ipv6], countdown=75 |                             if ping_ok(vm_ipv6): | ||||||
|                         ) |                                 logger.debug( | ||||||
|  |                                     "{} is pingable. Doing a " | ||||||
|  |                                     "manage_public_key".format(vm_ipv6) | ||||||
|  |                                 ) | ||||||
|  |                                 sleep(10) | ||||||
|  |                                 manager.manage_public_key( | ||||||
|  |                                     keys, hosts=[vm_ipv6] | ||||||
|  |                                 ) | ||||||
|  |                                 did_manage_public_key = True | ||||||
|  |                                 break | ||||||
|  |                             else: | ||||||
|  |                                 logger.debug( | ||||||
|  |                                     "Can't ping {}. Wait 5 secs".format( | ||||||
|  |                                         vm_ipv6 | ||||||
|  |                                     ) | ||||||
|  |                                 ) | ||||||
|  |                                 sleep(5) | ||||||
|  |                         if not did_manage_public_key: | ||||||
|  |                             emsg = ("Waited for over 75 seconds for {} to be " | ||||||
|  |                                     "pingable. But the VM was not reachable. " | ||||||
|  |                                     "So, gave up manage_public_key. Please do " | ||||||
|  |                                     "this manually".format(vm_ipv6)) | ||||||
|  |                             logger.error(emsg) | ||||||
|  |                             email_data = { | ||||||
|  |                                 'subject': '{} CELERY TASK INCOMPLETE: {} not ' | ||||||
|  |                                            'pingable for 75 seconds'.format( | ||||||
|  |                                                 settings.DCL_TEXT, vm_ipv6 | ||||||
|  |                                             ), | ||||||
|  |                                 'from_email': current_task.request.hostname, | ||||||
|  |                                 'to': settings.DCL_ERROR_EMAILS_TO_LIST, | ||||||
|  |                                 'body': emsg | ||||||
|  |                             } | ||||||
|  |                             email = EmailMessage(**email_data) | ||||||
|  |                             email.send() | ||||||
|     except Exception as e: |     except Exception as e: | ||||||
|         logger.error(str(e)) |         logger.error(str(e)) | ||||||
|         try: |         try: | ||||||
|  |  | ||||||
|  | @ -1,3 +1,4 @@ | ||||||
|  | import logging | ||||||
| from django.contrib.sites.models import Site | from django.contrib.sites.models import Site | ||||||
| 
 | 
 | ||||||
| from datacenterlight.tasks import create_vm_task | from datacenterlight.tasks import create_vm_task | ||||||
|  | @ -8,6 +9,8 @@ from utils.models import BillingAddress | ||||||
| from .cms_models import CMSIntegration | from .cms_models import CMSIntegration | ||||||
| from .models import VMPricing, VMTemplate | from .models import VMPricing, VMTemplate | ||||||
| 
 | 
 | ||||||
|  | logger = logging.getLogger(__name__) | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
| def get_cms_integration(name): | def get_cms_integration(name): | ||||||
|     current_site = Site.objects.get_current() |     current_site = Site.objects.get_current() | ||||||
|  |  | ||||||
|  | @ -1,5 +1,6 @@ | ||||||
| import decimal | import decimal | ||||||
| import logging | import logging | ||||||
|  | import subprocess | ||||||
| from oca.pool import WrongIdError | from oca.pool import WrongIdError | ||||||
| 
 | 
 | ||||||
| from datacenterlight.models import VMPricing | from datacenterlight.models import VMPricing | ||||||
|  | @ -130,6 +131,23 @@ def get_vm_price_with_vat(cpu, memory, ssd_size, hdd_size=0, | ||||||
|     return float(price), float(vat), float(vat_percent), discount |     return float(price), float(vat), float(vat_percent), discount | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | def ping_ok(host_ipv6): | ||||||
|  |     """ | ||||||
|  |     A utility method to check if a host responds to ping requests. Note: the | ||||||
|  |     function relies on `ping6` utility of debian to check. | ||||||
|  | 
 | ||||||
|  |     :param host_ipv6 str type parameter that represets the ipv6 of the host to | ||||||
|  |            checked | ||||||
|  |     :return True if the host responds to ping else returns False | ||||||
|  |     """ | ||||||
|  |     try: | ||||||
|  |         subprocess.check_output("ping6 -c 1 " + host_ipv6, shell=True) | ||||||
|  |     except Exception as ex: | ||||||
|  |         logger.debug(host_ipv6 + " not reachable via ping. Error = " + str(ex)) | ||||||
|  |         return False | ||||||
|  |     return True | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| class HostingUtils: | class HostingUtils: | ||||||
|     @staticmethod |     @staticmethod | ||||||
|     def clear_items_from_list(from_list, items_list): |     def clear_items_from_list(from_list, items_list): | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue