Statistics
| Branch: | Tag: | Revision:

root / snf-cyclades-app / synnefo / api / management / commands / server-list.py @ c51f3a08

History | View | Annotate | Download (5.3 kB)

1 11300d7b Giorgos Verigakis
# Copyright 2012 GRNET S.A. All rights reserved.
2 11300d7b Giorgos Verigakis
#
3 11300d7b Giorgos Verigakis
# Redistribution and use in source and binary forms, with or
4 11300d7b Giorgos Verigakis
# without modification, are permitted provided that the following
5 11300d7b Giorgos Verigakis
# conditions are met:
6 11300d7b Giorgos Verigakis
#
7 11300d7b Giorgos Verigakis
#   1. Redistributions of source code must retain the above
8 11300d7b Giorgos Verigakis
#      copyright notice, this list of conditions and the following
9 11300d7b Giorgos Verigakis
#      disclaimer.
10 11300d7b Giorgos Verigakis
#
11 11300d7b Giorgos Verigakis
#   2. Redistributions in binary form must reproduce the above
12 11300d7b Giorgos Verigakis
#      copyright notice, this list of conditions and the following
13 11300d7b Giorgos Verigakis
#      disclaimer in the documentation and/or other materials
14 11300d7b Giorgos Verigakis
#      provided with the distribution.
15 11300d7b Giorgos Verigakis
#
16 11300d7b Giorgos Verigakis
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17 11300d7b Giorgos Verigakis
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 11300d7b Giorgos Verigakis
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 11300d7b Giorgos Verigakis
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20 11300d7b Giorgos Verigakis
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 11300d7b Giorgos Verigakis
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 11300d7b Giorgos Verigakis
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23 11300d7b Giorgos Verigakis
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24 11300d7b Giorgos Verigakis
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 11300d7b Giorgos Verigakis
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26 11300d7b Giorgos Verigakis
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 11300d7b Giorgos Verigakis
# POSSIBILITY OF SUCH DAMAGE.
28 11300d7b Giorgos Verigakis
#
29 11300d7b Giorgos Verigakis
# The views and conclusions contained in the software and
30 11300d7b Giorgos Verigakis
# documentation are those of the authors and should not be
31 11300d7b Giorgos Verigakis
# interpreted as representing official policies, either expressed
32 11300d7b Giorgos Verigakis
# or implied, of GRNET S.A.
33 11300d7b Giorgos Verigakis
34 11300d7b Giorgos Verigakis
from optparse import make_option
35 11300d7b Giorgos Verigakis
36 11300d7b Giorgos Verigakis
from django.core.management.base import BaseCommand, CommandError
37 bad9404c Christos Stavrakakis
from synnefo.management.common import (format_vm_state, get_backend,
38 3170076a Stratos Psomadakis
                                       filter_results, pprint_table, UUIDCache)
39 11300d7b Giorgos Verigakis
from synnefo.api.util import get_image
40 b84ed662 Christos Stavrakakis
from synnefo.db.models import VirtualMachine
41 11300d7b Giorgos Verigakis
42 11300d7b Giorgos Verigakis
43 bad9404c Christos Stavrakakis
FIELDS = VirtualMachine._meta.get_all_field_names()
44 bad9404c Christos Stavrakakis
45 bad9404c Christos Stavrakakis
46 11300d7b Giorgos Verigakis
class Command(BaseCommand):
47 11300d7b Giorgos Verigakis
    help = "List servers"
48 fc1fb924 Christos Stavrakakis
49 11300d7b Giorgos Verigakis
    option_list = BaseCommand.option_list + (
50 11300d7b Giorgos Verigakis
        make_option('-c',
51 11300d7b Giorgos Verigakis
            action='store_true',
52 11300d7b Giorgos Verigakis
            dest='csv',
53 11300d7b Giorgos Verigakis
            default=False,
54 11300d7b Giorgos Verigakis
            help="Use pipes to separate values"),
55 824bbd37 Kostas Papadimitriou
        make_option('--suspended',
56 824bbd37 Kostas Papadimitriou
            action='store_true',
57 824bbd37 Kostas Papadimitriou
            dest='suspended',
58 824bbd37 Kostas Papadimitriou
            default=False,
59 824bbd37 Kostas Papadimitriou
            help="List only suspended servers"),
60 11300d7b Giorgos Verigakis
        make_option('--build',
61 11300d7b Giorgos Verigakis
            action='store_true',
62 11300d7b Giorgos Verigakis
            dest='build',
63 11300d7b Giorgos Verigakis
            default=False,
64 11300d7b Giorgos Verigakis
            help="List only servers in the building state"),
65 bad9404c Christos Stavrakakis
        make_option('--deleted',
66 bad9404c Christos Stavrakakis
            action='store_true',
67 bad9404c Christos Stavrakakis
            dest='deleted',
68 bad9404c Christos Stavrakakis
            default=False,
69 bad9404c Christos Stavrakakis
            help="Include deleted servers"),
70 bad9404c Christos Stavrakakis
        make_option('--backend-id',
71 bad9404c Christos Stavrakakis
            dest='backend_id',
72 bad9404c Christos Stavrakakis
            help="List only servers of the specified backend"),
73 bad9404c Christos Stavrakakis
        make_option('--filter-by',
74 bad9404c Christos Stavrakakis
            dest='filter_by',
75 bad9404c Christos Stavrakakis
            help="Filter results. Comma seperated list of key `cond` val pairs"
76 bad9404c Christos Stavrakakis
                 " that displayed entries must satisfy. e.g."
77 bad9404c Christos Stavrakakis
                 " --filter-by \"operstate=STARTED,id>=22\"."
78 3170076a Stratos Psomadakis
                 " Available keys are: %s" % ", ".join(FIELDS)),
79 3170076a Stratos Psomadakis
        make_option('--uuids',
80 3170076a Stratos Psomadakis
            action='store_true',
81 3170076a Stratos Psomadakis
            dest='use_uuids',
82 3170076a Stratos Psomadakis
            default=False,
83 3170076a Stratos Psomadakis
            help="Display UUIDs instead of user emails"),
84 11300d7b Giorgos Verigakis
        )
