initialize glance client with ca_ssl_cert
[plstackapi.git] / planetstack / openstack / client.py
1 import urlparse
2 try:
3     from keystoneclient.v2_0 import client as keystone_client
4     #from glance import client as glance_client
5     import glanceclient
6     from novaclient.v1_1 import client as nova_client
7     from neutronclient.v2_0 import client as quantum_client
8     has_openstack = True
9 except:
10     has_openstack = False
11
12 from planetstack.config import Config
13
14 def require_enabled(callable):
15     def wrapper(*args, **kwds):
16         if has_openstack:
17             return callable(*args, **kwds)
18         else:
19             return None
20     return wrapper
21
22 def parse_novarc(filename):
23     opts = {}
24     f = open(filename, 'r')
25     for line in f:
26         try:
27             line = line.replace('export', '').strip()
28             parts = line.split('=')
29             if len(parts) > 1:
30                 value = parts[1].replace("\'", "")
31                 value = value.replace('\"', '')
32                 opts[parts[0]] = value
33         except:
34             pass
35     f.close()
36     return opts
37
38 class Client:
39     def __init__(self, username=None, password=None, tenant=None, url=None, token=None, endpoint=None, controller=None, admin=True, *args, **kwds):
40        
41         self.has_openstack = has_openstack
42         self.url = controller.auth_url
43         if admin:
44             self.username = controller.admin_user
45             self.password = controller.admin_password
46             self.tenant = controller.admin_tenant
47         else:
48             self.username = None
49             self.password = None
50             self.tenant = None
51
52         if username:
53             self.username = username
54         if password:
55             self.password = password
56         if tenant:
57             self.tenant = tenant
58         if url:
59             self.url = url
60         if token:
61             self.token = token    
62         if endpoint:
63             self.endpoint = endpoint
64
65         #if '@' in self.username:
66         #    self.username = self.username[:self.username.index('@')]
67
68 class KeystoneClient(Client):
69     def __init__(self, *args, **kwds):
70         Client.__init__(self, *args, **kwds)
71         if has_openstack:
72             self.client = keystone_client.Client(username=self.username,
73                                                  password=self.password,
74                                                  tenant_name=self.tenant,
75                                                  auth_url=self.url
76                                                 )
77
78     @require_enabled
79     def connect(self, *args, **kwds):
80         self.__init__(*args, **kwds)
81
82     @require_enabled
83     def __getattr__(self, name):
84         return getattr(self.client, name)
85
86
87 class Glance(Client):
88     def __init__(self, *args, **kwds):
89         Client.__init__(self, *args, **kwds)
90         if has_openstack:
91             self.client = glanceclient.get_client(host='0.0.0.0',
92                                                    username=self.username,
93                                                    password=self.password,
94                                                    tenant=self.tenant,
95                                                    auth_url=self.url)
96     @require_enabled
97     def __getattr__(self, name):
98         return getattr(self.client, name)
99
100 class GlanceClient(Client):
101     def __init__(self, version, endpoint, token, cacert=None, *args, **kwds):
102         Client.__init__(self, *args, **kwds)
103         if has_openstack:
104             self.client = glanceclient.Client(version, 
105                 endpoint=endpoint, 
106                 token=token,
107                 cacert=cacert
108             )
109
110     @require_enabled
111     def __getattr__(self, name):
112         return getattr(self.client, name)        
113
114 class NovaClient(Client):
115     def __init__(self, *args, **kwds):
116         Client.__init__(self, *args, **kwds)
117         if has_openstack:
118             self.client = nova_client.Client(username=self.username,
119                                              api_key=self.password,
120                                              project_id=self.tenant,
121                                              auth_url=self.url,
122                                              region_name='',
123                                              extensions=[],
124                                              service_type='compute',
125                                              service_name='',
126                                              )
127
128     @require_enabled
129     def connect(self, *args, **kwds):
130         self.__init__(*args, **kwds)
131
132     @require_enabled
133     def __getattr__(self, name):
134         return getattr(self.client, name)
135
136 class NovaDB(Client):
137     def __init__(self, *args, **kwds):
138         Client.__init__(self, *args, **kwds)
139         if has_openstack:
140             self.ctx = get_admin_context()
141             nova_db_api.FLAGS(default_config_files=['/etc/nova/nova.conf'])
142             self.client = nova_db_api
143
144
145     @require_enabled
146     def connect(self, *args, **kwds):
147         self.__init__(*args, **kwds)
148
149     @require_enabled
150     def __getattr__(self, name):
151         return getattr(self.client, name)
152
153 class QuantumClient(Client):
154     def __init__(self, *args, **kwds):
155         Client.__init__(self, *args, **kwds)
156         if has_openstack:
157             self.client = quantum_client.Client(username=self.username,
158                                                 password=self.password,
159                                                 tenant_name=self.tenant,
160                                                 auth_url=self.url)
161     @require_enabled
162     def connect(self, *args, **kwds):
163         self.__init__(*args, **kwds)
164
165     @require_enabled
166     def __getattr__(self, name):
167         return getattr(self.client, name)
168
169 class OpenStackClient:
170     """
171     A simple native shell to the openstack backend services.
172     This class can receive all nova calls to the underlying testbed
173     """
174
175     def __init__ ( self, *args, **kwds) :
176         # instantiate managers
177         self.keystone = KeystoneClient(*args, **kwds)
178         url_parsed = urlparse.urlparse(self.keystone.url)
179         hostname = url_parsed.netloc.split(':')[0]
180         token = self.keystone.client.tokens.authenticate(username=self.keystone.username, password=self.keystone.password, tenant_name=self.keystone.tenant)
181         glance_endpoint = self.keystone.service_catalog.url_for(service_type='image', endpoint_type='publicURL')
182         
183         self.glanceclient = GlanceClient('1', endpoint=glance_endpoint, token=token.id, **kwds)
184         self.nova = NovaClient(*args, **kwds)
185         # self.nova_db = NovaDB(*args, **kwds)
186         self.quantum = QuantumClient(*args, **kwds)
187     
188
189     @require_enabled
190     def connect(self, *args, **kwds):
191         self.__init__(*args, **kwds)
192
193     @require_enabled
194     def authenticate(self):
195         return self.keystone.authenticate()