root / kamaki / clients / cyclades.py @ 6c62a96d
History | View | Annotate | Download (4.5 kB)
1 | a1c50326 | Giorgos Verigakis | # Copyright 2011 GRNET S.A. All rights reserved.
|
---|---|---|---|
2 | a1c50326 | Giorgos Verigakis | #
|
3 | a1c50326 | Giorgos Verigakis | # Redistribution and use in source and binary forms, with or
|
4 | a1c50326 | Giorgos Verigakis | # without modification, are permitted provided that the following
|
5 | a1c50326 | Giorgos Verigakis | # conditions are met:
|
6 | a1c50326 | Giorgos Verigakis | #
|
7 | a1c50326 | Giorgos Verigakis | # 1. Redistributions of source code must retain the above
|
8 | a1c50326 | Giorgos Verigakis | # copyright notice, this list of conditions and the following
|
9 | a1c50326 | Giorgos Verigakis | # disclaimer.
|
10 | a1c50326 | Giorgos Verigakis | #
|
11 | a1c50326 | Giorgos Verigakis | # 2. Redistributions in binary form must reproduce the above
|
12 | a1c50326 | Giorgos Verigakis | # copyright notice, this list of conditions and the following
|
13 | a1c50326 | Giorgos Verigakis | # disclaimer in the documentation and/or other materials
|
14 | a1c50326 | Giorgos Verigakis | # provided with the distribution.
|
15 | a1c50326 | Giorgos Verigakis | #
|
16 | a1c50326 | Giorgos Verigakis | # THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
|
17 | a1c50326 | Giorgos Verigakis | # OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
18 | a1c50326 | Giorgos Verigakis | # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
19 | a1c50326 | Giorgos Verigakis | # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
|
20 | a1c50326 | Giorgos Verigakis | # CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
21 | a1c50326 | Giorgos Verigakis | # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
22 | a1c50326 | Giorgos Verigakis | # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
|
23 | a1c50326 | Giorgos Verigakis | # USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
|
24 | a1c50326 | Giorgos Verigakis | # AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
25 | a1c50326 | Giorgos Verigakis | # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
26 | a1c50326 | Giorgos Verigakis | # ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
27 | a1c50326 | Giorgos Verigakis | # POSSIBILITY OF SUCH DAMAGE.
|
28 | a1c50326 | Giorgos Verigakis | #
|
29 | a1c50326 | Giorgos Verigakis | # The views and conclusions contained in the software and
|
30 | a1c50326 | Giorgos Verigakis | # documentation are those of the authors and should not be
|
31 | a1c50326 | Giorgos Verigakis | # interpreted as representing official policies, either expressed
|
32 | a1c50326 | Giorgos Verigakis | # or implied, of GRNET S.A.
|
33 | a1c50326 | Giorgos Verigakis | |
34 | d2cea1e2 | Giorgos Verigakis | from .compute import ComputeClient |
35 | a1c50326 | Giorgos Verigakis | |
36 | a1c50326 | Giorgos Verigakis | |
37 | d2cea1e2 | Giorgos Verigakis | class CycladesClient(ComputeClient): |
38 | d2cea1e2 | Giorgos Verigakis | """GRNet Cyclades API client"""
|
39 | d2cea1e2 | Giorgos Verigakis | |
40 | a1c50326 | Giorgos Verigakis | def start_server(self, server_id): |
41 | a1c50326 | Giorgos Verigakis | """Submit a startup request for a server specified by id"""
|
42 | 6a0b1658 | Giorgos Verigakis | |
43 | 6a0b1658 | Giorgos Verigakis | path = '/servers/%s/action' % (server_id,)
|
44 | 6a0b1658 | Giorgos Verigakis | req = {'start': {}}
|
45 | 6a0b1658 | Giorgos Verigakis | self.post(path, json=req, success=202) |
46 | a1c50326 | Giorgos Verigakis | |
47 | a1c50326 | Giorgos Verigakis | def shutdown_server(self, server_id): |
48 | a1c50326 | Giorgos Verigakis | """Submit a shutdown request for a server specified by id"""
|
49 | 6a0b1658 | Giorgos Verigakis | |
50 | 6a0b1658 | Giorgos Verigakis | path = '/servers/%s/action' % (server_id,)
|
51 | 6a0b1658 | Giorgos Verigakis | req = {'shutdown': {}}
|
52 | 6a0b1658 | Giorgos Verigakis | self.post(path, json=req, success=202) |
53 | a1c50326 | Giorgos Verigakis | |
54 | a1c50326 | Giorgos Verigakis | def get_server_console(self, server_id): |
55 | a1c50326 | Giorgos Verigakis | """Get a VNC connection to the console of a server specified by id"""
|
56 | 6a0b1658 | Giorgos Verigakis | |
57 | 6a0b1658 | Giorgos Verigakis | path = '/servers/%s/action' % (server_id,)
|
58 | 6a0b1658 | Giorgos Verigakis | req = {'console': {'type': 'vnc'}} |
59 | 6a0b1658 | Giorgos Verigakis | r = self.post(path, json=req, success=200) |
60 | 6a0b1658 | Giorgos Verigakis | return r.json['console'] |
61 | a1c50326 | Giorgos Verigakis | |
62 | a1c50326 | Giorgos Verigakis | def set_firewall_profile(self, server_id, profile): |
63 | a1c50326 | Giorgos Verigakis | """Set the firewall profile for the public interface of a server
|
64 | a1c50326 | Giorgos Verigakis |
|
65 | a1c50326 | Giorgos Verigakis | The server is specified by id, the profile argument
|
66 | a1c50326 | Giorgos Verigakis | is one of (ENABLED, DISABLED, PROTECTED).
|
67 | a1c50326 | Giorgos Verigakis | """
|
68 | 6a0b1658 | Giorgos Verigakis | path = '/servers/%s/action' % (server_id,)
|
69 | 6a0b1658 | Giorgos Verigakis | req = {'firewallProfile': {'profile': profile}} |
70 | 6a0b1658 | Giorgos Verigakis | self.post(path, json=req, success=202) |
71 | a1c50326 | Giorgos Verigakis | |
72 | a1c50326 | Giorgos Verigakis | def list_server_addresses(self, server_id, network=None): |
73 | 6a0b1658 | Giorgos Verigakis | path = '/servers/%s/ips' % (server_id,)
|
74 | a1c50326 | Giorgos Verigakis | if network:
|
75 | a1c50326 | Giorgos Verigakis | path += '/%s' % network
|
76 | 6a0b1658 | Giorgos Verigakis | r = self.get(path, success=200) |
77 | 6a0b1658 | Giorgos Verigakis | if network:
|
78 | 6a0b1658 | Giorgos Verigakis | return [r.json['network']] |
79 | 6a0b1658 | Giorgos Verigakis | else:
|
80 | 6a0b1658 | Giorgos Verigakis | return r.json['addresses']['values'] |
81 | a1c50326 | Giorgos Verigakis | |
82 | a1c50326 | Giorgos Verigakis | def get_server_stats(self, server_id): |
83 | 6a0b1658 | Giorgos Verigakis | path = '/servers/%s/stats' % (server_id,)
|
84 | 6a0b1658 | Giorgos Verigakis | r = self.get(path, success=200) |
85 | 6a0b1658 | Giorgos Verigakis | return r.json['stats'] |
86 | a1c50326 | Giorgos Verigakis | |
87 | a1c50326 | Giorgos Verigakis | |
88 | a1c50326 | Giorgos Verigakis | def list_networks(self, detail=False): |
89 | a1c50326 | Giorgos Verigakis | path = '/networks/detail' if detail else '/networks' |
90 | 6a0b1658 | Giorgos Verigakis | r = self.get(path, success=200) |
91 | 6a0b1658 | Giorgos Verigakis | return r.json['networks']['values'] |
92 | a1c50326 | Giorgos Verigakis | |
93 | a1c50326 | Giorgos Verigakis | def create_network(self, name): |
94 | 6a0b1658 | Giorgos Verigakis | req = {'network': {'name': name}} |
95 | 6a0b1658 | Giorgos Verigakis | r = self.post('/networks', json=req, success=202) |
96 | 6a0b1658 | Giorgos Verigakis | return r.json['network'] |
97 | a1c50326 | Giorgos Verigakis | |
98 | a1c50326 | Giorgos Verigakis | def get_network_details(self, network_id): |
99 | 6a0b1658 | Giorgos Verigakis | path = '/networks/%s' % (network_id,)
|
100 | 6a0b1658 | Giorgos Verigakis | r = self.get(path, success=200) |
101 | 6a0b1658 | Giorgos Verigakis | return r.json['network'] |
102 | a1c50326 | Giorgos Verigakis | |
103 | a1c50326 | Giorgos Verigakis | def update_network_name(self, network_id, new_name): |
104 | 6a0b1658 | Giorgos Verigakis | path = '/networks/%s' % (network_id,)
|
105 | 6a0b1658 | Giorgos Verigakis | req = {'network': {'name': new_name}} |
106 | 6a0b1658 | Giorgos Verigakis | self.put(path, json=req, success=204) |
107 | a1c50326 | Giorgos Verigakis | |
108 | a1c50326 | Giorgos Verigakis | def delete_network(self, network_id): |
109 | 6a0b1658 | Giorgos Verigakis | path = '/networks/%s' % (network_id,)
|
110 | 6a0b1658 | Giorgos Verigakis | self.delete(path, success=204) |
111 | a1c50326 | Giorgos Verigakis | |
112 | a1c50326 | Giorgos Verigakis | def connect_server(self, server_id, network_id): |
113 | 6a0b1658 | Giorgos Verigakis | path = '/networks/%s/action' % (network_id,)
|
114 | 6a0b1658 | Giorgos Verigakis | req = {'add': {'serverRef': server_id}} |
115 | 6a0b1658 | Giorgos Verigakis | self.post(path, json=req, success=202) |
116 | a1c50326 | Giorgos Verigakis | |
117 | a1c50326 | Giorgos Verigakis | def disconnect_server(self, server_id, network_id): |
118 | 6a0b1658 | Giorgos Verigakis | path = '/networks/%s/action' % (network_id,)
|
119 | 6a0b1658 | Giorgos Verigakis | req = {'remove': {'serverRef': server_id}} |
120 | 6a0b1658 | Giorgos Verigakis | self.post(path, json=req, success=202) |