Merged iteration3 branch to master. Fixed pep8.

This commit is contained in:
Timur Nurlygayanov 2013-03-15 11:39:11 +04:00
commit cf928abf09
17 changed files with 278 additions and 106 deletions

View File

@ -61,20 +61,6 @@ def datacenters_deploy(request, datacenter_id):
return windcclient(request).sessions.deploy(datacenter_id, session_id)
def datacenters_get_status(request, datacenter_id):
sessions = windcclient(request).sessions.list(datacenter_id)
for session in sessions:
if session.state == 'deployed':
windcclient(request).sessions.delete(datacenter_id, session.id)
sessions = windcclient(request).sessions.list(datacenter_id)
if sessions:
session = sessions[0]
else:
session = windcclient(request).sessions.configure(datacenter_id)
return session.state
def services_create(request, datacenter, parameters):
session_id = windcclient(request).sessions.list(datacenter)[0].id
if parameters['service_type'] == 'Active Directory':
@ -106,8 +92,12 @@ def services_list(request, datacenter_id):
return services
def services_get(request, datacenter, service_id):
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_id, service_id):

View File

@ -133,38 +133,40 @@ 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):
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]
return api.windc.services_get(request, datacenter_id, service_id)
STATUS_DISPLAY_CHOICES = (
('deploying', 'Deploy in progress'),
('open', 'Ready to deploy')
('draft', 'Ready to deploy'),
('pending', 'Wait for configuration'),
('inprogress', 'Deploy in progress'),
('finished', 'Active')
)
def get_datacenter_status(datacenter):
return datacenter.status
class WinDCTable(tables.DataTable):
STATUS_CHOICES = (
(None, True),
('Ready to deploy', False),
('deploying', True),
('deployed', True),
('ready', True),
('error', False),
('Ready to deploy', True),
('Active', True)
)
name = tables.Column('name',
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=STATUS_DISPLAY_CHOICES)
@ -173,7 +175,34 @@ class WinDCTable(tables.DataTable):
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):
STATUS_CHOICES = (
(None, True),
('Ready to deploy', True),
('Active', True)
)
name = tables.Column('name', verbose_name=_('Name'),
link=('horizon:project:windc:service_details'),)
_type = tables.Column('service_type', verbose_name=_('Type'))
status = tables.Column('status', verbose_name=_('Status'),
status=True,
status_choices=STATUS_CHOICES,
display_choices=STATUS_DISPLAY_CHOICES)
class Meta:
name = 'services'
verbose_name = _('Services')
row_class = UpdateServiceRow
status_columns = ['status']
row_actions = (ShowDataCenterServices, DeleteDataCenter,
DeployDataCenter)

View File

@ -66,6 +66,10 @@ class Wizard(ModalFormMixin, SessionWizardView, generic.FormView):
parameters['configuration'] = 'standalone'
parameters['name'] = str(form_list[1].data.get('1-dc_name',
'noname'))
# Fix Me in orchestrator
parameters['domain'] = parameters['name']
parameters['adminPassword'] = \
str(form_list[1].data.get('1-adm_password', ''))
dc_count = int(form_list[1].data.get('1-dc_count', 1))
@ -87,11 +91,10 @@ class Wizard(ModalFormMixin, SessionWizardView, generic.FormView):
dc_pass = form_list[1].data.get('1-domain_user_password', '')
parameters['name'] = str(form_list[1].data.get('1-iis_name',
'noname'))
parameters['credentials'] = {'username': 'Administrator',
'password': password}
parameters['domain'] = {'name': str(domain),
'username': str(dc_user),
'password': str(dc_pass)}
parameters['domain'] = str(domain)
parameters['location'] = 'west-dc'
parameters['units'] = []
@ -153,7 +156,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
@ -167,7 +169,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

View File

@ -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
admin_password = password
signing_dir = /tmp/keystone-signing-portas

View File

@ -28,6 +28,6 @@ reports_queue = task-reports
host = localhost
port = 5672
use_ssl = false
userid = guest
password = guest
virtual_host = /
userid = keero
password = keero
virtual_host = keero

View File

