Revision 528550d9 kamaki/clients/astakos/__init__.py

b/kamaki/clients/astakos/__init__.py
32 32
# or implied, of GRNET S.A.
33 33

  
34 34
from kamaki.clients import Client, ClientError
35
from logging import getLogger
36

  
37

  
35 38

  
36 39

  
37 40
class AstakosClient(Client):
38 41
    """Synnefo Astakos API client"""
39 42

  
40
    def __init__(self, base_url, token):
43
    def __init__(self, base_url, token=None):
41 44
        super(AstakosClient, self).__init__(base_url, token)
42 45
        self._cache = {}
46
        self.log = getLogger('__name__')
43 47

  
44 48
    def authenticate(self, token=None):
45 49
        """Get authentication information and store it in this client
......
51 55
        :returns: (dict) authentication information
52 56
        """
53 57
        self.token = token or self.token
54
        self._cache[self.token] = self.get('/astakos/api/authenticate').json
58
        self._cache[self.token] = self.get('/tokens').json
55 59
        return self._cache[self.token]
56 60

  
57
    def list(self):
58
        """list cached user information"""
61
    def get_services(self, token=None):
62
        """
63
        :returns: (list) [{name:..., type:..., endpoints:[...]}, ...]
64
        """
65
        token_bu = self.token or token
66
        token = token or self.token
67
        try:
68
            r = self._cache[token]
69
        except KeyError:
70
            r = self.authenticate(token)
71
        finally:
72
            self.token = token_bu
73
        return r['serviceCatalog']
74

  
75
    def get_service_details(self, service_type, token=None):
76
        """
77
        :param service_type: (str) compute, object-store, image, account, etc.
78

  
79
        :returns: (dict) {name:..., type:..., endpoints:[...]}
80

  
81
        :raises ClientError: (600) if service_type not in service catalog
82
        """
83
        services = self.get_services(token)
84
        for service in services:
85
            try:
86
                if service['type'].lower() == service_type.lower():
87
                    return service
88
            except KeyError:
89
                self.log.warning('Misformated service %s' % service)
90
        raise ClientError(
91
            'Service type "%s" not in service catalog' % service_type, 600)
92

  
93
    def get_service_endpoints(self, service_type, version=None, token=None):
94
        """
95
        :param service_type: (str) can be compute, object-store, etc.
96

  
97
        :param version: (str) the version id of the service
98

  
99
        :returns: (dict) {SNF:uiURL, adminURL, internalURL, publicURL, ...}
100

  
101
        :raises ClientError: (600) if service_type not in service catalog
102

  
103
        :raises ClientError: (601) if #matching endpoints != 1
104
        """
105
        service = self.get_service_details(service_type, token)
106
        matches = []
107
        for endpoint in service['endpoints']:
108

  
109
            if (not version) or (
110
                    endpoint['version_id'].lower() == version.lower()):
111
                matches.append(endpoint)
112
        if len(matches) != 1:
113
            raise ClientError(
114
                '%s endpoints match type %s %s' % (
115
                    len(matches), service_type,
116
                    ('and version_id %s' % version) if version else ''),
117
                601)
118
        return matches[0]
119

  
120
    def list_users(self):
121
        """list cached users information"""
59 122
        r = []
60 123
        for k, v in self._cache.items():
61
            r.append(dict(v))
124
            r.append(dict(v['user']))
62 125
            r[-1].update(dict(auth_token=k))
63 126
        return r
64 127

  
65
    def info(self, token=None):
128
    def user_info(self, token=None):
66 129
        """Get (cached) user information"""
67
        token_bu = self.token
130
        token_bu = self.token or token
68 131
        token = token or self.token
69 132
        try:
70 133
            r = self._cache[token]
71 134
        except KeyError:
72 135
            r = self.authenticate(token)
73
        self.token = token_bu
74
        return r
136
        finally:
137
            self.token = token_bu
138
        return r['user']
75 139

  
76 140
    def term(self, key, token=None):
77 141
        """Get (cached) term, from user credentials"""
78
        return self.info(token).get(key, None)
142
        return self.user_info(token).get(key, None)

Also available in: Unified diff