blob: eb090e10eca1532c868db09b70c0ae9b22c96b36 [file] [log] [blame]
Matt Jeanneretf1e9c5d2019-02-08 07:41:29 -05001#
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#
Matt Jeanneret2e3cb8d2019-11-16 09:22:41 -050016
17from __future__ import absolute_import
Matt Jeanneret08a8e862019-12-20 14:02:32 -050018import structlog
Matt Jeanneret72f96fc2019-02-11 10:53:05 -050019from pyvoltha.adapters.extensions.omci.tasks.task import Task
Matt Jeanneretf1e9c5d2019-02-08 07:41:29 -050020from twisted.internet import reactor
21from twisted.internet.defer import inlineCallbacks, failure, returnValue
Matt Jeanneret72f96fc2019-02-11 10:53:05 -050022from pyvoltha.adapters.extensions.omci.omci_defs import ReasonCodes, EntityOperations
23from pyvoltha.adapters.extensions.omci.omci_me import OntGFrame
24from pyvoltha.adapters.extensions.omci.omci_me import PptpEthernetUniFrame, VeipUniFrame
Matt Jeanneretf1e9c5d2019-02-08 07:41:29 -050025
26RC = ReasonCodes
27OP = EntityOperations
28
29
30class BrcmUniLockException(Exception):
31 pass
32
33
34class BrcmUniLockTask(Task):
35 """
36 Lock or unlock all discovered UNI/PPTP on the ONU
37 """
38 task_priority = 200
39 name = "Broadcom UNI Lock Task"
40
41 def __init__(self, omci_agent, device_id, lock=True, priority=task_priority):
42 """
43 Class initialization
44
45 :param omci_agent: (OmciAdapterAgent) OMCI Adapter agent
46 :param device_id: (str) ONU Device ID
47 :param lock: (bool) If true administratively lock all the UNI. If false unlock
48 :param priority: (int) OpenOMCI Task priority (0..255) 255 is the highest
49 """
50 super(BrcmUniLockTask, self).__init__(BrcmUniLockTask.name,
Girish Gowdrae933cd32019-11-21 21:04:41 +053051 omci_agent,
52 device_id,
53 priority=priority,
54 exclusive=True)
Matt Jeanneret08a8e862019-12-20 14:02:32 -050055
56 self.log = structlog.get_logger(device_id=device_id,
57 name=BrcmUniLockTask.name,
58 task_id=self._task_id,
59 setting_lock=lock)
60
Matt Jeanneretf1e9c5d2019-02-08 07:41:29 -050061 self._device = omci_agent.get_device(device_id)
62 self._lock = lock
63 self._results = None
64 self._local_deferred = None
65 self._config = self._device.configuration
66
67 def cancel_deferred(self):
68 super(BrcmUniLockTask, self).cancel_deferred()
69
70 d, self._local_deferred = self._local_deferred, None
71 try:
72 if d is not None and not d.called:
73 d.cancel()
74 except:
75 pass
76
77 def start(self):
78 """
79 Start UNI/PPTP Lock/Unlock Task
80 """
81 super(BrcmUniLockTask, self).start()
82 self._local_deferred = reactor.callLater(0, self.perform_lock)
83
Matt Jeanneret04ebe8f2020-01-26 01:05:23 -050084 @inlineCallbacks
Matt Jeanneretf1e9c5d2019-02-08 07:41:29 -050085 def perform_lock(self):
86 """
87 Perform the lock/unlock
88 """
89 self.log.info('setting-uni-lock-state', lock=self._lock)
90
91 try:
92 state = 1 if self._lock else 0
93
94 # lock the whole ont and all the pptp. some onu dont causing odd behavior.
Matt Jeanneret142a6012019-10-26 12:22:04 -040095 pptp_list = sorted(self._config.pptp_entities) if self._config.pptp_entities else []
96 veip_list = sorted(self._config.veip_entities) if self._config.veip_entities else []
97
Matt Jeanneretf4113222019-08-14 19:44:34 -040098 if self._lock is True:
99 # lock unis first, ontg must be last
100 for entity_id in pptp_list:
101 msg = PptpEthernetUniFrame(entity_id,
102 attributes=dict(administrative_state=state))
Matt Jeanneret04ebe8f2020-01-26 01:05:23 -0500103 yield self._send_omci_msg(msg)
Matt Jeanneret142a6012019-10-26 12:22:04 -0400104
Matt Jeanneretf4113222019-08-14 19:44:34 -0400105 for entity_id in veip_list:
106 msg = VeipUniFrame(entity_id,
107 attributes=dict(administrative_state=state))
Matt Jeanneret04ebe8f2020-01-26 01:05:23 -0500108 yield self._send_omci_msg(msg)
Matt Jeanneret142a6012019-10-26 12:22:04 -0400109
Matt Jeanneretf4113222019-08-14 19:44:34 -0400110 msg = OntGFrame(attributes={'administrative_state': state})
Matt Jeanneret04ebe8f2020-01-26 01:05:23 -0500111 yield self._send_omci_msg(msg)
Matt Jeanneretf1e9c5d2019-02-08 07:41:29 -0500112 else:
Matt Jeanneretf4113222019-08-14 19:44:34 -0400113 # ontg must be unlocked first, then unis
114 msg = OntGFrame(attributes={'administrative_state': state})
Matt Jeanneret04ebe8f2020-01-26 01:05:23 -0500115 yield self._send_omci_msg(msg)
Matt Jeanneretf1e9c5d2019-02-08 07:41:29 -0500116
Matt Jeanneretf4113222019-08-14 19:44:34 -0400117 for entity_id in pptp_list:
118 msg = PptpEthernetUniFrame(entity_id,
119 attributes=dict(administrative_state=state))
Matt Jeanneret04ebe8f2020-01-26 01:05:23 -0500120 yield self._send_omci_msg(msg)
Matt Jeanneretf4113222019-08-14 19:44:34 -0400121
122 for entity_id in veip_list:
123 msg = VeipUniFrame(entity_id,
124 attributes=dict(administrative_state=state))
Matt Jeanneret04ebe8f2020-01-26 01:05:23 -0500125 yield self._send_omci_msg(msg)
Matt Jeanneretf4113222019-08-14 19:44:34 -0400126
127 self.deferred.callback('setting-uni-lock-state-finished')
Matt Jeanneretf1e9c5d2019-02-08 07:41:29 -0500128
129 except Exception as e:
130 self.log.exception('setting-uni-lock-state', e=e)
131 self.deferred.errback(failure.Failure(e))
132
Matt Jeanneretf1e9c5d2019-02-08 07:41:29 -0500133 @inlineCallbacks
Matt Jeanneretf4113222019-08-14 19:44:34 -0400134 def _send_omci_msg(self, me_message):
Matt Jeanneretf1e9c5d2019-02-08 07:41:29 -0500135 frame = me_message.set()
136 self.log.debug('openomci-msg', omci_msg=me_message)
137 results = yield self._device.omci_cc.send(frame)
138 self.strobe_watchdog()
139
140 status = results.fields['omci_message'].fields['success_code']
Matt Jeanneretf4113222019-08-14 19:44:34 -0400141 self.log.debug('response-status', status=status)
Matt Jeanneretf1e9c5d2019-02-08 07:41:29 -0500142
143 # Success?
Matt Jeanneretf4113222019-08-14 19:44:34 -0400144 if status not in (RC.Success.value, RC.InstanceExists):
145 raise BrcmUniLockException('openomci-set-failed')