Add unit test for collector/ceilometer.py
Also remove distil/common/odoo.py which is not used anywhere. This change increase coverage from 55% to 57% Change-Id: I95f673818bca570e8c0ffa91e45af5272e89c15a
This commit is contained in:
parent
4f29bf7243
commit
ccb1b5849e
@ -1,92 +0,0 @@
|
||||
# Copyright (c) 2016 Catalyst IT Ltd.
|
||||
#
|
||||
# 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 odoorpc
|
||||
|
||||
from oslo_config import cfg
|
||||
from oslo_log import log
|
||||
from distil.common import openstack
|
||||
|
||||
CONF = cfg.CONF
|
||||
|
||||
PRODUCT_CATEGORY = ('Compute', 'Network', 'Block Storage', 'Object Storage')
|
||||
|
||||
|
||||
class Odoo(object):
|
||||
|
||||
def __init__(self):
|
||||
self.odoo = odoorpc.ODOO(CONF.odoo.hostname,
|
||||
protocol=CONF.odoo.protocol,
|
||||
port=CONF.odoo.port,
|
||||
version=CONF.odoo.version)
|
||||
|
||||
self.odoo.login(CONF.odoo.database, CONF.odoo.user, CONF.odoo.password)
|
||||
|
||||
# NOTE(flwang): This is not necessary for most of cases, but just in
|
||||
# case some cloud providers are using different region name formats in
|
||||
# Keystone and Odoo.
|
||||
if CONF.odoo.region_mapping:
|
||||
regions = CONF.odoo.region_mapping.split(',')
|
||||
self.region_mapping = dict([(r.split(":")[0],
|
||||
r.split(":")[1]) for r in regions])
|
||||
|
||||
self.order = self.odoo.env['sale.order']
|
||||
self.orderline = self.odoo.env['sale.order.line']
|
||||
self.tenant = self.odoo.env['cloud.tenant']
|
||||
self.partner = self.odoo.env['res.partner']
|
||||
self.pricelist = self.odoo.env['product.pricelist']
|
||||
self.product = self.odoo.env['product.product']
|
||||
self.category = self.odoo.env['product.category']
|
||||
|
||||
def get_products(self, regions):
|
||||
if not regions:
|
||||
regions = [r.id for r in openstack.get_regions()]
|
||||
if hasattr(self, 'region_mapping'):
|
||||
regions = self.region_mapping.values()
|
||||
|
||||
else:
|
||||
if hasattr(self, 'region_mapping'):
|
||||
regions = [self.region_mapping.get(r) for r in regions]
|
||||
|
||||
prices = {}
|
||||
for r in regions:
|
||||
if not r:
|
||||
continue
|
||||
prices[r] = {}
|
||||
for category in PRODUCT_CATEGORY:
|
||||
prices[r][category.lower()] = []
|
||||
c = self.category.search([('name', '=', category),
|
||||
('display_name', 'ilike', r)])
|
||||
product_ids = self.product.search([('categ_id', '=', c[0]),
|
||||
('sale_ok', '=', True),
|
||||
('active', '=', True)])
|
||||
products = self.odoo.execute('product.product',
|
||||
'read',
|
||||
product_ids)
|
||||
for p in products:
|
||||
name = p['name_template'][len(r) + 1:]
|
||||
if 'pre-prod' in name:
|
||||
continue
|
||||
price = round(p['lst_price'], 5)
|
||||
# NOTE(flwang): default_code is Internal Reference on Odoo
|
||||
# GUI
|
||||
unit = p['default_code']
|
||||
desc = p['description']
|
||||
prices[r][category.lower()].append({'resource': name,
|
||||
'price': price,
|
||||
'unit': unit,
|
||||
'description': desc})
|
||||
|
||||
return prices
|
66
distil/tests/unit/collector/test_ceilometer.py
Normal file
66
distil/tests/unit/collector/test_ceilometer.py
Normal file
@ -0,0 +1,66 @@
|
||||
# Copyright (C) 2017 Catalyst IT Ltd
|
||||
#
|
||||
# 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 os
|
||||
from datetime import datetime
|
||||
from datetime import timedelta
|
||||
|
||||
import mock
|
||||
|
||||
from distil.collector import ceilometer
|
||||
from distil.tests.unit import base
|
||||
|
||||
FAKE_PROJECT = '123'
|
||||
FAKE_METER = 'instance'
|
||||
START = END = datetime.utcnow()
|
||||
|
||||
|
||||
class CeilometerCollectorTest(base.DistilTestCase):
|
||||
def setUp(self):
|
||||
super(CeilometerCollectorTest, self).setUp()
|
||||
|
||||
meter_mapping_file = os.path.join(
|
||||
os.environ["DISTIL_TESTS_CONFIGS_DIR"],
|
||||
'meter_mappings.yaml'
|
||||
)
|
||||
self.conf.set_default(
|
||||
'meter_mappings_file',
|
||||
meter_mapping_file,
|
||||
group='collector'
|
||||
)
|
||||
|
||||
@mock.patch('distil.common.openstack.get_ceilometer_client')
|
||||
def test_get_meter(self, mock_cclient):
|
||||
class Sample(object):
|
||||
def __init__(self, id, timestamp):
|
||||
self.id = id
|
||||
self.timestamp = timestamp
|
||||
|
||||
def to_dict(self):
|
||||
return {'meter': 'instance', 'resource_id': self.id,
|
||||
'timestamp': self.timestamp}
|
||||
|
||||
s1 = Sample('111', (datetime.utcnow() + timedelta(days=3)))
|
||||
s2 = Sample('222', (datetime.utcnow() + timedelta(days=2)))
|
||||
s3 = Sample('333', (datetime.utcnow() + timedelta(days=1)))
|
||||
|
||||
cclient = mock.Mock()
|
||||
mock_cclient.return_value = cclient
|
||||
cclient.new_samples.list.return_value = [s1, s2, s3]
|
||||
|
||||
collector = ceilometer.CeilometerCollector()
|
||||
samples = collector.get_meter(FAKE_PROJECT, FAKE_METER, START, END)
|
||||
|
||||
expected = [s3.to_dict(), s2.to_dict(), s1.to_dict()]
|
||||
|
||||
self.assertEqual(expected, samples)
|
Loading…
x
Reference in New Issue
Block a user