34 from ec2.base.s3action
import S3Action
38 os.path.join(os.path.dirname(os.path.abspath(__file__)),
'../..')
40 from ec2.settings
import CLM_ADDRESS
41 from common.utils
import ServerProxy
42 from ec2.base.action
import Action, CLMException
43 from ec2.error
import AuthFailure, EC2Exception, InvalidZone
44 import ec2.address, ec2.image, ec2.instance, ec2.key_pair, ec2.region, ec2.universal, ec2.volume, ec2.security_group
45 import ec2.s3.s3bucket, ec2.s3.s3object
52 from StringIO
import StringIO
53 xmlschema = lxml.etree.XMLSchema(file=
'./restapi/ec2/base/ec2.xsd')
56 doc = lxml.etree.parse(StringIO(response))
58 xmlschema.assertValid(doc)
59 print "Validation [PASS]"
60 except lxml.etree.DocumentInvalid, error:
61 print "Validation [FAIL]", error
71 def __init__(self, uri, aws_key=None, parameters=None, signature=None):
83 self._proxy_server.send_request(
"guest/cluster/list_names/")[
'data']
89 cluster_manager_data[
'cluster_id'],
90 cluster_manager_data[
'name'],
93 cluster_managers.append(cluster_manager)
94 return cluster_managers
97 cluster_manager =
None
99 name = by_environ[
'HTTP_HOST'].split(
'.')[0]
109 if cm.name == by_name:
112 return cluster_manager
129 data[
'parameters'] = self.cloud_manager.parameters
131 data[
'login'] = self.cloud_manager.aws_key
132 data[
'Signature'] = self.cloud_manager.signature
133 url =
'/' +
'/'.join(self.
_rest_url) +
'/'
137 clm = self.cloud_manager._proxy_server
140 response = clm.send_request(url, **data)
142 response = clm.send_request(url)
143 status = response[
'status']
144 response_data = response[
'data']
147 raise CLMException(status, url, response_data)
151 self._rest_url.append(name)
155 return "<ClusterManager(id=%s, name=%s)>" % (self.
id, self.
name)
167 def _environ_to_parameters(environ):
168 method = environ[
'REQUEST_METHOD']
170 query_string = environ[
'wsgi.input'].read(int(environ.get(
'CONTENT_LENGTH', 0)))
171 elif method ==
'GET' or method ==
'PUT' or method ==
'HEAD':
172 query_string = environ[
'QUERY_STRING']
174 raise Exception(
'Unsupported request method: %s' % method)
178 for key, value
in urlparse.parse_qs(query_string, keep_blank_values=
True).iteritems():
179 parameters[key] = value
if len(value) != 1
else value[0]
183 if parameters.get(
'Action'):
185 if environ.get(
'HTTP_HOST'):
186 parameters[
'Endpoint'] = environ[
'HTTP_HOST']
187 parameters[
'Method'] = method
194 if env.startswith(prefix):
195 parameters[env[len(prefix):].lower()] = environ[env]
197 parameters[
'path_info'] = environ.get(
'PATH_INFO')
198 parameters[
'request_method'] = environ.get(
'REQUEST_METHOD')
199 parameters[
'query_string'] = environ.get(
'QUERY_STRING')
or ''
201 parameters[
'content_type'] = environ.get(
'CONTENT_TYPE')
or ''
202 if not parameters.get(
'content_md5'):
203 parameters[
'content_md5'] =
''
206 parameters[
'input'] = environ.get(
'wsgi.input')
207 parameters[
'file_wrapper'] = environ.get(
'wsgi.file_wrapper')
208 parameters[
'content_length'] = environ.get(
'CONTENT_LENGTH')
or ''
211 print 15*
'=',
'PARAMETERS', 15*
'='
212 for u, v
in parameters.iteritems():
221 def _application(environ, start_response):
222 print 25*
'=',
'NEW REQUEST', 25*
'='
223 parameters = _environ_to_parameters(environ)
227 if not parameters.get(
'Action'):
228 s3_action = S3Action(parameters)
230 response = s3_action.execute()
231 if response[
'headers']:
232 headers = [(
'Content-Type',
'text/xml;charset=UTF-8')] + response[
'headers']
234 headers = [(
'Content-Type',
'text/xml;charset=UTF-8')]
235 start_response(
'200 OK', headers)
236 response = response[
'body']
237 except EC2Exception, error:
238 response = error.to_xml()
239 print 'Error:', error.code,
'.', error.message
240 start_response(
'400 Bad Request', [(
'Content-Type',
'application/xml;charset=UTF-8')])
247 aws_key=parameters.get(
'AWSAccessKeyId'),
248 parameters=parameters,
249 signature=parameters.get(
'Signature'),
251 cluster_manager_name = environ[
'HTTP_HOST'].split(
'.')[0]
252 cluster_manager = cloud_manager.get_cluster_manager(
253 by_name=cluster_manager_name
256 if not cluster_manager:
257 raise InvalidZone.NotFound(zone_name=cluster_manager_name)
258 action = Action(parameters, cluster_manager)
259 response = action.execute()
260 start_response(
'200 OK', [(
'Content-Type',
'text/xml;charset=UTF-8')])
261 except EC2Exception, error:
262 http_code =
'400 Bad Request'
263 if isinstance(error, AuthFailure):
264 http_code =
'401 Unauthorized'
265 response = error.to_xml()
266 start_response(http_code, [(
'Content-Type',
'text/xml;charset=UTF-8')])
274 return _application(environ, start_response)
275 except Exception, error:
277 start_response(
'500 Internal Server Error', [(
'Content-Type',
'text/plain')])
283 response = traceback.format_exc()
286 response =
'500 Internal Server Error'