===============
Remote commands
===============
:doc:`/user-guide/command-reference` from the execution screen can also be launched and
monitored remotely through a web service API.
* `Reference`_
* `Authentication`_
* `Example`_
Reference
---------
The API endpoints can be accessed with any modern web tool or programming
language using the following URLs. The examples are using the excellent
`curl command line tool `_.
* Run a task on the default database:
::
curl -u : http(s)://:/execute/api//
--data "=&="
* Run a task on a scenario database:
::
curl -u : http(s)://://execute/api//
--data "=&="
* Get the status of all running and pending tasks:
::
curl -u : http(s)://:/execute/api/status/
* Get the status of a single task:
::
curl -u : http(s)://:/execute/api/status/?id=X
* Cancel a waiting or running task:
::
curl -u : http(s)://:/execute/api/cancel/?id=X
All these APIs return a JSON object and they are asynchronous, i.e. they
don't wait for the actual command to finish. In case you need to wait
for a task to finish, you will need to use a loop which periodically
polls the /execute/api/status URL to monitor the status.
Authentication
--------------
FrePPLe supports 2 methods for authentication of your user in this API:
* | **Basic authentication**
| See https://en.wikipedia.org/wiki/Basic_access_authentication for more
details.
| With curl you use the argument ``-u USER:PASSWORD`` on the command line.
* | **JSON Web Token**
| See https://jwt.io/ for more details.
| With curl you use the argument ``--header 'Authorization: Bearer TOKEN'``
on the command line.
We strongly recommend the use of a HTTPS configuration of the frePPLe
server when using this API. Without it your data and login credentials
are sent unencrypted over the internet.
Example
-------
To illustrate the above concepts, this section shows a common workflow to upload
new data in the frePPLe database and generate a new plan.
* Delete previous data files.
* Upload data files (in csv or excel format).
* Import the data files into frePPLe.
* Regenerate the plan with the new data.
This example uses linux bash and curl, but it can easily be coded in
any other modern programming language.
::
#!/bin/bash
server="localhost:8000"
#declare -a filelist=("buffer.csv" "item.csv")
id=0
output=""
result=""
#check the status of a task
function checkstatus () {
id=$1
if (($id>0));
then
output=$(curl -u admin:admin http://$server/execute/api/status/?id=$id);
else
output=$(curl -u admin:admin http://$server/execute/api/status/);
fi
if [[ $output =~ .*Failed || $output =~ .*Done ]];
then
output="break";
else
output="wait";
fi
echo $output
}
# you may delete all files or just the ones in the arguments
# you will have to comment the delete all files locationstable
# and uncomment the lines above
function deletefiles () {
#if you want to delete just the files that you will replace
# for FILE1 in "${filelist[@]}"; do
# FILE2=$(basename "$FILE1")
# #spaces should be escaped in the URL
# FILE2=${FILE2// /\%20}
# result=$(curl -X DELETE -u admin:admin http://$server/execute/deletefromfolder/0/"$FILE2"/);
# done
#to delete all files in the folder
result=$(curl -X DELETE -u admin:admin http://$server/execute/deletefromfolder/0/AllFiles/);
}
function waitTillComplete () {
id=$1
until [[ $WAIT -eq 0 ]]; do
if [[ "$(checkstatus $id)" =~ "break" ]]; then
#show the result
echo $(curl -u admin:admin http://$server/execute/api/status/?id=$id);
break
fi
sleep "$WAIT_TIME"
((WAIT--))
done
}
# create the file list
# if the argument is a directory it will add all the files there
# If the arguments are files only these will be added
for FILE0 in "$@"; do
if [[ -d "${FILE0}" ]]; then
cd "${FILE0}"
filelist=(*.csv *.csv.gz *.xlsx)
else
filelist=( $filelist "$FILE0" )
fi
done
#delete files before
echo -e "\n---------------start delete files----------------"
deletefiles
echo "---------------end delete files------------------"
#upload the files in the list
echo -e "\n---------------start upload files----------------"
for FILE1 in "${filelist[@]}"; do
#get filename without path
FILE2=$(basename "$FILE1")
if [[ ! "$FILE2" =~ \*.* ]]; then
curl -X POST -F "$FILE2=@$FILE1" -u admin:admin http://$server/execute/uploadtofolder/0/
fi
done
echo -e "\n---------------end upload files------------------"
#import the data in the files
echo -e "\n---------------start import the data----------------"
WAIT_TIME=10 #seconds
WAIT=6 #times
result=$(curl -X POST -u admin:admin http://$server/execute/api/importfromfolder/)
id=$(echo "${result//[!0-9]/}")
waitTillComplete $id
echo "---------------end import the data------------------"
#run the plan
echo -e "\n---------------start planning----------------"
WAIT_TIME=10 #seconds
WAIT=6 #times
result=$(curl -u admin:admin --data "constraint=15&plantype=1&env=fcst,invplan,balancing,supply" http://$server/execute/api/runplan/)
id=$(echo "${result//[!0-9]/}")
waitTillComplete $id
echo "---------------end planning------------------"