Source code for ceilometer.network.statistics.opencontrail.driver

# Copyright (C) 2014 eNovance SAS <licensing@enovance.com>
#
# Author: Sylvain Afchain <sylvain.afchain@enovance.com>
#
# 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 oslo.utils import timeutils
from six.moves.urllib import parse as urlparse

from ceilometer.network.statistics import driver
from ceilometer.network.statistics.opencontrail import client
from ceilometer import neutron_client


[docs]class OpencontrailDriver(driver.Driver): """Driver of network analytics of Opencontrail. This driver uses resources in "pipeline.yaml". Resource requires below conditions: * resource is url * scheme is "opencontrail" This driver can be configured via query parameters. Supported parameters: * scheme: The scheme of request url to Opencontrail Analytics endpoint. (default http) * username: This is username used by Opencontrail Analytics.(default None) * password: This is password used by Opencontrail Analytics.(default None) * domain: This is domain used by Opencontrail Analytics.(default None) * verify_ssl: Specify if the certificate will be checked for https request. (default false) e.g.:: opencontrail://localhost:8143/?username=admin&password=admin& scheme=https&domain=&verify_ssl=true """ @staticmethod def _prepare_cache(endpoint, params, cache): if 'network.statistics.opencontrail' in cache: return cache['network.statistics.opencontrail'] data = { 'o_client': client.Client(endpoint, params['username'], params['password'], params.get('domain'), params.get('verify_ssl') == 'true'), 'n_client': neutron_client.Client() } cache['network.statistics.opencontrail'] = data return data
[docs] def get_sample_data(self, meter_name, parse_url, params, cache): parts = urlparse.ParseResult(params.get('scheme', ['http'])[0], parse_url.netloc, parse_url.path, None, None, None) endpoint = urlparse.urlunparse(parts) iter = self._get_iter(meter_name) if iter is None: # The extractor for this meter is not implemented or the API # doesn't have method to get this meter. return extractor = self._get_extractor(meter_name) if extractor is None: # The extractor for this meter is not implemented or the API # doesn't have method to get this meter. return data = self._prepare_cache(endpoint, params, cache) ports = data['n_client'].port_get_all() ports_map = dict((port['id'], port['tenant_id']) for port in ports) networks = data['n_client'].network_get_all() for network in networks: net_id = network['id'] timestamp = timeutils.utcnow().isoformat() statistics = data['o_client'].networks.get_port_statistics(net_id) if not statistics: continue for value in statistics['value']: for sample in iter(extractor, value, ports_map): if sample is not None: sample[2]['network_id'] = net_id yield sample + (timestamp, )
def _get_iter(self, meter_name): if meter_name.startswith('switch.port'): return self._iter_port def _get_extractor(self, meter_name): method_name = '_' + meter_name.replace('.', '_') return getattr(self, method_name, None) @staticmethod def _iter_port(extractor, value, ports_map): ifstats = value['value']['UveVirtualMachineAgent']['if_stats_list'] for ifstat in ifstats: name = ifstat['name'] device_owner_id, port_id = name.split(':') tenant_id = ports_map.get(port_id) resource_meta = {'device_owner_id': device_owner_id, 'tenant_id': tenant_id} yield extractor(ifstat, port_id, resource_meta) @staticmethod def _switch_port_receive_packets(statistic, resource_id, resource_meta): return int(statistic['in_pkts']), resource_id, resource_meta @staticmethod def _switch_port_transmit_packets(statistic, resource_id, resource_meta): return int(statistic['out_pkts']), resource_id, resource_meta @staticmethod def _switch_port_receive_bytes(statistic, resource_id, resource_meta): return int(statistic['in_bytes']), resource_id, resource_meta @staticmethod def _switch_port_transmit_bytes(statistic, resource_id, resource_meta): return int(statistic['out_bytes']), resource_id, resource_meta