Project

General

Profile

API » History » Version 42

Maarten Plieger, 10/23/2015 11:33 AM

1 1 Maarten Plieger
h1. API
2 1 Maarten Plieger
3 28 Maarten Plieger
h2. Access token API - service "account"
4 1 Maarten Plieger
5 28 Maarten Plieger
*1). Generate a token for the current user which can be used to access C4I services by using "generatetoken":*
6 33 Maarten Plieger
* https://dev.climate4impact.eu/impactportal/tokenapi?service=account&request=generatetoken
7 1 Maarten Plieger
8 17 Maarten Plieger
The token has the following structure:
9 17 Maarten Plieger
<pre><code class="json">
10 18 Maarten Plieger
{ 
11 18 Maarten Plieger
  "creationdate" : "2015-10-23T09:50:05Z",
12 17 Maarten Plieger
  "notafter" : "2015-10-30T09:50:05Z",
13 17 Maarten Plieger
  "notbefore" : "2015-10-23T09:50:05Z",
14 22 Maarten Plieger
  "openid" : "https://esg-dn1.nsc.liu.se/esgf-idp/openid/<identifier>",
15 24 Maarten Plieger
  "token" : "daad2944-1def-4bee-b032-b08048f88302", 
16 22 Maarten Plieger
  "userid" : "esg-dn1.nsc.liu.se.esgf-idp.openid.<identifier>"
17 17 Maarten Plieger
}
18 17 Maarten Plieger
</code></pre>
19 17 Maarten Plieger
20 28 Maarten Plieger
*2). List all tokens available for the current user by using "listtokens":*
21 33 Maarten Plieger
* https://dev.climate4impact.eu/impactportal/tokenapi?service=account&request=listtokens
22 1 Maarten Plieger
23 1 Maarten Plieger
*Service endpoints which can be used with a token:*
24 1 Maarten Plieger
* WMS can be used via <pre>https://dev.climate4impact.eu/impactportal/adagucserver/<accesstoken>/?</pre>
25 1 Maarten Plieger
* WCS can be used via <pre>https://dev.climate4impact.eu/impactportal/adagucserver/<accesstoken>/?</pre>
26 1 Maarten Plieger
* WPS can be used via <pre>https://dev.climate4impact.eu/impactportal/WPS/<accesstoken>/?</pre>
27 1 Maarten Plieger
* File download requests and OpenDAP requests from the basket can be done via <pre>https://dev.climate4impact.eu/impactportal/DAP/<accesstoken>/<userid>/<file>"</pre>
28 29 Maarten Plieger
* Basket requests can be done via <pre>https://dev.climate4impact.eu/impactportal/basket/<accesstoken>?&service=basket&request=getoverview&</pre>
29 39 Maarten Plieger
30 41 Maarten Plieger
*3). Crash course token generation:*
31 39 Maarten Plieger
# Login with a google account at https://dev.climate4impact.eu/impactportal/account/OAuth2.jsp 
32 40 Maarten Plieger
# Generate a new token via https://dev.climate4impact.eu/impactportal/tokenapi?service=account&request=generatetoken
33 39 Maarten Plieger
# Copy paste the accesstoken value in your URL
34 1 Maarten Plieger
35 5 Maarten Plieger
h2. Basket requests
36 1 Maarten Plieger
37 2 Maarten Plieger
* Get overview of all files in the users basket: service=basket&request=getoverview, 
38 33 Maarten Plieger
** e.g. <pre>https://dev.climate4impact.eu/impactportal/basket?&service=basket&request=getoverview&</pre>
39 33 Maarten Plieger
** For commandline access with an access token: <pre>https://dev.climate4impact.eu/impactportal/basket/<accesstoken>/?&service=basket&request=getoverview&</pre>
40 7 Maarten Plieger
41 14 Maarten Plieger
The result is a json file with nested childs representing te directory structure at C4I
42 10 Maarten Plieger
<pre><code class="json">
43 12 Maarten Plieger
{ "browser" : "/impactportal/data/catalogbrowser.jsp?",
44 12 Maarten Plieger
  "children" : [ { "children" : [  ],
45 12 Maarten Plieger
        "date" : "",
46 12 Maarten Plieger
        "expanded" : true,
47 12 Maarten Plieger
        "iconCls" : "typeFolder",
48 12 Maarten Plieger
        "leaf" : false,
49 12 Maarten Plieger
        "text" : "Remote data"
50 1 Maarten Plieger
      },
51 13 Maarten Plieger
      { "children" : [ { "dapurl" : "https://localhost/impactportal/DAP/<userid>/INTER_OPER_R___RD3_____L3__20100101T000000_20100201T000000_0004.nc",
52 12 Maarten Plieger
              "date" : "2014-06-06 14:31:23Z",
53 12 Maarten Plieger
              "filesize" : "611.573K",
54 1 Maarten Plieger
              "hasdap" : true,
55 12 Maarten Plieger
              "hashttp" : true,
56 13 Maarten Plieger
              "httpurl" : "https://localhost/impactportal/DAP/<userid>/INTER_OPER_R___RD3_____L3__20100101T000000_20100201T000000_0004.nc",
57 12 Maarten Plieger
              "iconCls" : "typeOF",
58 12 Maarten Plieger
              "id" : "INTER_OPER_R___RD3_____L3__20100101T000000_20100201T000000_0004.nc",
59 12 Maarten Plieger
              "index" : 1,
60 12 Maarten Plieger
              "leaf" : true,
61 1 Maarten Plieger
              "text" : "INTER_OPER_R___RD3_____L3__20100101T000000_20100201T000000_0004.nc",
62 12 Maarten Plieger
              "type" : "file"
63 12 Maarten Plieger
            },
64 13 Maarten Plieger
            { "dapurl" : "https://localhost/impactportal/DAP/<userid>/tasmax_day_CNRM-CM5_historical_r1i1p1_1890.nc",
65 1 Maarten Plieger
              "date" : "2015-10-23 09:37:33Z",
66 12 Maarten Plieger
              "filesize" : "47.867M",
67 12 Maarten Plieger
              "hasdap" : true,
68 12 Maarten Plieger
              "hashttp" : true,
69 13 Maarten Plieger
              "httpurl" : "https://localhost/impactportal/DAP/<userid>/tasmax_day_CNRM-CM5_historical_r1i1p1_1890.nc",
70 12 Maarten Plieger
              "iconCls" : "typeOF",
71 12 Maarten Plieger
              "id" : "tasmax_day_CNRM-CM5_historical_r1i1p1_1890.nc",
72 12 Maarten Plieger
              "index" : 2,
73 12 Maarten Plieger
              "leaf" : true,
74 12 Maarten Plieger
              "text" : "tasmax_day_CNRM-CM5_historical_r1i1p1_1890.nc",
75 12 Maarten Plieger
              "type" : "file"
76 12 Maarten Plieger
            }
77 12 Maarten Plieger
          ],
78 12 Maarten Plieger
        "date" : "",
79 12 Maarten Plieger
        "expanded" : true,
80 12 Maarten Plieger
        "iconCls" : "typeFolder",
81 1 Maarten Plieger
        "leaf" : false,
82 12 Maarten Plieger
        "text" : "My data"
83 12 Maarten Plieger
      }
84 12 Maarten Plieger
    ],
85 12 Maarten Plieger
  "leaf" : false,
86 13 Maarten Plieger
  "text" : "https://esg-dn1.nsc.liu.se/esgf-idp/openid/<openid>",
87 11 Maarten Plieger
  "viewer" : "/impactportal/data/datasetviewer.jsp?"
88 11 Maarten Plieger
}
89 10 Maarten Plieger
</code>
90 9 Maarten Plieger
</pre>
91 30 Maarten Plieger
92 30 Maarten Plieger
h2. WPS Requests
93 30 Maarten Plieger
94 36 Maarten Plieger
Climate4impact uses PyWPS, see http://pywps.wald.intevation.org/documentation/course/ for more information
95 36 Maarten Plieger
96 36 Maarten Plieger
* WPS can be used via <pre>https://dev.climate4impact.eu/impactportal/WPS/<accesstoken>/?</pre>
97 36 Maarten Plieger
98 36 Maarten Plieger
* Example Python WPS client on WPS Process "binaryoperatoronnumbers"*
99 36 Maarten Plieger
100 34 Maarten Plieger
The following Python example behaves like a minimal WPS client, using C4I services to perform analysis. The example below makes use of the binaryoperatorfornumbers process, which enables operations on two numbers. The process has three inputs:
101 34 Maarten Plieger
# inputa - a float number
102 34 Maarten Plieger
# inputb - a float number
103 34 Maarten Plieger
# operation -  Can be "add", "substract", "divide" or "multiply"
104 34 Maarten Plieger
105 35 Maarten Plieger
The process needs five seconds to run, listing progress in percentages. This is done to ease progress monitoring developments. The process is executed asynchronously and is executed with the GET method. PyWPS also supports POST, this can be used for posting bigger inputs. This is described here: [[WPS]] 
106 34 Maarten Plieger
107 30 Maarten Plieger
<pre><code class="python">
108 30 Maarten Plieger
#!/bin/python
109 30 Maarten Plieger
110 30 Maarten Plieger
"""
111 30 Maarten Plieger
Obtain an access token:
112 33 Maarten Plieger
- Login with a google account at https://dev.climate4impact.eu/impactportal/account/OAuth2.jsp 
113 30 Maarten Plieger
- Generate via https://dev.climate4impact.eu/impactportal/tokenapi?service=account&request=generatetoken
114 32 Maarten Plieger
- Copy paste the accesstoken value in the "token" variable below.
115 31 Maarten Plieger
"""
116 30 Maarten Plieger
117 30 Maarten Plieger
token="<access_token>" 
118 30 Maarten Plieger
 
