blob: 2b6e43213f5841e2e663982edf5a171c8109d99c [file] [log] [blame]
Girish Gowdru1e77ea02018-09-24 09:10:35 -07001#
2# Copyright 2018 the original author or authors.
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
17import structlog
18
19from common.pon_resource_manager.resource_manager import PONResourceManager
20from voltha.registry import registry
21from voltha.core.config.config_backend import ConsulStore
22from voltha.core.config.config_backend import EtcdStore
Girish Gowdruab836e92018-10-25 01:17:57 -070023from voltha.adapters.openolt.openolt_flow_mgr import *
24
Craig Lutgen1dd47082018-10-23 13:12:26 -050025from voltha.adapters.openolt.protos import openolt_pb2
Craig Lutgenabd9c842018-11-15 23:58:27 +000026from voltha.adapters.openolt.openolt_platform import OpenOltPlatform
Girish Gowdru1e77ea02018-09-24 09:10:35 -070027
Girish Gowdruab836e92018-10-25 01:17:57 -070028
Girish Gowdru1e77ea02018-09-24 09:10:35 -070029class OpenOltResourceMgr(object):
Girish Gowdrub761bc12018-11-29 02:22:18 -080030 BASE_PATH_KV_STORE = "service/voltha/openolt/{}" # service/voltha/openolt/<device_id>
Girish Gowdru1e77ea02018-09-24 09:10:35 -070031
32 def __init__(self, device_id, host_and_port, extra_args, device_info):
33 self.log = structlog.get_logger(id=device_id,
34 ip=host_and_port)
35 self.device_id = device_id
36 self.host_and_port = host_and_port
37 self.extra_args = extra_args
38 self.device_info = device_info
Craig Lutgenabd9c842018-11-15 23:58:27 +000039 self.max_uni_id_per_onu = 0 #OpenOltPlatform.MAX_UNIS_PER_ONU, Uncomment or override to make default multi-uni
Girish Gowdru1e77ea02018-09-24 09:10:35 -070040 self.args = registry('main').get_args()
41
42 # KV store's IP Address and PORT
Girish Gowdru1e77ea02018-09-24 09:10:35 -070043 if self.args.backend == 'etcd':
44 host, port = self.args.etcd.split(':', 1)
45 self.kv_store = EtcdStore(host, port,
46 OpenOltResourceMgr.BASE_PATH_KV_STORE.format(device_id))
47 elif self.args.backend == 'consul':
48 host, port = self.args.consul.split(':', 1)
49 self.kv_store = ConsulStore(host, port,
50 OpenOltResourceMgr.BASE_PATH_KV_STORE.format(device_id))
51 else:
52 self.log.error('Invalid-backend')
53 raise Exception("Invalid-backend-for-kv-store")
54
Craig Lutgen1dd47082018-10-23 13:12:26 -050055 ranges = dict()
56 resource_mgrs_by_tech = dict()
57 self.resource_mgrs = dict()
Girish Gowdru1e77ea02018-09-24 09:10:35 -070058
Craig Lutgen1dd47082018-10-23 13:12:26 -050059 # If a legacy driver returns protobuf without any ranges,s synthesize one from
60 # the legacy global per-device informaiton. This, in theory, is temporary until
61 # the legacy drivers are upgrade to support pool ranges.
62 if len(self.device_info.ranges) == 0:
63 arange = self.device_info.ranges.add()
64 arange.technology = self.device_info.technology
65 arange.intf_ids.extend(range(0, device_info.pon_ports))
Girish Gowdru1e77ea02018-09-24 09:10:35 -070066
Craig Lutgen1dd47082018-10-23 13:12:26 -050067 pool = arange.pools.add()
68 pool.type = openolt_pb2.DeviceInfo.DeviceResourceRanges.Pool.ONU_ID
69 pool.start = self.device_info.onu_id_start
70 pool.end = self.device_info.onu_id_end
71 pool.sharing = openolt_pb2.DeviceInfo.DeviceResourceRanges.Pool.DEDICATED_PER_INTF
72
73 pool = arange.pools.add()
74 pool.type = openolt_pb2.DeviceInfo.DeviceResourceRanges.Pool.ALLOC_ID
75 pool.start = self.device_info.alloc_id_start
76 pool.end = self.device_info.alloc_id_end
77 pool.sharing = openolt_pb2.DeviceInfo.DeviceResourceRanges.Pool.SHARED_BY_ALL_INTF_ALL_TECH
78
79 pool = arange.pools.add()
80 pool.type = openolt_pb2.DeviceInfo.DeviceResourceRanges.Pool.GEMPORT_ID
81 pool.start = self.device_info.gemport_id_start
82 pool.end = self.device_info.gemport_id_end
83 pool.sharing = openolt_pb2.DeviceInfo.DeviceResourceRanges.Pool.SHARED_BY_ALL_INTF_ALL_TECH
84
Girish Gowdruab836e92018-10-25 01:17:57 -070085 pool = arange.pools.add()
86 pool.type = openolt_pb2.DeviceInfo.DeviceResourceRanges.Pool.FLOW_ID
87 pool.start = self.device_info.flow_id_start
88 pool.end = self.device_info.flow_id_end
89 pool.sharing = openolt_pb2.DeviceInfo.DeviceResourceRanges.Pool.SHARED_BY_ALL_INTF_ALL_TECH
90
Craig Lutgen1dd47082018-10-23 13:12:26 -050091 # Create a separate Resource Manager instance for each range. This assumes that
92 # each technology is represented by only a single range
93 global_resource_mgr = None
94 for arange in self.device_info.ranges:
95 technology = arange.technology
96 self.log.info("device-info", technology=technology)
97 ranges[technology] = arange
Girish Gowdruab836e92018-10-25 01:17:57 -070098 extra_args = self.extra_args + ' ' + PONResourceManager.OLT_MODEL_ARG + ' {}'.format(self.device_info.model)
Craig Lutgen1dd47082018-10-23 13:12:26 -050099 resource_mgr = PONResourceManager(technology,
Girish Gowdruab836e92018-10-25 01:17:57 -0700100 extra_args, self.device_id, self.args.backend, host, port)
Craig Lutgen1dd47082018-10-23 13:12:26 -0500101 resource_mgrs_by_tech[technology] = resource_mgr
Girish Gowdruab836e92018-10-25 01:17:57 -0700102 if global_resource_mgr is None:
103 global_resource_mgr = resource_mgr
Craig Lutgen1dd47082018-10-23 13:12:26 -0500104 for intf_id in arange.intf_ids:
105 self.resource_mgrs[intf_id] = resource_mgrs_by_tech[technology]
106 self.initialize_device_resource_range_and_pool(resource_mgr, global_resource_mgr, arange)
107
108 # After we have initialized resource ranges, initialize the
109 # resource pools accordingly.
110 for technology, resource_mgr in resource_mgrs_by_tech.iteritems():
111 resource_mgr.init_device_resource_pool()
Girish Gowdru1e77ea02018-09-24 09:10:35 -0700112
113 def __del__(self):
114 self.log.info("clearing-device-resource-pool")
Girish Gowdruab836e92018-10-25 01:17:57 -0700115 for key, resource_mgr in self.resource_mgrs.iteritems():
Craig Lutgen1dd47082018-10-23 13:12:26 -0500116 resource_mgr.clear_device_resource_pool()
Girish Gowdru1e77ea02018-09-24 09:10:35 -0700117
Craig Lutgenabd9c842018-11-15 23:58:27 +0000118 def assert_pon_id_limit(self, pon_intf_id):
119 assert pon_intf_id in self.resource_mgrs
120
121 def assert_onu_id_limit(self, pon_intf_id, onu_id):
122 self.assert_pon_id_limit(pon_intf_id)
123 self.resource_mgrs[pon_intf_id].assert_resource_limits(onu_id, PONResourceManager.ONU_ID)
124
125 def assert_uni_id_limit(self, pon_intf_id, onu_id, uni_id):
126 self.assert_onu_id_limit(pon_intf_id, onu_id)
127 self.resource_mgrs[pon_intf_id].assert_resource_limits(uni_id, PONResourceManager.UNI_ID)
128
Girish Gowdru1e77ea02018-09-24 09:10:35 -0700129 def get_onu_id(self, pon_intf_id):
Craig Lutgen1dd47082018-10-23 13:12:26 -0500130 onu_id = self.resource_mgrs[pon_intf_id].get_resource_id(
Girish Gowdru1e77ea02018-09-24 09:10:35 -0700131 pon_intf_id, PONResourceManager.ONU_ID, 1)
132
133 if onu_id is not None:
134 pon_intf_onu_id = (pon_intf_id, onu_id)
Craig Lutgen1dd47082018-10-23 13:12:26 -0500135 self.resource_mgrs[pon_intf_id].init_resource_map(
Girish Gowdru1e77ea02018-09-24 09:10:35 -0700136 pon_intf_onu_id)
137
138 return onu_id
139
Girish Gowdrub761bc12018-11-29 02:22:18 -0800140 def get_flow_id(self, pon_intf_id, onu_id, uni_id, flow_store_cookie,
141 flow_category=None):
Craig Lutgenabd9c842018-11-15 23:58:27 +0000142 pon_intf_onu_id = (pon_intf_id, onu_id, uni_id)
Girish Gowdrub761bc12018-11-29 02:22:18 -0800143 try:
144 flow_ids = self.resource_mgrs[pon_intf_id]. \
145 get_current_flow_ids_for_onu(pon_intf_onu_id)
146 if flow_ids is not None:
147 for flow_id in flow_ids:
148 flows = self.get_flow_id_info(pon_intf_id, onu_id, uni_id, flow_id)
149 assert (isinstance(flows, list))
150 for flow in flows:
151
152 if flow_category is not None and \
153 'flow_category' in flow and \
154 flow['flow_category'] == flow_category:
155 return flow_id
156 if flow['flow_store_cookie'] == flow_store_cookie:
157 return flow_id
158 except Exception as e:
159 self.log.error("error-retrieving-flow-info", e=e)
160
Craig Lutgenabd9c842018-11-15 23:58:27 +0000161 flow_id = self.resource_mgrs[pon_intf_id].get_resource_id(
Girish Gowdrub761bc12018-11-29 02:22:18 -0800162 pon_intf_onu_id[0], PONResourceManager.FLOW_ID)
Girish Gowdruab836e92018-10-25 01:17:57 -0700163 if flow_id is not None:
Girish Gowdrub761bc12018-11-29 02:22:18 -0800164 self.resource_mgrs[pon_intf_id].update_flow_id_for_onu(
165 pon_intf_onu_id, flow_id
166 )
Girish Gowdruab836e92018-10-25 01:17:57 -0700167
168 return flow_id
169
Craig Lutgenabd9c842018-11-15 23:58:27 +0000170 def get_flow_id_info(self, pon_intf_id, onu_id, uni_id, flow_id):
171 pon_intf_onu_id = (pon_intf_id, onu_id, uni_id)
Girish Gowdruab836e92018-10-25 01:17:57 -0700172 return self.resource_mgrs[pon_intf_id].get_flow_id_info(pon_intf_onu_id, flow_id)
173
Craig Lutgenabd9c842018-11-15 23:58:27 +0000174 def get_current_flow_ids_for_uni(self, pon_intf_id, onu_id, uni_id):
175 pon_intf_onu_id = (pon_intf_id, onu_id, uni_id)
Girish Gowdruab836e92018-10-25 01:17:57 -0700176 return self.resource_mgrs[pon_intf_id].get_current_flow_ids_for_onu(pon_intf_onu_id)
177
Craig Lutgenabd9c842018-11-15 23:58:27 +0000178 def update_flow_id_info_for_uni(self, pon_intf_id, onu_id, uni_id, flow_id, flow_data):
179 pon_intf_onu_id = (pon_intf_id, onu_id, uni_id)
Girish Gowdruab836e92018-10-25 01:17:57 -0700180 return self.resource_mgrs[pon_intf_id].update_flow_id_info_for_onu(
181 pon_intf_onu_id, flow_id, flow_data)
182
Girish Gowdru1e77ea02018-09-24 09:10:35 -0700183 def get_alloc_id(self, pon_intf_onu_id):
184 # Derive the pon_intf from the pon_intf_onu_id tuple
185 pon_intf = pon_intf_onu_id[0]
Craig Lutgen1dd47082018-10-23 13:12:26 -0500186 alloc_id_list = self.resource_mgrs[pon_intf].get_current_alloc_ids_for_onu(
Girish Gowdru1e77ea02018-09-24 09:10:35 -0700187 pon_intf_onu_id)
188
189 if alloc_id_list and len(alloc_id_list) > 0:
190 # Since we support only one alloc_id for the ONU at the moment,
191 # return the first alloc_id in the list, if available, for that
192 # ONU.
193 return alloc_id_list[0]
194
Girish Gowdruab836e92018-10-25 01:17:57 -0700195 alloc_id = self.resource_mgrs[pon_intf].get_resource_id(
Girish Gowdru1e77ea02018-09-24 09:10:35 -0700196 pon_intf_id=pon_intf,
197 resource_type=PONResourceManager.ALLOC_ID,
198 num_of_id=1
199 )
Girish Gowdruab836e92018-10-25 01:17:57 -0700200 if alloc_id is None:
Girish Gowdru1e77ea02018-09-24 09:10:35 -0700201 self.log.error("no-alloc-id-available")
202 return None
203
204 # update the resource map on KV store with the list of alloc_id
205 # allocated for the pon_intf_onu_id tuple
Craig Lutgen1dd47082018-10-23 13:12:26 -0500206 self.resource_mgrs[pon_intf].update_alloc_ids_for_onu(pon_intf_onu_id,
Girish Gowdruab836e92018-10-25 01:17:57 -0700207 list(alloc_id))
Girish Gowdru1e77ea02018-09-24 09:10:35 -0700208
209 return alloc_id
210
Girish Gowdruab836e92018-10-25 01:17:57 -0700211 def get_current_gemport_ids_for_onu(self, pon_intf_onu_id):
212 pon_intf_id = pon_intf_onu_id[0]
213 return self.resource_mgrs[pon_intf_id].get_current_gemport_ids_for_onu(pon_intf_onu_id)
214
Girish Gowdrub761bc12018-11-29 02:22:18 -0800215 def get_current_alloc_ids_for_onu(self, pon_intf_onu_id):
216 pon_intf_id = pon_intf_onu_id[0]
217 alloc_ids = self.resource_mgrs[pon_intf_id].get_current_alloc_ids_for_onu(pon_intf_onu_id)
218 if alloc_ids is None:
219 return None
220 # We support only one tcont at the moment
221 return alloc_ids[0]
222
Craig Lutgenabd9c842018-11-15 23:58:27 +0000223 def update_gemports_ponport_to_onu_map_on_kv_store(self, gemport_list, pon_port, onu_id, uni_id):
Girish Gowdruab836e92018-10-25 01:17:57 -0700224 for gemport in gemport_list:
225 pon_intf_gemport = (pon_port, gemport)
226 # This information is used when packet_indication is received and
227 # we need to derive the ONU Id for which the packet arrived based
228 # on the pon_intf and gemport available in the packet_indication
Craig Lutgenabd9c842018-11-15 23:58:27 +0000229 self.kv_store[str(pon_intf_gemport)] = ' '.join(map(str, (onu_id, uni_id)))
230
231 def get_onu_uni_from_ponport_gemport(self, pon_port, gemport):
232 pon_intf_gemport = (pon_port, gemport)
233 return tuple(map(int, self.kv_store[str(pon_intf_gemport)].split(' ')))
Girish Gowdruab836e92018-10-25 01:17:57 -0700234
235 def get_gemport_id(self, pon_intf_onu_id, num_of_id=1):
Girish Gowdru1e77ea02018-09-24 09:10:35 -0700236 # Derive the pon_intf and onu_id from the pon_intf_onu_id tuple
237 pon_intf = pon_intf_onu_id[0]
238 onu_id = pon_intf_onu_id[1]
Craig Lutgenabd9c842018-11-15 23:58:27 +0000239 uni_id = pon_intf_onu_id[2]
240 assert False, 'unused function'
Girish Gowdru1e77ea02018-09-24 09:10:35 -0700241
Craig Lutgen1dd47082018-10-23 13:12:26 -0500242 gemport_id_list = self.resource_mgrs[pon_intf].get_current_gemport_ids_for_onu(
Girish Gowdru1e77ea02018-09-24 09:10:35 -0700243 pon_intf_onu_id)
244 if gemport_id_list and len(gemport_id_list) > 0:
Girish Gowdruab836e92018-10-25 01:17:57 -0700245 return gemport_id_list
Girish Gowdru1e77ea02018-09-24 09:10:35 -0700246
Craig Lutgen1dd47082018-10-23 13:12:26 -0500247 gemport_id_list = self.resource_mgrs[pon_intf].get_resource_id(
Girish Gowdru1e77ea02018-09-24 09:10:35 -0700248 pon_intf_id=pon_intf,
249 resource_type=PONResourceManager.GEMPORT_ID,
Girish Gowdruab836e92018-10-25 01:17:57 -0700250 num_of_id=num_of_id
Girish Gowdru1e77ea02018-09-24 09:10:35 -0700251 )
252
253 if gemport_id_list and len(gemport_id_list) == 0:
254 self.log.error("no-gemport-id-available")
255 return None
256
257 # update the resource map on KV store with the list of gemport_id
258 # allocated for the pon_intf_onu_id tuple
Craig Lutgen1dd47082018-10-23 13:12:26 -0500259 self.resource_mgrs[pon_intf].update_gemport_ids_for_onu(pon_intf_onu_id,
Girish Gowdruab836e92018-10-25 01:17:57 -0700260 gemport_id_list)
Girish Gowdru1e77ea02018-09-24 09:10:35 -0700261
Girish Gowdruab836e92018-10-25 01:17:57 -0700262 self.update_gemports_ponport_to_onu_map_on_kv_store(gemport_id_list,
Craig Lutgenabd9c842018-11-15 23:58:27 +0000263 pon_intf, onu_id, uni_id)
Girish Gowdruab836e92018-10-25 01:17:57 -0700264 return gemport_id_list
Girish Gowdru1e77ea02018-09-24 09:10:35 -0700265
266 def free_onu_id(self, pon_intf_id, onu_id):
Girish Gowdruab836e92018-10-25 01:17:57 -0700267 _ = self.resource_mgrs[pon_intf_id].free_resource_id(
Girish Gowdru1e77ea02018-09-24 09:10:35 -0700268 pon_intf_id, PONResourceManager.ONU_ID, onu_id)
269
270 pon_intf_onu_id = (pon_intf_id, onu_id)
Craig Lutgen1dd47082018-10-23 13:12:26 -0500271 self.resource_mgrs[pon_intf_id].remove_resource_map(
Girish Gowdru1e77ea02018-09-24 09:10:35 -0700272 pon_intf_onu_id)
273
Craig Lutgenabd9c842018-11-15 23:58:27 +0000274 def free_flow_id_for_uni(self, pon_intf_id, onu_id, uni_id, flow_id):
Girish Gowdruab836e92018-10-25 01:17:57 -0700275 self.resource_mgrs[pon_intf_id].free_resource_id(
276 pon_intf_id, PONResourceManager.FLOW_ID, flow_id)
Craig Lutgenabd9c842018-11-15 23:58:27 +0000277 pon_intf_onu_id = (pon_intf_id, onu_id, uni_id)
Girish Gowdruab836e92018-10-25 01:17:57 -0700278 self.resource_mgrs[pon_intf_id].update_flow_id_for_onu(pon_intf_onu_id,
279 flow_id, False)
280 self.resource_mgrs[pon_intf_id].remove_flow_id_info(pon_intf_onu_id,
281 flow_id)
282
Girish Gowdru1e77ea02018-09-24 09:10:35 -0700283 def free_pon_resources_for_onu(self, pon_intf_id_onu_id):
284
Girish Gowdru1e77ea02018-09-24 09:10:35 -0700285 pon_intf_id = pon_intf_id_onu_id[0]
286 onu_id = pon_intf_id_onu_id[1]
Craig Lutgen1dd47082018-10-23 13:12:26 -0500287 alloc_ids = \
288 self.resource_mgrs[pon_intf_id].get_current_alloc_ids_for_onu(pon_intf_id_onu_id)
289 self.resource_mgrs[pon_intf_id].free_resource_id(pon_intf_id,
Girish Gowdruab836e92018-10-25 01:17:57 -0700290 PONResourceManager.ALLOC_ID,
291 alloc_ids)
Girish Gowdru1e77ea02018-09-24 09:10:35 -0700292
293 gemport_ids = \
Craig Lutgen1dd47082018-10-23 13:12:26 -0500294 self.resource_mgrs[pon_intf_id].get_current_gemport_ids_for_onu(pon_intf_id_onu_id)
295 self.resource_mgrs[pon_intf_id].free_resource_id(pon_intf_id,
Girish Gowdruab836e92018-10-25 01:17:57 -0700296 PONResourceManager.GEMPORT_ID,
297 gemport_ids)
Girish Gowdru1e77ea02018-09-24 09:10:35 -0700298
Girish Gowdrub761bc12018-11-29 02:22:18 -0800299 flow_ids = \
300 self.resource_mgrs[pon_intf_id].get_current_flow_ids_for_onu(pon_intf_id_onu_id)
301 self.resource_mgrs[pon_intf_id].free_resource_id(pon_intf_id,
302 PONResourceManager.FLOW_ID,
303 flow_ids)
304
Craig Lutgen1dd47082018-10-23 13:12:26 -0500305 self.resource_mgrs[pon_intf_id].free_resource_id(pon_intf_id,
Girish Gowdruab836e92018-10-25 01:17:57 -0700306 PONResourceManager.ONU_ID,
307 onu_id)
Girish Gowdru1e77ea02018-09-24 09:10:35 -0700308
309 # Clear resource map associated with (pon_intf_id, gemport_id) tuple.
Craig Lutgen1dd47082018-10-23 13:12:26 -0500310 self.resource_mgrs[pon_intf_id].remove_resource_map(pon_intf_id_onu_id)
Girish Gowdru1e77ea02018-09-24 09:10:35 -0700311
312 # Clear the ONU Id associated with the (pon_intf_id, gemport_id) tuple.
313 for gemport_id in gemport_ids:
314 del self.kv_store[str((pon_intf_id, gemport_id))]
315
Craig Lutgen1dd47082018-10-23 13:12:26 -0500316 def initialize_device_resource_range_and_pool(self, resource_mgr, global_resource_mgr, arange):
317 self.log.info("resource-range-pool-init", technology=resource_mgr.technology)
Girish Gowdru1e77ea02018-09-24 09:10:35 -0700318
Craig Lutgen1dd47082018-10-23 13:12:26 -0500319 # first load from KV profiles
320 status = resource_mgr.init_resource_ranges_from_kv_store()
321 if not status:
322 self.log.info("failed-to-load-resource-range-from-kv-store", technology=resource_mgr.technology)
323
324 # Then apply device specific information. If KV doesn't exist
325 # or is broader than the device, the device's informationw ill
326 # dictate the range limits
327 self.log.info("using-device-info-to-init-pon-resource-ranges", technology=resource_mgr.technology)
328
329 onu_id_start = self.device_info.onu_id_start
330 onu_id_end = self.device_info.onu_id_end
331 onu_id_shared = openolt_pb2.DeviceInfo.DeviceResourceRanges.Pool.DEDICATED_PER_INTF
332 onu_id_shared_pool_id = None
333 alloc_id_start = self.device_info.alloc_id_start
334 alloc_id_end = self.device_info.alloc_id_end
Girish Gowdruab836e92018-10-25 01:17:57 -0700335 alloc_id_shared = openolt_pb2.DeviceInfo.DeviceResourceRanges.Pool.SHARED_BY_ALL_INTF_ALL_TECH # TODO EdgeCore/BAL limitation
Craig Lutgen1dd47082018-10-23 13:12:26 -0500336 alloc_id_shared_pool_id = None
337 gemport_id_start = self.device_info.gemport_id_start
338 gemport_id_end = self.device_info.gemport_id_end
Girish Gowdruab836e92018-10-25 01:17:57 -0700339 gemport_id_shared = openolt_pb2.DeviceInfo.DeviceResourceRanges.Pool.SHARED_BY_ALL_INTF_ALL_TECH # TODO EdgeCore/BAL limitation
Craig Lutgen1dd47082018-10-23 13:12:26 -0500340 gemport_id_shared_pool_id = None
Girish Gowdruab836e92018-10-25 01:17:57 -0700341 flow_id_start = self.device_info.flow_id_start
342 flow_id_end = self.device_info.flow_id_end
343 flow_id_shared = openolt_pb2.DeviceInfo.DeviceResourceRanges.Pool.SHARED_BY_ALL_INTF_ALL_TECH # TODO EdgeCore/BAL limitation
344 flow_id_shared_pool_id = None
Craig Lutgen1dd47082018-10-23 13:12:26 -0500345
346 global_pool_id = 0
Girish Gowdruab836e92018-10-25 01:17:57 -0700347 for first_intf_pool_id in arange.intf_ids:
348 break
Craig Lutgen1dd47082018-10-23 13:12:26 -0500349
350 for pool in arange.pools:
351 shared_pool_id = global_pool_id if pool.sharing == openolt_pb2.DeviceInfo.DeviceResourceRanges.Pool.SHARED_BY_ALL_INTF_ALL_TECH else \
Girish Gowdruab836e92018-10-25 01:17:57 -0700352 first_intf_pool_id if pool.sharing == openolt_pb2.DeviceInfo.DeviceResourceRanges.Pool.SHARED_BY_ALL_INTF_SAME_TECH else \
353 None
Craig Lutgen1dd47082018-10-23 13:12:26 -0500354
355 if pool.type == openolt_pb2.DeviceInfo.DeviceResourceRanges.Pool.ONU_ID:
356 onu_id_start = pool.start
357 onu_id_end = pool.end
358 onu_id_shared = pool.sharing
359 onu_id_shared_pool_id = shared_pool_id
360 elif pool.type == openolt_pb2.DeviceInfo.DeviceResourceRanges.Pool.ALLOC_ID:
361 alloc_id_start = pool.start
362 alloc_id_end = pool.end
363 alloc_id_shared = pool.sharing
364 alloc_id_shared_pool_id = shared_pool_id
365 elif pool.type == openolt_pb2.DeviceInfo.DeviceResourceRanges.Pool.GEMPORT_ID:
366 gemport_id_start = pool.start
367 gemport_id_end = pool.end
368 gemport_id_shared = pool.sharing
369 gemport_id_shared_pool_id = shared_pool_id
Girish Gowdruab836e92018-10-25 01:17:57 -0700370 elif pool.type == openolt_pb2.DeviceInfo.DeviceResourceRanges.Pool.FLOW_ID:
371 flow_id_start = pool.start
372 flow_id_end = pool.end
373 flow_id_shared = pool.sharing
374 flow_id_shared_pool_id = shared_pool_id
Craig Lutgen1dd47082018-10-23 13:12:26 -0500375
376 self.log.info("device-info-init", technology=arange.technology,
Girish Gowdruab836e92018-10-25 01:17:57 -0700377 onu_id_start=onu_id_start, onu_id_end=onu_id_end, onu_id_shared_pool_id=onu_id_shared_pool_id,
378 alloc_id_start=alloc_id_start, alloc_id_end=alloc_id_end,
379 alloc_id_shared_pool_id=alloc_id_shared_pool_id,
380 gemport_id_start=gemport_id_start, gemport_id_end=gemport_id_end,
381 gemport_id_shared_pool_id=gemport_id_shared_pool_id,
382 flow_id_start_idx=flow_id_start,
383 flow_id_end_idx=flow_id_end,
384 flow_id_shared_pool_id=flow_id_shared_pool_id,
385 intf_ids=arange.intf_ids)
Craig Lutgen1dd47082018-10-23 13:12:26 -0500386
387 resource_mgr.init_default_pon_resource_ranges(
Girish Gowdruab836e92018-10-25 01:17:57 -0700388 onu_id_start_idx=onu_id_start,
389 onu_id_end_idx=onu_id_end,
390 onu_id_shared_pool_id=onu_id_shared_pool_id,
391 alloc_id_start_idx=alloc_id_start,
392 alloc_id_end_idx=alloc_id_end,
393 alloc_id_shared_pool_id=alloc_id_shared_pool_id,
394 gemport_id_start_idx=gemport_id_start,
395 gemport_id_end_idx=gemport_id_end,
396 gemport_id_shared_pool_id=gemport_id_shared_pool_id,
397 flow_id_start_idx=flow_id_start,
398 flow_id_end_idx=flow_id_end,
399 flow_id_shared_pool_id=flow_id_shared_pool_id,
Craig Lutgenabd9c842018-11-15 23:58:27 +0000400 uni_id_start_idx=0, uni_id_end_idx=self.max_uni_id_per_onu,
Girish Gowdruab836e92018-10-25 01:17:57 -0700401 num_of_pon_ports=self.device_info.pon_ports,
402 intf_ids=arange.intf_ids
403 )
Girish Gowdru1e77ea02018-09-24 09:10:35 -0700404
Craig Lutgen1dd47082018-10-23 13:12:26 -0500405 # For global sharing, make sure to refresh both local and global resource manager instances' range
406 if global_resource_mgr is not self:
407 if onu_id_shared == openolt_pb2.DeviceInfo.DeviceResourceRanges.Pool.SHARED_BY_ALL_INTF_ALL_TECH:
408 global_resource_mgr.update_ranges(onu_id_start_idx=onu_id_start, onu_id_end_idx=onu_id_end)
409 resource_mgr.update_ranges(onu_id_start_idx=onu_id_start, onu_id_end_idx=onu_id_end,
Girish Gowdruab836e92018-10-25 01:17:57 -0700410 onu_id_shared_resource_mgr=global_resource_mgr)
Girish Gowdru1e77ea02018-09-24 09:10:35 -0700411
Craig Lutgen1dd47082018-10-23 13:12:26 -0500412 if alloc_id_shared == openolt_pb2.DeviceInfo.DeviceResourceRanges.Pool.SHARED_BY_ALL_INTF_ALL_TECH:
413 global_resource_mgr.update_ranges(alloc_id_start_idx=alloc_id_start, alloc_id_end_idx=alloc_id_end)
414 resource_mgr.update_ranges(alloc_id_start_idx=alloc_id_start, alloc_id_end_idx=alloc_id_end,
Girish Gowdruab836e92018-10-25 01:17:57 -0700415 alloc_id_shared_resource_mgr=global_resource_mgr)
Craig Lutgen1dd47082018-10-23 13:12:26 -0500416
417 if gemport_id_shared == openolt_pb2.DeviceInfo.DeviceResourceRanges.Pool.SHARED_BY_ALL_INTF_ALL_TECH:
Girish Gowdruab836e92018-10-25 01:17:57 -0700418 global_resource_mgr.update_ranges(gemport_id_start_idx=gemport_id_start,
419 gemport_id_end_idx=gemport_id_end)
Craig Lutgen1dd47082018-10-23 13:12:26 -0500420 resource_mgr.update_ranges(gemport_id_start_idx=gemport_id_start, gemport_id_end_idx=gemport_id_end,
Girish Gowdruab836e92018-10-25 01:17:57 -0700421 gemport_id_shared_resource_mgr=global_resource_mgr)
422
423 if flow_id_shared == openolt_pb2.DeviceInfo.DeviceResourceRanges.Pool.SHARED_BY_ALL_INTF_ALL_TECH:
424 global_resource_mgr.update_ranges(flow_id_start_idx=flow_id_start,
425 flow_id_end_idx=flow_id_end)
426 resource_mgr.update_ranges(flow_id_start_idx=flow_id_start, flow_id_end_idx=flow_id_end,
427 flow_id_shared_resource_mgr=global_resource_mgr)
Craig Lutgenabd9c842018-11-15 23:58:27 +0000428
429 # Make sure loaded range fits the platform bit encoding ranges
430 resource_mgr.update_ranges(uni_id_start_idx=0, uni_id_end_idx=OpenOltPlatform.MAX_UNIS_PER_ONU-1)