From c1036ebb7c729904c7f2c44b28649486c1656cf7 Mon Sep 17 00:00:00 2001 From: Serg Melikyan Date: Mon, 11 Mar 2013 21:17:37 +0400 Subject: [PATCH 01/21] Fixed issue with empty services list --- python-portasclient/portasclient/common/base.py | 2 ++ python-portasclient/portasclient/v1/services.py | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/python-portasclient/portasclient/common/base.py b/python-portasclient/portasclient/common/base.py index 47a4afd..4115a84 100644 --- a/python-portasclient/portasclient/common/base.py +++ b/python-portasclient/portasclient/common/base.py @@ -56,6 +56,8 @@ class Manager(object): obj_class = self.resource_class if response_key: + if not body.has_key(response_key): + body[response_key] = [] data = body[response_key] else: data = body diff --git a/python-portasclient/portasclient/v1/services.py b/python-portasclient/portasclient/v1/services.py index f58bbbf..84a76f1 100644 --- a/python-portasclient/portasclient/v1/services.py +++ b/python-portasclient/portasclient/v1/services.py @@ -54,7 +54,7 @@ class WebServer(base.Resource): class WebServerManager(base.Manager): - resource_class = ActiveDirectory + resource_class = WebServer def list(self, environment_id, session_id): headers = {'X-Configuration-Session': session_id} From c3a040ca6b90e4778886cd1f77db5c008429d47e Mon Sep 17 00:00:00 2001 From: Serg Melikyan Date: Tue, 12 Mar 2013 13:06:43 +0400 Subject: [PATCH 02/21] Add debug logging for controllers --- portas/portas/api/v1/active_directories.py | 6 ++++++ portas/portas/api/v1/environments.py | 10 +++++++++- portas/portas/api/v1/sessions.py | 13 +++++++++++++ portas/portas/api/v1/webservers.py | 6 ++++++ 4 files changed, 34 insertions(+), 1 deletion(-) diff --git a/portas/portas/api/v1/active_directories.py b/portas/portas/api/v1/active_directories.py index 2487cee..10e6773 100644 --- a/portas/portas/api/v1/active_directories.py +++ b/portas/portas/api/v1/active_directories.py @@ -10,6 +10,8 @@ log = logging.getLogger(__name__) class Controller(object): @utils.verify_session def index(self, request, environment_id): + log.debug(_('ActiveDirectory:Index '.format(environment_id))) + draft = get_draft(request.context.session) if not draft.has_key('services'): @@ -22,6 +24,8 @@ class Controller(object): @utils.verify_session def create(self, request, environment_id, body): + log.debug(_('ActiveDirectory:Create '.format(environment_id, body))) + draft = get_draft(request.context.session) active_directory = body.copy() @@ -42,6 +46,8 @@ class Controller(object): return active_directory def delete(self, request, environment_id, active_directory_id): + log.debug(_('ActiveDirectory:Delete '.format(environment_id, active_directory_id))) + draft = get_draft(request.context.session) draft['services']['activeDirectories'] = [service for service in draft['services']['activeDirectories'] if service['id'] != active_directory_id] diff --git a/portas/portas/api/v1/environments.py b/portas/portas/api/v1/environments.py index 040aa10..cb1abb7 100644 --- a/portas/portas/api/v1/environments.py +++ b/portas/portas/api/v1/environments.py @@ -10,7 +10,7 @@ log = logging.getLogger(__name__) class Controller(object): def index(self, request): - log.debug(_("Display list of environments")) + log.debug(_('Environments:List')) #Only environments from same tenant as users should be shown filters = {'tenant_id': request.context.tenant} @@ -21,6 +21,8 @@ class Controller(object): return {"environments": [env.to_dict() for env in environments]} def create(self, request, body): + log.debug(_('Environments:Create '.format(body))) + #tagging environment by tenant_id for later checks params = body.copy() params['tenant_id'] = request.context.tenant @@ -39,6 +41,8 @@ class Controller(object): return environment.to_dict() def show(self, request, environment_id): + log.debug(_('Environments:Show '.format(environment_id))) + session = get_session() environment = session.query(Environment).get(environment_id) @@ -49,6 +53,8 @@ class Controller(object): return environment.to_dict() def update(self, request, environment_id, body): + log.debug(_('Environments:Update '.format(environment_id, body))) + session = get_session() environment = session.query(Environment).get(environment_id) @@ -62,6 +68,8 @@ class Controller(object): return environment.to_dict() def delete(self, request, environment_id): + log.debug(_('Environments:Delete '.format(environment_id))) + session = get_session() environment = session.query(Environment).get(environment_id) diff --git a/portas/portas/api/v1/sessions.py b/portas/portas/api/v1/sessions.py index b7ce024..a909366 100644 --- a/portas/portas/api/v1/sessions.py +++ b/portas/portas/api/v1/sessions.py @@ -24,6 +24,9 @@ class Controller(object): 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} unit = get_session() @@ -33,6 +36,8 @@ class Controller(object): 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'} session = Session() @@ -53,6 +58,8 @@ class Controller(object): return session.to_dict() def show(self, request, environment_id, session_id): + log.debug(_('Session:Show '.format(environment_id, session_id))) + unit = get_session() session = unit.query(Session).get(session_id) @@ -63,6 +70,8 @@ class Controller(object): return session.to_dict() def delete(self, request, environment_id, session_id): + log.debug(_('Session:Delete '.format(environment_id, session_id))) + unit = get_session() session = unit.query(Session).get(session_id) @@ -76,12 +85,16 @@ class Controller(object): return None def reports(self, request, 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) return {'reports': [status.to_dict() for status in statuses]} def deploy(self, request, environment_id, session_id): + log.debug(_('Session:Deploy '.format(environment_id, session_id))) + unit = get_session() session = unit.query(Session).get(session_id) diff --git a/portas/portas/api/v1/webservers.py b/portas/portas/api/v1/webservers.py index a5c3c5e..e93a5f7 100644 --- a/portas/portas/api/v1/webservers.py +++ b/portas/portas/api/v1/webservers.py @@ -10,6 +10,8 @@ log = logging.getLogger(__name__) class Controller(object): @utils.verify_session def index(self, request, environment_id): + log.debug(_('WebServer:List '.format(environment_id))) + draft = get_draft(request.context.session) if not draft.has_key('services'): @@ -22,6 +24,8 @@ class Controller(object): @utils.verify_session def create(self, request, environment_id, body): + log.debug(_('WebServer:Create '.format(environment_id, body))) + draft = get_draft(request.context.session) webServer = body.copy() @@ -43,6 +47,8 @@ class Controller(object): @utils.verify_session def delete(self, request, environment_id, web_server_id): + log.debug(_('WebServer:Delete '.format(environment_id, web_server_id))) + draft = get_draft(request.context.session) draft['services']['webServers'] = [service for service in draft['services']['webServers'] if service['id'] != web_server_id] From 1d98866235f54e1c9b3d4bcbf280006e6a6759bd Mon Sep 17 00:00:00 2001 From: Serg Melikyan Date: Tue, 12 Mar 2013 13:37:27 +0400 Subject: [PATCH 03/21] Queues should be durable --- portas/portas/common/service.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/portas/portas/common/service.py b/portas/portas/common/service.py index f9a13cf..a5dabec 100644 --- a/portas/portas/common/service.py +++ b/portas/portas/common/service.py @@ -35,7 +35,7 @@ class TaskResultHandlerService(service.Service): def bind(exchange, queue): if not exchange: ch.exchange_declare(exchange, 'direct', durable=True, auto_delete=False) - ch.queue_declare(queue) + ch.queue_declare(queue, durable=True, auto_delete=False) if not exchange: ch.queue_bind(queue, exchange, queue) From d9beabe845d9d033d0d07c958405d60658c5f49b Mon Sep 17 00:00:00 2001 From: Serg Melikyan Date: Tue, 12 Mar 2013 16:19:33 +0400 Subject: [PATCH 04/21] Fixed issue with logging --- portas/portas/api/v1/active_directories.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/portas/portas/api/v1/active_directories.py b/portas/portas/api/v1/active_directories.py index 10e6773..6263f07 100644 --- a/portas/portas/api/v1/active_directories.py +++ b/portas/portas/api/v1/active_directories.py @@ -10,7 +10,7 @@ log = logging.getLogger(__name__) class Controller(object): @utils.verify_session def index(self, request, environment_id): - log.debug(_('ActiveDirectory:Index '.format(environment_id))) + log.debug(_('ActiveDirectory:Index '.format(environment_id))) draft = get_draft(request.context.session) From df9834018cdf44ed7da1d40e8de6ca8aa3f982c4 Mon Sep 17 00:00:00 2001 From: Serg Melikyan Date: Tue, 12 Mar 2013 17:17:40 +0400 Subject: [PATCH 05/21] FIx issue with fields created & updated --- portas/portas/api/v1/active_directories.py | 4 ++-- portas/portas/api/v1/webservers.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/portas/portas/api/v1/active_directories.py b/portas/portas/api/v1/active_directories.py index 6263f07..01d75f1 100644 --- a/portas/portas/api/v1/active_directories.py +++ b/portas/portas/api/v1/active_directories.py @@ -30,8 +30,8 @@ class Controller(object): active_directory = body.copy() active_directory['id'] = uuidutils.generate_uuid() - active_directory['created'] = timeutils.utcnow - active_directory['updated'] = timeutils.utcnow + active_directory['created'] = str(timeutils.utcnow()) + active_directory['updated'] = str(timeutils.utcnow()) unit_count = 0 for unit in active_directory['units']: diff --git a/portas/portas/api/v1/webservers.py b/portas/portas/api/v1/webservers.py index e93a5f7..70e7da8 100644 --- a/portas/portas/api/v1/webservers.py +++ b/portas/portas/api/v1/webservers.py @@ -30,8 +30,8 @@ class Controller(object): webServer = body.copy() webServer['id'] = uuidutils.generate_uuid() - webServer['created'] = timeutils.utcnow - webServer['updated'] = timeutils.utcnow + webServer['created'] = str(timeutils.utcnow()) + webServer['updated'] = str(timeutils.utcnow()) unit_count = 0 for unit in webServer['units']: From f0b954db21baae07d73b5f8f7911f6be91f259da Mon Sep 17 00:00:00 2001 From: Serg Melikyan Date: Tue, 12 Mar 2013 17:35:09 +0400 Subject: [PATCH 06/21] Resolved issue with reports from orchestration engine --- portas/portas/common/service.py | 10 +++++++--- .../006_add_entity_id_column_to_status.py | 17 +++++++++++++++++ portas/portas/db/models.py | 3 ++- 3 files changed, 26 insertions(+), 4 deletions(-) create mode 100644 portas/portas/db/migrate_repo/versions/006_add_entity_id_column_to_status.py diff --git a/portas/portas/common/service.py b/portas/portas/common/service.py index a5dabec..ba62045 100644 --- a/portas/portas/common/service.py +++ b/portas/portas/common/service.py @@ -42,8 +42,8 @@ class TaskResultHandlerService(service.Service): bind(conf.results_exchange, conf.results_queue) bind(conf.reports_exchange, conf.reports_queue) - ch.basic_consume(conf.results_exchange, callback=handle_result) - ch.basic_consume(conf.reports_exchange, callback=handle_report) + ch.basic_consume(conf.results_exchange, callback=handle_result, no_ack=True) + ch.basic_consume(conf.reports_exchange, callback=handle_report, no_ack=True) while ch.callbacks: ch.wait() @@ -51,8 +51,12 @@ class TaskResultHandlerService(service.Service): def handle_report(msg): log.debug(_('Got report message from orchestration engine:\n{0}'.format(msg.body))) + params = anyjson.deserialize(msg.body) + params['entity_id'] = params['id'] + del params['id'] + status = Status() - status.update(anyjson.deserialize(msg.body)) + status.update(params) session = get_session() #connect with session diff --git a/portas/portas/db/migrate_repo/versions/006_add_entity_id_column_to_status.py b/portas/portas/db/migrate_repo/versions/006_add_entity_id_column_to_status.py new file mode 100644 index 0000000..e96dd7d --- /dev/null +++ b/portas/portas/db/migrate_repo/versions/006_add_entity_id_column_to_status.py @@ -0,0 +1,17 @@ +from sqlalchemy.schema import MetaData, Table, Column +from sqlalchemy.types import String + +meta = MetaData() + + +def upgrade(migrate_engine): + meta.bind = migrate_engine + status = Table('status', meta, autoload=True) + entity_id = Column('entity_id', String(32), nullable=True) + entity_id.create(status) + + +def downgrade(migrate_engine): + meta.bind = migrate_engine + status = Table('status', meta, autoload=True) + status.c.entity_id.drop() diff --git a/portas/portas/db/models.py b/portas/portas/db/models.py index bdfa0e6..412d1fb 100644 --- a/portas/portas/db/models.py +++ b/portas/portas/db/models.py @@ -132,7 +132,8 @@ class Session(BASE, ModelBase): class Status(BASE, ModelBase): __tablename__ = 'status' - id = Column(String(32), primary_key=True) + id = Column(String(32), primary_key=True, default=uuidutils.generate_uuid) + entity_id = Column(String(32), nullable=False) entity = Column(String(10), nullable=False) environment_id = Column(String(32), ForeignKey('environment.id')) session_id = Column(String(32), ForeignKey('session.id')) From e55a720091f33effe66e1db8eba7177243195811 Mon Sep 17 00:00:00 2001 From: Serg Melikyan Date: Tue, 12 Mar 2013 17:51:12 +0400 Subject: [PATCH 07/21] No ack is needed when auto_ack set to True Change-Id: Ieb00f2b9ee705a8772cf150ed96ff8ab0a583c83 --- portas/portas/common/service.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/portas/portas/common/service.py b/portas/portas/common/service.py index ba62045..49fe664 100644 --- a/portas/portas/common/service.py +++ b/portas/portas/common/service.py @@ -67,8 +67,6 @@ def handle_report(msg): with session.begin(): session.add(status) - msg.channel.basic_ack(msg.delivery_tag) - def handle_result(msg): log.debug(_('Got result message from orchestration engine:\n{0}'.format(msg.body))) From 8015cb7f9a00f29ad304d124759dadaed9e2011a Mon Sep 17 00:00:00 2001 From: Serg Melikyan Date: Tue, 12 Mar 2013 18:21:13 +0400 Subject: [PATCH 08/21] Issue with session Session could no be created when another session is deploing or open on same environment --- portas/portas/api/v1/sessions.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/portas/portas/api/v1/sessions.py b/portas/portas/api/v1/sessions.py index a909366..dd12cea 100644 --- a/portas/portas/api/v1/sessions.py +++ b/portas/portas/api/v1/sessions.py @@ -26,7 +26,6 @@ class Controller(object): def index(self, request, environment_id): log.debug(_('Session:List '.format(environment_id))) - filters = {'environment_id': environment_id, 'user_id': request.context.user} unit = get_session() @@ -44,7 +43,8 @@ class Controller(object): session.update(params) unit = get_session() - if unit.query(Session).filter_by(**{'environment_id': environment_id, 'state': 'open'}).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 From 4143081a8970e3e75b7dd12626e36e4511efad1f Mon Sep 17 00:00:00 2001 From: Serg Melikyan Date: Tue, 12 Mar 2013 18:34:59 +0400 Subject: [PATCH 09/21] Change behaviour of viewing services User can now get list of services without session at all. Python client is updated accordingly Change-Id: Ic35ce73b4b6237e9f7d42e87b853cbcbaff058b8 --- portas/portas/api/v1/__init__.py | 14 +++++++++----- portas/portas/api/v1/active_directories.py | 9 +-------- portas/portas/api/v1/webservers.py | 9 +-------- python-portasclient/portasclient/v1/services.py | 16 ++++++++++++---- 4 files changed, 23 insertions(+), 25 deletions(-) diff --git a/portas/portas/api/v1/__init__.py b/portas/portas/api/v1/__init__.py index 2cb29e7..f71dd4b 100644 --- a/portas/portas/api/v1/__init__.py +++ b/portas/portas/api/v1/__init__.py @@ -1,12 +1,16 @@ -from portas.db.models import Session +from portas.db.models import Session, Environment from portas.db.session import get_session -def get_draft(session_id): +def get_draft(environment_id, session_id): unit = get_session() - session = unit.query(Session).get(session_id) - - return session.description + #TODO: When session is deployed should be returned env.description + if session_id: + session = unit.query(Session).get(session_id) + return session.description + else: + environment = unit.query(Environment).get(environment_id) + return environment.description def save_draft(session_id, draft): diff --git a/portas/portas/api/v1/active_directories.py b/portas/portas/api/v1/active_directories.py index 01d75f1..2f84cfe 100644 --- a/portas/portas/api/v1/active_directories.py +++ b/portas/portas/api/v1/active_directories.py @@ -8,17 +8,10 @@ log = logging.getLogger(__name__) class Controller(object): - @utils.verify_session def index(self, request, environment_id): log.debug(_('ActiveDirectory:Index '.format(environment_id))) - draft = get_draft(request.context.session) - - if not draft.has_key('services'): - return dict() - - if not draft['services'].has_key('activeDirectories'): - return dict() + draft = prepare_draft(get_draft(environment_id, request.context.session)) return {'activeDirectories': draft['services']['activeDirectories']} diff --git a/portas/portas/api/v1/webservers.py b/portas/portas/api/v1/webservers.py index 70e7da8..16ff4c8 100644 --- a/portas/portas/api/v1/webservers.py +++ b/portas/portas/api/v1/webservers.py @@ -8,17 +8,10 @@ log = logging.getLogger(__name__) class Controller(object): - @utils.verify_session def index(self, request, environment_id): log.debug(_('WebServer:List '.format(environment_id))) - draft = get_draft(request.context.session) - - if not draft.has_key('services'): - return dict() - - if not draft['services'].has_key('webServers'): - return dict() + draft = prepare_draft(get_draft(environment_id, request.context.session)) return {'webServers': draft['services']['webServers']} diff --git a/python-portasclient/portasclient/v1/services.py b/python-portasclient/portasclient/v1/services.py index 84a76f1..fe2a16d 100644 --- a/python-portasclient/portasclient/v1/services.py +++ b/python-portasclient/portasclient/v1/services.py @@ -27,8 +27,12 @@ class ActiveDirectory(base.Resource): class ActiveDirectoryManager(base.Manager): resource_class = ActiveDirectory - def list(self, environment_id, session_id): - headers = {'X-Configuration-Session': session_id} + def list(self, environment_id, session_id=None): + if session_id: + headers = {'X-Configuration-Session': session_id} + else: + headers = {} + return self._list('environments/{id}/activeDirectories'.format(id=environment_id), 'activeDirectories', headers=headers) @@ -56,8 +60,12 @@ class WebServer(base.Resource): class WebServerManager(base.Manager): resource_class = WebServer - def list(self, environment_id, session_id): - headers = {'X-Configuration-Session': session_id} + def list(self, environment_id, session_id=None): + if session_id: + headers = {'X-Configuration-Session': session_id} + else: + headers = {} + return self._list('environments/{id}/webServers'.format(id=environment_id), 'webServers', headers=headers) From 56633295b6ba7cce49acab67abd0d1a8da6da213 Mon Sep 17 00:00:00 2001 From: Serg Melikyan Date: Tue, 12 Mar 2013 20:27:11 +0400 Subject: [PATCH 10/21] Another Issue with sessions --- portas/portas/api/v1/__init__.py | 2 +- portas/portas/api/v1/active_directories.py | 2 +- portas/portas/api/v1/webservers.py | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/portas/portas/api/v1/__init__.py b/portas/portas/api/v1/__init__.py index f71dd4b..055e449 100644 --- a/portas/portas/api/v1/__init__.py +++ b/portas/portas/api/v1/__init__.py @@ -2,7 +2,7 @@ from portas.db.models import Session, Environment from portas.db.session import get_session -def get_draft(environment_id, session_id): +def get_draft(environment_id=None, session_id=None): unit = get_session() #TODO: When session is deployed should be returned env.description if session_id: diff --git a/portas/portas/api/v1/active_directories.py b/portas/portas/api/v1/active_directories.py index 2f84cfe..a9dffbf 100644 --- a/portas/portas/api/v1/active_directories.py +++ b/portas/portas/api/v1/active_directories.py @@ -19,7 +19,7 @@ class Controller(object): def create(self, request, environment_id, body): log.debug(_('ActiveDirectory:Create '.format(environment_id, body))) - draft = get_draft(request.context.session) + draft = get_draft(session_id=request.context.session) active_directory = body.copy() active_directory['id'] = uuidutils.generate_uuid() diff --git a/portas/portas/api/v1/webservers.py b/portas/portas/api/v1/webservers.py index 16ff4c8..3b22c3d 100644 --- a/portas/portas/api/v1/webservers.py +++ b/portas/portas/api/v1/webservers.py @@ -19,7 +19,7 @@ class Controller(object): def create(self, request, environment_id, body): log.debug(_('WebServer:Create '.format(environment_id, body))) - draft = get_draft(request.context.session) + draft = get_draft(session_id=request.context.session) webServer = body.copy() webServer['id'] = uuidutils.generate_uuid() @@ -42,7 +42,7 @@ class Controller(object): def delete(self, request, environment_id, web_server_id): log.debug(_('WebServer:Delete '.format(environment_id, web_server_id))) - draft = get_draft(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] save_draft(request.context.session, draft) From bbe3ae4b89f7e4727695aa0db1062701f2536582 Mon Sep 17 00:00:00 2001 From: Stan Lagun Date: Tue, 12 Mar 2013 22:32:53 +0400 Subject: [PATCH 11/21] Updated workflow elements to reflect new name changes and to fix typos --- conductor/data/templates/agent/AskDnsIp.template | 2 +- conductor/data/workflows/AD.xml | 2 +- conductor/data/workflows/IIS.xml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/conductor/data/templates/agent/AskDnsIp.template b/conductor/data/templates/agent/AskDnsIp.template index ee2057c..a9f6ee3 100644 --- a/conductor/data/templates/agent/AskDnsIp.template +++ b/conductor/data/templates/agent/AskDnsIp.template @@ -1,6 +1,6 @@ { "Scripts": [ - "ZnVuY3Rpb24gR2V0LURuc0xpc3RlbmluZ0lwQWRkcmVzc2VzIHsNCiAgICAoR2V0LUROU1NlcnZlciAtQ29tcHV0ZXJOYW1lIGxvY2FsaG9zdCkuU2VydmVyU2V0dGluZy5MaXN0ZW5pbmdJcEFkZHJlc3MNCn0NCg==" + "ZnVuY3Rpb24gR2V0LURuc0xpc3RlbmluZ0lwQWRkcmVzcyB7DQogICAgSW1wb3J0LU1vZHVsZSBEbnNTZXJ2ZXINCiAgICAoR2V0LUROU1NlcnZlciAtQ29tcHV0ZXJOYW1lIGxvY2FsaG9zdCkuU2VydmVyU2V0dGluZy5MaXN0ZW5pbmdJcEFkZHJlc3MgfA0KICAgICAgICBXaGVyZS1PYmplY3QgeyAkXyAtbWF0Y2ggIlxkezEsM31cLlxkezEsM31cLlxkezEsM31cLlxkezEsM30iIH0NCn0NCg==" ], "Commands": [ { diff --git a/conductor/data/workflows/AD.xml b/conductor/data/workflows/AD.xml index 751d477..929069f 100644 --- a/conductor/data/workflows/AD.xml +++ b/conductor/data/workflows/AD.xml @@ -25,7 +25,7 @@ keero-linux-keys m1.medium - ws-2012-full-agent + ws-2012-full diff --git a/conductor/data/workflows/IIS.xml b/conductor/data/workflows/IIS.xml index 40bf0ab..67b26be 100644 --- a/conductor/data/workflows/IIS.xml +++ b/conductor/data/workflows/IIS.xml @@ -25,7 +25,7 @@ keero-linux-keys m1.medium - ws-2012-full-agent + ws-2012-full From dbfd119576e11ba54cfbc156c308e544a69f337f Mon Sep 17 00:00:00 2001 From: Stan Lagun Date: Tue, 12 Mar 2013 22:34:02 +0400 Subject: [PATCH 12/21] ExecutionPlanGenerator DSL processor --- .../ExecutionPlanGenerator/App.config | 6 + .../ExecutionPlanGenerator.csproj | 62 ++++++++ .../ExecutionPlanGenerator/Program.cs | 141 ++++++++++++++++++ .../Properties/AssemblyInfo.cs | 36 +++++ .../ExecutionPlanGenerator/packages.config | 4 + 5 files changed, 249 insertions(+) create mode 100644 WindowsAgent/ExecutionPlanGenerator/App.config create mode 100644 WindowsAgent/ExecutionPlanGenerator/ExecutionPlanGenerator.csproj create mode 100644 WindowsAgent/ExecutionPlanGenerator/Program.cs create mode 100644 WindowsAgent/ExecutionPlanGenerator/Properties/AssemblyInfo.cs create mode 100644 WindowsAgent/ExecutionPlanGenerator/packages.config diff --git a/WindowsAgent/ExecutionPlanGenerator/App.config b/WindowsAgent/ExecutionPlanGenerator/App.config new file mode 100644 index 0000000..8e15646 --- /dev/null +++ b/WindowsAgent/ExecutionPlanGenerator/App.config @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/WindowsAgent/ExecutionPlanGenerator/ExecutionPlanGenerator.csproj b/WindowsAgent/ExecutionPlanGenerator/ExecutionPlanGenerator.csproj new file mode 100644 index 0000000..fa80540 --- /dev/null +++ b/WindowsAgent/ExecutionPlanGenerator/ExecutionPlanGenerator.csproj @@ -0,0 +1,62 @@ + + + + + Debug + AnyCPU + {501BE151-4B8C-4355-88DC-3AEF1921B2D7} + Exe + Properties + ConsoleApplication1 + ExecutionPlanGenerator + v4.5 + 512 + + + AnyCPU + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + AnyCPU + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + ..\packages\Newtonsoft.Json.4.5.11\lib\net40\Newtonsoft.Json.dll + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/WindowsAgent/ExecutionPlanGenerator/Program.cs b/WindowsAgent/ExecutionPlanGenerator/Program.cs new file mode 100644 index 0000000..c5c7f12 --- /dev/null +++ b/WindowsAgent/ExecutionPlanGenerator/Program.cs @@ -0,0 +1,141 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Newtonsoft.Json; + +namespace ConsoleApplication1 +{ + class Command + { + public string Name { get; set; } + public Dictionary Arguments { get; set; } + } + class ExecutionPlan + { + public List Scripts { get; set; } + public List Commands { get; set; } + public int RebootOnCompletion { get; set; } + } + + + class Program + { + static void Main(string[] args) + { + if (args.Length < 1 || args.Length > 2) + { + Console.WriteLine("Usage: ExecutionPlanGenerator inputfile [outputfile]"); + return; + } + + var outFile = args.Length == 2 ? args[1] : null; + + var plan = new ExecutionPlan { + Scripts = new List(), + Commands = new List() + }; + + + + var lines = File.ReadAllLines(args[0]); + + + foreach (var statement in lines + .Select(t => t.Split(new[] { ' ', '\t' }, 2)) + .Where(t => t.Length == 2) + .Select(t => new Tuple(t[0].Trim().ToLower(), t[1].Trim()))) + { + switch (statement.Item1) + { + case "include": + Include(statement.Item2, plan, args[0]); + break; + case "call": + Call(statement.Item2, plan); + break; + case "reboot": + plan.RebootOnCompletion = int.Parse(statement.Item2); + break; + case "out": + if (args.Length < 2) + { + var path = statement.Item2; + if (!Path.IsPathRooted(path)) + { + path = Path.Combine(Path.GetDirectoryName(args[0]), path); + } + outFile = path; + } + break; + } + } + + var data = JsonConvert.SerializeObject(plan, Formatting.Indented); + if (outFile == null) + { + Console.WriteLine(data); + } + else + { + File.WriteAllText(outFile, data); + } + } + + private static void Call(string line, ExecutionPlan plan) + { + var parts = line.Split(new[] { ' ', '\t'}, 2); + var command = new Command() { + Name = parts[0].Trim(), + Arguments = new Dictionary() + }; + + + if (parts.Length == 2) + { + foreach (var x in parts[1] + .Split(',') + .Select(t => t.Split('=')) + .Where(t => t.Length == 2) + .Select(t => new KeyValuePair(t[0].Trim(), t[1].Trim()))) + { + object value = null; + long num; + bool boolean; + if (x.Value.StartsWith("\"")) + { + value = x.Value.Substring(1, x.Value.Length - 2); + } + else if (long.TryParse(x.Value, out num)) + { + value = num; + } + else if (bool.TryParse(x.Value, out boolean)) + { + value = boolean; + } + else + { + continue; + } + command.Arguments.Add(x.Key, value); + } + } + plan.Commands.Add(command); + } + + private static void Include(string file, ExecutionPlan plan, string dslPath) + { + var path = file; + if (!Path.IsPathRooted(file)) + { + path = Path.Combine(Path.GetDirectoryName(dslPath), path); + } + + var text = File.ReadAllText(path, Encoding.UTF8); + plan.Scripts.Add(Convert.ToBase64String(Encoding.UTF8.GetBytes(text))); + } + } +} diff --git a/WindowsAgent/ExecutionPlanGenerator/Properties/AssemblyInfo.cs b/WindowsAgent/ExecutionPlanGenerator/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..54a148f --- /dev/null +++ b/WindowsAgent/ExecutionPlanGenerator/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("ConsoleApplication1")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("ConsoleApplication1")] +[assembly: AssemblyCopyright("Copyright © 2013")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("9aab688a-ce5f-402e-8891-2d7b4ae85ea3")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/WindowsAgent/ExecutionPlanGenerator/packages.config b/WindowsAgent/ExecutionPlanGenerator/packages.config new file mode 100644 index 0000000..b82a8b0 --- /dev/null +++ b/WindowsAgent/ExecutionPlanGenerator/packages.config @@ -0,0 +1,4 @@ + + + + \ No newline at end of file From f97d82a8c5df063e77a57a4e10d79cf087cfcfe2 Mon Sep 17 00:00:00 2001 From: Serg Melikyan Date: Wed, 13 Mar 2013 15:49:13 +0400 Subject: [PATCH 13/21] 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 From 4385b0dd7a2aa92f89b545fbc436770509873980 Mon Sep 17 00:00:00 2001 From: Serg Melikyan Date: Wed, 13 Mar 2013 17:49:40 +0400 Subject: [PATCH 14/21] Add part of service id to unit name Change-Id: Ia0f3953fea28c2cee15dc99595347cfdd3ec4430 --- portas/portas/api/v1/active_directories.py | 2 +- portas/portas/api/v1/webservers.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/portas/portas/api/v1/active_directories.py b/portas/portas/api/v1/active_directories.py index fa034dd..2b57a67 100644 --- a/portas/portas/api/v1/active_directories.py +++ b/portas/portas/api/v1/active_directories.py @@ -33,7 +33,7 @@ class Controller(object): for unit in active_directory['units']: unit_count += 1 unit['id'] = uuidutils.generate_uuid() - unit['name'] = 'dc{0}'.format(unit_count) + unit['name'] = 'dc{0}{1}'.format(unit_count, active_directory['id'][:4]) draft = prepare_draft(draft) draft['services']['activeDirectories'].append(active_directory) diff --git a/portas/portas/api/v1/webservers.py b/portas/portas/api/v1/webservers.py index 2e758e7..d1af6bc 100644 --- a/portas/portas/api/v1/webservers.py +++ b/portas/portas/api/v1/webservers.py @@ -33,7 +33,7 @@ class Controller(object): for unit in webServer['units']: unit_count += 1 unit['id'] = uuidutils.generate_uuid() - unit['name'] = 'iis{0}'.format(unit_count) + unit['name'] = 'iis{0}{1}'.format(unit_count, webServer['id'][:3]) draft = prepare_draft(draft) draft['services']['webServers'].append(webServer) From 8bc5033d7f65fc00b741f1ed10f445a229b6ad1c Mon Sep 17 00:00:00 2001 From: Serg Melikyan Date: Wed, 13 Mar 2013 17:58:42 +0400 Subject: [PATCH 15/21] Fix issue with ack on results --- portas/portas/common/service.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/portas/portas/common/service.py b/portas/portas/common/service.py index 49fe664..143a358 100644 --- a/portas/portas/common/service.py +++ b/portas/portas/common/service.py @@ -42,7 +42,7 @@ class TaskResultHandlerService(service.Service): bind(conf.results_exchange, conf.results_queue) bind(conf.reports_exchange, conf.reports_queue) - ch.basic_consume(conf.results_exchange, callback=handle_result, no_ack=True) + ch.basic_consume(conf.results_exchange, callback=handle_result) ch.basic_consume(conf.reports_exchange, callback=handle_report, no_ack=True) while ch.callbacks: ch.wait() From 77e9cfadf4f74210d5669d14d0103ac7480fbb83 Mon Sep 17 00:00:00 2001 From: Timur Nurlygayanov Date: Wed, 13 Mar 2013 18:28:13 +0400 Subject: [PATCH 16/21] Added progress bars for services. Fixed few issues for demo. --- dashboard/api/windc.py | 85 +++++++-- dashboard/windc/forms.py | 113 ++++++------ dashboard/windc/tables.py | 162 +++++++++++------- .../windc/templates/windc/_services_tabs.html | 33 +++- dashboard/windc/views.py | 83 ++++++--- 5 files changed, 313 insertions(+), 163 deletions(-) diff --git a/dashboard/api/windc.py b/dashboard/api/windc.py index 16f289b..adf6059 100644 --- a/dashboard/api/windc.py +++ b/dashboard/api/windc.py @@ -24,7 +24,6 @@ import urlparse from django.utils.decorators import available_attrs from portasclient.v1.client import Client as windc_client - LOG = logging.getLogger(__name__) @@ -52,28 +51,78 @@ def datacenters_list(request): return windcclient(request).environments.list() +def datacenters_deploy(request, datacenter_id): + sessions = windcclient(request).sessions.list(datacenter_id) + for session in sessions: + if session.state == 'open': + session_id = session.id + if not session_id: + return "Sorry, nothing to deploy." + return windcclient(request).sessions.deploy(datacenter_id, session_id) + + +def datacenters_get_status(request, datacenter_id): + return datacenters_get(request, datacenter_id).status + + def services_create(request, datacenter, parameters): - return windcclient(request).services.create(datacenter, parameters) + session_id = windcclient(request).sessions.list(datacenter)[0].id + if parameters['service_type'] == 'Active Directory': + res = windcclient(request).activeDirectories.create(datacenter, + session_id, + parameters) + else: + res = windcclient(request).webServers.create(datacenter, + session_id, + parameters) + + return res -def services_list(request, datacenter): - LOG.critical("********************************") - LOG.critical(dir(windcclient(request))) - LOG.critical("********************************") - session_id = request.user.token.token['id'] - services = [] - services += windcclient(request).activeDirectories.list(datacenter, session_id) - #services += windcclient(request).webServers.list(datacenter) - +def services_list(request, datacenter_id): + session_id = None + sessions = windcclient(request).sessions.list(datacenter_id) + for s in sessions: + if s.state in ['open', 'deployed', 'deploying']: + session_id = s.id + + if session_id is None: + session_id = windcclient(request).sessions.configure(datacenter_id).id + + services = windcclient(request).activeDirectories.list(datacenter_id, + session_id) + services += windcclient(request).webServers.list(datacenter_id, session_id) + return services -def services_get(request, datacenter, service_id): - LOG.critical("********************************") - LOG.debug(parameters) - LOG.critical("********************************") - return windcclient(request).services.get(datacenter, service_id) +def services_get(request, datacenter_id, service_id): + services = services_list(request, datacenter_id) + + for service in services: + if service.id is service_id: + return service -def services_delete(request, datacenter, service_id): - return windcclient(request).services.delete(datacenter, service_id) +def services_delete(request, datacenter_id, service_id): + services = services_list(request, datacenter_id) + + session_id = None + sessions = windcclient(request).sessions.list(datacenter_id) + for session in sessions: + if session.state == 'open': + session_id = session.id + + if session_id is None: + raise Exception("Sorry, you can not delete this service now.") + + for service in services: + if service.id is service_id: + if service.type is 'Active Directory': + windcclient(request).activeDirectories.delete(datacenter_id, + session_id, + service_id) + elif service.type is 'IIS': + windcclient(request).webServers.delete(datacenter_id, + session_id, + service_id) diff --git a/dashboard/windc/forms.py b/dashboard/windc/forms.py index 7340fb2..b44cd16 100644 --- a/dashboard/windc/forms.py +++ b/dashboard/windc/forms.py @@ -19,6 +19,7 @@ # under the License. import logging +import string from django import forms from django.core.urlresolvers import reverse @@ -30,82 +31,90 @@ from horizon import forms from horizon import exceptions from horizon import messages -import pdb - LOG = logging.getLogger(__name__) +class PasswordField(forms.CharField): + + # Setup the Field + def __init__(self, label, *args, **kwargs): + super(PasswordField, self).__init__(min_length=7, required=True, + label=label, + widget=forms.PasswordInput(render_value=False), + *args, **kwargs) + + def clean(self, value): + + # Setup Our Lists of Characters and Numbers + characters = list(string.letters) + special_characters = '!@#$%^&*()_+|\/.,~?><:{}' + numbers = [str(i) for i in range(10)] + + # Assume False until Proven Otherwise + numCheck = False + charCheck = False + specCharCheck = False + + # Loop until we Match + for char in value: + if not charCheck: + if char in characters: + charCheck = True + if not specCharCheck: + if char in special_characters: + specCharCheck = True + if not numCheck: + if char in numbers: + numCheck = True + if numCheck and charCheck and specCharCheck: + break + + if not numCheck or not charCheck or not specCharCheck: + raise forms.ValidationError(u'Your password must include at least \ + one letter, at least one number and \ + at least one special character.') + + return super(PasswordField, self).clean(value) + + class WizardFormServiceType(forms.Form): - service = forms.ChoiceField(label=_("Service Type"), + service = forms.ChoiceField(label=_('Service Type'), choices=[ - ('active directory', 'Active Directory'), - ('iis', 'Internet Information Services') + ('Active Directory', 'Active Directory'), + ('IIS', 'Internet Information Services') ]) class WizardFormConfiguration(forms.Form): - "The functions for this class will dynamically create in views.py" + 'The functions for this class will dynamically create in views.py' pass class WizardFormADConfiguration(forms.Form): - dc_name = forms.CharField(label=_("Domain Name"), - required=False) + dc_name = forms.CharField(label=_('Domain Name'), + required=True) - dc_count = forms.IntegerField(label=_("Instances Count"), + dc_count = forms.IntegerField(label=_('Instances Count'), required=True, min_value=1, max_value=100, initial=1) - adm_password = forms.CharField(widget=forms.PasswordInput, - label=_("Administrator password"), - required=False) + adm_password = PasswordField(_('Administrator password')) - recovery_password = forms.CharField(widget=forms.PasswordInput, - label=_("Recovery password"), - required=False) + recovery_password = PasswordField(_('Recovery password')) class WizardFormIISConfiguration(forms.Form): - iis_name = forms.CharField(label=_("IIS Server Name"), - required=False) + iis_name = forms.CharField(label=_('IIS Server Name'), + required=True) - adm_password = forms.CharField(widget=forms.PasswordInput, - label=_("Administrator password"), - required=False) + adm_password = PasswordField(_('Administrator password')) - iis_count = forms.IntegerField(label=_("IIS Servers Count"), - required=True, - min_value=1, - max_value=100, - initial=1) + iis_domain = forms.CharField(label=_('Member of the Domain'), + required=True) - iis_domain = forms.CharField(label=_("Member of the Domain"), - required=False) + domain_user_name = forms.CharField(label=_('Domain User Name'), + required=True) - domain_user_name = forms.CharField(label=_("Domain User Name"), - required=False) - - domain_user_password = forms.CharField(widget=forms.PasswordInput, - label=_("Domain User Password"), - required=False) - - -class UpdateWinDC(forms.SelfHandlingForm): - tenant_id = forms.CharField(widget=forms.HiddenInput) - data_center = forms.CharField(widget=forms.HiddenInput) - name = forms.CharField(required=True) - - def handle(self, request, data): - try: - server = api.nova.server_update(request, data['data_center'], - data['name']) - messages.success(request, - _('Data Center "%s" updated.') % data['name']) - return server - except: - redirect = reverse("horizon:project:windc:index") - exceptions.handle(request, - _('Unable to update data center.'), - redirect=redirect) + domain_user_password = PasswordField(_('Domain User Password')) diff --git a/dashboard/windc/tables.py b/dashboard/windc/tables.py index a5c7b4d..97fe9bc 100644 --- a/dashboard/windc/tables.py +++ b/dashboard/windc/tables.py @@ -43,24 +43,23 @@ LOG = logging.getLogger(__name__) class CreateService(tables.LinkAction): - name = "CreateService" - verbose_name = _("Create Service") - url = "horizon:project:windc:create" - classes = ("btn-launch", "ajax-modal") + name = 'CreateService' + verbose_name = _('Create Service') + url = 'horizon:project:windc:create' + classes = ('btn-launch', 'ajax-modal') def allowed(self, request, datum): return True def action(self, request, service): - # FIX ME api.windc.services_create(request, service) class CreateDataCenter(tables.LinkAction): - name = "CreateDataCenter" - verbose_name = _("Create Windows Data Center") - url = "horizon:project:windc:create_dc" - classes = ("btn-launch", "ajax-modal") + name = 'CreateDataCenter' + verbose_name = _('Create Windows Data Center') + url = 'horizon:project:windc:create_dc' + classes = ('btn-launch', 'ajax-modal') def allowed(self, request, datum): return True @@ -70,11 +69,11 @@ class CreateDataCenter(tables.LinkAction): class DeleteDataCenter(tables.BatchAction): - name = "delete" - action_present = _("Delete") - action_past = _("Delete") - data_type_singular = _("Data Center") - data_type_plural = _("Data Center") + name = 'delete' + action_present = _('Delete') + action_past = _('Delete') + data_type_singular = _('Data Center') + data_type_plural = _('Data Center') classes = ('btn-danger', 'btn-terminate') def allowed(self, request, datum): @@ -85,93 +84,128 @@ class DeleteDataCenter(tables.BatchAction): class DeleteService(tables.BatchAction): - name = "delete" - action_present = _("Delete") - action_past = _("Delete") - data_type_singular = _("Service") - data_type_plural = _("Service") + name = 'delete' + action_present = _('Delete') + action_past = _('Delete') + data_type_singular = _('Service') + data_type_plural = _('Service') classes = ('btn-danger', 'btn-terminate') def allowed(self, request, datum): return True def action(self, request, service_id): - ############## FIX ME: link = request.__dict__['META']['HTTP_REFERER'] datacenter_id = re.search('windc/(\S+)', link).group(0)[6:-1] - ############## - api.windc.services_delete(request, datacenter_id, service_id) + try: + api.windc.services_delete(request, datacenter_id, service_id) + except: + messages.error(request, + _('Sorry, you can not delete this service right now.')) -class EditService(tables.LinkAction): - name = "edit" - verbose_name = _("Edit") - url = "horizon:project:windc:update" - classes = ("ajax-modal", "btn-edit") +class DeployDataCenter(tables.BatchAction): + name = 'deploy' + action_present = _('Deploy') + action_past = _('Deploy') + data_type_singular = _('Data Center') + data_type_plural = _('Data Center') + classes = ('btn-launch') - def allowed(self, request, instance): + def allowed(self, request, datum): return True + def action(self, request, datacenter_id): + return api.windc.datacenters_deploy(request, datacenter_id) + class ShowDataCenterServices(tables.LinkAction): - name = "edit" - verbose_name = _("Services") - url = "horizon:project:windc:services" + name = 'edit' + verbose_name = _('Services') + url = 'horizon:project:windc:services' def allowed(self, request, instance): return True -class UpdateRow(tables.Row): +class UpdateDCRow(tables.Row): ajax = True - def get_data(self, request, instance_id): - instance = api.nova.server_get(request, instance_id) - instance.full_flavor = api.nova.flavor_get(request, - instance.flavor["id"]) - return instance + def get_data(self, request, datacenter_id): + return api.windc.datacenters_get(request, datacenter_id) + + +class UpdateServiceRow(tables.Row): + ajax = True + def get_data(self, request, service_id): + link = request.__dict__['META']['HTTP_REFERER'] + datacenter_id = re.search('windc/(\S+)', link).group(0)[6:-1] -class WinDCTable(tables.DataTable): - name = tables.Column("name", - link=("horizon:project:windc:services"), - verbose_name=_("Name")) - - class Meta: - name = "windc" - verbose_name = _("Windows Data Centers") - row_class = UpdateRow - table_actions = (CreateDataCenter,) - row_actions = (ShowDataCenterServices, DeleteDataCenter) + return api.windc.services_get(request, datacenter_id, service_id) STATUS_DISPLAY_CHOICES = ( - ("create", "Deploy"), + ('draft', 'Ready to deploy'), + ('pending', 'Wait for configuration'), + ('inprogress', 'Deploy in progress'), + ('finished', 'Active') ) +STATUS_CHOICES = ( + (None, True), + ('Ready to deploy', False), + ('Wait for configuration', True), + ('Deploy in progress', True), + ('Active', False), + ('error', False), +) -class WinServicesTable(tables.DataTable): +def get_datacenter_status(datacenter): + return datacenter.status - STATUS_CHOICES = ( - (None, True), - ("deployed", True), - ("active", True), - ("error", False), - ) +def get_service_status(service): + return service.status - name = tables.Column('dc_name', verbose_name=_('Name'), - link=("horizon:project:windc:service_details"),) - _type = tables.Column('type', verbose_name=_('Type')) - status = tables.Column('status', verbose_name=_('Status'), + +class WinDCTable(tables.DataTable): + + name = tables.Column('name', + link=('horizon:project:windc:services'), + verbose_name=_('Name')) + + status = tables.Column(get_datacenter_status, verbose_name=_('Status'), status=True, status_choices=STATUS_CHOICES, display_choices=STATUS_DISPLAY_CHOICES) class Meta: - name = "services" - verbose_name = _("Services") - row_class = UpdateRow + name = 'windc' + verbose_name = _('Windows Data Centers') + row_class = UpdateDCRow status_columns = ['status'] + table_actions = (CreateDataCenter,) + row_actions = (ShowDataCenterServices, DeleteDataCenter, + DeployDataCenter) + + +class WinServicesTable(tables.DataTable): + + name = tables.Column('name', verbose_name=_('Name'), + link=('horizon:project:windc:service_details'),) + + _type = tables.Column('service_type', verbose_name=_('Type')) + + status = tables.Column(get_service_status, verbose_name=_('Status'), + status=True, + status_choices=STATUS_CHOICES, + display_choices=STATUS_DISPLAY_CHOICES) + + class Meta: + name = 'services' + verbose_name = _('Services') + status_columns = ['status'] + row_class = UpdateServiceRow table_actions = (CreateService,) - row_actions = (EditService, DeleteService) + row_actions = (DeleteService,) diff --git a/dashboard/windc/templates/windc/_services_tabs.html b/dashboard/windc/templates/windc/_services_tabs.html index a00c4c3..a58eac8 100644 --- a/dashboard/windc/templates/windc/_services_tabs.html +++ b/dashboard/windc/templates/windc/_services_tabs.html @@ -7,6 +7,11 @@ {% block modal-header %}{% trans "Create Service" %}{% endblock %} {% block modal-body %} +
+
+{% if wizard.steps.next %} +


