aodh/ceilometer/nova_client.py
liu-sheng 8057b66c0b Fix the floatingip pollster
Ceilometer cannot poll and publish floatingip samples, this is
because Nova and Novaclient didn't provide floatingips that don't belong
to the project of the current context.
After merging the following patches it will be possible if parameter
all_tenants is enabled.

I7ab1d5ff463fc29928f6811f846c9e204390a412
I4549341badfdb846c03f2828159c46bc4c4a2c77
I35a2155401247d49017bf3c03341b082cb87750d

Change-Id: Ib5a22d6ba6a815f61713194accb4ece11171f706
Closes-bug: #1262124
2014-05-26 08:59:26 +08:00

121 lines
3.7 KiB
Python

# -*- encoding: utf-8 -*-
#
# Author: John Tran <jhtran@att.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.
import functools
import novaclient
from novaclient.v1_1 import client as nova_client
from oslo.config import cfg
from ceilometer.openstack.common import log
cfg.CONF.import_group('service_credentials', 'ceilometer.service')
LOG = log.getLogger(__name__)
def logged(func):
@functools.wraps(func)
def with_logging(*args, **kwargs):
try:
return func(*args, **kwargs)
except Exception as e:
LOG.exception(e)
raise
return with_logging
class Client(object):
"""A client which gets information via python-novaclient."""
def __init__(self):
"""Initialize a nova client object."""
conf = cfg.CONF.service_credentials
tenant = conf.os_tenant_id or conf.os_tenant_name
self.nova_client = nova_client.Client(
username=conf.os_username,
api_key=conf.os_password,
project_id=tenant,
auth_url=conf.os_auth_url,
region_name=conf.os_region_name,
endpoint_type=conf.os_endpoint_type,
cacert=conf.os_cacert,
insecure=conf.insecure,
no_cache=True)
def _with_flavor_and_image(self, instances):
for instance in instances:
self._with_flavor(instance)
self._with_image(instance)
return instances
def _with_flavor(self, instance):
fid = instance.flavor['id']
try:
flavor = self.nova_client.flavors.get(fid)
except novaclient.exceptions.NotFound:
flavor = None
attr_defaults = [('name', 'unknown-id-%s' % fid),
('vcpus', 0), ('ram', 0), ('disk', 0),
('ephemeral', 0)]
for attr, default in attr_defaults:
if not flavor:
instance.flavor[attr] = default
continue
instance.flavor[attr] = getattr(flavor, attr, default)
def _with_image(self, instance):
try:
iid = instance.image['id']
except TypeError:
instance.image = None
instance.kernel_id = None
instance.ramdisk_id = None
return
try:
image = self.nova_client.images.get(iid)
except novaclient.exceptions.NotFound:
instance.image['name'] = 'unknown-id-%s' % iid
instance.kernel_id = None
instance.ramdisk_id = None
return
instance.image['name'] = getattr(image, 'name')
image_metadata = getattr(image, 'metadata', None)
for attr in ['kernel_id', 'ramdisk_id']:
ameta = image_metadata.get(attr) if image_metadata else None
setattr(instance, attr, ameta)
@logged
def instance_get_all_by_host(self, hostname):
"""Returns list of instances on particular host."""
search_opts = {'host': hostname, 'all_tenants': True}
return self._with_flavor_and_image(self.nova_client.servers.list(
detailed=True,
search_opts=search_opts))
@logged
def floating_ip_get_all(self):
"""Returns all floating ips."""
return self.nova_client.floating_ips.list(all_tenants=True)