Statistics
| Branch: | Tag: | Revision:

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

History | View | Annotate | Download (3.4 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 b84ed662 Christos Stavrakakis
from django.core.management.base import BaseCommand
33 b84ed662 Christos Stavrakakis
from synnefo.management.common import get_backend
34 b84ed662 Christos Stavrakakis
35 cc7c0f44 Christos Stavrakakis
from synnefo import settings
36 cc7c0f44 Christos Stavrakakis
import datetime
37 cc7c0f44 Christos Stavrakakis
38 cc7c0f44 Christos Stavrakakis
from synnefo.db.models import Backend
39 cc7c0f44 Christos Stavrakakis
from synnefo.logic.backend import update_resources
40 cc7c0f44 Christos Stavrakakis
41 cc7c0f44 Christos Stavrakakis
42 cc7c0f44 Christos Stavrakakis
class Command(BaseCommand):
43 cc7c0f44 Christos Stavrakakis
    can_import_settings = True
44 cc7c0f44 Christos Stavrakakis
45 cc7c0f44 Christos Stavrakakis
    help = "Update backend statistics, which are used for instance allocation."
46 cc7c0f44 Christos Stavrakakis
    output_transaction = True  # The management command runs inside
47 cc7c0f44 Christos Stavrakakis
                               # an SQL transaction
48 cc7c0f44 Christos Stavrakakis
    option_list = BaseCommand.option_list + (
49 c7cbb6f3 Christos Stavrakakis
        make_option('--backend-id', dest='backend_id',
50 cc7c0f44 Christos Stavrakakis
                   help="Update statistics of only this backend"),
51 c7cbb6f3 Christos Stavrakakis
        make_option('--older-than', dest='older_than', metavar="MINUTES",
52 cc7c0f44 Christos Stavrakakis
                   help="Update only backends that have not been updated for\
53 39a6388d Christos Stavrakakis
                   MINUTES. Set to 0 to force update."),
54 39a6388d Christos Stavrakakis
        make_option('--include-drained', dest='drained',
55 39a6388d Christos Stavrakakis
                    default=False,
56 39a6388d Christos Stavrakakis
                    action='store_true',
57 39a6388d Christos Stavrakakis
                    help="Also update statistics of drained backends")
58 cc7c0f44 Christos Stavrakakis
        )
59 cc7c0f44 Christos Stavrakakis
60 cc7c0f44 Christos Stavrakakis
    def handle(self, **options):
61 cc7c0f44 Christos Stavrakakis
62 cc7c0f44 Christos Stavrakakis
        if options['backend_id']:
63 b84ed662 Christos Stavrakakis
            backends = [get_backend(options['backend_id'])]
64 cc7c0f44 Christos Stavrakakis
        else:
65 39a6388d Christos Stavrakakis
            backends = Backend.objects.filter(offline=False)
66 b84ed662 Christos Stavrakakis
            if not options['drained']:
67 b84ed662 Christos Stavrakakis
                backends = backends.filter(drained=False)
68 cc7c0f44 Christos Stavrakakis
69 cc7c0f44 Christos Stavrakakis
        now = datetime.datetime.now()
70 cc7c0f44 Christos Stavrakakis
        if options['older_than'] is not None:
71 cc7c0f44 Christos Stavrakakis
            minutes = int(options['older_than'])
72 cc7c0f44 Christos Stavrakakis
        else:
73 cc7c0f44 Christos Stavrakakis
            minutes = settings.BACKEND_REFRESH_MIN
74 cc7c0f44 Christos Stavrakakis
75 cc7c0f44 Christos Stavrakakis
        delta = datetime.timedelta(minutes=minutes)
76 cc7c0f44 Christos Stavrakakis
77 cc7c0f44 Christos Stavrakakis
        for b in backends:
78 cc7c0f44 Christos Stavrakakis
            if now > b.updated + delta:
79 cc7c0f44 Christos Stavrakakis
                update_resources(b)
80 cc7c0f44 Christos Stavrakakis
                print 'Successfully updated backend with id: %d' % b.id
81 cc7c0f44 Christos Stavrakakis
            else:
82 cc7c0f44 Christos Stavrakakis
                print 'Backend %d does not need update' % b.id