Skip to content

Commit 1cb580a

Browse files
committed
Add methods for updating and replacing Foxx services with local files
1 parent 8c87f61 commit 1cb580a

File tree

4 files changed

+183
-151
lines changed

4 files changed

+183
-151
lines changed

arango/foxx.py

Lines changed: 108 additions & 100 deletions
Original file line numberDiff line numberDiff line change
@@ -230,7 +230,8 @@ def update_service(self,
230230
dependencies=None,
231231
teardown=None,
232232
setup=None,
233-
legacy=None):
233+
legacy=None,
234+
force=None):
234235
"""Update (upgrade) a service.
235236
236237
:param mount: Service mount path (e.g "/_admin/aardvark").
@@ -247,8 +248,10 @@ def update_service(self,
247248
:type teardown: bool
248249
:param setup: Run service setup script.
249250
:type setup: bool
250-
:param legacy: Install the service in 2.8 legacy compatibility mode.
251+
:param legacy: Update the service in 2.8 legacy compatibility mode.
251252
:type legacy: bool
253+
:param force: Force update if no service is found.
254+
:type force: bool
252255
:return: Updated service metadata.
253256
:rtype: dict
254257
:raise arango.exceptions.FoxxServiceUpdateError: If update fails.
@@ -260,6 +263,8 @@ def update_service(self,
260263
params['setup'] = setup
261264
if legacy is not None:
262265
params['legacy'] = legacy
266+
if force is not None:
267+
params['force'] = force
263268

264269
data = {}
265270
if source is not None:
@@ -283,52 +288,56 @@ def response_handler(resp):
283288

284289
return self._execute(request, response_handler)
285290

286-
# TODO Remove once method is confirmed to be not supported
287-
# def update_service_by_file(self,
288-
# mount,
289-
# filename=None,
290-
# teardown=None,
291-
# setup=None,
292-
# legacy=None):
293-
# """Update (upgrade) a service using a javascript file or zip bundle.
294-
#
295-
# :param mount: Service mount path (e.g "/_admin/aardvark").
296-
# :type mount: str | unicode
297-
# :param filename: Full path to the javascript file or zip bundle.
298-
# :type filename: str | unicode
299-
# :param teardown: Run service teardown script.
300-
# :type teardown: bool
301-
# :param setup: Run service setup script.
302-
# :type setup: bool
303-
# :param legacy: Install the service in 2.8 legacy compatibility mode.
304-
# :type legacy: bool
305-
# :return: Updated service metadata.
306-
# :rtype: dict
307-
# :raise arango.exceptions.FoxxServiceUpdateError: If update fails.
308-
# """
309-
# params = {'mount': mount}
310-
# if teardown is not None:
311-
# params['teardown'] = teardown
312-
# if setup is not None:
313-
# params['setup'] = setup
314-
# if legacy is not None:
315-
# params['legacy'] = legacy
316-
#
317-
# data = self._encode_file(filename)
318-
# request = Request(
319-
# method='patch',
320-
# endpoint='/_api/foxx',
321-
# params=params,
322-
# data=data,
323-
# headers={'content-type': data.content_type}
324-
# )
325-
#
326-
# def response_handler(resp):
327-
# if not resp.is_success:
328-
# raise FoxxServiceUpdateError(resp, request)
329-
# return resp.body
330-
#
331-
# return self._execute(request, response_handler)
291+
def update_service_with_file(self,
292+
mount,
293+
filename=None,
294+
teardown=None,
295+
setup=None,
296+
legacy=None,
297+
force=None):
298+
"""Update (upgrade) a service using a javascript file or zip bundle.
299+
300+
:param mount: Service mount path (e.g "/_admin/aardvark").
301+
:type mount: str | unicode
302+
:param filename: Full path to the javascript file or zip bundle.
303+
:type filename: str | unicode
304+
:param teardown: Run service teardown script.
305+
:type teardown: bool
306+
:param setup: Run service setup script.
307+
:type setup: bool
308+
:param legacy: Update the service in 2.8 legacy compatibility mode.
309+
:type legacy: bool
310+
:param force: Force update if no service is found.
311+
:type force: bool
312+
:return: Updated service metadata.
313+
:rtype: dict
314+
:raise arango.exceptions.FoxxServiceUpdateError: If update fails.
315+
"""
316+
params = {'mount': mount}
317+
if teardown is not None:
318+
params['teardown'] = teardown
319+
if setup is not None:
320+
params['setup'] = setup
321+
if legacy is not None:
322+
params['legacy'] = legacy
323+
if force is not None:
324+
params['force'] = force
325+
326+
data = self._encode_file(filename)
327+
request = Request(
328+
method='patch',
329+
endpoint='/_api/foxx/service',
330+
params=params,
331+
data=data,
332+
headers={'content-type': data.content_type}
333+
)
334+
335+
def response_handler(resp):
336+
if not resp.is_success:
337+
raise FoxxServiceUpdateError(resp, request)
338+
return resp.body
339+
340+
return self._execute(request, response_handler)
332341

