Statistics
| Branch: | Tag: | Revision:

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

History | View | Annotate | Download (5 kB)

1 b0e7f310 Christos Stavrakakis
# Copyright 2012-2013 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 b0e7f310 Christos Stavrakakis
from synnefo.webproject.management.commands import ListCommand
37 b84ed662 Christos Stavrakakis
from synnefo.db.models import VirtualMachine
38 b0e7f310 Christos Stavrakakis
from synnefo.management.common import get_backend
39 b0e7f310 Christos Stavrakakis
from synnefo.api.util import get_image
40 11300d7b Giorgos Verigakis
41 b0e7f310 Christos Stavrakakis
from logging import getLogger
42 b0e7f310 Christos Stavrakakis
log = getLogger(__name__)
43 bad9404c Christos Stavrakakis
44 bad9404c Christos Stavrakakis
45 b0e7f310 Christos Stavrakakis
class Command(ListCommand):
46 11300d7b Giorgos Verigakis
    help = "List servers"
47 fc1fb924 Christos Stavrakakis
48 b0e7f310 Christos Stavrakakis
    option_list = ListCommand.option_list + (
49 9621c777 Christos Stavrakakis
        make_option(
50 9621c777 Christos Stavrakakis
            '--suspended',
51 824bbd37 Kostas Papadimitriou
            action='store_true',
52 824bbd37 Kostas Papadimitriou
            dest='suspended',
53 824bbd37 Kostas Papadimitriou
            default=False,
54 824bbd37 Kostas Papadimitriou
            help="List only suspended servers"),
55 9621c777 Christos Stavrakakis
        make_option(
56 9621c777 Christos Stavrakakis
            '--backend-id',
57 bad9404c Christos Stavrakakis
            dest='backend_id',
58 bad9404c Christos Stavrakakis
            help="List only servers of the specified backend"),
59 9621c777 Christos Stavrakakis
        make_option(
60 b0e7f310 Christos Stavrakakis
            "--build",
61 b0e7f310 Christos Stavrakakis
            action="store_true",
62 b0e7f310 Christos Stavrakakis
            dest="build",
63 b0e7f310 Christos Stavrakakis
            default=False,
64 b0e7f310 Christos Stavrakakis
            help="List only servers in the building state"),
65 8814e07c Christos Stavrakakis
        make_option(
66 b0e7f310 Christos Stavrakakis
            "--image-name",
67 b0e7f310 Christos Stavrakakis
            action="store_true",
68 b0e7f310 Christos Stavrakakis
            dest="image_name",
69 3170076a Stratos Psomadakis
            default=False,
70 b0e7f310 Christos Stavrakakis
            help="Display image name instead of image ID"),
71 8814e07c Christos Stavrakakis
    )
72 fc1fb924 Christos Stavrakakis
73 b0e7f310 Christos Stavrakakis
    object_class = VirtualMachine
74 b0e7f310 Christos Stavrakakis
    deleted_field = "deleted"
75 b0e7f310 Christos Stavrakakis
    user_uuid_field = "userid"
76 1a894bfe Christos Stavrakakis
77 b0e7f310 Christos Stavrakakis
    def get_public_ip(vm):
78 b0e7f310 Christos Stavrakakis
        try:
79 b0e7f310 Christos Stavrakakis
            return vm.nics.all()[0].ipv4
80 b0e7f310 Christos Stavrakakis
        except IndexError:
81 b0e7f310 Christos Stavrakakis
            return None
82 1a894bfe Christos Stavrakakis
83 b0e7f310 Christos Stavrakakis
    def format_vm_state(vm):
84 b0e7f310 Christos Stavrakakis
        if vm.operstate == "BUILD":
85 b0e7f310 Christos Stavrakakis
            return "BUILD(" + str(vm.buildpercentage) + "%)"
86 0e3d0ff0 Christos Stavrakakis
        else:
87 b0e7f310 Christos Stavrakakis
            return vm.operstate
