the big cleanup: deprecate federica driver
[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
14 class EucaShell:
15     """
16     A xmlrpc connection to the euca api. 
17     """
18
19     def __init__(self, config):
20         self.config = config
21         self.nova_shell = NovaShell(config)
22         self.access_key = None
23         self.secret_key = None
24
25     def init_context(self, project_name=None):
26
27         # use the context of the specified  project's project
28         # manager.
29         if project_name:
30             project = self.nova_shell.auth_manager.get_project(project_name)
31             self.access_key = "%s:%s" % (
32                 project.project_manager.name, project_name)
33             self.secret_key = project.project_manager.secret
34         else:
35             # use admin user's context
36             admin_user = self.nova_shell.auth_manager.get_user(
37                 self.config.SFA_NOVA_USER)
38             #access_key = admin_user.access
39             self.access_key = '%s' % admin_user.name
40             self.secret_key = admin_user.secret
41
42     def get_euca_connection(self, project_name=None):
43         if not has_boto:
44             logger.info('Unable to access EC2 API - boto library not found.')
45             return None
46
47         if not self.access_key or not self.secret_key:
48             self.init_context(project_name)
49
50         url = self.config.SFA_NOVA_API_URL
51         host = None
52         port = None
53         path = "/"
54         use_ssl = False
55         # Split the url into parts
56         if url.find('https://') >= 0:
57             use_ssl = True
58             url = url.replace('https://', '')
59         elif url.find('http://') >= 0:
60             use_ssl = False
61             url = url.replace('http://', '')
62         parts = url.split(':')
63         host = parts[0]
64         if len(parts) > 1:
65             parts = parts[1].split('/')
66             port = int(parts[0])
67             parts = parts[1:]
68             path = '/' + '/'.join(parts)
69         return boto.connect_ec2(aws_access_key_id=self.access_key,
70                                 aws_secret_access_key=self.secret_key,
71                                 is_secure=use_ssl,
72                                 region=RegionInfo(None, 'eucalyptus', host),
73                                 host=host,
74                                 port=port,
75                                 path=path)
76
77     def __getattr__(self, name):
78         def func(*args, **kwds):
79             conn = self.get_euca_connection()