blob: 8fb47441dd2f8f8c91aaba7d827d166e5d5ff7e6 [file] [log] [blame]
khenaidooab1f7bd2019-11-14 14:00:27 -05001/*
2 * Copyright 2019-present Open Networking Foundation
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 */
npujar1d86a522019-11-14 17:11:16 +053016
khenaidooab1f7bd2019-11-14 14:00:27 -050017package mocks
18
19import (
20 "context"
21 "fmt"
khenaidood948f772021-08-11 17:49:24 -040022 "strconv"
Kent Hagerman2a07b862020-06-19 15:23:07 -040023 "strings"
24
khenaidood948f772021-08-11 17:49:24 -040025 "github.com/golang/protobuf/ptypes/empty"
26 vgrpc "github.com/opencord/voltha-lib-go/v7/pkg/grpc"
27 "github.com/opencord/voltha-lib-go/v7/pkg/probe"
28 "github.com/opencord/voltha-protos/v5/go/common"
29 "github.com/opencord/voltha-protos/v5/go/extension"
30 "github.com/phayes/freeport"
31
khenaidooab1f7bd2019-11-14 14:00:27 -050032 "github.com/gogo/protobuf/proto"
khenaidood948f772021-08-11 17:49:24 -040033 com "github.com/opencord/voltha-lib-go/v7/pkg/adapters/common"
34 "github.com/opencord/voltha-lib-go/v7/pkg/log"
35 ic "github.com/opencord/voltha-protos/v5/go/inter_container"
36 of "github.com/opencord/voltha-protos/v5/go/openflow_13"
37 "github.com/opencord/voltha-protos/v5/go/voltha"
khenaidooab1f7bd2019-11-14 14:00:27 -050038)
39
npujar1d86a522019-11-14 17:11:16 +053040// ONUAdapter represent ONU adapter attributes
khenaidooab1f7bd2019-11-14 14:00:27 -050041type ONUAdapter struct {
khenaidoo8b4abbf2020-04-24 17:04:30 -040042 *Adapter
khenaidood948f772021-08-11 17:49:24 -040043 grpcServer *vgrpc.GrpcServer
khenaidooab1f7bd2019-11-14 14:00:27 -050044}
45
npujar1d86a522019-11-14 17:11:16 +053046// NewONUAdapter creates ONU adapter
khenaidood948f772021-08-11 17:49:24 -040047func NewONUAdapter(ctx context.Context, coreEndpoint string, deviceType string, vendor string) *ONUAdapter {
48 // Get an available port
49 grpcPort, err := freeport.GetFreePort()
50 if err != nil {
51 logger.Fatalw(ctx, "no-free-port", log.Fields{"error": err})
khenaidoo67b22152020-03-02 16:01:25 -050052 }
khenaidood948f772021-08-11 17:49:24 -040053 listeningAddress := fmt.Sprintf("127.0.0.1:%s", strconv.Itoa(grpcPort))
54 onuAdapter := &ONUAdapter{Adapter: NewAdapter(listeningAddress, coreEndpoint, deviceType, vendor)}
55
56 onuAdapter.start(ctx)
57 return onuAdapter
58}
59
60func (onuA *ONUAdapter) onuRestarted(ctx context.Context, endPoint string) error {
61 logger.Errorw(ctx, "remote-restarted", log.Fields{"endpoint": endPoint})
62 return nil
63}
64
65func (onuA *ONUAdapter) start(ctx context.Context) {
66
67 // Set up the probe service
68 onuA.Probe = &probe.Probe{}
69 probePort, err := freeport.GetFreePort()
70 if err != nil {
71 logger.Fatal(ctx, "Cannot get a freeport for probePort")
72 }
73 probeAddress := "127.0.0.1:" + strconv.Itoa(probePort)
74 go onuA.Probe.ListenAndServe(ctx, probeAddress)
75
76 probeCtx := context.WithValue(ctx, probe.ProbeContextKey, onuA.Probe)
77
78 onuA.Probe.RegisterService(ctx, "onu-grpc-service", onuA.coreEnpoint)
79
80 // start gRPC handler
81 onuA.grpcServer = vgrpc.NewGrpcServer(onuA.serviceEndpoint, nil, false, nil)
82
83 logger.Debugw(ctx, "ONUAdapter-address", log.Fields{"address": onuA.serviceEndpoint})
84
85 go onuA.startGRPCService(ctx, onuA.grpcServer, onuA, "onu-grpc-service")
86
87 // Establish grpc connection to Core
88 if onuA.coreClient, err = vgrpc.NewClient(onuA.coreEnpoint,
89 onuA.onuRestarted,
90 vgrpc.ActivityCheck(true)); err != nil {
91 logger.Fatal(ctx, "grpc-client-not-created")
92 }
93 go onuA.coreClient.Start(probeCtx, setAndTestCoreServiceHandler)
94
95 logger.Debugw(ctx, "ONUAdapter-started", log.Fields{"grpc-address": onuA.serviceEndpoint})
96}
97
98// Stop brings down core services
99func (onuA *ONUAdapter) StopGrpcClient() {
100 // Stop the grpc clients
101 onuA.coreClient.Stop(context.Background())
102}
103
104func (onuA *ONUAdapter) Stop() {
105 if onuA.grpcServer != nil {
106 onuA.grpcServer.Stop()
107 }
108 logger.Debugw(context.Background(), "ONUAdapter-stopped", log.Fields{"grpc-address": onuA.serviceEndpoint})
khenaidooab1f7bd2019-11-14 14:00:27 -0500109}
110
npujar1d86a522019-11-14 17:11:16 +0530111// Adopt_device creates new handler for added device
khenaidood948f772021-08-11 17:49:24 -0400112func (onuA *ONUAdapter) AdoptDevice(ctx context.Context, device *voltha.Device) (*empty.Empty, error) {
113 logger.Debugw(ctx, "AdoptDevice", log.Fields{"device": device.AdapterEndpoint, "device-type": onuA.DeviceType})
khenaidooab1f7bd2019-11-14 14:00:27 -0500114 go func() {
115 d := proto.Clone(device).(*voltha.Device)
116 d.Root = false
khenaidood948f772021-08-11 17:49:24 -0400117 d.Vendor = onuA.vendor
khenaidooab1f7bd2019-11-14 14:00:27 -0500118 d.Model = "go-mock"
119 d.SerialNumber = com.GetRandomSerialNumber()
120 d.MacAddress = strings.ToUpper(com.GetRandomMacAddress())
121 onuA.storeDevice(d)
khenaidood948f772021-08-11 17:49:24 -0400122
123 c, err := onuA.GetCoreClient()
124 if err != nil {
125 return
126 }
127 if _, err := c.DeviceUpdate(context.TODO(), d); err != nil {
128 logger.Fatalf(ctx, "deviceUpdate-failed-%s", err)
khenaidooab1f7bd2019-11-14 14:00:27 -0500129 }
khenaidooab1f7bd2019-11-14 14:00:27 -0500130
khenaidood948f772021-08-11 17:49:24 -0400131 d.ConnectStatus = common.ConnectStatus_REACHABLE
132 d.OperStatus = common.OperStatus_DISCOVERED
khenaidoo93181522020-01-23 12:43:21 -0500133
khenaidood948f772021-08-11 17:49:24 -0400134 if _, err = c.DeviceStateUpdate(context.TODO(), &ic.DeviceStateFilter{DeviceId: d.Id, OperStatus: d.OperStatus, ConnStatus: d.ConnectStatus}); err != nil {
135 logger.Fatalf(ctx, "PortCreated-failed-%s", err)
khenaidoo442e7c72020-03-10 16:13:48 -0400136 }
khenaidooab1f7bd2019-11-14 14:00:27 -0500137
138 uniPortNo := uint32(2)
139 if device.ProxyAddress != nil {
140 if device.ProxyAddress.ChannelId != 0 {
141 uniPortNo = device.ProxyAddress.ChannelId
142 }
143 }
144
khenaidooc6c7bda2020-06-17 17:20:18 -0400145 capability := uint32(of.OfpPortFeatures_OFPPF_1GB_FD | of.OfpPortFeatures_OFPPF_FIBER)
khenaidooab1f7bd2019-11-14 14:00:27 -0500146 uniPort := &voltha.Port{
khenaidood948f772021-08-11 17:49:24 -0400147 DeviceId: d.Id,
khenaidooab1f7bd2019-11-14 14:00:27 -0500148 PortNo: uniPortNo,
149 Label: fmt.Sprintf("uni-%d", uniPortNo),
150 Type: voltha.Port_ETHERNET_UNI,
khenaidood948f772021-08-11 17:49:24 -0400151 OperStatus: common.OperStatus_ACTIVE,
khenaidooc6c7bda2020-06-17 17:20:18 -0400152 OfpPort: &of.OfpPort{
153 HwAddr: macAddressToUint32Array("12:12:12:12:12:12"),
154 Config: 0,
155 State: uint32(of.OfpPortState_OFPPS_LIVE),
156 Curr: capability,
157 Advertised: capability,
158 Peer: capability,
159 CurrSpeed: uint32(of.OfpPortFeatures_OFPPF_1GB_FD),
160 MaxSpeed: uint32(of.OfpPortFeatures_OFPPF_1GB_FD),
161 },
khenaidooab1f7bd2019-11-14 14:00:27 -0500162 }
khenaidooc6c7bda2020-06-17 17:20:18 -0400163
khenaidood948f772021-08-11 17:49:24 -0400164 if _, err = c.PortCreated(context.TODO(), uniPort); err != nil {
Rohan Agrawal31f21802020-06-12 05:38:46 +0000165 logger.Fatalf(ctx, "PortCreated-failed-%s", err)
khenaidooab1f7bd2019-11-14 14:00:27 -0500166 }
167
168 ponPortNo := uint32(1)
169 if device.ParentPortNo != 0 {
170 ponPortNo = device.ParentPortNo
171 }
172
173 ponPort := &voltha.Port{
khenaidood948f772021-08-11 17:49:24 -0400174 DeviceId: d.Id,
khenaidooab1f7bd2019-11-14 14:00:27 -0500175 PortNo: ponPortNo,
176 Label: fmt.Sprintf("pon-%d", ponPortNo),
177 Type: voltha.Port_PON_ONU,
khenaidood948f772021-08-11 17:49:24 -0400178 OperStatus: common.OperStatus_ACTIVE,
khenaidooab1f7bd2019-11-14 14:00:27 -0500179 Peers: []*voltha.Port_PeerPort{{DeviceId: d.ParentId, // Peer device is OLT
khenaidoo6e55d9e2019-12-12 18:26:26 -0500180 PortNo: device.ParentPortNo}}, // Peer port is parent's port number
khenaidooab1f7bd2019-11-14 14:00:27 -0500181 }
khenaidood948f772021-08-11 17:49:24 -0400182
183 if _, err = c.PortCreated(context.TODO(), ponPort); err != nil {
Rohan Agrawal31f21802020-06-12 05:38:46 +0000184 logger.Fatalf(ctx, "PortCreated-failed-%s", err)
khenaidooab1f7bd2019-11-14 14:00:27 -0500185 }
186
khenaidood948f772021-08-11 17:49:24 -0400187 d.ConnectStatus = common.ConnectStatus_REACHABLE
188 d.OperStatus = common.OperStatus_ACTIVE
khenaidooab1f7bd2019-11-14 14:00:27 -0500189
khenaidood948f772021-08-11 17:49:24 -0400190 if _, err = c.DeviceStateUpdate(context.TODO(), &ic.DeviceStateFilter{DeviceId: d.Id, OperStatus: d.OperStatus, ConnStatus: d.ConnectStatus}); err != nil {
191 logger.Fatalf(ctx, "PortCreated-failed-%s", err)
khenaidooab1f7bd2019-11-14 14:00:27 -0500192 }
khenaidood948f772021-08-11 17:49:24 -0400193
khenaidooab1f7bd2019-11-14 14:00:27 -0500194 //Get the latest device data from the Core
khenaidood948f772021-08-11 17:49:24 -0400195 if d, err = c.GetDevice(context.TODO(), &common.ID{Id: d.Id}); err != nil {
Rohan Agrawal31f21802020-06-12 05:38:46 +0000196 logger.Fatalf(ctx, "getting-device-failed-%s", err)
khenaidooab1f7bd2019-11-14 14:00:27 -0500197 }
198
khenaidoo8b4abbf2020-04-24 17:04:30 -0400199 onuA.updateDevice(d)
khenaidooab1f7bd2019-11-14 14:00:27 -0500200 }()
khenaidood948f772021-08-11 17:49:24 -0400201 return &empty.Empty{}, nil
khenaidooab1f7bd2019-11-14 14:00:27 -0500202}
203
Andrea Campanella025667e2021-01-14 11:50:07 +0100204// Single_get_value_request retrieves a single value.
205func (onuA *ONUAdapter) Single_get_value_request(ctx context.Context, // nolint
206 request extension.SingleGetValueRequest) (*extension.SingleGetValueResponse, error) {
207 logger.Fatalf(ctx, "Single_get_value_request unimplemented")
208 return nil, nil
209}
210
npujar1d86a522019-11-14 17:11:16 +0530211// Disable_device disables device
khenaidood948f772021-08-11 17:49:24 -0400212func (onuA *ONUAdapter) DisableDevice(ctx context.Context, device *voltha.Device) (*empty.Empty, error) { // nolint
khenaidooab1f7bd2019-11-14 14:00:27 -0500213 go func() {
214 if d := onuA.getDevice(device.Id); d == nil {
Rohan Agrawal31f21802020-06-12 05:38:46 +0000215 logger.Fatalf(ctx, "device-not-found-%s", device.Id)
khenaidooab1f7bd2019-11-14 14:00:27 -0500216 }
khenaidood948f772021-08-11 17:49:24 -0400217
khenaidooab1f7bd2019-11-14 14:00:27 -0500218 cloned := proto.Clone(device).(*voltha.Device)
219 // Update the all ports state on that device to disable
khenaidood948f772021-08-11 17:49:24 -0400220 c, err := onuA.GetCoreClient()
221 if err != nil {
khenaidoo442e7c72020-03-10 16:13:48 -0400222 return
khenaidooab1f7bd2019-11-14 14:00:27 -0500223 }
khenaidooab1f7bd2019-11-14 14:00:27 -0500224
khenaidood948f772021-08-11 17:49:24 -0400225 if _, err := c.PortsStateUpdate(context.TODO(),
226 &ic.PortStateFilter{
227 DeviceId: cloned.Id,
228 PortTypeFilter: 0,
229 OperStatus: common.OperStatus_UNKNOWN,
230 }); err != nil {
231 logger.Warnw(ctx, "updating-ports-failed", log.Fields{"device-id": device.Id, "error": err})
232 }
233
234 //Update the device operational state
235 cloned.ConnectStatus = common.ConnectStatus_UNREACHABLE
236 cloned.OperStatus = common.OperStatus_UNKNOWN
237
238 if _, err := c.DeviceStateUpdate(context.TODO(), &ic.DeviceStateFilter{
239 DeviceId: cloned.Id,
240 OperStatus: cloned.OperStatus,
241 ConnStatus: cloned.ConnectStatus,
242 }); err != nil {
243 // Device may already have been deleted in the core
divyadesaicb8b59d2020-08-18 09:55:47 +0000244 logger.Warnw(ctx, "device-state-update-failed", log.Fields{"device-id": device.Id, "error": err})
khenaidoo442e7c72020-03-10 16:13:48 -0400245 return
khenaidooab1f7bd2019-11-14 14:00:27 -0500246 }
khenaidood948f772021-08-11 17:49:24 -0400247
khenaidoo8b4abbf2020-04-24 17:04:30 -0400248 onuA.updateDevice(cloned)
khenaidood948f772021-08-11 17:49:24 -0400249
khenaidooab1f7bd2019-11-14 14:00:27 -0500250 }()
khenaidood948f772021-08-11 17:49:24 -0400251 return &empty.Empty{}, nil
khenaidooab1f7bd2019-11-14 14:00:27 -0500252}
253
khenaidood948f772021-08-11 17:49:24 -0400254func (onuA *ONUAdapter) ReEnableDevice(ctx context.Context, device *voltha.Device) (*empty.Empty, error) { // nolint
khenaidooab1f7bd2019-11-14 14:00:27 -0500255 go func() {
256 if d := onuA.getDevice(device.Id); d == nil {
Rohan Agrawal31f21802020-06-12 05:38:46 +0000257 logger.Fatalf(ctx, "device-not-found-%s", device.Id)
khenaidooab1f7bd2019-11-14 14:00:27 -0500258 }
259
260 cloned := proto.Clone(device).(*voltha.Device)
khenaidood948f772021-08-11 17:49:24 -0400261
262 c, err := onuA.GetCoreClient()
263 if err != nil {
264 return
265 }
266
khenaidooab1f7bd2019-11-14 14:00:27 -0500267 // Update the all ports state on that device to enable
khenaidood948f772021-08-11 17:49:24 -0400268 if _, err := c.PortsStateUpdate(context.TODO(),
269 &ic.PortStateFilter{
270 DeviceId: cloned.Id,
271 PortTypeFilter: 0,
272 OperStatus: common.OperStatus_ACTIVE,
273 }); err != nil {
274 logger.Warnw(ctx, "updating-ports-failed", log.Fields{"device-id": device.Id, "error": err})
khenaidooab1f7bd2019-11-14 14:00:27 -0500275 }
276
277 //Update the device state
khenaidood948f772021-08-11 17:49:24 -0400278 cloned.ConnectStatus = common.ConnectStatus_REACHABLE
279 cloned.OperStatus = common.OperStatus_ACTIVE
khenaidooab1f7bd2019-11-14 14:00:27 -0500280
khenaidood948f772021-08-11 17:49:24 -0400281 if _, err := c.DeviceStateUpdate(context.TODO(), &ic.DeviceStateFilter{
282 DeviceId: cloned.Id,
283 OperStatus: cloned.OperStatus,
284 ConnStatus: cloned.ConnectStatus,
285 }); err != nil {
286 // Device may already have been deleted in the core
divyadesaicb8b59d2020-08-18 09:55:47 +0000287 logger.Fatalf(ctx, "device-state-update-failed", log.Fields{"device-id": device.Id, "error": err})
khenaidood948f772021-08-11 17:49:24 -0400288 return
khenaidooab1f7bd2019-11-14 14:00:27 -0500289 }
khenaidoo8b4abbf2020-04-24 17:04:30 -0400290 onuA.updateDevice(cloned)
khenaidooab1f7bd2019-11-14 14:00:27 -0500291 }()
khenaidood948f772021-08-11 17:49:24 -0400292 return &empty.Empty{}, nil
khenaidooab1f7bd2019-11-14 14:00:27 -0500293}
khenaidoo67b22152020-03-02 16:01:25 -0500294
khenaidood948f772021-08-11 17:49:24 -0400295func (onuA *ONUAdapter) StartOmciTest(ctx context.Context, _ *ic.OMCITest) (*voltha.TestResponse, error) { // nolint
296 return &voltha.TestResponse{Result: voltha.TestResponse_SUCCESS}, nil
yasin sapli5458a1c2021-06-14 22:24:38 +0000297}