blob: f4898a3663f9955058c88c2979a7c60e4fbca862 [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
45import re
46
47
48class MacAddressError(BaseException):
49 def __init__(self, error):
50 self.error = error
51
52
53class IDError(BaseException):
54 def __init__(self, error):
55 self.error = error
56
57
58@implementer(IAdapterInterface)
59class AdapterRequestFacade(object):
60 """
61 Gate-keeper between CORE and device adapters.
62
63 On one side it interacts with Core's internal model and update/dispatch
64 mechanisms.
65
66 On the other side, it interacts with the adapters standard interface as
67 defined in
68 """
69
70 def __init__(self, adapter):
71 self.adapter = adapter
72
73 @inlineCallbacks
74 def start(self):
75 self.log.debug('starting')
76
77 @inlineCallbacks
78 def stop(self):
79 self.log.debug('stopping')
80
81 def adopt_device(self, device):
82 d = Device()
83 if device:
84 device.Unpack(d)
khenaidoo92e62c52018-10-03 14:02:54 -040085 return True, self.adapter.adopt_device(d)
khenaidoob9203542018-09-17 22:56:37 -040086 else:
khenaidoo92e62c52018-10-03 14:02:54 -040087 return False, d
khenaidoob9203542018-09-17 22:56:37 -040088
89 def get_ofp_device_info(self, device):
90 d = Device()
91 if device:
92 device.Unpack(d)
khenaidoo92e62c52018-10-03 14:02:54 -040093 return True, self.adapter.get_ofp_device_info(d)
khenaidoob9203542018-09-17 22:56:37 -040094 else:
khenaidoo92e62c52018-10-03 14:02:54 -040095 return False, d
khenaidoob9203542018-09-17 22:56:37 -040096
97 def get_ofp_port_info(self, device, port_no):
98 d = Device()
99 if device:
100 device.Unpack(d)
101 else:
102 return (False, d)
103
104 p = IntType()
105 port_no.Unpack(p)
106
khenaidoo92e62c52018-10-03 14:02:54 -0400107 return True, self.adapter.get_ofp_port_info(d, p.val)
khenaidoob9203542018-09-17 22:56:37 -0400108
109
110 def reconcile_device(self, device):
111 return self.adapter.reconcile_device(device)
112
113 def abandon_device(self, device):
114 return self.adapter.abandon_device(device)
115
116 def disable_device(self, device):
khenaidoo92e62c52018-10-03 14:02:54 -0400117 d = Device()
118 if device:
119 device.Unpack(d)
120 return True, self.adapter.disable_device(d)
121 else:
122 return False, d
khenaidoob9203542018-09-17 22:56:37 -0400123
124 def reenable_device(self, device):
khenaidoo92e62c52018-10-03 14:02:54 -0400125 d = Device()
126 if device:
127 device.Unpack(d)
128 return True, self.adapter.reenable_device(d)
129 else:
130 return False, d
khenaidoob9203542018-09-17 22:56:37 -0400131
132 def reboot_device(self, device):
133 d = Device()
134 if device:
135 device.Unpack(d)
136 return (True, self.adapter.reboot_device(d))
137 else:
138 return (False, d)
139
140 def download_image(self, device, request):
141 return self.adapter.download_image(device, request)
142
143 def get_image_download_status(self, device, request):
144 return self.adapter.get_image_download_status(device, request)
145
146 def cancel_image_download(self, device, request):
147 return self.adapter.cancel_image_download(device, request)
148
149 def activate_image_update(self, device, request):
150 return self.adapter.activate_image_update(device, request)
151
152 def revert_image_update(self, device, request):
153 return self.adapter.revert_image_update(device, request)
154
155 def self_test(self, device):
156 return self.adapter.self_test_device(device)
157
158 def delete_device(self, device):
khenaidoo4d4802d2018-10-04 21:59:49 -0400159 d = Device()
160 if device:
161 device.Unpack(d)
162 return (True, self.adapter.delete_device(d))
163 else:
164 return (False, d)
khenaidoob9203542018-09-17 22:56:37 -0400165
166 def get_device_details(self, device):
167 return self.adapter.get_device_details(device)
168
169 def update_flows_bulk(self, device, flows, groups):
170 return self.adapter.update_flows_bulk(device, flows, groups)
171
172 def update_flows_incrementally(self, device, flow_changes, group_changes):
173 return self.adapter.update_flows_incrementally(device, flow_changes, group_changes)
174
175 def suppress_alarm(self, filter):
176 return self.adapter.suppress_alarm(filter)
177
178 def unsuppress_alarm(self, filter):
179 return self.adapter.unsuppress_alarm(filter)
180