Statistics
| Branch: | Tag: | Revision:

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)