Statistics
| Branch: | Tag: | Revision:

root / snf-cyclades-app / synnefo / logic / management / commands / backend-update-status.py @ cc3f266e

History | View | Annotate | Download (3.3 kB)

1 cc7c0f44 Christos Stavrakakis
# Copyright 2011-2012 GRNET S.A. All rights reserved.
2 cc7c0f44 Christos Stavrakakis
#
3 cc7c0f44 Christos Stavrakakis
# Redistribution and use in source and binary forms, with or without
4 cc7c0f44 Christos Stavrakakis
# modification, are permitted provided that the following conditions
5 cc7c0f44 Christos Stavrakakis
# are met:
6 cc7c0f44 Christos Stavrakakis
#
7 cc7c0f44 Christos Stavrakakis
#   1. Redistributions of source code must retain the above copyright
8 cc7c0f44 Christos Stavrakakis
#      notice, this list of conditions and the following disclaimer.
9 cc7c0f44 Christos Stavrakakis
#
10 cc7c0f44 Christos Stavrakakis
#  2. Redistributions in binary form must reproduce the above copyright
11 cc7c0f44 Christos Stavrakakis
#     notice, this list of conditions and the following disclaimer in the
12 cc7c0f44 Christos Stavrakakis
#     documentation and/or other materials provided with the distribution.
13 cc7c0f44 Christos Stavrakakis
#
14 cc7c0f44 Christos Stavrakakis
# THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
15 cc7c0f44 Christos Stavrakakis
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16 cc7c0f44 Christos Stavrakakis
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17 cc7c0f44 Christos Stavrakakis
# ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
18 cc7c0f44 Christos Stavrakakis
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19 cc7c0f44 Christos Stavrakakis
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20 cc7c0f44 Christos Stavrakakis
# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21 cc7c0f44 Christos Stavrakakis
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22 cc7c0f44 Christos Stavrakakis
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23 cc7c0f44 Christos Stavrakakis
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24 cc7c0f44 Christos Stavrakakis
# SUCH DAMAGE.
25 cc7c0f44 Christos Stavrakakis
#
26 cc7c0f44 Christos Stavrakakis
# The views and conclusions contained in the software and documentation are
27 cc7c0f44 Christos Stavrakakis
# those of the authors and should not be interpreted as representing official
28 cc7c0f44 Christos Stavrakakis
# policies, either expressed or implied, of GRNET S.A.
29 cc7c0f44 Christos Stavrakakis
#
30 cc7c0f44 Christos Stavrakakis
31 cc7c0f44 Christos Stavrakakis
from optparse import make_option
32 cc7c0f44 Christos Stavrakakis
from django.core.management.base import BaseCommand, CommandError
33 cc7c0f44 Christos Stavrakakis
from synnefo import settings
34 cc7c0f44 Christos Stavrakakis
import datetime
35 cc7c0f44 Christos Stavrakakis
36 cc7c0f44 Christos Stavrakakis
from synnefo.db.models import Backend
37 cc7c0f44 Christos Stavrakakis
from synnefo.logic.backend import update_resources
38 cc7c0f44 Christos Stavrakakis
39 cc7c0f44 Christos Stavrakakis
40 cc7c0f44 Christos Stavrakakis
class Command(BaseCommand):
41 cc7c0f44 Christos Stavrakakis
    can_import_settings = True
42 cc7c0f44 Christos Stavrakakis
43 cc7c0f44 Christos Stavrakakis
    help = "Update backend statistics, which are used for instance allocation."
44 cc7c0f44 Christos Stavrakakis
    output_transaction = True  # The management command runs inside
45 cc7c0f44 Christos Stavrakakis
                               # an SQL transaction
46 cc7c0f44 Christos Stavrakakis
    option_list = BaseCommand.option_list + (
47 cc7c0f44 Christos Stavrakakis
        make_option('--backend_id', dest='backend_id',
48 cc7c0f44 Christos Stavrakakis
                   help="Update statistics of only this backend"),
49 cc7c0f44 Christos Stavrakakis
        make_option('--older_than', dest='older_than', metavar="MINUTES",
50 cc7c0f44 Christos Stavrakakis
                   help="Update only backends that have not been updated for\
51 cc7c0f44 Christos Stavrakakis
                   MINUTES. Set to 0 to force update.")
52 cc7c0f44 Christos Stavrakakis
        )
53 cc7c0f44 Christos Stavrakakis
54 cc7c0f44 Christos Stavrakakis
    def handle(self, **options):
55 cc7c0f44 Christos Stavrakakis
56 cc7c0f44 Christos Stavrakakis
        if options['backend_id']:
57 cc7c0f44 Christos Stavrakakis
            try:
58 cc7c0f44 Christos Stavrakakis
                backend_id = int(options['backend_id'])
59 cc7c0f44 Christos Stavrakakis
                backends = [Backend.objects.get(id=backend_id)]
60 cc7c0f44 Christos Stavrakakis
            except ValueError:
61 cc7c0f44 Christos Stavrakakis
                raise CommandError("Wrong backend ID")
62 cc7c0f44 Christos Stavrakakis
            except Backend.DoesNotExist:
63 cc7c0f44 Christos Stavrakakis
                raise CommandError("Backend not found in DB")
64 cc7c0f44 Christos Stavrakakis
        else:
65 cc7c0f44 Christos Stavrakakis
            # XXX:filter drained ?
66 cc7c0f44 Christos Stavrakakis
            backends = Backend.objects.all()
67 cc7c0f44 Christos Stavrakakis
68 cc7c0f44 Christos Stavrakakis
        now = datetime.datetime.now()
69 cc7c0f44 Christos Stavrakakis
        if options['older_than'] is not None:
70 cc7c0f44 Christos Stavrakakis
            minutes = int(options['older_than'])
71 cc7c0f44 Christos Stavrakakis
        else:
72 cc7c0f44 Christos Stavrakakis
            minutes = settings.BACKEND_REFRESH_MIN
73 cc7c0f44 Christos Stavrakakis
74 cc7c0f44 Christos Stavrakakis
        delta = datetime.timedelta(minutes=minutes)
75 cc7c0f44 Christos Stavrakakis
76 cc7c0f44 Christos Stavrakakis
        for b in backends:
77 cc7c0f44 Christos Stavrakakis
            if now > b.updated + delta:
78 cc7c0f44 Christos Stavrakakis
                update_resources(b)
79 cc7c0f44 Christos Stavrakakis
                print 'Successfully updated backend with id: %d' % b.id
80 cc7c0f44 Christos Stavrakakis
            else:
81 cc7c0f44 Christos Stavrakakis
                print 'Backend %d does not need update' % b.id