In my previous post on Qinling, I showed how to get started with OpenStack’s function-as-a-service project. Here, I’ll explain how to use it with a very simple function and show what Qinling does behind the scenes from a high-level perspective.
The diagram above offers a quick look at what happens when a function is executed. First of all, the execution can be triggered by multiple clients such as GitHub, Prometheus, Mistral, your dear colleague, etc… But keep in mind that there aren’t really any limits about what can act as a trigger — a lollipop, your dog, E.T.
The sidecar
container deployed within the POD is only used to download the code from Qinling API, the /download
endpoint is called by the runtime
container via http://localhost:9091/download. You’ll find the runtime here.
A very simple function
Let’s use a very simple function to demonstrate Qinling basics. The function is written in Python, so you’ll need a Python runtime. (Stay tuned: runtimes will be the subject of an upcoming post.)
def main(**kwargs):
print("Hello Qinling \o/")
Here we have a function named main()
that prints “Hello Qinling \o/”. To interact with the Qinling API, a client is required, it could be python-qinlingclient
, httpie
or curl
. I’m going with the easiest option, the official client which I installed by pip
.
$ openstack function create --name func-hq-1 \
--runtime python3 --file hello_qinling.py --entry hello_qinling.main
The command is simple — I asked to Qinling to create a function. hello_qinling.py
is a simple file (not a package), I used the python3
runtime to execute my function. Last but not least, the entry point says to Qinling how to enter in the function, which in the example is hello_qinling.main
(the file name and the function to execute in this file).
Get the function ID returned by the command..
Run, Qinling, run… and show me the output!
When a function is executed it should return a value, depending how it has been coded of course. Qinling can provide two different outputs/results:
return
: Terminates and returns a value from a functionprint
: Displays a value to the standard output/console
Let’s execute the function with the ID from the function created above and see the result
line.
$ openstack function execution create 484c45df-6637-4349-86cc-ecaa6041352e | grep result
| result | {"duration": 0.129, "output": null} |
By default, Qinling will display the return
under the output JSON keyword (yes, the result field is JSON formatted). Of course if no return
exists (as in our sample function) then the output value will be null. But then where the print defined in our function will be displayed ?
Qinling provides a way to show messages printed during the function execution. The function execution returned an ID, this one is required to display the function log.
$ openstack function execution log show 4a3cc6ae-3353-4d90-bae5-3f4bf89d4ae9
Start execution: 4a3cc6ae-3353-4d90-bae5-3f4bf89d4ae9
Hello Qinling \o/
Finished execution: 4a3cc6ae-3353-4d90-bae5-3f4bf89d4ae9
As expected “Hello Qinling \o/
” as been printed.
Your turn
Now that all the tools have been provided, let’s try a little test. What will be the result of running this function?
def main(**kwargs):
msg = "Hello Qinling \o/"
return msg
Just post the answer/output in the comments section and let’s see if you get the concept, if not then I failed!
About the author
Gaëtan Trellu is a technical operations manager at Ormuco. This post first appeared on Medium.
Superuser is always interested in open infra community topics, get in touch at editorATopenstack.org
Photo // CC BY NC
- How to run a packaged function with Qinling - July 26, 2019
- How to run a simple function with Qinling - July 15, 2019
- A quickstart guide to deploying Qinling in production - July 5, 2019