use self.get_auth_info
[sfa.git] / sfa / server / registry.py
1 #
2 # Registry is a GeniServer that implements the Registry interface
3 #
4 ### $Id$
5 ### $URL$
6 #
7
8 import tempfile
9 import os
10 import time
11 import sys
12
13 from sfa.util.geniserver import GeniServer
14 from sfa.util.geniclient import GeniClient
15 from sfa.util.genitable import GeniTable
16 from sfa.util.faults import *
17 from sfa.util.storage import *
18
19 # GeniLight client support is optional
20 try:
21     from egeni.geniLight_client import *
22 except ImportError:
23     GeniClientLight = None            
24
25 ##
26 # Registry is a GeniServer that serves registry and slice operations at PLC.
27
28 class Registry(GeniServer):
29     ##
30     # Create a new registry object.
31     #
32     # @param ip the ip address to listen on
33     # @param port the port to listen on
34     # @param key_file private key filename of registry
35     # @param cert_file certificate filename containing public key (could be a GID file)
36
37     def __init__(self, ip, port, key_file, cert_file):
38         GeniServer.__init__(self, ip, port, key_file, cert_file)
39         self.server.interface = 'registry' 
40
41
42 ##
43 # Registries is a dictionary of geniclient registry connections keyed on the registry
44 # hrn
45
46 class Registries(dict):
47
48     required_fields = ['hrn', 'addr', 'port']
49
50     def __init__(self, api, file = "/etc/sfa/registries.xml"):
51         dict.__init__(self, {})
52         self.api = api
53     
54         # create default connection dict
55         connection_dict = {}
56         for field in self.required_fields:
57             connection_dict[field] = ''
58         registries_dict = {'registries': {'registry': [connection_dict]}}
59
60         # get possible config file locations
61         loaded = False
62         path = os.path.dirname(os.path.abspath(__file__))
63         filename = file.split(os.sep)[-1]
64         alt_file = path + os.sep + filename
65         files = [file, alt_file]
66     
67         for f in files:
68             try:
69                 if os.path.isfile(f):
70                     self.registry_info = XmlStorage(f, registries_dict)
71                     loaded = True
72             except: pass
73
74         # if file is missing, just recreate it in the right place
75         if not loaded:
76             self.registry_info = XmlStorage(file, registries_dict)
77         self.registry_info.load()
78         self.connectRegistries()
79         
80     def connectRegistries(self):
81         """
82         Get connection details for the trusted peer registries from file and 
83         create an GeniClient connection to each. 
84         """
85         registries = self.registry_info['registries']['registry']
86         if isinstance(registries, dict):
87             registries = [registries]
88         if isinstance(registries, list):
89             for registry in registries:
90                 # make sure the required fields are present
91                 if not set(self.required_fields).issubset(registry.keys()):
92                     continue
93                 hrn, address, port = registry['hrn'], registry['addr'], registry['port']
94                 if not hrn or not address or not port:
95                     continue
96
97                 # check which client we should use
98                 # geniclient is default
99                 client_type = 'geniclient'
100                 if registry.has_key('client') and registry['client'] in ['geniclientlight']:
101                     client_type = 'geniclientlight'
102                 
103                 # create url
104                 url = 'http://%(address)s:%(port)s' % locals()
105
106                 # create the client connection
107                 # make sure module exists before trying to instantiate it
108                 if client_type in ['geniclientlight'] and GeniClientLight:
109                     self[hrn] = GeniClientLight(url, self.api.key_file, self.api.cert_file) 
110                 else:    
111                     self[hrn] = GeniClient(url, self.api.key_file, self.api.cert_file)
112
113         # set up a connection to the local registry
114         # connect to registry using GeniClient
115         address = self.api.config.GENI_REGISTRY_HOST
116         port = self.api.config.GENI_REGISTRY_PORT
117         url = 'http://%(address)s:%(port)s' % locals()
118         self[self.api.hrn] = GeniClient(url, self.api.key_file, self.api.cert_file)            
119