Statistics
| Branch: | Tag: | Revision:

root / kamaki / cli / commands / cyclades.py @ f00db940

History | View | Annotate | Download (33.8 kB)

1 a494a741 Stavros Sachtouris
# Copyright 2011-2013 GRNET S.A. All rights reserved.
2 7493ccb6 Stavros Sachtouris
#
3 7493ccb6 Stavros Sachtouris
# Redistribution and use in source and binary forms, with or
4 7493ccb6 Stavros Sachtouris
# without modification, are permitted provided that the following
5 7493ccb6 Stavros Sachtouris
# conditions are met:
6 7493ccb6 Stavros Sachtouris
#
7 7493ccb6 Stavros Sachtouris
#   1. Redistributions of source code must retain the above
8 7493ccb6 Stavros Sachtouris
#      copyright notice, this list of conditions and the following
9 7493ccb6 Stavros Sachtouris
#      disclaimer.
10 7493ccb6 Stavros Sachtouris
#
11 7493ccb6 Stavros Sachtouris
#   2. Redistributions in binary form must reproduce the above
12 7493ccb6 Stavros Sachtouris
#      copyright notice, this list of conditions and the following
13 7493ccb6 Stavros Sachtouris
#      disclaimer in the documentation and/or other materials
14 7493ccb6 Stavros Sachtouris
#      provided with the distribution.
15 7493ccb6 Stavros Sachtouris
#
16 7493ccb6 Stavros Sachtouris
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17 7493ccb6 Stavros Sachtouris
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 7493ccb6 Stavros Sachtouris
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 7493ccb6 Stavros Sachtouris
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20 7493ccb6 Stavros Sachtouris
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 7493ccb6 Stavros Sachtouris
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 7493ccb6 Stavros Sachtouris
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23 7493ccb6 Stavros Sachtouris
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24 7493ccb6 Stavros Sachtouris
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 7493ccb6 Stavros Sachtouris
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26 7493ccb6 Stavros Sachtouris
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 7493ccb6 Stavros Sachtouris
# POSSIBILITY OF SUCH DAMAGE.
28 7493ccb6 Stavros Sachtouris
#
29 7493ccb6 Stavros Sachtouris
# The views and conclusions contained in the software and
30 7493ccb6 Stavros Sachtouris
# documentation are those of the authors and should not be
31 7493ccb6 Stavros Sachtouris
# interpreted as representing official policies, either expressed
32 7493ccb6 Stavros Sachtouris
# or implied, of GRNET S.A.
33 7493ccb6 Stavros Sachtouris
34 f3e94e06 Stavros Sachtouris
from kamaki.cli import command
35 d486baec Stavros Sachtouris
from kamaki.cli.command_tree import CommandTree
36 89ea97e1 Stavros Sachtouris
from kamaki.cli.utils import (
37 89ea97e1 Stavros Sachtouris
    print_dict, remove_from_items, filter_dicts_by_dict)
38 8cec3671 Stavros Sachtouris
from kamaki.cli.errors import raiseCLIError, CLISyntaxError, CLIBaseUrlError
39 7493ccb6 Stavros Sachtouris
from kamaki.clients.cyclades import CycladesClient, ClientError
40 57d622b6 Stavros Sachtouris
from kamaki.cli.argument import FlagArgument, ValueArgument, KeyValueArgument
41 bd40efdf Stavros Sachtouris
from kamaki.cli.argument import ProgressBarArgument, DateArgument, IntArgument
42 b4f69041 Stavros Sachtouris
from kamaki.cli.commands import _command_init, errors, addLogSettings
43 545c6c29 Stavros Sachtouris
from kamaki.cli.commands import _optional_output_cmd, _optional_json
44 5eae854d Stavros Sachtouris
45 f3e94e06 Stavros Sachtouris
from base64 import b64encode
46 234954d1 Stavros Sachtouris
from os.path import exists
47 234954d1 Stavros Sachtouris
48 234954d1 Stavros Sachtouris
49 a29d2f88 Stavros Sachtouris
server_cmds = CommandTree('server', 'Cyclades/Compute API server commands')
50 a29d2f88 Stavros Sachtouris
flavor_cmds = CommandTree('flavor', 'Cyclades/Compute API flavor commands')
51 a29d2f88 Stavros Sachtouris
network_cmds = CommandTree('network', 'Cyclades/Compute API network commands')
52 8be50626 Stavros Sachtouris
_commands = [server_cmds, flavor_cmds, network_cmds]
53 234954d1 Stavros Sachtouris
54 7493ccb6 Stavros Sachtouris
55 c314fc10 Stavros Sachtouris
about_authentication = '\nUser Authentication:\
56 4018326d Stavros Sachtouris
    \n* to check authentication: /user authenticate\
57 9e5341f5 Stavros Sachtouris
    \n* to set authentication token: /config set cloud.<cloud>.token <token>'
58 18edacfe Stavros Sachtouris
59 d7259dd5 Stavros Sachtouris
howto_personality = [
60 d7259dd5 Stavros Sachtouris
    'Defines a file to be injected to VMs personality.',
61 8194b51b Stavros Sachtouris
    'Personality value syntax: PATH,[SERVER_PATH,[OWNER,[GROUP,[MODE]]]]',
62 d7259dd5 Stavros Sachtouris
    '  PATH: of local file to be injected',
63 d7259dd5 Stavros Sachtouris
    '  SERVER_PATH: destination location inside server Image',
64 d7259dd5 Stavros Sachtouris
    '  OWNER: user id of destination file owner',
65 d7259dd5 Stavros Sachtouris
    '  GROUP: group id or name to own destination file',
66 d7259dd5 Stavros Sachtouris
    '  MODEL: permition in octal (e.g. 0777 or o+rwx)']
67 d7259dd5 Stavros Sachtouris
68 18edacfe Stavros Sachtouris
69 60c42f9f Stavros Sachtouris
class _server_wait(object):
70 60c42f9f Stavros Sachtouris
71 60c42f9f Stavros Sachtouris
    wait_arguments = dict(
72 60c42f9f Stavros Sachtouris
        progress_bar=ProgressBarArgument(
73 60c42f9f Stavros Sachtouris
            'do not show progress bar',
74 60c42f9f Stavros Sachtouris
            ('-N', '--no-progress-bar'),
75 60c42f9f Stavros Sachtouris
            False
76 60c42f9f Stavros Sachtouris
        )
77 60c42f9f Stavros Sachtouris
    )
78 60c42f9f Stavros Sachtouris
79 60c42f9f Stavros Sachtouris
    def _wait(self, server_id, currect_status):
80 60c42f9f Stavros Sachtouris
        (progress_bar, wait_cb) = self._safe_progress_bar(
81 60c42f9f Stavros Sachtouris
            'Server %s still in %s mode' % (server_id, currect_status))
82 60c42f9f Stavros Sachtouris
83 60c42f9f Stavros Sachtouris
        try:
84 60c42f9f Stavros Sachtouris
            new_mode = self.client.wait_server(
85 60c42f9f Stavros Sachtouris
                server_id,
86 60c42f9f Stavros Sachtouris
                currect_status,
87 60c42f9f Stavros Sachtouris
                wait_cb=wait_cb)
88 60c42f9f Stavros Sachtouris
        except Exception:
89 60c42f9f Stavros Sachtouris
            raise
90 60c42f9f Stavros Sachtouris
        finally:
91 60c42f9f Stavros Sachtouris
            self._safe_progress_bar_finish(progress_bar)
92 60c42f9f Stavros Sachtouris
        if new_mode:
93 60c42f9f Stavros Sachtouris
            print('Server %s is now in %s mode' % (server_id, new_mode))
94 60c42f9f Stavros Sachtouris
        else:
95 60c42f9f Stavros Sachtouris
            raiseCLIError(None, 'Time out')
96 60c42f9f Stavros Sachtouris
97 60c42f9f Stavros Sachtouris
98 7b2e4bf1 Stavros Sachtouris
class _network_wait(object):
99 7b2e4bf1 Stavros Sachtouris
100 7b2e4bf1 Stavros Sachtouris
    wait_arguments = dict(
101 7b2e4bf1 Stavros Sachtouris
        progress_bar=ProgressBarArgument(
102 7b2e4bf1 Stavros Sachtouris
            'do not show progress bar',
103 7b2e4bf1 Stavros Sachtouris
            ('-N', '--no-progress-bar'),
104 7b2e4bf1 Stavros Sachtouris
            False
105 7b2e4bf1 Stavros Sachtouris
        )
106 7b2e4bf1 Stavros Sachtouris
    )
107 7b2e4bf1 Stavros Sachtouris
108 7b2e4bf1 Stavros Sachtouris
    def _wait(self, net_id, currect_status):
109 7b2e4bf1 Stavros Sachtouris
        (progress_bar, wait_cb) = self._safe_progress_bar(
110 7b2e4bf1 Stavros Sachtouris
            'Network %s still in %s mode' % (net_id, currect_status))
111 7b2e4bf1 Stavros Sachtouris
112 7b2e4bf1 Stavros Sachtouris
        try:
113 7b2e4bf1 Stavros Sachtouris
            new_mode = self.client.wait_network(
114 7b2e4bf1 Stavros Sachtouris
                net_id,
115 7b2e4bf1 Stavros Sachtouris
                currect_status,
116 7b2e4bf1 Stavros Sachtouris
                wait_cb=wait_cb)
117 7b2e4bf1 Stavros Sachtouris
        except Exception:
118 7b2e4bf1 Stavros Sachtouris
            raise
119 7b2e4bf1 Stavros Sachtouris
        finally:
120 7b2e4bf1 Stavros Sachtouris
            self._safe_progress_bar_finish(progress_bar)
121 7b2e4bf1 Stavros Sachtouris
        if new_mode:
122 7b2e4bf1 Stavros Sachtouris
            print('Network %s is now in %s mode' % (net_id, new_mode))
123 7b2e4bf1 Stavros Sachtouris
        else:
124 7b2e4bf1 Stavros Sachtouris
            raiseCLIError(None, 'Time out')
