Statistics
| Branch: | Tag: | Revision:

root / snf-app / synnefo / logic / management / commands / reconcile_old.py @ 483c9197

History | View | Annotate | Download (3.7 kB)

1 9fea53cc Vangelis Koukis
# Copyright 2011 GRNET S.A. All rights reserved.
2 9fea53cc Vangelis Koukis
#
3 9fea53cc Vangelis Koukis
# Redistribution and use in source and binary forms, with or without
4 9fea53cc Vangelis Koukis
# modification, are permitted provided that the following conditions
5 9fea53cc Vangelis Koukis
# are met:
6 9fea53cc Vangelis Koukis
#
7 9fea53cc Vangelis Koukis
#   1. Redistributions of source code must retain the above copyright
8 9fea53cc Vangelis Koukis
#      notice, this list of conditions and the following disclaimer.
9 9fea53cc Vangelis Koukis
#
10 9fea53cc Vangelis Koukis
#  2. Redistributions in binary form must reproduce the above copyright
11 9fea53cc Vangelis Koukis
#     notice, this list of conditions and the following disclaimer in the
12 9fea53cc Vangelis Koukis
#     documentation and/or other materials provided with the distribution.
13 9fea53cc Vangelis Koukis
#
14 9fea53cc Vangelis Koukis
# THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
15 9fea53cc Vangelis Koukis
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16 9fea53cc Vangelis Koukis
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17 9fea53cc Vangelis Koukis
# ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
18 9fea53cc Vangelis Koukis
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19 9fea53cc Vangelis Koukis
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20 9fea53cc Vangelis Koukis
# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21 9fea53cc Vangelis Koukis
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22 9fea53cc Vangelis Koukis
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23 9fea53cc Vangelis Koukis
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24 9fea53cc Vangelis Koukis
# SUCH DAMAGE.
25 9fea53cc Vangelis Koukis
#
26 9fea53cc Vangelis Koukis
# The views and conclusions contained in the software and documentation are
27 9fea53cc Vangelis Koukis
# those of the authors and should not be interpreted as representing official
28 9fea53cc Vangelis Koukis
# policies, either expressed or implied, of GRNET S.A.
29 9fea53cc Vangelis Koukis
#
30 9fea53cc Vangelis Koukis
# Reconcile VM state - Management Script
31 9fea53cc Vangelis Koukis
from synnefo.db.models import VirtualMachine
32 9fea53cc Vangelis Koukis
from django.db.models import Q
33 9fea53cc Vangelis Koukis
from django.conf import settings
34 9fea53cc Vangelis Koukis
from datetime import datetime, timedelta
35 9fea53cc Vangelis Koukis
from optparse import make_option
36 9fea53cc Vangelis Koukis
from django.core.management.base import BaseCommand
37 9fea53cc Vangelis Koukis
38 9fea53cc Vangelis Koukis
from synnefo.logic import amqp_connection
39 9fea53cc Vangelis Koukis
from synnefo.logic.amqp_connection import AMQPError
40 9fea53cc Vangelis Koukis
41 9fea53cc Vangelis Koukis
import json
42 9fea53cc Vangelis Koukis
import sys
43 9fea53cc Vangelis Koukis
44 9fea53cc Vangelis Koukis
class Command(BaseCommand):
45 9fea53cc Vangelis Koukis
    prefix = settings.BACKEND_PREFIX_ID.split('-')[0]
46 9fea53cc Vangelis Koukis
    help = 'Reconcile VM status with the backend'
47 9fea53cc Vangelis Koukis
48 9fea53cc Vangelis Koukis
    option_list = BaseCommand.option_list +  (
49 9fea53cc Vangelis Koukis
         make_option('--all', action='store_true', dest='all_vms', default=False,
50 9fea53cc Vangelis Koukis
                     help='Run the reconciliation function for all VMs, now'),
51 9fea53cc Vangelis Koukis
         make_option('--interval', action='store', dest='interval', default=1,
52 9fea53cc Vangelis Koukis
                     help='Interval in minutes between reconciliations'),
53 9fea53cc Vangelis Koukis
    )
54 9fea53cc Vangelis Koukis
55 9fea53cc Vangelis Koukis
    def handle(self, all_vms = False, interval = 1, **options):
56 9fea53cc Vangelis Koukis
        all =  VirtualMachine.objects.filter(Q(deleted = False) &
57 9fea53cc Vangelis Koukis
                                             Q(suspended = False))
58 9fea53cc Vangelis Koukis
59 9fea53cc Vangelis Koukis
        if not all_vms:
60 9fea53cc Vangelis Koukis
            now = datetime.now()
61 9fea53cc Vangelis Koukis
            last_update = timedelta(minutes = settings.RECONCILIATION_MIN)
62 9fea53cc Vangelis Koukis
            not_updated = VirtualMachine.objects.filter(Q(deleted = False) &
63 9fea53cc Vangelis Koukis
                                                        Q(suspended = False) &
64 9fea53cc Vangelis Koukis
                                                        Q(updated__lte = (now - last_update)))
65 9fea53cc Vangelis Koukis
66 9fea53cc Vangelis Koukis
            to_update = ((all.count() / settings.RECONCILIATION_MIN) * interval)
67 9fea53cc Vangelis Koukis
        else:
68 9fea53cc Vangelis Koukis
            to_update = all.count()
69 9fea53cc Vangelis Koukis
            not_updated = all
70 9fea53cc Vangelis Koukis
71 9fea53cc Vangelis Koukis
        vm_ids = map(lambda x: x.id, not_updated[:to_update])
72 9fea53cc Vangelis Koukis
73 9fea53cc Vangelis Koukis
        for vmid in vm_ids :
74 9fea53cc Vangelis Koukis
            msg = dict(type = "reconcile", vmid = vmid)
75 9fea53cc Vangelis Koukis
            try:
76 9fea53cc Vangelis Koukis
                amqp_connection.send(json.dumps(msg), settings.EXCHANGE_CRON,
77 9fea53cc Vangelis Koukis
                                 "reconciliation.%s.%s" % (self.prefix,vmid))
78 9fea53cc Vangelis Koukis
            except AMQPError as e:
79 9fea53cc Vangelis Koukis
                print >> sys.stderr, 'Error sending reconciliation request: %s' % e
80 9fea53cc Vangelis Koukis
                raise
81 9fea53cc Vangelis Koukis
82 9fea53cc Vangelis Koukis
        print "All: %d, To update: %d, Triggered update for: %s" % \
83 9fea53cc Vangelis Koukis
              (all.count(), not_updated.count(), vm_ids)