Statistics
| Branch: | Tag: | Revision:

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

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