125 7b2e4bf1 Stavros Sachtouris
126 7b2e4bf1 Stavros Sachtouris
127 5eae854d Stavros Sachtouris
class _init_cyclades(_command_init):
128 b04288f7 Stavros Sachtouris
    @errors.generic.all
129 b4f69041 Stavros Sachtouris
    @addLogSettings
130 236e7d08 Stavros Sachtouris
    def _run(self, service='compute'):
131 b4f69041 Stavros Sachtouris
        if getattr(self, 'cloud', None):
132 b4f69041 Stavros Sachtouris
            base_url = self._custom_url(service)\
133 b4f69041 Stavros Sachtouris
                or self._custom_url('cyclades')
134 b4f69041 Stavros Sachtouris
            if base_url:
135 b4f69041 Stavros Sachtouris
                token = self._custom_token(service)\
136 b4f69041 Stavros Sachtouris
                    or self._custom_token('cyclades')\
137 144b3551 Stavros Sachtouris
                    or self.config.get_cloud('token')
138 b4f69041 Stavros Sachtouris
                self.client = CycladesClient(
139 b4f69041 Stavros Sachtouris
                    base_url=base_url, token=token)
140 b4f69041 Stavros Sachtouris
                return
141 b4f69041 Stavros Sachtouris
        else:
142 b4f69041 Stavros Sachtouris
            self.cloud = 'default'
143 8cec3671 Stavros Sachtouris
        if getattr(self, 'auth_base', False):
144 8cec3671 Stavros Sachtouris
            cyclades_endpoints = self.auth_base.get_service_endpoints(
145 b4f69041 Stavros Sachtouris
                self._custom_type('cyclades') or 'compute',
146 b4f69041 Stavros Sachtouris
                self._custom_version('cyclades') or '')
147 8cec3671 Stavros Sachtouris
            base_url = cyclades_endpoints['publicURL']
148 b4f69041 Stavros Sachtouris
            token = self.auth_base.token
149 b4f69041 Stavros Sachtouris
            self.client = CycladesClient(base_url=base_url, token=token)
150 8cec3671 Stavros Sachtouris
        else:
151 8cec3671 Stavros Sachtouris
            raise CLIBaseUrlError(service='cyclades')
152 8cec3671 Stavros Sachtouris
153 b04288f7 Stavros Sachtouris
    def main(self):
154 b04288f7 Stavros Sachtouris
        self._run()
155 236e7d08 Stavros Sachtouris
156 234954d1 Stavros Sachtouris
157 d486baec Stavros Sachtouris
@command(server_cmds)
158 545c6c29 Stavros Sachtouris
class server_list(_init_cyclades, _optional_json):
159 c314fc10 Stavros Sachtouris
    """List Virtual Machines accessible by user"""
160 18edacfe Stavros Sachtouris
161 89ea97e1 Stavros Sachtouris
    PERMANENTS = ('id', 'name')
162 89ea97e1 Stavros Sachtouris
163 18edacfe Stavros Sachtouris
    __doc__ += about_authentication
164 7493ccb6 Stavros Sachtouris
165 e15d78e2 Stavros Sachtouris
    arguments = dict(
166 f40f0cb7 Stavros Sachtouris
        detail=FlagArgument('show detailed output', ('-l', '--details')),
167 67469d65 Stavros Sachtouris
        since=DateArgument(
168 a382ea56 Stavros Sachtouris
            'show only items since date (\' d/m/Y H:M:S \')',
169 a4d0d88a Stavros Sachtouris
            '--since'),
170 f40f0cb7 Stavros Sachtouris
        limit=IntArgument('limit number of listed VMs', ('-n', '--number')),
171 a4d0d88a Stavros Sachtouris
        more=FlagArgument(
172 ddc0b290 Stavros Sachtouris
            'output results in pages (-n to set items per page, default 10)',
173 ed9af02c Stavros Sachtouris
            '--more'),
174 89ea97e1 Stavros Sachtouris
        enum=FlagArgument('Enumerate results', '--enumerate'),
175 89ea97e1 Stavros Sachtouris
        name=ValueArgument('filter by name', '--name'),
176 89ea97e1 Stavros Sachtouris
        name_pref=ValueArgument(
177 89ea97e1 Stavros Sachtouris
            'filter by name prefix (case insensitive)', '--name-prefix'),
178 89ea97e1 Stavros Sachtouris
        name_suff=ValueArgument(
179 89ea97e1 Stavros Sachtouris
            'filter by name suffix (case insensitive)', '--name-suffix'),
180 89ea97e1 Stavros Sachtouris
        name_like=ValueArgument(
181 89ea97e1 Stavros Sachtouris
            'print only if name contains this (case insensitive)',
182 89ea97e1 Stavros Sachtouris
            '--name-like'),
183 89ea97e1 Stavros Sachtouris
        flavor_id=ValueArgument('filter by flavor id', ('--flavor-id')),
184 89ea97e1 Stavros Sachtouris
        image_id=ValueArgument('filter by image id', ('--image-id')),
185 89ea97e1 Stavros Sachtouris
        meta=KeyValueArgument('filter by metadata key=values', ('--metadata')),
186 89ea97e1 Stavros Sachtouris
        meta_like=KeyValueArgument(
187 89ea97e1 Stavros Sachtouris
            'print only if in key=value, the value is part of actual value',
188 89ea97e1 Stavros Sachtouris
            ('--metadata-like')),
189 e15d78e2 Stavros Sachtouris
    )
190 e15d78e2 Stavros Sachtouris
191 89ea97e1 Stavros Sachtouris
    def _filtered_by_name(self, servers):
192 89ea97e1 Stavros Sachtouris
        if self['name']:
193 89ea97e1 Stavros Sachtouris
            servers = filter_dicts_by_dict(servers, dict(name=self['name']))
194 89ea97e1 Stavros Sachtouris
        np, ns, nl = self['name_pref'], self['name_suff'], self['name_like']
195 89ea97e1 Stavros Sachtouris
        return [img for img in servers if (
196 89ea97e1 Stavros Sachtouris
            (not np) or img['name'].lower().startswith(np.lower())) and (
197 89ea97e1 Stavros Sachtouris
            (not ns) or img['name'].lower().endswith(ns.lower())) and (
198 89ea97e1 Stavros Sachtouris
            (not nl) or nl.lower() in img['name'].lower())]
199 89ea97e1 Stavros Sachtouris
200 f00db940 Stavros Sachtouris
    def _add_user_name(self, servers):
201 f00db940 Stavros Sachtouris
        uuids = self._uuids2usernames(
202 f00db940 Stavros Sachtouris
            list(set([srv['user_id'] for srv in servers])))
203 f00db940 Stavros Sachtouris
        for srv in servers:
204 f00db940 Stavros Sachtouris
            srv['user_id'] += ' (%s)' % uuids[srv['user_id']]
205 f00db940 Stavros Sachtouris
        return servers
206 f00db940 Stavros Sachtouris
207 89ea97e1 Stavros Sachtouris
    def _filtered_by_image(self, servers):
208 89ea97e1 Stavros Sachtouris
        iid = self['image_id']
209 89ea97e1 Stavros Sachtouris
        new_servers = []
210 89ea97e1 Stavros Sachtouris
        for srv in servers:
211 89ea97e1 Stavros Sachtouris
            if srv['image']['id'] == iid:
212 89ea97e1 Stavros Sachtouris
                new_servers.append(srv)
213 89ea97e1 Stavros Sachtouris
        return new_servers
214 89ea97e1 Stavros Sachtouris
215 89ea97e1 Stavros Sachtouris
    def _filtered_by_flavor(self, servers):
216 89ea97e1 Stavros Sachtouris
        fid = self['flavor_id']
217 89ea97e1 Stavros Sachtouris
        new_servers = []
218 89ea97e1 Stavros Sachtouris
        for srv in servers:
219 89ea97e1 Stavros Sachtouris
            if '%s' % srv['flavor']['id'] == '%s' % fid:
220 89ea97e1 Stavros Sachtouris
                new_servers.append(srv)
221 89ea97e1 Stavros Sachtouris
        return new_servers
222 89ea97e1 Stavros Sachtouris
223 89ea97e1 Stavros Sachtouris
    def _filtered_by_metadata(self, servers):
224 89ea97e1 Stavros Sachtouris
        new_servers = []
225 89ea97e1 Stavros Sachtouris
        for srv in servers:
226 89ea97e1 Stavros Sachtouris
            if not 'metadata' in srv:
227 89ea97e1 Stavros Sachtouris
                continue
228 89ea97e1 Stavros Sachtouris
            meta = [dict(srv['metadata'])]
229 89ea97e1 Stavros Sachtouris
            if self['meta']:
230 89ea97e1 Stavros Sachtouris
                meta = filter_dicts_by_dict(meta, self['meta'])
231 89ea97e1 Stavros Sachtouris
            if meta and self['meta_like']:
232 89ea97e1 Stavros Sachtouris
                meta = filter_dicts_by_dict(
233 89ea97e1 Stavros Sachtouris
                    meta, self['meta_like'], exact_match=False)
234 89ea97e1 Stavros Sachtouris
            if meta:
235 89ea97e1 Stavros Sachtouris
                new_servers.append(srv)
236 89ea97e1 Stavros Sachtouris
        return new_servers
237 89ea97e1 Stavros Sachtouris
238 b04288f7 Stavros Sachtouris
    @errors.generic.all
239 b04288f7 Stavros Sachtouris
    @errors.cyclades.connection
240 b04288f7 Stavros Sachtouris
    @errors.cyclades.date
241 b04288f7 Stavros Sachtouris
    def _run(self):
242 89ea97e1 Stavros Sachtouris
        withimage = bool(self['image_id'])
243 89ea97e1 Stavros Sachtouris
        withflavor = bool(self['flavor_id'])
244 89ea97e1 Stavros Sachtouris
        withmeta = bool(self['meta'] or self['meta_like'])
245 89ea97e1 Stavros Sachtouris
        detail = self['detail'] or withimage or withflavor or withmeta
246 89ea97e1 Stavros Sachtouris
        servers = self.client.list_servers(detail, self['since'])
247 89ea97e1 Stavros Sachtouris
248 89ea97e1 Stavros Sachtouris
        servers = self._filtered_by_name(servers)
