blob: 2f6382bef1a97fe4606d5370e14135632a12d948 [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:
Matteo Scandolo2d9f40d2019-04-19 08:38:10 -070043 onu = model_accessor.ONUDevice.objects.get(serial_number=att_si.serial_number)
44 pon_port = onu.pon_port
Matteo Scandoloea529092018-09-11 16:36:39 -070045 except IndexError:
46 raise DeferredException("ONU device %s is not know to XOS yet" % att_si.serial_number)
47
Andy Baviere02c07f2019-05-15 12:56:34 -070048 if onu.admin_state == "ADMIN_DISABLED":
49 return [False, "ONU has been manually disabled"]
50
Matteo Scandoloea529092018-09-11 16:36:39 -070051 if pon_port.port_no != whitelisted.pon_port_id or att_si.of_dpid != whitelisted.device_id:
Matteo Scandolode8cfa82018-10-16 13:49:05 -070052 log.warn("ONU disable as location don't match",
53 object=str(att_si),
54 serial_number=att_si.serial_number,
55 pon_port=pon_port.port_no,
56 whitelisted_pon_port=whitelisted.pon_port_id,
57 device_id=att_si.of_dpid,
58 whitelisted_device_id=whitelisted.device_id,
Matteo Scandoloea529092018-09-11 16:36:39 -070059 **att_si.tologdict())
60 return [False, "ONU activated in wrong location"]
61
Matteo Scandolode8cfa82018-10-16 13:49:05 -070062 return [True, "ONU has been validated"]
63
64 @staticmethod
Matteo Scandolo59e10fc2019-04-18 14:19:52 -070065 def find_or_create_att_si(model_accessor, log, event):
Matteo Scandolode8cfa82018-10-16 13:49:05 -070066 try:
Matteo Scandolo59e10fc2019-04-18 14:19:52 -070067 att_si = model_accessor.AttWorkflowDriverServiceInstance.objects.get(
68 serial_number=event["serialNumber"]
69 )
70 log.debug("AttHelpers: Found existing AttWorkflowDriverServiceInstance", si=att_si)
Matteo Scandolode8cfa82018-10-16 13:49:05 -070071 except IndexError:
Matteo Scandolo59e10fc2019-04-18 14:19:52 -070072 # create an AttWorkflowDriverServiceInstance, the validation will be
73 # triggered in the corresponding sync step
74 att_si = model_accessor.AttWorkflowDriverServiceInstance(
75 serial_number=event["serialNumber"],
76 of_dpid=event["deviceId"],
77 uni_port_id=long(event["portNumber"]),
78 # we assume there is only one AttWorkflowDriverService
79 owner=model_accessor.AttWorkflowDriverService.objects.first()
80 )
81 log.debug("AttHelpers: Created new AttWorkflowDriverServiceInstance", si=att_si)
82 return att_si