blob: b8d0c2c46228ca1cbabb35afb3ed6a1b2625fe3a [file] [log] [blame]
Matteo Scandolo48d3d2d2017-08-08 13:05:27 -07001
2# Copyright 2017-present Open Networking Foundation
3#
4# Licensed under the Apache License, Version 2.0 (the "License");
5# you may not use this file except in compliance with the License.
6# You may obtain a copy of the License at
7#
8# http://www.apache.org/licenses/LICENSE-2.0
9#
10# Unless required by applicable law or agreed to in writing, software
11# distributed under the License is distributed on an "AS IS" BASIS,
12# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13# See the License for the specific language governing permissions and
14# limitations under the License.
15
16
A R Karthicked3a2ca2017-07-06 15:50:03 -070017import os
18import sys
19import time
20from nose.tools import *
21from CordTestUtils import log_test as log
22from OnosCtrl import OnosCtrl
23
24class XosUtils(object):
25
A R Karthick705a5bf2017-10-27 11:17:04 -070026 head_node = os.getenv('HEAD_NODE', 'head1')
A R Karthicked3a2ca2017-07-06 15:50:03 -070027 HEAD_NODE = head_node + '.cord.lab' if len(head_node.split('.')) == 1 else head_node
28 CONTROLLER_PORT = '9000'
29 our_path = os.path.dirname(os.path.realpath(__file__))
30 cord_api_path = os.path.join(our_path, '..', 'cord-api')
31 framework_path = os.path.join(cord_api_path, 'Framework')
32 utils_path = os.path.join(framework_path, 'utils')
33 sys.path.append(utils_path)
34 sys.path.append(framework_path)
35
36 @classmethod
37 def getCredentials(cls):
38 onos_cfg = OnosCtrl.get_config()
39 if onos_cfg is None:
40 return None
41 if 'apps' in onos_cfg and \
42 'org.opencord.vtn' in onos_cfg['apps'] and \
43 'cordvtn' in onos_cfg['apps']['org.opencord.vtn'] and \
44 'xos' in onos_cfg['apps']['org.opencord.vtn']['cordvtn']:
45 xos_cfg = onos_cfg['apps']['org.opencord.vtn']['cordvtn']['xos']
46 endpoint = xos_cfg['endpoint']
47 user = xos_cfg['user']
48 password = xos_cfg['password']
49 xos_endpoints = endpoint.split(':')
A R Karthick3eef13c2017-11-06 18:47:25 -080050 xos_host = xos_endpoints[0]
51 xos_port = xos_endpoints[1]
A R Karthicked3a2ca2017-07-06 15:50:03 -070052 #log.info('xos_host: %s, port: %s, user: %s, password: %s' %(xos_host, xos_port, user, password))
53 return dict(host = xos_host, port = xos_port, user = user, password = password)
54
55 return None
56
57 @classmethod
58 def getRestApi(cls):
59 try:
60 from restApi import restApi
61 restApiXos = restApi()
62 xos_credentials = cls.getCredentials()
63 if xos_credentials is None:
64 restApiXos.controllerIP = cls.HEAD_NODE
65 restApiXos.controllerPort = cls.CONTROLLER_PORT
66 else:
67 restApiXos.controllerIP = xos_credentials['host']
68 restApiXos.controllerPort = xos_credentials['port']
69 restApiXos.user = xos_credentials['user']
70 restApiXos.password = xos_credentials['password']
71
72 return restApiXos
73 except:
74 return None
75
76 def __init__(self):
77 self.restApi = self.getRestApi()
A R Karthickdfdcb902017-11-06 18:23:46 -080078
79 '''
80 @method search_dictionary
81 @Description: Searches for a key in the provided nested dictionary
82 @params: input_dict = dictionary to be searched
83 search_key = name of the key to be searched for
84 returns two values: search_key value and status of the search.
85 True if found (False when not found)
86
87 '''
88 def search_dictionary(self, input_dict, search_key):
89 input_keys = input_dict.keys()
90 key_value = ''
91 found = False
92 for key in input_keys:
93 if key == search_key:
94 key_value = input_dict[key]
95 found = True
96 break
97 elif type(input_dict[key]) == dict:
98 key_value, found = self.search_dictionary(input_dict[key],search_key)
99 if found == True:
100 break
101 elif type(input_dict[key]) == list:
102 if not input_dict[key]:
103 found = False
104 break
105 for item in input_dict[key]:
106 if isinstance(item, dict):
107 key_value, found = self.search_dictionary(item, search_key)
108 if found == True:
109 break
110 return key_value,found
111
112 '''
113 @method getFieldValueFromDict
114 @params : search_dict - Dictionary to be searched
115 field - Key to be searched for (ex: account_num)
116 @Returns: Returns the value of the Key that was provided
117 '''
118 def getFieldValueFromDict(self,search_dict, field):
119 results = ''
120 found = False
121 input_keys = search_dict.keys()
122 for key in input_keys:
123 print "key...", key
124 if key == field:
125 results = search_dict[key]
126 if not results:
127 found = True
128 break
129 elif type(search_dict[key]) == dict:
130 results, found = self.search_dictionary(search_dict[key],field)
131 if found == True:
132 break
133 elif type(search_dict[key]) == list:
134 if not search_dict[key]:
135 found = False
136 continue
137 for item in search_dict[key]:
138 if isinstance(item, dict):
139 results, found = self.search_dictionary(item, field)
140 if found == True:
141 break
142 if results:
143 break
144
145 return results
A R Karthick028edaf2017-11-06 16:34:57 -0800146
147 def getSubscriberId(self, subscriberList, account_num):
148 subscriberId = 0
149 subscriberInfo = None
150 for subscriber in subscriberList:
151 if str(subscriber['service_specific_id']) == str(account_num):
A R Karthickdfdcb902017-11-06 18:23:46 -0800152 subscriberId = self.getFieldValueFromDict(subscriber, 'id')
A R Karthick028edaf2017-11-06 16:34:57 -0800153 subscriberInfo = subscriber
154 break
155 return subscriberInfo, subscriberId
156
157 def getVoltId(self, result, subInfo):
A R Karthickdfdcb902017-11-06 18:23:46 -0800158 subscribed_link_ids_list = self.getFieldValueFromDict(subInfo,
A R Karthick699f5c52017-11-06 19:02:47 -0800159 'subscribed_links_ids')
A R Karthick028edaf2017-11-06 16:34:57 -0800160 assert_not_equal( len(subscribed_link_ids_list), 0)
161 subscribed_link_ids = subscribed_link_ids_list[0]
162 service_link = self.restApi.ApiChameleonGet('CH_CORE_SERVICELINK',
163 subscribed_link_ids)
164 assert_not_equal(service_link, None)
165 provider_service_instance_id = service_link.get('provider_service_instance_id',
166 None)
167 assert_not_equal(provider_service_instance_id, None)
168 return provider_service_instance_id
169
170 def getProviderInstance(self, info):
A R Karthickdfdcb902017-11-06 18:23:46 -0800171 provided_link_ids_list = self.getFieldValueFromDict(info,
A R Karthick699f5c52017-11-06 19:02:47 -0800172 'provided_links_ids')
A R Karthick028edaf2017-11-06 16:34:57 -0800173 assert_not_equal(provided_link_ids_list, None)
174 assert_not_equal(len(provided_link_ids_list), 0)
175 provided_link_ids = provided_link_ids_list[0]
176 service_link = self.restApi.ApiChameleonGet('CH_CORE_SERVICELINK',
177 provided_link_ids)
178 if service_link is None:
179 return None
180 provider_service_instance_id = service_link.get('provider_service_instance_id',
181 None)
182 assert_not_equal(provider_service_instance_id, None)
183 return provider_service_instance_id
184
185 def linkTenant(self, subId, tenant_info):
A R Karthick699f5c52017-11-06 19:02:47 -0800186 result = self.restApi.ApiGet('VOLT_TENANT')['items']
A R Karthick028edaf2017-11-06 16:34:57 -0800187 tenant = None
188 for volt in result:
189 if str(volt['c_tag']) == str(tenant_info['c_tag']):
190 tenant = volt
191 break
192 assert_not_equal(tenant, None)
A R Karthickdfdcb902017-11-06 18:23:46 -0800193 volt_id = self.getFieldValueFromDict(tenant, 'id')
194 provided_links_ids_list = self.getFieldValueFromDict(tenant,
A R Karthick699f5c52017-11-06 19:02:47 -0800195 'provided_links_ids')
A R Karthick028edaf2017-11-06 16:34:57 -0800196 assert_not_equal( len(provided_link_ids_list), 0)
197 provided_link_ids = provided_link_ids_list[0]
A R Karthickdfdcb902017-11-06 18:23:46 -0800198 subscribed_link_ids_list = self.getFieldValueFromDict(tenant,
A R Karthick699f5c52017-11-06 19:02:47 -0800199 'subscribed_links_ids')
A R Karthick028edaf2017-11-06 16:34:57 -0800200 assert_not_equal(len(subscribed_link_ids_list), 0)
201 subscribed_link_ids = subscribed_link_ids_list[0]
202 service_link = self.restApi.ApiChameleonGet('CH_CORE_SERVICELINK',
203 provided_link_ids)
204 assert_not_equal(service_link, None)
205 provider_service_instance_id = service_link.get('provider_service_instance_id',
206 None)
207 assert_not_equal(provider_service_instance_id, None)
208 service_dict = dict(subscriber_service_instance_id = subId)
209 result = self.restApi.ApiChameleonPut('CH_CORE_SERVICELINK',
210 service_dict,
211 provided_link_ids)
212 assert_equal(result, True)
213 return provider_service_instance_id
214 # service_link_dict = self.restApi.ApiChameleonGet('CH_CORE_SERVICELINK',
215 # subscribed_link_ids)
216 # assert_not_equal(service_link_dict, None)
217 # vsg_tenant = service_link_dict.get('provider_service_instance_id', None)
218 # assert_not_equal(vsg_tenant, None)
219 # vsg_result = self.restApi.ApiChameleonGet('VSG_TENANT',
220 # vsg_tenant)
221 # assert_not_equal(vsg_result, None)
222 # vsg_instance = vsg_result.get('instance_id', None)
223 # assert_not_equal(vsg_instance, None)
224 # instance_result = self.restApi.ApiChameleonGet('CH_CORE_INSTANCES',
225 # vsg_instance)
226 # assert_equal(instance_result, True)
A R Karthicked3a2ca2017-07-06 15:50:03 -0700227
228 def subscriberCreate(self, subscriber_info, volt_subscriber_info):
229 subId = ''
230 try:
A R Karthick028edaf2017-11-06 16:34:57 -0800231 result = self.restApi.ApiPost('VOLT_SUBSCRIBER', subscriber_info)
A R Karthicked3a2ca2017-07-06 15:50:03 -0700232 assert_equal(result, True)
A R Karthick028edaf2017-11-06 16:34:57 -0800233 result = self.restApi.ApiGet('VOLT_SUBSCRIBER')
A R Karthicked3a2ca2017-07-06 15:50:03 -0700234 assert_not_equal(result, None)
A R Karthick699f5c52017-11-06 19:02:47 -0800235 result = result['items']
A R Karthick028edaf2017-11-06 16:34:57 -0800236 _, subId = self.getSubscriberId(result,
237 volt_subscriber_info['service_specific_id'])
A R Karthicked3a2ca2017-07-06 15:50:03 -0700238 assert_not_equal(subId, '0')
A R Karthick028edaf2017-11-06 16:34:57 -0800239 log.info('Subscriber ID for account num %s = %s' %(str(volt_subscriber_info['service_specific_id']), subId))
A R Karthicked3a2ca2017-07-06 15:50:03 -0700240 volt_tenant = volt_subscriber_info['voltTenant']
A R Karthick028edaf2017-11-06 16:34:57 -0800241 result = self.restApi.ApiPost('VOLT_TENANT', volt_tenant)
A R Karthicked3a2ca2017-07-06 15:50:03 -0700242 assert_equal(result, True)
A R Karthick028edaf2017-11-06 16:34:57 -0800243 volt_id = self.linkTenant(subId, volt_tenant)
244 log.info('Subscriber create with ctag %s, stag %s, volt id %s' %(str(volt_tenant['c_tag']),
245 str(volt_tenant['s_tag']),
246 str(volt_id)))
A R Karthicked3a2ca2017-07-06 15:50:03 -0700247 finally:
248 return subId
249
250 def subscriberDelete(self, account_num, subId = '', voltId = ''):
A R Karthick028edaf2017-11-06 16:34:57 -0800251 result = self.restApi.ApiGet('VOLT_SUBSCRIBER')
252 assert_not_equal(result, None)
A R Karthick699f5c52017-11-06 19:02:47 -0800253 result = result['items']
A R Karthicked3a2ca2017-07-06 15:50:03 -0700254 if not subId:
255 #get the subscriber id first
A R Karthick028edaf2017-11-06 16:34:57 -0800256 subInfo, subId = self.getSubscriberId(result, account_num)
A R Karthicked3a2ca2017-07-06 15:50:03 -0700257 assert_not_equal(subId, '0')
A R Karthick028edaf2017-11-06 16:34:57 -0800258 else:
259 subInfo, currentSubId = self.getSubscriberId(result, account_num)
260 assert_not_equal(currentSubId, '0')
261 #assert_equal(subId, currentSubId)
A R Karthickdfdcb902017-11-06 18:23:46 -0800262 subId = self.getFieldValueFromDict(subInfo, 'id')
A R Karthicked3a2ca2017-07-06 15:50:03 -0700263 if not voltId:
264 #get the volt id for the subscriber
A R Karthick028edaf2017-11-06 16:34:57 -0800265 result = self.restApi.ApiGet('VOLT_TENANT')
A R Karthicked3a2ca2017-07-06 15:50:03 -0700266 assert_not_equal(result, None)
A R Karthick699f5c52017-11-06 19:02:47 -0800267 result = result['items']
A R Karthick028edaf2017-11-06 16:34:57 -0800268 voltId = self.getVoltId(result, subInfo)
A R Karthicked3a2ca2017-07-06 15:50:03 -0700269 assert_not_equal(voltId, None)
A R Karthicked3a2ca2017-07-06 15:50:03 -0700270 log.info('Deleting VOLT Tenant ID %s for subscriber %s' %(voltId, subId))
A R Karthick028edaf2017-11-06 16:34:57 -0800271 status = self.restApi.ApiChameleonDelete('VOLT_TENANT', voltId)
272 assert_equal(status, True)
273 log.info('Deleting subscriber ID %s for account num %s' %(subId, str(account_num)))
274 status = self.restApi.ApiChameleonDelete('VOLT_SUBSCRIBER', subId)
275 assert_equal(status, True)
A R Karthicked3a2ca2017-07-06 15:50:03 -0700276
277 def subscriberId(self, account_num):
A R Karthick028edaf2017-11-06 16:34:57 -0800278 result = self.restApi.ApiGet('VOLT_SUBSCRIBER')
A R Karthicked3a2ca2017-07-06 15:50:03 -0700279 assert_not_equal(result, None)
A R Karthick699f5c52017-11-06 19:02:47 -0800280 result = result['items']
A R Karthick028edaf2017-11-06 16:34:57 -0800281 _, subId = self.getSubscriberId(result, account_num)
A R Karthicked3a2ca2017-07-06 15:50:03 -0700282 return subId
283
284class CordSubscriberUtils(object):
285
286 SUBSCRIBER_ACCOUNT_NUM = 100
287 SUBSCRIBER_S_TAG = 500
288 SUBSCRIBER_C_TAG = 500
289 SUBSCRIBERS_PER_S_TAG = 8
290
291 def __init__(self,
292 num_subscribers,
293 account_num = SUBSCRIBER_ACCOUNT_NUM,
294 s_tag = SUBSCRIBER_S_TAG,
295 c_tag = SUBSCRIBER_C_TAG,
296 subscribers_per_s_tag = SUBSCRIBERS_PER_S_TAG):
297 self.num_subscribers = num_subscribers
298 self.account_num = account_num
299 self.s_tag = s_tag
300 self.c_tag = c_tag
301 self.subscribers_per_s_tag = subscribers_per_s_tag
302 self.subscriber_map = {}
303 self.subscriber_info = self.getConfig()
304 self.volt_subscriber_info = self.getVoltConfig()
305 self.xos = XosUtils()
306
307 def getCredentials(self, subId):
308 """Generate our own account num, s_tag and c_tags"""
309 if subId in self.subscriber_map:
310 return self.subscriber_map[subId]
311 account_num = self.account_num
312 self.account_num += 1
313 s_tag, c_tag = self.s_tag, self.c_tag
314 self.c_tag += 1
315 if self.c_tag % self.subscribers_per_s_tag == 0:
316 self.s_tag += 1
317 self.subscriber_map[subId] = account_num, s_tag, c_tag
318 return self.subscriber_map[subId]
319
320 def getConfig(self):
321 features = {
A R Karthick3eef13c2017-11-06 18:47:25 -0800322 'cdn_enable': True,
A R Karthicked3a2ca2017-07-06 15:50:03 -0700323 'uplink_speed': 1000000000,
324 'downlink_speed': 1000000000,
A R Karthick028edaf2017-11-06 16:34:57 -0800325 'enable_uverse': True,
A R Karthicked3a2ca2017-07-06 15:50:03 -0700326 'status': 'enabled'
327 }
328 subscriber_map = []
329 for i in xrange(self.num_subscribers):
330 subId = 'sub{}'.format(i)
331 account_num, _, _ = self.getCredentials(subId)
A R Karthick028edaf2017-11-06 16:34:57 -0800332 identity = { 'service_specific_id' : str(account_num),
A R Karthicked3a2ca2017-07-06 15:50:03 -0700333 'name' : 'My House {}'.format(i)
334 }
A R Karthick028edaf2017-11-06 16:34:57 -0800335 sub_data = [ (k, v) for d in (features, identity) \
336 for k, v in d.iteritems() ]
337 sub_info = dict(sub_data)
A R Karthicked3a2ca2017-07-06 15:50:03 -0700338 subscriber_map.append(sub_info)
339
340 return subscriber_map
341
342 def getVoltConfig(self):
343 voltSubscriberMap = []
344 for i in xrange(self.num_subscribers):
345 subId = 'sub{}'.format(i)
346 account_num, s_tag, c_tag = self.getCredentials(subId)
347 voltSubscriberInfo = {}
348 voltSubscriberInfo['voltTenant'] = dict(s_tag = str(s_tag),
A R Karthick028edaf2017-11-06 16:34:57 -0800349 c_tag = str(c_tag))
350 voltSubscriberInfo['service_specific_id'] = account_num
A R Karthicked3a2ca2017-07-06 15:50:03 -0700351 voltSubscriberMap.append(voltSubscriberInfo)
352
353 return voltSubscriberMap
354
A R Karthick028edaf2017-11-06 16:34:57 -0800355 def getVoltId(self, subInfo):
356 return self.xos.getVoltId(None, subInfo)
357
358 def getProviderInstance(self, tenant_info):
359 return self.xos.getProviderInstance(tenant_info)
A R Karthicked3a2ca2017-07-06 15:50:03 -0700360
361 def subscriberCreate(self, index, subscriber_info = None, volt_subscriber_info = None):
362 if subscriber_info is None:
363 subscriber_info = self.subscriber_info[index]
364 if volt_subscriber_info is None:
365 volt_subscriber_info = self.volt_subscriber_info[index]
366 s_tag = int(volt_subscriber_info['voltTenant']['s_tag'])
367 c_tag = int(volt_subscriber_info['voltTenant']['c_tag'])
368 log.info('Creating tenant with s_tag: %d, c_tag: %d' %(s_tag, c_tag))
369 subId = self.xos.subscriberCreate(subscriber_info, volt_subscriber_info)
370 return subId
371
372 def subscriberDelete(self, index, subId = '', voltId = '', subscriber_info = None, volt_subscriber_info = None):
373 if subscriber_info is None:
374 subscriber_info = self.subscriber_info[index]
375 if volt_subscriber_info is None:
376 volt_subscriber_info = self.volt_subscriber_info[index]
377 s_tag = int(volt_subscriber_info['voltTenant']['s_tag'])
378 c_tag = int(volt_subscriber_info['voltTenant']['c_tag'])
379 log.info('Deleting tenant with s_tag: %d, c_tag: %d' %(s_tag, c_tag))
A R Karthick028edaf2017-11-06 16:34:57 -0800380 self.xos.subscriberDelete(volt_subscriber_info['service_specific_id'], subId = subId, voltId = voltId)
A R Karthicked3a2ca2017-07-06 15:50:03 -0700381
382 def subscriberId(self, index):
383 volt_subscriber_info = self.volt_subscriber_info[index]
A R Karthick028edaf2017-11-06 16:34:57 -0800384 return self.xos.subscriberId(volt_subscriber_info['service_specific_id'])