+{% endif %} {{ wizard.management_form }} {% if wizard.form.forms %} @@ -19,13 +24,35 @@ {% endif %} {{ wizard.form.forms }}
+
+
+ {% if wizard.steps.prev %} +

{{ service_type }} Service

+ {% if service_type == 'Active Directory' %} +

{% trans "Now you can set the parameters for Active Directory Service." %}

+

{% trans "You can create few Active Directory instances, in this case will be created one Main Active Directory server and few Secondary Active Directory servers." %}

+

{% trans "The DNS service will be automatically created on each Active Directory servers." %}

+ {% else %} +

{% trans "Now you can set parameters for IIS Service." %}

+

{% trans "The IIS Service - it is the server with complex Internet Information Services infrastructure, which included to the domain infrasructure." %}

+

{% trans "Please, set the complex password for local administrator account." %}

+

{% trans "Also, you can add this IIS server to the existing domain and configure credentials for domain user." %}

+ {% endif %} + + {% else %} +

{% trans "Description" %}:

+

{% trans "Now you can select the type of the service." %}

+

{% trans "The Active Directory Service allows to configure Domain Controllers with Active Directory and DNS infrastructure. You can create one Main Domain Controller and few Secondary Domain Controllers." %}

+

{% trans "The Internet Information Services allows to configure IIS servers, which can be included to the existing domain infrastructure." %}

