deb-murano/muranoapi/db/services/environments.py
Serg Melikyan 7552552492 Add MuranoPL Engine
Added all missing parts to complete MuranoPL implementation:
 - system classes
 - base classes
 - integration with oslo.messaging
 - package entry-point & other things to run engine
Integrated engine with API

Note: some tests are marked to be skipped,
will be enabled via separate commit.

Partially-Implements: blueprint new-metadata-dsl
Change-Id: I3c1c2326b48da57647d55ea8edfba56f1657d7d6
2014-03-21 15:34:42 +04:00

206 lines
6.9 KiB
Python

# Copyright (c) 2013 Mirantis, Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
import collections
import jsonschema
from muranoapi.api.v1 import schemas
from muranoapi.common import rpc
from muranoapi.common import uuidutils
from muranoapi.db import models
from muranoapi.db.services import sessions
from muranoapi.db import session as db_session
from muranoapi.openstack.common import timeutils
EnvironmentStatus = collections.namedtuple('EnvironmentStatus', [
'ready', 'pending', 'deploying'
])(
ready='ready', pending='pending', deploying='deploying'
)
class EnvironmentServices(object):
@staticmethod
def get_environments_by(filters):
"""
Returns list of environments
:param filters: property filters
:return: Returns list of environments
"""
unit = db_session.get_session()
environments = unit.query(models.Environment).\
filter_by(**filters).all()
for env in environments:
env['status'] = EnvironmentServices.get_status(env['id'])
return environments
@staticmethod
def get_status(environment_id):
"""
Environment can have one of three distinguished statuses:
- Deploying: there is at least one session with status `deploying`;
- Pending: there is at least one session with status `open`;
- Ready: there is no sessions in status `deploying` or `open`.
:param environment_id: Id of environment for which we checking status.
:return: Environment status
"""
#Deploying: there is at least one valid session with status `deploying`
deploying = sessions.SessionServices.get_sessions(
environment_id,
sessions.SessionState.deploying)
if len(deploying) > 0:
return 'deploying'
#Pending: there is at least one valid session with status `open`;
open = sessions.SessionServices.get_sessions(
environment_id,
sessions.SessionState.open)
if len(open) > 0:
return 'pending'
#Ready: there are no sessions in status `deploying` or `open`
return 'ready'
@staticmethod
def create(environment_params, tenant_id):
#tagging environment by tenant_id for later checks
"""
Creates environment with specified params, in particular - name
:param environment_params: Dict, e.g. {'name': 'env-name'}
:param tenant_id: Tenant Id
:return: Created Environment
"""
environment_params['tenant_id'] = tenant_id
environment = models.Environment()
environment.update(environment_params)
unit = db_session.get_session()
with unit.begin():
unit.add(environment)
#saving environment as Json to itself
environment.update({"description": environment.to_dict()})
environment.save(unit)
return environment
@staticmethod
def delete(environment_id, token):
"""
Deletes environment and notify orchestration engine about deletion
:param environment_id: Environment that is going to be deleted
:param token: OpenStack auth token
"""
unit = db_session.get_session()
environment = unit.query(models.Environment).get(environment_id)
#preparing data for removal from conductor
env = environment.description
env['services'] = {}
env['deleted'] = True
#Set X-Auth-Token for conductor
env['token'] = token
rpc.engine().handle_task(env)
with unit.begin():
unit.delete(environment)
@staticmethod
def get_environment_description(environment_id, session_id=None):
"""
Returns environment description for specified environment. If session
is specified and not in deploying state function returns modified
environment description, otherwise returns actual environment desc.
:param environment_id: Environment Id
:param session_id: Session Id
:return: Environment Description Object
"""
unit = db_session.get_session()
if session_id:
session = unit.query(models.Session).get(session_id)
if sessions.SessionServices.validate(session):
if session.state != sessions.SessionState.deployed:
env_description = session.description
else:
env = unit.query(models.Environment)\
.get(session.environment_id)
env_description = env.description
else:
env = unit.query(models.Environment)\
.get(session.environment_id)
env_description = env.description
else:
env = (unit.query(models.Environment).get(environment_id))
env_description = env.description
return env_description
@staticmethod
def save_environment_description(session_id, environment):
"""
Saves environment description to specified session
:param session_id: Session Id
:param environment: Environment Description
"""
unit = db_session.get_session()
session = unit.query(models.Session).get(session_id)
EnvironmentServices.normalize(environment)
jsonschema.validate(environment, schemas.ENV_SCHEMA)
session.description = environment
session.save(unit)
@staticmethod
def normalize(environment):
if 'id' not in environment:
environment['id'] = uuidutils.generate_uuid()
if 'services' not in environment:
return
for service in environment['services']:
if 'id' not in service:
service['id'] = uuidutils.generate_uuid()
if 'created' not in service:
service['created'] = str(timeutils.utcnow())
if 'updated' not in service:
service['updated'] = str(timeutils.utcnow())
if 'units' not in service:
continue
for idx, unit in enumerate(service['units']):
if 'id' not in unit:
unit['id'] = uuidutils.generate_uuid()
if 'name' not in unit:
unit['name'] = '{srv_name}_instance_{number}'.format(
srv_name=service['name'], number=idx
)