119 30 Maarten Plieger
120 33 Maarten Plieger
wpsendpoint="https://dev.climate4impact.eu/impactportal/WPS/"+token+"/?"
121 30 Maarten Plieger
122 30 Maarten Plieger
inputa=11;
123 30 Maarten Plieger
inputb=22;
124 30 Maarten Plieger
operator="divide" # Any of add, substract, multiply, divide
125 30 Maarten Plieger
126 30 Maarten Plieger
print "Calculating ["+str(inputa)+" "+str(operator)+" "+str(inputb)+"]"
127 30 Maarten Plieger
128 30 Maarten Plieger
import xml.etree.ElementTree as et
129 30 Maarten Plieger
import urllib2
130 30 Maarten Plieger
import time
131 30 Maarten Plieger
132 30 Maarten Plieger
""" Parses URL to XML tree """
133 30 Maarten Plieger
def getandparsexml(url):
134 30 Maarten Plieger
  response = urllib2.urlopen(url)
135 30 Maarten Plieger
  html = response.read()
136 30 Maarten Plieger
  #print html
137 30 Maarten Plieger
  return et.fromstring(html)
138 30 Maarten Plieger
  
139 30 Maarten Plieger
# Execute the ultimatequestionprocess aynchronousely and obtain the statusLocation for progress
140 30 Maarten Plieger
datainputs = "inputa="+str(inputa)+";inputb="+str(inputb)+";operator="+str(operator)
141 30 Maarten Plieger
root = getandparsexml(wpsendpoint+"service=WPS&version=1.0.0&request=execute&storeExecuteResponse=true&status=true&identifier=binaryoperatorfornumbers&datainputs="+datainputs)    
142 30 Maarten Plieger
monitorURL = root.attrib['statusLocation']
143 30 Maarten Plieger
144 30 Maarten Plieger
print "Process executed checking " +monitorURL
145 30 Maarten Plieger
146 30 Maarten Plieger
# Get starttime of process, sometimes the monitorURL is not immediately available. Iterate until a valid creationtime is available would be good practice.
147 30 Maarten Plieger
numberOfTries=10
148 30 Maarten Plieger
while numberOfTries>0:
149 30 Maarten Plieger
  numberOfTries = numberOfTries-1 