249 89ea97e1 Stavros Sachtouris
        if withimage:
250 89ea97e1 Stavros Sachtouris
            servers = self._filtered_by_image(servers)
251 89ea97e1 Stavros Sachtouris
        if withflavor:
252 89ea97e1 Stavros Sachtouris
            servers = self._filtered_by_flavor(servers)
253 89ea97e1 Stavros Sachtouris
        if withmeta:
254 89ea97e1 Stavros Sachtouris
            servers = self._filtered_by_metadata(servers)
255 89ea97e1 Stavros Sachtouris
256 f00db940 Stavros Sachtouris
        if self['detail'] and not self['json_output']:
257 f00db940 Stavros Sachtouris
            servers = self._add_user_name(servers)
258 f00db940 Stavros Sachtouris
        elif not (self['detail'] or self['json_output']):
259 7ba195e5 Stavros Sachtouris
            remove_from_items(servers, 'links')
260 89ea97e1 Stavros Sachtouris
        if detail and not self['detail']:
261 89ea97e1 Stavros Sachtouris
            for srv in servers:
262 89ea97e1 Stavros Sachtouris
                for key in set(srv).difference(self.PERMANENTS):
263 89ea97e1 Stavros Sachtouris
                    srv.pop(key)
264 545c6c29 Stavros Sachtouris
        kwargs = dict(with_enumeration=self['enum'])
265 a4d0d88a Stavros Sachtouris
        if self['more']:
266 545c6c29 Stavros Sachtouris
            kwargs['page_size'] = self['limit'] if self['limit'] else 10
267 545c6c29 Stavros Sachtouris
        elif self['limit']:
268 545c6c29 Stavros Sachtouris
            servers = servers[:self['limit']]
269 545c6c29 Stavros Sachtouris
        self._print(servers, **kwargs)
270 7493ccb6 Stavros Sachtouris
271 b04288f7 Stavros Sachtouris
    def main(self):
272 b04288f7 Stavros Sachtouris
        super(self.__class__, self)._run()
273 b04288f7 Stavros Sachtouris
        self._run()
274 b04288f7 Stavros Sachtouris
275 234954d1 Stavros Sachtouris
276 d486baec Stavros Sachtouris
@command(server_cmds)
277 545c6c29 Stavros Sachtouris
class server_info(_init_cyclades, _optional_json):
278 67469d65 Stavros Sachtouris
    """Detailed information on a Virtual Machine
279 67469d65 Stavros Sachtouris
    Contains:
280 67469d65 Stavros Sachtouris
    - name, id, status, create/update dates
281 67469d65 Stavros Sachtouris
    - network interfaces
282 67469d65 Stavros Sachtouris
    - metadata (e.g. os, superuser) and diagnostics
283 67469d65 Stavros Sachtouris
    - hardware flavor and os image ids
284 67469d65 Stavros Sachtouris
    """
285 7493ccb6 Stavros Sachtouris
286 b04288f7 Stavros Sachtouris
    @errors.generic.all
287 b04288f7 Stavros Sachtouris
    @errors.cyclades.connection
288 5a673575 Stavros Sachtouris
    @errors.cyclades.server_id
289 b04288f7 Stavros Sachtouris
    def _run(self, server_id):
290 bcef3ac9 Stavros Sachtouris
        self._print(self.client.get_server_details(server_id), print_dict)
291 7493ccb6 Stavros Sachtouris
292 b04288f7 Stavros Sachtouris
    def main(self, server_id):
293 b04288f7 Stavros Sachtouris
        super(self.__class__, self)._run()
294 b04288f7 Stavros Sachtouris
        self._run(server_id=server_id)
295 b04288f7 Stavros Sachtouris
296 234954d1 Stavros Sachtouris
297 57d622b6 Stavros Sachtouris
class PersonalityArgument(KeyValueArgument):
298 234954d1 Stavros Sachtouris
    @property
299 f3e94e06 Stavros Sachtouris
    def value(self):
300 57d622b6 Stavros Sachtouris
        return self._value if hasattr(self, '_value') else []
301 234954d1 Stavros Sachtouris
302 234954d1 Stavros Sachtouris
    @value.setter
303 f3e94e06 Stavros Sachtouris
    def value(self, newvalue):
304 f3e94e06 Stavros Sachtouris
        if newvalue == self.default:
305 f3e94e06 Stavros Sachtouris
            return self.value
306 57d622b6 Stavros Sachtouris
        self._value = []
307 57d622b6 Stavros Sachtouris
        for i, terms in enumerate(newvalue):
308 57d622b6 Stavros Sachtouris
            termlist = terms.split(',')
309 57d622b6 Stavros Sachtouris
            if len(termlist) > 5:
310 de73876b Stavros Sachtouris
                msg = 'Wrong number of terms (should be 1 to 5)'
311 de73876b Stavros Sachtouris
                raiseCLIError(CLISyntaxError(msg), details=howto_personality)
312 57d622b6 Stavros Sachtouris
            path = termlist[0]
313 57d622b6 Stavros Sachtouris
            if not exists(path):
314 de73876b Stavros Sachtouris
                raiseCLIError(
315 de73876b Stavros Sachtouris
                    None,
316 8194b51b Stavros Sachtouris
                    '--personality: File %s does not exist' % path,
317 8194b51b Stavros Sachtouris
                    importance=1,
318 8194b51b Stavros Sachtouris
                    details=howto_personality)
319 57d622b6 Stavros Sachtouris
            self._value.append(dict(path=path))
320 57d622b6 Stavros Sachtouris
            with open(path) as f:
321 57d622b6 Stavros Sachtouris
                self._value[i]['contents'] = b64encode(f.read())
322 57d622b6 Stavros Sachtouris
            try:
323 57d622b6 Stavros Sachtouris
                self._value[i]['path'] = termlist[1]
324 57d622b6 Stavros Sachtouris
                self._value[i]['owner'] = termlist[2]
325 57d622b6 Stavros Sachtouris
                self._value[i]['group'] = termlist[3]
326 57d622b6 Stavros Sachtouris
                self._value[i]['mode'] = termlist[4]
327 57d622b6 Stavros Sachtouris
            except IndexError:
328 57d622b6 Stavros Sachtouris
                pass
329 f3e94e06 Stavros Sachtouris
330 234954d1 Stavros Sachtouris
331 d486baec Stavros Sachtouris
@command(server_cmds)
332 60c42f9f Stavros Sachtouris
class server_create(_init_cyclades, _optional_json, _server_wait):
333 8194b51b Stavros Sachtouris
    """Create a server (aka Virtual Machine)
334 8194b51b Stavros Sachtouris
    Parameters:
335 439826ec Stavros Sachtouris
    - name: (single quoted text)
336 439826ec Stavros Sachtouris
    - flavor id: Hardware flavor. Pick one from: /flavor list
337 439826ec Stavros Sachtouris
    - image id: OS images. Pick one from: /image list
338 8194b51b Stavros Sachtouris
    """
339 7493ccb6 Stavros Sachtouris
340 93914390 Stavros Sachtouris
    arguments = dict(
341 93914390 Stavros Sachtouris
        personality=PersonalityArgument(
342 60c42f9f Stavros Sachtouris
            (80 * ' ').join(howto_personality), ('-p', '--personality')),
343 60c42f9f Stavros Sachtouris
        wait=FlagArgument('Wait server to build', ('-w', '--wait'))
344 93914390 Stavros Sachtouris
    )
345 f3e94e06 Stavros Sachtouris
346 b04288f7 Stavros Sachtouris
    @errors.generic.all
347 b04288f7 Stavros Sachtouris
    @errors.cyclades.connection
348 b04288f7 Stavros Sachtouris
    @errors.plankton.id
349 b04288f7 Stavros Sachtouris
    @errors.cyclades.flavor_id
350 b04288f7 Stavros Sachtouris
    def _run(self, name, flavor_id, image_id):
351 60c42f9f Stavros Sachtouris
        r = self.client.create_server(
352 60c42f9f Stavros Sachtouris
            name, int(flavor_id), image_id, self['personality'])
353 60c42f9f Stavros Sachtouris
        self._print(r, print_dict)
354 60c42f9f Stavros Sachtouris
        if self['wait']:
355 60c42f9f Stavros Sachtouris
            self._wait(r['id'], r['status'])
356 b04288f7 Stavros Sachtouris
357 7493ccb6 Stavros Sachtouris
    def main(self, name, flavor_id, image_id):
358 b04288f7 Stavros Sachtouris
        super(self.__class__, self)._run()
359 b04288f7 Stavros Sachtouris
        self._run(name=name, flavor_id=flavor_id, image_id=image_id)
360 7493ccb6 Stavros Sachtouris
361 234954d1 Stavros Sachtouris
362 d486baec Stavros Sachtouris
@command(server_cmds)
363 cd295a1d Stavros Sachtouris
class server_rename(_init_cyclades, _optional_output_cmd):
364 22b6f063 Stavros Sachtouris
    """Set/update a server (VM) name
365 5a673575 Stavros Sachtouris
    VM names are not unique, therefore multiple servers may share the same name
366 22b6f063 Stavros Sachtouris
    """
367 7493ccb6 Stavros Sachtouris
368 5a673575 Stavros Sachtouris
    @errors.generic.all
369 5a673575 Stavros Sachtouris
    @errors.cyclades.connection
370 5a673575 Stavros Sachtouris
    @errors.cyclades.server_id
371 5a673575 Stavros Sachtouris
    def _run(self, server_id, new_name):
372 cd295a1d Stavros Sachtouris
        self._optional_output(
373 cd295a1d Stavros Sachtouris
            self.client.update_server_name(int(server_id), new_name))
374 5a673575 Stavros Sachtouris
375 7493ccb6 Stavros Sachtouris
    def main(self, server_id, new_name):
376 5a673575 Stavros Sachtouris
        super(self.__class__, self)._run()
377 5a673575 Stavros Sachtouris
        self._run(server_id=server_id, new_name=new_name)
