Fixed all pep8.

This commit is contained in:
Timur Nurlygayanov
2013-03-26 06:35:35 +07:00
parent c138799465
commit bb3e62bb4d
34 changed files with 203 additions and 163 deletions

View File

@@ -1,3 +1,3 @@
#!/usr/bin/env python #!/usr/bin/env python
from conductor import app from conductor import app

View File

@@ -41,12 +41,14 @@ def task_received(task, message_id):
def loop(callback): def loop(callback):
for workflow in workflows: for workflow in workflows:
workflow.execute() workflow.execute()
if not command_dispatcher.execute_pending(lambda: schedule(loop, callback)): func = lambda: schedule(loop, callback)
if not command_dispatcher.execute_pending(func):
callback() callback()
def shutdown(): def shutdown():
command_dispatcher.close() command_dispatcher.close()
rmqclient.send('task-results', json.dumps(task), message_id=message_id) rmqclient.send('task-results', json.dumps(task),
message_id=message_id)
print 'Finished at', datetime.datetime.now() print 'Finished at', datetime.datetime.now()
loop(shutdown) loop(shutdown)
@@ -61,4 +63,3 @@ def start():
rmqclient.start(start) rmqclient.start(start)
tornado.ioloop.IOLoop.instance().start() tornado.ioloop.IOLoop.instance().start()

View File

@@ -36,4 +36,3 @@ xml_code_engine.XmlCodeEngine.register_function(
xml_code_engine.XmlCodeEngine.register_function( xml_code_engine.XmlCodeEngine.register_function(
prepare_user_data, "prepare_user_data") prepare_user_data, "prepare_user_data")

View File

@@ -59,7 +59,6 @@ class HeatExecutor(CommandBase):
self._stack self._stack
]) ])
callbacks = [] callbacks = []
for t in self._pending_list: for t in self._pending_list:
if t['callback']: if t['callback']:

View File

@@ -32,7 +32,6 @@ class CommandDispatcher(command.CommandBase):
return result > 0 return result > 0
def has_pending_commands(self): def has_pending_commands(self):
result = False result = False
for command in self._command_map.values(): for command in self._command_map.values():

View File

@@ -63,4 +63,3 @@ class WindowsAgentExecutor(CommandBase):
def close(self): def close(self):
self._rmqclient.unsubscribe('-execution-results') self._rmqclient.unsubscribe('-execution-results')

View File

@@ -48,4 +48,4 @@ class Context(object):
return str(self._data) return str(self._data)
if self._parent: if self._parent:
return str(self._parent) return str(self._parent)
return str({}) return str({})

View File

@@ -38,6 +38,7 @@ def merge_dicts(dict1, dict2, max_levels=0):
result[key] = value result[key] = value
return result return result
def find(f, seq): def find(f, seq):
"""Return first item in sequence where f(item) == True.""" """Return first item in sequence where f(item) == True."""
index = 0 index = 0

View File

@@ -54,7 +54,8 @@ class RabbitMqClient(object):
del self._subscriptions[queue] del self._subscriptions[queue]
def start(self, callback=None): def start(self, callback=None):
if IOLoop is None: raise ImportError("Tornado not installed") if IOLoop is None:
raise ImportError("Tornado not installed")
self._started_callback = callback self._started_callback = callback
ioloop = IOLoop.instance() ioloop = IOLoop.instance()
self.timeout_id = ioloop.add_timeout(time.time() + 0.1, self.timeout_id = ioloop.add_timeout(time.time() + 0.1,
@@ -67,6 +68,3 @@ class RabbitMqClient(object):
callback=lambda frame: self._channel.basic_publish( callback=lambda frame: self._channel.basic_publish(
exchange=exchange, routing_key=queue, exchange=exchange, routing_key=queue,
body=data, properties=properties)) body=data, properties=properties))

View File

@@ -18,12 +18,9 @@ class Reporter(object):
self._rmqclient.send( self._rmqclient.send(
queue='task-reports', data=msg, message_id=self._task_id) queue='task-reports', data=msg, message_id=self._task_id)
def _report_func(context, id, entity, text, **kwargs): def _report_func(context, id, entity, text, **kwargs):
reporter = context['/reporter'] reporter = context['/reporter']
return reporter._report_func(id, entity, text, **kwargs) return reporter._report_func(id, entity, text, **kwargs)
xml_code_engine.XmlCodeEngine.register_function(_report_func, "report") xml_code_engine.XmlCodeEngine.register_function(_report_func, "report")

View File

@@ -3,11 +3,13 @@ import xml_code_engine
def send_command(engine, context, body, template, host, mappings=None, def send_command(engine, context, body, template, host, mappings=None,
result=None, **kwargs): result=None, **kwargs):
if not mappings: mappings = {} if not mappings:
mappings = {}
command_dispatcher = context['/commandDispatcher'] command_dispatcher = context['/commandDispatcher']
def callback(result_value): def callback(result_value):
print "Received result for %s: %s. Body is %s" % (template, result_value, body) msg = "Received result for %s: %s. Body is %s"
print msg % (template, result_value, body)
if result is not None: if result is not None:
context[result] = result_value['Result'] context[result] = result_value['Result']
@@ -22,4 +24,4 @@ def send_command(engine, context, body, template, host, mappings=None,
callback=callback) callback=callback)
xml_code_engine.XmlCodeEngine.register_function(send_command, "send-command") xml_code_engine.XmlCodeEngine.register_function(send_command, "send-command")

