Step 2: Move test folder to root
[integration/test.git] / csit / libraries / iotdm.py
1 import requests
2 from datetime import timedelta
3
4 zero = timedelta(0)
5
6 application = 2
7 container = 3
8 contentInstance = 4
9
10 op_provision = ":8181/restconf/operations/onem2m:onem2m-cse-provisioning"
11 op_tree = ":8181/restconf/operational/onem2m:onem2m-resource-tree"
12 op_cleanup = ":8181/restconf/operations/onem2m:onem2m-cleanup-store"
13
14 cse_payload = '''
15 {    "input": {
16         "onem2m-primitive": [
17            {
18                 "name": "CSE_ID",
19                 "value": "%s"
20             },
21             {
22                 "name": "CSE_TYPE",
23                 "value": "IN-CSE"
24             }
25         ]
26     }
27 }
28 '''
29
30 application_payload = '''
31 {
32   any:
33   [
34     {"aei":"jb", "api":"jb", "apn":"jb2", "or":"http://hey/you" %s}
35   ]
36 }
37 '''
38
39 _container_payload = '''
40 {
41   any:
42   [
43     {
44       "cr": "jb",
45       "mni": 1,
46       "mbs": 3,
47       "or": "http://hey/you"
48       %s
49     }
50   ]
51 }
52 '''
53
54 container_payload = '''
55 {
56   any:
57   [
58     {
59       "cr": "jb",
60       "or": "http://hey/you"
61       %s
62     }
63   ]
64 }
65 '''
66
67 contentInstance_payload = '''
68 {
69   "any": [
70     {
71       "cnf": "1",
72       "or": "http://hey/you"
73       %s
74     }
75   ]
76 }
77 '''
78
79
80 def which_payload(restype):
81     """Return a template payload for the known datatypes."""
82     if restype == application:
83         return application_payload
84     elif restype == container:
85         return container_payload
86     elif restype == contentInstance:
87         return contentInstance_payload
88     else:
89         return ""
90
91
92 def find_key(response, key):
93     try:
94         val = response.json()
95         return val['any'][0][key]
96     except:
97         return None
98
99
100 def name(response):
101     """Return the resource name in the response."""
102     return find_key(response, "rn")
103
104
105 def resid(response):
106     """Return the resource id in the response."""
107     return find_key(response, "ri")
108
109
110 def parent(response):
111     """Return the parent resource id in the response."""
112     return find_key(response, "pi")
113
114
115 def content(response):
116     """Return the content the response."""
117     return find_key(response, "con")
118
119
120 def restype(response):
121     """Return the resource type the response."""
122     return find_key(response, "rty")
123
124
125 def status(response):
126     """Return the protocol status code in the response."""
127     try:
128         return response.status_code
129     except:
130         return None
131
132
133 def headers(response):
134     """Return the protocol headers in the response."""
135     try:
136         return response.headers
137     except:
138         return None
139
140
141 def error(response):
142     """Return the error string in the response."""
143     try:
144         return response.json()['error']
145     except:
146         return None
147
148
149 def normalize(id):
150     if id is not None:
151         if id[0] == "/":
152             return id[1:]
153     return id
154
155
156 def attr2str(attr):
157     """Convert a dictionary into a string for a protocol payload."""
158     content = ""
159     if attr is not None:
160         content = ","
161         n = len(attr)
162         c = 1
163         sep = ","
164         for i in attr:
165             if n == c:
166                 sep = ""
167             n = str(attr[i])
168             if i != "con" and n.isdigit():
169                 content = content + "'%s':%d%s" % (i, int(n), sep)
170             else:
171                 content = content + "'%s':'%s'%s" % (i, n, sep)
172             c = c + 1
173     return content
174
175
176 class connect:
177     def __init__(self, server="localhost", base='InCSE1',
178                  auth=('admin', 'admin'), protocol="http"):
179         """Connect to a IoTDM server."""
180         self.s = requests.Session()
181         self.s.auth = auth
182         self.s.headers.update({'content-type': 'application/json'})
183         self.timeout = (5, 5)
184         self.payload = cse_payload % (base)
185         self.headers = {
186             # Admittedly these are "magic values" but are required
187             # and until a proper defaulting initializer is in place
188             # are hard-coded.
189             'content-type': 'application/json',
190             'X-M2M-Origin': '//localhost:10000',
191             'X-M2M-RI': '12345',
192             'X-M2M-OT': 'NOW'
193         }
194         self.server = "http://" + server
195         if base is not None:
196             self.url = self.server + op_provision
197             self.r = self.s.post(self.url,
198                                  data=self.payload, timeout=self.timeout)
199
200     def create(self, parent, restype, name=None, attr=None):
201         """Create resource."""
202         if parent is None:
203             return None
204         payload = which_payload(restype)
205         payload = payload % (attr2str(attr))
206         if name is None:
207             self.headers['X-M2M-NM'] = None
208         else:
209             self.headers['X-M2M-NM'] = name
210         parent = normalize(parent)
211         self.url = self.server + ":8282/%s?ty=%s&rcn=1" % (parent, restype)
212         self.r = self.s.post(self.url, payload,
213                              timeout=self.timeout, headers=self.headers)
214         return self.r
215
216     def retrieve(self, id):
217         """Retrieve resource."""
218         if id is None:
219             return None
220         id = normalize(id)
221         self.url = self.server + ":8282/%s?rcn=5&drt=2" % (id)
222         self.headers['X-M2M-NM'] = None
223         self.r = self.s.get(self.url, timeout=self.timeout,
224                             headers=self.headers)
225         return self.r
226
227     def update(self, id, attr=None):
228         """Update resource attr"""
229         if id is None:
230             return None
231         id = normalize(id)
232         return None
233
234     def delete(self, id):
235         """Delete the resource with the provided ID."""
236         if id is None:
237             return None
238         id = normalize(id)
239         self.url = self.server + ":8282/%s" % (id)
240         self.headers['X-M2M-NM'] = None
241         self.r = self.s.delete(self.url, timeout=self.timeout,
242                                headers=self.headers)
243         return self.r
244
245     def tree(self):
246         """Get the resource tree."""
247         self.url = self.server + op_tree
248         self.r = self.s.get(self.url)
249         return self.r
250
251     def kill(self):
252         """Kill the tree."""
253         self.url = self.server + op_cleanup
254         self.r = self.s.post(self.url)
255         return self.r