378 234954d1 Stavros Sachtouris
379 7493ccb6 Stavros Sachtouris
380 d486baec Stavros Sachtouris
@command(server_cmds)
381 60c42f9f Stavros Sachtouris
class server_delete(_init_cyclades, _optional_output_cmd, _server_wait):
382 22b6f063 Stavros Sachtouris
    """Delete a server (VM)"""
383 7493ccb6 Stavros Sachtouris
384 60c42f9f Stavros Sachtouris
    arguments = dict(
385 60c42f9f Stavros Sachtouris
        wait=FlagArgument('Wait server to be destroyed', ('-w', '--wait'))
386 60c42f9f Stavros Sachtouris
    )
387 60c42f9f Stavros Sachtouris
388 5a673575 Stavros Sachtouris
    @errors.generic.all
389 5a673575 Stavros Sachtouris
    @errors.cyclades.connection
390 5a673575 Stavros Sachtouris
    @errors.cyclades.server_id
391 5a673575 Stavros Sachtouris
    def _run(self, server_id):
392 60c42f9f Stavros Sachtouris
            status = 'DELETED'
393 60c42f9f Stavros Sachtouris
            if self['wait']:
394 60c42f9f Stavros Sachtouris
                details = self.client.get_server_details(server_id)
395 60c42f9f Stavros Sachtouris
                status = details['status']
396 60c42f9f Stavros Sachtouris
397 60c42f9f Stavros Sachtouris
            r = self.client.delete_server(int(server_id))
398 60c42f9f Stavros Sachtouris
            self._optional_output(r)
399 60c42f9f Stavros Sachtouris
400 60c42f9f Stavros Sachtouris
            if self['wait']:
401 60c42f9f Stavros Sachtouris
                self._wait(server_id, status)
402 5a673575 Stavros Sachtouris
403 5a673575 Stavros Sachtouris
    def main(self, server_id):
404 5a673575 Stavros Sachtouris
        super(self.__class__, self)._run()
405 5a673575 Stavros Sachtouris
        self._run(server_id=server_id)
406 234954d1 Stavros Sachtouris
407 7493ccb6 Stavros Sachtouris
408 d486baec Stavros Sachtouris
@command(server_cmds)
409 60c42f9f Stavros Sachtouris
class server_reboot(_init_cyclades, _optional_output_cmd, _server_wait):
410 22b6f063 Stavros Sachtouris
    """Reboot a server (VM)"""
411 18edacfe Stavros Sachtouris
412 93914390 Stavros Sachtouris
    arguments = dict(
413 60c42f9f Stavros Sachtouris
        hard=FlagArgument('perform a hard reboot', ('-f', '--force')),
414 60c42f9f Stavros Sachtouris
        wait=FlagArgument('Wait server to be destroyed', ('-w', '--wait'))
415 93914390 Stavros Sachtouris
    )
416 7493ccb6 Stavros Sachtouris
417 5a673575 Stavros Sachtouris
    @errors.generic.all
418 5a673575 Stavros Sachtouris
    @errors.cyclades.connection
419 5a673575 Stavros Sachtouris
    @errors.cyclades.server_id
420 5a673575 Stavros Sachtouris
    def _run(self, server_id):
421 60c42f9f Stavros Sachtouris
        r = self.client.reboot_server(int(server_id), self['hard'])
422 60c42f9f Stavros Sachtouris
        self._optional_output(r)
423 60c42f9f Stavros Sachtouris
424 60c42f9f Stavros Sachtouris
        if self['wait']:
425 60c42f9f Stavros Sachtouris
            self._wait(server_id, 'REBOOT')
426 5a673575 Stavros Sachtouris
427 7493ccb6 Stavros Sachtouris
    def main(self, server_id):
428 5a673575 Stavros Sachtouris
        super(self.__class__, self)._run()
429 5a673575 Stavros Sachtouris
        self._run(server_id=server_id)
430 234954d1 Stavros Sachtouris
431 7493ccb6 Stavros Sachtouris
432 d486baec Stavros Sachtouris
@command(server_cmds)
433 60c42f9f Stavros Sachtouris
class server_start(_init_cyclades, _optional_output_cmd, _server_wait):
434 22b6f063 Stavros Sachtouris
    """Start an existing server (VM)"""
435 7493ccb6 Stavros Sachtouris
436 60c42f9f Stavros Sachtouris
    arguments = dict(
437 60c42f9f Stavros Sachtouris
        wait=FlagArgument('Wait server to be destroyed', ('-w', '--wait'))
438 60c42f9f Stavros Sachtouris
    )
439 60c42f9f Stavros Sachtouris
440 5a673575 Stavros Sachtouris
    @errors.generic.all
441 5a673575 Stavros Sachtouris
    @errors.cyclades.connection
442 5a673575 Stavros Sachtouris
    @errors.cyclades.server_id
443 5a673575 Stavros Sachtouris
    def _run(self, server_id):
444 60c42f9f Stavros Sachtouris
        status = 'ACTIVE'
445 60c42f9f Stavros Sachtouris
        if self['wait']:
446 60c42f9f Stavros Sachtouris
            details = self.client.get_server_details(server_id)
447 60c42f9f Stavros Sachtouris
            status = details['status']
448 60c42f9f Stavros Sachtouris
            if status in ('ACTIVE', ):
449 60c42f9f Stavros Sachtouris
                return
450 60c42f9f Stavros Sachtouris
451 60c42f9f Stavros Sachtouris
        r = self.client.start_server(int(server_id))
452 60c42f9f Stavros Sachtouris
        self._optional_output(r)
453 60c42f9f Stavros Sachtouris
454 60c42f9f Stavros Sachtouris
        if self['wait']:
455 60c42f9f Stavros Sachtouris
            self._wait(server_id, status)
456 5a673575 Stavros Sachtouris
457 7493ccb6 Stavros Sachtouris
    def main(self, server_id):
458 5a673575 Stavros Sachtouris
        super(self.__class__, self)._run()
459 5a673575 Stavros Sachtouris
        self._run(server_id=server_id)
460 234954d1 Stavros Sachtouris
461 7493ccb6 Stavros Sachtouris
462 d486baec Stavros Sachtouris
@command(server_cmds)
463 60c42f9f Stavros Sachtouris
class server_shutdown(_init_cyclades, _optional_output_cmd, _server_wait):
464 22b6f063 Stavros Sachtouris
    """Shutdown an active server (VM)"""
465 7493ccb6 Stavros Sachtouris
466 60c42f9f Stavros Sachtouris
    arguments = dict(
467 60c42f9f Stavros Sachtouris
        wait=FlagArgument('Wait server to be destroyed', ('-w', '--wait'))
468 60c42f9f Stavros Sachtouris
    )
469 60c42f9f Stavros Sachtouris
470 5a673575 Stavros Sachtouris
    @errors.generic.all
471 5a673575 Stavros Sachtouris
    @errors.cyclades.connection
472 5a673575 Stavros Sachtouris
    @errors.cyclades.server_id
473 5a673575 Stavros Sachtouris
    def _run(self, server_id):
474 60c42f9f Stavros Sachtouris
        status = 'STOPPED'
475 60c42f9f Stavros Sachtouris
        if self['wait']:
476 60c42f9f Stavros Sachtouris
            details = self.client.get_server_details(server_id)
477 60c42f9f Stavros Sachtouris
            status = details['status']
478 60c42f9f Stavros Sachtouris
            if status in ('STOPPED', ):
479 60c42f9f Stavros Sachtouris
                return
480 60c42f9f Stavros Sachtouris
481 60c42f9f Stavros Sachtouris
        r = self.client.shutdown_server(int(server_id))
482 60c42f9f Stavros Sachtouris
        self._optional_output(r)
483 60c42f9f Stavros Sachtouris
484 60c42f9f Stavros Sachtouris
        if self['wait']:
485 60c42f9f Stavros Sachtouris
            self._wait(server_id, status)
486 5a673575 Stavros Sachtouris
487 7493ccb6 Stavros Sachtouris
    def main(self, server_id):
488 5a673575 Stavros Sachtouris
        super(self.__class__, self)._run()
489 5a673575 Stavros Sachtouris
        self._run(server_id=server_id)
490 234954d1 Stavros Sachtouris
491 7493ccb6 Stavros Sachtouris
492 d486baec Stavros Sachtouris
@command(server_cmds)
493 545c6c29 Stavros Sachtouris
class server_console(_init_cyclades, _optional_json):
494 22b6f063 Stavros Sachtouris
    """Get a VNC console to access an existing server (VM)
495 22b6f063 Stavros Sachtouris
    Console connection information provided (at least):
496 439826ec Stavros Sachtouris
    - host: (url or address) a VNC host
497 439826ec Stavros Sachtouris
    - port: (int) the gateway to enter VM on host
498 439826ec Stavros Sachtouris
    - password: for VNC authorization
499 22b6f063 Stavros Sachtouris
    """
500 7493ccb6 Stavros Sachtouris
501 5a673575 Stavros Sachtouris
    @errors.generic.all
502 5a673575 Stavros Sachtouris
    @errors.cyclades.connection
503 5a673575 Stavros Sachtouris
    @errors.cyclades.server_id
504 5a673575 Stavros Sachtouris
    def _run(self, server_id):
505 bcef3ac9 Stavros Sachtouris
        self._print(
506 bcef3ac9 Stavros Sachtouris
            self.client.get_server_console(int(server_id)), print_dict)
507 5a673575 Stavros Sachtouris
508 7493ccb6 Stavros Sachtouris
    def main(self, server_id):
509 5a673575 Stavros Sachtouris
        super(self.__class__, self)._run()
510 5a673575 Stavros Sachtouris
        self._run(server_id=server_id)
511 7493ccb6 Stavros Sachtouris
512 234954d1 Stavros Sachtouris
513 d486baec Stavros Sachtouris
@command(server_cmds)
514 eb8208a5 Stavros Sachtouris
class server_resize(_init_cyclades, _optional_output_cmd):
515 eb8208a5 Stavros Sachtouris
    """Set a different flavor for an existing server
516 eb8208a5 Stavros Sachtouris
    To get server ids and flavor ids:
517 fc7c3c4c Stavros Sachtouris
    /server list
518 fc7c3c4c Stavros Sachtouris
    /flavor list
519 eb8208a5 Stavros Sachtouris
    """