View File

@@ -5,6 +5,7 @@ import re
import xml_code_engine import xml_code_engine
import function_context import function_context
class Workflow(object): class Workflow(object):
def __init__(self, filename, data, command_dispatcher, config, reporter): def __init__(self, filename, data, command_dispatcher, config, reporter):
self._data = data self._data = data
@@ -84,7 +85,6 @@ class Workflow(object):
else: else:
return position + suffix.split('.') return position + suffix.split('.')
@staticmethod @staticmethod
def _select_func(context, path='', source=None, **kwargs): def _select_func(context, path='', source=None, **kwargs):
@@ -102,7 +102,6 @@ class Workflow(object):
context['/dataSource'], context['/dataSource'],
Workflow._correct_position(path, context)) Workflow._correct_position(path, context))
@staticmethod @staticmethod
def _set_func(path, context, body, engine, target=None, **kwargs): def _set_func(path, context, body, engine, target=None, **kwargs):
body_data = engine.evaluate_content(body, context) body_data = engine.evaluate_content(body, context)

View File

@@ -61,7 +61,8 @@ class XmlCodeEngine(object):
return_value = result return_value = result
if len(result) == 0: if len(result) == 0:
return_value = ''.join(parts) return_value = ''.join(parts)
if do_strip: return_value = return_value.strip() if do_strip:
return_value = return_value.strip()
elif len(result) == 1: elif len(result) == 1:
return_value = result[0] return_value = result[0]

View File

@@ -75,7 +75,7 @@ class ContextMiddleware(BaseContextMiddleware):
'auth_tok': req.headers.get('X-Auth-Token', deprecated_token), 'auth_tok': req.headers.get('X-Auth-Token', deprecated_token),
'service_catalog': service_catalog, 'service_catalog': service_catalog,
'session': req.headers.get('X-Configuration-Session') 'session': req.headers.get('X-Configuration-Session')
} }
req.context = portas.context.RequestContext(**kwargs) req.context = portas.context.RequestContext(**kwargs)
else: else:
raise webob.exc.HTTPUnauthorized() raise webob.exc.HTTPUnauthorized()
@@ -84,4 +84,4 @@ class ContextMiddleware(BaseContextMiddleware):
def factory(cls, global_conf, **local_conf): def factory(cls, global_conf, **local_conf):
def filter(app): def filter(app):
return cls(app) return cls(app)
return filter return filter

View File

@@ -27,15 +27,19 @@ def get_env_status(environment_id, session_id):
unit = get_session() unit = get_session()
if not session_id: if not session_id:
session = unit.query(Session).filter( variants = ['open', 'deploying']
Session.environment_id == environment_id and Session.state.in_(['open', 'deploying'])).first() session = unit.query(Session).filter(Session.environment_id ==
environment_id and
Session.state.in_(variants)
).first()
if session: if session:
session_id = session.id session_id = session.id
else: else:
return status return status
session_state = unit.query(Session).get(session_id).state session_state = unit.query(Session).get(session_id).state
reports_count = unit.query(Status).filter_by(environment_id=environment_id, session_id=session_id).count() reports_count = unit.query(Status).filter_by(environment_id=environment_id,
session_id=session_id).count()
if session_state == 'deployed': if session_state == 'deployed':
status = 'finished' status = 'finished'
@@ -50,13 +54,16 @@ def get_env_status(environment_id, session_id):
def get_statuses(type): def get_statuses(type):
if type in draft['services']: if type in draft['services']:
return [get_service_status(environment_id, session_id, service) for service in services = draft['services'][type]
draft['services'][type]] return [get_service_status(environment_id,
session_id,
service) for service in services]
else: else:
return [] return []
is_inprogress = filter(lambda item: item == 'inprogress', is_inprogress = filter(lambda item: item == 'inprogress',
get_statuses('activeDirectories') + get_statuses('webServers')) get_statuses('activeDirectories') +
get_statuses('webServers'))
if session_state == 'deploying' and is_inprogress > 1: if session_state == 'deploying' and is_inprogress > 1:
status = 'inprogress' status = 'inprogress'
@@ -71,10 +78,11 @@ def get_service_status(environment_id, session_id, service):
session_state = unit.query(Session).get(session_id).state session_state = unit.query(Session).get(session_id).state
entities = [u['id'] for u in service['units']] entities = [u['id'] for u in service['units']]
reports_count = unit.query(Status).filter(Status.environment_id == environment_id reports_count = unit.query(Status).filter(
and Status.session_id == session_id Status.environment_id == environment_id
and Status.entity_id.in_(entities)) \ and Status.session_id == session_id
.count() and Status.entity_id.in_(entities)
).count()
if session_state == 'deployed': if session_state == 'deployed':
status = 'finished' status = 'finished'

View File

