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