88 b0e7f310 Christos Stavrakakis
89 b0e7f310 Christos Stavrakakis
    FIELDS = {
90 b0e7f310 Christos Stavrakakis
        "id": ("id", "ID of the server"),
91 b0e7f310 Christos Stavrakakis
        "name": ("name", "Name of the server"),
92 b0e7f310 Christos Stavrakakis
        "user.uuid": ("userid", "The UUID of the server's owner"),
93 b0e7f310 Christos Stavrakakis
        "flavor": ("flavor.name", "The name of the server's flavor"),
94 b0e7f310 Christos Stavrakakis
        "backend": ("backend", "The Ganeti backend that hosts the VM"),
95 b0e7f310 Christos Stavrakakis
        "image.id": ("imageid", "The ID of the server's image"),
96 b0e7f310 Christos Stavrakakis
        "image.name": ("image", "The name of the server's image"),
97 b0e7f310 Christos Stavrakakis
        "state": (format_vm_state, "The current state of the server"),
98 b0e7f310 Christos Stavrakakis
        "ip": (get_public_ip, "The public IP of the server"),
99 b0e7f310 Christos Stavrakakis
        "created": ("created", "The date the server was created"),
100 b0e7f310 Christos Stavrakakis
        "deleted": ("deleted", "Whether the server is deleted or not"),
101 b0e7f310 Christos Stavrakakis
        "suspended": ("suspended", "Whether the server is administratively"
102 b0e7f310 Christos Stavrakakis
                      " suspended"),
103 b0e7f310 Christos Stavrakakis
    }
104 b0e7f310 Christos Stavrakakis
105 b0e7f310 Christos Stavrakakis
    fields = ["id", "name", "user.uuid", "state", "flavor", "image.id",
106 b0e7f310 Christos Stavrakakis
              "backend"]
107 b0e7f310 Christos Stavrakakis
108 b0e7f310 Christos Stavrakakis
    def handle_args(self, *args, **options):
109 b0e7f310 Christos Stavrakakis
        if options["suspended"]:
110 b0e7f310 Christos Stavrakakis
            self.filters["suspended"] = True
111 b0e7f310 Christos Stavrakakis
112 b0e7f310 Christos Stavrakakis
        if options["backend_id"]:
113 b0e7f310 Christos Stavrakakis
            backend = get_backend(options["backend_id"])
114 b0e7f310 Christos Stavrakakis
            self.filters["backend"] = backend.id
115 b0e7f310 Christos Stavrakakis
116 b0e7f310 Christos Stavrakakis
        if options["build"]:
117 b0e7f310 Christos Stavrakakis
            self.filters["operstate"] = "BUILD"
118 b0e7f310 Christos Stavrakakis
119 b0e7f310 Christos Stavrakakis
        if options["image_name"]:
120 b0e7f310 Christos Stavrakakis
            self.fields.replace("image.id", "image.name")
121 b0e7f310 Christos Stavrakakis
122 b0e7f310 Christos Stavrakakis
    def handle_db_objects(self, rows, *args, **kwargs):
123 b0e7f310 Christos Stavrakakis
        icache = ImageCache()
124 b0e7f310 Christos Stavrakakis
        for vm in rows:
125 b0e7f310 Christos Stavrakakis
            vm.image = icache.get_image(vm.imageid, vm.userid)
126 fc1fb924 Christos Stavrakakis
127 fc1fb924 Christos Stavrakakis
128 fc1fb924 Christos Stavrakakis
class ImageCache(object):
129 fc1fb924 Christos Stavrakakis
    def __init__(self):
130 fc1fb924 Christos Stavrakakis
        self.images = {}
131 fc1fb924 Christos Stavrakakis
132 fc1fb924 Christos Stavrakakis
    def get_image(self, imageid, userid):
133 fc1fb924 Christos Stavrakakis
        if not imageid in self.images:
134 2b1e7b83 Stratos Psomadakis
            try:
135 2b1e7b83 Stratos Psomadakis
                self.images[imageid] = get_image(imageid, userid)['name']
136 2b1e7b83 Stratos Psomadakis
            except Exception as e:
137 60c67b41 Stratos Psomadakis
                log.warning("Error getting image name from imageid %s: %s",
138 2b1e7b83 Stratos Psomadakis
                            imageid, e)
139 2b1e7b83 Stratos Psomadakis
                self.images[imageid] = imageid
140 2b1e7b83 Stratos Psomadakis
141 fc1fb924 Christos Stavrakakis
        return self.images[imageid]