520 eb8208a5 Stavros Sachtouris
521 eb8208a5 Stavros Sachtouris
    @errors.generic.all
522 eb8208a5 Stavros Sachtouris
    @errors.cyclades.connection
523 eb8208a5 Stavros Sachtouris
    @errors.cyclades.server_id
524 eb8208a5 Stavros Sachtouris
    @errors.cyclades.flavor_id
525 eb8208a5 Stavros Sachtouris
    def _run(self, server_id, flavor_id):
526 eb8208a5 Stavros Sachtouris
        self._optional_output(self.client.resize_server(server_id, flavor_id))
527 eb8208a5 Stavros Sachtouris
528 eb8208a5 Stavros Sachtouris
    def main(self, server_id, flavor_id):
529 eb8208a5 Stavros Sachtouris
        super(self.__class__, self)._run()
530 eb8208a5 Stavros Sachtouris
        self._run(server_id=server_id, flavor_id=flavor_id)
531 eb8208a5 Stavros Sachtouris
532 eb8208a5 Stavros Sachtouris
533 eb8208a5 Stavros Sachtouris
@command(server_cmds)
534 7493ccb6 Stavros Sachtouris
class server_firewall(_init_cyclades):
535 cd295a1d Stavros Sachtouris
    """Manage server (VM) firewall profiles for public networks"""
536 cd295a1d Stavros Sachtouris
537 cd295a1d Stavros Sachtouris
538 cd295a1d Stavros Sachtouris
@command(server_cmds)
539 cd295a1d Stavros Sachtouris
class server_firewall_set(_init_cyclades, _optional_output_cmd):
540 22b6f063 Stavros Sachtouris
    """Set the server (VM) firewall profile on VMs public network
541 22b6f063 Stavros Sachtouris
    Values for profile:
542 439826ec Stavros Sachtouris
    - DISABLED: Shutdown firewall
543 439826ec Stavros Sachtouris
    - ENABLED: Firewall in normal mode
544 439826ec Stavros Sachtouris
    - PROTECTED: Firewall in secure mode
545 22b6f063 Stavros Sachtouris
    """
546 7493ccb6 Stavros Sachtouris
547 5a673575 Stavros Sachtouris
    @errors.generic.all
548 5a673575 Stavros Sachtouris
    @errors.cyclades.connection
549 5a673575 Stavros Sachtouris
    @errors.cyclades.server_id
550 5a673575 Stavros Sachtouris
    @errors.cyclades.firewall
551 5a673575 Stavros Sachtouris
    def _run(self, server_id, profile):
552 cd295a1d Stavros Sachtouris
        self._optional_output(self.client.set_firewall_profile(
553 cd295a1d Stavros Sachtouris
            server_id=int(server_id), profile=('%s' % profile).upper()))
554 5a673575 Stavros Sachtouris
555 7493ccb6 Stavros Sachtouris
    def main(self, server_id, profile):
556 5a673575 Stavros Sachtouris
        super(self.__class__, self)._run()
557 5a673575 Stavros Sachtouris
        self._run(server_id=server_id, profile=profile)
558 234954d1 Stavros Sachtouris
559 f3e94e06 Stavros Sachtouris
560 d486baec Stavros Sachtouris
@command(server_cmds)
561 cd295a1d Stavros Sachtouris
class server_firewall_get(_init_cyclades):
562 cd295a1d Stavros Sachtouris
    """Get the server (VM) firewall profile for its public network"""
563 cd295a1d Stavros Sachtouris
564 cd295a1d Stavros Sachtouris
    @errors.generic.all
565 cd295a1d Stavros Sachtouris
    @errors.cyclades.connection
566 cd295a1d Stavros Sachtouris
    @errors.cyclades.server_id
567 cd295a1d Stavros Sachtouris
    def _run(self, server_id):
568 cd295a1d Stavros Sachtouris
        print(self.client.get_firewall_profile(server_id))
569 cd295a1d Stavros Sachtouris
570 cd295a1d Stavros Sachtouris
    def main(self, server_id):
571 cd295a1d Stavros Sachtouris
        super(self.__class__, self)._run()
572 cd295a1d Stavros Sachtouris
        self._run(server_id=server_id)
573 cd295a1d Stavros Sachtouris
574 cd295a1d Stavros Sachtouris
575 cd295a1d Stavros Sachtouris
@command(server_cmds)
576 545c6c29 Stavros Sachtouris
class server_addr(_init_cyclades, _optional_json):
577 22b6f063 Stavros Sachtouris
    """List the addresses of all network interfaces on a server (VM)"""
578 7493ccb6 Stavros Sachtouris
579 cd295a1d Stavros Sachtouris
    arguments = dict(
580 545c6c29 Stavros Sachtouris
        enum=FlagArgument('Enumerate results', '--enumerate')
581 cd295a1d Stavros Sachtouris
    )
582 cd295a1d Stavros Sachtouris
583 5a673575 Stavros Sachtouris
    @errors.generic.all
584 5a673575 Stavros Sachtouris
    @errors.cyclades.connection
585 5a673575 Stavros Sachtouris
    @errors.cyclades.server_id
586 5a673575 Stavros Sachtouris
    def _run(self, server_id):
587 5a673575 Stavros Sachtouris
        reply = self.client.list_server_nics(int(server_id))
588 545c6c29 Stavros Sachtouris
        self._print(
589 545c6c29 Stavros Sachtouris
            reply, with_enumeration=self['enum'] and len(reply) > 1)
590 7493ccb6 Stavros Sachtouris
591 5a673575 Stavros Sachtouris
    def main(self, server_id):
592 5a673575 Stavros Sachtouris
        super(self.__class__, self)._run()
593 5a673575 Stavros Sachtouris
        self._run(server_id=server_id)
594 5a673575 Stavros Sachtouris
595 234954d1 Stavros Sachtouris
596 d486baec Stavros Sachtouris
@command(server_cmds)
597 cd295a1d Stavros Sachtouris
class server_metadata(_init_cyclades):
598 cd295a1d Stavros Sachtouris
    """Manage Server metadata (key:value pairs of server attributes)"""
599 cd295a1d Stavros Sachtouris
600 cd295a1d Stavros Sachtouris
601 cd295a1d Stavros Sachtouris
@command(server_cmds)
602 545c6c29 Stavros Sachtouris
class server_metadata_list(_init_cyclades, _optional_json):
603 cd295a1d Stavros Sachtouris
    """Get server metadata"""
604 7493ccb6 Stavros Sachtouris
605 5a673575 Stavros Sachtouris
    @errors.generic.all
606 5a673575 Stavros Sachtouris
    @errors.cyclades.connection
607 5a673575 Stavros Sachtouris
    @errors.cyclades.server_id
608 5a673575 Stavros Sachtouris
    @errors.cyclades.metadata
609 5a673575 Stavros Sachtouris
    def _run(self, server_id, key=''):
610 545c6c29 Stavros Sachtouris
        self._print(
611 bcef3ac9 Stavros Sachtouris
            self.client.get_server_metadata(int(server_id), key), print_dict)
612 5a673575 Stavros Sachtouris
613 a34888b4 Stavros Sachtouris
    def main(self, server_id, key=''):
614 5a673575 Stavros Sachtouris
        super(self.__class__, self)._run()
615 5a673575 Stavros Sachtouris
        self._run(server_id=server_id, key=key)
616 7493ccb6 Stavros Sachtouris
617 234954d1 Stavros Sachtouris
618 d486baec Stavros Sachtouris
@command(server_cmds)
619 545c6c29 Stavros Sachtouris
class server_metadata_set(_init_cyclades, _optional_json):
620 cd295a1d Stavros Sachtouris
    """Set / update server(VM) metadata
621 cd295a1d Stavros Sachtouris
    Metadata should be given in key/value pairs in key=value format
622 9dc6159f Stavros Sachtouris
    For example: /server metadata set <server id> key1=value1 key2=value2
623 cd295a1d Stavros Sachtouris
    Old, unreferenced metadata will remain intact
624 22b6f063 Stavros Sachtouris
    """
625 7493ccb6 Stavros Sachtouris
626 5a673575 Stavros Sachtouris
    @errors.generic.all
627 5a673575 Stavros Sachtouris
    @errors.cyclades.connection
628 5a673575 Stavros Sachtouris
    @errors.cyclades.server_id
629 cd295a1d Stavros Sachtouris
    def _run(self, server_id, keyvals):
630 545c6c29 Stavros Sachtouris
        assert keyvals, 'Please, add some metadata ( key=value)'
631 cd295a1d Stavros Sachtouris
        metadata = dict()
632 cd295a1d Stavros Sachtouris
        for keyval in keyvals:
633 cd295a1d Stavros Sachtouris
            k, sep, v = keyval.partition('=')
634 cd295a1d Stavros Sachtouris
            if sep and k:
635 cd295a1d Stavros Sachtouris
                metadata[k] = v
636 cd295a1d Stavros Sachtouris
            else:
637 cd295a1d Stavros Sachtouris
                raiseCLIError(
638 cd295a1d Stavros Sachtouris
                    'Invalid piece of metadata %s' % keyval,
639 cd295a1d Stavros Sachtouris
                    importance=2, details=[
640 cd295a1d Stavros Sachtouris
                        'Correct metadata format: key=val',
641 cd295a1d Stavros Sachtouris
                        'For example:',
642 cd295a1d Stavros Sachtouris
                        '/server metadata set <server id>'
643 cd295a1d Stavros Sachtouris
                        'key1=value1 key2=value2'])
644 545c6c29 Stavros Sachtouris
        self._print(
645 bcef3ac9 Stavros Sachtouris
            self.client.update_server_metadata(int(server_id), **metadata),
646 bcef3ac9 Stavros Sachtouris
            print_dict)
647 cd295a1d Stavros Sachtouris
648 cd295a1d Stavros Sachtouris
    def main(self, server_id, *key_equals_val):
649 5a673575 Stavros Sachtouris
        super(self.__class__, self)._run()
650 cd295a1d Stavros Sachtouris
        self._run(server_id=server_id, keyvals=key_equals_val)
