248 lines
8.2 KiB
Python
248 lines
8.2 KiB
Python
# 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.
|
|
from datetime import date
|
|
from datetime import datetime
|
|
import json
|
|
|
|
from flask import url_for
|
|
import mock
|
|
from oslo_policy import policy as cpolicy
|
|
|
|
from distil.api import acl
|
|
from distil.common import constants
|
|
from distil.db import api as db_api
|
|
from distil.tests.unit.api import base
|
|
|
|
|
|
class TestAPI(base.APITest):
|
|
@classmethod
|
|
def setUpClass(cls):
|
|
acl.setup_policy()
|
|
|
|
def _setup_policy(self, policy):
|
|
policy.update(
|
|
{"admin_or_owner": "is_admin:True or project_id:%(project_id)s"}
|
|
)
|
|
rules = cpolicy.Rules.from_dict(policy)
|
|
acl.ENFORCER.set_rules(rules, use_conf=False)
|
|
|
|
self.addCleanup(acl.ENFORCER.clear)
|
|
|
|
def test_get_versions(self):
|
|
ret = self.client.get('/')
|
|
|
|
self.assertEqual(
|
|
{'versions': [{'id': 'v2', 'status': 'CURRENT'}]},
|
|
json.loads(ret.get_data(as_text=True))
|
|
)
|
|
|
|
@mock.patch('distil.erp.drivers.odoo.OdooDriver.get_products')
|
|
@mock.patch('odoorpc.ODOO')
|
|
def test_products_get_without_regions(self, mock_odoo,
|
|
mock_odoo_get_products):
|
|
mock_odoo_get_products.return_value = []
|
|
|
|
ret = self.client.get('/v2/products')
|
|
|
|
self.assertEqual({'products': []}, json.loads(ret.get_data(as_text=True)))
|
|
|
|
@mock.patch('distil.erp.drivers.odoo.OdooDriver.get_products')
|
|
@mock.patch('odoorpc.ODOO')
|
|
@mock.patch('distil.common.openstack.get_regions')
|
|
def test_products_get_with_regions(self, mock_regions, mock_odoo,
|
|
mock_odoo_get_products):
|
|
class Region(object):
|
|
def __init__(self, id):
|
|
self.id = id
|
|
|
|
mock_regions.return_value = [Region('nz_1'), Region('nz_2')]
|
|
mock_odoo_get_products.return_value = []
|
|
|
|
ret = self.client.get('/v2/products?regions=nz_1,nz_2')
|
|
|
|
mock_odoo_get_products.assert_called_once_with(['nz_1', 'nz_2'])
|
|
self.assertEqual({'products': []}, json.loads(ret.get_data(as_text=True)))
|
|
|
|
@mock.patch('distil.common.openstack.get_regions')
|
|
def test_products_get_with_invalid_regions(self, mock_regions):
|
|
class Region(object):
|
|
def __init__(self, id):
|
|
self.id = id
|
|
|
|
mock_regions.return_value = [Region('nz_1'), Region('nz_2')]
|
|
|
|
ret = self.client.get('/v2/products?regions=nz_1,nz_3')
|
|
|
|
self.assertEqual(404, ret.status_code)
|
|
|
|
def test_measurements_get(self):
|
|
default_project = 'tenant_1'
|
|
start = '2014-06-01T00:00:00'
|
|
end = '2014-07-01T00:00:00'
|
|
res_id = 'instance_1'
|
|
|
|
db_api.project_add(
|
|
{
|
|
'id': default_project,
|
|
'name': 'default_project',
|
|
'description': 'project for test'
|
|
}
|
|
)
|
|
db_api.resource_add(
|
|
default_project, res_id, {'type': 'Virtual Machine'}
|
|
)
|
|
db_api.usage_add(
|
|
default_project, res_id, {'instance': 100}, 'hour',
|
|
datetime.strptime(start, constants.iso_time),
|
|
datetime.strptime(end, constants.iso_time),
|
|
)
|
|
|
|
with self.app.test_request_context():
|
|
url = url_for(
|
|
'v2.measurements_get',
|
|
project_id=default_project,
|
|
start=start,
|
|
end=end
|
|
)
|
|
|
|
self._setup_policy({"rating:measurements:get": "rule:admin_or_owner"})
|
|
ret = self.client.get(url, headers={'X-Tenant-Id': default_project})
|
|
|
|
self.assertEqual(
|
|
{
|
|
'measurements': {
|
|
'start': '2014-06-01 00:00:00',
|
|
'end': '2014-07-01 00:00:00',
|
|
'project_name': 'default_project',
|
|
'project_id': default_project,
|
|
'resources': {
|
|
res_id: {
|
|
'type': 'Virtual Machine',
|
|
'services': [{
|
|
'name': 'instance',
|
|
'volume': '100.00',
|
|
'unit': 'hour'
|
|
}]
|
|
}
|
|
}
|
|
}
|
|
},
|
|
json.loads(ret.get_data(as_text=True))
|
|
)
|
|
|
|
@mock.patch('distil.erp.drivers.odoo.OdooDriver.get_invoices')
|
|
@mock.patch('odoorpc.ODOO')
|
|
def test_invoices_get(self, mock_odoo, mock_get_invoices):
|
|
default_project = 'tenant_1'
|
|
start = '2014-06-01T00:00:00'
|
|
end = '2014-07-01T00:00:00'
|
|
|
|
db_api.project_add(
|
|
{
|
|
'id': default_project,
|
|
'name': 'default_project',
|
|
'description': 'project for test'
|
|
}
|
|
)
|
|
|
|
mock_get_invoices.return_value = {}
|
|
|
|
with self.app.test_request_context():
|
|
url = url_for(
|
|
'v2.invoices_get',
|
|
project_id=default_project,
|
|
start=start,
|
|
end=end
|
|
)
|
|
|
|
self._setup_policy({"rating:invoices:get": "rule:admin_or_owner"})
|
|
ret = self.client.get(url, headers={'X-Tenant-Id': default_project})
|
|
|
|
self.assertEqual(
|
|
{
|
|
'start': '2014-06-01 00:00:00',
|
|
'end': '2014-07-01 00:00:00',
|
|
'project_name': 'default_project',
|
|
'project_id': default_project,
|
|
'invoices': {}
|
|
},
|
|
json.loads(ret.get_data(as_text=True))
|
|
)
|
|
|
|
def test_get_other_project_invoice_not_admin(self):
|
|
default_project = 'tenant_1'
|
|
start = '2014-06-01T00:00:00'
|
|
end = '2014-07-01T00:00:00'
|
|
|
|
with self.app.test_request_context():
|
|
url = url_for(
|
|
'v2.invoices_get',
|
|
project_id='other_tenant',
|
|
start=start,
|
|
end=end
|
|
)
|
|
|
|
self._setup_policy({"rating:invoices:get": "rule:admin_or_owner"})
|
|
ret = self.client.get(url, headers={'X-Tenant-Id': default_project})
|
|
|
|
self.assertEqual(403, json.loads(ret.get_data(as_text=True)).get('error_code'))
|
|
|
|
@mock.patch('distil.erp.drivers.odoo.OdooDriver.get_quotations')
|
|
@mock.patch('odoorpc.ODOO')
|
|
def test_quotations_get(self, mock_odoo, mock_get_quotations):
|
|
self.override_config('keystone_authtoken', region_name='region-1')
|
|
|
|
default_project = 'tenant_1'
|
|
res_id = 'instance_1'
|
|
today = datetime.utcnow()
|
|
datetime_today = datetime(today.year, today.month, today.day)
|
|
|
|
db_api.project_add(
|
|
{
|
|
'id': default_project,
|
|
'name': 'default_project',
|
|
'description': 'project for test'
|
|
}
|
|
)
|
|
db_api.resource_add(
|
|
default_project, res_id, {'type': 'Virtual Machine'}
|
|
)
|
|
db_api.usage_add(
|
|
default_project, res_id, {'instance': 100}, 'hour',
|
|
datetime_today,
|
|
datetime_today,
|
|
)
|
|
|
|
mock_get_quotations.return_value = {}
|
|
|
|
with self.app.test_request_context():
|
|
url = url_for(
|
|
'v2.quotations_get',
|
|
project_id=default_project,
|
|
)
|
|
|
|
self._setup_policy({"rating:quotations:get": "rule:admin_or_owner"})
|
|
ret = self.client.get(url, headers={'X-Tenant-Id': default_project})
|
|
|
|
self.assertEqual(
|
|
{
|
|
'start': str(datetime(today.year, today.month, 1)),
|
|
'end': str(datetime_today),
|
|
'project_name': 'default_project',
|
|
'project_id': default_project,
|
|
'quotations': {today.strftime("%Y-%m-%d"): {}}
|
|
},
|
|
json.loads(ret.get_data(as_text=True))
|
|
)
|