checkvm.py 4.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. from django.core.management.base import BaseCommand, CommandError
  2. from django.contrib.contenttypes.models import ContentType
  3. from django.utils import timezone
  4. import re, sys, os
  5. from datetime import datetime
  6. from adhesions.models import Adhesion
  7. from services.models import Service, ServiceType, IPResource, Route
  8. from accounts.models import Profile
  9. regex = re.compile('^\| (?P<uuid>[0-9a-f-]*) \| (?P<nom>[a-z0-9.-]+)[ ]+\| vlan-routed=(?P<ip>.*)[ ]+\| (?P<created>[0-9TZ:-]+) |$')
  10. ipv4 = re.compile('[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+')
  11. # nova list --all-t --fields name,networks,created
  12. class Command(BaseCommand):
  13. help = 'Comparaison des VM dans Djadhere avec OpenStack'
  14. def add_arguments(self, parser):
  15. parser.add_argument('file', help='Fichier OpenStack')
  16. def handle(self, *args, **options):
  17. vm_st = ServiceType.objects.get(name='VM')
  18. djadhere_list = Service.objects.filter(service_type=vm_st)
  19. try:
  20. f = open(options['file'])
  21. except FileNotFoundError:
  22. raise CommandError('Le fichier "%s" n’a pas été trouvé.' % options['file'])
  23. else:
  24. with f:
  25. openstack_list = self.get_openstack_list(f)
  26. self.compare(djadhere_list, openstack_list)
  27. def get_openstack_list(self, f):
  28. openstack_list = []
  29. for line in f:
  30. g = regex.match(line)
  31. if g:
  32. nom = g.group('nom')
  33. ip = ipv4.findall(g.group('ip'))
  34. created = datetime.strptime(g.group('created'), '%Y-%m-%dT%H:%M:%SZ')
  35. openstack_list += [ (nom, ip, created) ]
  36. return openstack_list
  37. def compare(self, djadhere_list, openstack_list):
  38. for vm in djadhere_list.filter(label__exact=''):
  39. self.stdout.write(self.style.WARNING("> La VM n°%d n’a pas de label.\n"
  40. "Celui-ci est obligatoire pour les VM afin de les retrouver dans OpenStack.\n"
  41. "Merci d’éditer le service pour lui rajouter un label." % vm.id))
  42. djadhere_name_set = set(djadhere_list.exclude(label__exact='').values_list('label', flat=True))
  43. openstack_name_list, openstack_ip_list, _ = zip(*openstack_list)
  44. openstack_name_set = set(openstack_name_list)
  45. for vm in djadhere_name_set & openstack_name_set: # In both
  46. djadhere = djadhere_list.get(label=vm)
  47. if not djadhere.active:
  48. self.stdout.write(self.style.WARNING("> La VM '%s' est marqué inactive dans Djadhere or elle est présente dans OpenStack.\n"
  49. "Soit c’est une erreur et elle doit être marqué active, soit elle doit être supprimé d’OpenStack suite à une demande de son propriétaire." % vm))
  50. openstack_ip_set = set(openstack_ip_list[openstack_name_list.index(vm)])
  51. djadhere_ip_set = set(djadhere.allocations.filter(active=True).values_list('resource__ip', flat=True))
  52. for ip in openstack_ip_set & djadhere_ip_set: # In both
  53. alloc = djadhere.allocations.get(resource__ip=ip)
  54. if alloc.route.name != 'openstack':
  55. self.stdout.write(self.style.WARNING("> L’IP '%s' allouée à la VM '%s' a pour route '%s' dans Djadhere ; merci de modifier la route pour 'openstack'." % (ip, vm, alloc.route)))
  56. for ip in djadhere_ip_set - openstack_ip_set: # Only in djadhere
  57. self.stdout.write(self.style.WARNING("> L’IP '%s' est allouée à la VM '%s' dans Djadhere mais pas dans OpenStack.\n"
  58. "L’IP est soit à dés-allouer dans Djadhere, soit à rajouter à la VM dans OpenStack." % (ip, vm)))
  59. for ip in openstack_ip_set - djadhere_ip_set: # Only in OpenStack
  60. self.stdout.write(self.style.WARNING("> L’IP '%s' est utilisée par la VM '%s' d’après OpenStack.\n"
  61. "Il faut renseigner cette allocation dans Djadhere ou dés-allouer cette IP dans OpenStack." % (ip, vm)))
  62. for vm in djadhere_name_set - openstack_name_set: # Only in djadhere
  63. djadhere = djadhere_list.get(label=vm)
  64. if djadhere.active:
  65. self.stdout.write(self.style.WARNING("> La VM '%s' présente dans Djadhere est absente d’OpenStack.\n"
  66. "Soit il s’agit d’une VM à créer dans OpenStack, soit elle a été supprimée d’OpenStack et le service doit être marqué inactif dans Djadhere." % vm))
  67. for vm in openstack_name_set - djadhere_name_set: # Only in openstack
  68. self.stdout.write(self.style.WARNING("> La VM '%s' présente sur OpenStack n’a pas été trouvée dans Djadhere." % vm))
  69. djadhere = djadhere_list.filter(label__icontains=vm[:vm.find('.')])
  70. if djadhere.exists():
  71. self.stdout.write(self.style.WARNING("Elle a peut-être été mal nommée, est-ce une des VM suivantes ?"))
  72. for d in djadhere.all():
  73. self.stdout.write(self.style.WARNING("\t[%d] %s" % (d.pk, d.label)))