651 7493ccb6 Stavros Sachtouris
652 234954d1 Stavros Sachtouris
653 d486baec Stavros Sachtouris
@command(server_cmds)
654 cd295a1d Stavros Sachtouris
class server_metadata_delete(_init_cyclades, _optional_output_cmd):
655 22b6f063 Stavros Sachtouris
    """Delete server (VM) metadata"""
656 7493ccb6 Stavros Sachtouris
657 5a673575 Stavros Sachtouris
    @errors.generic.all
658 5a673575 Stavros Sachtouris
    @errors.cyclades.connection
659 5a673575 Stavros Sachtouris
    @errors.cyclades.server_id
660 5a673575 Stavros Sachtouris
    @errors.cyclades.metadata
661 5a673575 Stavros Sachtouris
    def _run(self, server_id, key):
662 cd295a1d Stavros Sachtouris
        self._optional_output(
663 cd295a1d Stavros Sachtouris
            self.client.delete_server_metadata(int(server_id), key))
664 5a673575 Stavros Sachtouris
665 7493ccb6 Stavros Sachtouris
    def main(self, server_id, key):
666 5a673575 Stavros Sachtouris
        super(self.__class__, self)._run()
667 5a673575 Stavros Sachtouris
        self._run(server_id=server_id, key=key)
668 234954d1 Stavros Sachtouris
669 7493ccb6 Stavros Sachtouris
670 d486baec Stavros Sachtouris
@command(server_cmds)
671 545c6c29 Stavros Sachtouris
class server_stats(_init_cyclades, _optional_json):
672 22b6f063 Stavros Sachtouris
    """Get server (VM) statistics"""
673 7493ccb6 Stavros Sachtouris
674 5a673575 Stavros Sachtouris
    @errors.generic.all
675 5a673575 Stavros Sachtouris
    @errors.cyclades.connection
676 5a673575 Stavros Sachtouris
    @errors.cyclades.server_id
677 5a673575 Stavros Sachtouris
    def _run(self, server_id):
678 bcef3ac9 Stavros Sachtouris
        self._print(self.client.get_server_stats(int(server_id)), print_dict)
679 5a673575 Stavros Sachtouris
680 7493ccb6 Stavros Sachtouris
    def main(self, server_id):
681 5a673575 Stavros Sachtouris
        super(self.__class__, self)._run()
682 5a673575 Stavros Sachtouris
        self._run(server_id=server_id)
683 7493ccb6 Stavros Sachtouris
684 234954d1 Stavros Sachtouris
685 d486baec Stavros Sachtouris
@command(server_cmds)
686 60c42f9f Stavros Sachtouris
class server_wait(_init_cyclades, _server_wait):
687 fd1f1d96 Stavros Sachtouris
    """Wait for server to finish [BUILD, STOPPED, REBOOT, ACTIVE]"""
688 fd1f1d96 Stavros Sachtouris
689 5a673575 Stavros Sachtouris
    @errors.generic.all
690 5a673575 Stavros Sachtouris
    @errors.cyclades.connection
691 5a673575 Stavros Sachtouris
    @errors.cyclades.server_id
692 5a673575 Stavros Sachtouris
    def _run(self, server_id, currect_status):
693 60c42f9f Stavros Sachtouris
        self._wait(server_id, currect_status)
694 fd1f1d96 Stavros Sachtouris
695 5a673575 Stavros Sachtouris
    def main(self, server_id, currect_status='BUILD'):
696 5a673575 Stavros Sachtouris
        super(self.__class__, self)._run()
697 5a673575 Stavros Sachtouris
        self._run(server_id=server_id, currect_status=currect_status)
698 5a673575 Stavros Sachtouris
699 fd1f1d96 Stavros Sachtouris
700 d486baec Stavros Sachtouris
@command(flavor_cmds)
701 545c6c29 Stavros Sachtouris
class flavor_list(_init_cyclades, _optional_json):
702 bd40efdf Stavros Sachtouris
    """List available hardware flavors"""
703 7493ccb6 Stavros Sachtouris
704 93914390 Stavros Sachtouris
    arguments = dict(
705 f40f0cb7 Stavros Sachtouris
        detail=FlagArgument('show detailed output', ('-l', '--details')),
706 f40f0cb7 Stavros Sachtouris
        limit=IntArgument('limit # of listed flavors', ('-n', '--number')),
707 bd40efdf Stavros Sachtouris
        more=FlagArgument(
708 de73876b Stavros Sachtouris
            'output results in pages (-n to set items per page, default 10)',
709 ed9af02c Stavros Sachtouris
            '--more'),
710 ed9af02c Stavros Sachtouris
        enum=FlagArgument('Enumerate results', '--enumerate')
711 93914390 Stavros Sachtouris
    )
712 7493ccb6 Stavros Sachtouris
713 5a673575 Stavros Sachtouris
    @errors.generic.all
714 5a673575 Stavros Sachtouris
    @errors.cyclades.connection
715 5a673575 Stavros Sachtouris
    def _run(self):
716 5a673575 Stavros Sachtouris
        flavors = self.client.list_flavors(self['detail'])
717 7ba195e5 Stavros Sachtouris
        if not (self['detail'] or self['json_output']):
718 7ba195e5 Stavros Sachtouris
            remove_from_items(flavors, 'links')
719 5a673575 Stavros Sachtouris
        pg_size = 10 if self['more'] and not self['limit'] else self['limit']
720 545c6c29 Stavros Sachtouris
        self._print(
721 ed9af02c Stavros Sachtouris
            flavors,
722 ed9af02c Stavros Sachtouris
            with_redundancy=self['detail'],
723 ed9af02c Stavros Sachtouris
            page_size=pg_size,
724 ed9af02c Stavros Sachtouris
            with_enumeration=self['enum'])
725 5a673575 Stavros Sachtouris
726 7493ccb6 Stavros Sachtouris
    def main(self):
727 5a673575 Stavros Sachtouris
        super(self.__class__, self)._run()
728 5a673575 Stavros Sachtouris
        self._run()
729 7493ccb6 Stavros Sachtouris
730 234954d1 Stavros Sachtouris
731 d486baec Stavros Sachtouris
@command(flavor_cmds)
732 545c6c29 Stavros Sachtouris
class flavor_info(_init_cyclades, _optional_json):
733 769dbf53 Stavros Sachtouris
    """Detailed information on a hardware flavor
734 ddc0b290 Stavros Sachtouris
    To get a list of available flavors and flavor ids, try /flavor list
735 ddc0b290 Stavros Sachtouris
    """
736 7493ccb6 Stavros Sachtouris
737 5a673575 Stavros Sachtouris
    @errors.generic.all
738 5a673575 Stavros Sachtouris
    @errors.cyclades.connection
739 5a673575 Stavros Sachtouris
    @errors.cyclades.flavor_id
740 5a673575 Stavros Sachtouris
    def _run(self, flavor_id):
741 bcef3ac9 Stavros Sachtouris
        self._print(
742 bcef3ac9 Stavros Sachtouris
            self.client.get_flavor_details(int(flavor_id)), print_dict)
743 7493ccb6 Stavros Sachtouris
744 5a673575 Stavros Sachtouris
    def main(self, flavor_id):
745 5a673575 Stavros Sachtouris
        super(self.__class__, self)._run()
746 5a673575 Stavros Sachtouris
        self._run(flavor_id=flavor_id)
747 5a673575 Stavros Sachtouris
748 234954d1 Stavros Sachtouris
749 d486baec Stavros Sachtouris
@command(network_cmds)
750 545c6c29 Stavros Sachtouris
class network_info(_init_cyclades, _optional_json):
751 ddc0b290 Stavros Sachtouris
    """Detailed information on a network
752 ddc0b290 Stavros Sachtouris
    To get a list of available networks and network ids, try /network list
753 ddc0b290 Stavros Sachtouris
    """
754 c17b8bc0 Stavros Sachtouris
755 5a673575 Stavros Sachtouris
    @errors.generic.all
756 5a673575 Stavros Sachtouris
    @errors.cyclades.connection
757 5a673575 Stavros Sachtouris
    @errors.cyclades.network_id
758 5a673575 Stavros Sachtouris
    def _run(self, network_id):
759 5a673575 Stavros Sachtouris
        network = self.client.get_network_details(int(network_id))
760 545c6c29 Stavros Sachtouris
        self._print(network, print_dict, exclude=('id'))
761 5a673575 Stavros Sachtouris
762 c17b8bc0 Stavros Sachtouris
    def main(self, network_id):
763 5a673575 Stavros Sachtouris
        super(self.__class__, self)._run()
764 5a673575 Stavros Sachtouris
        self._run(network_id=network_id)
765 c17b8bc0 Stavros Sachtouris
766 c17b8bc0 Stavros Sachtouris
767 c17b8bc0 Stavros Sachtouris
@command(network_cmds)
768 545c6c29 Stavros Sachtouris
class network_list(_init_cyclades, _optional_json):
769 7493ccb6 Stavros Sachtouris
    """List networks"""
770 7493ccb6 Stavros Sachtouris
771 93914390 Stavros Sachtouris
    arguments = dict(
772 f40f0cb7 Stavros Sachtouris
        detail=FlagArgument('show detailed output', ('-l', '--details')),
773 f40f0cb7 Stavros Sachtouris
        limit=IntArgument('limit # of listed networks', ('-n', '--number')),
774 ddc0b290 Stavros Sachtouris
        more=FlagArgument(
775 ddc0b290 Stavros Sachtouris
            'output results in pages (-n to set items per page, default 10)',
776 ed9af02c Stavros Sachtouris
            '--more'),
777 ed9af02c Stavros Sachtouris
        enum=FlagArgument('Enumerate results', '--enumerate')
778 93914390 Stavros Sachtouris
    )
779 7493ccb6 Stavros Sachtouris
780 5a673575 Stavros Sachtouris
    @errors.generic.all
781 5a673575 Stavros Sachtouris
    @errors.cyclades.connection
782 5a673575 Stavros Sachtouris
    def _run(self):
783 5a673575 Stavros Sachtouris
        networks = self.client.list_networks(self['detail'])
784 7ba195e5 Stavros Sachtouris
        if not (self['detail'] or self['json_output']):
