Statistics
| Branch: | Tag: | Revision:

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

History | View | Annotate | Download (3.7 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
    prefix = settings.BACKEND_PREFIX_ID.split('-')[0]
46
    help = 'Reconcile VM status with the backend'
47

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

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

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

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

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

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

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