Statistics
| Branch: | Tag: | Revision:

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

History | View | Annotate | Download (6.5 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 7856a37a Stratos Psomadakis
                         ['id',
130 7856a37a Stratos Psomadakis
                          'name',
131 7856a37a Stratos Psomadakis
                          'owner_uuid',
132 7856a37a Stratos Psomadakis
                          'owner_name' if displayname else Omit,
133 7856a37a Stratos Psomadakis
                          'flavor',
134 7856a37a Stratos Psomadakis
                          'image',
135 7856a37a Stratos Psomadakis
                          'state',
136 7856a37a Stratos Psomadakis
                          'backend',
137 4500650c Stratos Psomadakis
                          ])
138 7a0aa449 Christos Stavrakakis
139 d443e1dd Stratos Psomadakis
        if displayname:
140 d443e1dd Stratos Psomadakis
            uuids = list(set([server.userid for server in servers]))
141 d443e1dd Stratos Psomadakis
            ucache.fetch_names(uuids)
142 8283d6c1 Stratos Psomadakis
143 7a0aa449 Christos Stavrakakis
        table = []
144 90b67503 Christos Stavrakakis
        for server in servers.order_by('id'):
145 2caa409e Giorgos Verigakis
            try:
146 2caa409e Giorgos Verigakis
                name = server.name.decode('utf8')
147 2caa409e Giorgos Verigakis
            except UnicodeEncodeError:
148 2caa409e Giorgos Verigakis
                name = server.name
149 7a0aa449 Christos Stavrakakis
150 11300d7b Giorgos Verigakis
            flavor = server.flavor.name
151 7a0aa449 Christos Stavrakakis
152 2b1e7b83 Stratos Psomadakis
            image = cache.get_image(server.imageid, server.userid)
153 f66d8b04 Christos Stavrakakis
154 f66d8b04 Christos Stavrakakis
            state = format_vm_state(server)
155 fc1fb924 Christos Stavrakakis
156 4500650c Stratos Psomadakis
            uuid = server.userid
157 4500650c Stratos Psomadakis
            if displayname:
158 8283d6c1 Stratos Psomadakis
                dname = ucache.get_name(server.userid)
159 4500650c Stratos Psomadakis
160 4500650c Stratos Psomadakis
            fields = filter(lambda x: x is not Omit,
161 4500650c Stratos Psomadakis
                            [str(server.id),
162 4500650c Stratos Psomadakis
                             name,
163 4500650c Stratos Psomadakis
                             uuid,
164 4500650c Stratos Psomadakis
                             dname if displayname else Omit,
165 4500650c Stratos Psomadakis
                             flavor,
166 4500650c Stratos Psomadakis
                             image,
167 4500650c Stratos Psomadakis
                             state,
168 4500650c Stratos Psomadakis
                             str(server.backend),
169 7856a37a Stratos Psomadakis
                             ])
170 7a0aa449 Christos Stavrakakis
            table.append(fields)
171 fc1fb924 Christos Stavrakakis
172 7a0aa449 Christos Stavrakakis
        separator = " | " if options['csv'] else None
173 7a0aa449 Christos Stavrakakis
        pprint_table(self.stdout, table, headers, separator)
174 fc1fb924 Christos Stavrakakis
175 fc1fb924 Christos Stavrakakis
176 fc1fb924 Christos Stavrakakis
class ImageCache(object):
177 fc1fb924 Christos Stavrakakis
    def __init__(self):
178 fc1fb924 Christos Stavrakakis
        self.images = {}
179 fc1fb924 Christos Stavrakakis
180 fc1fb924 Christos Stavrakakis
    def get_image(self, imageid, userid):
181 fc1fb924 Christos Stavrakakis
        if not imageid in self.images:
182 2b1e7b83 Stratos Psomadakis
            try:
183 2b1e7b83 Stratos Psomadakis
                self.images[imageid] = get_image(imageid, userid)['name']
184 2b1e7b83 Stratos Psomadakis
            except Exception as e:
185 60c67b41 Stratos Psomadakis
                log.warning("Error getting image name from imageid %s: %s",
186 2b1e7b83 Stratos Psomadakis
                            imageid, e)
187 2b1e7b83 Stratos Psomadakis
                self.images[imageid] = imageid
188 2b1e7b83 Stratos Psomadakis
189 fc1fb924 Christos Stavrakakis
        return self.images[imageid]