added chapter

This commit is contained in:
dcore94 2023-06-08 15:09:38 +02:00
parent a69fe15bde
commit 0350d733c4
7 changed files with 263 additions and 2 deletions

Binary file not shown.

View File

@ -276,6 +276,7 @@ All **input parameters** are passed in the form of template variables to the scr
There are few input parameters that are used to govern the Method execution itself rather than providing input to the Method. In particular:
- **ccpimage** as already told is required and it is used automatically during *Launch* phase in order to instantiate a container.
- **ccpnote** is a special input field that when present is used to tag the executions in order to provide better visual feedback.
- **ccpmaxtime** can be used to limit the maximum execution time of a Method. The value is expressed in seconds and it is capped by the maximum time configured for the Infrastructure.
- **ccpreplicas** currently supported on Docker swarm based Infrastructures allows for creating multiple instances of a Method execution in order to obtain a coarse grained degree of parallelism.
@ -439,3 +440,90 @@ The list of Executions are organized by their Method names [1]. For every Method
REST APIs: Interacting with Methods and Executions programmatically
-------------------------------------------------------------------
Most of the services that build up CCP are accessible programmatically via REST endpoints.
In particular, listing Methods (Jobs), executing them or getting infromation on running executions (jobStatus) are accessible through a standard API defined by OGC (Open Geospatial Consortium).
The REST API is Processes 1.2 described at (https://ogcapi.ogc.org/processes/) and can be considered a modern rework of the former WPS spcification.
The CCP REST API is documented as OpenAPI 3 specification at ().
Through the code generation widgets available in the UI elements described above, it is possible to obtain stubs that show how to interact programmatically with CCP in order to request a Method execution or re-execution and to monitor the evolution.
The following is an example code stub generated for the R programming language.
.. code-block:: R
:caption: Example code for requesting a Method execution on CCP
# Dependencies
library(httr)
library(jsonlite)
library(rstudioapi)
# Init
user = 'usrname'
context = 'a vre'
auth_ep = 'https://authep'
client_id = 'aclietnid'
ccp_ep = 'https://ccpep'
getToken <- function() {
#login
res = POST(auth_ep, body=list('grant_type'='password', 'client_id'=client_id, 'username'=user, 'password'=pwd), encode=c('form'), add_headers(c('Content-Type' = 'application/x-www-form-urlencoded')))
tok = fromJSON(content(res, 'text'))
#authorize
res = POST(auth_ep, body=list('grant_type'='urn:ietf:params:oauth:grant-type:uma-ticket', 'audience'=context), encode=c('form'), add_headers(c('Content-Type' = 'application/x-www-form-urlencoded', 'Authorization' = paste('Bearer', tok['access_token'], sep=' '))))
jwt = fromJSON(content(res, 'text'))['access_token']
return (jwt)
}
# request in JSON
request = fromJSON('{
"inputs":{
"ccpimage":"bash",
"ccpreplicas":"1"
},
"outputs":{
"output":{
"transmissionMode":"value"
}
},
"response":"raw"
}')
# Auth code
pwd = askForPassword('Password to login')
jwt = getToken()
# Request Method execution
url = paste(ccp_ep, 'processes/{methodid}/execution', sep='/')
res = POST(url, body=request, encode = 'json', add_headers(c('Authorization' = paste('Bearer', jwt, sep=' '))))
if(status_code(res) == 201){
jobStatus = fromJSON(content(res, 'text'))
}else{
stop(paste('Unable to start execution:', content(res, 'text')))
}
# Poll for jobstatus
url = paste(ccp_ep, 'jobs', jobStatus['jobID'], sep='/')
while (jobStatus['status'] != 'successful' && jobStatus['status'] != 'failed'){
print(paste('[',Sys.time(),']',jobStatus['status'],': ',jobStatus['message']))
Sys.sleep(5)
res = GET(url, add_headers(c('Authorization' = paste('Bearer', jwt, sep=' '))))
if(status_code(res) == 200){
jobStatus = fromJSON(content(res, 'text'))
}else if(status_code(res) == 401){
jwt = getToken()
}else{
stop('Unable to poll for execution status')
}
}
print(paste('[',Sys.time(),']',jobStatus['status'],': ',jobStatus['message']))
url = paste(ccp_ep, 'executions', jobStatus['jobID'], sep='/')
res = GET(url, add_headers(c('Accept' = 'application/json', 'Authorization' = paste('Bearer', jwt, sep=' '))))
print(fromJSON(content(res, 'text')))
url = paste(ccp_ep, 'executions', jobStatus['jobID'], 'outputs/output.zip', sep='/')
GET(url, add_headers(c('Accept' = 'application/json', 'Authorization' = paste('Bearer', jwt, sep=' '))),
write_disk('./output.zip', overwrite = FALSE))

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -343,6 +343,7 @@ The technology and the list of available Runtimes is strictly related to type of
<p>There are few input parameters that are used to govern the Method execution itself rather than providing input to the Method. In particular:</p>
<ul class="simple">
<li><p><strong>ccpimage</strong> as already told is required and it is used automatically during <em>Launch</em> phase in order to instantiate a container.</p></li>
<li><p><strong>ccpnote</strong> is a special input field that when present is used to tag the executions in order to provide better visual feedback.</p></li>
<li><p><strong>ccpmaxtime</strong> can be used to limit the maximum execution time of a Method. The value is expressed in seconds and it is capped by the maximum time configured for the Infrastructure.</p></li>
<li><p><strong>ccpreplicas</strong> currently supported on Docker swarm based Infrastructures allows for creating multiple instances of a Method execution in order to obtain a coarse grained degree of parallelism.</p></li>
</ul>
@ -493,6 +494,90 @@ The following is a representation of the data structure representing an Executio
</section>
<section id="rest-apis-interacting-with-methods-and-executions-programmatically">
<span id="rest"></span><h2>REST APIs: Interacting with Methods and Executions programmatically<a class="headerlink" href="#rest-apis-interacting-with-methods-and-executions-programmatically" title="Permalink to this heading"></a></h2>
<p>Most of the services that build up CCP are accessible programmatically via REST endpoints.
In particular, listing Methods (Jobs), executing them or getting infromation on running executions (jobStatus) are accessible through a standard API defined by OGC (Open Geospatial Consortium).
The REST API is Processes 1.2 described at (<a class="reference external" href="https://ogcapi.ogc.org/processes/">https://ogcapi.ogc.org/processes/</a>) and can be considered a modern rework of the former WPS spcification.</p>
<p>The CCP REST API is documented as OpenAPI 3 specification at ().</p>
<p>Through the code generation widgets available in the UI elements described above, it is possible to obtain stubs that show how to interact programmatically with CCP in order to request a Method execution or re-execution and to monitor the evolution.</p>
<p>The following is an example code stub generated for the R programming language.</p>
<div class="literal-block-wrapper docutils container" id="id8">
<div class="code-block-caption"><span class="caption-text">Example code for requesting a Method execution on CCP</span><a class="headerlink" href="#id8" title="Permalink to this code"></a></div>
<div class="highlight-R notranslate"><div class="highlight"><pre><span></span> <span class="c1"># Dependencies</span>
<span class="nf">library</span><span class="p">(</span><span class="n">httr</span><span class="p">)</span>
<span class="nf">library</span><span class="p">(</span><span class="n">jsonlite</span><span class="p">)</span>
<span class="nf">library</span><span class="p">(</span><span class="n">rstudioapi</span><span class="p">)</span>
<span class="c1"># Init</span>
<span class="n">user</span> <span class="o">=</span> <span class="s">&#39;usrname&#39;</span>
<span class="n">context</span> <span class="o">=</span> <span class="s">&#39;a vre&#39;</span>
<span class="n">auth_ep</span> <span class="o">=</span> <span class="s">&#39;https://authep&#39;</span>
<span class="n">client_id</span> <span class="o">=</span> <span class="s">&#39;aclietnid&#39;</span>
<span class="n">ccp_ep</span> <span class="o">=</span> <span class="s">&#39;https://ccpep&#39;</span>
<span class="n">getToken</span> <span class="o">&lt;-</span> <span class="nf">function</span><span class="p">()</span> <span class="p">{</span>
<span class="c1">#login</span>
<span class="n">res</span> <span class="o">=</span> <span class="nf">POST</span><span class="p">(</span><span class="n">auth_ep</span><span class="p">,</span> <span class="n">body</span><span class="o">=</span><span class="nf">list</span><span class="p">(</span><span class="s">&#39;grant_type&#39;</span><span class="o">=</span><span class="s">&#39;password&#39;</span><span class="p">,</span> <span class="s">&#39;client_id&#39;</span><span class="o">=</span><span class="n">client_id</span><span class="p">,</span> <span class="s">&#39;username&#39;</span><span class="o">=</span><span class="n">user</span><span class="p">,</span> <span class="s">&#39;password&#39;</span><span class="o">=</span><span class="n">pwd</span><span class="p">),</span> <span class="n">encode</span><span class="o">=</span><span class="nf">c</span><span class="p">(</span><span class="s">&#39;form&#39;</span><span class="p">),</span> <span class="nf">add_headers</span><span class="p">(</span><span class="nf">c</span><span class="p">(</span><span class="s">&#39;Content-Type&#39;</span> <span class="o">=</span> <span class="s">&#39;application/x-www-form-urlencoded&#39;</span><span class="p">)))</span>
<span class="n">tok</span> <span class="o">=</span> <span class="nf">fromJSON</span><span class="p">(</span><span class="nf">content</span><span class="p">(</span><span class="n">res</span><span class="p">,</span> <span class="s">&#39;text&#39;</span><span class="p">))</span>
<span class="c1">#authorize</span>
<span class="n">res</span> <span class="o">=</span> <span class="nf">POST</span><span class="p">(</span><span class="n">auth_ep</span><span class="p">,</span> <span class="n">body</span><span class="o">=</span><span class="nf">list</span><span class="p">(</span><span class="s">&#39;grant_type&#39;</span><span class="o">=</span><span class="s">&#39;urn:ietf:params:oauth:grant-type:uma-ticket&#39;</span><span class="p">,</span> <span class="s">&#39;audience&#39;</span><span class="o">=</span><span class="n">context</span><span class="p">),</span> <span class="n">encode</span><span class="o">=</span><span class="nf">c</span><span class="p">(</span><span class="s">&#39;form&#39;</span><span class="p">),</span> <span class="nf">add_headers</span><span class="p">(</span><span class="nf">c</span><span class="p">(</span><span class="s">&#39;Content-Type&#39;</span> <span class="o">=</span> <span class="s">&#39;application/x-www-form-urlencoded&#39;</span><span class="p">,</span> <span class="s">&#39;Authorization&#39;</span> <span class="o">=</span> <span class="nf">paste</span><span class="p">(</span><span class="s">&#39;Bearer&#39;</span><span class="p">,</span> <span class="n">tok</span><span class="p">[</span><span class="s">&#39;access_token&#39;</span><span class="p">],</span> <span class="n">sep</span><span class="o">=</span><span class="s">&#39; &#39;</span><span class="p">))))</span>
<span class="n">jwt</span> <span class="o">=</span> <span class="nf">fromJSON</span><span class="p">(</span><span class="nf">content</span><span class="p">(</span><span class="n">res</span><span class="p">,</span> <span class="s">&#39;text&#39;</span><span class="p">))[</span><span class="s">&#39;access_token&#39;</span><span class="p">]</span>
<span class="nf">return </span><span class="p">(</span><span class="n">jwt</span><span class="p">)</span>
<span class="p">}</span>
<span class="c1"># request in JSON</span>
<span class="n">request</span> <span class="o">=</span> <span class="nf">fromJSON</span><span class="p">(</span><span class="s">&#39;{</span>
<span class="s"> &quot;inputs&quot;:{</span>
<span class="s"> &quot;ccpimage&quot;:&quot;bash&quot;,</span>
<span class="s"> &quot;ccpreplicas&quot;:&quot;1&quot;</span>
<span class="s"> },</span>
<span class="s"> &quot;outputs&quot;:{</span>
<span class="s"> &quot;output&quot;:{</span>
<span class="s"> &quot;transmissionMode&quot;:&quot;value&quot;</span>
<span class="s"> }</span>
<span class="s"> },</span>
<span class="s"> &quot;response&quot;:&quot;raw&quot;</span>
<span class="s"> }&#39;</span><span class="p">)</span>
<span class="c1"># Auth code</span>
<span class="n">pwd</span> <span class="o">=</span> <span class="nf">askForPassword</span><span class="p">(</span><span class="s">&#39;Password to login&#39;</span><span class="p">)</span>
<span class="n">jwt</span> <span class="o">=</span> <span class="nf">getToken</span><span class="p">()</span>
<span class="c1"># Request Method execution</span>
<span class="n">url</span> <span class="o">=</span> <span class="nf">paste</span><span class="p">(</span><span class="n">ccp_ep</span><span class="p">,</span> <span class="s">&#39;processes/{methodid}/execution&#39;</span><span class="p">,</span> <span class="n">sep</span><span class="o">=</span><span class="s">&#39;/&#39;</span><span class="p">)</span>
<span class="n">res</span> <span class="o">=</span> <span class="nf">POST</span><span class="p">(</span><span class="n">url</span><span class="p">,</span> <span class="n">body</span><span class="o">=</span><span class="n">request</span><span class="p">,</span> <span class="n">encode</span> <span class="o">=</span> <span class="s">&#39;json&#39;</span><span class="p">,</span> <span class="nf">add_headers</span><span class="p">(</span><span class="nf">c</span><span class="p">(</span><span class="s">&#39;Authorization&#39;</span> <span class="o">=</span> <span class="nf">paste</span><span class="p">(</span><span class="s">&#39;Bearer&#39;</span><span class="p">,</span> <span class="n">jwt</span><span class="p">,</span> <span class="n">sep</span><span class="o">=</span><span class="s">&#39; &#39;</span><span class="p">))))</span>
<span class="nf">if</span><span class="p">(</span><span class="nf">status_code</span><span class="p">(</span><span class="n">res</span><span class="p">)</span> <span class="o">==</span> <span class="m">201</span><span class="p">){</span>
<span class="n">jobStatus</span> <span class="o">=</span> <span class="nf">fromJSON</span><span class="p">(</span><span class="nf">content</span><span class="p">(</span><span class="n">res</span><span class="p">,</span> <span class="s">&#39;text&#39;</span><span class="p">))</span>
<span class="p">}</span><span class="n">else</span><span class="p">{</span>
<span class="nf">stop</span><span class="p">(</span><span class="nf">paste</span><span class="p">(</span><span class="s">&#39;Unable to start execution:&#39;</span><span class="p">,</span> <span class="nf">content</span><span class="p">(</span><span class="n">res</span><span class="p">,</span> <span class="s">&#39;text&#39;</span><span class="p">)))</span>
<span class="p">}</span>
<span class="c1"># Poll for jobstatus</span>
<span class="n">url</span> <span class="o">=</span> <span class="nf">paste</span><span class="p">(</span><span class="n">ccp_ep</span><span class="p">,</span> <span class="s">&#39;jobs&#39;</span><span class="p">,</span> <span class="n">jobStatus</span><span class="p">[</span><span class="s">&#39;jobID&#39;</span><span class="p">],</span> <span class="n">sep</span><span class="o">=</span><span class="s">&#39;/&#39;</span><span class="p">)</span>
<span class="nf">while </span><span class="p">(</span><span class="n">jobStatus</span><span class="p">[</span><span class="s">&#39;status&#39;</span><span class="p">]</span> <span class="o">!=</span> <span class="s">&#39;successful&#39;</span> <span class="o">&amp;&amp;</span> <span class="n">jobStatus</span><span class="p">[</span><span class="s">&#39;status&#39;</span><span class="p">]</span> <span class="o">!=</span> <span class="s">&#39;failed&#39;</span><span class="p">){</span>
<span class="nf">print</span><span class="p">(</span><span class="nf">paste</span><span class="p">(</span><span class="s">&#39;[&#39;</span><span class="p">,</span><span class="nf">Sys.time</span><span class="p">(),</span><span class="s">&#39;]&#39;</span><span class="p">,</span><span class="n">jobStatus</span><span class="p">[</span><span class="s">&#39;status&#39;</span><span class="p">],</span><span class="s">&#39;: &#39;</span><span class="p">,</span><span class="n">jobStatus</span><span class="p">[</span><span class="s">&#39;message&#39;</span><span class="p">]))</span>
<span class="nf">Sys.sleep</span><span class="p">(</span><span class="m">5</span><span class="p">)</span>
<span class="n">res</span> <span class="o">=</span> <span class="nf">GET</span><span class="p">(</span><span class="n">url</span><span class="p">,</span> <span class="nf">add_headers</span><span class="p">(</span><span class="nf">c</span><span class="p">(</span><span class="s">&#39;Authorization&#39;</span> <span class="o">=</span> <span class="nf">paste</span><span class="p">(</span><span class="s">&#39;Bearer&#39;</span><span class="p">,</span> <span class="n">jwt</span><span class="p">,</span> <span class="n">sep</span><span class="o">=</span><span class="s">&#39; &#39;</span><span class="p">))))</span>
<span class="nf">if</span><span class="p">(</span><span class="nf">status_code</span><span class="p">(</span><span class="n">res</span><span class="p">)</span> <span class="o">==</span> <span class="m">200</span><span class="p">){</span>
<span class="n">jobStatus</span> <span class="o">=</span> <span class="nf">fromJSON</span><span class="p">(</span><span class="nf">content</span><span class="p">(</span><span class="n">res</span><span class="p">,</span> <span class="s">&#39;text&#39;</span><span class="p">))</span>
<span class="p">}</span><span class="n">else</span> <span class="nf">if</span><span class="p">(</span><span class="nf">status_code</span><span class="p">(</span><span class="n">res</span><span class="p">)</span> <span class="o">==</span> <span class="m">401</span><span class="p">){</span>
<span class="n">jwt</span> <span class="o">=</span> <span class="nf">getToken</span><span class="p">()</span>
<span class="p">}</span><span class="n">else</span><span class="p">{</span>
<span class="nf">stop</span><span class="p">(</span><span class="s">&#39;Unable to poll for execution status&#39;</span><span class="p">)</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="nf">print</span><span class="p">(</span><span class="nf">paste</span><span class="p">(</span><span class="s">&#39;[&#39;</span><span class="p">,</span><span class="nf">Sys.time</span><span class="p">(),</span><span class="s">&#39;]&#39;</span><span class="p">,</span><span class="n">jobStatus</span><span class="p">[</span><span class="s">&#39;status&#39;</span><span class="p">],</span><span class="s">&#39;: &#39;</span><span class="p">,</span><span class="n">jobStatus</span><span class="p">[</span><span class="s">&#39;message&#39;</span><span class="p">]))</span>
<span class="n">url</span> <span class="o">=</span> <span class="nf">paste</span><span class="p">(</span><span class="n">ccp_ep</span><span class="p">,</span> <span class="s">&#39;executions&#39;</span><span class="p">,</span> <span class="n">jobStatus</span><span class="p">[</span><span class="s">&#39;jobID&#39;</span><span class="p">],</span> <span class="n">sep</span><span class="o">=</span><span class="s">&#39;/&#39;</span><span class="p">)</span>
<span class="n">res</span> <span class="o">=</span> <span class="nf">GET</span><span class="p">(</span><span class="n">url</span><span class="p">,</span> <span class="nf">add_headers</span><span class="p">(</span><span class="nf">c</span><span class="p">(</span><span class="s">&#39;Accept&#39;</span> <span class="o">=</span> <span class="s">&#39;application/json&#39;</span><span class="p">,</span> <span class="s">&#39;Authorization&#39;</span> <span class="o">=</span> <span class="nf">paste</span><span class="p">(</span><span class="s">&#39;Bearer&#39;</span><span class="p">,</span> <span class="n">jwt</span><span class="p">,</span> <span class="n">sep</span><span class="o">=</span><span class="s">&#39; &#39;</span><span class="p">))))</span>
<span class="nf">print</span><span class="p">(</span><span class="nf">fromJSON</span><span class="p">(</span><span class="nf">content</span><span class="p">(</span><span class="n">res</span><span class="p">,</span> <span class="s">&#39;text&#39;</span><span class="p">)))</span>
<span class="n">url</span> <span class="o">=</span> <span class="nf">paste</span><span class="p">(</span><span class="n">ccp_ep</span><span class="p">,</span> <span class="s">&#39;executions&#39;</span><span class="p">,</span> <span class="n">jobStatus</span><span class="p">[</span><span class="s">&#39;jobID&#39;</span><span class="p">],</span> <span class="s">&#39;outputs/output.zip&#39;</span><span class="p">,</span> <span class="n">sep</span><span class="o">=</span><span class="s">&#39;/&#39;</span><span class="p">)</span>
<span class="nf">GET</span><span class="p">(</span><span class="n">url</span><span class="p">,</span> <span class="nf">add_headers</span><span class="p">(</span><span class="nf">c</span><span class="p">(</span><span class="s">&#39;Accept&#39;</span> <span class="o">=</span> <span class="s">&#39;application/json&#39;</span><span class="p">,</span> <span class="s">&#39;Authorization&#39;</span> <span class="o">=</span> <span class="nf">paste</span><span class="p">(</span><span class="s">&#39;Bearer&#39;</span><span class="p">,</span> <span class="n">jwt</span><span class="p">,</span> <span class="n">sep</span><span class="o">=</span><span class="s">&#39; &#39;</span><span class="p">))),</span>
<span class="nf">write_disk</span><span class="p">(</span><span class="s">&#39;./output.zip&#39;</span><span class="p">,</span> <span class="n">overwrite</span> <span class="o">=</span> <span class="kc">FALSE</span><span class="p">))</span>
</pre></div>
</div>
</div>
</section>
</section>

View File

@ -276,6 +276,7 @@ All **input parameters** are passed in the form of template variables to the scr
There are few input parameters that are used to govern the Method execution itself rather than providing input to the Method. In particular:
- **ccpimage** as already told is required and it is used automatically during *Launch* phase in order to instantiate a container.
- **ccpnote** is a special input field that when present is used to tag the executions in order to provide better visual feedback.
- **ccpmaxtime** can be used to limit the maximum execution time of a Method. The value is expressed in seconds and it is capped by the maximum time configured for the Infrastructure.
- **ccpreplicas** currently supported on Docker swarm based Infrastructures allows for creating multiple instances of a Method execution in order to obtain a coarse grained degree of parallelism.
@ -439,3 +440,90 @@ The list of Executions are organized by their Method names [1]. For every Method
REST APIs: Interacting with Methods and Executions programmatically
-------------------------------------------------------------------
Most of the services that build up CCP are accessible programmatically via REST endpoints.
In particular, listing Methods (Jobs), executing them or getting infromation on running executions (jobStatus) are accessible through a standard API defined by OGC (Open Geospatial Consortium).
The REST API is Processes 1.2 described at (https://ogcapi.ogc.org/processes/) and can be considered a modern rework of the former WPS spcification.
The CCP REST API is documented as OpenAPI 3 specification at ().
Through the code generation widgets available in the UI elements described above, it is possible to obtain stubs that show how to interact programmatically with CCP in order to request a Method execution or re-execution and to monitor the evolution.
The following is an example code stub generated for the R programming language.
.. code-block:: R
:caption: Example code for requesting a Method execution on CCP
# Dependencies
library(httr)
library(jsonlite)
library(rstudioapi)
# Init
user = 'usrname'
context = 'a vre'
auth_ep = 'https://authep'
client_id = 'aclietnid'
ccp_ep = 'https://ccpep'
getToken <- function() {
#login
res = POST(auth_ep, body=list('grant_type'='password', 'client_id'=client_id, 'username'=user, 'password'=pwd), encode=c('form'), add_headers(c('Content-Type' = 'application/x-www-form-urlencoded')))
tok = fromJSON(content(res, 'text'))
#authorize
res = POST(auth_ep, body=list('grant_type'='urn:ietf:params:oauth:grant-type:uma-ticket', 'audience'=context), encode=c('form'), add_headers(c('Content-Type' = 'application/x-www-form-urlencoded', 'Authorization' = paste('Bearer', tok['access_token'], sep=' '))))
jwt = fromJSON(content(res, 'text'))['access_token']
return (jwt)
}
# request in JSON
request = fromJSON('{
"inputs":{
"ccpimage":"bash",
"ccpreplicas":"1"
},
"outputs":{
"output":{
"transmissionMode":"value"
}
},
"response":"raw"
}')
# Auth code
pwd = askForPassword('Password to login')
jwt = getToken()
# Request Method execution
url = paste(ccp_ep, 'processes/{methodid}/execution', sep='/')
res = POST(url, body=request, encode = 'json', add_headers(c('Authorization' = paste('Bearer', jwt, sep=' '))))
if(status_code(res) == 201){
jobStatus = fromJSON(content(res, 'text'))
}else{
stop(paste('Unable to start execution:', content(res, 'text')))
}
# Poll for jobstatus
url = paste(ccp_ep, 'jobs', jobStatus['jobID'], sep='/')
while (jobStatus['status'] != 'successful' && jobStatus['status'] != 'failed'){
print(paste('[',Sys.time(),']',jobStatus['status'],': ',jobStatus['message']))
Sys.sleep(5)
res = GET(url, add_headers(c('Authorization' = paste('Bearer', jwt, sep=' '))))
if(status_code(res) == 200){
jobStatus = fromJSON(content(res, 'text'))
}else if(status_code(res) == 401){
jwt = getToken()
}else{
stop('Unable to poll for execution status')
}
}
print(paste('[',Sys.time(),']',jobStatus['status'],': ',jobStatus['message']))
url = paste(ccp_ep, 'executions', jobStatus['jobID'], sep='/')
res = GET(url, add_headers(c('Accept' = 'application/json', 'Authorization' = paste('Bearer', jwt, sep=' '))))
print(fromJSON(content(res, 'text')))
url = paste(ccp_ep, 'executions', jobStatus['jobID'], 'outputs/output.zip', sep='/')
GET(url, add_headers(c('Accept' = 'application/json', 'Authorization' = paste('Bearer', jwt, sep=' '))),
write_disk('./output.zip', overwrite = FALSE))