Statistics
| Branch: | Tag: | Revision:

root / kamaki / cli / commands / cyclades.py @ 89ea97e1

History | View | Annotate | Download (33.5 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 89ea97e1 Stavros Sachtouris
    def _filtered_by_image(self, servers):
201 89ea97e1 Stavros Sachtouris
        iid = self['image_id']
202 89ea97e1 Stavros Sachtouris
        new_servers = []
203 89ea97e1 Stavros Sachtouris
        for srv in servers:
204 89ea97e1 Stavros Sachtouris
            if srv['image']['id'] == iid:
205 89ea97e1 Stavros Sachtouris
                new_servers.append(srv)
206 89ea97e1 Stavros Sachtouris
        return new_servers
207 89ea97e1 Stavros Sachtouris
208 89ea97e1 Stavros Sachtouris
    def _filtered_by_flavor(self, servers):
209 89ea97e1 Stavros Sachtouris
        fid = self['flavor_id']
210 89ea97e1 Stavros Sachtouris
        new_servers = []
211 89ea97e1 Stavros Sachtouris
        for srv in servers:
212 89ea97e1 Stavros Sachtouris
            if '%s' % srv['flavor']['id'] == '%s' % fid:
213 89ea97e1 Stavros Sachtouris
                new_servers.append(srv)
214 89ea97e1 Stavros Sachtouris
        return new_servers
215 89ea97e1 Stavros Sachtouris
216 89ea97e1 Stavros Sachtouris
    def _filtered_by_metadata(self, servers):
217 89ea97e1 Stavros Sachtouris
        new_servers = []
218 89ea97e1 Stavros Sachtouris
        for srv in servers:
219 89ea97e1 Stavros Sachtouris
            if not 'metadata' in srv:
220 89ea97e1 Stavros Sachtouris
                continue
221 89ea97e1 Stavros Sachtouris
            meta = [dict(srv['metadata'])]
222 89ea97e1 Stavros Sachtouris
            if self['meta']:
223 89ea97e1 Stavros Sachtouris
                meta = filter_dicts_by_dict(meta, self['meta'])
224 89ea97e1 Stavros Sachtouris
            if meta and self['meta_like']:
225 89ea97e1 Stavros Sachtouris
                meta = filter_dicts_by_dict(
226 89ea97e1 Stavros Sachtouris
                    meta, self['meta_like'], exact_match=False)
227 89ea97e1 Stavros Sachtouris
            if meta:
228 89ea97e1 Stavros Sachtouris
                new_servers.append(srv)
229 89ea97e1 Stavros Sachtouris
        return new_servers
230 89ea97e1 Stavros Sachtouris
231 b04288f7 Stavros Sachtouris
    @errors.generic.all
232 b04288f7 Stavros Sachtouris
    @errors.cyclades.connection
233 b04288f7 Stavros Sachtouris
    @errors.cyclades.date
234 b04288f7 Stavros Sachtouris
    def _run(self):
235 89ea97e1 Stavros Sachtouris
        withimage = bool(self['image_id'])
236 89ea97e1 Stavros Sachtouris
        withflavor = bool(self['flavor_id'])
237 89ea97e1 Stavros Sachtouris
        withmeta = bool(self['meta'] or self['meta_like'])
238 89ea97e1 Stavros Sachtouris
        detail = self['detail'] or withimage or withflavor or withmeta
239 89ea97e1 Stavros Sachtouris
        servers = self.client.list_servers(detail, self['since'])
240 89ea97e1 Stavros Sachtouris
241 89ea97e1 Stavros Sachtouris
        servers = self._filtered_by_name(servers)
242 89ea97e1 Stavros Sachtouris
        if withimage:
243 89ea97e1 Stavros Sachtouris
            servers = self._filtered_by_image(servers)
244 89ea97e1 Stavros Sachtouris
        if withflavor:
245 89ea97e1 Stavros Sachtouris
            servers = self._filtered_by_flavor(servers)
246 89ea97e1 Stavros Sachtouris
        if withmeta:
247 89ea97e1 Stavros Sachtouris
            servers = self._filtered_by_metadata(servers)
248 89ea97e1 Stavros Sachtouris
249 7ba195e5 Stavros Sachtouris
        if not (self['detail'] or self['json_output']):
250 7ba195e5 Stavros Sachtouris
            remove_from_items(servers, 'links')
251 89ea97e1 Stavros Sachtouris
        #if self['detail'] and not self['json_output']:
252 89ea97e1 Stavros Sachtouris
        #    servers = self._add_owner_name(servers)
253 89ea97e1 Stavros Sachtouris
        if detail and not self['detail']:
254 89ea97e1 Stavros Sachtouris
            for srv in servers:
255 89ea97e1 Stavros Sachtouris
                for key in set(srv).difference(self.PERMANENTS):
256 89ea97e1 Stavros Sachtouris
                    srv.pop(key)
257 545c6c29 Stavros Sachtouris
        kwargs = dict(with_enumeration=self['enum'])
258 a4d0d88a Stavros Sachtouris
        if self['more']:
259 545c6c29 Stavros Sachtouris
            kwargs['page_size'] = self['limit'] if self['limit'] else 10
260 545c6c29 Stavros Sachtouris
        elif self['limit']:
261 545c6c29 Stavros Sachtouris
            servers = servers[:self['limit']]
262 545c6c29 Stavros Sachtouris
        self._print(servers, **kwargs)
263 7493ccb6 Stavros Sachtouris
264 b04288f7 Stavros Sachtouris
    def main(self):
265 b04288f7 Stavros Sachtouris
        super(self.__class__, self)._run()
266 b04288f7 Stavros Sachtouris
        self._run()
267 b04288f7 Stavros Sachtouris
268 234954d1 Stavros Sachtouris
269 d486baec Stavros Sachtouris
@command(server_cmds)
270 545c6c29 Stavros Sachtouris
class server_info(_init_cyclades, _optional_json):
271 67469d65 Stavros Sachtouris
    """Detailed information on a Virtual Machine
272 67469d65 Stavros Sachtouris
    Contains:
273 67469d65 Stavros Sachtouris
    - name, id, status, create/update dates
274 67469d65 Stavros Sachtouris
    - network interfaces
275 67469d65 Stavros Sachtouris
    - metadata (e.g. os, superuser) and diagnostics
276 67469d65 Stavros Sachtouris
    - hardware flavor and os image ids
277 67469d65 Stavros Sachtouris
    """
278 7493ccb6 Stavros Sachtouris
279 b04288f7 Stavros Sachtouris
    @errors.generic.all
280 b04288f7 Stavros Sachtouris
    @errors.cyclades.connection
281 5a673575 Stavros Sachtouris
    @errors.cyclades.server_id
282 b04288f7 Stavros Sachtouris
    def _run(self, server_id):
283 bcef3ac9 Stavros Sachtouris
        self._print(self.client.get_server_details(server_id), print_dict)
284 7493ccb6 Stavros Sachtouris
285 b04288f7 Stavros Sachtouris
    def main(self, server_id):
286 b04288f7 Stavros Sachtouris
        super(self.__class__, self)._run()
287 b04288f7 Stavros Sachtouris
        self._run(server_id=server_id)
288 b04288f7 Stavros Sachtouris
289 234954d1 Stavros Sachtouris
290 57d622b6 Stavros Sachtouris
class PersonalityArgument(KeyValueArgument):
291 234954d1 Stavros Sachtouris
    @property
292 f3e94e06 Stavros Sachtouris
    def value(self):
293 57d622b6 Stavros Sachtouris
        return self._value if hasattr(self, '_value') else []
294 234954d1 Stavros Sachtouris
295 234954d1 Stavros Sachtouris
    @value.setter
296 f3e94e06 Stavros Sachtouris
    def value(self, newvalue):
297 f3e94e06 Stavros Sachtouris
        if newvalue == self.default:
298 f3e94e06 Stavros Sachtouris
            return self.value
299 57d622b6 Stavros Sachtouris
        self._value = []
300 57d622b6 Stavros Sachtouris
        for i, terms in enumerate(newvalue):
301 57d622b6 Stavros Sachtouris
            termlist = terms.split(',')
302 57d622b6 Stavros Sachtouris
            if len(termlist) > 5:
303 de73876b Stavros Sachtouris
                msg = 'Wrong number of terms (should be 1 to 5)'
304 de73876b Stavros Sachtouris
                raiseCLIError(CLISyntaxError(msg), details=howto_personality)
305 57d622b6 Stavros Sachtouris
            path = termlist[0]
306 57d622b6 Stavros Sachtouris
            if not exists(path):
307 de73876b Stavros Sachtouris
                raiseCLIError(
308 de73876b Stavros Sachtouris
                    None,
309 8194b51b Stavros Sachtouris
                    '--personality: File %s does not exist' % path,
310 8194b51b Stavros Sachtouris
                    importance=1,
311 8194b51b Stavros Sachtouris
                    details=howto_personality)
312 57d622b6 Stavros Sachtouris
            self._value.append(dict(path=path))
313 57d622b6 Stavros Sachtouris
            with open(path) as f:
314 57d622b6 Stavros Sachtouris
                self._value[i]['contents'] = b64encode(f.read())
315 57d622b6 Stavros Sachtouris
            try:
316 57d622b6 Stavros Sachtouris
                self._value[i]['path'] = termlist[1]
317 57d622b6 Stavros Sachtouris
                self._value[i]['owner'] = termlist[2]
318 57d622b6 Stavros Sachtouris
                self._value[i]['group'] = termlist[3]
319 57d622b6 Stavros Sachtouris
                self._value[i]['mode'] = termlist[4]
320 57d622b6 Stavros Sachtouris
            except IndexError:
321 57d622b6 Stavros Sachtouris
                pass
322 f3e94e06 Stavros Sachtouris
323 234954d1 Stavros Sachtouris
324 d486baec Stavros Sachtouris
@command(server_cmds)
325 60c42f9f Stavros Sachtouris
class server_create(_init_cyclades, _optional_json, _server_wait):
326 8194b51b Stavros Sachtouris
    """Create a server (aka Virtual Machine)
327 8194b51b Stavros Sachtouris
    Parameters:
328 439826ec Stavros Sachtouris
    - name: (single quoted text)
329 439826ec Stavros Sachtouris
    - flavor id: Hardware flavor. Pick one from: /flavor list
330 439826ec Stavros Sachtouris
    - image id: OS images. Pick one from: /image list
331 8194b51b Stavros Sachtouris
    """
332 7493ccb6 Stavros Sachtouris
333 93914390 Stavros Sachtouris
    arguments = dict(
334 93914390 Stavros Sachtouris
        personality=PersonalityArgument(
335 60c42f9f Stavros Sachtouris
            (80 * ' ').join(howto_personality), ('-p', '--personality')),
336 60c42f9f Stavros Sachtouris
        wait=FlagArgument('Wait server to build', ('-w', '--wait'))
337 93914390 Stavros Sachtouris
    )
338 f3e94e06 Stavros Sachtouris
339 b04288f7 Stavros Sachtouris
    @errors.generic.all
340 b04288f7 Stavros Sachtouris
    @errors.cyclades.connection
341 b04288f7 Stavros Sachtouris
    @errors.plankton.id
342 b04288f7 Stavros Sachtouris
    @errors.cyclades.flavor_id
343 b04288f7 Stavros Sachtouris
    def _run(self, name, flavor_id, image_id):
344 60c42f9f Stavros Sachtouris
        r = self.client.create_server(
345 60c42f9f Stavros Sachtouris
            name, int(flavor_id), image_id, self['personality'])
346 60c42f9f Stavros Sachtouris
        self._print(r, print_dict)
347 60c42f9f Stavros Sachtouris
        if self['wait']:
348 60c42f9f Stavros Sachtouris
            self._wait(r['id'], r['status'])
349 b04288f7 Stavros Sachtouris
350 7493ccb6 Stavros Sachtouris
    def main(self, name, flavor_id, image_id):
351 b04288f7 Stavros Sachtouris
        super(self.__class__, self)._run()
352 b04288f7 Stavros Sachtouris
        self._run(name=name, flavor_id=flavor_id, image_id=image_id)
353 7493ccb6 Stavros Sachtouris
354 234954d1 Stavros Sachtouris
355 d486baec Stavros Sachtouris
@command(server_cmds)
356 cd295a1d Stavros Sachtouris
class server_rename(_init_cyclades, _optional_output_cmd):
357 22b6f063 Stavros Sachtouris
    """Set/update a server (VM) name
358 5a673575 Stavros Sachtouris
    VM names are not unique, therefore multiple servers may share the same name
359 22b6f063 Stavros Sachtouris
    """
360 7493ccb6 Stavros Sachtouris
361 5a673575 Stavros Sachtouris
    @errors.generic.all
362 5a673575 Stavros Sachtouris
    @errors.cyclades.connection
363 5a673575 Stavros Sachtouris
    @errors.cyclades.server_id
364 5a673575 Stavros Sachtouris
    def _run(self, server_id, new_name):
365 cd295a1d Stavros Sachtouris
        self._optional_output(
366 cd295a1d Stavros Sachtouris
            self.client.update_server_name(int(server_id), new_name))
367 5a673575 Stavros Sachtouris
368 7493ccb6 Stavros Sachtouris
    def main(self, server_id, new_name):
369 5a673575 Stavros Sachtouris
        super(self.__class__, self)._run()
370 5a673575 Stavros Sachtouris
        self._run(server_id=server_id, new_name=new_name)
371 234954d1 Stavros Sachtouris
372 7493ccb6 Stavros Sachtouris
373 d486baec Stavros Sachtouris
@command(server_cmds)
374 60c42f9f Stavros Sachtouris
class server_delete(_init_cyclades, _optional_output_cmd, _server_wait):
375 22b6f063 Stavros Sachtouris
    """Delete a server (VM)"""
376 7493ccb6 Stavros Sachtouris
377 60c42f9f Stavros Sachtouris
    arguments = dict(
378 60c42f9f Stavros Sachtouris
        wait=FlagArgument('Wait server to be destroyed', ('-w', '--wait'))
379 60c42f9f Stavros Sachtouris
    )
380 60c42f9f Stavros Sachtouris
381 5a673575 Stavros Sachtouris
    @errors.generic.all
382 5a673575 Stavros Sachtouris
    @errors.cyclades.connection
383 5a673575 Stavros Sachtouris
    @errors.cyclades.server_id
384 5a673575 Stavros Sachtouris
    def _run(self, server_id):
385 60c42f9f Stavros Sachtouris
            status = 'DELETED'
386 60c42f9f Stavros Sachtouris
            if self['wait']:
387 60c42f9f Stavros Sachtouris
                details = self.client.get_server_details(server_id)
388 60c42f9f Stavros Sachtouris
                status = details['status']
389 60c42f9f Stavros Sachtouris
390 60c42f9f Stavros Sachtouris
            r = self.client.delete_server(int(server_id))
391 60c42f9f Stavros Sachtouris
            self._optional_output(r)
392 60c42f9f Stavros Sachtouris
393 60c42f9f Stavros Sachtouris
            if self['wait']:
394 60c42f9f Stavros Sachtouris
                self._wait(server_id, status)
395 5a673575 Stavros Sachtouris
396 5a673575 Stavros Sachtouris
    def main(self, server_id):
397 5a673575 Stavros Sachtouris
        super(self.__class__, self)._run()
398 5a673575 Stavros Sachtouris
        self._run(server_id=server_id)
399 234954d1 Stavros Sachtouris
400 7493ccb6 Stavros Sachtouris
401 d486baec Stavros Sachtouris
@command(server_cmds)
402 60c42f9f Stavros Sachtouris
class server_reboot(_init_cyclades, _optional_output_cmd, _server_wait):
403 22b6f063 Stavros Sachtouris
    """Reboot a server (VM)"""
404 18edacfe Stavros Sachtouris
405 93914390 Stavros Sachtouris
    arguments = dict(
406 60c42f9f Stavros Sachtouris
        hard=FlagArgument('perform a hard reboot', ('-f', '--force')),
407 60c42f9f Stavros Sachtouris
        wait=FlagArgument('Wait server to be destroyed', ('-w', '--wait'))
408 93914390 Stavros Sachtouris
    )
409 7493ccb6 Stavros Sachtouris
410 5a673575 Stavros Sachtouris
    @errors.generic.all
411 5a673575 Stavros Sachtouris
    @errors.cyclades.connection
412 5a673575 Stavros Sachtouris
    @errors.cyclades.server_id
413 5a673575 Stavros Sachtouris
    def _run(self, server_id):
414 60c42f9f Stavros Sachtouris
        r = self.client.reboot_server(int(server_id), self['hard'])
415 60c42f9f Stavros Sachtouris
        self._optional_output(r)
416 60c42f9f Stavros Sachtouris
417 60c42f9f Stavros Sachtouris
        if self['wait']:
418 60c42f9f Stavros Sachtouris
            self._wait(server_id, 'REBOOT')
419 5a673575 Stavros Sachtouris
420 7493ccb6 Stavros Sachtouris
    def main(self, server_id):
421 5a673575 Stavros Sachtouris
        super(self.__class__, self)._run()
422 5a673575 Stavros Sachtouris
        self._run(server_id=server_id)
423 234954d1 Stavros Sachtouris
424 7493ccb6 Stavros Sachtouris
425 d486baec Stavros Sachtouris
@command(server_cmds)
426 60c42f9f Stavros Sachtouris
class server_start(_init_cyclades, _optional_output_cmd, _server_wait):
427 22b6f063 Stavros Sachtouris
    """Start an existing server (VM)"""
428 7493ccb6 Stavros Sachtouris
429 60c42f9f Stavros Sachtouris
    arguments = dict(
430 60c42f9f Stavros Sachtouris
        wait=FlagArgument('Wait server to be destroyed', ('-w', '--wait'))
431 60c42f9f Stavros Sachtouris
    )
432 60c42f9f Stavros Sachtouris
433 5a673575 Stavros Sachtouris
    @errors.generic.all
434 5a673575 Stavros Sachtouris
    @errors.cyclades.connection
435 5a673575 Stavros Sachtouris
    @errors.cyclades.server_id
436 5a673575 Stavros Sachtouris
    def _run(self, server_id):
437 60c42f9f Stavros Sachtouris
        status = 'ACTIVE'
438 60c42f9f Stavros Sachtouris
        if self['wait']:
439 60c42f9f Stavros Sachtouris
            details = self.client.get_server_details(server_id)
440 60c42f9f Stavros Sachtouris
            status = details['status']
441 60c42f9f Stavros Sachtouris
            if status in ('ACTIVE', ):
442 60c42f9f Stavros Sachtouris
                return
443 60c42f9f Stavros Sachtouris
444 60c42f9f Stavros Sachtouris
        r = self.client.start_server(int(server_id))
445 60c42f9f Stavros Sachtouris
        self._optional_output(r)
446 60c42f9f Stavros Sachtouris
447 60c42f9f Stavros Sachtouris
        if self['wait']:
448 60c42f9f Stavros Sachtouris
            self._wait(server_id, status)
449 5a673575 Stavros Sachtouris
450 7493ccb6 Stavros Sachtouris
    def main(self, server_id):
451 5a673575 Stavros Sachtouris
        super(self.__class__, self)._run()
452 5a673575 Stavros Sachtouris
        self._run(server_id=server_id)
453 234954d1 Stavros Sachtouris
454 7493ccb6 Stavros Sachtouris
455 d486baec Stavros Sachtouris
@command(server_cmds)
456 60c42f9f Stavros Sachtouris
class server_shutdown(_init_cyclades, _optional_output_cmd, _server_wait):
457 22b6f063 Stavros Sachtouris
    """Shutdown an active server (VM)"""
458 7493ccb6 Stavros Sachtouris
459 60c42f9f Stavros Sachtouris
    arguments = dict(
460 60c42f9f Stavros Sachtouris
        wait=FlagArgument('Wait server to be destroyed', ('-w', '--wait'))
461 60c42f9f Stavros Sachtouris
    )
462 60c42f9f Stavros Sachtouris
463 5a673575 Stavros Sachtouris
    @errors.generic.all
464 5a673575 Stavros Sachtouris
    @errors.cyclades.connection
465 5a673575 Stavros Sachtouris
    @errors.cyclades.server_id
466 5a673575 Stavros Sachtouris
    def _run(self, server_id):
467 60c42f9f Stavros Sachtouris
        status = 'STOPPED'
468 60c42f9f Stavros Sachtouris
        if self['wait']:
469 60c42f9f Stavros Sachtouris
            details = self.client.get_server_details(server_id)
470 60c42f9f Stavros Sachtouris
            status = details['status']
471 60c42f9f Stavros Sachtouris
            if status in ('STOPPED', ):
472 60c42f9f Stavros Sachtouris
                return
473 60c42f9f Stavros Sachtouris
474 60c42f9f Stavros Sachtouris
        r = self.client.shutdown_server(int(server_id))
475 60c42f9f Stavros Sachtouris
        self._optional_output(r)
476 60c42f9f Stavros Sachtouris
477 60c42f9f Stavros Sachtouris
        if self['wait']:
478 60c42f9f Stavros Sachtouris
            self._wait(server_id, status)
479 5a673575 Stavros Sachtouris
480 7493ccb6 Stavros Sachtouris
    def main(self, server_id):
481 5a673575 Stavros Sachtouris
        super(self.__class__, self)._run()
482 5a673575 Stavros Sachtouris
        self._run(server_id=server_id)
483 234954d1 Stavros Sachtouris
484 7493ccb6 Stavros Sachtouris
485 d486baec Stavros Sachtouris
@command(server_cmds)
486 545c6c29 Stavros Sachtouris
class server_console(_init_cyclades, _optional_json):
487 22b6f063 Stavros Sachtouris
    """Get a VNC console to access an existing server (VM)
488 22b6f063 Stavros Sachtouris
    Console connection information provided (at least):
489 439826ec Stavros Sachtouris
    - host: (url or address) a VNC host
490 439826ec Stavros Sachtouris
    - port: (int) the gateway to enter VM on host
491 439826ec Stavros Sachtouris
    - password: for VNC authorization
492 22b6f063 Stavros Sachtouris
    """
493 7493ccb6 Stavros Sachtouris
494 5a673575 Stavros Sachtouris
    @errors.generic.all
495 5a673575 Stavros Sachtouris
    @errors.cyclades.connection
496 5a673575 Stavros Sachtouris
    @errors.cyclades.server_id
497 5a673575 Stavros Sachtouris
    def _run(self, server_id):
498 bcef3ac9 Stavros Sachtouris
        self._print(
499 bcef3ac9 Stavros Sachtouris
            self.client.get_server_console(int(server_id)), print_dict)
500 5a673575 Stavros Sachtouris
501 7493ccb6 Stavros Sachtouris
    def main(self, server_id):
502 5a673575 Stavros Sachtouris
        super(self.__class__, self)._run()
503 5a673575 Stavros Sachtouris
        self._run(server_id=server_id)
504 7493ccb6 Stavros Sachtouris
505 234954d1 Stavros Sachtouris
506 d486baec Stavros Sachtouris
@command(server_cmds)
507 eb8208a5 Stavros Sachtouris
class server_resize(_init_cyclades, _optional_output_cmd):
508 eb8208a5 Stavros Sachtouris
    """Set a different flavor for an existing server
509 eb8208a5 Stavros Sachtouris
    To get server ids and flavor ids:
510 fc7c3c4c Stavros Sachtouris
    /server list
511 fc7c3c4c Stavros Sachtouris
    /flavor list
512 eb8208a5 Stavros Sachtouris
    """
513 eb8208a5 Stavros Sachtouris
514 eb8208a5 Stavros Sachtouris
    @errors.generic.all
515 eb8208a5 Stavros Sachtouris
    @errors.cyclades.connection
516 eb8208a5 Stavros Sachtouris
    @errors.cyclades.server_id
517 eb8208a5 Stavros Sachtouris
    @errors.cyclades.flavor_id
518 eb8208a5 Stavros Sachtouris
    def _run(self, server_id, flavor_id):
519 eb8208a5 Stavros Sachtouris
        self._optional_output(self.client.resize_server(server_id, flavor_id))
520 eb8208a5 Stavros Sachtouris
521 eb8208a5 Stavros Sachtouris
    def main(self, server_id, flavor_id):
522 eb8208a5 Stavros Sachtouris
        super(self.__class__, self)._run()
523 eb8208a5 Stavros Sachtouris
        self._run(server_id=server_id, flavor_id=flavor_id)
524 eb8208a5 Stavros Sachtouris
525 eb8208a5 Stavros Sachtouris
526 eb8208a5 Stavros Sachtouris
@command(server_cmds)
527 7493ccb6 Stavros Sachtouris
class server_firewall(_init_cyclades):
528 cd295a1d Stavros Sachtouris
    """Manage server (VM) firewall profiles for public networks"""
529 cd295a1d Stavros Sachtouris
530 cd295a1d Stavros Sachtouris
531 cd295a1d Stavros Sachtouris
@command(server_cmds)
532 cd295a1d Stavros Sachtouris
class server_firewall_set(_init_cyclades, _optional_output_cmd):
533 22b6f063 Stavros Sachtouris
    """Set the server (VM) firewall profile on VMs public network
534 22b6f063 Stavros Sachtouris
    Values for profile:
535 439826ec Stavros Sachtouris
    - DISABLED: Shutdown firewall
536 439826ec Stavros Sachtouris
    - ENABLED: Firewall in normal mode
537 439826ec Stavros Sachtouris
    - PROTECTED: Firewall in secure mode
538 22b6f063 Stavros Sachtouris
    """
539 7493ccb6 Stavros Sachtouris
540 5a673575 Stavros Sachtouris
    @errors.generic.all
541 5a673575 Stavros Sachtouris
    @errors.cyclades.connection
542 5a673575 Stavros Sachtouris
    @errors.cyclades.server_id
543 5a673575 Stavros Sachtouris
    @errors.cyclades.firewall
544 5a673575 Stavros Sachtouris
    def _run(self, server_id, profile):
545 cd295a1d Stavros Sachtouris
        self._optional_output(self.client.set_firewall_profile(
546 cd295a1d Stavros Sachtouris
            server_id=int(server_id), profile=('%s' % profile).upper()))
547 5a673575 Stavros Sachtouris
548 7493ccb6 Stavros Sachtouris
    def main(self, server_id, profile):
549 5a673575 Stavros Sachtouris
        super(self.__class__, self)._run()
550 5a673575 Stavros Sachtouris
        self._run(server_id=server_id, profile=profile)
551 234954d1 Stavros Sachtouris
552 f3e94e06 Stavros Sachtouris
553 d486baec Stavros Sachtouris
@command(server_cmds)
554 cd295a1d Stavros Sachtouris
class server_firewall_get(_init_cyclades):
555 cd295a1d Stavros Sachtouris
    """Get the server (VM) firewall profile for its public network"""
556 cd295a1d Stavros Sachtouris
557 cd295a1d Stavros Sachtouris
    @errors.generic.all
558 cd295a1d Stavros Sachtouris
    @errors.cyclades.connection
559 cd295a1d Stavros Sachtouris
    @errors.cyclades.server_id
560 cd295a1d Stavros Sachtouris
    def _run(self, server_id):
561 cd295a1d Stavros Sachtouris
        print(self.client.get_firewall_profile(server_id))
562 cd295a1d Stavros Sachtouris
563 cd295a1d Stavros Sachtouris
    def main(self, server_id):
564 cd295a1d Stavros Sachtouris
        super(self.__class__, self)._run()
565 cd295a1d Stavros Sachtouris
        self._run(server_id=server_id)
566 cd295a1d Stavros Sachtouris
567 cd295a1d Stavros Sachtouris
568 cd295a1d Stavros Sachtouris
@command(server_cmds)
569 545c6c29 Stavros Sachtouris
class server_addr(_init_cyclades, _optional_json):
570 22b6f063 Stavros Sachtouris
    """List the addresses of all network interfaces on a server (VM)"""
571 7493ccb6 Stavros Sachtouris
572 cd295a1d Stavros Sachtouris
    arguments = dict(
573 545c6c29 Stavros Sachtouris
        enum=FlagArgument('Enumerate results', '--enumerate')
574 cd295a1d Stavros Sachtouris
    )
575 cd295a1d Stavros Sachtouris
576 5a673575 Stavros Sachtouris
    @errors.generic.all
577 5a673575 Stavros Sachtouris
    @errors.cyclades.connection
578 5a673575 Stavros Sachtouris
    @errors.cyclades.server_id
579 5a673575 Stavros Sachtouris
    def _run(self, server_id):
580 5a673575 Stavros Sachtouris
        reply = self.client.list_server_nics(int(server_id))
581 545c6c29 Stavros Sachtouris
        self._print(
582 545c6c29 Stavros Sachtouris
            reply, with_enumeration=self['enum'] and len(reply) > 1)
583 7493ccb6 Stavros Sachtouris
584 5a673575 Stavros Sachtouris
    def main(self, server_id):
585 5a673575 Stavros Sachtouris
        super(self.__class__, self)._run()
586 5a673575 Stavros Sachtouris
        self._run(server_id=server_id)
587 5a673575 Stavros Sachtouris
588 234954d1 Stavros Sachtouris
589 d486baec Stavros Sachtouris
@command(server_cmds)
590 cd295a1d Stavros Sachtouris
class server_metadata(_init_cyclades):
591 cd295a1d Stavros Sachtouris
    """Manage Server metadata (key:value pairs of server attributes)"""
592 cd295a1d Stavros Sachtouris
593 cd295a1d Stavros Sachtouris
594 cd295a1d Stavros Sachtouris
@command(server_cmds)
595 545c6c29 Stavros Sachtouris
class server_metadata_list(_init_cyclades, _optional_json):
596 cd295a1d Stavros Sachtouris
    """Get server metadata"""
597 7493ccb6 Stavros Sachtouris
598 5a673575 Stavros Sachtouris
    @errors.generic.all
599 5a673575 Stavros Sachtouris
    @errors.cyclades.connection
600 5a673575 Stavros Sachtouris
    @errors.cyclades.server_id
601 5a673575 Stavros Sachtouris
    @errors.cyclades.metadata
602 5a673575 Stavros Sachtouris
    def _run(self, server_id, key=''):
603 545c6c29 Stavros Sachtouris
        self._print(
604 bcef3ac9 Stavros Sachtouris
            self.client.get_server_metadata(int(server_id), key), print_dict)
605 5a673575 Stavros Sachtouris
606 a34888b4 Stavros Sachtouris
    def main(self, server_id, key=''):
607 5a673575 Stavros Sachtouris
        super(self.__class__, self)._run()
608 5a673575 Stavros Sachtouris
        self._run(server_id=server_id, key=key)
609 7493ccb6 Stavros Sachtouris
610 234954d1 Stavros Sachtouris
611 d486baec Stavros Sachtouris
@command(server_cmds)
612 545c6c29 Stavros Sachtouris
class server_metadata_set(_init_cyclades, _optional_json):
613 cd295a1d Stavros Sachtouris
    """Set / update server(VM) metadata
614 cd295a1d Stavros Sachtouris
    Metadata should be given in key/value pairs in key=value format
615 9dc6159f Stavros Sachtouris
    For example: /server metadata set <server id> key1=value1 key2=value2
616 cd295a1d Stavros Sachtouris
    Old, unreferenced metadata will remain intact
617 22b6f063 Stavros Sachtouris
    """
618 7493ccb6 Stavros Sachtouris
619 5a673575 Stavros Sachtouris
    @errors.generic.all
620 5a673575 Stavros Sachtouris
    @errors.cyclades.connection
621 5a673575 Stavros Sachtouris
    @errors.cyclades.server_id
622 cd295a1d Stavros Sachtouris
    def _run(self, server_id, keyvals):
623 545c6c29 Stavros Sachtouris
        assert keyvals, 'Please, add some metadata ( key=value)'
624 cd295a1d Stavros Sachtouris
        metadata = dict()
625 cd295a1d Stavros Sachtouris
        for keyval in keyvals:
626 cd295a1d Stavros Sachtouris
            k, sep, v = keyval.partition('=')
627 cd295a1d Stavros Sachtouris
            if sep and k:
628 cd295a1d Stavros Sachtouris
                metadata[k] = v
629 cd295a1d Stavros Sachtouris
            else:
630 cd295a1d Stavros Sachtouris
                raiseCLIError(
631 cd295a1d Stavros Sachtouris
                    'Invalid piece of metadata %s' % keyval,
632 cd295a1d Stavros Sachtouris
                    importance=2, details=[
633 cd295a1d Stavros Sachtouris
                        'Correct metadata format: key=val',
634 cd295a1d Stavros Sachtouris
                        'For example:',
635 cd295a1d Stavros Sachtouris
                        '/server metadata set <server id>'
636 cd295a1d Stavros Sachtouris
                        'key1=value1 key2=value2'])
637 545c6c29 Stavros Sachtouris
        self._print(
638 bcef3ac9 Stavros Sachtouris
            self.client.update_server_metadata(int(server_id), **metadata),
639 bcef3ac9 Stavros Sachtouris
            print_dict)
640 cd295a1d Stavros Sachtouris
641 cd295a1d Stavros Sachtouris
    def main(self, server_id, *key_equals_val):
642 5a673575 Stavros Sachtouris
        super(self.__class__, self)._run()
643 cd295a1d Stavros Sachtouris
        self._run(server_id=server_id, keyvals=key_equals_val)
644 7493ccb6 Stavros Sachtouris
645 234954d1 Stavros Sachtouris
646 d486baec Stavros Sachtouris
@command(server_cmds)
647 cd295a1d Stavros Sachtouris
class server_metadata_delete(_init_cyclades, _optional_output_cmd):
648 22b6f063 Stavros Sachtouris
    """Delete server (VM) metadata"""
649 7493ccb6 Stavros Sachtouris
650 5a673575 Stavros Sachtouris
    @errors.generic.all
651 5a673575 Stavros Sachtouris
    @errors.cyclades.connection
652 5a673575 Stavros Sachtouris
    @errors.cyclades.server_id
653 5a673575 Stavros Sachtouris
    @errors.cyclades.metadata
654 5a673575 Stavros Sachtouris
    def _run(self, server_id, key):
655 cd295a1d Stavros Sachtouris
        self._optional_output(
656 cd295a1d Stavros Sachtouris
            self.client.delete_server_metadata(int(server_id), key))
657 5a673575 Stavros Sachtouris
658 7493ccb6 Stavros Sachtouris
    def main(self, server_id, key):
659 5a673575 Stavros Sachtouris
        super(self.__class__, self)._run()
660 5a673575 Stavros Sachtouris
        self._run(server_id=server_id, key=key)
661 234954d1 Stavros Sachtouris
662 7493ccb6 Stavros Sachtouris
663 d486baec Stavros Sachtouris
@command(server_cmds)
664 545c6c29 Stavros Sachtouris
class server_stats(_init_cyclades, _optional_json):
665 22b6f063 Stavros Sachtouris
    """Get server (VM) statistics"""
666 7493ccb6 Stavros Sachtouris
667 5a673575 Stavros Sachtouris
    @errors.generic.all
668 5a673575 Stavros Sachtouris
    @errors.cyclades.connection
669 5a673575 Stavros Sachtouris
    @errors.cyclades.server_id
670 5a673575 Stavros Sachtouris
    def _run(self, server_id):
671 bcef3ac9 Stavros Sachtouris
        self._print(self.client.get_server_stats(int(server_id)), print_dict)
672 5a673575 Stavros Sachtouris
673 7493ccb6 Stavros Sachtouris
    def main(self, server_id):
674 5a673575 Stavros Sachtouris
        super(self.__class__, self)._run()
675 5a673575 Stavros Sachtouris
        self._run(server_id=server_id)
676 7493ccb6 Stavros Sachtouris
677 234954d1 Stavros Sachtouris
678 d486baec Stavros Sachtouris
@command(server_cmds)
679 60c42f9f Stavros Sachtouris
class server_wait(_init_cyclades, _server_wait):
680 fd1f1d96 Stavros Sachtouris
    """Wait for server to finish [BUILD, STOPPED, REBOOT, ACTIVE]"""
681 fd1f1d96 Stavros Sachtouris
682 5a673575 Stavros Sachtouris
    @errors.generic.all
683 5a673575 Stavros Sachtouris
    @errors.cyclades.connection
684 5a673575 Stavros Sachtouris
    @errors.cyclades.server_id
685 5a673575 Stavros Sachtouris
    def _run(self, server_id, currect_status):
686 60c42f9f Stavros Sachtouris
        self._wait(server_id, currect_status)
687 fd1f1d96 Stavros Sachtouris
688 5a673575 Stavros Sachtouris
    def main(self, server_id, currect_status='BUILD'):
689 5a673575 Stavros Sachtouris
        super(self.__class__, self)._run()
690 5a673575 Stavros Sachtouris
        self._run(server_id=server_id, currect_status=currect_status)
691 5a673575 Stavros Sachtouris
692 fd1f1d96 Stavros Sachtouris
693 d486baec Stavros Sachtouris
@command(flavor_cmds)
694 545c6c29 Stavros Sachtouris
class flavor_list(_init_cyclades, _optional_json):
695 bd40efdf Stavros Sachtouris
    """List available hardware flavors"""
696 7493ccb6 Stavros Sachtouris
697 93914390 Stavros Sachtouris
    arguments = dict(
698 f40f0cb7 Stavros Sachtouris
        detail=FlagArgument('show detailed output', ('-l', '--details')),
699 f40f0cb7 Stavros Sachtouris
        limit=IntArgument('limit # of listed flavors', ('-n', '--number')),
700 bd40efdf Stavros Sachtouris
        more=FlagArgument(
701 de73876b Stavros Sachtouris
            'output results in pages (-n to set items per page, default 10)',
702 ed9af02c Stavros Sachtouris
            '--more'),
703 ed9af02c Stavros Sachtouris
        enum=FlagArgument('Enumerate results', '--enumerate')
704 93914390 Stavros Sachtouris
    )
705 7493ccb6 Stavros Sachtouris
706 5a673575 Stavros Sachtouris
    @errors.generic.all
707 5a673575 Stavros Sachtouris
    @errors.cyclades.connection
708 5a673575 Stavros Sachtouris
    def _run(self):
709 5a673575 Stavros Sachtouris
        flavors = self.client.list_flavors(self['detail'])
710 7ba195e5 Stavros Sachtouris
        if not (self['detail'] or self['json_output']):
711 7ba195e5 Stavros Sachtouris
            remove_from_items(flavors, 'links')
712 5a673575 Stavros Sachtouris
        pg_size = 10 if self['more'] and not self['limit'] else self['limit']
713 545c6c29 Stavros Sachtouris
        self._print(
714 ed9af02c Stavros Sachtouris
            flavors,
715 ed9af02c Stavros Sachtouris
            with_redundancy=self['detail'],
716 ed9af02c Stavros Sachtouris
            page_size=pg_size,
717 ed9af02c Stavros Sachtouris
            with_enumeration=self['enum'])
718 5a673575 Stavros Sachtouris
719 7493ccb6 Stavros Sachtouris
    def main(self):
720 5a673575 Stavros Sachtouris
        super(self.__class__, self)._run()
721 5a673575 Stavros Sachtouris
        self._run()
722 7493ccb6 Stavros Sachtouris
723 234954d1 Stavros Sachtouris
724 d486baec Stavros Sachtouris
@command(flavor_cmds)
725 545c6c29 Stavros Sachtouris
class flavor_info(_init_cyclades, _optional_json):
726 769dbf53 Stavros Sachtouris
    """Detailed information on a hardware flavor
727 ddc0b290 Stavros Sachtouris
    To get a list of available flavors and flavor ids, try /flavor list
728 ddc0b290 Stavros Sachtouris
    """
729 7493ccb6 Stavros Sachtouris
730 5a673575 Stavros Sachtouris
    @errors.generic.all
731 5a673575 Stavros Sachtouris
    @errors.cyclades.connection
732 5a673575 Stavros Sachtouris
    @errors.cyclades.flavor_id
733 5a673575 Stavros Sachtouris
    def _run(self, flavor_id):
734 bcef3ac9 Stavros Sachtouris
        self._print(
735 bcef3ac9 Stavros Sachtouris
            self.client.get_flavor_details(int(flavor_id)), print_dict)
736 7493ccb6 Stavros Sachtouris
737 5a673575 Stavros Sachtouris
    def main(self, flavor_id):
738 5a673575 Stavros Sachtouris
        super(self.__class__, self)._run()
739 5a673575 Stavros Sachtouris
        self._run(flavor_id=flavor_id)
740 5a673575 Stavros Sachtouris
741 234954d1 Stavros Sachtouris
742 d486baec Stavros Sachtouris
@command(network_cmds)
743 545c6c29 Stavros Sachtouris
class network_info(_init_cyclades, _optional_json):
744 ddc0b290 Stavros Sachtouris
    """Detailed information on a network
745 ddc0b290 Stavros Sachtouris
    To get a list of available networks and network ids, try /network list
746 ddc0b290 Stavros Sachtouris
    """
747 c17b8bc0 Stavros Sachtouris
748 5a673575 Stavros Sachtouris
    @errors.generic.all
749 5a673575 Stavros Sachtouris
    @errors.cyclades.connection
750 5a673575 Stavros Sachtouris
    @errors.cyclades.network_id
751 5a673575 Stavros Sachtouris
    def _run(self, network_id):
752 5a673575 Stavros Sachtouris
        network = self.client.get_network_details(int(network_id))
753 545c6c29 Stavros Sachtouris
        self._print(network, print_dict, exclude=('id'))
754 5a673575 Stavros Sachtouris
755 c17b8bc0 Stavros Sachtouris
    def main(self, network_id):
756 5a673575 Stavros Sachtouris
        super(self.__class__, self)._run()
757 5a673575 Stavros Sachtouris
        self._run(network_id=network_id)
758 c17b8bc0 Stavros Sachtouris
759 c17b8bc0 Stavros Sachtouris
760 c17b8bc0 Stavros Sachtouris
@command(network_cmds)
761 545c6c29 Stavros Sachtouris
class network_list(_init_cyclades, _optional_json):
762 7493ccb6 Stavros Sachtouris
    """List networks"""
763 7493ccb6 Stavros Sachtouris
764 93914390 Stavros Sachtouris
    arguments = dict(
765 f40f0cb7 Stavros Sachtouris
        detail=FlagArgument('show detailed output', ('-l', '--details')),
766 f40f0cb7 Stavros Sachtouris
        limit=IntArgument('limit # of listed networks', ('-n', '--number')),
767 ddc0b290 Stavros Sachtouris
        more=FlagArgument(
768 ddc0b290 Stavros Sachtouris
            'output results in pages (-n to set items per page, default 10)',
769 ed9af02c Stavros Sachtouris
            '--more'),
770 ed9af02c Stavros Sachtouris
        enum=FlagArgument('Enumerate results', '--enumerate')
771 93914390 Stavros Sachtouris
    )
772 7493ccb6 Stavros Sachtouris
773 5a673575 Stavros Sachtouris
    @errors.generic.all
774 5a673575 Stavros Sachtouris
    @errors.cyclades.connection
775 5a673575 Stavros Sachtouris
    def _run(self):
776 5a673575 Stavros Sachtouris
        networks = self.client.list_networks(self['detail'])
777 7ba195e5 Stavros Sachtouris
        if not (self['detail'] or self['json_output']):
778 7ba195e5 Stavros Sachtouris
            remove_from_items(networks, 'links')
779 545c6c29 Stavros Sachtouris
        kwargs = dict(with_enumeration=self['enum'])
780 ddc0b290 Stavros Sachtouris
        if self['more']:
781 545c6c29 Stavros Sachtouris
            kwargs['page_size'] = self['limit'] or 10
782 0e806947 Stavros Sachtouris
        elif self['limit']:
783 545c6c29 Stavros Sachtouris
            networks = networks[:self['limit']]
784 545c6c29 Stavros Sachtouris
        self._print(networks, **kwargs)
785 7493ccb6 Stavros Sachtouris
786 5a673575 Stavros Sachtouris
    def main(self):
787 5a673575 Stavros Sachtouris
        super(self.__class__, self)._run()
788 5a673575 Stavros Sachtouris
        self._run()
789 5a673575 Stavros Sachtouris
790 234954d1 Stavros Sachtouris
791 d486baec Stavros Sachtouris
@command(network_cmds)
792 77df3d4a Stavros Sachtouris
class network_create(_init_cyclades, _optional_json, _network_wait):
793 0e806947 Stavros Sachtouris
    """Create an (unconnected) network"""
794 7493ccb6 Stavros Sachtouris
795 93914390 Stavros Sachtouris
    arguments = dict(
796 0e806947 Stavros Sachtouris
        cidr=ValueArgument('explicitly set cidr', '--with-cidr'),
797 0e806947 Stavros Sachtouris
        gateway=ValueArgument('explicitly set gateway', '--with-gateway'),
798 9d1db11e Stavros Sachtouris
        dhcp=FlagArgument('Use dhcp (default: off)', '--with-dhcp'),
799 f6f81cd3 Stavros Sachtouris
        type=ValueArgument(
800 f6f81cd3 Stavros Sachtouris
            'Valid network types are '
801 f6f81cd3 Stavros Sachtouris
            'CUSTOM, IP_LESS_ROUTED, MAC_FILTERED (default), PHYSICAL_VLAN',
802 f6f81cd3 Stavros Sachtouris
            '--with-type',
803 77df3d4a Stavros Sachtouris
            default='MAC_FILTERED'),
804 77df3d4a Stavros Sachtouris
        wait=FlagArgument('Wait network to build', ('-w', '--wait'))
805 93914390 Stavros Sachtouris
    )
806 7493ccb6 Stavros Sachtouris
807 5a673575 Stavros Sachtouris
    @errors.generic.all
808 5a673575 Stavros Sachtouris
    @errors.cyclades.connection
809 5a673575 Stavros Sachtouris
    @errors.cyclades.network_max
810 5a673575 Stavros Sachtouris
    def _run(self, name):
811 77df3d4a Stavros Sachtouris
        r = self.client.create_network(
812 de73876b Stavros Sachtouris
            name,
813 5a673575 Stavros Sachtouris
            cidr=self['cidr'],
814 5a673575 Stavros Sachtouris
            gateway=self['gateway'],
815 5a673575 Stavros Sachtouris
            dhcp=self['dhcp'],
816 77df3d4a Stavros Sachtouris
            type=self['type'])
817 77df3d4a Stavros Sachtouris
        self._print(r, print_dict)
818 77df3d4a Stavros Sachtouris
819 77df3d4a Stavros Sachtouris
        if self['wait']:
820 77df3d4a Stavros Sachtouris
            self._wait(r['id'], 'PENDING')
821 5a673575 Stavros Sachtouris
822 7493ccb6 Stavros Sachtouris
    def main(self, name):
823 5a673575 Stavros Sachtouris
        super(self.__class__, self)._run()
824 5a673575 Stavros Sachtouris
        self._run(name)
825 7493ccb6 Stavros Sachtouris
826 234954d1 Stavros Sachtouris
827 d486baec Stavros Sachtouris
@command(network_cmds)
828 1b73b4c1 Stavros Sachtouris
class network_rename(_init_cyclades, _optional_output_cmd):
829 0e806947 Stavros Sachtouris
    """Set the name of a network"""
830 7493ccb6 Stavros Sachtouris
831 5a673575 Stavros Sachtouris
    @errors.generic.all
832 5a673575 Stavros Sachtouris
    @errors.cyclades.connection
833 5a673575 Stavros Sachtouris
    @errors.cyclades.network_id
834 5a673575 Stavros Sachtouris
    def _run(self, network_id, new_name):
835 1b73b4c1 Stavros Sachtouris
        self._optional_output(
836 1b73b4c1 Stavros Sachtouris
                self.client.update_network_name(int(network_id), new_name))
837 5a673575 Stavros Sachtouris
838 7493ccb6 Stavros Sachtouris
    def main(self, network_id, new_name):
839 5a673575 Stavros Sachtouris
        super(self.__class__, self)._run()
840 5a673575 Stavros Sachtouris
        self._run(network_id=network_id, new_name=new_name)
841 7493ccb6 Stavros Sachtouris
842 234954d1 Stavros Sachtouris
843 d486baec Stavros Sachtouris
@command(network_cmds)
844 77df3d4a Stavros Sachtouris
class network_delete(_init_cyclades, _optional_output_cmd, _network_wait):
845 7493ccb6 Stavros Sachtouris
    """Delete a network"""
846 7493ccb6 Stavros Sachtouris
847 77df3d4a Stavros Sachtouris
    arguments = dict(
848 77df3d4a Stavros Sachtouris
        wait=FlagArgument('Wait network to build', ('-w', '--wait'))
849 77df3d4a Stavros Sachtouris
    )
850 77df3d4a Stavros Sachtouris
851 5a673575 Stavros Sachtouris
    @errors.generic.all
852 5a673575 Stavros Sachtouris
    @errors.cyclades.connection
853 5a673575 Stavros Sachtouris
    @errors.cyclades.network_id
854 5a673575 Stavros Sachtouris
    @errors.cyclades.network_in_use
855 5a673575 Stavros Sachtouris
    def _run(self, network_id):
856 77df3d4a Stavros Sachtouris
        status = 'DELETED'
857 77df3d4a Stavros Sachtouris
        if self['wait']:
858 77df3d4a Stavros Sachtouris
            r = self.client.get_network_details(network_id)
859 77df3d4a Stavros Sachtouris
            status = r['status']
860 77df3d4a Stavros Sachtouris
            if status in ('DELETED', ):
861 77df3d4a Stavros Sachtouris
                return
862 77df3d4a Stavros Sachtouris
863 77df3d4a Stavros Sachtouris
        r = self.client.delete_network(int(network_id))
864 77df3d4a Stavros Sachtouris
        self._optional_output(r)
865 77df3d4a Stavros Sachtouris
866 77df3d4a Stavros Sachtouris
        if self['wait']:
867 77df3d4a Stavros Sachtouris
            self._wait(network_id, status)
868 5a673575 Stavros Sachtouris
869 7493ccb6 Stavros Sachtouris
    def main(self, network_id):
870 5a673575 Stavros Sachtouris
        super(self.__class__, self)._run()
871 5a673575 Stavros Sachtouris
        self._run(network_id=network_id)
872 7493ccb6 Stavros Sachtouris
873 234954d1 Stavros Sachtouris
874 d486baec Stavros Sachtouris
@command(network_cmds)
875 1b73b4c1 Stavros Sachtouris
class network_connect(_init_cyclades, _optional_output_cmd):
876 7493ccb6 Stavros Sachtouris
    """Connect a server to a network"""
877 7493ccb6 Stavros Sachtouris
878 5a673575 Stavros Sachtouris
    @errors.generic.all
879 5a673575 Stavros Sachtouris
    @errors.cyclades.connection
880 5a673575 Stavros Sachtouris
    @errors.cyclades.server_id
881 5a673575 Stavros Sachtouris
    @errors.cyclades.network_id
882 5a673575 Stavros Sachtouris
    def _run(self, server_id, network_id):
883 1b73b4c1 Stavros Sachtouris
        self._optional_output(
884 1b73b4c1 Stavros Sachtouris
                self.client.connect_server(int(server_id), int(network_id)))
885 5a673575 Stavros Sachtouris
886 7493ccb6 Stavros Sachtouris
    def main(self, server_id, network_id):
887 5a673575 Stavros Sachtouris
        super(self.__class__, self)._run()
888 5a673575 Stavros Sachtouris
        self._run(server_id=server_id, network_id=network_id)
889 7493ccb6 Stavros Sachtouris
890 234954d1 Stavros Sachtouris
891 d486baec Stavros Sachtouris
@command(network_cmds)
892 7493ccb6 Stavros Sachtouris
class network_disconnect(_init_cyclades):
893 0e806947 Stavros Sachtouris
    """Disconnect a nic that connects a server to a network
894 0e806947 Stavros Sachtouris
    Nic ids are listed as "attachments" in detailed network information
895 439826ec Stavros Sachtouris
    To get detailed network information: /network info <network id>
896 0e806947 Stavros Sachtouris
    """
897 7493ccb6 Stavros Sachtouris
898 5a673575 Stavros Sachtouris
    @errors.cyclades.nic_format
899 5a673575 Stavros Sachtouris
    def _server_id_from_nic(self, nic_id):
900 5a673575 Stavros Sachtouris
        return nic_id.split('-')[1]
901 5a673575 Stavros Sachtouris
902 5a673575 Stavros Sachtouris
    @errors.generic.all
903 5a673575 Stavros Sachtouris
    @errors.cyclades.connection
904 5a673575 Stavros Sachtouris
    @errors.cyclades.server_id
905 5a673575 Stavros Sachtouris
    @errors.cyclades.nic_id
906 5a673575 Stavros Sachtouris
    def _run(self, nic_id, server_id):
907 1b73b4c1 Stavros Sachtouris
        num_of_disconnected = self.client.disconnect_server(server_id, nic_id)
908 1b73b4c1 Stavros Sachtouris
        if not num_of_disconnected:
909 5a673575 Stavros Sachtouris
            raise ClientError(
910 5a673575 Stavros Sachtouris
                'Network Interface %s not found on server %s' % (
911 5a673575 Stavros Sachtouris
                    nic_id,
912 5a673575 Stavros Sachtouris
                    server_id),
913 5a673575 Stavros Sachtouris
                status=404)
914 1b73b4c1 Stavros Sachtouris
        print('Disconnected %s connections' % num_of_disconnected)
915 5a673575 Stavros Sachtouris
916 7493ccb6 Stavros Sachtouris
    def main(self, nic_id):
917 5a673575 Stavros Sachtouris
        super(self.__class__, self)._run()
918 5a673575 Stavros Sachtouris
        server_id = self._server_id_from_nic(nic_id=nic_id)
919 5a673575 Stavros Sachtouris
        self._run(nic_id=nic_id, server_id=server_id)
920 9b47150e Stavros Sachtouris
921 9b47150e Stavros Sachtouris
922 7b2e4bf1 Stavros Sachtouris
@command(network_cmds)
923 7b2e4bf1 Stavros Sachtouris
class network_wait(_init_cyclades, _network_wait):
924 7b2e4bf1 Stavros Sachtouris
    """Wait for server to finish [PENDING, ACTIVE, DELETED]"""
925 7b2e4bf1 Stavros Sachtouris
926 7b2e4bf1 Stavros Sachtouris
    @errors.generic.all
927 7b2e4bf1 Stavros Sachtouris
    @errors.cyclades.connection
928 7b2e4bf1 Stavros Sachtouris
    @errors.cyclades.network_id
929 7b2e4bf1 Stavros Sachtouris
    def _run(self, network_id, currect_status):
930 7b2e4bf1 Stavros Sachtouris
        self._wait(network_id, currect_status)
931 7b2e4bf1 Stavros Sachtouris
932 7b2e4bf1 Stavros Sachtouris
    def main(self, network_id, currect_status='PENDING'):
933 7b2e4bf1 Stavros Sachtouris
        super(self.__class__, self)._run()
934 7b2e4bf1 Stavros Sachtouris
        self._run(network_id=network_id, currect_status=currect_status)
935 7b2e4bf1 Stavros Sachtouris
936 7b2e4bf1 Stavros Sachtouris
937 8be50626 Stavros Sachtouris
@command(server_cmds)
938 8be50626 Stavros Sachtouris
class server_ip(_init_cyclades):
939 8be50626 Stavros Sachtouris
    """Manage floating IPs for the servers"""
940 8be50626 Stavros Sachtouris
941 8be50626 Stavros Sachtouris
942 8be50626 Stavros Sachtouris
@command(server_cmds)
943 8be50626 Stavros Sachtouris
class server_ip_pools(_init_cyclades, _optional_json):
944 9b47150e Stavros Sachtouris
    """List all floating pools of floating ips"""
945 9b47150e Stavros Sachtouris
946 9b47150e Stavros Sachtouris
    @errors.generic.all
947 9b47150e Stavros Sachtouris
    @errors.cyclades.connection
948 9b47150e Stavros Sachtouris
    def _run(self):
949 9b47150e Stavros Sachtouris
        r = self.client.get_floating_ip_pools()
950 9b47150e Stavros Sachtouris
        self._print(r if self['json_output'] else r['floating_ip_pools'])
951 9b47150e Stavros Sachtouris
952 9b47150e Stavros Sachtouris
    def main(self):
953 9b47150e Stavros Sachtouris
        super(self.__class__, self)._run()
954 9b47150e Stavros Sachtouris
        self._run()
955 9b47150e Stavros Sachtouris
956 9b47150e Stavros Sachtouris
957 8be50626 Stavros Sachtouris
@command(server_cmds)
958 8be50626 Stavros Sachtouris
class server_ip_list(_init_cyclades, _optional_json):
959 9b47150e Stavros Sachtouris
    """List all floating ips"""
960 9b47150e Stavros Sachtouris
961 9b47150e Stavros Sachtouris
    @errors.generic.all
962 9b47150e Stavros Sachtouris
    @errors.cyclades.connection
963 9b47150e Stavros Sachtouris
    def _run(self):
964 9b47150e Stavros Sachtouris
        r = self.client.get_floating_ips()
965 9b47150e Stavros Sachtouris
        self._print(r if self['json_output'] else r['floating_ips'])
966 9b47150e Stavros Sachtouris
967 9b47150e Stavros Sachtouris
    def main(self):
968 9b47150e Stavros Sachtouris
        super(self.__class__, self)._run()
969 9b47150e Stavros Sachtouris
        self._run()
970 9b47150e Stavros Sachtouris
971 9b47150e Stavros Sachtouris
972 8be50626 Stavros Sachtouris
@command(server_cmds)
973 8be50626 Stavros Sachtouris
class server_ip_info(_init_cyclades, _optional_json):
974 9b47150e Stavros Sachtouris
    """A floating IPs' details"""
975 9b47150e Stavros Sachtouris
976 9b47150e Stavros Sachtouris
    @errors.generic.all
977 9b47150e Stavros Sachtouris
    @errors.cyclades.connection
978 9b47150e Stavros Sachtouris
    def _run(self, ip):
979 9b47150e Stavros Sachtouris
        self._print(self.client.get_floating_ip(ip), print_dict)
980 9b47150e Stavros Sachtouris
981 9b47150e Stavros Sachtouris
    def main(self, ip):
982 9b47150e Stavros Sachtouris
        super(self.__class__, self)._run()
983 9b47150e Stavros Sachtouris
        self._run(ip=ip)
984 9b47150e Stavros Sachtouris
985 9b47150e Stavros Sachtouris
986 8be50626 Stavros Sachtouris
@command(server_cmds)
987 8be50626 Stavros Sachtouris
class server_ip_create(_init_cyclades, _optional_json):
988 9b47150e Stavros Sachtouris
    """Create a new floating IP"""
989 9b47150e Stavros Sachtouris
990 9b47150e Stavros Sachtouris
    arguments = dict(
991 9b47150e Stavros Sachtouris
        pool=ValueArgument('Source IP pool', ('--pool'), None)
992 9b47150e Stavros Sachtouris
    )
993 9b47150e Stavros Sachtouris
994 9b47150e Stavros Sachtouris
    @errors.generic.all
995 9b47150e Stavros Sachtouris
    @errors.cyclades.connection
996 9b47150e Stavros Sachtouris
    def _run(self, ip=None):
997 2e6e03da Stavros Sachtouris
        self._print([self.client.alloc_floating_ip(self['pool'], ip)])
998 9b47150e Stavros Sachtouris
999 9b47150e Stavros Sachtouris
    def main(self, requested_address=None):
1000 9b47150e Stavros Sachtouris
        super(self.__class__, self)._run()
1001 9b47150e Stavros Sachtouris
        self._run(ip=requested_address)
1002 9b47150e Stavros Sachtouris
1003 9b47150e Stavros Sachtouris
1004 8be50626 Stavros Sachtouris
@command(server_cmds)
1005 8be50626 Stavros Sachtouris
class server_ip_delete(_init_cyclades, _optional_output_cmd):
1006 9b47150e Stavros Sachtouris
    """Delete a floating ip"""
1007 9b47150e Stavros Sachtouris
1008 9b47150e Stavros Sachtouris
    @errors.generic.all
1009 9b47150e Stavros Sachtouris
    @errors.cyclades.connection
1010 9b47150e Stavros Sachtouris
    def _run(self, ip):
1011 9b47150e Stavros Sachtouris
        self._optional_output(self.client.delete_floating_ip(ip))
1012 9b47150e Stavros Sachtouris
1013 9b47150e Stavros Sachtouris
    def main(self, ip):
1014 9b47150e Stavros Sachtouris
        super(self.__class__, self)._run()
1015 9b47150e Stavros Sachtouris
        self._run(ip=ip)
1016 9b47150e Stavros Sachtouris
1017 9b47150e Stavros Sachtouris
1018 9b47150e Stavros Sachtouris
@command(server_cmds)
1019 9b47150e Stavros Sachtouris
class server_ip_attach(_init_cyclades, _optional_output_cmd):
1020 9b47150e Stavros Sachtouris
    """Attach a floating ip to a server with server_id
1021 9b47150e Stavros Sachtouris
    """
1022 9b47150e Stavros Sachtouris
1023 9b47150e Stavros Sachtouris
    @errors.generic.all
1024 9b47150e Stavros Sachtouris
    @errors.cyclades.connection
1025 9b47150e Stavros Sachtouris
    @errors.cyclades.server_id
1026 9b47150e Stavros Sachtouris
    def _run(self, server_id, ip):
1027 9b47150e Stavros Sachtouris
        self._optional_output(self.client.attach_floating_ip(server_id, ip))
1028 9b47150e Stavros Sachtouris
1029 9b47150e Stavros Sachtouris
    def main(self, server_id, ip):
1030 9b47150e Stavros Sachtouris
        super(self.__class__, self)._run()
1031 9b47150e Stavros Sachtouris
        self._run(server_id=server_id, ip=ip)
1032 9b47150e Stavros Sachtouris
1033 9b47150e Stavros Sachtouris
1034 9b47150e Stavros Sachtouris
@command(server_cmds)
1035 2e6e03da Stavros Sachtouris
class server_ip_detach(_init_cyclades, _optional_output_cmd):
1036 8be50626 Stavros Sachtouris
    """Detach floating IP from server
1037 9b47150e Stavros Sachtouris
    """
1038 9b47150e Stavros Sachtouris
1039 9b47150e Stavros Sachtouris
    @errors.generic.all
1040 9b47150e Stavros Sachtouris
    @errors.cyclades.connection
1041 9b47150e Stavros Sachtouris
    @errors.cyclades.server_id
1042 9b47150e Stavros Sachtouris
    def _run(self, server_id, ip):
1043 9b47150e Stavros Sachtouris
        self._optional_output(self.client.detach_floating_ip(server_id, ip))
1044 9b47150e Stavros Sachtouris
1045 9b47150e Stavros Sachtouris
    def main(self, server_id, ip):
1046 9b47150e Stavros Sachtouris
        super(self.__class__, self)._run()
1047 9b47150e Stavros Sachtouris
        self._run(server_id=server_id, ip=ip)