added chapter
This commit is contained in:
parent
a69fe15bde
commit
0350d733c4
Binary file not shown.
Binary file not shown.
|
@ -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
|
@ -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">'usrname'</span>
|
||||
<span class="n">context</span> <span class="o">=</span> <span class="s">'a vre'</span>
|
||||
<span class="n">auth_ep</span> <span class="o">=</span> <span class="s">'https://authep'</span>
|
||||
<span class="n">client_id</span> <span class="o">=</span> <span class="s">'aclietnid'</span>
|
||||
<span class="n">ccp_ep</span> <span class="o">=</span> <span class="s">'https://ccpep'</span>
|
||||
|
||||
<span class="n">getToken</span> <span class="o"><-</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">'grant_type'</span><span class="o">=</span><span class="s">'password'</span><span class="p">,</span> <span class="s">'client_id'</span><span class="o">=</span><span class="n">client_id</span><span class="p">,</span> <span class="s">'username'</span><span class="o">=</span><span class="n">user</span><span class="p">,</span> <span class="s">'password'</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">'form'</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">'Content-Type'</span> <span class="o">=</span> <span class="s">'application/x-www-form-urlencoded'</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">'text'</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">'grant_type'</span><span class="o">=</span><span class="s">'urn:ietf:params:oauth:grant-type:uma-ticket'</span><span class="p">,</span> <span class="s">'audience'</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">'form'</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">'Content-Type'</span> <span class="o">=</span> <span class="s">'application/x-www-form-urlencoded'</span><span class="p">,</span> <span class="s">'Authorization'</span> <span class="o">=</span> <span class="nf">paste</span><span class="p">(</span><span class="s">'Bearer'</span><span class="p">,</span> <span class="n">tok</span><span class="p">[</span><span class="s">'access_token'</span><span class="p">],</span> <span class="n">sep</span><span class="o">=</span><span class="s">' '</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">'text'</span><span class="p">))[</span><span class="s">'access_token'</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">'{</span>
|
||||
<span class="s"> "inputs":{</span>
|
||||
<span class="s"> "ccpimage":"bash",</span>
|
||||
<span class="s"> "ccpreplicas":"1"</span>
|
||||
<span class="s"> },</span>
|
||||
<span class="s"> "outputs":{</span>
|
||||
<span class="s"> "output":{</span>
|
||||
<span class="s"> "transmissionMode":"value"</span>
|
||||
<span class="s"> }</span>
|
||||
<span class="s"> },</span>
|
||||
<span class="s"> "response":"raw"</span>
|
||||
<span class="s"> }'</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">'Password to login'</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">'processes/{methodid}/execution'</span><span class="p">,</span> <span class="n">sep</span><span class="o">=</span><span class="s">'/'</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">'json'</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">'Authorization'</span> <span class="o">=</span> <span class="nf">paste</span><span class="p">(</span><span class="s">'Bearer'</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">' '</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">'text'</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">'Unable to start execution:'</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">'text'</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">'jobs'</span><span class="p">,</span> <span class="n">jobStatus</span><span class="p">[</span><span class="s">'jobID'</span><span class="p">],</span> <span class="n">sep</span><span class="o">=</span><span class="s">'/'</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">'status'</span><span class="p">]</span> <span class="o">!=</span> <span class="s">'successful'</span> <span class="o">&&</span> <span class="n">jobStatus</span><span class="p">[</span><span class="s">'status'</span><span class="p">]</span> <span class="o">!=</span> <span class="s">'failed'</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">'['</span><span class="p">,</span><span class="nf">Sys.time</span><span class="p">(),</span><span class="s">']'</span><span class="p">,</span><span class="n">jobStatus</span><span class="p">[</span><span class="s">'status'</span><span class="p">],</span><span class="s">': '</span><span class="p">,</span><span class="n">jobStatus</span><span class="p">[</span><span class="s">'message'</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">'Authorization'</span> <span class="o">=</span> <span class="nf">paste</span><span class="p">(</span><span class="s">'Bearer'</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">' '</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">'text'</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">'Unable to poll for execution status'</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">'['</span><span class="p">,</span><span class="nf">Sys.time</span><span class="p">(),</span><span class="s">']'</span><span class="p">,</span><span class="n">jobStatus</span><span class="p">[</span><span class="s">'status'</span><span class="p">],</span><span class="s">': '</span><span class="p">,</span><span class="n">jobStatus</span><span class="p">[</span><span class="s">'message'</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">'executions'</span><span class="p">,</span> <span class="n">jobStatus</span><span class="p">[</span><span class="s">'jobID'</span><span class="p">],</span> <span class="n">sep</span><span class="o">=</span><span class="s">'/'</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">'Accept'</span> <span class="o">=</span> <span class="s">'application/json'</span><span class="p">,</span> <span class="s">'Authorization'</span> <span class="o">=</span> <span class="nf">paste</span><span class="p">(</span><span class="s">'Bearer'</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">' '</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">'text'</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">'executions'</span><span class="p">,</span> <span class="n">jobStatus</span><span class="p">[</span><span class="s">'jobID'</span><span class="p">],</span> <span class="s">'outputs/output.zip'</span><span class="p">,</span> <span class="n">sep</span><span class="o">=</span><span class="s">'/'</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">'Accept'</span> <span class="o">=</span> <span class="s">'application/json'</span><span class="p">,</span> <span class="s">'Authorization'</span> <span class="o">=</span> <span class="nf">paste</span><span class="p">(</span><span class="s">'Bearer'</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">' '</span><span class="p">))),</span>
|
||||
<span class="nf">write_disk</span><span class="p">(</span><span class="s">'./output.zip'</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>
|
||||
|
||||
|
|
|
@ -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))
|
Loading…
Reference in New Issue