+ {% endif %} +
{% endblock %} {% block modal-footer %} {% if wizard.steps.prev %} - - + + {% else %} - + {% endif %} {% endblock %} diff --git a/dashboard/windc/views.py b/dashboard/windc/views.py index acbd23c..626e73f 100644 --- a/dashboard/windc/views.py +++ b/dashboard/windc/views.py @@ -60,25 +60,45 @@ class Wizard(ModalFormMixin, SessionWizardView, generic.FormView): url = "/project/windc/%s/" % datacenter_id service_type = form_list[0].data.get('0-service', '') - parameters = {} - if form_list[1].data: - data = form_list[1].data + parameters = {'service_type': service_type} - if service_type == 'active directory': - parameters['dc_name'] = str(data.get('1-dc_name', 'noname')) - parameters['adm_password'] = str(data.get('1-adm_password', '')) - parameters['dc_count'] = int(data.get('1-dc_count', 1)) - parameters['recovery_password'] = \ - str(data.get('1-recovery_password', '')) - elif service_type == 'iis': - parameters['iis_name'] = str(data.get('1-iis_name', 'noname')) - parameters['adm_password'] = str(data.get('1-adm_password', '')) - parameters['iis_count'] = int(data.get('1-iis_count', 1)) - parameters['iis_domain'] = str(data.get('1-iis_domain', '')) - parameters['domain_user_name'] = \ - str(data.get('1-domain_user_name', '')) - parameters['domain_user_password'] = \ - str(data.get('1-domain_user_password', '')) + if service_type == 'Active Directory': + parameters['configuration'] = 'standalone' + parameters['name'] = str(form_list[1].data.get('1-dc_name', + 'noname')) + parameters['adminPassword'] = \ + str(form_list[1].data.get('1-adm_password', '')) + dc_count = int(form_list[1].data.get('1-dc_count', 1)) + recovery_password = \ + str(form_list[1].data.get('1-recovery_password', '')) + parameters['units'] = [] + parameters['units'].append({'isMaster': True, + 'recoveryPassword': recovery_password, + 'location': 'west-dc'}) + for dc in range(dc_count - 1): + parameters['units'].append({'isMaster': False, + 'recoveryPassword': recovery_password, + 'location': 'west-dc'}) + + elif service_type == 'IIS': + password = form_list[1].data.get('1-adm_password', '') + domain = form_list[1].data.get('1-iis_domain', '') + dc_user = form_list[1].data.get('1-domain_user_name', '') + dc_pass = form_list[1].data.get('1-domain_user_password', '') + parameters['name'] = str(form_list[1].data.get('1-iis_name', + 'noname')) + parameters['domain'] = parameters['name'] + parameters['credentials'] = {'username': 'Administrator', + 'password': password} + parameters['domain'] = str(domain) + # 'username': str(dc_user), + # 'password': str(dc_pass)} + parameters['location'] = 'west-dc' + + parameters['units'] = [] + parameters['units'].append({'id': '1', + 'endpoint': [{'host': '10.0.0.1'}], + 'location': 'west-dc'}) service = api.windc.services_create(self.request, datacenter_id, @@ -90,26 +110,37 @@ class Wizard(ModalFormMixin, SessionWizardView, generic.FormView): def get_form(self, step=None, data=None, files=None): form = super(Wizard, self).get_form(step, data, files) - LOG.debug("********" + str(self.form_list)) if data: service_type = data.get('0-service', '') - - if service_type == 'active directory': + self.service_type = service_type + if service_type == 'Active Directory': self.form_list['1'] = WizardFormADConfiguration - elif service_type == 'iis': + elif service_type == 'IIS': self.form_list['1'] = WizardFormIISConfiguration return form + def get_form_step_data(self, form): + LOG.debug(form.data) + return form.data + + def get_context_data(self, form, **kwargs): + context = super(Wizard, self).get_context_data(form=form, **kwargs) + if self.steps.index > 0: + context.update({'service_type': self.service_type}) + return context + class IndexView(tables.DataTableView): table_class = WinDCTable template_name = 'project/windc/index.html' def get_data(self): - # Gather our datacenters try: data_centers = api.windc.datacenters_list(self.request) + for dc in data_centers: + dc.status = api.windc.datacenters_get_status(self.request, + dc.id) except: data_centers = [] exceptions.handle(self.request, @@ -124,7 +155,7 @@ class WinServices(tables.DataTableView): def get_context_data(self, **kwargs): context = super(WinServices, self).get_context_data(**kwargs) data = self.get_data() - context["dc_name"] = self.dc_name + context['dc_name'] = self.dc_name return context def get_data(self): @@ -132,7 +163,7 @@ class WinServices(tables.DataTableView): dc_id = self.kwargs['data_center_id'] datacenter = api.windc.datacenters_get(self.request, dc_id) self.dc_name = datacenter.name - services = api.windc.services_list(self.request, datacenter) + services = api.windc.services_list(self.request, dc_id) except: services = [] exceptions.handle(self.request, @@ -143,7 +174,7 @@ class WinServices(tables.DataTableView): class CreateWinDCView(workflows.WorkflowView): workflow_class = CreateWinDC - template_name = "project/windc/create_dc.html" + template_name = 'project/windc/create_dc.html' def get_initial(self): initial = super(CreateWinDCView, self).get_initial() From e1b8af88b0ca10fbc11efab9d40114319aaa16eb Mon Sep 17 00:00:00 2001 From: Serg Melikyan Date: Wed, 13 Mar 2013 18:54:15 +0400 Subject: [PATCH 17/21] Fix issue with getting list of environments --- portas/portas/api/v1/__init__.py | 7 +++++-- portas/portas/api/v1/environments.py | 6 +++++- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/portas/portas/api/v1/__init__.py b/portas/portas/api/v1/__init__.py index f36dcfd..d914ba5 100644 --- a/portas/portas/api/v1/__init__.py +++ b/portas/portas/api/v1/__init__.py @@ -24,14 +24,17 @@ def save_draft(session_id, draft): def get_env_status(environment_id, session_id): status = 'draft' + if not session_id: + return status + 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() + reports_count = unit.query(Status).filter_by(environment_id=environment_id, session_id=session_id).count() if session_state == 'deployed': status = 'finished' - if session_state == 'deploying' and len(reports) > 1: + if session_state == 'deploying' and reports_count > 1: status = 'pending' draft = get_draft(environment_id, session_id) diff --git a/portas/portas/api/v1/environments.py b/portas/portas/api/v1/environments.py index 39f9f31..e8c82ee 100644 --- a/portas/portas/api/v1/environments.py +++ b/portas/portas/api/v1/environments.py @@ -18,8 +18,12 @@ class Controller(object): session = get_session() environments = session.query(Environment).filter_by(**filters) + environments = [env.to_dict() for env in environments] - return {"environments": [env.to_dict() for env in environments]} + for env in environments: + env['status'] = get_env_status(env['id'], request.context.session) + + return {"environments": environments} def create(self, request, body): log.debug(_('Environments:Create '.format(body))) From 767710e8524a0773728ddc1afdcdee2566e854e9 Mon Sep 17 00:00:00 2001 From: Serg Melikyan Date: Wed, 13 Mar 2013 19:05:01 +0400 Subject: [PATCH 18/21] Fix another issue with services --- portas/portas/api/v1/__init__.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/portas/portas/api/v1/__init__.py b/portas/portas/api/v1/__init__.py index d914ba5..3698fed 100644 --- a/portas/portas/api/v1/__init__.py +++ b/portas/portas/api/v1/__init__.py @@ -64,10 +64,11 @@ def get_service_status(environment_id, session_id, service): unit = get_session() session_state = unit.query(Session).get(session_id).state - entities = [unit['id'] for unit in service['units']] + entities = [u['id'] for u 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() + and Status.entity_id.in_(entities))\ + .count() if session_state == 'deployed': status = 'finished' From 53befea3b13990e45eff796952554104d2831b86 Mon Sep 17 00:00:00 2001 From: Serg Melikyan Date: Wed, 13 Mar 2013 19:15:10 +0400 Subject: [PATCH 19/21] Fix another issue with environments list Change-Id: Ia55e7cafc79dde3a8d802acb29679315596cfd11 --- portas/portas/api/v1/__init__.py | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/portas/portas/api/v1/__init__.py b/portas/portas/api/v1/__init__.py index 3698fed..6fa090e 100644 --- a/portas/portas/api/v1/__init__.py +++ b/portas/portas/api/v1/__init__.py @@ -24,10 +24,16 @@ def save_draft(session_id, draft): def get_env_status(environment_id, session_id): status = 'draft' - if not session_id: - return status - unit = get_session() + + if not session_id: + session = unit.query(Session).filter( + Session.environment_id == environment_id and Session.state.in_(['open', 'deploying'])).first() + if session: + session_id = session.id + else: + return status + 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() @@ -67,8 +73,8 @@ def get_service_status(environment_id, session_id, service): entities = [u['id'] for u 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() + and Status.entity_id.in_(entities)) \ + .count() if session_state == 'deployed': status = 'finished' From 38f362bedc2ed407e4b0fab5f508c5826931b146 Mon Sep 17 00:00:00 2001 From: Timur Nurlygayanov Date: Thu, 14 Mar 2013 03:23:51 -0700 Subject: [PATCH 20/21] Added lst fixes for demo. --- dashboard/windc/tables.py | 47 +++++++++++++++++++++++++++------------ 1 file changed, 33 insertions(+), 14 deletions(-) diff --git a/dashboard/windc/tables.py b/dashboard/windc/tables.py index 97fe9bc..8b7a0c9 100644 --- a/dashboard/windc/tables.py +++ b/dashboard/windc/tables.py @@ -133,7 +133,9 @@ class UpdateDCRow(tables.Row): ajax = True def get_data(self, request, datacenter_id): - return api.windc.datacenters_get(request, datacenter_id) + datacenter = api.windc.datacenters_get(request, datacenter_id) + datacenter.status = api.windc.datacenters_get_status(request, datacenter_id) + return datacenter class UpdateServiceRow(tables.Row): @@ -143,25 +145,29 @@ class UpdateServiceRow(tables.Row): link = request.__dict__['META']['HTTP_REFERER'] datacenter_id = re.search('windc/(\S+)', link).group(0)[6:-1] - return api.windc.services_get(request, datacenter_id, service_id) + service = api.windc.services_get(request, datacenter_id, service_id) + service.status = api.windc.services_get_status(request, datacenter_id, + service_id) + return service -STATUS_DISPLAY_CHOICES = ( +DC_STATUS_DISPLAY_CHOICES = ( ('draft', 'Ready to deploy'), ('pending', 'Wait for configuration'), - ('inprogress', 'Deploy in progress'), - ('finished', 'Active') + ('finished', 'Active'), + ('inprogress', "Deploy in progress") ) -STATUS_CHOICES = ( - (None, True), - ('Ready to deploy', False), - ('Wait for configuration', True), - ('Deploy in progress', True), - ('Active', False), - ('error', False), +SERVICES_STATUS_DISPLAY_CHOICES = ( + ('draft', 'Ready to deploy'), + ('pending', 'Wait for configuration'), + ('finished', 'Active'), + ('inprogress', "Deploy in progress") ) + + + def get_datacenter_status(datacenter): return datacenter.status @@ -171,6 +177,13 @@ def get_service_status(service): class WinDCTable(tables.DataTable): + STATUS_CHOICES = ( + (None, True), + ('draft', False), + ('finished', False) + ) + + name = tables.Column('name', link=('horizon:project:windc:services'), verbose_name=_('Name')) @@ -178,7 +191,7 @@ class WinDCTable(tables.DataTable): status = tables.Column(get_datacenter_status, verbose_name=_('Status'), status=True, status_choices=STATUS_CHOICES, - display_choices=STATUS_DISPLAY_CHOICES) + display_choices=DC_STATUS_DISPLAY_CHOICES) class Meta: name = 'windc' @@ -191,6 +204,12 @@ class WinDCTable(tables.DataTable): class WinServicesTable(tables.DataTable): + + STATUS_CHOICES = ( + (None, True), + ('draft', False), + ('finished', False) + ) name = tables.Column('name', verbose_name=_('Name'), link=('horizon:project:windc:service_details'),) @@ -200,7 +219,7 @@ class WinServicesTable(tables.DataTable): status = tables.Column(get_service_status, verbose_name=_('Status'), status=True, status_choices=STATUS_CHOICES, - display_choices=STATUS_DISPLAY_CHOICES) + display_choices=SERVICES_STATUS_DISPLAY_CHOICES) class Meta: name = 'services' From 14caeee4eb6209f22d85c4fff6921eac5d89594d Mon Sep 17 00:00:00 2001 From: Timur Nurlygayanov Date: Thu, 14 Mar 2013 16:59:29 +0400 Subject: [PATCH 21/21] Fixed small issues with UI. --- dashboard/api/windc.py | 8 +++--- dashboard/windc/tables.py | 50 ++++++++++++--------------------- dashboard/windc/views.py | 7 ++--- portas/etc/portas-api-paste.ini | 6 ++-- portas/etc/portas-api.conf | 6 ++-- 5 files changed, 30 insertions(+), 47 deletions(-) diff --git a/dashboard/api/windc.py b/dashboard/api/windc.py index adf6059..067f530 100644 --- a/dashboard/api/windc.py +++ b/dashboard/api/windc.py @@ -61,10 +61,6 @@ def datacenters_deploy(request, datacenter_id): return windcclient(request).sessions.deploy(datacenter_id, session_id) -def datacenters_get_status(request, datacenter_id): - return datacenters_get(request, datacenter_id).status - - def services_create(request, datacenter, parameters): session_id = windcclient(request).sessions.list(datacenter)[0].id if parameters['service_type'] == 'Active Directory': @@ -92,6 +88,10 @@ def services_list(request, datacenter_id): services = windcclient(request).activeDirectories.list(datacenter_id, session_id) services += windcclient(request).webServers.list(datacenter_id, session_id) + + for i in range(len(services)): + LOG.critical(services[i].units[0]['id']) + services[i].id = services[i].units[0]['id'] return services diff --git a/dashboard/windc/tables.py b/dashboard/windc/tables.py index 8b7a0c9..10b518a 100644 --- a/dashboard/windc/tables.py +++ b/dashboard/windc/tables.py @@ -133,9 +133,7 @@ class UpdateDCRow(tables.Row): ajax = True def get_data(self, request, datacenter_id): - datacenter = api.windc.datacenters_get(request, datacenter_id) - datacenter.status = api.windc.datacenters_get_status(request, datacenter_id) - return datacenter + return api.windc.datacenters_get(request, datacenter_id) class UpdateServiceRow(tables.Row): @@ -144,43 +142,31 @@ class UpdateServiceRow(tables.Row): def get_data(self, request, service_id): link = request.__dict__['META']['HTTP_REFERER'] datacenter_id = re.search('windc/(\S+)', link).group(0)[6:-1] - - service = api.windc.services_get(request, datacenter_id, service_id) - service.status = api.windc.services_get_status(request, datacenter_id, - service_id) - return service + + return api.windc.services_get(request, datacenter_id, service_id) -DC_STATUS_DISPLAY_CHOICES = ( +STATUS_DISPLAY_CHOICES = ( ('draft', 'Ready to deploy'), ('pending', 'Wait for configuration'), - ('finished', 'Active'), - ('inprogress', "Deploy in progress") + ('inprogress', 'Deploy in progress'), + ('finished', 'Active') ) -SERVICES_STATUS_DISPLAY_CHOICES = ( +STATUS_DISPLAY_CHOICES = ( ('draft', 'Ready to deploy'), ('pending', 'Wait for configuration'), - ('finished', 'Active'), - ('inprogress', "Deploy in progress") + ('inprogress', 'Deploy in progress'), + ('finished', 'Active') ) - - -def get_datacenter_status(datacenter): - return datacenter.status - -def get_service_status(service): - return service.status - - class WinDCTable(tables.DataTable): STATUS_CHOICES = ( (None, True), - ('draft', False), - ('finished', False) + ('Ready to deploy', True), + ('Active', True) ) @@ -188,10 +174,10 @@ class WinDCTable(tables.DataTable): link=('horizon:project:windc:services'), verbose_name=_('Name')) - status = tables.Column(get_datacenter_status, verbose_name=_('Status'), + status = tables.Column('status', verbose_name=_('Status'), status=True, status_choices=STATUS_CHOICES, - display_choices=DC_STATUS_DISPLAY_CHOICES) + display_choices=STATUS_DISPLAY_CHOICES) class Meta: name = 'windc' @@ -207,8 +193,8 @@ class WinServicesTable(tables.DataTable): STATUS_CHOICES = ( (None, True), - ('draft', False), - ('finished', False) + ('Ready to deploy', True), + ('Active', True) ) name = tables.Column('name', verbose_name=_('Name'), @@ -216,15 +202,15 @@ class WinServicesTable(tables.DataTable): _type = tables.Column('service_type', verbose_name=_('Type')) - status = tables.Column(get_service_status, verbose_name=_('Status'), + status = tables.Column('status', verbose_name=_('Status'), status=True, status_choices=STATUS_CHOICES, - display_choices=SERVICES_STATUS_DISPLAY_CHOICES) + display_choices=STATUS_DISPLAY_CHOICES) class Meta: name = 'services' verbose_name = _('Services') - status_columns = ['status'] row_class = UpdateServiceRow + status_columns = ['status'] table_actions = (CreateService,) row_actions = (DeleteService,) diff --git a/dashboard/windc/views.py b/dashboard/windc/views.py index 626e73f..770abb7 100644 --- a/dashboard/windc/views.py +++ b/dashboard/windc/views.py @@ -66,6 +66,7 @@ class Wizard(ModalFormMixin, SessionWizardView, generic.FormView): parameters['configuration'] = 'standalone' parameters['name'] = str(form_list[1].data.get('1-dc_name', 'noname')) + parameters['domain'] = parameters['name'] # Fix Me in orchestrator parameters['adminPassword'] = \ str(form_list[1].data.get('1-adm_password', '')) dc_count = int(form_list[1].data.get('1-dc_count', 1)) @@ -138,9 +139,6 @@ class IndexView(tables.DataTableView): def get_data(self): try: data_centers = api.windc.datacenters_list(self.request) - for dc in data_centers: - dc.status = api.windc.datacenters_get_status(self.request, - dc.id) except: data_centers = [] exceptions.handle(self.request, @@ -154,7 +152,6 @@ class WinServices(tables.DataTableView): def get_context_data(self, **kwargs): context = super(WinServices, self).get_context_data(**kwargs) - data = self.get_data() context['dc_name'] = self.dc_name return context @@ -168,7 +165,7 @@ class WinServices(tables.DataTableView): services = [] exceptions.handle(self.request, _('Unable to retrieve list of services for ' - 'data center "%s".') % dc_id) + 'data center "%s".') % self.dc_name) return services diff --git a/portas/etc/portas-api-paste.ini b/portas/etc/portas-api-paste.ini index 3bb4591..3c4b22f 100644 --- a/portas/etc/portas-api-paste.ini +++ b/portas/etc/portas-api-paste.ini @@ -9,10 +9,10 @@ paste.filter_factory = portas.api.middleware.context:ContextMiddleware.factory [filter:authtoken] paste.filter_factory = keystoneclient.middleware.auth_token:filter_factory -auth_host = 172.18.79.73 +auth_host = localhost auth_port = 35357 auth_protocol = http admin_tenant_name = admin admin_user = admin -admin_password = swordfish -signing_dir = /tmp/keystone-signing-portas \ No newline at end of file +admin_password = password +signing_dir = /tmp/keystone-signing-portas diff --git a/portas/etc/portas-api.conf b/portas/etc/portas-api.conf index b572829..be932a2 100644 --- a/portas/etc/portas-api.conf +++ b/portas/etc/portas-api.conf @@ -28,6 +28,6 @@ reports_queue = task-reports host = localhost port = 5672 use_ssl = false -userid = guest -password = guest -virtual_host = / \ No newline at end of file +userid = keero +password = keero +virtual_host = keero