diff --git a/portas/portas/api/v1/router.py b/portas/portas/api/v1/router.py index 5a18601..0312883 100644 --- a/portas/portas/api/v1/router.py +++ b/portas/portas/api/v1/router.py @@ -64,11 +64,13 @@ class API(wsgi.Router): controller=sessions_resource, action='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, action='reports', conditions={'method': ['GET']}) - mapper.connect('/environments/{environment_id}/sessions/{session_id}/deploy', + mapper.connect('/environments/{environment_id}/sessions/' + '{session_id}/deploy', controller=sessions_resource, action='deploy', conditions={'method': ['POST']}) @@ -82,7 +84,8 @@ class API(wsgi.Router): controller=activeDirectories_resource, action='create', conditions={'method': ['POST']}) - mapper.connect('/environments/{environment_id}/activeDirectories/{active_directory_id}', + mapper.connect('/environments/{environment_id}/activeDirectories/' + '{active_directory_id}', controller=activeDirectories_resource, action='delete', conditions={'method': ['DELETE']}) @@ -96,7 +99,8 @@ class API(wsgi.Router): controller=webServers_resource, action='create', conditions={'method': ['POST']}) - mapper.connect('/environments/{environment_id}/webServers/{web_server_id}', + mapper.connect('/environments/{environment_id}/webServers/' + '{web_server_id}', controller=webServers_resource, action='delete', conditions={'method': ['DELETE']}) diff --git a/portas/portas/api/v1/sessions.py b/portas/portas/api/v1/sessions.py index dd12cea..a980136 100644 --- a/portas/portas/api/v1/sessions.py +++ b/portas/portas/api/v1/sessions.py @@ -17,34 +17,41 @@ log = logging.getLogger(__name__) class Controller(object): def __init__(self): self.write_lock = Semaphore(1) - connection = amqp.Connection('{0}:{1}'.format(rabbitmq.host, rabbitmq.port), virtual_host=rabbitmq.virtual_host, - userid=rabbitmq.userid, password=rabbitmq.password, - ssl=rabbitmq.use_ssl, insist=True) + connection = amqp.Connection( + '{0}:{1}'.format(rabbitmq.host, rabbitmq.port), + virtual_host=rabbitmq.virtual_host, + userid=rabbitmq.userid, password=rabbitmq.password, + ssl=rabbitmq.use_ssl, insist=True) 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): log.debug(_('Session:List '.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() configuration_sessions = unit.query(Session).filter_by(**filters) - return {"sessions": [session.to_dict() for session in configuration_sessions if - session.environment.tenant_id == request.context.tenant]} + return { + "sessions": [session.to_dict() for session in configuration_sessions if + session.environment.tenant_id == request.context.tenant]} def configure(self, request, environment_id): log.debug(_('Session:Configure '.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.update(params) unit = get_session() - if unit.query(Session).filter(Session.environment_id == environment_id and Session.state.in_( - ['open', 'deploing'])).first(): + if unit.query(Session).filter( + Session.environment_id == environment_id and Session.state.in_( + ['open', 'deploing'])).first(): log.info('There is already open session for this environment') raise exc.HTTPConflict @@ -58,7 +65,9 @@ class Controller(object): return session.to_dict() def show(self, request, environment_id, session_id): - log.debug(_('Session:Show '.format(environment_id, session_id))) + log.debug(_( + 'Session:Show '.format(environment_id, + session_id))) unit = get_session() session = unit.query(Session).get(session_id) @@ -70,14 +79,17 @@ class Controller(object): return session.to_dict() def delete(self, request, environment_id, session_id): - log.debug(_('Session:Delete '.format(environment_id, session_id))) + log.debug(_('Session:Delete '.format( + environment_id, session_id))) unit = get_session() session = unit.query(Session).get(session_id) if session.state == 'deploying': - log.info('Session is in \'deploying\' state. Could not be deleted.') - raise exc.HTTPForbidden(comment='Session object in \'deploying\' state could not be deleted') + log.info( + 'Session is in \'deploying\' state. Could not be deleted.') + raise exc.HTTPForbidden( + comment='Session object in \'deploying\' state could not be deleted') with unit.begin(): unit.delete(session) @@ -85,27 +97,51 @@ class Controller(object): return None def reports(self, request, environment_id, session_id): - log.debug(_('Session:Reports '.format(environment_id, session_id))) + log.debug(_('Session:Reports '.format( + environment_id, session_id))) unit = get_session() statuses = unit.query(Status).filter_by(session_id=session_id) + result = statuses - return {'reports': [status.to_dict() for status in statuses]} + if request.GET['service_id']: + service_id = request.GET['service_id'] + + environment = unit.query(Session).get(session_id).description + services = environment['services']['activeDirectories'] + services += environment['services']['webServers'] + + service = [service for service in services + if service['id'] == service_id][0] + + if service: + entities = [u['id'] for u in service['units']] + entities.append(service_id) + result = [] + for status in statuses: + if status['id'] in entities: + result.append(status) + + return {'reports': [status.to_dict() for status in result]} def deploy(self, request, environment_id, session_id): - log.debug(_('Session:Deploy '.format(environment_id, session_id))) + log.debug(_('Session:Deploy '.format( + environment_id, session_id))) unit = get_session() session = unit.query(Session).get(session_id) if session.state != 'open': - log.warn(_('Could not deploy session. Session is already deployed or in deployment state')) + log.warn(_( + 'Could not deploy session. Session is already deployed or in deployment state')) session.state = 'deploying' session.save(unit) 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(): diff --git a/python-portasclient/portasclient/v1/sessions.py b/python-portasclient/portasclient/v1/sessions.py index 200078b..fbcbc9f 100644 --- a/python-portasclient/portasclient/v1/sessions.py +++ b/python-portasclient/portasclient/v1/sessions.py @@ -54,11 +54,13 @@ class SessionManager(base.Manager): path.format(id=environment_id, session_id=session_id)) - def reports(self, environment_id, session_id): + def reports(self, environment_id, session_id, service_id=None): path = 'environments/{id}/sessions/{session_id}/reports' - resp, body = self.api.json_request('GET', - path.format(id=environment_id, - session_id=session_id)) + path = path.format(id=environment_id, session_id=session_id) + if service_id: + path += '?service_id={0}'.format(service_id) + + resp, body = self.api.json_request('GET', path) data = body['reports'] return [Status(self, res, loaded=True) for res in data if res]