@@ -9,18 +9,23 @@ log = logging.getLogger(__name__)
class Controller(object): class Controller(object):
def index(self, request, environment_id): def index(self, request, environment_id):
log.debug(_('ActiveDirectory:Index <EnvId: {0}>'.format(environment_id))) log.debug(_('ActiveDirectory:Index <EnvId: {0}>'.
format(environment_id)))
draft = prepare_draft(get_draft(environment_id, request.context.session)) draft = prepare_draft(get_draft(environment_id,
request.context.session))
for dc in draft['services']['activeDirectories']: for dc in draft['services']['activeDirectories']:
dc['status'] = get_service_status(environment_id, request.context.session, dc) dc['status'] = get_service_status(environment_id,
request.context.session,
dc)
return {'activeDirectories': draft['services']['activeDirectories']} return {'activeDirectories': draft['services']['activeDirectories']}
@utils.verify_session @utils.verify_session
def create(self, request, environment_id, body): def create(self, request, environment_id, body):
log.debug(_('ActiveDirectory:Create <EnvId: {0}, Body: {1}>'.format(environment_id, body))) log.debug(_('ActiveDirectory:Create <EnvId: {0}, Body: {1}>'.
format(environment_id, body)))
draft = get_draft(session_id=request.context.session) draft = get_draft(session_id=request.context.session)
@@ -33,7 +38,8 @@ class Controller(object):
for unit in active_directory['units']: for unit in active_directory['units']:
unit_count += 1 unit_count += 1
unit['id'] = uuidutils.generate_uuid() unit['id'] = uuidutils.generate_uuid()
unit['name'] = 'dc{0}{1}'.format(unit_count, active_directory['id'][:4]) unit['name'] = 'dc{0}{1}'.format(unit_count,
active_directory['id'][:4])
draft = prepare_draft(draft) draft = prepare_draft(draft)
draft['services']['activeDirectories'].append(active_directory) draft['services']['activeDirectories'].append(active_directory)
@@ -42,23 +48,25 @@ class Controller(object):
return active_directory return active_directory
def delete(self, request, environment_id, active_directory_id): def delete(self, request, environment_id, active_directory_id):
log.debug(_('ActiveDirectory:Delete <EnvId: {0}, Id: {1}>'.format(environment_id, active_directory_id))) log.debug(_('ActiveDirectory:Delete <EnvId: {0}, Id: {1}>'.
format(environment_id, active_directory_id)))
draft = get_draft(request.context.session) draft = get_draft(request.context.session)
draft['services']['activeDirectories'] = [service for service in draft['services']['activeDirectories'] if items = [service for service in draft['services']['activeDirectories']
service['id'] != active_directory_id] if service['id'] != active_directory_id]
draft['services']['activeDirectories'] = items
save_draft(request.context.session, draft) save_draft(request.context.session, draft)
def prepare_draft(draft): def prepare_draft(draft):
if not draft.has_key('services'): if not 'services' in draft:
draft['services'] = {} draft['services'] = {}
if not draft['services'].has_key('activeDirectories'): if not 'activeDirectories' in draft['services']:
draft['services']['activeDirectories'] = [] draft['services']['activeDirectories'] = []
return draft return draft
def create_resource(): def create_resource():
return wsgi.Resource(Controller()) return wsgi.Resource(Controller())

View File

@@ -61,7 +61,8 @@ class Controller(object):
return env return env
def update(self, request, environment_id, body): def update(self, request, environment_id, body):
log.debug(_('Environments:Update <Id: {0}, Body: {1}>'.format(environment_id, body))) log.debug(_('Environments:Update <Id: {0}, Body: {1}>'.
format(environment_id, body)))
session = get_session() session = get_session()
environment = session.query(Environment).get(environment_id) environment = session.query(Environment).get(environment_id)
@@ -88,4 +89,4 @@ class Controller(object):
def create_resource(): def create_resource():
return wsgi.Resource(Controller()) return wsgi.Resource(Controller())

View File

@@ -16,7 +16,8 @@
# under the License. # under the License.
import routes import routes
from portas.openstack.common import wsgi from portas.openstack.common import wsgi
from portas.api.v1 import environments, sessions, active_directories, webservers from portas.api.v1 import (environments, sessions,
active_directories, webservers)
class API(wsgi.Router): class API(wsgi.Router):
@@ -64,11 +65,13 @@ class API(wsgi.Router):
controller=sessions_resource, controller=sessions_resource,
action='delete', action='delete',
conditions={'method': ['DELETE']}) conditions={'method': ['DELETE']})
mapper.connect('/environments/{environment_id}/sessions/{session_id}/reports', mapper.connect('/environments/{environment_id}/sessions/'
'{session_id}/reports',
controller=sessions_resource, controller=sessions_resource,
action='reports', action='reports',
conditions={'method': ['GET']}) conditions={'method': ['GET']})
mapper.connect('/environments/{environment_id}/sessions/{session_id}/deploy', mapper.connect('/environments/{environment_id}/sessions/'
'{session_id}/deploy',
controller=sessions_resource, controller=sessions_resource,
action='deploy', action='deploy',
conditions={'method': ['POST']}) conditions={'method': ['POST']})
@@ -82,7 +85,8 @@ class API(wsgi.Router):
controller=activeDirectories_resource, controller=activeDirectories_resource,
action='create', action='create',
conditions={'method': ['POST']}) conditions={'method': ['POST']})
mapper.connect('/environments/{environment_id}/activeDirectories/{active_directory_id}', mapper.connect('/environments/{environment_id}/activeDirectories/'
'{active_directory_id}',
controller=activeDirectories_resource, controller=activeDirectories_resource,
action='delete', action='delete',
conditions={'method': ['DELETE']}) conditions={'method': ['DELETE']})
@@ -96,8 +100,9 @@ class API(wsgi.Router):
controller=webServers_resource, controller=webServers_resource,
action='create', action='create',
conditions={'method': ['POST']}) conditions={'method': ['POST']})
mapper.connect('/environments/{environment_id}/webServers/{web_server_id}', mapper.connect('/environments/{environment_id}/webServers/'
'{web_server_id}',
controller=webServers_resource, controller=webServers_resource,
action='delete', action='delete',
conditions={'method': ['DELETE']}) conditions={'method': ['DELETE']})
super(API, self).__init__(mapper) super(API, self).__init__(mapper)