785 7ba195e5 Stavros Sachtouris
            remove_from_items(networks, 'links')
786 545c6c29 Stavros Sachtouris
        kwargs = dict(with_enumeration=self['enum'])
787 ddc0b290 Stavros Sachtouris
        if self['more']:
788 545c6c29 Stavros Sachtouris
            kwargs['page_size'] = self['limit'] or 10
789 0e806947 Stavros Sachtouris
        elif self['limit']:
790 545c6c29 Stavros Sachtouris
            networks = networks[:self['limit']]
791 545c6c29 Stavros Sachtouris
        self._print(networks, **kwargs)
792 7493ccb6 Stavros Sachtouris
793 5a673575 Stavros Sachtouris
    def main(self):
794 5a673575 Stavros Sachtouris
        super(self.__class__, self)._run()
795 5a673575 Stavros Sachtouris
        self._run()
796 5a673575 Stavros Sachtouris
797 234954d1 Stavros Sachtouris
798 d486baec Stavros Sachtouris
@command(network_cmds)
799 77df3d4a Stavros Sachtouris
class network_create(_init_cyclades, _optional_json, _network_wait):
800 0e806947 Stavros Sachtouris
    """Create an (unconnected) network"""
801 7493ccb6 Stavros Sachtouris
802 93914390 Stavros Sachtouris
    arguments = dict(
803 0e806947 Stavros Sachtouris
        cidr=ValueArgument('explicitly set cidr', '--with-cidr'),
804 0e806947 Stavros Sachtouris
        gateway=ValueArgument('explicitly set gateway', '--with-gateway'),
805 9d1db11e Stavros Sachtouris
        dhcp=FlagArgument('Use dhcp (default: off)', '--with-dhcp'),
806 f6f81cd3 Stavros Sachtouris
        type=ValueArgument(
807 f6f81cd3 Stavros Sachtouris
            'Valid network types are '
808 f6f81cd3 Stavros Sachtouris
            'CUSTOM, IP_LESS_ROUTED, MAC_FILTERED (default), PHYSICAL_VLAN',
809 f6f81cd3 Stavros Sachtouris
            '--with-type',
810 77df3d4a Stavros Sachtouris
            default='MAC_FILTERED'),
811 77df3d4a Stavros Sachtouris
        wait=FlagArgument('Wait network to build', ('-w', '--wait'))
812 93914390 Stavros Sachtouris
    )
813 7493ccb6 Stavros Sachtouris
814 5a673575 Stavros Sachtouris
    @errors.generic.all
815 5a673575 Stavros Sachtouris
    @errors.cyclades.connection
816 5a673575 Stavros Sachtouris
    @errors.cyclades.network_max
817 5a673575 Stavros Sachtouris
    def _run(self, name):
818 77df3d4a Stavros Sachtouris
        r = self.client.create_network(
819 de73876b Stavros Sachtouris
            name,
820 5a673575 Stavros Sachtouris
            cidr=self['cidr'],
821 5a673575 Stavros Sachtouris
            gateway=self['gateway'],
822 5a673575 Stavros Sachtouris
            dhcp=self['dhcp'],
823 77df3d4a Stavros Sachtouris
            type=self['type'])
824 77df3d4a Stavros Sachtouris
        self._print(r, print_dict)
825 77df3d4a Stavros Sachtouris
826 77df3d4a Stavros Sachtouris
        if self['wait']:
827 77df3d4a Stavros Sachtouris
            self._wait(r['id'], 'PENDING')
828 5a673575 Stavros Sachtouris
829 7493ccb6 Stavros Sachtouris
    def main(self, name):
830 5a673575 Stavros Sachtouris
        super(self.__class__, self)._run()
831 5a673575 Stavros Sachtouris
        self._run(name)
832 7493ccb6 Stavros Sachtouris
833 234954d1 Stavros Sachtouris
834 d486baec Stavros Sachtouris
@command(network_cmds)
835 1b73b4c1 Stavros Sachtouris
class network_rename(_init_cyclades, _optional_output_cmd):
836 0e806947 Stavros Sachtouris
    """Set the name of a network"""
837 7493ccb6 Stavros Sachtouris
838 5a673575 Stavros Sachtouris
    @errors.generic.all
839 5a673575 Stavros Sachtouris
    @errors.cyclades.connection
840 5a673575 Stavros Sachtouris
    @errors.cyclades.network_id
841 5a673575 Stavros Sachtouris
    def _run(self, network_id, new_name):
842 1b73b4c1 Stavros Sachtouris
        self._optional_output(
843 1b73b4c1 Stavros Sachtouris
                self.client.update_network_name(int(network_id), new_name))
844 5a673575 Stavros Sachtouris
845 7493ccb6 Stavros Sachtouris
    def main(self, network_id, new_name):
846 5a673575 Stavros Sachtouris
        super(self.__class__, self)._run()
847 5a673575 Stavros Sachtouris
        self._run(network_id=network_id, new_name=new_name)
848 7493ccb6 Stavros Sachtouris
849 234954d1 Stavros Sachtouris
850 d486baec Stavros Sachtouris
@command(network_cmds)
851 77df3d4a Stavros Sachtouris
class network_delete(_init_cyclades, _optional_output_cmd, _network_wait):
852 7493ccb6 Stavros Sachtouris
    """Delete a network"""
853 7493ccb6 Stavros Sachtouris
854 77df3d4a Stavros Sachtouris
    arguments = dict(
855 77df3d4a Stavros Sachtouris
        wait=FlagArgument('Wait network to build', ('-w', '--wait'))
856 77df3d4a Stavros Sachtouris
    )
857 77df3d4a Stavros Sachtouris
858 5a673575 Stavros Sachtouris
    @errors.generic.all
859 5a673575 Stavros Sachtouris
    @errors.cyclades.connection
860 5a673575 Stavros Sachtouris
    @errors.cyclades.network_id
861 5a673575 Stavros Sachtouris
    @errors.cyclades.network_in_use
862 5a673575 Stavros Sachtouris
    def _run(self, network_id):
863 77df3d4a Stavros Sachtouris
        status = 'DELETED'
864 77df3d4a Stavros Sachtouris
        if self['wait']:
865 77df3d4a Stavros Sachtouris
            r = self.client.get_network_details(network_id)
866 77df3d4a Stavros Sachtouris
            status = r['status']
867 77df3d4a Stavros Sachtouris
            if status in ('DELETED', ):
868 77df3d4a Stavros Sachtouris
                return
869 77df3d4a Stavros Sachtouris
870 77df3d4a Stavros Sachtouris
        r = self.client.delete_network(int(network_id))
871 77df3d4a Stavros Sachtouris
        self._optional_output(r)
872 77df3d4a Stavros Sachtouris
873 77df3d4a Stavros Sachtouris
        if self['wait']:
874 77df3d4a Stavros Sachtouris
            self._wait(network_id, status)
875 5a673575 Stavros Sachtouris
876 7493ccb6 Stavros Sachtouris
    def main(self, network_id):
877 5a673575 Stavros Sachtouris
        super(self.__class__, self)._run()
878 5a673575 Stavros Sachtouris
        self._run(network_id=network_id)
879 7493ccb6 Stavros Sachtouris
880 234954d1 Stavros Sachtouris
881 d486baec Stavros Sachtouris
@command(network_cmds)
882 1b73b4c1 Stavros Sachtouris
class network_connect(_init_cyclades, _optional_output_cmd):
883 7493ccb6 Stavros Sachtouris
    """Connect a server to a network"""
884 7493ccb6 Stavros Sachtouris
885 5a673575 Stavros Sachtouris
    @errors.generic.all
886 5a673575 Stavros Sachtouris
    @errors.cyclades.connection
887 5a673575 Stavros Sachtouris
    @errors.cyclades.server_id
888 5a673575 Stavros Sachtouris
    @errors.cyclades.network_id
889 5a673575 Stavros Sachtouris
    def _run(self, server_id, network_id):
890 1b73b4c1 Stavros Sachtouris
        self._optional_output(
891 1b73b4c1 Stavros Sachtouris
                self.client.connect_server(int(server_id), int(network_id)))
892 5a673575 Stavros Sachtouris
893 7493ccb6 Stavros Sachtouris
    def main(self, server_id, network_id):
894 5a673575 Stavros Sachtouris
        super(self.__class__, self)._run()
895 5a673575 Stavros Sachtouris
        self._run(server_id=server_id, network_id=network_id)
896 7493ccb6 Stavros Sachtouris
897 234954d1 Stavros Sachtouris
898 d486baec Stavros Sachtouris
@command(network_cmds)
899 7493ccb6 Stavros Sachtouris
class network_disconnect(_init_cyclades):
900 0e806947 Stavros Sachtouris
    """Disconnect a nic that connects a server to a network
901 0e806947 Stavros Sachtouris
    Nic ids are listed as "attachments" in detailed network information
902 439826ec Stavros Sachtouris
    To get detailed network information: /network info <network id>
903 0e806947 Stavros Sachtouris
    """
904 7493ccb6 Stavros Sachtouris
905 5a673575 Stavros Sachtouris
    @errors.cyclades.nic_format
906 5a673575 Stavros Sachtouris
    def _server_id_from_nic(self, nic_id):
907 5a673575 Stavros Sachtouris
        return nic_id.split('-')[1]
908 5a673575 Stavros Sachtouris
909 5a673575 Stavros Sachtouris
    @errors.generic.all
910 5a673575 Stavros Sachtouris
    @errors.cyclades.connection
911 5a673575 Stavros Sachtouris
    @errors.cyclades.server_id
912 5a673575 Stavros Sachtouris
    @errors.cyclades.nic_id
913 5a673575 Stavros Sachtouris
    def _run(self, nic_id, server_id):
914 1b73b4c1 Stavros Sachtouris
        num_of_disconnected = self.client.disconnect_server(server_id, nic_id)
915 1b73b4c1 Stavros Sachtouris
        if not num_of_disconnected:
916 5a673575 Stavros Sachtouris
            raise ClientError(
917 5a673575 Stavros Sachtouris
                'Network Interface %s not found on server %s' % (
918 5a673575 Stavros Sachtouris
                    nic_id,
919 5a673575 Stavros Sachtouris
                    server_id),
920 5a673575 Stavros Sachtouris
                status=404)
