blob: afc471b6d4c3cf530a26ccef755ccf66608673b2 [file] [log] [blame]
Matteo Scandoloea529092018-09-11 16:36:39 -07001# Copyright 2017-present Open Networking Foundation
2#
3# Licensed under the Apache License, Version 2.0 (the "License");
4# you may not use this file except in compliance with the License.
5# You may obtain a copy of the License at
6#
7# http://www.apache.org/licenses/LICENSE-2.0
8#
9# Unless required by applicable law or agreed to in writing, software
10# distributed under the License is distributed on an "AS IS" BASIS,
11# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12# See the License for the specific language governing permissions and
13# limitations under the License.
14
Scott Baker71d20472019-02-01 12:05:35 -080015from xossynchronizer.steps.syncstep import DeferredException
Matteo Scandoloea529092018-09-11 16:36:39 -070016
Matteo Scandoloea529092018-09-11 16:36:39 -070017class AttHelpers():
Matteo Scandoloea529092018-09-11 16:36:39 -070018 @staticmethod
Scott Baker71d20472019-02-01 12:05:35 -080019 def validate_onu(model_accessor, log, att_si):
Matteo Scandoloea529092018-09-11 16:36:39 -070020 """
21 This method validate an ONU against the whitelist and set the appropriate state.
22 It's expected that the deferred exception is managed in the caller method,
23 for example a model_policy or a sync_step.
24
25 :param att_si: AttWorkflowDriverServiceInstance
26 :return: [boolean, string]
27 """
28
29 oss_service = att_si.owner.leaf_model
30
31 # See if there is a matching entry in the whitelist.
Scott Baker71d20472019-02-01 12:05:35 -080032 matching_entries = model_accessor.AttWorkflowDriverWhiteListEntry.objects.filter(
Matteo Scandoloea529092018-09-11 16:36:39 -070033 owner_id=oss_service.id,
34 )
35 matching_entries = [e for e in matching_entries if e.serial_number.lower() == att_si.serial_number.lower()]
36
37 if len(matching_entries) == 0:
38 log.warn("ONU not found in whitelist", object=str(att_si), serial_number=att_si.serial_number, **att_si.tologdict())
39 return [False, "ONU not found in whitelist"]
40
41 whitelisted = matching_entries[0]
42 try:
Scott Baker71d20472019-02-01 12:05:35 -080043 pon_port = model_accessor.ONUDevice.objects.get(serial_number=att_si.serial_number).pon_port
Matteo Scandoloea529092018-09-11 16:36:39 -070044 except IndexError:
45 raise DeferredException("ONU device %s is not know to XOS yet" % att_si.serial_number)
46
47 if pon_port.port_no != whitelisted.pon_port_id or att_si.of_dpid != whitelisted.device_id:
Matteo Scandolode8cfa82018-10-16 13:49:05 -070048 log.warn("ONU disable as location don't match",
49 object=str(att_si),
50 serial_number=att_si.serial_number,
51 pon_port=pon_port.port_no,
52 whitelisted_pon_port=whitelisted.pon_port_id,
53 device_id=att_si.of_dpid,
54 whitelisted_device_id=whitelisted.device_id,
Matteo Scandoloea529092018-09-11 16:36:39 -070055 **att_si.tologdict())
56 return [False, "ONU activated in wrong location"]
57
Matteo Scandolode8cfa82018-10-16 13:49:05 -070058 return [True, "ONU has been validated"]
59
60 @staticmethod
Matteo Scandolo59e10fc2019-04-18 14:19:52 -070061 def find_or_create_att_si(model_accessor, log, event):
Matteo Scandolode8cfa82018-10-16 13:49:05 -070062 try:
Matteo Scandolo59e10fc2019-04-18 14:19:52 -070063 att_si = model_accessor.AttWorkflowDriverServiceInstance.objects.get(
64 serial_number=event["serialNumber"]
65 )
66 log.debug("AttHelpers: Found existing AttWorkflowDriverServiceInstance", si=att_si)
Matteo Scandolode8cfa82018-10-16 13:49:05 -070067 except IndexError:
Matteo Scandolo59e10fc2019-04-18 14:19:52 -070068 # create an AttWorkflowDriverServiceInstance, the validation will be
69 # triggered in the corresponding sync step
70 att_si = model_accessor.AttWorkflowDriverServiceInstance(
71 serial_number=event["serialNumber"],
72 of_dpid=event["deviceId"],
73 uni_port_id=long(event["portNumber"]),
74 # we assume there is only one AttWorkflowDriverService
75 owner=model_accessor.AttWorkflowDriverService.objects.first()
76 )
77 log.debug("AttHelpers: Created new AttWorkflowDriverServiceInstance", si=att_si)
78 return att_si