Statistics
| Branch: | Tag: | Revision:

root / snf-cyclades-app / synnefo / logic / management / commands / server-list.py @ fa532396

History | View | Annotate | Download (5.7 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 2052c40e Christos Stavrakakis
from functools import partial
36 11300d7b Giorgos Verigakis
37 7cfc0cef Christos Stavrakakis
from snf_django.management.commands import ListCommand
38 b84ed662 Christos Stavrakakis
from synnefo.db.models import VirtualMachine
39 b0e7f310 Christos Stavrakakis
from synnefo.management.common import get_backend
40 b0e7f310 Christos Stavrakakis
from synnefo.api.util import get_image
41 18c4414d Giorgos Korfiatis
from synnefo.settings import (CYCLADES_SERVICE_TOKEN as ASTAKOS_TOKEN,
42 e407f159 Ilias Tsitsimpis
                              ASTAKOS_AUTH_URL)
43 b0e7f310 Christos Stavrakakis
from logging import getLogger
44 b0e7f310 Christos Stavrakakis
log = getLogger(__name__)
45 bad9404c Christos Stavrakakis
46 bad9404c Christos Stavrakakis
47 b0e7f310 Christos Stavrakakis
class Command(ListCommand):
48 11300d7b Giorgos Verigakis
    help = "List servers"
49 fc1fb924 Christos Stavrakakis
50 b0e7f310 Christos Stavrakakis
    option_list = ListCommand.option_list + (
51 9621c777 Christos Stavrakakis
        make_option(
52 9621c777 Christos Stavrakakis
            '--suspended',
53 824bbd37 Kostas Papadimitriou
            action='store_true',
54 824bbd37 Kostas Papadimitriou
            dest='suspended',
55 824bbd37 Kostas Papadimitriou
            default=False,
56 824bbd37 Kostas Papadimitriou
            help="List only suspended servers"),
57 9621c777 Christos Stavrakakis
        make_option(
58 9621c777 Christos Stavrakakis
            '--backend-id',
59 bad9404c Christos Stavrakakis
            dest='backend_id',
60 bad9404c Christos Stavrakakis
            help="List only servers of the specified backend"),
61 9621c777 Christos Stavrakakis
        make_option(
62 b0e7f310 Christos Stavrakakis
            "--build",
63 b0e7f310 Christos Stavrakakis
            action="store_true",
64 b0e7f310 Christos Stavrakakis
            dest="build",
65 b0e7f310 Christos Stavrakakis
            default=False,
66 b0e7f310 Christos Stavrakakis
            help="List only servers in the building state"),
67 8814e07c Christos Stavrakakis
        make_option(
68 b0e7f310 Christos Stavrakakis
            "--image-name",
69 b0e7f310 Christos Stavrakakis
            action="store_true",
70 b0e7f310 Christos Stavrakakis
            dest="image_name",
71 3170076a Stratos Psomadakis
            default=False,
72 b0e7f310 Christos Stavrakakis
            help="Display image name instead of image ID"),
73 8814e07c Christos Stavrakakis
    )
74 fc1fb924 Christos Stavrakakis
75 b0e7f310 Christos Stavrakakis
    object_class = VirtualMachine
76 b0e7f310 Christos Stavrakakis
    deleted_field = "deleted"
77 b0e7f310 Christos Stavrakakis
    user_uuid_field = "userid"
78 e407f159 Ilias Tsitsimpis
    astakos_auth_url = ASTAKOS_AUTH_URL
79 76a13815 Christos Stavrakakis
    astakos_token = ASTAKOS_TOKEN
80 1a894bfe Christos Stavrakakis
81 2052c40e Christos Stavrakakis
    def get_ips(version, vm):
82 2052c40e Christos Stavrakakis
        ips = []
83 2052c40e Christos Stavrakakis
        for nic in vm.nics.all():
84 2052c40e Christos Stavrakakis
            for ip in nic.ips.all():
85 2052c40e Christos Stavrakakis
                if ip.subnet.ipversion == version:
86 2052c40e Christos Stavrakakis
                    ips.append(ip.address)
87 2052c40e Christos Stavrakakis
        return ips
88 1a894bfe Christos Stavrakakis
89 b0e7f310 Christos Stavrakakis
    def format_vm_state(vm):
90 b0e7f310 Christos Stavrakakis
        if vm.operstate == "BUILD":
91 b0e7f310 Christos Stavrakakis
            return "BUILD(" + str(vm.buildpercentage) + "%)"
92 0e3d0ff0 Christos Stavrakakis
        else:
93 b0e7f310 Christos Stavrakakis
            return vm.operstate
94 b0e7f310 Christos Stavrakakis
95 b0e7f310 Christos Stavrakakis
    FIELDS = {
96 b0e7f310 Christos Stavrakakis
        "id": ("id", "ID of the server"),
97 b0e7f310 Christos Stavrakakis
        "name": ("name", "Name of the server"),
98 b0e7f310 Christos Stavrakakis
        "user.uuid": ("userid", "The UUID of the server's owner"),
99 b0e7f310 Christos Stavrakakis
        "flavor": ("flavor.name", "The name of the server's flavor"),
100 b0e7f310 Christos Stavrakakis
        "backend": ("backend", "The Ganeti backend that hosts the VM"),
101 b0e7f310 Christos Stavrakakis
        "image.id": ("imageid", "The ID of the server's image"),
102 b0e7f310 Christos Stavrakakis
        "image.name": ("image", "The name of the server's image"),
103 b0e7f310 Christos Stavrakakis
        "state": (format_vm_state, "The current state of the server"),
104 2052c40e Christos Stavrakakis
        "ipv4": (partial(get_ips, 4),
105 2052c40e Christos Stavrakakis
                 "The IPv4 addresses of the server"),
106 2052c40e Christos Stavrakakis
        "ipv6": (partial(get_ips, 6),
107 2052c40e Christos Stavrakakis
                 "The IPv6 addresses of the server"),
108 b0e7f310 Christos Stavrakakis
        "created": ("created", "The date the server was created"),
109 b0e7f310 Christos Stavrakakis
        "deleted": ("deleted", "Whether the server is deleted or not"),
110 b0e7f310 Christos Stavrakakis
        "suspended": ("suspended", "Whether the server is administratively"
111 b0e7f310 Christos Stavrakakis
                      " suspended"),
112 a6a70f40 Giorgos Korfiatis
        "project": ("project", "The project UUID"),
113 b0e7f310 Christos Stavrakakis
    }
114 b0e7f310 Christos Stavrakakis
115 b0e7f310 Christos Stavrakakis
    fields = ["id", "name", "user.uuid", "state", "flavor", "image.id",
116 b0e7f310 Christos Stavrakakis
              "backend"]
117 b0e7f310 Christos Stavrakakis
118 b0e7f310 Christos Stavrakakis
    def handle_args(self, *args, **options):
119 b0e7f310 Christos Stavrakakis
        if options["suspended"]:
120 b0e7f310 Christos Stavrakakis
            self.filters["suspended"] = True
121 b0e7f310 Christos Stavrakakis
122 b0e7f310 Christos Stavrakakis
        if options["backend_id"]:
123 b0e7f310 Christos Stavrakakis
            backend = get_backend(options["backend_id"])
124 b0e7f310 Christos Stavrakakis
            self.filters["backend"] = backend.id
125 b0e7f310 Christos Stavrakakis
126 b0e7f310 Christos Stavrakakis
        if options["build"]:
127 b0e7f310 Christos Stavrakakis
            self.filters["operstate"] = "BUILD"
128 b0e7f310 Christos Stavrakakis
129 b0e7f310 Christos Stavrakakis
        if options["image_name"]:
130 adc82764 Christos Stavrakakis
            self.fields = ["image.name" if x == "image.id" else x
131 adc82764 Christos Stavrakakis
                           for x in self.fields]
132 b0e7f310 Christos Stavrakakis
133 2052c40e Christos Stavrakakis
        if "ipv4" in self.fields or "ipv6" in self.fields:
134 2052c40e Christos Stavrakakis
            self.prefetch_related.append("nics__ips__subnet")
135 2052c40e Christos Stavrakakis
136 b0e7f310 Christos Stavrakakis
    def handle_db_objects(self, rows, *args, **kwargs):
137 c4b9ea4c Christos Stavrakakis
        if "image.name" in self.fields:
138 c4b9ea4c Christos Stavrakakis
            icache = ImageCache()
139 c4b9ea4c Christos Stavrakakis
            for vm in rows:
140 c4b9ea4c Christos Stavrakakis
                vm.image = icache.get_image(vm.imageid, vm.userid)
141 fc1fb924 Christos Stavrakakis
142 fc1fb924 Christos Stavrakakis
143 fc1fb924 Christos Stavrakakis
class ImageCache(object):
144 fc1fb924 Christos Stavrakakis
    def __init__(self):
145 fc1fb924 Christos Stavrakakis
        self.images = {}
146 fc1fb924 Christos Stavrakakis
147 fc1fb924 Christos Stavrakakis
    def get_image(self, imageid, userid):
148 fc1fb924 Christos Stavrakakis
        if not imageid in self.images:
149 2b1e7b83 Stratos Psomadakis
            try:
150 2b1e7b83 Stratos Psomadakis
                self.images[imageid] = get_image(imageid, userid)['name']
151 2b1e7b83 Stratos Psomadakis
            except Exception as e:
152 60c67b41 Stratos Psomadakis
                log.warning("Error getting image name from imageid %s: %s",
153 2b1e7b83 Stratos Psomadakis
                            imageid, e)
154 2b1e7b83 Stratos Psomadakis
                self.images[imageid] = imageid
155 2b1e7b83 Stratos Psomadakis
156 fc1fb924 Christos Stavrakakis
        return self.images[imageid]