Merge branch 'master' of ssh://git.onelab.eu/git/sfa
[sfa.git] / sfa / openstack / euca_shell.py
1 try:
2     import boto
3     from boto.ec2.regioninfo import RegionInfo
4     from boto.exception import EC2ResponseError
5     has_boto=True
6 except:
7     has_boto=False    
8
9 from sfa.util.sfalogging import logger
10 from sfa.openstack.nova_shell import NovaShell
11 from sfa.util.config import Config
12
13 class EucaShell:
14     """
15     A xmlrpc connection to the euca api. 
16     """    
17
18     def __init__(self, config):
19         self.config = config
20         self.nova_shell = NovaShell(config)
21         self.access_key = None
22         self.secret_key = None
23
24     def _init_ctx(self, username=None, project=None):
25         if username and project:
26             self.access_key = "%s:%s" % (username, project)
27             self.secret_key = self.nova_shell.auth_manager.get_user(username).secret
28         else:
29             admin_user = self.nova_shell.auth_manager.get_user(self.config.SFA_NOVA_USER)
30             #access_key = admin_user.access
31             self.access_key = '%s' % admin_user.name
32             self.secret_key = admin_user.secret
33         
34
35
36     def get_euca_connection(self, username=None, project=None):
37         if not has_boto:
38             logger.info('Unable to access EC2 API - boto library not found.')
39             return None
40
41         if username and project:
42             self._init_ctx(username, project)
43         elif not self.access_key or not self.secret_key:
44             self._init_ctx()
45         
46         url = self.config.SFA_NOVA_API_URL
47         host = None
48         port = None    
49         path = "/"
50         use_ssl = False
51         # Split the url into parts 
52         if url.find('https://') >= 0:
53             use_ssl  = True
54             url = url.replace('https://', '')
55         elif url.find('http://') >= 0:
56             use_ssl  = False
57             url = url.replace('http://', '')
58         parts = url.split(':')
59         host = parts[0]
60         if len(parts) > 1:
61             parts = parts[1].split('/')
62             port = int(parts[0])
63             parts = parts[1:]
64             path = '/'+'/'.join(parts)
65         return boto.connect_ec2(aws_access_key_id=self.access_key,
66                                 aws_secret_access_key=self.secret_key,
67                                 is_secure=use_ssl,
68                                 region=RegionInfo(None, 'eucalyptus', host),
69                                 host=host,
70                                 port=port,
71                                 path=path) 
72
73     def __getattr__(self, name):
74         def func(*args, **kwds):
75             conn = self.get_euca_connection()
76