150 30 Maarten Plieger
  try:
151 30 Maarten Plieger
    root = getandparsexml(monitorURL)
152 30 Maarten Plieger
    numberOfTries = -1
153 30 Maarten Plieger
    print "Process started at "+str(root[1].attrib['creationTime'])
154 30 Maarten Plieger
  except:
155 30 Maarten Plieger
    time.sleep(1)
156 30 Maarten Plieger
    pass
157 30 Maarten Plieger
158 30 Maarten Plieger
# Monitor progress, polling the statuslocation frequently
159 30 Maarten Plieger
percentage=0
160 30 Maarten Plieger
while percentage<100:
161 30 Maarten Plieger
  root = getandparsexml(monitorURL)
162 30 Maarten Plieger
  try:
163 30 Maarten Plieger
    percentage = float(root[1][0].attrib['percentCompleted'])
164 30 Maarten Plieger
  except:
165 30 Maarten Plieger
    percentage=100.0
166 30 Maarten Plieger
    pass
167 30 Maarten Plieger
  print "Progress: "+str(percentage)+ " complete."
168 30 Maarten Plieger
  time.sleep(1)
169 30 Maarten Plieger
170 30 Maarten Plieger
# Obtain the answer  
171 30 Maarten Plieger
root = getandparsexml(monitorURL)
172 30 Maarten Plieger
try:
173 30 Maarten Plieger
  print "The answer for ["+str(inputa)+" "+str(operator)+" "+str(inputb)+"] is "+(root[2][0][2][0].text)
174 30 Maarten Plieger
except:
175 30 Maarten Plieger
  print "Processing failed: "+root[1][0][0][0][0].text
176 30 Maarten Plieger
  pass
177 30 Maarten Plieger
</code>
178 30 Maarten Plieger
</pre>
179 42 Maarten Plieger
180 42 Maarten Plieger
The result is:
181 42 Maarten Plieger
<pre>
182 42 Maarten Plieger
(pyvirtenv)c4m@climate4impact:~$ python c4i_testwps_binaryoperator.py 
183 42 Maarten Plieger
Calculating [11 divide 22]
184 42 Maarten Plieger
Process executed checking http://climate4impact.eu/impactportal/WPS?OUTPUT=/pywps-144559994232.xml
185 42 Maarten Plieger
Process started at 2015-10-23T11:32:23Z
186 42 Maarten Plieger
Progress: 20.0 complete.
187 42 Maarten Plieger
Progress: 40.0 complete.
188 42 Maarten Plieger
Progress: 60.0 complete.
189 42 Maarten Plieger
Progress: 80.0 complete.
190 42 Maarten Plieger
Progress: 100.0 complete.
191 42 Maarten Plieger
The answer for [11 divide 22] is 0.5
192 42 Maarten Plieger
(pyvirtenv)c4m@climate4impact:~$ 
193 42 Maarten Plieger
</pre>