Project

General

Profile

API » History » Version 37

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