921 1b73b4c1 Stavros Sachtouris
        print('Disconnected %s connections' % num_of_disconnected)
922 5a673575 Stavros Sachtouris
923 7493ccb6 Stavros Sachtouris
    def main(self, nic_id):
924 5a673575 Stavros Sachtouris
        super(self.__class__, self)._run()
925 5a673575 Stavros Sachtouris
        server_id = self._server_id_from_nic(nic_id=nic_id)
926 5a673575 Stavros Sachtouris
        self._run(nic_id=nic_id, server_id=server_id)
927 9b47150e Stavros Sachtouris
928 9b47150e Stavros Sachtouris
929 7b2e4bf1 Stavros Sachtouris
@command(network_cmds)
930 7b2e4bf1 Stavros Sachtouris
class network_wait(_init_cyclades, _network_wait):
931 7b2e4bf1 Stavros Sachtouris
    """Wait for server to finish [PENDING, ACTIVE, DELETED]"""
932 7b2e4bf1 Stavros Sachtouris
933 7b2e4bf1 Stavros Sachtouris
    @errors.generic.all
934 7b2e4bf1 Stavros Sachtouris
    @errors.cyclades.connection
935 7b2e4bf1 Stavros Sachtouris
    @errors.cyclades.network_id
936 7b2e4bf1 Stavros Sachtouris
    def _run(self, network_id, currect_status):
937 7b2e4bf1 Stavros Sachtouris
        self._wait(network_id, currect_status)
938 7b2e4bf1 Stavros Sachtouris
939 7b2e4bf1 Stavros Sachtouris
    def main(self, network_id, currect_status='PENDING'):
940 7b2e4bf1 Stavros Sachtouris
        super(self.__class__, self)._run()
941 7b2e4bf1 Stavros Sachtouris
        self._run(network_id=network_id, currect_status=currect_status)
942 7b2e4bf1 Stavros Sachtouris
943 7b2e4bf1 Stavros Sachtouris
944 8be50626 Stavros Sachtouris
@command(server_cmds)
945 8be50626 Stavros Sachtouris
class server_ip(_init_cyclades):
946 8be50626 Stavros Sachtouris
    """Manage floating IPs for the servers"""
947 8be50626 Stavros Sachtouris
948 8be50626 Stavros Sachtouris
949 8be50626 Stavros Sachtouris
@command(server_cmds)
950 8be50626 Stavros Sachtouris
class server_ip_pools(_init_cyclades, _optional_json):
951 9b47150e Stavros Sachtouris
    """List all floating pools of floating ips"""
952 9b47150e Stavros Sachtouris
953 9b47150e Stavros Sachtouris
    @errors.generic.all
954 9b47150e Stavros Sachtouris
    @errors.cyclades.connection
955 9b47150e Stavros Sachtouris
    def _run(self):
956 9b47150e Stavros Sachtouris
        r = self.client.get_floating_ip_pools()
957 9b47150e Stavros Sachtouris
        self._print(r if self['json_output'] else r['floating_ip_pools'])
958 9b47150e Stavros Sachtouris
959 9b47150e Stavros Sachtouris
    def main(self):
960 9b47150e Stavros Sachtouris
        super(self.__class__, self)._run()
961 9b47150e Stavros Sachtouris
        self._run()
962 9b47150e Stavros Sachtouris
963 9b47150e Stavros Sachtouris
964 8be50626 Stavros Sachtouris
@command(server_cmds)
965 8be50626 Stavros Sachtouris
class server_ip_list(_init_cyclades, _optional_json):
966 9b47150e Stavros Sachtouris
    """List all floating ips"""
967 9b47150e Stavros Sachtouris
968 9b47150e Stavros Sachtouris
    @errors.generic.all
969 9b47150e Stavros Sachtouris
    @errors.cyclades.connection
970 9b47150e Stavros Sachtouris
    def _run(self):
971 9b47150e Stavros Sachtouris
        r = self.client.get_floating_ips()
972 9b47150e Stavros Sachtouris
        self._print(r if self['json_output'] else r['floating_ips'])
973 9b47150e Stavros Sachtouris
974 9b47150e Stavros Sachtouris
    def main(self):
975 9b47150e Stavros Sachtouris
        super(self.__class__, self)._run()
976 9b47150e Stavros Sachtouris
        self._run()
977 9b47150e Stavros Sachtouris
978 9b47150e Stavros Sachtouris
979 8be50626 Stavros Sachtouris
@command(server_cmds)
980 8be50626 Stavros Sachtouris
class server_ip_info(_init_cyclades, _optional_json):
981 9b47150e Stavros Sachtouris
    """A floating IPs' details"""
982 9b47150e Stavros Sachtouris
983 9b47150e Stavros Sachtouris
    @errors.generic.all
984 9b47150e Stavros Sachtouris
    @errors.cyclades.connection
985 9b47150e Stavros Sachtouris
    def _run(self, ip):
986 9b47150e Stavros Sachtouris
        self._print(self.client.get_floating_ip(ip), print_dict)
987 9b47150e Stavros Sachtouris
988 9b47150e Stavros Sachtouris
    def main(self, ip):
989 9b47150e Stavros Sachtouris
        super(self.__class__, self)._run()
990 9b47150e Stavros Sachtouris
        self._run(ip=ip)
991 9b47150e Stavros Sachtouris
992 9b47150e Stavros Sachtouris
993 8be50626 Stavros Sachtouris
@command(server_cmds)
994 8be50626 Stavros Sachtouris
class server_ip_create(_init_cyclades, _optional_json):
995 9b47150e Stavros Sachtouris
    """Create a new floating IP"""
996 9b47150e Stavros Sachtouris
997 9b47150e Stavros Sachtouris
    arguments = dict(
998 9b47150e Stavros Sachtouris
        pool=ValueArgument('Source IP pool', ('--pool'), None)
999 9b47150e Stavros Sachtouris
    )
1000 9b47150e Stavros Sachtouris
1001 9b47150e Stavros Sachtouris
    @errors.generic.all
1002 9b47150e Stavros Sachtouris
    @errors.cyclades.connection
1003 9b47150e Stavros Sachtouris
    def _run(self, ip=None):
1004 2e6e03da Stavros Sachtouris
        self._print([self.client.alloc_floating_ip(self['pool'], ip)])
1005 9b47150e Stavros Sachtouris
1006 9b47150e Stavros Sachtouris
    def main(self, requested_address=None):
1007 9b47150e Stavros Sachtouris
        super(self.__class__, self)._run()
1008 9b47150e Stavros Sachtouris
        self._run(ip=requested_address)
1009 9b47150e Stavros Sachtouris
1010 9b47150e Stavros Sachtouris
1011 8be50626 Stavros Sachtouris
@command(server_cmds)
1012 8be50626 Stavros Sachtouris
class server_ip_delete(_init_cyclades, _optional_output_cmd):
1013 9b47150e Stavros Sachtouris
    """Delete a floating ip"""
1014 9b47150e Stavros Sachtouris
1015 9b47150e Stavros Sachtouris
    @errors.generic.all
1016 9b47150e Stavros Sachtouris
    @errors.cyclades.connection
1017 9b47150e Stavros Sachtouris
    def _run(self, ip):
1018 9b47150e Stavros Sachtouris
        self._optional_output(self.client.delete_floating_ip(ip))
1019 9b47150e Stavros Sachtouris
1020 9b47150e Stavros Sachtouris
    def main(self, ip):
1021 9b47150e Stavros Sachtouris
        super(self.__class__, self)._run()
1022 9b47150e Stavros Sachtouris
        self._run(ip=ip)
1023 9b47150e Stavros Sachtouris
1024 9b47150e Stavros Sachtouris
1025 9b47150e Stavros Sachtouris
@command(server_cmds)
1026 9b47150e Stavros Sachtouris
class server_ip_attach(_init_cyclades, _optional_output_cmd):
1027 9b47150e Stavros Sachtouris
    """Attach a floating ip to a server with server_id
1028 9b47150e Stavros Sachtouris
    """
1029 9b47150e Stavros Sachtouris
1030 9b47150e Stavros Sachtouris
    @errors.generic.all
1031 9b47150e Stavros Sachtouris
    @errors.cyclades.connection
1032 9b47150e Stavros Sachtouris
    @errors.cyclades.server_id
1033 9b47150e Stavros Sachtouris
    def _run(self, server_id, ip):
1034 9b47150e Stavros Sachtouris
        self._optional_output(self.client.attach_floating_ip(server_id, ip))
1035 9b47150e Stavros Sachtouris
1036 9b47150e Stavros Sachtouris
    def main(self, server_id, ip):
1037 9b47150e Stavros Sachtouris
        super(self.__class__, self)._run()
1038 9b47150e Stavros Sachtouris
        self._run(server_id=server_id, ip=ip)
1039 9b47150e Stavros Sachtouris
1040 9b47150e Stavros Sachtouris
1041 9b47150e Stavros Sachtouris
@command(server_cmds)
1042 2e6e03da Stavros Sachtouris
class server_ip_detach(_init_cyclades, _optional_output_cmd):
1043 8be50626 Stavros Sachtouris
    """Detach floating IP from server
1044 9b47150e Stavros Sachtouris
    """
1045 9b47150e Stavros Sachtouris
1046 9b47150e Stavros Sachtouris
    @errors.generic.all
1047 9b47150e Stavros Sachtouris
    @errors.cyclades.connection
1048 9b47150e Stavros Sachtouris
    @errors.cyclades.server_id
1049 9b47150e Stavros Sachtouris
    def _run(self, server_id, ip):
1050 9b47150e Stavros Sachtouris
        self._optional_output(self.client.detach_floating_ip(server_id, ip))
1051 9b47150e Stavros Sachtouris
1052 9b47150e Stavros Sachtouris
    def main(self, server_id, ip):
1053 9b47150e Stavros Sachtouris
        super(self.__class__, self)._run()
1054 9b47150e Stavros Sachtouris
        self._run(server_id=server_id, ip=ip)