Statistics
| Branch: | Tag: | Revision:

root / kamaki / cli / commands / cyclades_cli.py @ 2005b18e

History | View | Annotate | Download (21.6 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 83c3ba87 Stavros Sachtouris
from kamaki.cli.utils import print_dict, print_list, print_items
37 43ee6ae1 Stavros Sachtouris
from kamaki.cli.errors import raiseCLIError, CLISyntaxError
38 7493ccb6 Stavros Sachtouris
from kamaki.clients.cyclades import CycladesClient, ClientError
39 57d622b6 Stavros Sachtouris
from kamaki.cli.argument import FlagArgument, ValueArgument, KeyValueArgument
40 bd40efdf Stavros Sachtouris
from kamaki.cli.argument import ProgressBarArgument, DateArgument, IntArgument
41 b04288f7 Stavros Sachtouris
from kamaki.cli.commands import _command_init, errors
42 5eae854d Stavros Sachtouris
43 f3e94e06 Stavros Sachtouris
from base64 import b64encode
44 234954d1 Stavros Sachtouris
from os.path import exists
45 234954d1 Stavros Sachtouris
46 234954d1 Stavros Sachtouris
47 de73876b Stavros Sachtouris
server_cmds = CommandTree('server', 'Compute/Cyclades API server commands')
48 de73876b Stavros Sachtouris
flavor_cmds = CommandTree('flavor', 'Compute/Cyclades API flavor commands')
49 de73876b Stavros Sachtouris
image_cmds = CommandTree('image', 'Cyclades/Plankton API image commands')
50 de73876b Stavros Sachtouris
network_cmds = CommandTree('network', 'Compute/Cyclades API network commands')
51 d486baec Stavros Sachtouris
_commands = [server_cmds, flavor_cmds, image_cmds, network_cmds]
52 234954d1 Stavros Sachtouris
53 7493ccb6 Stavros Sachtouris
54 c314fc10 Stavros Sachtouris
about_authentication = '\nUser Authentication:\
55 b04288f7 Stavros Sachtouris
    \n* to check authentication: /astakos authenticate\
56 b04288f7 Stavros Sachtouris
    \n* to set authentication token: /config set token <token>'
57 18edacfe Stavros Sachtouris
58 d7259dd5 Stavros Sachtouris
howto_personality = [
59 d7259dd5 Stavros Sachtouris
    'Defines a file to be injected to VMs personality.',
60 8194b51b Stavros Sachtouris
    'Personality value syntax: PATH,[SERVER_PATH,[OWNER,[GROUP,[MODE]]]]',
61 d7259dd5 Stavros Sachtouris
    '  PATH: of local file to be injected',
62 d7259dd5 Stavros Sachtouris
    '  SERVER_PATH: destination location inside server Image',
63 d7259dd5 Stavros Sachtouris
    '  OWNER: user id of destination file owner',
64 d7259dd5 Stavros Sachtouris
    '  GROUP: group id or name to own destination file',
65 d7259dd5 Stavros Sachtouris
    '  MODEL: permition in octal (e.g. 0777 or o+rwx)']
66 d7259dd5 Stavros Sachtouris
67 18edacfe Stavros Sachtouris
68 5eae854d Stavros Sachtouris
class _init_cyclades(_command_init):
69 b04288f7 Stavros Sachtouris
    @errors.generic.all
70 236e7d08 Stavros Sachtouris
    def _run(self, service='compute'):
71 234954d1 Stavros Sachtouris
        token = self.config.get(service, 'token')\
72 234954d1 Stavros Sachtouris
            or self.config.get('global', 'token')
73 234954d1 Stavros Sachtouris
        base_url = self.config.get(service, 'url')\
74 234954d1 Stavros Sachtouris
            or self.config.get('global', 'url')
75 7493ccb6 Stavros Sachtouris
        self.client = CycladesClient(base_url=base_url, token=token)
76 7493ccb6 Stavros Sachtouris
77 b04288f7 Stavros Sachtouris
    def main(self):
78 b04288f7 Stavros Sachtouris
        self._run()
79 236e7d08 Stavros Sachtouris
80 234954d1 Stavros Sachtouris
81 d486baec Stavros Sachtouris
@command(server_cmds)
82 7493ccb6 Stavros Sachtouris
class server_list(_init_cyclades):
83 c314fc10 Stavros Sachtouris
    """List Virtual Machines accessible by user"""
84 18edacfe Stavros Sachtouris
85 18edacfe Stavros Sachtouris
    __doc__ += about_authentication
86 7493ccb6 Stavros Sachtouris
87 e15d78e2 Stavros Sachtouris
    arguments = dict(
88 a382ea56 Stavros Sachtouris
        detail=FlagArgument('show detailed output', '-l'),
89 67469d65 Stavros Sachtouris
        since=DateArgument(
90 a382ea56 Stavros Sachtouris
            'show only items since date (\' d/m/Y H:M:S \')',
91 a4d0d88a Stavros Sachtouris
            '--since'),
92 a4d0d88a Stavros Sachtouris
        limit=IntArgument('limit the number of VMs to list', '-n'),
93 a4d0d88a Stavros Sachtouris
        more=FlagArgument(
94 ddc0b290 Stavros Sachtouris
            'output results in pages (-n to set items per page, default 10)',
95 a4d0d88a Stavros Sachtouris
            '--more')
96 e15d78e2 Stavros Sachtouris
    )
97 e15d78e2 Stavros Sachtouris
98 a4d0d88a Stavros Sachtouris
    def _make_results_pretty(self, servers):
99 7493ccb6 Stavros Sachtouris
        for server in servers:
100 a4d0d88a Stavros Sachtouris
            addr_dict = {}
101 a4d0d88a Stavros Sachtouris
            if 'attachments' in server:
102 a4d0d88a Stavros Sachtouris
                for addr in server['attachments']['values']:
103 a4d0d88a Stavros Sachtouris
                    ips = addr.pop('values', [])
104 a4d0d88a Stavros Sachtouris
                    for ip in ips:
105 a4d0d88a Stavros Sachtouris
                        addr['IPv%s' % ip['version']] = ip['addr']
106 a4d0d88a Stavros Sachtouris
                    if 'firewallProfile' in addr:
107 a4d0d88a Stavros Sachtouris
                        addr['firewall'] = addr.pop('firewallProfile')
108 a4d0d88a Stavros Sachtouris
                    addr_dict[addr.pop('id')] = addr
109 a4d0d88a Stavros Sachtouris
                server['attachments'] = addr_dict if addr_dict else None
110 a4d0d88a Stavros Sachtouris
            if 'metadata' in server:
111 a4d0d88a Stavros Sachtouris
                server['metadata'] = server['metadata']['values']
112 7493ccb6 Stavros Sachtouris
113 b04288f7 Stavros Sachtouris
    @errors.generic.all
114 b04288f7 Stavros Sachtouris
    @errors.cyclades.connection
115 b04288f7 Stavros Sachtouris
    @errors.cyclades.date
116 b04288f7 Stavros Sachtouris
    def _run(self):
117 b04288f7 Stavros Sachtouris
        servers = self.client.list_servers(self['detail'], self['since'])
118 b04288f7 Stavros Sachtouris
        if self['detail']:
119 b04288f7 Stavros Sachtouris
            self._make_results_pretty(servers)
120 b04288f7 Stavros Sachtouris
121 a4d0d88a Stavros Sachtouris
        if self['more']:
122 a4d0d88a Stavros Sachtouris
            print_items(
123 a4d0d88a Stavros Sachtouris
                servers,
124 a4d0d88a Stavros Sachtouris
                page_size=self['limit'] if self['limit'] else 10)
125 a4d0d88a Stavros Sachtouris
        else:
126 a4d0d88a Stavros Sachtouris
            print_items(
127 a4d0d88a Stavros Sachtouris
                servers[:self['limit'] if self['limit'] else len(servers)])
128 7493ccb6 Stavros Sachtouris
129 b04288f7 Stavros Sachtouris
    def main(self):
130 b04288f7 Stavros Sachtouris
        super(self.__class__, self)._run()
131 b04288f7 Stavros Sachtouris
        self._run()
132 b04288f7 Stavros Sachtouris
133 234954d1 Stavros Sachtouris
134 d486baec Stavros Sachtouris
@command(server_cmds)
135 7493ccb6 Stavros Sachtouris
class server_info(_init_cyclades):
136 67469d65 Stavros Sachtouris
    """Detailed information on a Virtual Machine
137 67469d65 Stavros Sachtouris
    Contains:
138 67469d65 Stavros Sachtouris
    - name, id, status, create/update dates
139 67469d65 Stavros Sachtouris
    - network interfaces
140 67469d65 Stavros Sachtouris
    - metadata (e.g. os, superuser) and diagnostics
141 67469d65 Stavros Sachtouris
    - hardware flavor and os image ids
142 67469d65 Stavros Sachtouris
    """
143 7493ccb6 Stavros Sachtouris
144 234954d1 Stavros Sachtouris
    def _print(self, server):
145 7493ccb6 Stavros Sachtouris
        addr_dict = {}
146 234954d1 Stavros Sachtouris
        if 'attachments' in server:
147 75c3fc42 Stavros Sachtouris
            atts = server.pop('attachments')
148 75c3fc42 Stavros Sachtouris
            for addr in atts['values']:
149 7493ccb6 Stavros Sachtouris
                ips = addr.pop('values', [])
150 7493ccb6 Stavros Sachtouris
                for ip in ips:
151 234954d1 Stavros Sachtouris
                    addr['IPv%s' % ip['version']] = ip['addr']
152 234954d1 Stavros Sachtouris
                if 'firewallProfile' in addr:
153 7493ccb6 Stavros Sachtouris
                    addr['firewall'] = addr.pop('firewallProfile')
154 7493ccb6 Stavros Sachtouris
                addr_dict[addr.pop('id')] = addr
155 75c3fc42 Stavros Sachtouris
            server['attachments'] = addr_dict if addr_dict else None
156 234954d1 Stavros Sachtouris
        if 'metadata' in server:
157 7493ccb6 Stavros Sachtouris
            server['metadata'] = server['metadata']['values']
158 08c63ef5 Stavros Sachtouris
        print_dict(server, ident=1)
159 7493ccb6 Stavros Sachtouris
160 b04288f7 Stavros Sachtouris
    @errors.generic.all
161 b04288f7 Stavros Sachtouris
    @errors.cyclades.connection
162 5a673575 Stavros Sachtouris
    @errors.cyclades.server_id
163 b04288f7 Stavros Sachtouris
    def _run(self, server_id):
164 b04288f7 Stavros Sachtouris
        server = self.client.get_server_details(server_id)
165 7493ccb6 Stavros Sachtouris
        self._print(server)
166 7493ccb6 Stavros Sachtouris
167 b04288f7 Stavros Sachtouris
    def main(self, server_id):
168 b04288f7 Stavros Sachtouris
        super(self.__class__, self)._run()
169 b04288f7 Stavros Sachtouris
        self._run(server_id=server_id)
170 b04288f7 Stavros Sachtouris
171 234954d1 Stavros Sachtouris
172 57d622b6 Stavros Sachtouris
class PersonalityArgument(KeyValueArgument):
173 234954d1 Stavros Sachtouris
    @property
174 f3e94e06 Stavros Sachtouris
    def value(self):
175 57d622b6 Stavros Sachtouris
        return self._value if hasattr(self, '_value') else []
176 234954d1 Stavros Sachtouris
177 234954d1 Stavros Sachtouris
    @value.setter
178 f3e94e06 Stavros Sachtouris
    def value(self, newvalue):
179 f3e94e06 Stavros Sachtouris
        if newvalue == self.default:
180 f3e94e06 Stavros Sachtouris
            return self.value
181 57d622b6 Stavros Sachtouris
        self._value = []
182 57d622b6 Stavros Sachtouris
        for i, terms in enumerate(newvalue):
183 57d622b6 Stavros Sachtouris
            termlist = terms.split(',')
184 57d622b6 Stavros Sachtouris
            if len(termlist) > 5:
185 de73876b Stavros Sachtouris
                msg = 'Wrong number of terms (should be 1 to 5)'
186 de73876b Stavros Sachtouris
                raiseCLIError(CLISyntaxError(msg), details=howto_personality)
187 57d622b6 Stavros Sachtouris
            path = termlist[0]
188 57d622b6 Stavros Sachtouris
            if not exists(path):
189 de73876b Stavros Sachtouris
                raiseCLIError(
190 de73876b Stavros Sachtouris
                    None,
191 8194b51b Stavros Sachtouris
                    '--personality: File %s does not exist' % path,
192 8194b51b Stavros Sachtouris
                    importance=1,
193 8194b51b Stavros Sachtouris
                    details=howto_personality)
194 57d622b6 Stavros Sachtouris
            self._value.append(dict(path=path))
195 57d622b6 Stavros Sachtouris
            with open(path) as f:
196 57d622b6 Stavros Sachtouris
                self._value[i]['contents'] = b64encode(f.read())
197 57d622b6 Stavros Sachtouris
            try:
198 57d622b6 Stavros Sachtouris
                self._value[i]['path'] = termlist[1]
199 57d622b6 Stavros Sachtouris
                self._value[i]['owner'] = termlist[2]
200 57d622b6 Stavros Sachtouris
                self._value[i]['group'] = termlist[3]
201 57d622b6 Stavros Sachtouris
                self._value[i]['mode'] = termlist[4]
202 57d622b6 Stavros Sachtouris
            except IndexError:
203 57d622b6 Stavros Sachtouris
                pass
204 f3e94e06 Stavros Sachtouris
205 234954d1 Stavros Sachtouris
206 d486baec Stavros Sachtouris
@command(server_cmds)
207 7493ccb6 Stavros Sachtouris
class server_create(_init_cyclades):
208 8194b51b Stavros Sachtouris
    """Create a server (aka Virtual Machine)
209 8194b51b Stavros Sachtouris
    Parameters:
210 439826ec Stavros Sachtouris
    - name: (single quoted text)
211 439826ec Stavros Sachtouris
    - flavor id: Hardware flavor. Pick one from: /flavor list
212 439826ec Stavros Sachtouris
    - image id: OS images. Pick one from: /image list
213 8194b51b Stavros Sachtouris
    """
214 7493ccb6 Stavros Sachtouris
215 93914390 Stavros Sachtouris
    arguments = dict(
216 93914390 Stavros Sachtouris
        personality=PersonalityArgument(
217 b04288f7 Stavros Sachtouris
            ' /// '.join(howto_personality),
218 b04288f7 Stavros Sachtouris
            '--personality')
219 93914390 Stavros Sachtouris
    )
220 f3e94e06 Stavros Sachtouris
221 b04288f7 Stavros Sachtouris
    @errors.generic.all
222 b04288f7 Stavros Sachtouris
    @errors.cyclades.connection
223 b04288f7 Stavros Sachtouris
    @errors.plankton.id
224 b04288f7 Stavros Sachtouris
    @errors.cyclades.flavor_id
225 b04288f7 Stavros Sachtouris
    def _run(self, name, flavor_id, image_id):
226 b04288f7 Stavros Sachtouris
        r = self.client.create_server(
227 b04288f7 Stavros Sachtouris
            name,
228 b04288f7 Stavros Sachtouris
            int(flavor_id),
229 b04288f7 Stavros Sachtouris
            image_id,
230 b04288f7 Stavros Sachtouris
            self['personality'])
231 b04288f7 Stavros Sachtouris
        print_dict(r)
232 b04288f7 Stavros Sachtouris
233 7493ccb6 Stavros Sachtouris
    def main(self, name, flavor_id, image_id):
234 b04288f7 Stavros Sachtouris
        super(self.__class__, self)._run()
235 b04288f7 Stavros Sachtouris
        self._run(name=name, flavor_id=flavor_id, image_id=image_id)
236 7493ccb6 Stavros Sachtouris
237 234954d1 Stavros Sachtouris
238 d486baec Stavros Sachtouris
@command(server_cmds)
239 7493ccb6 Stavros Sachtouris
class server_rename(_init_cyclades):
240 22b6f063 Stavros Sachtouris
    """Set/update a server (VM) name
241 5a673575 Stavros Sachtouris
    VM names are not unique, therefore multiple servers may share the same name
242 22b6f063 Stavros Sachtouris
    """
243 7493ccb6 Stavros Sachtouris
244 5a673575 Stavros Sachtouris
    @errors.generic.all
245 5a673575 Stavros Sachtouris
    @errors.cyclades.connection
246 5a673575 Stavros Sachtouris
    @errors.cyclades.server_id
247 5a673575 Stavros Sachtouris
    def _run(self, server_id, new_name):
248 5a673575 Stavros Sachtouris
        self.client.update_server_name(int(server_id), new_name)
249 5a673575 Stavros Sachtouris
250 7493ccb6 Stavros Sachtouris
    def main(self, server_id, new_name):
251 5a673575 Stavros Sachtouris
        super(self.__class__, self)._run()
252 5a673575 Stavros Sachtouris
        self._run(server_id=server_id, new_name=new_name)
253 234954d1 Stavros Sachtouris
254 7493ccb6 Stavros Sachtouris
255 d486baec Stavros Sachtouris
@command(server_cmds)
256 7493ccb6 Stavros Sachtouris
class server_delete(_init_cyclades):
257 22b6f063 Stavros Sachtouris
    """Delete a server (VM)"""
258 7493ccb6 Stavros Sachtouris
259 5a673575 Stavros Sachtouris
    @errors.generic.all
260 5a673575 Stavros Sachtouris
    @errors.cyclades.connection
261 5a673575 Stavros Sachtouris
    @errors.cyclades.server_id
262 5a673575 Stavros Sachtouris
    def _run(self, server_id):
263 7493ccb6 Stavros Sachtouris
            self.client.delete_server(int(server_id))
264 5a673575 Stavros Sachtouris
265 5a673575 Stavros Sachtouris
    def main(self, server_id):
266 5a673575 Stavros Sachtouris
        super(self.__class__, self)._run()
267 5a673575 Stavros Sachtouris
        self._run(server_id=server_id)
268 234954d1 Stavros Sachtouris
269 7493ccb6 Stavros Sachtouris
270 d486baec Stavros Sachtouris
@command(server_cmds)
271 7493ccb6 Stavros Sachtouris
class server_reboot(_init_cyclades):
272 22b6f063 Stavros Sachtouris
    """Reboot a server (VM)"""
273 18edacfe Stavros Sachtouris
274 93914390 Stavros Sachtouris
    arguments = dict(
275 93914390 Stavros Sachtouris
        hard=FlagArgument('perform a hard reboot', '-f')
276 93914390 Stavros Sachtouris
    )
277 7493ccb6 Stavros Sachtouris
278 5a673575 Stavros Sachtouris
    @errors.generic.all
279 5a673575 Stavros Sachtouris
    @errors.cyclades.connection
280 5a673575 Stavros Sachtouris
    @errors.cyclades.server_id
281 5a673575 Stavros Sachtouris
    def _run(self, server_id):
282 5a673575 Stavros Sachtouris
        self.client.reboot_server(int(server_id), self['hard'])
283 5a673575 Stavros Sachtouris
284 7493ccb6 Stavros Sachtouris
    def main(self, server_id):
285 5a673575 Stavros Sachtouris
        super(self.__class__, self)._run()
286 5a673575 Stavros Sachtouris
        self._run(server_id=server_id)
287 234954d1 Stavros Sachtouris
288 7493ccb6 Stavros Sachtouris
289 d486baec Stavros Sachtouris
@command(server_cmds)
290 7493ccb6 Stavros Sachtouris
class server_start(_init_cyclades):
291 22b6f063 Stavros Sachtouris
    """Start an existing server (VM)"""
292 7493ccb6 Stavros Sachtouris
293 5a673575 Stavros Sachtouris
    @errors.generic.all
294 5a673575 Stavros Sachtouris
    @errors.cyclades.connection
295 5a673575 Stavros Sachtouris
    @errors.cyclades.server_id
296 5a673575 Stavros Sachtouris
    def _run(self, server_id):
297 5a673575 Stavros Sachtouris
        self.client.start_server(int(server_id))
298 5a673575 Stavros Sachtouris
299 7493ccb6 Stavros Sachtouris
    def main(self, server_id):
300 5a673575 Stavros Sachtouris
        super(self.__class__, self)._run()
301 5a673575 Stavros Sachtouris
        self._run(server_id=server_id)
302 234954d1 Stavros Sachtouris
303 7493ccb6 Stavros Sachtouris
304 d486baec Stavros Sachtouris
@command(server_cmds)
305 7493ccb6 Stavros Sachtouris
class server_shutdown(_init_cyclades):
306 22b6f063 Stavros Sachtouris
    """Shutdown an active server (VM)"""
307 7493ccb6 Stavros Sachtouris
308 5a673575 Stavros Sachtouris
    @errors.generic.all
309 5a673575 Stavros Sachtouris
    @errors.cyclades.connection
310 5a673575 Stavros Sachtouris
    @errors.cyclades.server_id
311 5a673575 Stavros Sachtouris
    def _run(self, server_id):
312 5a673575 Stavros Sachtouris
        self.client.shutdown_server(int(server_id))
313 5a673575 Stavros Sachtouris
314 7493ccb6 Stavros Sachtouris
    def main(self, server_id):
315 5a673575 Stavros Sachtouris
        super(self.__class__, self)._run()
316 5a673575 Stavros Sachtouris
        self._run(server_id=server_id)
317 234954d1 Stavros Sachtouris
318 7493ccb6 Stavros Sachtouris
319 d486baec Stavros Sachtouris
@command(server_cmds)
320 7493ccb6 Stavros Sachtouris
class server_console(_init_cyclades):
321 22b6f063 Stavros Sachtouris
    """Get a VNC console to access an existing server (VM)
322 22b6f063 Stavros Sachtouris
    Console connection information provided (at least):
323 439826ec Stavros Sachtouris
    - host: (url or address) a VNC host
324 439826ec Stavros Sachtouris
    - port: (int) the gateway to enter VM on host
325 439826ec Stavros Sachtouris
    - password: for VNC authorization
326 22b6f063 Stavros Sachtouris
    """
327 7493ccb6 Stavros Sachtouris
328 5a673575 Stavros Sachtouris
    @errors.generic.all
329 5a673575 Stavros Sachtouris
    @errors.cyclades.connection
330 5a673575 Stavros Sachtouris
    @errors.cyclades.server_id
331 5a673575 Stavros Sachtouris
    def _run(self, server_id):
332 5a673575 Stavros Sachtouris
        r = self.client.get_server_console(int(server_id))
333 5a673575 Stavros Sachtouris
        print_dict(r)
334 5a673575 Stavros Sachtouris
335 7493ccb6 Stavros Sachtouris
    def main(self, server_id):
336 5a673575 Stavros Sachtouris
        super(self.__class__, self)._run()
337 5a673575 Stavros Sachtouris
        self._run(server_id=server_id)
338 7493ccb6 Stavros Sachtouris
339 234954d1 Stavros Sachtouris
340 d486baec Stavros Sachtouris
@command(server_cmds)
341 7493ccb6 Stavros Sachtouris
class server_firewall(_init_cyclades):
342 22b6f063 Stavros Sachtouris
    """Set the server (VM) firewall profile on VMs public network
343 22b6f063 Stavros Sachtouris
    Values for profile:
344 439826ec Stavros Sachtouris
    - DISABLED: Shutdown firewall
345 439826ec Stavros Sachtouris
    - ENABLED: Firewall in normal mode
346 439826ec Stavros Sachtouris
    - PROTECTED: Firewall in secure mode
347 22b6f063 Stavros Sachtouris
    """
348 7493ccb6 Stavros Sachtouris
349 5a673575 Stavros Sachtouris
    @errors.generic.all
350 5a673575 Stavros Sachtouris
    @errors.cyclades.connection
351 5a673575 Stavros Sachtouris
    @errors.cyclades.server_id
352 5a673575 Stavros Sachtouris
    @errors.cyclades.firewall
353 5a673575 Stavros Sachtouris
    def _run(self, server_id, profile):
354 5a673575 Stavros Sachtouris
        self.client.set_firewall_profile(
355 5a673575 Stavros Sachtouris
            server_id=int(server_id),
356 5a673575 Stavros Sachtouris
            profile=unicode(profile).upper())
357 5a673575 Stavros Sachtouris
358 7493ccb6 Stavros Sachtouris
    def main(self, server_id, profile):
359 5a673575 Stavros Sachtouris
        super(self.__class__, self)._run()
360 5a673575 Stavros Sachtouris
        self._run(server_id=server_id, profile=profile)
361 234954d1 Stavros Sachtouris
362 f3e94e06 Stavros Sachtouris
363 d486baec Stavros Sachtouris
@command(server_cmds)
364 7493ccb6 Stavros Sachtouris
class server_addr(_init_cyclades):
365 22b6f063 Stavros Sachtouris
    """List the addresses of all network interfaces on a server (VM)"""
366 7493ccb6 Stavros Sachtouris
367 5a673575 Stavros Sachtouris
    @errors.generic.all
368 5a673575 Stavros Sachtouris
    @errors.cyclades.connection
369 5a673575 Stavros Sachtouris
    @errors.cyclades.server_id
370 5a673575 Stavros Sachtouris
    def _run(self, server_id):
371 5a673575 Stavros Sachtouris
        reply = self.client.list_server_nics(int(server_id))
372 c17b8bc0 Stavros Sachtouris
        print_list(reply, with_enumeration=len(reply) > 1)
373 7493ccb6 Stavros Sachtouris
374 5a673575 Stavros Sachtouris
    def main(self, server_id):
375 5a673575 Stavros Sachtouris
        super(self.__class__, self)._run()
376 5a673575 Stavros Sachtouris
        self._run(server_id=server_id)
377 5a673575 Stavros Sachtouris
378 234954d1 Stavros Sachtouris
379 d486baec Stavros Sachtouris
@command(server_cmds)
380 7493ccb6 Stavros Sachtouris
class server_meta(_init_cyclades):
381 22b6f063 Stavros Sachtouris
    """Get a server's metadatum
382 22b6f063 Stavros Sachtouris
    Metadata are formed as key:value pairs where key is used to retrieve them
383 22b6f063 Stavros Sachtouris
    """
384 7493ccb6 Stavros Sachtouris
385 5a673575 Stavros Sachtouris
    @errors.generic.all
386 5a673575 Stavros Sachtouris
    @errors.cyclades.connection
387 5a673575 Stavros Sachtouris
    @errors.cyclades.server_id
388 5a673575 Stavros Sachtouris
    @errors.cyclades.metadata
389 5a673575 Stavros Sachtouris
    def _run(self, server_id, key=''):
390 5a673575 Stavros Sachtouris
        r = self.client.get_server_metadata(int(server_id), key)
391 5a673575 Stavros Sachtouris
        print_dict(r)
392 5a673575 Stavros Sachtouris
393 a34888b4 Stavros Sachtouris
    def main(self, server_id, key=''):
394 5a673575 Stavros Sachtouris
        super(self.__class__, self)._run()
395 5a673575 Stavros Sachtouris
        self._run(server_id=server_id, key=key)
396 7493ccb6 Stavros Sachtouris
397 234954d1 Stavros Sachtouris
398 d486baec Stavros Sachtouris
@command(server_cmds)
399 7493ccb6 Stavros Sachtouris
class server_setmeta(_init_cyclades):
400 22b6f063 Stavros Sachtouris
    """set server (VM) metadata
401 22b6f063 Stavros Sachtouris
    Metadata are formed as key:value pairs, both needed to set one
402 22b6f063 Stavros Sachtouris
    """
403 7493ccb6 Stavros Sachtouris
404 5a673575 Stavros Sachtouris
    @errors.generic.all
405 5a673575 Stavros Sachtouris
    @errors.cyclades.connection
406 5a673575 Stavros Sachtouris
    @errors.cyclades.server_id
407 5a673575 Stavros Sachtouris
    def _run(self, server_id, key, val):
408 7493ccb6 Stavros Sachtouris
        metadata = {key: val}
409 5a673575 Stavros Sachtouris
        r = self.client.update_server_metadata(int(server_id), **metadata)
410 5a673575 Stavros Sachtouris
        print_dict(r)
411 5a673575 Stavros Sachtouris
412 5a673575 Stavros Sachtouris
    def main(self, server_id, key, val):
413 5a673575 Stavros Sachtouris
        super(self.__class__, self)._run()
414 5a673575 Stavros Sachtouris
        self._run(server_id=server_id, key=key, val=val)
415 7493ccb6 Stavros Sachtouris
416 234954d1 Stavros Sachtouris
417 d486baec Stavros Sachtouris
@command(server_cmds)
418 7493ccb6 Stavros Sachtouris
class server_delmeta(_init_cyclades):
419 22b6f063 Stavros Sachtouris
    """Delete server (VM) metadata"""
420 7493ccb6 Stavros Sachtouris
421 5a673575 Stavros Sachtouris
    @errors.generic.all
422 5a673575 Stavros Sachtouris
    @errors.cyclades.connection
423 5a673575 Stavros Sachtouris
    @errors.cyclades.server_id
424 5a673575 Stavros Sachtouris
    @errors.cyclades.metadata
425 5a673575 Stavros Sachtouris
    def _run(self, server_id, key):
426 5a673575 Stavros Sachtouris
        self.client.delete_server_metadata(int(server_id), key)
427 5a673575 Stavros Sachtouris
428 7493ccb6 Stavros Sachtouris
    def main(self, server_id, key):
429 5a673575 Stavros Sachtouris
        super(self.__class__, self)._run()
430 5a673575 Stavros Sachtouris
        self._run(server_id=server_id, key=key)
431 234954d1 Stavros Sachtouris
432 7493ccb6 Stavros Sachtouris
433 d486baec Stavros Sachtouris
@command(server_cmds)
434 7493ccb6 Stavros Sachtouris
class server_stats(_init_cyclades):
435 22b6f063 Stavros Sachtouris
    """Get server (VM) statistics"""
436 7493ccb6 Stavros Sachtouris
437 5a673575 Stavros Sachtouris
    @errors.generic.all
438 5a673575 Stavros Sachtouris
    @errors.cyclades.connection
439 5a673575 Stavros Sachtouris
    @errors.cyclades.server_id
440 5a673575 Stavros Sachtouris
    def _run(self, server_id):
441 5a673575 Stavros Sachtouris
        r = self.client.get_server_stats(int(server_id))
442 5a673575 Stavros Sachtouris
        print_dict(r, exclude=('serverRef',))
443 5a673575 Stavros Sachtouris
444 7493ccb6 Stavros Sachtouris
    def main(self, server_id):
445 5a673575 Stavros Sachtouris
        super(self.__class__, self)._run()
446 5a673575 Stavros Sachtouris
        self._run(server_id=server_id)
447 7493ccb6 Stavros Sachtouris
448 234954d1 Stavros Sachtouris
449 d486baec Stavros Sachtouris
@command(server_cmds)
450 fd1f1d96 Stavros Sachtouris
class server_wait(_init_cyclades):
451 fd1f1d96 Stavros Sachtouris
    """Wait for server to finish [BUILD, STOPPED, REBOOT, ACTIVE]"""
452 fd1f1d96 Stavros Sachtouris
453 93914390 Stavros Sachtouris
    arguments = dict(
454 93914390 Stavros Sachtouris
        progress_bar=ProgressBarArgument(
455 93914390 Stavros Sachtouris
            'do not show progress bar',
456 93914390 Stavros Sachtouris
            '--no-progress-bar',
457 93914390 Stavros Sachtouris
            False
458 93914390 Stavros Sachtouris
        )
459 93914390 Stavros Sachtouris
    )
460 fd1f1d96 Stavros Sachtouris
461 5a673575 Stavros Sachtouris
    @errors.generic.all
462 5a673575 Stavros Sachtouris
    @errors.cyclades.connection
463 5a673575 Stavros Sachtouris
    @errors.cyclades.server_id
464 5a673575 Stavros Sachtouris
    def _run(self, server_id, currect_status):
465 5a673575 Stavros Sachtouris
        (progress_bar, wait_cb) = self._safe_progress_bar(
466 5a673575 Stavros Sachtouris
            'Server %s still in %s mode' % (server_id, currect_status))
467 5a673575 Stavros Sachtouris
468 6cdfdcf3 Stavros Sachtouris
        try:
469 5a673575 Stavros Sachtouris
            new_mode = self.client.wait_server(
470 5a673575 Stavros Sachtouris
                server_id,
471 6cdfdcf3 Stavros Sachtouris
                currect_status,
472 6cdfdcf3 Stavros Sachtouris
                wait_cb=wait_cb)
473 5a673575 Stavros Sachtouris
        except Exception:
474 5a673575 Stavros Sachtouris
            self._safe_progress_bar_finish(progress_bar)
475 5a673575 Stavros Sachtouris
            raise
476 5a673575 Stavros Sachtouris
        finally:
477 5a673575 Stavros Sachtouris
            self._safe_progress_bar_finish(progress_bar)
478 fd1f1d96 Stavros Sachtouris
        if new_mode:
479 a10f5561 Stavros Sachtouris
            print('Server %s is now in %s mode' % (server_id, new_mode))
480 fd1f1d96 Stavros Sachtouris
        else:
481 43ee6ae1 Stavros Sachtouris
            raiseCLIError(None, 'Time out')
482 fd1f1d96 Stavros Sachtouris
483 5a673575 Stavros Sachtouris
    def main(self, server_id, currect_status='BUILD'):
484 5a673575 Stavros Sachtouris
        super(self.__class__, self)._run()
485 5a673575 Stavros Sachtouris
        self._run(server_id=server_id, currect_status=currect_status)
486 5a673575 Stavros Sachtouris
487 fd1f1d96 Stavros Sachtouris
488 d486baec Stavros Sachtouris
@command(flavor_cmds)
489 7493ccb6 Stavros Sachtouris
class flavor_list(_init_cyclades):
490 bd40efdf Stavros Sachtouris
    """List available hardware flavors"""
491 7493ccb6 Stavros Sachtouris
492 93914390 Stavros Sachtouris
    arguments = dict(
493 bd40efdf Stavros Sachtouris
        detail=FlagArgument('show detailed output', '-l'),
494 bd40efdf Stavros Sachtouris
        limit=IntArgument('limit the number of flavors to list', '-n'),
495 bd40efdf Stavros Sachtouris
        more=FlagArgument(
496 de73876b Stavros Sachtouris
            'output results in pages (-n to set items per page, default 10)',
497 de73876b Stavros Sachtouris
            '--more')
498 93914390 Stavros Sachtouris
    )
499 7493ccb6 Stavros Sachtouris
500 5a673575 Stavros Sachtouris
    @errors.generic.all
501 5a673575 Stavros Sachtouris
    @errors.cyclades.connection
502 5a673575 Stavros Sachtouris
    def _run(self):
503 5a673575 Stavros Sachtouris
        flavors = self.client.list_flavors(self['detail'])
504 5a673575 Stavros Sachtouris
        pg_size = 10 if self['more'] and not self['limit'] else self['limit']
505 5a673575 Stavros Sachtouris
        print_items(flavors, with_redundancy=self['detail'], page_size=pg_size)
506 5a673575 Stavros Sachtouris
507 7493ccb6 Stavros Sachtouris
    def main(self):
508 5a673575 Stavros Sachtouris
        super(self.__class__, self)._run()
509 5a673575 Stavros Sachtouris
        self._run()
510 7493ccb6 Stavros Sachtouris
511 234954d1 Stavros Sachtouris
512 d486baec Stavros Sachtouris
@command(flavor_cmds)
513 7493ccb6 Stavros Sachtouris
class flavor_info(_init_cyclades):
514 769dbf53 Stavros Sachtouris
    """Detailed information on a hardware flavor
515 ddc0b290 Stavros Sachtouris
    To get a list of available flavors and flavor ids, try /flavor list
516 ddc0b290 Stavros Sachtouris
    """
517 7493ccb6 Stavros Sachtouris
518 5a673575 Stavros Sachtouris
    @errors.generic.all
519 5a673575 Stavros Sachtouris
    @errors.cyclades.connection
520 5a673575 Stavros Sachtouris
    @errors.cyclades.flavor_id
521 5a673575 Stavros Sachtouris
    def _run(self, flavor_id):
522 5a673575 Stavros Sachtouris
        flavor = self.client.get_flavor_details(int(flavor_id))
523 7493ccb6 Stavros Sachtouris
        print_dict(flavor)
524 7493ccb6 Stavros Sachtouris
525 5a673575 Stavros Sachtouris
    def main(self, flavor_id):
526 5a673575 Stavros Sachtouris
        super(self.__class__, self)._run()
527 5a673575 Stavros Sachtouris
        self._run(flavor_id=flavor_id)
528 5a673575 Stavros Sachtouris
529 234954d1 Stavros Sachtouris
530 d486baec Stavros Sachtouris
@command(network_cmds)
531 c17b8bc0 Stavros Sachtouris
class network_info(_init_cyclades):
532 ddc0b290 Stavros Sachtouris
    """Detailed information on a network
533 ddc0b290 Stavros Sachtouris
    To get a list of available networks and network ids, try /network list
534 ddc0b290 Stavros Sachtouris
    """
535 c17b8bc0 Stavros Sachtouris
536 c17b8bc0 Stavros Sachtouris
    @classmethod
537 ddc0b290 Stavros Sachtouris
    def _make_result_pretty(self, net):
538 c17b8bc0 Stavros Sachtouris
        if 'attachments' in net:
539 c17b8bc0 Stavros Sachtouris
            att = net['attachments']['values']
540 c17b8bc0 Stavros Sachtouris
            count = len(att)
541 c17b8bc0 Stavros Sachtouris
            net['attachments'] = att if count else None
542 c17b8bc0 Stavros Sachtouris
543 5a673575 Stavros Sachtouris
    @errors.generic.all
544 5a673575 Stavros Sachtouris
    @errors.cyclades.connection
545 5a673575 Stavros Sachtouris
    @errors.cyclades.network_id
546 5a673575 Stavros Sachtouris
    def _run(self, network_id):
547 5a673575 Stavros Sachtouris
        network = self.client.get_network_details(int(network_id))
548 5a673575 Stavros Sachtouris
        self._make_result_pretty(network)
549 5a673575 Stavros Sachtouris
        print_dict(network, exclude=('id'))
550 5a673575 Stavros Sachtouris
551 c17b8bc0 Stavros Sachtouris
    def main(self, network_id):
552 5a673575 Stavros Sachtouris
        super(self.__class__, self)._run()
553 5a673575 Stavros Sachtouris
        self._run(network_id=network_id)
554 c17b8bc0 Stavros Sachtouris
555 c17b8bc0 Stavros Sachtouris
556 c17b8bc0 Stavros Sachtouris
@command(network_cmds)
557 7493ccb6 Stavros Sachtouris
class network_list(_init_cyclades):
558 7493ccb6 Stavros Sachtouris
    """List networks"""
559 7493ccb6 Stavros Sachtouris
560 93914390 Stavros Sachtouris
    arguments = dict(
561 ddc0b290 Stavros Sachtouris
        detail=FlagArgument('show detailed output', '-l'),
562 ddc0b290 Stavros Sachtouris
        limit=IntArgument('limit the number of networks in list', '-n'),
563 ddc0b290 Stavros Sachtouris
        more=FlagArgument(
564 ddc0b290 Stavros Sachtouris
            'output results in pages (-n to set items per page, default 10)',
565 ddc0b290 Stavros Sachtouris
            '--more')
566 93914390 Stavros Sachtouris
    )
567 7493ccb6 Stavros Sachtouris
568 ddc0b290 Stavros Sachtouris
    def _make_results_pretty(self, nets):
569 7493ccb6 Stavros Sachtouris
        for net in nets:
570 ddc0b290 Stavros Sachtouris
            network_info._make_result_pretty(net)
571 7493ccb6 Stavros Sachtouris
572 5a673575 Stavros Sachtouris
    @errors.generic.all
573 5a673575 Stavros Sachtouris
    @errors.cyclades.connection
574 5a673575 Stavros Sachtouris
    def _run(self):
575 5a673575 Stavros Sachtouris
        networks = self.client.list_networks(self['detail'])
576 5a673575 Stavros Sachtouris
        if self['detail']:
577 5a673575 Stavros Sachtouris
            self._make_results_pretty(networks)
578 ddc0b290 Stavros Sachtouris
        if self['more']:
579 de73876b Stavros Sachtouris
            print_items(networks, page_size=self['limit'] or 10)
580 0e806947 Stavros Sachtouris
        elif self['limit']:
581 0e806947 Stavros Sachtouris
            print_items(networks[:self['limit']])
582 0e806947 Stavros Sachtouris
        else:
583 0e806947 Stavros Sachtouris
            print_items(networks)
584 7493ccb6 Stavros Sachtouris
585 5a673575 Stavros Sachtouris
    def main(self):
586 5a673575 Stavros Sachtouris
        super(self.__class__, self)._run()
587 5a673575 Stavros Sachtouris
        self._run()
588 5a673575 Stavros Sachtouris
589 234954d1 Stavros Sachtouris
590 d486baec Stavros Sachtouris
@command(network_cmds)
591 7493ccb6 Stavros Sachtouris
class network_create(_init_cyclades):
592 0e806947 Stavros Sachtouris
    """Create an (unconnected) network"""
593 7493ccb6 Stavros Sachtouris
594 93914390 Stavros Sachtouris
    arguments = dict(
595 0e806947 Stavros Sachtouris
        cidr=ValueArgument('explicitly set cidr', '--with-cidr'),
596 0e806947 Stavros Sachtouris
        gateway=ValueArgument('explicitly set gateway', '--with-gateway'),
597 0e806947 Stavros Sachtouris
        dhcp=ValueArgument('explicitly set dhcp', '--with-dhcp'),
598 0e806947 Stavros Sachtouris
        type=ValueArgument('explicitly set type', '--with-type')
599 93914390 Stavros Sachtouris
    )
600 7493ccb6 Stavros Sachtouris
601 5a673575 Stavros Sachtouris
    @errors.generic.all
602 5a673575 Stavros Sachtouris
    @errors.cyclades.connection
603 5a673575 Stavros Sachtouris
    @errors.cyclades.network_max
604 5a673575 Stavros Sachtouris
    def _run(self, name):
605 de73876b Stavros Sachtouris
        r = self.client.create_network(
606 de73876b Stavros Sachtouris
            name,
607 5a673575 Stavros Sachtouris
            cidr=self['cidr'],
608 5a673575 Stavros Sachtouris
            gateway=self['gateway'],
609 5a673575 Stavros Sachtouris
            dhcp=self['dhcp'],
610 5a673575 Stavros Sachtouris
            type=self['type'])
611 5a673575 Stavros Sachtouris
        print_items([r])
612 5a673575 Stavros Sachtouris
613 7493ccb6 Stavros Sachtouris
    def main(self, name):
614 5a673575 Stavros Sachtouris
        super(self.__class__, self)._run()
615 5a673575 Stavros Sachtouris
        self._run(name)
616 7493ccb6 Stavros Sachtouris
617 234954d1 Stavros Sachtouris
618 d486baec Stavros Sachtouris
@command(network_cmds)
619 7493ccb6 Stavros Sachtouris
class network_rename(_init_cyclades):
620 0e806947 Stavros Sachtouris
    """Set the name of a network"""
621 7493ccb6 Stavros Sachtouris
622 5a673575 Stavros Sachtouris
    @errors.generic.all
623 5a673575 Stavros Sachtouris
    @errors.cyclades.connection
624 5a673575 Stavros Sachtouris
    @errors.cyclades.network_id
625 5a673575 Stavros Sachtouris
    def _run(self, network_id, new_name):
626 5a673575 Stavros Sachtouris
        self.client.update_network_name(int(network_id), new_name)
627 5a673575 Stavros Sachtouris
628 7493ccb6 Stavros Sachtouris
    def main(self, network_id, new_name):
629 5a673575 Stavros Sachtouris
        super(self.__class__, self)._run()
630 5a673575 Stavros Sachtouris
        self._run(network_id=network_id, new_name=new_name)
631 7493ccb6 Stavros Sachtouris
632 234954d1 Stavros Sachtouris
633 d486baec Stavros Sachtouris
@command(network_cmds)
634 7493ccb6 Stavros Sachtouris
class network_delete(_init_cyclades):
635 7493ccb6 Stavros Sachtouris
    """Delete a network"""
636 7493ccb6 Stavros Sachtouris
637 5a673575 Stavros Sachtouris
    @errors.generic.all
638 5a673575 Stavros Sachtouris
    @errors.cyclades.connection
639 5a673575 Stavros Sachtouris
    @errors.cyclades.network_id
640 5a673575 Stavros Sachtouris
    @errors.cyclades.network_in_use
641 5a673575 Stavros Sachtouris
    def _run(self, network_id):
642 5a673575 Stavros Sachtouris
        self.client.delete_network(int(network_id))
643 5a673575 Stavros Sachtouris
644 7493ccb6 Stavros Sachtouris
    def main(self, network_id):
645 5a673575 Stavros Sachtouris
        super(self.__class__, self)._run()
646 5a673575 Stavros Sachtouris
        self._run(network_id=network_id)
647 7493ccb6 Stavros Sachtouris
648 234954d1 Stavros Sachtouris
649 d486baec Stavros Sachtouris
@command(network_cmds)
650 7493ccb6 Stavros Sachtouris
class network_connect(_init_cyclades):
651 7493ccb6 Stavros Sachtouris
    """Connect a server to a network"""
652 7493ccb6 Stavros Sachtouris
653 5a673575 Stavros Sachtouris
    @errors.generic.all
654 5a673575 Stavros Sachtouris
    @errors.cyclades.connection
655 5a673575 Stavros Sachtouris
    @errors.cyclades.server_id
656 5a673575 Stavros Sachtouris
    @errors.cyclades.network_id
657 5a673575 Stavros Sachtouris
    def _run(self, server_id, network_id):
658 5a673575 Stavros Sachtouris
        self.client.connect_server(int(server_id), int(network_id))
659 5a673575 Stavros Sachtouris
660 7493ccb6 Stavros Sachtouris
    def main(self, server_id, network_id):
661 5a673575 Stavros Sachtouris
        super(self.__class__, self)._run()
662 5a673575 Stavros Sachtouris
        self._run(server_id=server_id, network_id=network_id)
663 7493ccb6 Stavros Sachtouris
664 234954d1 Stavros Sachtouris
665 d486baec Stavros Sachtouris
@command(network_cmds)
666 7493ccb6 Stavros Sachtouris
class network_disconnect(_init_cyclades):
667 0e806947 Stavros Sachtouris
    """Disconnect a nic that connects a server to a network
668 0e806947 Stavros Sachtouris
    Nic ids are listed as "attachments" in detailed network information
669 439826ec Stavros Sachtouris
    To get detailed network information: /network info <network id>
670 0e806947 Stavros Sachtouris
    """
671 7493ccb6 Stavros Sachtouris
672 5a673575 Stavros Sachtouris
    @errors.cyclades.nic_format
673 5a673575 Stavros Sachtouris
    def _server_id_from_nic(self, nic_id):
674 5a673575 Stavros Sachtouris
        return nic_id.split('-')[1]
675 5a673575 Stavros Sachtouris
676 5a673575 Stavros Sachtouris
    @errors.generic.all
677 5a673575 Stavros Sachtouris
    @errors.cyclades.connection
678 5a673575 Stavros Sachtouris
    @errors.cyclades.server_id
679 5a673575 Stavros Sachtouris
    @errors.cyclades.nic_id
680 5a673575 Stavros Sachtouris
    def _run(self, nic_id, server_id):
681 5a673575 Stavros Sachtouris
        if not self.client.disconnect_server(server_id, nic_id):
682 5a673575 Stavros Sachtouris
            raise ClientError(
683 5a673575 Stavros Sachtouris
                'Network Interface %s not found on server %s' % (
684 5a673575 Stavros Sachtouris
                    nic_id,
685 5a673575 Stavros Sachtouris
                    server_id),
686 5a673575 Stavros Sachtouris
                status=404)
687 5a673575 Stavros Sachtouris
688 7493ccb6 Stavros Sachtouris
    def main(self, nic_id):
689 5a673575 Stavros Sachtouris
        super(self.__class__, self)._run()
690 5a673575 Stavros Sachtouris
        server_id = self._server_id_from_nic(nic_id=nic_id)
691 5a673575 Stavros Sachtouris
        self._run(nic_id=nic_id, server_id=server_id)