@ -1,12 +1,16 @@
from portas.db.models import Session
from portas.db.models import Session, Environment, Status
from portas.db.session import get_session
def get_draft(session_id):
def get_draft(environment_id=None, session_id=None):
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):
@ -14,4 +18,71 @@ def save_draft(session_id, draft):
session = unit.query(Session).get(session_id)
session.description = draft
session.save(unit)
session.save(unit)
def get_env_status(environment_id, session_id):
status = 'draft'
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()
if session_state == 'deployed':
status = 'finished'
if session_state == 'deploying' and reports_count > 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 = [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()
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

View File

@ -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
@ -8,32 +8,32 @@ log = logging.getLogger(__name__)
class Controller(object):
@utils.verify_session
def index(self, request, environment_id):
draft = get_draft(request.context.session)
log.debug(_('ActiveDirectory:Index <EnvId: {0}>'.format(environment_id)))
if not draft.has_key('services'):
return dict()
draft = prepare_draft(get_draft(environment_id, request.context.session))
if not draft['services'].has_key('activeDirectories'):
return dict()
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
def create(self, request, environment_id, body):
draft = get_draft(request.context.session)
log.debug(_('ActiveDirectory:Create <EnvId: {0}, Body: {1}>'.format(environment_id, body)))
draft = get_draft(session_id=request.context.session)
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']:
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)
@ -42,6 +42,8 @@ class Controller(object):
return active_directory
def delete(self, request, 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['services']['activeDirectories'] = [service for service in draft['services']['activeDirectories'] if
service['id'] != active_directory_id]

View File

@ -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
@ -10,17 +11,23 @@ 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}
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 <Body {0}>'.format(body)))
#tagging environment by tenant_id for later checks
params = body.copy()
params['tenant_id'] = request.context.tenant
@ -39,6 +46,8 @@ class Controller(object):
return environment.to_dict()
def show(self, request, environment_id):
log.debug(_('Environments:Show <Id: {0}>'.format(environment_id)))
session = get_session()
environment = session.query(Environment).get(environment_id)
@ -46,9 +55,14 @@ 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 <Id: {0}, Body: {1}>'.format(environment_id, body)))
session = get_session()
environment = session.query(Environment).get(environment_id)
@ -62,6 +76,8 @@ class Controller(object):
return environment.to_dict()
def delete(self, request, environment_id):
log.debug(_('Environments:Delete <Id: {0}>'.format(environment_id)))
session = get_session()
environment = session.query(Environment).get(environment_id)

View File

@ -24,6 +24,8 @@ class Controller(object):
self.ch.exchange_declare('tasks', 'direct', durable=True, auto_delete=False)
def index(self, request, environment_id):
log.debug(_('Session:List <EnvId: {0}>'.format(environment_id)))
filters = {'environment_id': environment_id, 'user_id': request.context.user}
unit = get_session()
@ -33,13 +35,16 @@ class Controller(object):
session.environment.tenant_id == request.context.tenant]}
def configure(self, request, environment_id):
log.debug(_('Session:Configure <EnvId: {0}>'.format(environment_id)))
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_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
@ -53,6 +58,8 @@ class Controller(object):
return session.to_dict()
def show(self, request, environment_id, session_id):
log.debug(_('Session:Show <EnvId: {0}, SessionId: {1}>'.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 <EnvId: {0}, SessionId: {1}>'.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 <EnvId: {0}, SessionId: {1}>'.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 <EnvId: {0}, SessionId: {1}>'.format(environment_id, session_id)))
unit = get_session()
session = unit.query(Session).get(session_id)

View File

@ -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
@ -8,32 +8,32 @@ log = logging.getLogger(__name__)
class Controller(object):
@utils.verify_session
def index(self, request, environment_id):
draft = get_draft(request.context.session)
log.debug(_('WebServer:List <EnvId: {0}>'.format(environment_id)))
if not draft.has_key('services'):
return dict()
draft = prepare_draft(get_draft(environment_id, request.context.session))
if not draft['services'].has_key('webServers'):
return dict()
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
def create(self, request, environment_id, body):
draft = get_draft(request.context.session)
log.debug(_('WebServer:Create <EnvId: {0}, Body: {1}>'.format(environment_id, body)))
draft = get_draft(session_id=request.context.session)
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']:
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)
@ -43,7 +43,9 @@ class Controller(object):
@utils.verify_session
def delete(self, request, environment_id, web_server_id):
draft = get_draft(request.context.session)
log.debug(_('WebServer:Delete <EnvId: {0}, Id: {1}>'.format(environment_id, web_server_id)))
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)

View File

@ -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)
@ -43,7 +43,7 @@ class TaskResultHandlerService(service.Service):
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.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
@ -63,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)))

View File

@ -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()

View File

@ -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'))

View File

