Statistics
| Branch: | Tag: | Revision:

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

History | View | Annotate | Download (6.4 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 4500650c Stratos Psomadakis
from synnefo.management.common import (format_vm_state, get_backend, Omit,
38 8283d6c1 Stratos Psomadakis
                                       filter_results, pprint_table, UserCache)
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 2b1e7b83 Stratos Psomadakis
import logging
43 2b1e7b83 Stratos Psomadakis
log = logging.getLogger(__name__)
44 11300d7b Giorgos Verigakis
45 bad9404c Christos Stavrakakis
FIELDS = VirtualMachine._meta.get_all_field_names()
46 bad9404c Christos Stavrakakis
47 bad9404c Christos Stavrakakis
48 11300d7b Giorgos Verigakis
class Command(BaseCommand):
49 11300d7b Giorgos Verigakis
    help = "List servers"
50 fc1fb924 Christos Stavrakakis
51 11300d7b Giorgos Verigakis
    option_list = BaseCommand.option_list + (
52 11300d7b Giorgos Verigakis
        make_option('-c',
53 11300d7b Giorgos Verigakis
            action='store_true',
54 11300d7b Giorgos Verigakis
            dest='csv',
55 11300d7b Giorgos Verigakis
            default=False,
56 11300d7b Giorgos Verigakis
            help="Use pipes to separate values"),
57 824bbd37 Kostas Papadimitriou
        make_option('--suspended',
58 824bbd37 Kostas Papadimitriou
            action='store_true',
59 824bbd37 Kostas Papadimitriou
            dest='suspended',
60 824bbd37 Kostas Papadimitriou
            default=False,
61 824bbd37 Kostas Papadimitriou
            help="List only suspended servers"),
62 11300d7b Giorgos Verigakis
        make_option('--build',
63 11300d7b Giorgos Verigakis
            action='store_true',
64 11300d7b Giorgos Verigakis
            dest='build',
65 11300d7b Giorgos Verigakis
            default=False,
66 11300d7b Giorgos Verigakis
            help="List only servers in the building state"),
67 bad9404c Christos Stavrakakis
        make_option('--deleted',
68 bad9404c Christos Stavrakakis
            action='store_true',
69 bad9404c Christos Stavrakakis
            dest='deleted',
70 bad9404c Christos Stavrakakis
            default=False,
71 bad9404c Christos Stavrakakis
            help="Include deleted servers"),
72 bad9404c Christos Stavrakakis
        make_option('--backend-id',
73 bad9404c Christos Stavrakakis
            dest='backend_id',
74 bad9404c Christos Stavrakakis
            help="List only servers of the specified backend"),
75 4500650c Stratos Psomadakis
        make_option('--user',
76 4500650c Stratos Psomadakis
            dest='user',
77 4500650c Stratos Psomadakis
            help="List only servers of the specified user (uuid or email)"),
78 bad9404c Christos Stavrakakis
        make_option('--filter-by',
79 bad9404c Christos Stavrakakis
            dest='filter_by',
80 bad9404c Christos Stavrakakis
            help="Filter results. Comma seperated list of key `cond` val pairs"
81 bad9404c Christos Stavrakakis
                 " that displayed entries must satisfy. e.g."
82 bad9404c Christos Stavrakakis
                 " --filter-by \"operstate=STARTED,id>=22\"."
83 3170076a Stratos Psomadakis
                 " Available keys are: %s" % ", ".join(FIELDS)),
84 4500650c Stratos Psomadakis
        make_option('--displayname',
85 3170076a Stratos Psomadakis
            action='store_true',
86 4500650c Stratos Psomadakis
            dest='displayname',
87 3170076a Stratos Psomadakis
            default=False,
88 4500650c Stratos Psomadakis
            help="Display both uuid and display name"),
89 8814e07c Christos Stavrakakis
    )
90 fc1fb924 Christos Stavrakakis
91 11300d7b Giorgos Verigakis
    def handle(self, *args, **options):
92 11300d7b Giorgos Verigakis
        if args:
93 11300d7b Giorgos Verigakis
            raise CommandError("Command doesn't accept any arguments")
94 1a894bfe Christos Stavrakakis
95 8283d6c1 Stratos Psomadakis
        ucache = UserCache()
96 4500650c Stratos Psomadakis
97 1a894bfe Christos Stavrakakis
        if options['backend_id']:
98 b84ed662 Christos Stavrakakis
            backend = get_backend(options['backend_id'])
99 b84ed662 Christos Stavrakakis
            servers = backend.virtual_machines
100 1a894bfe Christos Stavrakakis
        else:
101 1a894bfe Christos Stavrakakis
            servers = VirtualMachine.objects
102 1a894bfe Christos Stavrakakis
103 0e3d0ff0 Christos Stavrakakis
        if options['deleted']:
104 1a894bfe Christos Stavrakakis
            servers = servers.all()
105 0e3d0ff0 Christos Stavrakakis
        else:
106 0e3d0ff0 Christos Stavrakakis
            servers = servers.filter(deleted=False)
107 1a894bfe Christos Stavrakakis
108 824bbd37 Kostas Papadimitriou
        if options['suspended']:
109 824bbd37 Kostas Papadimitriou
            servers = servers.filter(suspended=True)
110 824bbd37 Kostas Papadimitriou
111 11300d7b Giorgos Verigakis
        if options['build']:
112 11300d7b Giorgos Verigakis
            servers = servers.filter(operstate='BUILD')
113 fc1fb924 Christos Stavrakakis
114 4500650c Stratos Psomadakis
        user = options['user']
115 4500650c Stratos Psomadakis
        if user:
116 4500650c Stratos Psomadakis
            if '@' in user:
117 8283d6c1 Stratos Psomadakis
                user = ucache.get_uuid(user)
118 4500650c Stratos Psomadakis
            servers = servers.filter(userid=user)
119 4500650c Stratos Psomadakis
120 bad9404c Christos Stavrakakis
        filter_by = options['filter_by']
121 bad9404c Christos Stavrakakis
        if filter_by:
122 bad9404c Christos Stavrakakis
            servers = filter_results(servers, filter_by)
123 bad9404c Christos Stavrakakis
124 4500650c Stratos Psomadakis
        displayname = options['displayname']
125 4500650c Stratos Psomadakis
126 fc1fb924 Christos Stavrakakis
        cache = ImageCache()
127 fc1fb924 Christos Stavrakakis
128 4500650c Stratos Psomadakis
        headers = filter(lambda x: x is not Omit,
129 4500650c Stratos Psomadakis
                        ['id',
130 4500650c Stratos Psomadakis
                         'name',
131 4500650c Stratos Psomadakis
                         'owner_uuid',
132 4500650c Stratos Psomadakis
                         'owner_name' if displayname else Omit,
133 4500650c Stratos Psomadakis
                         'flavor',
134 4500650c Stratos Psomadakis
                         'image',
135 4500650c Stratos Psomadakis
                         'state',
136 4500650c Stratos Psomadakis
                         'backend',
137 4500650c Stratos Psomadakis
                          ])
138 7a0aa449 Christos Stavrakakis
139 8283d6c1 Stratos Psomadakis
        uuids = list(set([server.userid for server in servers]))
140 8283d6c1 Stratos Psomadakis
        ucache.fetch_names(uuids)
141 8283d6c1 Stratos Psomadakis
142 7a0aa449 Christos Stavrakakis
        table = []
143 90b67503 Christos Stavrakakis
        for server in servers.order_by('id'):
144 2caa409e Giorgos Verigakis
            try:
145 2caa409e Giorgos Verigakis
                name = server.name.decode('utf8')
146 2caa409e Giorgos Verigakis
            except UnicodeEncodeError:
147 2caa409e Giorgos Verigakis
                name = server.name
148 7a0aa449 Christos Stavrakakis
149 11300d7b Giorgos Verigakis
            flavor = server.flavor.name
150 7a0aa449 Christos Stavrakakis
151 2b1e7b83 Stratos Psomadakis
            image = cache.get_image(server.imageid, server.userid)
152 f66d8b04 Christos Stavrakakis
153 f66d8b04 Christos Stavrakakis
            state = format_vm_state(server)
154 fc1fb924 Christos Stavrakakis
155 4500650c Stratos Psomadakis
            uuid = server.userid
156 4500650c Stratos Psomadakis
            if displayname:
157 8283d6c1 Stratos Psomadakis
                dname = ucache.get_name(server.userid)
158 4500650c Stratos Psomadakis
159 4500650c Stratos Psomadakis
            fields = filter(lambda x: x is not Omit,
160 4500650c Stratos Psomadakis
                            [str(server.id),
161 4500650c Stratos Psomadakis
                             name,
162 4500650c Stratos Psomadakis
                             uuid,
163 4500650c Stratos Psomadakis
                             dname if displayname else Omit,
164 4500650c Stratos Psomadakis
                             flavor,
165 4500650c Stratos Psomadakis
                             image,
166 4500650c Stratos Psomadakis
                             state,
167 4500650c Stratos Psomadakis
                             str(server.backend),
168 4500650c Stratos Psomadakis
                            ])
169 7a0aa449 Christos Stavrakakis
            table.append(fields)
170 fc1fb924 Christos Stavrakakis
171 7a0aa449 Christos Stavrakakis
        separator = " | " if options['csv'] else None
172 7a0aa449 Christos Stavrakakis
        pprint_table(self.stdout, table, headers, separator)
173 fc1fb924 Christos Stavrakakis
174 fc1fb924 Christos Stavrakakis
175 fc1fb924 Christos Stavrakakis
class ImageCache(object):
176 fc1fb924 Christos Stavrakakis
    def __init__(self):
177 fc1fb924 Christos Stavrakakis
        self.images = {}
178 fc1fb924 Christos Stavrakakis
179 fc1fb924 Christos Stavrakakis
    def get_image(self, imageid, userid):
180 fc1fb924 Christos Stavrakakis
        if not imageid in self.images:
181 2b1e7b83 Stratos Psomadakis
            try:
182 2b1e7b83 Stratos Psomadakis
                self.images[imageid] = get_image(imageid, userid)['name']
183 2b1e7b83 Stratos Psomadakis
            except Exception as e:
184 2b1e7b83 Stratos Psomadakis
                log.warning("Error getting image name from imageid %s",
185 2b1e7b83 Stratos Psomadakis
                            imageid, e)
186 2b1e7b83 Stratos Psomadakis
                self.images[imageid] = imageid
187 2b1e7b83 Stratos Psomadakis
188 fc1fb924 Christos Stavrakakis
        return self.images[imageid]