12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485 |
- from django.core.management.base import BaseCommand, CommandError
- from django.contrib.contenttypes.models import ContentType
- from django.utils import timezone
- import re, sys, os
- from datetime import datetime
- from adhesions.models import Adhesion
- from services.models import Service, ServiceType, IPResource, Route
- from accounts.models import Profile
- regex = re.compile('^\| (?P<uuid>[0-9a-f-]*) \| (?P<nom>[a-z0-9.-]+)[ ]+\| vlan-routed=(?P<ip>.*)[ ]+\| (?P<created>[0-9TZ:-]+) |$')
- ipv4 = re.compile('[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+')
- # nova list --all-t --fields name,networks,created
- class Command(BaseCommand):
- help = 'Comparaison des VM dans Djadhere avec OpenStack'
- def add_arguments(self, parser):
- parser.add_argument('file', help='Fichier OpenStack')
-
- def handle(self, *args, **options):
- vm_st = ServiceType.objects.get(name='VM')
- djadhere_list = Service.objects.filter(service_type=vm_st)
- try:
- f = open(options['file'])
- except FileNotFoundError:
- raise CommandError('Le fichier "%s" n’a pas été trouvé.' % options['file'])
- else:
- with f:
- openstack_list = self.get_openstack_list(f)
- self.compare(djadhere_list, openstack_list)
- def get_openstack_list(self, f):
- openstack_list = []
- for line in f:
- g = regex.match(line)
- if g:
- nom = g.group('nom')
- ip = ipv4.findall(g.group('ip'))
- created = datetime.strptime(g.group('created'), '%Y-%m-%dT%H:%M:%SZ')
- openstack_list += [ (nom, ip, created) ]
- return openstack_list
- def compare(self, djadhere_list, openstack_list):
- for vm in djadhere_list.filter(label__exact=''):
- self.stdout.write(self.style.WARNING("> La VM n°%d n’a pas de label.\n"
- "Celui-ci est obligatoire pour les VM afin de les retrouver dans OpenStack.\n"
- "Merci d’éditer le service pour lui rajouter un label." % vm.id))
- djadhere_name_set = set(djadhere_list.exclude(label__exact='').values_list('label', flat=True))
- openstack_name_list, openstack_ip_list, _ = zip(*openstack_list)
- openstack_name_set = set(openstack_name_list)
- for vm in djadhere_name_set & openstack_name_set: # In both
- djadhere = djadhere_list.get(label=vm)
- if not djadhere.active:
- self.stdout.write(self.style.WARNING("> La VM '%s' est marqué inactive dans Djadhere or elle est présente dans OpenStack.\n"
- "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))
- openstack_ip_set = set(openstack_ip_list[openstack_name_list.index(vm)])
- djadhere_ip_set = set(djadhere.allocations.filter(active=True).values_list('resource__ip', flat=True))
- for ip in openstack_ip_set & djadhere_ip_set: # In both
- alloc = djadhere.allocations.get(resource__ip=ip)
- if alloc.route.name != 'openstack':
- 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)))
- for ip in djadhere_ip_set - openstack_ip_set: # Only in djadhere
- self.stdout.write(self.style.WARNING("> L’IP '%s' est allouée à la VM '%s' dans Djadhere mais pas dans OpenStack.\n"
- "L’IP est soit à dés-allouer dans Djadhere, soit à rajouter à la VM dans OpenStack." % (ip, vm)))
- for ip in openstack_ip_set - djadhere_ip_set: # Only in OpenStack
- self.stdout.write(self.style.WARNING("> L’IP '%s' est utilisée par la VM '%s' d’après OpenStack.\n"
- "Il faut renseigner cette allocation dans Djadhere ou dés-allouer cette IP dans OpenStack." % (ip, vm)))
- for vm in djadhere_name_set - openstack_name_set: # Only in djadhere
- djadhere = djadhere_list.get(label=vm)
- if djadhere.active:
- self.stdout.write(self.style.WARNING("> La VM '%s' présente dans Djadhere est absente d’OpenStack.\n"
- "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))
- for vm in openstack_name_set - djadhere_name_set: # Only in openstack
- self.stdout.write(self.style.WARNING("> La VM '%s' présente sur OpenStack n’a pas été trouvée dans Djadhere." % vm))
- djadhere = djadhere_list.filter(label__icontains=vm[:vm.find('.')])
- if djadhere.exists():
- self.stdout.write(self.style.WARNING("Elle a peut-être été mal nommée, est-ce une des VM suivantes ?"))
- for d in djadhere.all():
- self.stdout.write(self.style.WARNING("\t[%d] %s" % (d.pk, d.label)))
|