View File

@@ -17,34 +17,44 @@ log = logging.getLogger(__name__)
class Controller(object): class Controller(object):
def __init__(self): def __init__(self):
self.write_lock = Semaphore(1) self.write_lock = Semaphore(1)
connection = amqp.Connection('{0}:{1}'.format(rabbitmq.host, rabbitmq.port), virtual_host=rabbitmq.virtual_host, connection = amqp.Connection('{0}:{1}'.
userid=rabbitmq.userid, password=rabbitmq.password, format(rabbitmq.host, rabbitmq.port),
virtual_host=rabbitmq.virtual_host,
userid=rabbitmq.userid,
password=rabbitmq.password,
ssl=rabbitmq.use_ssl, insist=True) ssl=rabbitmq.use_ssl, insist=True)
self.ch = connection.channel() self.ch = connection.channel()
self.ch.exchange_declare('tasks', 'direct', durable=True, auto_delete=False) self.ch.exchange_declare('tasks', 'direct', durable=True,
auto_delete=False)
def index(self, request, environment_id): def index(self, request, environment_id):
log.debug(_('Session:List <EnvId: {0}>'.format(environment_id))) log.debug(_('Session:List <EnvId: {0}>'.format(environment_id)))
filters = {'environment_id': environment_id, 'user_id': request.context.user} filters = {'environment_id': environment_id,
'user_id': request.context.user}
unit = get_session() unit = get_session()
configuration_sessions = unit.query(Session).filter_by(**filters) configuration_sessions = unit.query(Session).filter_by(**filters)
return {"sessions": [session.to_dict() for session in configuration_sessions if sessions = [session.to_dict() for session in configuration_sessions if
session.environment.tenant_id == request.context.tenant]} session.environment.tenant_id == request.context.tenant]
return {"sessions": sessions}
def configure(self, request, environment_id): def configure(self, request, environment_id):
log.debug(_('Session:Configure <EnvId: {0}>'.format(environment_id))) log.debug(_('Session:Configure <EnvId: {0}>'.format(environment_id)))
params = {'environment_id': environment_id, 'user_id': request.context.user, 'state': 'open'} params = {'environment_id': environment_id,
'user_id': request.context.user,
'state': 'open'}
session = Session() session = Session()
session.update(params) session.update(params)
unit = get_session() unit = get_session()
if unit.query(Session).filter(Session.environment_id == environment_id and Session.state.in_( if unit.query(Session).filter(Session.environment_id == environment_id
['open', 'deploing'])).first(): and
Session.state.in_(['open', 'deploing'])
).first():
log.info('There is already open session for this environment') log.info('There is already open session for this environment')
raise exc.HTTPConflict raise exc.HTTPConflict
@@ -58,7 +68,8 @@ class Controller(object):
return session.to_dict() return session.to_dict()
def show(self, request, environment_id, session_id): def show(self, request, environment_id, session_id):
log.debug(_('Session:Show <EnvId: {0}, SessionId: {1}>'.format(environment_id, session_id))) log.debug(_('Session:Show <EnvId: {0}, SessionId: {1}>'.
format(environment_id, session_id)))
unit = get_session() unit = get_session()
session = unit.query(Session).get(session_id) session = unit.query(Session).get(session_id)
@@ -70,14 +81,16 @@ class Controller(object):
return session.to_dict() return session.to_dict()
def delete(self, request, environment_id, session_id): def delete(self, request, environment_id, session_id):
log.debug(_('Session:Delete <EnvId: {0}, SessionId: {1}>'.format(environment_id, session_id))) log.debug(_('Session:Delete <EnvId: {0}, SessionId: {1}>'.
format(environment_id, session_id)))
unit = get_session() unit = get_session()
session = unit.query(Session).get(session_id) session = unit.query(Session).get(session_id)
comment = 'Session object in \'deploying\' state could not be deleted'
if session.state == 'deploying': if session.state == 'deploying':
log.info('Session is in \'deploying\' state. Could not be deleted.') log.info(comment)
raise exc.HTTPForbidden(comment='Session object in \'deploying\' state could not be deleted') raise exc.HTTPForbidden(comment=comment)
with unit.begin(): with unit.begin():
unit.delete(session) unit.delete(session)
@@ -85,7 +98,8 @@ class Controller(object):
return None return None
def reports(self, request, environment_id, session_id): def reports(self, request, environment_id, session_id):
log.debug(_('Session:Reports <EnvId: {0}, SessionId: {1}>'.format(environment_id, session_id))) log.debug(_('Session:Reports <EnvId: {0}, SessionId: {1}>'.
format(environment_id, session_id)))
unit = get_session() unit = get_session()
statuses = unit.query(Status).filter_by(session_id=session_id) statuses = unit.query(Status).filter_by(session_id=session_id)
@@ -93,20 +107,25 @@ class Controller(object):
return {'reports': [status.to_dict() for status in statuses]} return {'reports': [status.to_dict() for status in statuses]}
def deploy(self, request, environment_id, session_id): def deploy(self, request, environment_id, session_id):
log.debug(_('Session:Deploy <EnvId: {0}, SessionId: {1}>'.format(environment_id, session_id))) log.debug(_('Session:Deploy <EnvId: {0}, SessionId: {1}>'.
format(environment_id, session_id)))
unit = get_session() unit = get_session()
session = unit.query(Session).get(session_id) session = unit.query(Session).get(session_id)
msg = _('Could not deploy session. Session is already '
'deployed or in deployment state')
if session.state != 'open': if session.state != 'open':
log.warn(_('Could not deploy session. Session is already deployed or in deployment state')) log.warn(msg)
session.state = 'deploying' session.state = 'deploying'
session.save(unit) session.save(unit)
with self.write_lock: with self.write_lock:
self.ch.basic_publish(Message(body=anyjson.serialize(session.description)), 'tasks', 'tasks') self.ch.basic_publish(Message(body=anyjson.
serialize(session.description)),
'tasks', 'tasks')
def create_resource(): def create_resource():
return wsgi.Resource(Controller()) return wsgi.Resource(Controller())

