blob: 49b353d0ea595abc29978fd747ed72436a4e0085 [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 Gowdruab836e92018-10-25 01:17:57 -070030 BASE_PATH_KV_STORE = "openolt/{}" # 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
Craig Lutgenabd9c842018-11-15 23:58:27 +0000140 def get_flow_id(self, pon_intf_id, onu_id, uni_id):
141 pon_intf_onu_id = (pon_intf_id, onu_id, uni_id)
142 flow_id = self.resource_mgrs[pon_intf_id].get_resource_id(
143 pon_intf_id, PONResourceManager.FLOW_ID)
Girish Gowdruab836e92018-10-25 01:17:57 -0700144 if flow_id is not None:
Craig Lutgenabd9c842018-11-15 23:58:27 +0000145 self.resource_mgrs[pon_intf_id].update_flow_id_for_onu(pon_intf_onu_id, flow_id)
Girish Gowdruab836e92018-10-25 01:17:57 -0700146
147 return flow_id
148
Craig Lutgenabd9c842018-11-15 23:58:27 +0000149 def get_flow_id_info(self, pon_intf_id, onu_id, uni_id, flow_id):
150 pon_intf_onu_id = (pon_intf_id, onu_id, uni_id)
Girish Gowdruab836e92018-10-25 01:17:57 -0700151 return self.resource_mgrs[pon_intf_id].get_flow_id_info(pon_intf_onu_id, flow_id)
152
Craig Lutgenabd9c842018-11-15 23:58:27 +0000153 def get_current_flow_ids_for_uni(self, pon_intf_id, onu_id, uni_id):
154 pon_intf_onu_id = (pon_intf_id, onu_id, uni_id)
Girish Gowdruab836e92018-10-25 01:17:57 -0700155 return self.resource_mgrs[pon_intf_id].get_current_flow_ids_for_onu(pon_intf_onu_id)
156
Craig Lutgenabd9c842018-11-15 23:58:27 +0000157 def update_flow_id_info_for_uni(self, pon_intf_id, onu_id, uni_id, flow_id, flow_data):
158 pon_intf_onu_id = (pon_intf_id, onu_id, uni_id)
Girish Gowdruab836e92018-10-25 01:17:57 -0700159 return self.resource_mgrs[pon_intf_id].update_flow_id_info_for_onu(
160 pon_intf_onu_id, flow_id, flow_data)
161
Craig Lutgenabd9c842018-11-15 23:58:27 +0000162 def get_hsia_flow_for_uni(self, pon_intf_id, onu_id, uni_id, gemport_id):
163 pon_intf_onu_id = (pon_intf_id, onu_id, uni_id)
Girish Gowdruab836e92018-10-25 01:17:57 -0700164 try:
165 flow_ids = self.resource_mgrs[pon_intf_id]. \
166 get_current_flow_ids_for_onu(pon_intf_onu_id)
167 if flow_ids is not None:
168 for flow_id in flow_ids:
Craig Lutgenabd9c842018-11-15 23:58:27 +0000169 flows = self.get_flow_id_info(pon_intf_id, onu_id, uni_id, flow_id)
Girish Gowdruab836e92018-10-25 01:17:57 -0700170 assert (isinstance(flows, list))
171 for flow in flows:
172 if flow['flow_category'] == HSIA_FLOW and \
173 flow['gemport_id'] == gemport_id:
174 return flow_id
175 except Exception as e:
176 self.log.error("error-retrieving-flow-info", e=e)
177
Craig Lutgenabd9c842018-11-15 23:58:27 +0000178 return self.get_flow_id(pon_intf_id, onu_id, uni_id)
Girish Gowdruab836e92018-10-25 01:17:57 -0700179
Girish Gowdru1e77ea02018-09-24 09:10:35 -0700180 def get_alloc_id(self, pon_intf_onu_id):
181 # Derive the pon_intf from the pon_intf_onu_id tuple
182 pon_intf = pon_intf_onu_id[0]
Craig Lutgen1dd47082018-10-23 13:12:26 -0500183 alloc_id_list = self.resource_mgrs[pon_intf].get_current_alloc_ids_for_onu(
Girish Gowdru1e77ea02018-09-24 09:10:35 -0700184 pon_intf_onu_id)
185
186 if alloc_id_list and len(alloc_id_list) > 0:
187 # Since we support only one alloc_id for the ONU at the moment,
188 # return the first alloc_id in the list, if available, for that
189 # ONU.
190 return alloc_id_list[0]
191
Girish Gowdruab836e92018-10-25 01:17:57 -0700192 alloc_id = self.resource_mgrs[pon_intf].get_resource_id(
Girish Gowdru1e77ea02018-09-24 09:10:35 -0700193 pon_intf_id=pon_intf,
194 resource_type=PONResourceManager.ALLOC_ID,
195 num_of_id=1
196 )
Girish Gowdruab836e92018-10-25 01:17:57 -0700197 if alloc_id is None:
Girish Gowdru1e77ea02018-09-24 09:10:35 -0700198 self.log.error("no-alloc-id-available")
199 return None
200
201 # update the resource map on KV store with the list of alloc_id
202 # allocated for the pon_intf_onu_id tuple
Craig Lutgen1dd47082018-10-23 13:12:26 -0500203 self.resource_mgrs[pon_intf].update_alloc_ids_for_onu(pon_intf_onu_id,
Girish Gowdruab836e92018-10-25 01:17:57 -0700204 list(alloc_id))
Girish Gowdru1e77ea02018-09-24 09:10:35 -0700205
206 return alloc_id
207
Girish Gowdruab836e92018-10-25 01:17:57 -0700208 def get_current_gemport_ids_for_onu(self, pon_intf_onu_id):
209 pon_intf_id = pon_intf_onu_id[0]
Craig Lutgenabd9c842018-11-15 23:58:27 +0000210 assert False, 'unused function'
Girish Gowdruab836e92018-10-25 01:17:57 -0700211 return self.resource_mgrs[pon_intf_id].get_current_gemport_ids_for_onu(pon_intf_onu_id)
212
Craig Lutgenabd9c842018-11-15 23:58:27 +0000213 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 -0700214 for gemport in gemport_list:
215 pon_intf_gemport = (pon_port, gemport)
216 # This information is used when packet_indication is received and
217 # we need to derive the ONU Id for which the packet arrived based
218 # on the pon_intf and gemport available in the packet_indication
Craig Lutgenabd9c842018-11-15 23:58:27 +0000219 self.kv_store[str(pon_intf_gemport)] = ' '.join(map(str, (onu_id, uni_id)))
220
221 def get_onu_uni_from_ponport_gemport(self, pon_port, gemport):
222 pon_intf_gemport = (pon_port, gemport)
223 return tuple(map(int, self.kv_store[str(pon_intf_gemport)].split(' ')))
Girish Gowdruab836e92018-10-25 01:17:57 -0700224
225 def get_gemport_id(self, pon_intf_onu_id, num_of_id=1):
Girish Gowdru1e77ea02018-09-24 09:10:35 -0700226 # Derive the pon_intf and onu_id from the pon_intf_onu_id tuple
227 pon_intf = pon_intf_onu_id[0]
228 onu_id = pon_intf_onu_id[1]
Craig Lutgenabd9c842018-11-15 23:58:27 +0000229 uni_id = pon_intf_onu_id[2]
230 assert False, 'unused function'
Girish Gowdru1e77ea02018-09-24 09:10:35 -0700231
Craig Lutgen1dd47082018-10-23 13:12:26 -0500232 gemport_id_list = self.resource_mgrs[pon_intf].get_current_gemport_ids_for_onu(
Girish Gowdru1e77ea02018-09-24 09:10:35 -0700233 pon_intf_onu_id)
234 if gemport_id_list and len(gemport_id_list) > 0:
Girish Gowdruab836e92018-10-25 01:17:57 -0700235 return gemport_id_list
Girish Gowdru1e77ea02018-09-24 09:10:35 -0700236
Craig Lutgen1dd47082018-10-23 13:12:26 -0500237 gemport_id_list = self.resource_mgrs[pon_intf].get_resource_id(
Girish Gowdru1e77ea02018-09-24 09:10:35 -0700238 pon_intf_id=pon_intf,
239 resource_type=PONResourceManager.GEMPORT_ID,
Girish Gowdruab836e92018-10-25 01:17:57 -0700240 num_of_id=num_of_id
Girish Gowdru1e77ea02018-09-24 09:10:35 -0700241 )
242
243 if gemport_id_list and len(gemport_id_list) == 0:
244 self.log.error("no-gemport-id-available")
245 return None
246
247 # update the resource map on KV store with the list of gemport_id
248 # allocated for the pon_intf_onu_id tuple
Craig Lutgen1dd47082018-10-23 13:12:26 -0500249 self.resource_mgrs[pon_intf].update_gemport_ids_for_onu(pon_intf_onu_id,
Girish Gowdruab836e92018-10-25 01:17:57 -0700250 gemport_id_list)
Girish Gowdru1e77ea02018-09-24 09:10:35 -0700251
Girish Gowdruab836e92018-10-25 01:17:57 -0700252 self.update_gemports_ponport_to_onu_map_on_kv_store(gemport_id_list,
Craig Lutgenabd9c842018-11-15 23:58:27 +0000253 pon_intf, onu_id, uni_id)
Girish Gowdruab836e92018-10-25 01:17:57 -0700254 return gemport_id_list
Girish Gowdru1e77ea02018-09-24 09:10:35 -0700255
256 def free_onu_id(self, pon_intf_id, onu_id):
Girish Gowdruab836e92018-10-25 01:17:57 -0700257 _ = self.resource_mgrs[pon_intf_id].free_resource_id(
Girish Gowdru1e77ea02018-09-24 09:10:35 -0700258 pon_intf_id, PONResourceManager.ONU_ID, onu_id)
259
260 pon_intf_onu_id = (pon_intf_id, onu_id)
Craig Lutgen1dd47082018-10-23 13:12:26 -0500261 self.resource_mgrs[pon_intf_id].remove_resource_map(
Girish Gowdru1e77ea02018-09-24 09:10:35 -0700262 pon_intf_onu_id)
263
Craig Lutgenabd9c842018-11-15 23:58:27 +0000264 def free_flow_id_for_uni(self, pon_intf_id, onu_id, uni_id, flow_id):
Girish Gowdruab836e92018-10-25 01:17:57 -0700265 self.resource_mgrs[pon_intf_id].free_resource_id(
266 pon_intf_id, PONResourceManager.FLOW_ID, flow_id)
Craig Lutgenabd9c842018-11-15 23:58:27 +0000267 pon_intf_onu_id = (pon_intf_id, onu_id, uni_id)
Girish Gowdruab836e92018-10-25 01:17:57 -0700268 self.resource_mgrs[pon_intf_id].update_flow_id_for_onu(pon_intf_onu_id,
269 flow_id, False)
270 self.resource_mgrs[pon_intf_id].remove_flow_id_info(pon_intf_onu_id,
271 flow_id)
272
Girish Gowdru1e77ea02018-09-24 09:10:35 -0700273 def free_pon_resources_for_onu(self, pon_intf_id_onu_id):
274
Girish Gowdru1e77ea02018-09-24 09:10:35 -0700275 pon_intf_id = pon_intf_id_onu_id[0]
276 onu_id = pon_intf_id_onu_id[1]
Craig Lutgen1dd47082018-10-23 13:12:26 -0500277 alloc_ids = \
278 self.resource_mgrs[pon_intf_id].get_current_alloc_ids_for_onu(pon_intf_id_onu_id)
279 self.resource_mgrs[pon_intf_id].free_resource_id(pon_intf_id,
Girish Gowdruab836e92018-10-25 01:17:57 -0700280 PONResourceManager.ALLOC_ID,
281 alloc_ids)
Girish Gowdru1e77ea02018-09-24 09:10:35 -0700282
283 gemport_ids = \
Craig Lutgen1dd47082018-10-23 13:12:26 -0500284 self.resource_mgrs[pon_intf_id].get_current_gemport_ids_for_onu(pon_intf_id_onu_id)
285 self.resource_mgrs[pon_intf_id].free_resource_id(pon_intf_id,
Girish Gowdruab836e92018-10-25 01:17:57 -0700286 PONResourceManager.GEMPORT_ID,
287 gemport_ids)
Girish Gowdru1e77ea02018-09-24 09:10:35 -0700288
Craig Lutgen1dd47082018-10-23 13:12:26 -0500289 self.resource_mgrs[pon_intf_id].free_resource_id(pon_intf_id,
Girish Gowdruab836e92018-10-25 01:17:57 -0700290 PONResourceManager.ONU_ID,
291 onu_id)
Girish Gowdru1e77ea02018-09-24 09:10:35 -0700292
293 # Clear resource map associated with (pon_intf_id, gemport_id) tuple.
Craig Lutgen1dd47082018-10-23 13:12:26 -0500294 self.resource_mgrs[pon_intf_id].remove_resource_map(pon_intf_id_onu_id)
Girish Gowdru1e77ea02018-09-24 09:10:35 -0700295
296 # Clear the ONU Id associated with the (pon_intf_id, gemport_id) tuple.
297 for gemport_id in gemport_ids:
298 del self.kv_store[str((pon_intf_id, gemport_id))]
299
Craig Lutgen1dd47082018-10-23 13:12:26 -0500300 def initialize_device_resource_range_and_pool(self, resource_mgr, global_resource_mgr, arange):
301 self.log.info("resource-range-pool-init", technology=resource_mgr.technology)
Girish Gowdru1e77ea02018-09-24 09:10:35 -0700302
Craig Lutgen1dd47082018-10-23 13:12:26 -0500303 # first load from KV profiles
304 status = resource_mgr.init_resource_ranges_from_kv_store()
305 if not status:
306 self.log.info("failed-to-load-resource-range-from-kv-store", technology=resource_mgr.technology)
307
308 # Then apply device specific information. If KV doesn't exist
309 # or is broader than the device, the device's informationw ill
310 # dictate the range limits
311 self.log.info("using-device-info-to-init-pon-resource-ranges", technology=resource_mgr.technology)
312
313 onu_id_start = self.device_info.onu_id_start
314 onu_id_end = self.device_info.onu_id_end
315 onu_id_shared = openolt_pb2.DeviceInfo.DeviceResourceRanges.Pool.DEDICATED_PER_INTF
316 onu_id_shared_pool_id = None
317 alloc_id_start = self.device_info.alloc_id_start
318 alloc_id_end = self.device_info.alloc_id_end
Girish Gowdruab836e92018-10-25 01:17:57 -0700319 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 -0500320 alloc_id_shared_pool_id = None
321 gemport_id_start = self.device_info.gemport_id_start
322 gemport_id_end = self.device_info.gemport_id_end
Girish Gowdruab836e92018-10-25 01:17:57 -0700323 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 -0500324 gemport_id_shared_pool_id = None
Girish Gowdruab836e92018-10-25 01:17:57 -0700325 flow_id_start = self.device_info.flow_id_start
326 flow_id_end = self.device_info.flow_id_end
327 flow_id_shared = openolt_pb2.DeviceInfo.DeviceResourceRanges.Pool.SHARED_BY_ALL_INTF_ALL_TECH # TODO EdgeCore/BAL limitation
328 flow_id_shared_pool_id = None
Craig Lutgen1dd47082018-10-23 13:12:26 -0500329
330 global_pool_id = 0
Girish Gowdruab836e92018-10-25 01:17:57 -0700331 for first_intf_pool_id in arange.intf_ids:
332 break
Craig Lutgen1dd47082018-10-23 13:12:26 -0500333
334 for pool in arange.pools:
335 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 -0700336 first_intf_pool_id if pool.sharing == openolt_pb2.DeviceInfo.DeviceResourceRanges.Pool.SHARED_BY_ALL_INTF_SAME_TECH else \
337 None
Craig Lutgen1dd47082018-10-23 13:12:26 -0500338
339 if pool.type == openolt_pb2.DeviceInfo.DeviceResourceRanges.Pool.ONU_ID:
340 onu_id_start = pool.start
341 onu_id_end = pool.end
342 onu_id_shared = pool.sharing
343 onu_id_shared_pool_id = shared_pool_id
344 elif pool.type == openolt_pb2.DeviceInfo.DeviceResourceRanges.Pool.ALLOC_ID:
345 alloc_id_start = pool.start
346 alloc_id_end = pool.end
347 alloc_id_shared = pool.sharing
348 alloc_id_shared_pool_id = shared_pool_id
349 elif pool.type == openolt_pb2.DeviceInfo.DeviceResourceRanges.Pool.GEMPORT_ID:
350 gemport_id_start = pool.start
351 gemport_id_end = pool.end
352 gemport_id_shared = pool.sharing
353 gemport_id_shared_pool_id = shared_pool_id
Girish Gowdruab836e92018-10-25 01:17:57 -0700354 elif pool.type == openolt_pb2.DeviceInfo.DeviceResourceRanges.Pool.FLOW_ID:
355 flow_id_start = pool.start
356 flow_id_end = pool.end
357 flow_id_shared = pool.sharing
358 flow_id_shared_pool_id = shared_pool_id
Craig Lutgen1dd47082018-10-23 13:12:26 -0500359
360 self.log.info("device-info-init", technology=arange.technology,
Girish Gowdruab836e92018-10-25 01:17:57 -0700361 onu_id_start=onu_id_start, onu_id_end=onu_id_end, onu_id_shared_pool_id=onu_id_shared_pool_id,
362 alloc_id_start=alloc_id_start, alloc_id_end=alloc_id_end,
363 alloc_id_shared_pool_id=alloc_id_shared_pool_id,
364 gemport_id_start=gemport_id_start, gemport_id_end=gemport_id_end,
365 gemport_id_shared_pool_id=gemport_id_shared_pool_id,
366 flow_id_start_idx=flow_id_start,
367 flow_id_end_idx=flow_id_end,
368 flow_id_shared_pool_id=flow_id_shared_pool_id,
369 intf_ids=arange.intf_ids)
Craig Lutgen1dd47082018-10-23 13:12:26 -0500370
371 resource_mgr.init_default_pon_resource_ranges(
Girish Gowdruab836e92018-10-25 01:17:57 -0700372 onu_id_start_idx=onu_id_start,
373 onu_id_end_idx=onu_id_end,
374 onu_id_shared_pool_id=onu_id_shared_pool_id,
375 alloc_id_start_idx=alloc_id_start,
376 alloc_id_end_idx=alloc_id_end,
377 alloc_id_shared_pool_id=alloc_id_shared_pool_id,
378 gemport_id_start_idx=gemport_id_start,
379 gemport_id_end_idx=gemport_id_end,
380 gemport_id_shared_pool_id=gemport_id_shared_pool_id,
381 flow_id_start_idx=flow_id_start,
382 flow_id_end_idx=flow_id_end,
383 flow_id_shared_pool_id=flow_id_shared_pool_id,
Craig Lutgenabd9c842018-11-15 23:58:27 +0000384 uni_id_start_idx=0, uni_id_end_idx=self.max_uni_id_per_onu,
Girish Gowdruab836e92018-10-25 01:17:57 -0700385 num_of_pon_ports=self.device_info.pon_ports,
386 intf_ids=arange.intf_ids
387 )
Girish Gowdru1e77ea02018-09-24 09:10:35 -0700388
Craig Lutgen1dd47082018-10-23 13:12:26 -0500389 # For global sharing, make sure to refresh both local and global resource manager instances' range
390 if global_resource_mgr is not self:
391 if onu_id_shared == openolt_pb2.DeviceInfo.DeviceResourceRanges.Pool.SHARED_BY_ALL_INTF_ALL_TECH:
392 global_resource_mgr.update_ranges(onu_id_start_idx=onu_id_start, onu_id_end_idx=onu_id_end)
393 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 -0700394 onu_id_shared_resource_mgr=global_resource_mgr)
Girish Gowdru1e77ea02018-09-24 09:10:35 -0700395
Craig Lutgen1dd47082018-10-23 13:12:26 -0500396 if alloc_id_shared == openolt_pb2.DeviceInfo.DeviceResourceRanges.Pool.SHARED_BY_ALL_INTF_ALL_TECH:
397 global_resource_mgr.update_ranges(alloc_id_start_idx=alloc_id_start, alloc_id_end_idx=alloc_id_end)
398 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 -0700399 alloc_id_shared_resource_mgr=global_resource_mgr)
Craig Lutgen1dd47082018-10-23 13:12:26 -0500400
401 if gemport_id_shared == openolt_pb2.DeviceInfo.DeviceResourceRanges.Pool.SHARED_BY_ALL_INTF_ALL_TECH:
Girish Gowdruab836e92018-10-25 01:17:57 -0700402 global_resource_mgr.update_ranges(gemport_id_start_idx=gemport_id_start,
403 gemport_id_end_idx=gemport_id_end)
Craig Lutgen1dd47082018-10-23 13:12:26 -0500404 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 -0700405 gemport_id_shared_resource_mgr=global_resource_mgr)
406
407 if flow_id_shared == openolt_pb2.DeviceInfo.DeviceResourceRanges.Pool.SHARED_BY_ALL_INTF_ALL_TECH:
408 global_resource_mgr.update_ranges(flow_id_start_idx=flow_id_start,
409 flow_id_end_idx=flow_id_end)
410 resource_mgr.update_ranges(flow_id_start_idx=flow_id_start, flow_id_end_idx=flow_id_end,
411 flow_id_shared_resource_mgr=global_resource_mgr)
Craig Lutgenabd9c842018-11-15 23:58:27 +0000412
413 # Make sure loaded range fits the platform bit encoding ranges
414 resource_mgr.update_ranges(uni_id_start_idx=0, uni_id_end_idx=OpenOltPlatform.MAX_UNIS_PER_ONU-1)