# 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.
from ceilometerclient import client as ceclient
from cinderclient import client as ciclient
from glanceclient import client as glclient
from gnocchiclient import client as gnclient
from ironicclient import client as irclient
from keystoneauth1 import loading as ka_loading
from keystoneclient import client as keyclient
from monascaclient import client as monclient
from neutronclient.neutron import client as netclient
from novaclient import client as nvclient
from watcher.common import exception
from watcher import conf
CONF = conf.CONF
_CLIENTS_AUTH_GROUP = 'watcher_clients_auth'
[docs]class OpenStackClients(object):
    """Convenience class to create and cache client instances."""
    def __init__(self):
        self.reset_clients()
[docs]    def reset_clients(self):
        self._session = None
        self._keystone = None
        self._nova = None
        self._glance = None
        self._gnocchi = None
        self._cinder = None
        self._ceilometer = None
        self._monasca = None
        self._neutron = None
        self._ironic = None
    def _get_keystone_session(self):
        auth = ka_loading.load_auth_from_conf_options(CONF,
                                                      _CLIENTS_AUTH_GROUP)
        sess = ka_loading.load_session_from_conf_options(CONF,
                                                         _CLIENTS_AUTH_GROUP,
                                                         auth=auth)
        return sess
    @property
    def auth_url(self):
        return self.keystone().auth_url
    @property
    def session(self):
        if not self._session:
            self._session = self._get_keystone_session()
        return self._session
    def _get_client_option(self, client, option):
        return getattr(getattr(CONF, '%s_client' % client), option)
[docs]    @exception.wrap_keystone_exception
    def keystone(self):
        if not self._keystone:
            self._keystone = keyclient.Client(session=self.session)
        return self._keystone
[docs]    @exception.wrap_keystone_exception
    def nova(self):
        if self._nova:
            return self._nova
        novaclient_version = self._get_client_option('nova', 'api_version')
        nova_endpoint_type = self._get_client_option('nova', 'endpoint_type')
        nova_region_name = self._get_client_option('nova', 'region_name')
        self._nova = nvclient.Client(novaclient_version,
                                     endpoint_type=nova_endpoint_type,
                                     region_name=nova_region_name,
                                     session=self.session)
        return self._nova
[docs]    @exception.wrap_keystone_exception
    def glance(self):
        if self._glance:
            return self._glance
        glanceclient_version = self._get_client_option('glance', 'api_version')
        glance_endpoint_type = self._get_client_option('glance',
                                                       'endpoint_type')
        glance_region_name = self._get_client_option('glance', 'region_name')
        self._glance = glclient.Client(glanceclient_version,
                                       interface=glance_endpoint_type,
                                       region_name=glance_region_name,
                                       session=self.session)
        return self._glance
[docs]    @exception.wrap_keystone_exception
    def gnocchi(self):
        if self._gnocchi:
            return self._gnocchi
        gnocchiclient_version = self._get_client_option('gnocchi',
                                                        'api_version')
        gnocchiclient_interface = self._get_client_option('gnocchi',
                                                          'endpoint_type')
        gnocchiclient_region_name = self._get_client_option('gnocchi',
                                                            'region_name')
        adapter_options = {
            "interface": gnocchiclient_interface,
            "region_name": gnocchiclient_region_name
        }
        self._gnocchi = gnclient.Client(gnocchiclient_version,
                                        adapter_options=adapter_options,
                                        session=self.session)
        return self._gnocchi
[docs]    @exception.wrap_keystone_exception
    def cinder(self):
        if self._cinder:
            return self._cinder
        cinderclient_version = self._get_client_option('cinder', 'api_version')
        cinder_endpoint_type = self._get_client_option('cinder',
                                                       'endpoint_type')
        cinder_region_name = self._get_client_option('cinder', 'region_name')
        self._cinder = ciclient.Client(cinderclient_version,
                                       endpoint_type=cinder_endpoint_type,
                                       region_name=cinder_region_name,
                                       session=self.session)
        return self._cinder
[docs]    @exception.wrap_keystone_exception
    def ceilometer(self):
        if self._ceilometer:
            return self._ceilometer
        ceilometerclient_version = self._get_client_option('ceilometer',
                                                           'api_version')
        ceilometer_endpoint_type = self._get_client_option('ceilometer',
                                                           'endpoint_type')
        ceilometer_region_name = self._get_client_option('ceilometer',
                                                         'region_name')
        self._ceilometer = ceclient.get_client(
            ceilometerclient_version,
            endpoint_type=ceilometer_endpoint_type,
            region_name=ceilometer_region_name,
            session=self.session)
        return self._ceilometer
[docs]    @exception.wrap_keystone_exception
    def monasca(self):
        if self._monasca:
            return self._monasca
        monascaclient_version = self._get_client_option(
            'monasca', 'api_version')
        monascaclient_interface = self._get_client_option(
            'monasca', 'interface')
        monascaclient_region = self._get_client_option(
            'monasca', 'region_name')
        token = self.session.get_token()
        watcher_clients_auth_config = CONF.get(_CLIENTS_AUTH_GROUP)
        service_type = 'monitoring'
        monasca_kwargs = {
            'auth_url': watcher_clients_auth_config.auth_url,
            'cert_file': watcher_clients_auth_config.certfile,
            'insecure': watcher_clients_auth_config.insecure,
            'key_file': watcher_clients_auth_config.keyfile,
            'keystone_timeout': watcher_clients_auth_config.timeout,
            'os_cacert': watcher_clients_auth_config.cafile,
            'service_type': service_type,
            'token': token,
            'username': watcher_clients_auth_config.username,
            'password': watcher_clients_auth_config.password,
        }
        endpoint = self.session.get_endpoint(service_type=service_type,
                                             interface=monascaclient_interface,
                                             region_name=monascaclient_region)
        self._monasca = monclient.Client(
            monascaclient_version, endpoint, **monasca_kwargs)
        return self._monasca
[docs]    @exception.wrap_keystone_exception
    def neutron(self):
        if self._neutron:
            return self._neutron
        neutronclient_version = self._get_client_option('neutron',
                                                        'api_version')
        neutron_endpoint_type = self._get_client_option('neutron',
                                                        'endpoint_type')
        neutron_region_name = self._get_client_option('neutron', 'region_name')
        self._neutron = netclient.Client(neutronclient_version,
                                         endpoint_type=neutron_endpoint_type,
                                         region_name=neutron_region_name,
                                         session=self.session)
        self._neutron.format = 'json'
        return self._neutron
[docs]    @exception.wrap_keystone_exception
    def ironic(self):
        if self._ironic:
            return self._ironic
        ironicclient_version = self._get_client_option('ironic', 'api_version')
        endpoint_type = self._get_client_option('ironic', 'endpoint_type')
        ironic_region_name = self._get_client_option('ironic', 'region_name')
        self._ironic = irclient.get_client(ironicclient_version,
                                           os_endpoint_type=endpoint_type,
                                           region_name=ironic_region_name,
                                           session=self.session)
        return self._ironic
 
Except where otherwise noted, this document is licensed under Creative Commons Attribution 3.0 License. See all OpenStack Legal Documents.