View File

@@ -11,16 +11,19 @@ class Controller(object):
def index(self, request, environment_id): def index(self, request, environment_id):
log.debug(_('WebServer:List <EnvId: {0}>'.format(environment_id))) log.debug(_('WebServer:List <EnvId: {0}>'.format(environment_id)))
draft = prepare_draft(get_draft(environment_id, request.context.session)) draft = prepare_draft(get_draft(environment_id,
request.context.session))
for dc in draft['services']['webServers']: for dc in draft['services']['webServers']:
dc['status'] = get_service_status(environment_id, request.context.session, dc) dc['status'] = get_service_status(environment_id,
request.context.session, dc)
return {'webServers': draft['services']['webServers']} return {'webServers': draft['services']['webServers']}
@utils.verify_session @utils.verify_session
def create(self, request, environment_id, body): def create(self, request, environment_id, body):
log.debug(_('WebServer:Create <EnvId: {0}, Body: {1}>'.format(environment_id, body))) log.debug(_('WebServer:Create <EnvId: {0}, Body: {1}>'.
format(environment_id, body)))
draft = get_draft(session_id=request.context.session) draft = get_draft(session_id=request.context.session)
@@ -43,23 +46,26 @@ class Controller(object):
@utils.verify_session @utils.verify_session
def delete(self, request, environment_id, web_server_id): def delete(self, request, environment_id, web_server_id):
log.debug(_('WebServer:Delete <EnvId: {0}, Id: {1}>'.format(environment_id, web_server_id))) log.debug(_('WebServer:Delete <EnvId: {0}, Id: {1}>'.
format(environment_id, web_server_id)))
draft = get_draft(session_id=request.context.session) draft = get_draft(session_id=request.context.session)
draft['services']['webServers'] = [service for service in draft['services']['webServers'] if
service['id'] != web_server_id] elements = [service for service in draft['services']['webServers'] if
service['id'] != web_server_id]
draft['services']['webServers'] = elements
save_draft(request.context.session, draft) save_draft(request.context.session, draft)
def prepare_draft(draft): def prepare_draft(draft):
if not draft.has_key('services'): if not 'services' in draft:
draft['services'] = {} draft['services'] = {}
if not draft['services'].has_key('webServers'): if not 'webServers' in draft['services']:
draft['services']['webServers'] = [] draft['services']['webServers'] = []
return draft return draft
def create_resource(): def create_resource():
return wsgi.Resource(Controller()) return wsgi.Resource(Controller())

View File

@@ -82,6 +82,7 @@ def parse_args(args=None, usage=None, default_config_files=None):
usage=usage, usage=usage,
default_config_files=default_config_files) default_config_files=default_config_files)
def setup_logging(): def setup_logging():
""" """
Sets up the logging options for a log with supplied name Sets up the logging options for a log with supplied name

View File

@@ -45,6 +45,7 @@ class PortasException(Exception):
super(PortasException, self).__init__(message) super(PortasException, self).__init__(message)
class SchemaLoadError(PortasException): class SchemaLoadError(PortasException):
message = _("Unable to load schema: %(reason)s") message = _("Unable to load schema: %(reason)s")
@@ -52,5 +53,3 @@ class SchemaLoadError(PortasException):
class InvalidObject(PortasException): class InvalidObject(PortasException):
message = _("Provided object does not match schema " message = _("Provided object does not match schema "
"'%(schema)s': %(reason)s") "'%(schema)s': %(reason)s")

View File

