Add more methods and tests
This commit is contained in:
parent
0b0915a327
commit
7cb8c8766f
|
@ -56,6 +56,68 @@ def delete_rate(rate_id):
|
|||
central_api.delete_rate(context, rate_id)
|
||||
|
||||
|
||||
@blueprint.route('/accounts', methods=['POST'])
|
||||
def add_account():
|
||||
context = flask.request.environ.get('context')
|
||||
values = flask.request.json
|
||||
|
||||
account = central_api.add_account(context, values)
|
||||
return flask.jsonify(account=account)
|
||||
|
||||
|
||||
@blueprint.route('/accounts', methods=['GET'])
|
||||
def get_accounts():
|
||||
context = flask.request.environ.get('context')
|
||||
accounts = central_api.get_accounts(context)
|
||||
return flask.jsonify(accounts=accounts)
|
||||
|
||||
|
||||
@blueprint.route('/accounts/<account_id>', methods=['PUT'])
|
||||
def update_account(account_id):
|
||||
context = flask.request.environ.get('context')
|
||||
values = flask.request.json
|
||||
|
||||
account = central_api.update_account(context, account_id, values)
|
||||
return flask.jsonify(account=account)
|
||||
|
||||
|
||||
@blueprint.route('/accounts/<account_id>', methods=['DELETE'])
|
||||
def delete_account(account_id):
|
||||
context = flask.request.environ.get('context')
|
||||
central_api.delete_account(context, account_id)
|
||||
|
||||
|
||||
@blueprint.route('/system_accounts', methods=['POST'])
|
||||
def add_system_account():
|
||||
context = flask.request.environ.get('context')
|
||||
values = flask.request.json
|
||||
|
||||
account = central_api.add_system_account(context, values)
|
||||
return flask.jsonify(system_account=account)
|
||||
|
||||
|
||||
@blueprint.route('/system_accounts', methods=['GET'])
|
||||
def get_system_accounts():
|
||||
context = flask.request.environ.get('context')
|
||||
accounts = central_api.get_system_accounts(context)
|
||||
return flask.jsonify(system_accounts=accounts)
|
||||
|
||||
|
||||
@blueprint.route('/system_accounts/<account_id>', methods=['PUT'])
|
||||
def update_system_account(account_id):
|
||||
context = flask.request.environ.get('context')
|
||||
values = flask.request.json
|
||||
|
||||
account = central_api.update_system_account(context, account_id, values)
|
||||
return flask.jsonify(system_account=account)
|
||||
|
||||
|
||||
@blueprint.route('/system_accounts/<account_id>', methods=['DELETE'])
|
||||
def delete_system_account(account_id):
|
||||
context = flask.request.environ.get('context')
|
||||
central_api.delete_account(context, account_id)
|
||||
|
||||
|
||||
@blueprint.route('/record', methods=['POST'])
|
||||
def process_record():
|
||||
context = flask.request.environ.get('context')
|
||||
|
|
|
@ -34,6 +34,16 @@ def add_rate(context, values):
|
|||
return RPC.call(context, msg)
|
||||
|
||||
|
||||
def get_rate(context, rate_id):
|
||||
msg = {
|
||||
"method": "get_rate",
|
||||
"args": {
|
||||
"rate_id": rate_id
|
||||
}
|
||||
}
|
||||
return RPC.call(context, msg)
|
||||
|
||||
|
||||
def get_rates(context):
|
||||
msg = {
|
||||
"method": "get_rates",
|
||||
|
@ -62,6 +72,102 @@ def delete_rate(context, rate_id):
|
|||
return RPC.call(context, msg)
|
||||
|
||||
|
||||
def add_account(context, values):
|
||||
msg = {
|
||||
"method": "add_account",
|
||||
"args": {
|
||||
"values": values
|
||||
}
|
||||
}
|
||||
return RPC.call(context, msg)
|
||||
|
||||
|
||||
def get_account(context, account_id):
|
||||
msg = {
|
||||
"method": "get_account",
|
||||
"args": {
|
||||
"account_id": account_id
|
||||
}
|
||||
}
|
||||
return RPC.call(context, msg)
|
||||
|
||||
|
||||
def get_accounts(context):
|
||||
msg = {
|
||||
"method": "get_accounts",
|
||||
}
|
||||
return RPC.call(context, msg)
|
||||
|
||||
|
||||
def update_account(context, account_id, values):
|
||||
msg = {
|
||||
"method": "update_account",
|
||||
"args": {
|
||||
"account_id": account_id,
|
||||
"values": values
|
||||
}
|
||||
}
|
||||
return RPC.call(context, msg)
|
||||
|
||||
|
||||
def delete_account(context, rate_id):
|
||||
msg = {
|
||||
"method": "delete_account",
|
||||
"args": {
|
||||
"account_id": account_id
|
||||
}
|
||||
}
|
||||
return RPC.call(context, msg)
|
||||
|
||||
|
||||
def add_system_account(context, values):
|
||||
msg = {
|
||||
"method": "add_system_account",
|
||||
"args": {
|
||||
"values": values
|
||||
}
|
||||
}
|
||||
return RPC.call(context, msg)
|
||||
|
||||
|
||||
def get_system_account(context, account_id):
|
||||
msg = {
|
||||
"method": "get_system_account",
|
||||
"args": {
|
||||
"account_id": account_id
|
||||
}
|
||||
}
|
||||
return RPC.call(context, msg)
|
||||
|
||||
|
||||
def get_system_accounts(context):
|
||||
msg = {
|
||||
"method": "get_system_accounts",
|
||||
}
|
||||
return RPC.call(context, msg)
|
||||
|
||||
|
||||
def update_system_account(context, account_id, values):
|
||||
msg = {
|
||||
"method": "update_system_account",
|
||||
"args": {
|
||||
"account_id": account_id,
|
||||
"values": values
|
||||
}
|
||||
}
|
||||
return RPC.call(context, msg)
|
||||
|
||||
|
||||
def delete_system_account(context, account_id):
|
||||
msg = {
|
||||
"method": "delete_system_account",
|
||||
"args": {
|
||||
"account_id": account_id
|
||||
}
|
||||
}
|
||||
return RPC.call(context, msg)
|
||||
|
||||
|
||||
def process_record(context, values):
|
||||
msg = {
|
||||
"method": "process_record",
|
||||
|
|
|
@ -17,6 +17,7 @@
|
|||
from bufunfa.openstack.common import cfg
|
||||
from bufunfa.openstack.common import log
|
||||
from bufunfa.openstack.common.rpc import service as rpc_service
|
||||
from bufunfa import exceptions
|
||||
from bufunfa import storage
|
||||
from bufunfa import utils
|
||||
|
||||
|
@ -37,6 +38,9 @@ class Service(rpc_service.Service):
|
|||
def add_rate(self, context, values):
|
||||
return self.storage_conn.add_rate(context, values)
|
||||
|
||||
def get_rate(self, context, rate_id):
|
||||
return self.storage_conn.get_rate(context, rate_id)
|
||||
|
||||
def get_rates(self, context):
|
||||
return self.storage_conn.get_rates(context)
|
||||
|
||||
|
@ -46,5 +50,51 @@ class Service(rpc_service.Service):
|
|||
def delete_rate(self, context, rate_id):
|
||||
return self.storage_conn.delete_rate(context, rate_id)
|
||||
|
||||
def add_account(self, context, values):
|
||||
return self.storage_conn.add_account(context, values)
|
||||
|
||||
def get_account(self, context, account_id):
|
||||
return self.storage_conn.get_account(context, account_id)
|
||||
|
||||
def get_accounts(self, context):
|
||||
return self.storage_conn.get_accounts(context)
|
||||
|
||||
def update_account(self, context, account_id, values):
|
||||
return self.storage_conn.update_account(context, account_id, values)
|
||||
|
||||
def delete_account(self, context, account_id):
|
||||
return self.storage_conn.delete_rate(context, account_id)
|
||||
|
||||
def add_system_account(self, context, values):
|
||||
return self.storage_conn.add_system_account(context, values)
|
||||
|
||||
def get_system_account(self, context, account_id):
|
||||
return self.storage_conn.get_system_account(context, account_id)
|
||||
|
||||
def get_system_accounts(self, context):
|
||||
return self.storage_conn.get_system_accounts(context)
|
||||
|
||||
def update_system_account(self, context, account_id, values):
|
||||
return self.storage_conn.update_account(context, account_id, values)
|
||||
|
||||
def delete_system_account(self, context, account_id):
|
||||
return self.storage_conn.delete_rate(context, account_id)
|
||||
|
||||
def process_records(self, context, records):
|
||||
"""
|
||||
Process records in a batch
|
||||
"""
|
||||
for record in records:
|
||||
self.process_record(context, record)
|
||||
|
||||
def process_record(self, context, values):
|
||||
return self.storage_conn.process_record(context, values)
|
||||
# NOTE: Add the system if it doesn't exist..
|
||||
try:
|
||||
self.storage_conn.get_system_account(
|
||||
context, values['account_id'])
|
||||
except exceptions.NotFound:
|
||||
self.storage_conn.add_system_account(
|
||||
context,
|
||||
{'id': values['account_id']})
|
||||
|
||||
self.storage_conn.add_record(context, values)
|
||||
|
|
|
@ -62,7 +62,7 @@ class Connection(base.Connection):
|
|||
""" Semi-Private Method to reset the database schema """
|
||||
models.Base.metadata.drop_all(self.session.bind)
|
||||
|
||||
def _get_id(self, context, model, id):
|
||||
def _get_id(self, model, context, id):
|
||||
"""
|
||||
Helper to not write the same code x times
|
||||
"""
|
||||
|
@ -73,14 +73,14 @@ class Connection(base.Connection):
|
|||
else:
|
||||
return obj
|
||||
|
||||
def _add(self, context, model, values):
|
||||
def _add(self, model, context, values):
|
||||
obj = model()
|
||||
obj.update(values)
|
||||
obj.save(self.session)
|
||||
return obj
|
||||
|
||||
def _update(self, context, model, id, values):
|
||||
obj = self._get_id(context, model, id)
|
||||
def _update(self, model, context, id, values):
|
||||
obj = self._get_id(model, context, id)
|
||||
obj.update(values)
|
||||
try:
|
||||
obj.save(self.session)
|
||||
|
@ -94,42 +94,60 @@ class Connection(base.Connection):
|
|||
else:
|
||||
return self._update(context, model, values, id)
|
||||
|
||||
# NOTE: Rates
|
||||
def add_rate(self, context, values, session=None):
|
||||
return self._add(context, models.Rate, values)
|
||||
def add_rate(self, context, values):
|
||||
return self._add(models.Rate, context, values)
|
||||
|
||||
def get_rates(self, context, session=None):
|
||||
def get_rate(self, context, rate_id):
|
||||
return self._get_id(models.Rate, context, rate_id)
|
||||
|
||||
def get_rates(self, context):
|
||||
query = self.session.query(models.Rate)
|
||||
return [row2dict(row) for row in query.all()]
|
||||
|
||||
def update_rate(self, context, rate_id, values):
|
||||
return self._update(context, models.Rate, rate_id, values)
|
||||
return self._update(models.Rate, context, rate_id, values)
|
||||
|
||||
def delete_rate(self, context, rate_id):
|
||||
obj = self._get_id(context, models.Rate, rate_id)
|
||||
obj = self._get_id(models.Rate, context, rate_id)
|
||||
obj.delete(self.session)
|
||||
|
||||
# NOTE: System Accounts
|
||||
def add_system_account(self, context, values, session=None):
|
||||
return self._add(context, models.SystemAccount, values)
|
||||
def add_account(self, context, values):
|
||||
return self._add(models.Account, context, values)
|
||||
|
||||
def get_system_account(self, context, account_id, session=None):
|
||||
return self._get_id(context, models.SystemAccount, account_id)
|
||||
def get_account(self, context, account_id):
|
||||
return self._get_id(models.Account, context, account_id)
|
||||
|
||||
def get_systems_account(self, context, session=None):
|
||||
def get_accounts(self, conetxt):
|
||||
query = self.session.query(models.Account)
|
||||
return [row2dict(row) for row in query.all()]
|
||||
|
||||
def update_account(self, context, account_id, values):
|
||||
return self._update(models.Account, context, account_id, values)
|
||||
|
||||
def delete_account(self, context, account_id):
|
||||
obj = self._get_id(models.Account, context, account_id)
|
||||
obj.delete(self.session)
|
||||
|
||||
def add_system_account(self, context, values):
|
||||
return self._add(models.SystemAccount, context, values)
|
||||
|
||||
def get_system_account(self, context, account_id):
|
||||
return self._get_id(models.SystemAccount, context, account_id)
|
||||
|
||||
def get_system_accounts(self, context):
|
||||
query = self.session.query(models.SystemAccount)
|
||||
return [row2dict(row) for row in query.all()]
|
||||
|
||||
def update_system_account(self, context, account_id, values):
|
||||
return self._update(context, models.SystemAccount, account_id, values)
|
||||
return self._update(models.SystemAccount, context, account_id, values)
|
||||
|
||||
def delete_system_account(self, context, account_id):
|
||||
obj = self._get_id(context, models.SystemAccount, account_id)
|
||||
obj = self._get_id(models.SystemAccount, context, account_id)
|
||||
obj.delete(self.session)
|
||||
|
||||
# NOTE: Records
|
||||
def add_record(self, context, values):
|
||||
self._add(context, models.Record, values)
|
||||
self._add(models.Record, context, values)
|
||||
|
||||
|
||||
def row2dict(row):
|
||||
|
|
|
@ -13,6 +13,7 @@
|
|||
# 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 datetime, timedelta
|
||||
import random
|
||||
from bufunfa.openstack.common import log as logging
|
||||
from bufunfa.tests.test_central import CentralTestCase
|
||||
|
@ -24,7 +25,25 @@ LOG = logging.getLogger(__name__)
|
|||
class ServiceTest(CentralTestCase):
|
||||
__test__ = True
|
||||
|
||||
record = {
|
||||
'resource_id': '0cc13414-905d-4563-b61a-e80702566fd5',
|
||||
'type': 'instance',
|
||||
'volume': 3.5,
|
||||
'start_timestamp': datetime.now() - timedelta(1),
|
||||
'end_timestamp': datetime.now(),
|
||||
'account_id': 'c97027dd880d4c129ae7a4ba7edade05'
|
||||
}
|
||||
|
||||
def setUp(self):
|
||||
super(ServiceTest, self).setUp()
|
||||
self.config(rpc_backend='bufunfa.openstack.common.rpc.impl_fake')
|
||||
self.service = self.get_central_service()
|
||||
self.admin_context = self.get_admin_context()
|
||||
|
||||
def test_process_record_unexisting_system(self):
|
||||
self.service.process_record(
|
||||
self.admin_context, self.record)
|
||||
|
||||
system = self.service.storage_conn.get_system_account(
|
||||
self.admin_context, self.record['account_id'])
|
||||
self.assertEquals(system.id, self.record['account_id'])
|
||||
|
|
|
@ -40,6 +40,22 @@ class StorageDriverTestCase(StorageTestCase):
|
|||
{'name': 'memory', 'value': 2}
|
||||
]
|
||||
|
||||
account_fixtures = [
|
||||
{'name': 'customer_a'},
|
||||
{'name': 'customer_b'}
|
||||
]
|
||||
|
||||
system_account_fixtures = [
|
||||
{
|
||||
'id': 'd44f1779-5034-455e-b334-cac2ac3eee33',
|
||||
'name': 'system_a'
|
||||
},
|
||||
{
|
||||
'id': 'a45e43af-090b-4045-ae78-6a9d507d1418',
|
||||
'name': 'system_b'
|
||||
}
|
||||
]
|
||||
|
||||
def setUp(self):
|
||||
super(StorageDriverTestCase, self).setUp()
|
||||
self.storage_conn = self.get_storage_driver()
|
||||
|
@ -48,32 +64,76 @@ class StorageDriverTestCase(StorageTestCase):
|
|||
def test_init(self):
|
||||
self.get_storage_driver()
|
||||
|
||||
def add_rate_fixtures(self, fixture=0, values={}):
|
||||
def add_rate_fixture(self, context=None, fixture=0, values={}):
|
||||
context = context or self.admin_context
|
||||
_values = copy.copy(self.rate_fixtures[fixture])
|
||||
_values.update(values)
|
||||
return self.storage_conn.add_rate(self.admin_context, _values)
|
||||
return self.storage_conn.add_rate(context, _values)
|
||||
|
||||
def add_account_fixture(self, context=None, fixture=0, values={}):
|
||||
context = context or self.admin_context
|
||||
_values = copy.copy(self.account_fixtures[fixture])
|
||||
_values.update(values)
|
||||
return self.storage_conn.add_account(context, _values)
|
||||
|
||||
def add_system_account_fixture(self, context=None, fixture=0, values={}):
|
||||
context = context or self.admin_context
|
||||
_values = copy.copy(self.system_account_fixtures[fixture])
|
||||
_values.update(values)
|
||||
return self.storage_conn.add_system_account(context, _values)
|
||||
|
||||
def test_add_rate(self):
|
||||
rate = self.storage_conn.add_rate(
|
||||
self.admin_context,
|
||||
{'name': 'cpu', 'value': 1})
|
||||
self.assertEquals(rate.name, 'cpu')
|
||||
self.assertEquals(rate.value, 1)
|
||||
rate = self.add_rate_fixture()
|
||||
self.assertEquals(rate.name, self.rate_fixtures[0]['name'])
|
||||
self.assertEquals(rate.value, self.rate_fixtures[0]['value'])
|
||||
|
||||
def test_delete_rate(self):
|
||||
# NOTE: Needs fixing - get_rate is missing
|
||||
rate = self.storage_conn.add_rate(
|
||||
self.admin_context,
|
||||
{'name': 'cpu', 'value': 1})
|
||||
rate = self.add_rate_fixture()
|
||||
self.storage_conn.delete_rate(self.admin_context, rate.id)
|
||||
with self.assertRaises(exceptions.NotFound):
|
||||
self.storage_conn.get_rate(self.admin_context, rate.id)
|
||||
|
||||
def test_update_rate(self):
|
||||
rate = self.storage_conn.add_rate(
|
||||
self.admin_context,
|
||||
{'name': 'cpu', 'value': 1})
|
||||
rate = self.add_rate_fixture()
|
||||
self.storage_conn.update_rate(
|
||||
self.admin_context,
|
||||
rate.id,
|
||||
values={'name': 'memory', 'value': 15})
|
||||
self.assertEquals(rate.name, 'memory')
|
||||
self.assertEquals(rate.value, 15)
|
||||
|
||||
def test_add_account(self):
|
||||
account = self.add_account_fixture()
|
||||
self.assertEquals(account.name, self.account_fixtures[0]['name'])
|
||||
|
||||
def test_delete_account(self):
|
||||
account = self.add_account_fixture()
|
||||
self.storage_conn.delete_account(self.admin_context, account.id)
|
||||
with self.assertRaises(exceptions.NotFound):
|
||||
self.storage_conn.get_account(self.admin_context, account.id)
|
||||
|
||||
def test_update_account(self):
|
||||
account = self.add_account_fixture()
|
||||
self.storage_conn.update_account(
|
||||
self.admin_context,
|
||||
account.id,
|
||||
values={'name': 'customer_a'})
|
||||
self.assertEquals(account.name, 'customer_a')
|
||||
|
||||
def test_add_system_account(self):
|
||||
account = self.add_system_account_fixture()
|
||||
self.assertEquals(account.name, self.system_account_fixtures[0]['name'])
|
||||
|
||||
def test_delete_system_account(self):
|
||||
account = self.add_system_account_fixture()
|
||||
self.storage_conn.delete_system_account(self.admin_context, account.id)
|
||||
with self.assertRaises(exceptions.NotFound):
|
||||
self.storage_conn.get_system_account(self.admin_context, account.id)
|
||||
|
||||
def test_update_system_account(self):
|
||||
account = self.add_system_account_fixture()
|
||||
self.storage_conn.update_system_account(
|
||||
self.admin_context,
|
||||
account.id,
|
||||
values={'name': 'system_b'})
|
||||
self.assertEquals(account.name, 'system_b')
|
||||
|
|
Loading…
Reference in New Issue