blob: d7ca649f1eadfddf62be964cf6f6de86b795c354 [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(':')
50 xos_host = xos_endpoints[1][len('//'):]
51 xos_port = xos_endpoints[2][:-1]
52 #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,
159 'subscribed_link_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,
172 'provided_link_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):
186 result = self.restApi.ApiGet('VOLT_TENANT')
187 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,
195 'provided_link_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,
199 'subscribed_link_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 Karthick028edaf2017-11-06 16:34:57 -0800235 _, subId = self.getSubscriberId(result,
236 volt_subscriber_info['service_specific_id'])
A R Karthicked3a2ca2017-07-06 15:50:03 -0700237 assert_not_equal(subId, '0')
A R Karthick028edaf2017-11-06 16:34:57 -0800238 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 -0700239 volt_tenant = volt_subscriber_info['voltTenant']
A R Karthick028edaf2017-11-06 16:34:57 -0800240 result = self.restApi.ApiPost('VOLT_TENANT', volt_tenant)
A R Karthicked3a2ca2017-07-06 15:50:03 -0700241 assert_equal(result, True)
A R Karthick028edaf2017-11-06 16:34:57 -0800242 volt_id = self.linkTenant(subId, volt_tenant)
243 log.info('Subscriber create with ctag %s, stag %s, volt id %s' %(str(volt_tenant['c_tag']),
244 str(volt_tenant['s_tag']),
245 str(volt_id)))
A R Karthicked3a2ca2017-07-06 15:50:03 -0700246 finally:
247 return subId
248
249 def subscriberDelete(self, account_num, subId = '', voltId = ''):
A R Karthick028edaf2017-11-06 16:34:57 -0800250 result = self.restApi.ApiGet('VOLT_SUBSCRIBER')
251 assert_not_equal(result, None)
A R Karthicked3a2ca2017-07-06 15:50:03 -0700252 if not subId:
253 #get the subscriber id first
A R Karthick028edaf2017-11-06 16:34:57 -0800254 subInfo, subId = self.getSubscriberId(result, account_num)
A R Karthicked3a2ca2017-07-06 15:50:03 -0700255 assert_not_equal(subId, '0')
A R Karthick028edaf2017-11-06 16:34:57 -0800256 else:
257 subInfo, currentSubId = self.getSubscriberId(result, account_num)
258 assert_not_equal(currentSubId, '0')
259 #assert_equal(subId, currentSubId)
A R Karthickdfdcb902017-11-06 18:23:46 -0800260 subId = self.getFieldValueFromDict(subInfo, 'id')
A R Karthicked3a2ca2017-07-06 15:50:03 -0700261 if not voltId:
262 #get the volt id for the subscriber
A R Karthick028edaf2017-11-06 16:34:57 -0800263 result = self.restApi.ApiGet('VOLT_TENANT')
A R Karthicked3a2ca2017-07-06 15:50:03 -0700264 assert_not_equal(result, None)
A R Karthick028edaf2017-11-06 16:34:57 -0800265 voltId = self.getVoltId(result, subInfo)
A R Karthicked3a2ca2017-07-06 15:50:03 -0700266 assert_not_equal(voltId, None)
A R Karthicked3a2ca2017-07-06 15:50:03 -0700267 log.info('Deleting VOLT Tenant ID %s for subscriber %s' %(voltId, subId))
A R Karthick028edaf2017-11-06 16:34:57 -0800268 status = self.restApi.ApiChameleonDelete('VOLT_TENANT', voltId)
269 assert_equal(status, True)
270 log.info('Deleting subscriber ID %s for account num %s' %(subId, str(account_num)))
271 status = self.restApi.ApiChameleonDelete('VOLT_SUBSCRIBER', subId)
272 assert_equal(status, True)
A R Karthicked3a2ca2017-07-06 15:50:03 -0700273
274 def subscriberId(self, account_num):
A R Karthick028edaf2017-11-06 16:34:57 -0800275 result = self.restApi.ApiGet('VOLT_SUBSCRIBER')
A R Karthicked3a2ca2017-07-06 15:50:03 -0700276 assert_not_equal(result, None)
A R Karthick028edaf2017-11-06 16:34:57 -0800277 _, subId = self.getSubscriberId(result, account_num)
A R Karthicked3a2ca2017-07-06 15:50:03 -0700278 return subId
279
280class CordSubscriberUtils(object):
281
282 SUBSCRIBER_ACCOUNT_NUM = 100
283 SUBSCRIBER_S_TAG = 500
284 SUBSCRIBER_C_TAG = 500
285 SUBSCRIBERS_PER_S_TAG = 8
286
287 def __init__(self,
288 num_subscribers,
289 account_num = SUBSCRIBER_ACCOUNT_NUM,
290 s_tag = SUBSCRIBER_S_TAG,
291 c_tag = SUBSCRIBER_C_TAG,
292 subscribers_per_s_tag = SUBSCRIBERS_PER_S_TAG):
293 self.num_subscribers = num_subscribers
294 self.account_num = account_num
295 self.s_tag = s_tag
296 self.c_tag = c_tag
297 self.subscribers_per_s_tag = subscribers_per_s_tag
298 self.subscriber_map = {}
299 self.subscriber_info = self.getConfig()
300 self.volt_subscriber_info = self.getVoltConfig()
301 self.xos = XosUtils()
302
303 def getCredentials(self, subId):
304 """Generate our own account num, s_tag and c_tags"""
305 if subId in self.subscriber_map:
306 return self.subscriber_map[subId]
307 account_num = self.account_num
308 self.account_num += 1
309 s_tag, c_tag = self.s_tag, self.c_tag
310 self.c_tag += 1
311 if self.c_tag % self.subscribers_per_s_tag == 0:
312 self.s_tag += 1
313 self.subscriber_map[subId] = account_num, s_tag, c_tag
314 return self.subscriber_map[subId]
315
316 def getConfig(self):
317 features = {
318 'cdn': True,
319 'uplink_speed': 1000000000,
320 'downlink_speed': 1000000000,
A R Karthick028edaf2017-11-06 16:34:57 -0800321 'enable_uverse': True,
A R Karthicked3a2ca2017-07-06 15:50:03 -0700322 'status': 'enabled'
323 }
324 subscriber_map = []
325 for i in xrange(self.num_subscribers):
326 subId = 'sub{}'.format(i)
327 account_num, _, _ = self.getCredentials(subId)
A R Karthick028edaf2017-11-06 16:34:57 -0800328 identity = { 'service_specific_id' : str(account_num),
A R Karthicked3a2ca2017-07-06 15:50:03 -0700329 'name' : 'My House {}'.format(i)
330 }
A R Karthick028edaf2017-11-06 16:34:57 -0800331 sub_data = [ (k, v) for d in (features, identity) \
332 for k, v in d.iteritems() ]
333 sub_info = dict(sub_data)
A R Karthicked3a2ca2017-07-06 15:50:03 -0700334 subscriber_map.append(sub_info)
335
336 return subscriber_map
337
338 def getVoltConfig(self):
339 voltSubscriberMap = []
340 for i in xrange(self.num_subscribers):
341 subId = 'sub{}'.format(i)
342 account_num, s_tag, c_tag = self.getCredentials(subId)
343 voltSubscriberInfo = {}
344 voltSubscriberInfo['voltTenant'] = dict(s_tag = str(s_tag),
A R Karthick028edaf2017-11-06 16:34:57 -0800345 c_tag = str(c_tag))
346 voltSubscriberInfo['service_specific_id'] = account_num
A R Karthicked3a2ca2017-07-06 15:50:03 -0700347 voltSubscriberMap.append(voltSubscriberInfo)
348
349 return voltSubscriberMap
350
A R Karthick028edaf2017-11-06 16:34:57 -0800351 def getVoltId(self, subInfo):
352 return self.xos.getVoltId(None, subInfo)
353
354 def getProviderInstance(self, tenant_info):
355 return self.xos.getProviderInstance(tenant_info)
A R Karthicked3a2ca2017-07-06 15:50:03 -0700356
357 def subscriberCreate(self, index, subscriber_info = None, volt_subscriber_info = None):
358 if subscriber_info is None:
359 subscriber_info = self.subscriber_info[index]
360 if volt_subscriber_info is None:
361 volt_subscriber_info = self.volt_subscriber_info[index]
362 s_tag = int(volt_subscriber_info['voltTenant']['s_tag'])
363 c_tag = int(volt_subscriber_info['voltTenant']['c_tag'])
364 log.info('Creating tenant with s_tag: %d, c_tag: %d' %(s_tag, c_tag))
365 subId = self.xos.subscriberCreate(subscriber_info, volt_subscriber_info)
366 return subId
367
368 def subscriberDelete(self, index, subId = '', voltId = '', subscriber_info = None, volt_subscriber_info = None):
369 if subscriber_info is None:
370 subscriber_info = self.subscriber_info[index]
371 if volt_subscriber_info is None:
372 volt_subscriber_info = self.volt_subscriber_info[index]
373 s_tag = int(volt_subscriber_info['voltTenant']['s_tag'])
374 c_tag = int(volt_subscriber_info['voltTenant']['c_tag'])
375 log.info('Deleting tenant with s_tag: %d, c_tag: %d' %(s_tag, c_tag))
A R Karthick028edaf2017-11-06 16:34:57 -0800376 self.xos.subscriberDelete(volt_subscriber_info['service_specific_id'], subId = subId, voltId = voltId)
A R Karthicked3a2ca2017-07-06 15:50:03 -0700377
378 def subscriberId(self, index):
379 volt_subscriber_info = self.volt_subscriber_info[index]
A R Karthick028edaf2017-11-06 16:34:57 -0800380 return self.xos.subscriberId(volt_subscriber_info['service_specific_id'])