blob: 300920669c37466bfe5c993b54feec89b8a20cf7 [file] [log] [blame]
khenaidoob9203542018-09-17 22:56:37 -04001#
2# Copyright 2017 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
17"""
18Agent to play gateway between CORE and an individual adapter.
19"""
20from uuid import uuid4
21
22import arrow
23import structlog
24from google.protobuf.json_format import MessageToJson
25from scapy.packet import Packet
26from twisted.internet.defer import inlineCallbacks, returnValue
27from zope.interface import implementer
28
29from adapters.common.event_bus import EventBusClient
30from adapters.common.frameio.frameio import hexify
31from adapters.common.utils.id_generation import create_cluster_logical_device_ids
32from adapters.interface import IAdapterInterface
33from adapters.protos.device_pb2 import Device
34
35from adapters.protos import third_party
36from adapters.protos.device_pb2 import Device, Port, PmConfigs
37from adapters.protos.events_pb2 import AlarmEvent, AlarmEventType, \
38 AlarmEventSeverity, AlarmEventState, AlarmEventCategory
39from adapters.protos.events_pb2 import KpiEvent
40from adapters.protos.voltha_pb2 import DeviceGroup, LogicalDevice, \
41 LogicalPort, AdminState, OperStatus, AlarmFilterRuleKey
42from adapters.common.utils.registry import registry
43from adapters.common.utils.id_generation import create_cluster_device_id
44from adapters.protos.core_adapter_pb2 import IntType
khenaidoo19d7b632018-10-30 10:49:50 -040045from adapters.protos.openflow_13_pb2 import FlowChanges, FlowGroups, Flows, FlowGroupChanges
khenaidoob9203542018-09-17 22:56:37 -040046import re
47
48
49class MacAddressError(BaseException):
50 def __init__(self, error):
51 self.error = error
52
53
54class IDError(BaseException):
55 def __init__(self, error):
56 self.error = error
57
58
59@implementer(IAdapterInterface)
60class AdapterRequestFacade(object):
61 """
62 Gate-keeper between CORE and device adapters.
63
64 On one side it interacts with Core's internal model and update/dispatch
65 mechanisms.
66
67 On the other side, it interacts with the adapters standard interface as
68 defined in
69 """
70
71 def __init__(self, adapter):
72 self.adapter = adapter
73
74 @inlineCallbacks
75 def start(self):
76 self.log.debug('starting')
77
78 @inlineCallbacks
79 def stop(self):
80 self.log.debug('stopping')
81
82 def adopt_device(self, device):
83 d = Device()
84 if device:
85 device.Unpack(d)
khenaidoo92e62c52018-10-03 14:02:54 -040086 return True, self.adapter.adopt_device(d)
khenaidoob9203542018-09-17 22:56:37 -040087 else:
khenaidoo92e62c52018-10-03 14:02:54 -040088 return False, d
khenaidoob9203542018-09-17 22:56:37 -040089
90 def get_ofp_device_info(self, device):
91 d = Device()
92 if device:
93 device.Unpack(d)
khenaidoo92e62c52018-10-03 14:02:54 -040094 return True, self.adapter.get_ofp_device_info(d)
khenaidoob9203542018-09-17 22:56:37 -040095 else:
khenaidoo92e62c52018-10-03 14:02:54 -040096 return False, d
khenaidoob9203542018-09-17 22:56:37 -040097
98 def get_ofp_port_info(self, device, port_no):
99 d = Device()
100 if device:
101 device.Unpack(d)
102 else:
103 return (False, d)
104
105 p = IntType()
106 port_no.Unpack(p)
107
khenaidoo92e62c52018-10-03 14:02:54 -0400108 return True, self.adapter.get_ofp_port_info(d, p.val)
khenaidoob9203542018-09-17 22:56:37 -0400109
110
111 def reconcile_device(self, device):
112 return self.adapter.reconcile_device(device)
113
114 def abandon_device(self, device):
115 return self.adapter.abandon_device(device)
116
117 def disable_device(self, device):
khenaidoo92e62c52018-10-03 14:02:54 -0400118 d = Device()
119 if device:
120 device.Unpack(d)
121 return True, self.adapter.disable_device(d)
122 else:
123 return False, d
khenaidoob9203542018-09-17 22:56:37 -0400124
125 def reenable_device(self, device):
khenaidoo92e62c52018-10-03 14:02:54 -0400126 d = Device()
127 if device:
128 device.Unpack(d)
129 return True, self.adapter.reenable_device(d)
130 else:
131 return False, d
khenaidoob9203542018-09-17 22:56:37 -0400132
133 def reboot_device(self, device):
134 d = Device()
135 if device:
136 device.Unpack(d)
137 return (True, self.adapter.reboot_device(d))
138 else:
139 return (False, d)
140
141 def download_image(self, device, request):
142 return self.adapter.download_image(device, request)
143
144 def get_image_download_status(self, device, request):
145 return self.adapter.get_image_download_status(device, request)
146
147 def cancel_image_download(self, device, request):
148 return self.adapter.cancel_image_download(device, request)
149
150 def activate_image_update(self, device, request):
151 return self.adapter.activate_image_update(device, request)
152
153 def revert_image_update(self, device, request):
154 return self.adapter.revert_image_update(device, request)
155
156 def self_test(self, device):
157 return self.adapter.self_test_device(device)
158
159 def delete_device(self, device):
khenaidoo4d4802d2018-10-04 21:59:49 -0400160 d = Device()
161 if device:
162 device.Unpack(d)
163 return (True, self.adapter.delete_device(d))
164 else:
165 return (False, d)
khenaidoob9203542018-09-17 22:56:37 -0400166
167 def get_device_details(self, device):
168 return self.adapter.get_device_details(device)
169
170 def update_flows_bulk(self, device, flows, groups):
khenaidoo19d7b632018-10-30 10:49:50 -0400171 d = Device()
172 if device:
173 device.Unpack(d)
174 else:
175 return (False, d)
176
177 f = Flows()
178 if flows:
179 flows.Unpack(f)
180
181 g = FlowGroups()
182 if groups:
183 groups.Unpack(g)
184
185 return (True, self.adapter.update_flows_bulk(d, f, g))
khenaidoob9203542018-09-17 22:56:37 -0400186
187 def update_flows_incrementally(self, device, flow_changes, group_changes):
khenaidoo19d7b632018-10-30 10:49:50 -0400188 d = Device()
189 if device:
190 device.Unpack(d)
191 else:
192 return (False, d)
193
194 f = FlowChanges()
195 if flow_changes:
196 flow_changes.Unpack(f)
197
198 g = FlowGroupChanges()
199 if group_changes:
200 group_changes.Unpack(g)
201
202 return (True, self.adapter.update_flows_incrementally(d, f, g))
khenaidoob9203542018-09-17 22:56:37 -0400203
204 def suppress_alarm(self, filter):
205 return self.adapter.suppress_alarm(filter)
206
207 def unsuppress_alarm(self, filter):
208 return self.adapter.unsuppress_alarm(filter)
209