From 874f62e0ab04cdb72814b60cd20ab4459fa9b4a5 Mon Sep 17 00:00:00 2001 From: Jonas Gunz Date: Wed, 13 Jan 2021 21:31:30 +0100 Subject: rename package to phpipam-api --- phpipam_api/resources.py | 134 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 134 insertions(+) create mode 100755 phpipam_api/resources.py (limited to 'phpipam_api/resources.py') diff --git a/phpipam_api/resources.py b/phpipam_api/resources.py new file mode 100755 index 0000000..8f44c17 --- /dev/null +++ b/phpipam_api/resources.py @@ -0,0 +1,134 @@ +# +# phpipam/resources.py +# (c) 2021 Jonas Gunz +# License: MIT +# +from .backend import PhpipamBackend + +# Custom functions are defined here +resource_types = { + 'sections' : { + 'getSubnets':{ + 'method':'GET', + 'request':'/sections/{section_id}/subnets', + } + }, + 'subnets' : { + 'search':{ + 'method':'GET', + 'request':'/subnets/search/{search}' + }, + 'getIP':{ + 'method':'GET', + 'request':'/subnets/{subnet_id}/addresses/{ip}/' + }, + 'getAddresses':{ + 'method':'GET', + 'request':'/subnets/{subnet_id}/addresses/' + }, + }, + 'addresses' : { + 'getByIP':{ + 'method':'GET', + 'request':'/addresses/{ip}/{subnet_id}/' + }, + 'getByTag':{ + 'method':'GET', + 'request':'/addresses/tags/{tag_id}/addresses/' + }, + 'search':{ + 'method':'GET', + 'request':'/addresses/search/{ip}/' + }, + 'getFirstFree':{ + 'method':'GET', + 'request':'/addresses/first_free/{subnet_id}/' + }, + 'getTags':{ + 'method':'GET', + 'request':'/addresses/tags/' + }, + 'getTag':{ + 'method':'GET', + 'request':'/addresses/tags/{tag_id}/' + }, + 'createFirstFree':{ + 'method':'POST', + 'request':'/addresses/first_free/{subnet_id}/' + } + }, + 'vlan':{}, + 'l2domains':{}, + 'vrf':{}, + 'devices' : { + 'getAddresses':{ + 'method':'GET', + 'request':'/devices/{device_id}/addresses/' + }, + 'getSubnets':{ + 'method':'GET', + 'request':'/devices/{device_id}/subnets/' + } + }, + 'prefix':{}, +} + +class InvalidResourceException(Exception): + pass + +class InvalidResourceOperationException(Exception): + pass + +class InvalidResourceOperationArgumentException(Exception): + pass + +class PhpipamResourceFunction: + def __init__(self, backend, resource, function): + if not function in resource_types[resource]: + raise InvalidResourceOperationException(f'Operation {function} is not defined for {resource}.') + + self._backend = backend + self._resource = resource + self._function = resource_types[resource][function] + self._name = function + + def __call__(self, **kwargs): + if 'data' in kwargs: + data = kwargs['data'] + else: + data = {} + try: + return self._backend.request( self._function['method'], self._function['request'].format(**kwargs), data=data ) + except KeyError as e: + raise InvalidResourceOperationArgumentException( f'{self._resource}.{self._name}: Missing arguments: {e.args}' ) + + +class PhpipamResource: + def __init__(self, backend, resource): + if not resource in resource_types: + raise InvalidResourceException(f'Invalid resource "{resource}"') + + self._type = resource + self._backend = backend + + def __getattr__(self, attr): + return PhpipamResourceFunction(self._backend, self._type, attr) + + # Functions every ObjectType shares + + def get(self): + """List of all objects""" + return self._backend.request('GET', f'/{self._type}') + + def byID(self, object_id): + """object identified by object_id : str""" + return self._backend.request('GET', f'/{self._type}/{object_id}') + + def create(self, data): + return self._backend.request('POST', f'/{self._type}/{object_id}', data=data) + + def edit(self, data): + return self._backend.request('PATCH', f'/{self._type}/{object_id}', data=data) + + def delete(self, object_id): + return self._backend.request('DELETE', f'/{self._type}/{object_id}') -- cgit v1.2.3