85 fc1fb924 Christos Stavrakakis
86 11300d7b Giorgos Verigakis
    def handle(self, *args, **options):
87 11300d7b Giorgos Verigakis
        if args:
88 11300d7b Giorgos Verigakis
            raise CommandError("Command doesn't accept any arguments")
89 1a894bfe Christos Stavrakakis
90 1a894bfe Christos Stavrakakis
        if options['backend_id']:
91 b84ed662 Christos Stavrakakis
            backend = get_backend(options['backend_id'])
92 b84ed662 Christos Stavrakakis
            servers = backend.virtual_machines
93 1a894bfe Christos Stavrakakis
        else:
94 1a894bfe Christos Stavrakakis
            servers = VirtualMachine.objects
95 1a894bfe Christos Stavrakakis
96 0e3d0ff0 Christos Stavrakakis
        if options['deleted']:
97 1a894bfe Christos Stavrakakis
            servers = servers.all()
98 0e3d0ff0 Christos Stavrakakis
        else:
99 0e3d0ff0 Christos Stavrakakis
            servers = servers.filter(deleted=False)
100 1a894bfe Christos Stavrakakis
101 824bbd37 Kostas Papadimitriou
        if options['suspended']:
102 824bbd37 Kostas Papadimitriou
            servers = servers.filter(suspended=True)
103 824bbd37 Kostas Papadimitriou
104 11300d7b Giorgos Verigakis
        if options['build']:
105 11300d7b Giorgos Verigakis
            servers = servers.filter(operstate='BUILD')
106 fc1fb924 Christos Stavrakakis
107 bad9404c Christos Stavrakakis
        filter_by = options['filter_by']
108 bad9404c Christos Stavrakakis
        if filter_by:
109 bad9404c Christos Stavrakakis
            servers = filter_results(servers, filter_by)
110 bad9404c Christos Stavrakakis
111 fc1fb924 Christos Stavrakakis
        cache = ImageCache()
112 c51f3a08 Stratos Psomadakis
        if options['use_uuids'] is False:
113 c51f3a08 Stratos Psomadakis
            ucache = UUIDCache()
114 fc1fb924 Christos Stavrakakis
115 7a0aa449 Christos Stavrakakis
        headers = ('id', 'name', 'owner', 'flavor', 'image', 'state',
116 7a0aa449 Christos Stavrakakis
                   'backend')
117 7a0aa449 Christos Stavrakakis
118 7a0aa449 Christos Stavrakakis
        table = []
119 90b67503 Christos Stavrakakis
        for server in servers.order_by('id'):
120 2caa409e Giorgos Verigakis
            try:
121 2caa409e Giorgos Verigakis
                name = server.name.decode('utf8')
122 2caa409e Giorgos Verigakis
            except UnicodeEncodeError:
123 2caa409e Giorgos Verigakis
                name = server.name
124 7a0aa449 Christos Stavrakakis
125 11300d7b Giorgos Verigakis
            flavor = server.flavor.name
126 7a0aa449 Christos Stavrakakis
127 f1e8a6e2 Giorgos Verigakis
            try:
128 fc1fb924 Christos Stavrakakis
                image = cache.get_image(server.imageid, server.userid)['name']
129 f1e8a6e2 Giorgos Verigakis
            except:
130 f1e8a6e2 Giorgos Verigakis
                image = server.imageid
131 f66d8b04 Christos Stavrakakis
132 f66d8b04 Christos Stavrakakis
            state = format_vm_state(server)
133 fc1fb924 Christos Stavrakakis
134 3170076a Stratos Psomadakis
            user = server.userid
135 c51f3a08 Stratos Psomadakis
            if options['use_uuids'] is False:
136 3fa01ebd Stratos Psomadakis
                user = ucache.get_user(server.userid)
137 3170076a Stratos Psomadakis
138 3170076a Stratos Psomadakis
            fields = (str(server.id), name, user, flavor, image,
139 7a0aa449 Christos Stavrakakis
                      state, str(server.backend))
140 7a0aa449 Christos Stavrakakis
            table.append(fields)
141 fc1fb924 Christos Stavrakakis
142 7a0aa449 Christos Stavrakakis
        separator = " | " if options['csv'] else None
143 7a0aa449 Christos Stavrakakis
        pprint_table(self.stdout, table, headers, separator)
144 fc1fb924 Christos Stavrakakis
145 fc1fb924 Christos Stavrakakis
146 fc1fb924 Christos Stavrakakis
class ImageCache(object):
147 fc1fb924 Christos Stavrakakis
    def __init__(self):
148 fc1fb924 Christos Stavrakakis
        self.images = {}
149 fc1fb924 Christos Stavrakakis
150 fc1fb924 Christos Stavrakakis
    def get_image(self, imageid, userid):
151 fc1fb924 Christos Stavrakakis
        if not imageid in self.images:
152 fc1fb924 Christos Stavrakakis
            self.images[imageid] = get_image(imageid, userid)
153 fc1fb924 Christos Stavrakakis
        return self.images[imageid]