blob: 9a2d0351f19db74a0405772a608f3011e49e5996 [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
Scott Baker71d20472019-02-01 12:05:35 -080061 def get_onu_sn(model_accessor, log, event):
62 olt_service = model_accessor.VOLTService.objects.first()
Matteo Scandolode8cfa82018-10-16 13:49:05 -070063 onu_sn = olt_service.get_onu_sn_from_openflow(event["deviceId"], event["portNumber"])
64 if not onu_sn or onu_sn is None:
65 log.exception("Cannot find onu serial number for this event", kafka_event=event)
66 raise Exception("Cannot find onu serial number for this event")
67
68 return onu_sn
69
70 @staticmethod
Scott Baker71d20472019-02-01 12:05:35 -080071 def get_si_by_sn(model_accessor, log, serial_number):
Matteo Scandolode8cfa82018-10-16 13:49:05 -070072 try:
Scott Baker71d20472019-02-01 12:05:35 -080073 return model_accessor.AttWorkflowDriverServiceInstance.objects.get(serial_number=serial_number)
Matteo Scandolode8cfa82018-10-16 13:49:05 -070074 except IndexError:
75 log.exception("Cannot find att-workflow-driver service instance for this serial number", serial_number=serial_number)
76 raise Exception("Cannot find att-workflow-driver service instance for this serial number %s", serial_number)