From f97d82a8c5df063e77a57a4e10d79cf087cfcfe2 Mon Sep 17 00:00:00 2001 From: Serg Melikyan Date: Wed, 13 Mar 2013 15:49:13 +0400 Subject: [PATCH] Add ability to get status for Environments and Sessions Change-Id: I9e29fc08f98320ff6f1a70043cd42506147ada2d --- portas/portas/api/v1/__init__.py | 61 +++++++++++++++++++++- portas/portas/api/v1/active_directories.py | 5 +- portas/portas/api/v1/environments.py | 6 ++- portas/portas/api/v1/webservers.py | 5 +- 4 files changed, 72 insertions(+), 5 deletions(-) diff --git a/portas/portas/api/v1/__init__.py b/portas/portas/api/v1/__init__.py index 055e449..f36dcfd 100644 --- a/portas/portas/api/v1/__init__.py +++ b/portas/portas/api/v1/__init__.py @@ -1,4 +1,4 @@ -from portas.db.models import Session, Environment +from portas.db.models import Session, Environment, Status from portas.db.session import get_session @@ -18,4 +18,61 @@ def save_draft(session_id, draft): session = unit.query(Session).get(session_id) session.description = draft - session.save(unit) \ No newline at end of file + session.save(unit) + + +def get_env_status(environment_id, session_id): + status = 'draft' + + unit = get_session() + session_state = unit.query(Session).get(session_id).state + reports = unit.query(Status).filter_by(environment_id=environment_id, session_id=session_id).all() + + if session_state == 'deployed': + status = 'finished' + + if session_state == 'deploying' and len(reports) > 1: + status = 'pending' + + draft = get_draft(environment_id, session_id) + + if not 'services' in draft: + return 'pending' + + def get_statuses(type): + if type in draft['services']: + return [get_service_status(environment_id, session_id, service) for service in + draft['services'][type]] + else: + return [] + + is_inprogress = filter(lambda item: item == 'inprogress', + get_statuses('activeDirectories') + get_statuses('webServers')) + + if session_state == 'deploying' and is_inprogress > 1: + status = 'inprogress' + + return status + + +def get_service_status(environment_id, session_id, service): + status = 'draft' + + unit = get_session() + session_state = unit.query(Session).get(session_id).state + + entities = [unit['id'] for unit in service['units']] + reports_count = unit.query(Status).filter(Status.environment_id == environment_id + and Status.session_id == session_id + and Status.entity_id.in_(entities)).count() + + if session_state == 'deployed': + status = 'finished' + + if session_state == 'deploying' and reports_count == 0: + status = 'pending' + + if session_state == 'deploying' and reports_count > 0: + status = 'inprogress' + + return status diff --git a/portas/portas/api/v1/active_directories.py b/portas/portas/api/v1/active_directories.py index a9dffbf..fa034dd 100644 --- a/portas/portas/api/v1/active_directories.py +++ b/portas/portas/api/v1/active_directories.py @@ -1,5 +1,5 @@ from portas import utils -from portas.api.v1 import save_draft, get_draft +from portas.api.v1 import save_draft, get_draft, get_service_status from portas.common import uuidutils from portas.openstack.common import wsgi, timeutils from portas.openstack.common import log as logging @@ -13,6 +13,9 @@ class Controller(object): draft = prepare_draft(get_draft(environment_id, request.context.session)) + for dc in draft['services']['activeDirectories']: + dc['status'] = get_service_status(environment_id, request.context.session, dc) + return {'activeDirectories': draft['services']['activeDirectories']} @utils.verify_session diff --git a/portas/portas/api/v1/environments.py b/portas/portas/api/v1/environments.py index cb1abb7..39f9f31 100644 --- a/portas/portas/api/v1/environments.py +++ b/portas/portas/api/v1/environments.py @@ -1,4 +1,5 @@ from webob import exc +from portas.api.v1 import get_env_status from portas.db.session import get_session from portas.db.models import Environment from portas.openstack.common import wsgi @@ -50,7 +51,10 @@ class Controller(object): log.info('User is not authorized to access this tenant resources.') raise exc.HTTPUnauthorized - return environment.to_dict() + env = environment.to_dict() + env['status'] = get_env_status(environment_id, request.context.session) + + return env def update(self, request, environment_id, body): log.debug(_('Environments:Update '.format(environment_id, body))) diff --git a/portas/portas/api/v1/webservers.py b/portas/portas/api/v1/webservers.py index 3b22c3d..2e758e7 100644 --- a/portas/portas/api/v1/webservers.py +++ b/portas/portas/api/v1/webservers.py @@ -1,5 +1,5 @@ from portas import utils -from portas.api.v1 import save_draft, get_draft +from portas.api.v1 import save_draft, get_draft, get_service_status from portas.common import uuidutils from portas.openstack.common import wsgi, timeutils from portas.openstack.common import log as logging @@ -13,6 +13,9 @@ class Controller(object): draft = prepare_draft(get_draft(environment_id, request.context.session)) + for dc in draft['services']['webServers']: + dc['status'] = get_service_status(environment_id, request.context.session, dc) + return {'webServers': draft['services']['webServers']} @utils.verify_session