@@ -27,14 +27,18 @@ class TaskResultHandlerService(service.Service):
super(TaskResultHandlerService, self).stop() super(TaskResultHandlerService, self).stop()
def _handle_results(self): def _handle_results(self):
connection = amqp.Connection('{0}:{1}'.format(rabbitmq.host, rabbitmq.port), virtual_host=rabbitmq.virtual_host, connection = amqp.Connection('{0}:{1}'.
userid=rabbitmq.userid, password=rabbitmq.password, format(rabbitmq.host, rabbitmq.port),
virtual_host=rabbitmq.virtual_host,
userid=rabbitmq.userid,
password=rabbitmq.password,
ssl=rabbitmq.use_ssl, insist=True) ssl=rabbitmq.use_ssl, insist=True)
ch = connection.channel() ch = connection.channel()
def bind(exchange, queue): def bind(exchange, queue):
if not exchange: if not exchange:
ch.exchange_declare(exchange, 'direct', durable=True, auto_delete=False) ch.exchange_declare(exchange, 'direct', durable=True,
auto_delete=False)
ch.queue_declare(queue, durable=True, auto_delete=False) ch.queue_declare(queue, durable=True, auto_delete=False)
if not exchange: if not exchange:
ch.queue_bind(queue, exchange, queue) ch.queue_bind(queue, exchange, queue)
@@ -43,13 +47,15 @@ class TaskResultHandlerService(service.Service):
bind(conf.reports_exchange, conf.reports_queue) bind(conf.reports_exchange, conf.reports_queue)
ch.basic_consume(conf.results_exchange, callback=handle_result) ch.basic_consume(conf.results_exchange, callback=handle_result)
ch.basic_consume(conf.reports_exchange, callback=handle_report, no_ack=True) ch.basic_consume(conf.reports_exchange, callback=handle_report,
no_ack=True)
while ch.callbacks: while ch.callbacks:
ch.wait() ch.wait()
def handle_report(msg): def handle_report(msg):
log.debug(_('Got report message from orchestration engine:\n{0}'.format(msg.body))) log.debug(_('Got report message from orchestration engine:\n{0}'.
format(msg.body)))
params = anyjson.deserialize(msg.body) params = anyjson.deserialize(msg.body)
params['entity_id'] = params['id'] params['entity_id'] = params['id']
@@ -61,7 +67,8 @@ def handle_report(msg):
session = get_session() session = get_session()
#connect with session #connect with session
conf_session = session.query(Session).filter_by( conf_session = session.query(Session).filter_by(
**{'environment_id': status.environment_id, 'state': 'deploying'}).first() **{'environment_id': status.environment_id,
'state': 'deploying'}).first()
status.session_id = conf_session.id status.session_id = conf_session.id
with session.begin(): with session.begin():
@@ -69,7 +76,8 @@ def handle_report(msg):
def handle_result(msg): def handle_result(msg):
log.debug(_('Got result message from orchestration engine:\n{0}'.format(msg.body))) log.debug(_('Got result message from orchestration engine:\n{0}'.
format(msg.body)))
environment_result = anyjson.deserialize(msg.body) environment_result = anyjson.deserialize(msg.body)

View File

@@ -2,4 +2,4 @@ import uuid
def generate_uuid(): def generate_uuid():
return str(uuid.uuid4()).replace('-', '') return str(uuid.uuid4()).replace('-', '')

View File

@@ -24,7 +24,9 @@ class RequestContext(object):
accesses the system, as well as additional request information. accesses the system, as well as additional request information.
""" """
def __init__(self, auth_tok=None, user=None, tenant=None, roles=None, service_catalog=None, session=None): def __init__(self, auth_tok=None, user=None, tenant=None,
roles=None, service_catalog=None, session=None):
self.auth_tok = auth_tok self.auth_tok = auth_tok
self.user = user self.user = user
self.tenant = tenant self.tenant = tenant
@@ -55,4 +57,4 @@ class RequestContext(object):
@classmethod @classmethod
def from_dict(cls, values): def from_dict(cls, values):
return cls(**values) return cls(**values)

View File

@@ -9,4 +9,4 @@ sql_connection_opt = cfg.StrOpt('sql_connection',
'Default: %(default)s') 'Default: %(default)s')
CONF = cfg.CONF CONF = cfg.CONF
CONF.register_opt(sql_connection_opt) CONF.register_opt(sql_connection_opt)

View File

@@ -11,7 +11,7 @@ Table('environment', meta,
Column('updated', DateTime(), nullable=False), Column('updated', DateTime(), nullable=False),
Column('tenant_id', String(32), nullable=False), Column('tenant_id', String(32), nullable=False),
Column('description', Text(), nullable=False), Column('description', Text(), nullable=False),
) )
Table('service', meta, Table('service', meta,
Column('id', String(32), primary_key=True), Column('id', String(32), primary_key=True),
@@ -21,7 +21,7 @@ Table('service', meta,
Column('created', DateTime, nullable=False), Column('created', DateTime, nullable=False),
Column('updated', DateTime, nullable=False), Column('updated', DateTime, nullable=False),
Column('description', Text(), nullable=False), Column('description', Text(), nullable=False),
) )
def upgrade(migrate_engine): def upgrade(migrate_engine):

View File

@@ -5,12 +5,13 @@ meta = MetaData()
session = Table('session', meta, session = Table('session', meta,
Column('id', String(32), primary_key=True), Column('id', String(32), primary_key=True),
Column('environment_id', String(32), ForeignKey('environment.id')), Column('environment_id', String(32),
ForeignKey('environment.id')),
Column('created', DateTime, nullable=False), Column('created', DateTime, nullable=False),
Column('updated', DateTime, nullable=False), Column('updated', DateTime, nullable=False),
Column('user_id', String(32), nullable=False), Column('user_id', String(32), nullable=False),
Column('state', Text(), nullable=False), Column('state', Text(), nullable=False),
) )
def upgrade(migrate_engine): def upgrade(migrate_engine):

View File

@@ -8,10 +8,11 @@ status = Table('status', meta,
Column('created', DateTime, nullable=False), Column('created', DateTime, nullable=False),
Column('updated', DateTime, nullable=False), Column('updated', DateTime, nullable=False),
Column('entity', String(10), nullable=False), Column('entity', String(10), nullable=False),
Column('environment_id', String(32), ForeignKey('environment.id')), Column('environment_id', String(32),
ForeignKey('environment.id')),
Column('session_id', String(32), ForeignKey('session.id')), Column('session_id', String(32), ForeignKey('session.id')),
Column('text', Text(), nullable=False), Column('text', Text(), nullable=False),
) )
def upgrade(migrate_engine): def upgrade(migrate_engine):

