Statistics
| Branch: | Tag: | Revision:

root / logic / management / commands / reconcile.py @ 8a67cddc

History | View | Annotate | Download (3.6 kB)

1
# Copyright 2011 GRNET S.A. All rights reserved.
2
#
3
# Redistribution and use in source and binary forms, with or without
4
# modification, are permitted provided that the following conditions
5
# are met:
6
#
7
#   1. Redistributions of source code must retain the above copyright
8
#      notice, this list of conditions and the following disclaimer.
9
#
10
#  2. Redistributions in binary form must reproduce the above copyright
11
#     notice, this list of conditions and the following disclaimer in the
12
#     documentation and/or other materials provided with the distribution.
13
#
14
# THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
15
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17
# ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
18
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20
# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24
# SUCH DAMAGE.
25
#
26
# The views and conclusions contained in the software and documentation are
27
# those of the authors and should not be interpreted as representing official
28
# policies, either expressed or implied, of GRNET S.A.
29
#
30
# Reconcile VM state - Management Script
31
from synnefo.db.models import VirtualMachine
32
from django.db.models import Q
33
from django.conf import settings
34
from datetime import datetime, timedelta
35
from optparse import make_option
36
from django.core.management.base import BaseCommand
37

    
38
from synnefo.logic import amqp_connection
39
from synnefo.logic.amqp_connection import AMQPError
40

    
41
import json
42
import sys
43

    
44
class Command(BaseCommand):
45
    help = 'Reconcile VM status with the backend'
46

    
47
    option_list = BaseCommand.option_list +  (
48
         make_option('--all', action='store_true', dest='all_vms', default=False,
49
                     help='Run the reconciliation function for all VMs, now'),
50
         make_option('--interval', action='store', dest='interval', default=1,
51
                     help='Interval in minutes between reconciliations'),
52
    )
53

    
54
    def handle(self, all_vms = False, interval = 1, **options):
55
        all =  VirtualMachine.objects.filter(Q(deleted = False) &
56
                                             Q(suspended = False))
57

    
58
        if not all_vms:
59
            now = datetime.now()
60
            last_update = timedelta(minutes = settings.RECONCILIATION_MIN)
61
            not_updated = VirtualMachine.objects.filter(Q(deleted = False) &
62
                                                        Q(suspended = False) &
63
                                                        Q(updated__lte = (now - last_update)))
64

    
65
            to_update = ((all.count() / settings.RECONCILIATION_MIN) * interval)
66
        else:
67
            to_update = all.count()
68
            not_updated = all
69

    
70
        vm_ids = map(lambda x: x.id, not_updated[:to_update])
71

    
72
        for vmid in vm_ids :
73
            msg = dict(type = "reconcile", vmid = vmid)
74
            try:
75
                amqp_connection.send(json.dumps(msg), settings.EXCHANGE_CRON,
76
                                 "reconciliation.%s" % vmid)
77
            except AMQPError as e:
78
                print >> sys.stderr, 'Error sending reconciliation request: %s' % e
79
                raise
80

    
81
        print "All: %d, To update: %d, Triggered update for: %s" % \
82
              (all.count(), not_updated.count(), vm_ids)