333342
def replace_service(self,
334343
mount,
@@ -355,7 +364,7 @@ def replace_service(self,
355364
:type teardown: bool
356365
:param setup: Run service setup script.
357366
:type setup: bool
358-
:param legacy: Install the service in 2.8 legacy compatibility mode.
367+
:param legacy: Replace the service in 2.8 legacy compatibility mode.
359368
:type legacy: bool
360369
:param force: Force install if no service is found.
361370
:type force: bool
@@ -395,57 +404,56 @@ def response_handler(resp):
395404

396405
return self._execute(request, response_handler)
397406

398-
# TODO Remove once method is confirmed to be not supported
399-
# def replace_service_by_file(self,
400-
# mount,
401-
# filename=None,
402-
# teardown=None,
403-
# setup=None,
404-
# legacy=None,
405-
# force=None):
406-
# """Replace a service using a javascript file or zip bundle.
407-
#
408-
# :param mount: Service mount path (e.g "/_admin/aardvark").
409-
# :type mount: str | unicode
410-
# :param filename: Full path to the javascript file or zip bundle.
411-
# :type filename: str | unicode
412-
# :param teardown: Run service teardown script.
413-
# :type teardown: bool
414-
# :param setup: Run service setup script.
415-
# :type setup: bool
416-
# :param legacy: Install the service in 2.8 legacy compatibility mode.
417-
# :type legacy: bool
418-
# :param force: Force install if no service is found.
419-
# :type force: bool
420-
# :return: Replaced service metadata.
421-
# :rtype: dict
422-
# :raise arango.exceptions.FoxxServiceReplaceError: If replace fails.
423-
# """
424-
# params = {'mount': mount}
425-
# if teardown is not None:
426-
# params['teardown'] = teardown
427-
# if setup is not None:
428-
# params['setup'] = setup
429-
# if legacy is not None:
430-
# params['legacy'] = legacy
431-
# if force is not None:
432-
# params['force'] = force
433-
#
434-
# data = self._encode_file(filename)
435-
# request = Request(
436-
# method='put',
437-
# endpoint='/_api/foxx',
438-
# params=params,
439-
# data=data,
440-
# headers={'content-type': data.content_type}
441-
# )
442-
#
443-
# def response_handler(resp):
444-
# if not resp.is_success:
445-
# raise FoxxServiceReplaceError(resp, request)
446-
# return resp.body
447-
#
448-
# return self._execute(request, response_handler)
407+
def replace_service_with_file(self,
408+
mount,
409+
filename=None,
410+
teardown=None,
411+
setup=None,
412+
legacy=None,
413+
force=None):
414+
"""Replace a service using a javascript file or zip bundle.
415+
416+
:param mount: Service mount path (e.g "/_admin/aardvark").
417+
:type mount: str | unicode
418+
:param filename: Full path to the javascript file or zip bundle.
419+
:type filename: str | unicode
420+
:param teardown: Run service teardown script.
421+
:type teardown: bool
422+
:param setup: Run service setup script.
423+
:type setup: bool
424+
:param legacy: Replace the service in 2.8 legacy compatibility mode.
425+
:type legacy: bool
426+
:param force: Force install if no service is found.
427+
:type force: bool
428+
:return: Replaced service metadata.
429+
:rtype: dict
430+
:raise arango.exceptions.FoxxServiceReplaceError: If replace fails.
431+
"""
432+
params = {'mount': mount}
433+
if teardown is not None:
434+
params['teardown'] = teardown
435+
if setup is not None:
436+
params['setup'] = setup
437+
if legacy is not None:
438+
params['legacy'] = legacy
439+
if force is not None:
440+
params['force'] = force
441+
442+
data = self._encode_file(filename)
443+
request = Request(
444+
method='put',
445+
endpoint='/_api/foxx/service',
446+
params=params,
447+
data=data,
448+
headers={'content-type': data.content_type}
449+
)
450+
451+
def response_handler(resp):
452+
if not resp.is_success:
453+
raise FoxxServiceReplaceError(resp, request)
454+
return resp.body
455+
456+
return self._execute(request, response_handler)
449457

450458
def delete_service(self, mount, teardown=None):
451459
"""Uninstall a service.

arango/version.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
__version__ = '5.3.0'
1+
__version__ = '5.4.0'

docs/foxx.rst

Lines changed: 25 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ information, refer to `ArangoDB manual`_.
9191
# Delete a service.
9292
foxx.delete_service(service_mount)
9393

94-
You can also create a Foxx service by providing a file directly.
94+
You can also manage Foxx services by using zip or Javascript files directly:
9595

9696
.. code-block:: python
9797
@@ -112,13 +112,33 @@ You can also create a Foxx service by providing a file directly.
112112
# Create a service by providing a file directly.
113113
foxx.create_service_with_file(
114114
mount=service_mount,
115-
source='/home/service.zip',
115+
filename='/home/user/service.zip',
116116
development=True,
117117
setup=True,
118118
legacy=True
119119
)
120-
foxx.enable_development(service_mount)
121-
foxx.update_config(service_mount, config={})
122-
foxx.update_dependencies(service_mount, dependencies={})
120+
121+
# Update (upgrade) a service by providing a file directly.
122+
foxx.update_service_with_file(
123+
mount=service_mount,
124+
filename='/home/user/service.zip',
125+
teardown=False,
126+
setup=True,
127+
legacy=True,
128+
force=False
129+
)
130+
131+
# Replace a service by providing a file directly.
132+
foxx.replace_service_with_file(
133+
mount=service_mount,
134+
filename='/home/user/service.zip',
135+
teardown=False,
136+
setup=True,
137+
legacy=True,
138+
force=False
139+
)
140+
141+
# Delete a service.
142+
foxx.delete_service(service_mount)
123143
124144
See :ref:`Foxx` for API specification.

0 commit comments

Comments
 (0)