View File

@@ -5,14 +5,15 @@ from sqlalchemy.types import String, Text, DateTime
meta = MetaData() meta = MetaData()
service = Table('service', meta, service = Table('service', meta,
Column('id', String(32), primary_key=True), Column('id', String(32), primary_key=True),
Column('name', String(255), nullable=False), Column('name', String(255), nullable=False),
Column('type', String(40), nullable=False), Column('type', String(40), nullable=False),
Column('environment_id', String(32), ForeignKey('environment.id')), Column('environment_id', String(32),
Column('created', DateTime, nullable=False), ForeignKey('environment.id')),
Column('updated', DateTime, nullable=False), Column('created', DateTime, nullable=False),
Column('description', Text(), nullable=False), Column('updated', DateTime, nullable=False),
) Column('description', Text(), nullable=False),
)
def upgrade(migrate_engine): def upgrade(migrate_engine):

View File

@@ -83,7 +83,8 @@ class ModelBase(object):
def to_dict(self): def to_dict(self):
dictionary = self.__dict__.copy() dictionary = self.__dict__.copy()
return {k: v for k, v in dictionary.iteritems() if k != '_sa_instance_state'} return {k: v for k, v in dictionary.iteritems()
if k != '_sa_instance_state'}
class JsonBlob(TypeDecorator): class JsonBlob(TypeDecorator):

View File

@@ -11,8 +11,8 @@ def verify_session(func):
@functools.wraps(func) @functools.wraps(func)
def __inner(self, request, *args, **kwargs): def __inner(self, request, *args, **kwargs):
if hasattr(request, 'context') and request.context.session: if hasattr(request, 'context') and request.context.session:
uw = get_session() uw = get_session().query(Session)
configuration_session = uw.query(Session).get(request.context.session) configuration_session = uw.get(request.context.session)
if configuration_session.state != 'open': if configuration_session.state != 'open':
log.info('Session is already deployed') log.info('Session is already deployed')
@@ -22,5 +22,3 @@ def verify_session(func):
raise exc.HTTPUnauthorized raise exc.HTTPUnauthorized
return func(self, request, *args, **kwargs) return func(self, request, *args, **kwargs)
return __inner return __inner

View File

@@ -15,6 +15,6 @@
# under the License. # under the License.
from portas.openstack.common import version as common_version from portasclient.openstack.common import version as common_version
version_info = common_version.VersionInfo('python-portasclient') version_info = common_version.VersionInfo('python-portasclient')

View File