@ -33,4 +33,4 @@ class Client(http.HTTPClient):
self.environments = environments.EnvironmentManager(self)
self.sessions = sessions.SessionManager(self)
self.activeDirectories = services.ActiveDirectoryManager(self)
self.webServers = services.WebServerManager(self)
self.webServers = services.WebServerManager(self)

View File

@ -34,10 +34,11 @@ class EnvironmentManager(base.Manager):
return self._create('environments', {'name': name})
def update(self, environment_id, name):
return self._update('environments/{id}'.format(id=environment_id), {'name': name})
return self._update('environments/{id}'.format(id=environment_id),
{'name': name})
def delete(self, environment_id):
return self._delete('environments/{id}'.format(id=environment_id))
def get(self, environment_id):
return self._get("environments/{id}".format(id=environment_id))
return self._get("environments/{id}".format(id=environment_id))

View File

@ -27,22 +27,32 @@ class ActiveDirectory(base.Resource):
class ActiveDirectoryManager(base.Manager):
resource_class = ActiveDirectory
def list(self, environment_id, session_id):
headers = {'X-Configuration-Session': session_id}
return self._list('environments/{id}/activeDirectories'.format(id=environment_id), 'activeDirectories',
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)
def create(self, environment_id, session_id, active_directory):
headers = {'X-Configuration-Session': session_id}
return self._create('environments/{id}/activeDirectories'.format(id=environment_id), active_directory,
return self._create('environments/{id}/activeDirectories'.
format(id=environment_id),
active_directory,
headers=headers)
def delete(self, environment_id, session_id, active_directory_id):
def delete(self, environment_id, session_id, service_id):
headers = {'X-Configuration-Session': session_id}
path = 'environments/{id}/activeDirectories/{active_directory_id}'
return self._delete('environments/{id}/activeDirectories/{active_directory_id}'
.format(id=environment_id, active_directory_id=active_directory_id), headers=headers)
return self._delete(patch.format(id=environment_id,
active_directory_id=service_id),
headers=headers)
class WebServer(base.Resource):
@ -56,19 +66,29 @@ class WebServer(base.Resource):
class WebServerManager(base.Manager):
resource_class = WebServer
def list(self, environment_id, session_id):
headers = {'X-Configuration-Session': session_id}
return self._list('environments/{id}/webServers'.format(id=environment_id), 'webServers',
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)
def create(self, environment_id, session_id, web_server):
headers = {'X-Configuration-Session': session_id}
return self._create('environments/{id}/webServers'.format(id=environment_id), web_server,
return self._create('environments/{id}/webServers'.
format(id=environment_id),
web_server,
headers=headers)
def delete(self, environment_id, session_id, web_server_id):
def delete(self, environment_id, session_id, service_id):
headers = {'X-Configuration-Session': session_id}
return self._delete('environments/{id}/webServers/{web_server_id}'
.format(id=environment_id, web_server_id=web_server_id), headers=headers)
.format(id=environment_id,
web_server_id=service_id),
headers=headers)

View File

@ -37,26 +37,32 @@ class SessionManager(base.Manager):
resource_class = Session
def list(self, environment_id):
return self._list('environments/{id}/sessions'.format(id=environment_id), 'sessions')
return self._list('environments/{id}/sessions'.
format(id=environment_id), 'sessions')
def get(self, environment_id, session_id):
return self._get('environments/{id}/sessions/{session_id}'.format(id=environment_id, session_id=session_id))
return self._get('environments/{id}/sessions/{session_id}'.
format(id=environment_id, session_id=session_id))
def configure(self, environment_id):
return self._create('environments/{id}/configure'.format(id=environment_id), None)
return self._create('environments/{id}/configure'.
format(id=environment_id), None)
def deploy(self, environment_id, session_id):
path = 'environments/{id}/sessions/{session_id}/deploy'
self.api.json_request('POST',
'environments/{id}/sessions/{session_id}/deploy'.format(id=environment_id,
session_id=session_id))
path.format(id=environment_id,
session_id=session_id))
def reports(self, environment_id, session_id):
path = 'environments/{id}/sessions/{session_id}/reports'
resp, body = self.api.json_request('GET',
'environments/{id}/sessions/{session_id}/reports'.
format(id=environment_id, session_id=session_id))
path.format(id=environment_id,
session_id=session_id))
data = body['reports']
return [Status(self, res, loaded=True) for res in data if res]
def delete(self, environment_id, session_id):
return self._delete("environments/{id}/sessions/{session_id}".format(id=environment_id, session_id=session_id))
return self._delete("environments/{id}/sessions/{session_id}".
format(id=environment_id, session_id=session_id))