# 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 logging import bunch from openstack_dashboard.api.base import url_for from muranodashboard import settings from muranoclient.v1.client import Client log = logging.getLogger(__name__) def muranoclient(request): url = getattr(settings, 'MURANO_API_URL') if not url: url = url_for(request, 'murano') token_id = request.user.token.token['id'] log.debug('Murano::Client '.format(url, token_id)) return Client(endpoint=url, token=token_id) def get_status_message_for_service(request, service_id, environment_id): session_id = Session.get(request, environment_id) reports = muranoclient(request).sessions.reports(environment_id, session_id, service_id) result = 'Initialization.... \n' for report in reports: result += ' ' + str(report.text) + '\n' return result class Session(object): @staticmethod def get_or_create(request, environment_id): """ Gets id from already opened session for specified environment, otherwise opens new session and returns it's id :param request: :param environment_id: :return: Session Id """ #We store opened sessions for each environment in dictionary per user sessions = request.session.get('sessions', {}) if environment_id in sessions: id = sessions[environment_id] else: id = muranoclient(request).sessions.configure(environment_id).id sessions[environment_id] = id request.session['sessions'] = sessions return id @staticmethod def get(request, environment_id): """ Gets id from already opened session for specified environment, otherwise returns None :param request: :param environment_id: :return: Session Id """ #We store opened sessions for each environment in dictionary per user sessions = request.session.get('sessions', {}) return sessions[environment_id] if environment_id in sessions else None def environments_list(request): log.debug('Environment::List') environments = muranoclient(request).environments.list() for index, env in enumerate(environments): environments[index].has_services = False environment = environment_get(request, env.id) for service_name, instance in environment.services.iteritems(): if instance: environments[index].has_services = True break if not environments[index].has_services: if environments[index].status == u'ready': environments[index].status = u'new' log.debug('Environment::List {0}'.format(environments)) return environments def environment_create(request, parameters): #name is required param name = parameters['name'] log.debug('Environment::Create '.format(name)) env = muranoclient(request).environments.create(name) log.debug('Environment::Create {0}'.format(env)) return env def environment_delete(request, environment_id): log.debug('Environment::Delete '.format(environment_id)) muranoclient(request).environments.delete(environment_id) def environment_get(request, environment_id): session_id = Session.get(request, environment_id) log.debug('Environment::Get '.format(environment_id)) env = muranoclient(request).environments.get(environment_id, session_id) log.debug('Environment::Get {0}'.format(env)) return env def environment_deploy(request, environment_id): session_id = Session.get(request, environment_id) log.debug('Session::Get '.format(session_id)) env = muranoclient(request).sessions.deploy(environment_id, session_id) log.debug('Environment::Deploy ' ''.format(environment_id, session_id)) return env def environment_update(request, environment_id, name): return muranoclient(request).environments.update(environment_id, name) def get_environment_name(request, environment_id): session_id = Session.get(request, environment_id) environment = muranoclient(request).environments.get(environment_id, session_id) return environment.name def get_environment_status(request, environment_id): session_id = Session.get(request, environment_id) environment = muranoclient(request).environments.get(environment_id, session_id) return environment.status def get_service_client(request, service_type): if service_type == 'Active Directory': return muranoclient(request).activeDirectories elif service_type == 'IIS': return muranoclient(request).webServers elif service_type == 'ASP.NET Application': return muranoclient(request).aspNetApps elif service_type == 'IIS Farm': return muranoclient(request).webServerFarms elif service_type == 'ASP.NET Farm': return muranoclient(request).aspNetAppFarms else: raise NameError('Unknown service type: {0}'.format(service_type)) def services_list(request, environment_id): services = [] session_id = Session.get_or_create(request, environment_id) get_environment = muranoclient(request).environments.get environment = get_environment(environment_id, session_id) for service_name, instance in environment.services.iteritems(): if instance: service_data = instance[0] reports = muranoclient(request).sessions.reports( environment_id, session_id, service_data['id']) if reports: last_operation = str(reports[-1].text) else: last_operation = '' service_data['operation'] = last_operation service_data['environment_id'] = environment_id services += instance log.debug('Service::List') return [bunch.bunchify(srv) for srv in services] def service_list_by_type(request, environment_id, service_type): session_id = Session.get(request, environment_id) service_client = get_service_client(request, service_type) instances = service_client.list(environment_id, session_id) log.debug('Service::Instances::List') return instances def service_create(request, environment_id, parameters): session_id = Session.get_or_create(request, environment_id) service_client = get_service_client(request, parameters['service_type']) log.debug('Service::Create {0}'.format(service_client)) return service_client.create(environment_id, session_id, parameters) def service_delete(request, service_id, environment_id, service_type): log.debug('Service::Delete '.format(service_id)) session_id = Session.get_or_create(request, environment_id) service_client = get_service_client(request, service_type) service_client.delete(environment_id, service_id, session_id) def service_get(request, environment_id, service_id): environment = environment_get(request, environment_id) for service_name, instance in environment.services.iteritems(): if instance: service_data = instance[0] if service_data['id'] == service_id: return service_data def check_for_services(request, environment_id): environment = environment_get(request, environment_id) for service_name, instance in environment.services.iteritems(): if instance: return True return False