@@ -1,19 +1,29 @@
import os
import unittest import unittest
import logging import logging
from mock import MagicMock from mock import MagicMock
from mock import patch
from portasclient.client import Client as CommonClient
from portasclient.v1 import Client from portasclient.v1 import Client
import portasclient.v1.environments as environments import portasclient.v1.environments as environments
import portasclient.v1.services as services import portasclient.v1.services as services
import portasclient.v1.sessions as sessions import portasclient.v1.sessions as sessions
import portasclient.shell as shell
import portasclient.common.http as http
LOG = logging.getLogger('Unit tests') LOG = logging.getLogger('Unit tests')
def my_mock(*a, **b): def my_mock(*a, **b):
return [a, b] return [a, b]
api = MagicMock(json_request=my_mock) api = MagicMock(json_request=my_mock)
class SanityUnitTests(unittest.TestCase): class SanityUnitTests(unittest.TestCase):
def test_create_client_instance(self): def test_create_client_instance(self):
@@ -25,145 +35,121 @@ class SanityUnitTests(unittest.TestCase):
assert test_client.sessions is not None assert test_client.sessions is not None
assert test_client.activeDirectories is not None assert test_client.activeDirectories is not None
assert test_client.webServers is not None assert test_client.webServers is not None
def test_common_client(self):
endpoint = 'http://localhost:8001'
test_client = CommonClient('1', endpoint=endpoint, token='1', timeout=10)
assert test_client.environments is not None
assert test_client.sessions is not None
assert test_client.activeDirectories is not None
assert test_client.webServers is not None
def test_env_manager_list(self): def test_env_manager_list(self):
manager = environments.EnvironmentManager(api) manager = environments.EnvironmentManager(api)
result = manager.list() result = manager.list()
assert result == [] assert result == []
def test_env_manager_create(self): def test_env_manager_create(self):
manager = environments.EnvironmentManager(api) manager = environments.EnvironmentManager(api)
result = manager.create('test') result = manager.create('test')
assert result.headers == {} assert result.headers == {}
assert result.body == {'name': 'test'} assert result.body == {'name': 'test'}
def test_env_manager_delete(self): def test_env_manager_delete(self):
manager = environments.EnvironmentManager(api) manager = environments.EnvironmentManager(api)
result = manager.delete('test') result = manager.delete('test')
assert result is None assert result is None
def test_env_manager_update(self): def test_env_manager_update(self):
manager = environments.EnvironmentManager(api) manager = environments.EnvironmentManager(api)
result = manager.update('1', 'test') result = manager.update('1', 'test')
assert result.body == {'name': 'test'} assert result.body == {'name': 'test'}
def test_env_manager_get(self): def test_env_manager_get(self):
manager = environments.EnvironmentManager(api) manager = environments.EnvironmentManager(api)
result = manager.get('test') result = manager.get('test')
## WTF? ## WTF?
assert result.manager is not None assert result.manager is not None
def test_env(self):
environment = environments.Environment(api, api)
assert environment.data() is not None
def test_ad_manager_list(self): def test_ad_manager_list(self):
manager = services.ActiveDirectoryManager(api) manager = services.ActiveDirectoryManager(api)
result = manager.list('datacenter1') result = manager.list('datacenter1')
assert result == []
result = manager.list('datacenter1', '1')
assert result == [] assert result == []
def test_ad_manager_create(self): def test_ad_manager_create(self):
manager = services.ActiveDirectoryManager(api) manager = services.ActiveDirectoryManager(api)
result = manager.create('datacenter1', 'session1', 'test') result = manager.create('datacenter1', 'session1', 'test')
assert result.headers == {'X-Configuration-Session': 'session1'} assert result.headers == {'X-Configuration-Session': 'session1'}
assert result.body == 'test' assert result.body == 'test'
#@unittest.skip("https://mirantis.jira.com/browse/KEERO-218") #@unittest.skip("https://mirantis.jira.com/browse/KEERO-218")
def test_ad_manager_delete(self): def test_ad_manager_delete(self):
manager = services.ActiveDirectoryManager(api) manager = services.ActiveDirectoryManager(api)
result = manager.delete('datacenter1', 'session1', 'test') result = manager.delete('datacenter1', 'session1', 'test')
assert result is None assert result is None
def test_iis_manager_list(self): def test_iis_manager_list(self):
manager = services.WebServerManager(api) manager = services.WebServerManager(api)
result = manager.list('datacenter1') result = manager.list('datacenter1')
assert result == []
result = manager.list('datacenter1', '1')
assert result == [] assert result == []
def test_iis_manager_create(self): def test_iis_manager_create(self):
manager = services.WebServerManager(api) manager = services.WebServerManager(api)
result = manager.create('datacenter1', 'session1', 'test') result = manager.create('datacenter1', 'session1', 'test')
assert result.headers == {'X-Configuration-Session': 'session1'} assert result.headers == {'X-Configuration-Session': 'session1'}
assert result.body == 'test' assert result.body == 'test'
#@unittest.skip("https://mirantis.jira.com/browse/KEERO-218") #@unittest.skip("https://mirantis.jira.com/browse/KEERO-218")
def test_iis_manager_delete(self): def test_iis_manager_delete(self):
manager = services.WebServerManager(api) manager = services.WebServerManager(api)
result = manager.delete('datacenter1', 'session1', 'test') result = manager.delete('datacenter1', 'session1', 'test')
assert result is None assert result is None
def test_service_ad(self):
service_ad = services.ActiveDirectory(api, api)
assert service_ad.data() is not None
def test_service_iis(self):
service_iis = services.ActiveDirectory(api, api)
assert service_iis.data() is not None
def test_session_manager_list(self): def test_session_manager_list(self):
manager = sessions.SessionManager(api) manager = sessions.SessionManager(api)
result = manager.list('datacenter1') result = manager.list('datacenter1')
assert result == [] assert result == []
def test_session_manager_delete(self): def test_session_manager_delete(self):
manager = sessions.SessionManager(api) manager = sessions.SessionManager(api)
result = manager.delete('datacenter1', 'session1') result = manager.delete('datacenter1', 'session1')
assert result is None assert result is None
def test_session_manager_get(self): def test_session_manager_get(self):
manager = sessions.SessionManager(api) manager = sessions.SessionManager(api)
result = manager.get('datacenter1', 'session1') result = manager.get('datacenter1', 'session1')
# WTF? # WTF?
assert result.manager is not None assert result.manager is not None
def test_session_manager_configure(self): def test_session_manager_configure(self):
manager = sessions.SessionManager(api) manager = sessions.SessionManager(api)
result = manager.configure('datacenter1') result = manager.configure('datacenter1')
assert result.headers == {} assert result.headers == {}
def test_session_manager_deploy(self): def test_session_manager_deploy(self):
manager = sessions.SessionManager(api) manager = sessions.SessionManager(api)
result = manager.deploy('datacenter1', '1') result = manager.deploy('datacenter1', '1')
assert result is None assert result is None
#@unittest.skip("https://mirantis.jira.com/browse/KEERO-219") #@unittest.skip("https://mirantis.jira.com/browse/KEERO-219")
def test_session_manager_reports(self): def test_session_manager_reports(self):
manager = sessions.SessionManager(api) manager = sessions.SessionManager(api)
result = manager.reports('datacenter1', '1') result = manager.reports('datacenter1', '1')
assert result == [] assert result == []