blob: e2c848d1c798372ca2658b43ed38e60799964a33 [file] [log] [blame]
khenaidood948f772021-08-11 17:49:24 -04001/*
Joey Armstrong7a9af442024-01-03 19:26:36 -05002* Copyright 2021-2024 Open Networking Foundation (ONF) and the ONF Contributors
khenaidood948f772021-08-11 17:49:24 -04003
Joey Armstrong393daca2023-07-06 08:47:54 -04004* 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
khenaidood948f772021-08-11 17:49:24 -04007
Joey Armstrong393daca2023-07-06 08:47:54 -04008* http://www.apache.org/licenses/LICENSE-2.0
khenaidood948f772021-08-11 17:49:24 -04009
Joey Armstrong393daca2023-07-06 08:47:54 -040010* 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.
khenaidood948f772021-08-11 17:49:24 -040015 */
16package device
17
18import (
19 "context"
20 "errors"
21
22 "github.com/golang/protobuf/ptypes/empty"
23 "github.com/opencord/voltha-go/rw_core/utils"
24 "github.com/opencord/voltha-lib-go/v7/pkg/log"
25 "github.com/opencord/voltha-protos/v5/go/common"
khenaidoo9beaaf12021-10-19 17:32:01 -040026 "github.com/opencord/voltha-protos/v5/go/extension"
27 "github.com/opencord/voltha-protos/v5/go/omci"
khenaidood948f772021-08-11 17:49:24 -040028 ofp "github.com/opencord/voltha-protos/v5/go/openflow_13"
yasin sapli8fe47e42023-06-09 21:19:00 +000029 "github.com/opencord/voltha-protos/v5/go/voip_system_profile"
30 "github.com/opencord/voltha-protos/v5/go/voip_user_profile"
khenaidood948f772021-08-11 17:49:24 -040031 "github.com/opencord/voltha-protos/v5/go/voltha"
32 "google.golang.org/grpc/codes"
33 "google.golang.org/grpc/status"
34)
35
36// CreateDevice creates a new parent device in the data model
37func (dMgr *Manager) CreateDevice(ctx context.Context, device *voltha.Device) (*voltha.Device, error) {
38 if device.MacAddress == "" && device.GetHostAndPort() == "" {
39 logger.Errorf(ctx, "no-device-info-present")
40 return &voltha.Device{}, errors.New("no-device-info-present; MAC or HOSTIP&PORT")
41 }
42 ctx = utils.WithRPCMetadataContext(ctx, "CreateDevice")
nikesh.krishnandf10b2b2023-09-29 21:24:52 +053043 logger.Info(ctx, "create-device", log.Fields{"device": *device})
khenaidood948f772021-08-11 17:49:24 -040044
45 deviceExist, err := dMgr.isParentDeviceExist(ctx, device)
46 if err != nil {
47 logger.Errorf(ctx, "failed-to-fetch-parent-device-info")
48 return nil, err
49 }
50 if deviceExist {
51 logger.Errorf(ctx, "device-is-pre-provisioned-already-with-same-ip-port-or-mac-address")
52 return nil, errors.New("device is already pre-provisioned")
53 }
khenaidood948f772021-08-11 17:49:24 -040054
55 // Ensure this device is set as root
56 device.Root = true
57 // Create and start a device agent for that device
Himani Chawla4b4bd252021-11-08 15:59:40 +053058 agent := newAgent(device, dMgr, dMgr.dbPath, dMgr.dProxy, dMgr.internalTimeout, dMgr.rpcTimeout, dMgr.flowTimeout)
khenaidood948f772021-08-11 17:49:24 -040059 device, err = agent.start(ctx, false, device)
60 if err != nil {
61 logger.Errorw(ctx, "fail-to-start-device", log.Fields{"device-id": agent.deviceID, "error": err})
62 return nil, err
63 }
64 dMgr.addDeviceAgentToMap(agent)
65 return device, nil
66}
67
68// EnableDevice activates a device by invoking the adopt_device API on the appropriate adapter
69func (dMgr *Manager) EnableDevice(ctx context.Context, id *voltha.ID) (*empty.Empty, error) {
70 ctx = utils.WithRPCMetadataContext(ctx, "EnableDevice")
71 log.EnrichSpan(ctx, log.Fields{"device-id": id.Id})
72
nikesh.krishnandf10b2b2023-09-29 21:24:52 +053073 logger.Info(ctx, "enable-device", log.Fields{"device-id": id.Id})
khenaidood948f772021-08-11 17:49:24 -040074 agent := dMgr.getDeviceAgent(ctx, id.Id)
75 if agent == nil {
76 return nil, status.Errorf(codes.NotFound, "%s", id.Id)
77 }
78 return &empty.Empty{}, agent.enableDevice(ctx)
79}
80
81// DisableDevice disables a device along with any child device it may have
82func (dMgr *Manager) DisableDevice(ctx context.Context, id *voltha.ID) (*empty.Empty, error) {
83 ctx = utils.WithRPCMetadataContext(ctx, "DisableDevice")
84 log.EnrichSpan(ctx, log.Fields{"device-id": id.Id})
85
nikesh.krishnandf10b2b2023-09-29 21:24:52 +053086 logger.Info(ctx, "disable-device", log.Fields{"device-id": id.Id})
khenaidood948f772021-08-11 17:49:24 -040087 agent := dMgr.getDeviceAgent(ctx, id.Id)
88 if agent == nil {
89 return nil, status.Errorf(codes.NotFound, "%s", id.Id)
90 }
91 return &empty.Empty{}, agent.disableDevice(ctx)
92}
93
Joey Armstrong393daca2023-07-06 08:47:54 -040094// RebootDevice invoked the reboot API to the corresponding adapter
khenaidood948f772021-08-11 17:49:24 -040095func (dMgr *Manager) RebootDevice(ctx context.Context, id *voltha.ID) (*empty.Empty, error) {
96 ctx = utils.WithRPCMetadataContext(ctx, "RebootDevice")
97 log.EnrichSpan(ctx, log.Fields{"device-id": id.Id})
98
nikesh.krishnandf10b2b2023-09-29 21:24:52 +053099 logger.Info(ctx, "reboot-device", log.Fields{"device-id": id.Id})
khenaidood948f772021-08-11 17:49:24 -0400100 agent := dMgr.getDeviceAgent(ctx, id.Id)
101 if agent == nil {
102 return nil, status.Errorf(codes.NotFound, "%s", id.Id)
103 }
104 return &empty.Empty{}, agent.rebootDevice(ctx)
105}
106
107// DeleteDevice removes a device from the data model
108func (dMgr *Manager) DeleteDevice(ctx context.Context, id *voltha.ID) (*empty.Empty, error) {
109 ctx = utils.WithRPCMetadataContext(ctx, "DeleteDevice")
110 log.EnrichSpan(ctx, log.Fields{"device-id": id.Id})
111
nikesh.krishnandf10b2b2023-09-29 21:24:52 +0530112 logger.Info(ctx, "delete-device", log.Fields{"device-id": id.Id})
khenaidood948f772021-08-11 17:49:24 -0400113 agent := dMgr.getDeviceAgent(ctx, id.Id)
114 if agent == nil {
115 return nil, status.Errorf(codes.NotFound, "%s", id.Id)
116 }
117 return &empty.Empty{}, agent.deleteDevice(ctx)
118}
119
120// ForceDeleteDevice removes a device from the data model forcefully without successfully waiting for the adapters.
121func (dMgr *Manager) ForceDeleteDevice(ctx context.Context, id *voltha.ID) (*empty.Empty, error) {
122 ctx = utils.WithRPCMetadataContext(ctx, "ForceDeleteDevice")
123 log.EnrichSpan(ctx, log.Fields{"device-id": id.Id})
124
nikesh.krishnandf10b2b2023-09-29 21:24:52 +0530125 logger.Info(ctx, "force-delete-device", log.Fields{"device-id": id.Id})
khenaidood948f772021-08-11 17:49:24 -0400126 agent := dMgr.getDeviceAgent(ctx, id.Id)
127 if agent == nil {
128 return nil, status.Errorf(codes.NotFound, "%s", id.Id)
129 }
130 return &empty.Empty{}, agent.deleteDeviceForce(ctx)
131}
132
133// ListDevices retrieves the latest devices from the data model
134func (dMgr *Manager) ListDevices(ctx context.Context, _ *empty.Empty) (*voltha.Devices, error) {
135 ctx = utils.WithRPCMetadataContext(ctx, "ListDevices")
136
137 logger.Debug(ctx, "list-devices")
138 result := &voltha.Devices{}
139
140 dMgr.deviceAgents.Range(func(key, value interface{}) bool {
141 result.Items = append(result.Items, value.(*Agent).device)
142 return true
143 })
144
145 logger.Debugw(ctx, "list-devices-end", log.Fields{"len": len(result.Items)})
146 return result, nil
147}
148
149// ListDeviceIds retrieves the latest device IDs information from the data model (memory data only)
150func (dMgr *Manager) ListDeviceIds(ctx context.Context, _ *empty.Empty) (*voltha.IDs, error) {
151 ctx = utils.WithRPCMetadataContext(ctx, "ListDeviceIds")
152
153 logger.Debug(ctx, "list-device-ids")
154 // Report only device IDs that are in the device agent map
155 return dMgr.listDeviceIdsFromMap(), nil
156}
157
158// ReconcileDevices is a request to a voltha core to update its list of managed devices. This will
159// trigger loading the devices along with their children and parent in memory
160func (dMgr *Manager) ReconcileDevices(ctx context.Context, ids *voltha.IDs) (*empty.Empty, error) {
161 ctx = utils.WithRPCMetadataContext(ctx, "ReconcileDevices")
162
163 numDevices := 0
164 if ids != nil {
165 numDevices = len(ids.Items)
166 }
167
nikesh.krishnandf10b2b2023-09-29 21:24:52 +0530168 logger.Info(ctx, "reconcile-devices", log.Fields{"num-devices": numDevices})
khenaidood948f772021-08-11 17:49:24 -0400169 if ids != nil && len(ids.Items) != 0 {
170 toReconcile := len(ids.Items)
171 reconciled := 0
172 var err error
173 for _, id := range ids.Items {
174 if err = dMgr.load(ctx, id.Id); err != nil {
175 logger.Warnw(ctx, "failure-reconciling-device", log.Fields{"device-id": id.Id, "error": err})
176 } else {
177 reconciled++
178 }
179 }
180 if toReconcile != reconciled {
181 return nil, status.Errorf(codes.DataLoss, "less-device-reconciled-than-requested:%d/%d", reconciled, toReconcile)
182 }
183 } else {
184 return nil, status.Errorf(codes.InvalidArgument, "empty-list-of-ids")
185 }
186 return &empty.Empty{}, nil
187}
188
189// GetDevice exists primarily to implement the gRPC interface.
190// Internal functions should call getDeviceReadOnly instead.
191func (dMgr *Manager) GetDevice(ctx context.Context, id *voltha.ID) (*voltha.Device, error) {
192 ctx = utils.WithRPCMetadataContext(ctx, "GetDevice")
193 log.EnrichSpan(ctx, log.Fields{"device-id": id.Id})
194
195 return dMgr.getDeviceReadOnly(ctx, id.Id)
196}
197
198// convenience to avoid redefining
199var operationFailureResp = &common.OperationResp{Code: voltha.OperationResp_OPERATION_FAILURE}
200
201// DownloadImage execute an image download request
202func (dMgr *Manager) DownloadImage(ctx context.Context, img *voltha.ImageDownload) (*common.OperationResp, error) {
203 ctx = utils.WithRPCMetadataContext(ctx, "DownloadImage")
204 log.EnrichSpan(ctx, log.Fields{"device-id": img.Id})
205
nikesh.krishnandf10b2b2023-09-29 21:24:52 +0530206 logger.Info(ctx, "download-image", log.Fields{"device-id": img.Id, "image-name": img.Name})
khenaidood948f772021-08-11 17:49:24 -0400207 agent := dMgr.getDeviceAgent(ctx, img.Id)
208 if agent == nil {
209 return operationFailureResp, status.Errorf(codes.NotFound, "%s", img.Id)
210 }
211 resp, err := agent.downloadImage(ctx, img)
212 if err != nil {
213 return operationFailureResp, err
214 }
215 return resp, nil
216}
217
218// CancelImageDownload cancels image download request
219func (dMgr *Manager) CancelImageDownload(ctx context.Context, img *voltha.ImageDownload) (*common.OperationResp, error) {
220 ctx = utils.WithRPCMetadataContext(ctx, "CancelImageDownload")
221 log.EnrichSpan(ctx, log.Fields{"device-id": img.Id})
222
nikesh.krishnandf10b2b2023-09-29 21:24:52 +0530223 logger.Info(ctx, "cancel-image-download", log.Fields{"device-id": img.Id, "image-name": img.Name})
khenaidood948f772021-08-11 17:49:24 -0400224 agent := dMgr.getDeviceAgent(ctx, img.Id)
225 if agent == nil {
226 return operationFailureResp, status.Errorf(codes.NotFound, "%s", img.Id)
227 }
228 resp, err := agent.cancelImageDownload(ctx, img)
229 if err != nil {
230 return operationFailureResp, err
231 }
232 return resp, nil
233}
234
235// ActivateImageUpdate activates image update request
236func (dMgr *Manager) ActivateImageUpdate(ctx context.Context, img *voltha.ImageDownload) (*common.OperationResp, error) {
237 ctx = utils.WithRPCMetadataContext(ctx, "ActivateImageUpdate")
238 log.EnrichSpan(ctx, log.Fields{"device-id": img.Id})
239
nikesh.krishnandf10b2b2023-09-29 21:24:52 +0530240 logger.Info(ctx, "activate-image-update", log.Fields{"device-id": img.Id, "image-name": img.Name})
khenaidood948f772021-08-11 17:49:24 -0400241 agent := dMgr.getDeviceAgent(ctx, img.Id)
242 if agent == nil {
243 return operationFailureResp, status.Errorf(codes.NotFound, "%s", img.Id)
244 }
245 resp, err := agent.activateImage(ctx, img)
246 if err != nil {
247 return operationFailureResp, err
248 }
249 return resp, nil
250}
251
252// RevertImageUpdate reverts image update
253func (dMgr *Manager) RevertImageUpdate(ctx context.Context, img *voltha.ImageDownload) (*common.OperationResp, error) {
254 ctx = utils.WithRPCMetadataContext(ctx, "RevertImageUpdate")
255 log.EnrichSpan(ctx, log.Fields{"device-id": img.Id})
256
nikesh.krishnandf10b2b2023-09-29 21:24:52 +0530257 logger.Info(ctx, "rever-image-update", log.Fields{"device-id": img.Id, "image-name": img.Name})
khenaidood948f772021-08-11 17:49:24 -0400258 agent := dMgr.getDeviceAgent(ctx, img.Id)
259 if agent == nil {
260 return operationFailureResp, status.Errorf(codes.NotFound, "%s", img.Id)
261 }
262 resp, err := agent.revertImage(ctx, img)
263 if err != nil {
264 return operationFailureResp, err
265 }
266 return resp, nil
267}
268
269func (dMgr *Manager) DownloadImageToDevice(ctx context.Context, request *voltha.DeviceImageDownloadRequest) (*voltha.DeviceImageResponse, error) {
270 if err := dMgr.validateImageDownloadRequest(request); err != nil {
271 return nil, err
272 }
273
274 ctx = utils.WithRPCMetadataContext(ctx, "DownloadImageToDevice")
275 respCh := make(chan []*voltha.DeviceImageState, len(request.GetDeviceId()))
276
277 for index, deviceID := range request.DeviceId {
278 // Create download request per device
279 downloadReq := &voltha.DeviceImageDownloadRequest{
280 Image: request.Image,
281 ActivateOnSuccess: request.ActivateOnSuccess,
282 CommitOnSuccess: request.CommitOnSuccess,
283 }
284
285 //slice-out only single deviceID from the request
286 downloadReq.DeviceId = request.DeviceId[index : index+1]
287
288 go func(deviceID string, req *voltha.DeviceImageDownloadRequest, ch chan []*voltha.DeviceImageState) {
289 agent := dMgr.getDeviceAgent(ctx, deviceID)
290 if agent == nil {
ssiddiqui9e120e92021-10-11 12:33:05 +0530291 logger.Errorw(ctx, "Device-agent-not-found", log.Fields{"device-id": deviceID})
292 ch <- []*voltha.DeviceImageState{{
293 DeviceId: deviceID,
294 ImageState: &voltha.ImageState{
295 Version: req.GetImage().GetVersion(),
296 DownloadState: voltha.ImageState_DOWNLOAD_FAILED,
297 Reason: voltha.ImageState_UNKNOWN_ERROR,
298 ImageState: voltha.ImageState_IMAGE_UNKNOWN,
299 },
300 }}
khenaidood948f772021-08-11 17:49:24 -0400301 return
302 }
303
304 resp, err := agent.downloadImageToDevice(ctx, req)
305 if err != nil {
306 logger.Errorw(ctx, "download-image-to-device-failed", log.Fields{"device-id": deviceID, "error": err})
ssiddiqui9e120e92021-10-11 12:33:05 +0530307 ch <- []*voltha.DeviceImageState{{
308 DeviceId: deviceID,
309 ImageState: &voltha.ImageState{
310 Version: req.GetImage().GetVersion(),
311 DownloadState: voltha.ImageState_DOWNLOAD_FAILED,
312 Reason: voltha.ImageState_UNKNOWN_ERROR,
313 ImageState: voltha.ImageState_IMAGE_UNKNOWN,
314 },
315 }}
khenaidood948f772021-08-11 17:49:24 -0400316 return
317 }
318
319 err = dMgr.validateDeviceImageResponse(resp)
320 if err != nil {
321 logger.Errorw(ctx, "download-image-to-device-failed", log.Fields{"device-id": deviceID, "error": err})
ssiddiqui9e120e92021-10-11 12:33:05 +0530322 ch <- []*voltha.DeviceImageState{{
323 DeviceId: deviceID,
324 ImageState: &voltha.ImageState{
325 Version: req.GetImage().GetVersion(),
326 DownloadState: voltha.ImageState_DOWNLOAD_FAILED,
327 Reason: voltha.ImageState_UNKNOWN_ERROR,
328 ImageState: voltha.ImageState_IMAGE_UNKNOWN,
329 },
330 }}
khenaidood948f772021-08-11 17:49:24 -0400331 return
332 }
333 ch <- resp.GetDeviceImageStates()
334 }(deviceID.GetId(), downloadReq, respCh)
335
336 }
337
338 return dMgr.waitForAllResponses(ctx, "download-image-to-device", respCh, len(request.GetDeviceId()))
339}
340
341func (dMgr *Manager) GetImageStatus(ctx context.Context, request *voltha.DeviceImageRequest) (*voltha.DeviceImageResponse, error) {
342 if err := dMgr.validateImageRequest(request); err != nil {
343 return nil, err
344 }
345
346 ctx = utils.WithRPCMetadataContext(ctx, "GetImageStatus")
347
348 respCh := make(chan []*voltha.DeviceImageState, len(request.GetDeviceId()))
Elia Battiston58d1c062022-02-08 11:54:27 +0100349
350 if request.DeviceId == nil {
351 //Reply for every ONU
352 dMgr.deviceAgents.Range(func(key, value interface{}) bool {
353 device := value.(*Agent).device
354 if !device.Root {
355 request.DeviceId = append(request.DeviceId, &common.ID{Id: value.(*Agent).device.Id})
356 }
357 return true
358 })
359 }
360
khenaidood948f772021-08-11 17:49:24 -0400361 for index, deviceID := range request.DeviceId {
362 // Create status request per device
363 imageStatusReq := &voltha.DeviceImageRequest{
364 Version: request.Version,
365 CommitOnSuccess: request.CommitOnSuccess,
366 }
367
368 //slice-out only single deviceID from the request
369 imageStatusReq.DeviceId = request.DeviceId[index : index+1]
370
371 go func(deviceID string, req *voltha.DeviceImageRequest, ch chan []*voltha.DeviceImageState) {
372 agent := dMgr.getDeviceAgent(ctx, deviceID)
373 if agent == nil {
ssiddiqui9e120e92021-10-11 12:33:05 +0530374 logger.Errorw(ctx, "Device-agent-not-found", log.Fields{"device-id": deviceID})
375 ch <- []*voltha.DeviceImageState{{
376 DeviceId: deviceID,
377 ImageState: &voltha.ImageState{
378 Version: request.GetVersion(),
379 DownloadState: voltha.ImageState_DOWNLOAD_UNKNOWN,
380 Reason: voltha.ImageState_UNKNOWN_ERROR,
381 ImageState: voltha.ImageState_IMAGE_UNKNOWN,
382 },
383 }}
khenaidood948f772021-08-11 17:49:24 -0400384 return
385 }
386
387 resp, err := agent.getImageStatus(ctx, req)
388 if err != nil {
389 logger.Errorw(ctx, "get-image-status-failed", log.Fields{"device-id": deviceID, "error": err})
ssiddiqui9e120e92021-10-11 12:33:05 +0530390 ch <- []*voltha.DeviceImageState{{
391 DeviceId: deviceID,
392 ImageState: &voltha.ImageState{
393 Version: request.GetVersion(),
394 DownloadState: voltha.ImageState_DOWNLOAD_UNKNOWN,
395 Reason: voltha.ImageState_UNKNOWN_ERROR,
396 ImageState: voltha.ImageState_IMAGE_UNKNOWN,
397 },
398 }}
khenaidood948f772021-08-11 17:49:24 -0400399 return
400 }
401
402 err = dMgr.validateDeviceImageResponse(resp)
403 if err != nil {
404 logger.Errorw(ctx, "get-image-status-failed", log.Fields{"device-id": deviceID, "error": err})
ssiddiqui9e120e92021-10-11 12:33:05 +0530405 ch <- []*voltha.DeviceImageState{{
406 DeviceId: deviceID,
407 ImageState: &voltha.ImageState{
408 Version: request.GetVersion(),
409 DownloadState: voltha.ImageState_DOWNLOAD_UNKNOWN,
410 Reason: voltha.ImageState_UNKNOWN_ERROR,
411 ImageState: voltha.ImageState_IMAGE_UNKNOWN,
412 },
413 }}
khenaidood948f772021-08-11 17:49:24 -0400414 return
415 }
416 ch <- resp.GetDeviceImageStates()
417 }(deviceID.GetId(), imageStatusReq, respCh)
418
419 }
420
421 return dMgr.waitForAllResponses(ctx, "get-image-status", respCh, len(request.GetDeviceId()))
422}
423
424func (dMgr *Manager) AbortImageUpgradeToDevice(ctx context.Context, request *voltha.DeviceImageRequest) (*voltha.DeviceImageResponse, error) {
425 if err := dMgr.validateImageRequest(request); err != nil {
426 return nil, err
427 }
428
429 ctx = utils.WithRPCMetadataContext(ctx, "AbortImageUpgradeToDevice")
430 respCh := make(chan []*voltha.DeviceImageState, len(request.GetDeviceId()))
431
432 for index, deviceID := range request.DeviceId {
433 // Create abort request per device
434 abortImageReq := &voltha.DeviceImageRequest{
435 Version: request.Version,
436 CommitOnSuccess: request.CommitOnSuccess,
437 }
438
439 //slice-out only single deviceID from the request
440 abortImageReq.DeviceId = request.DeviceId[index : index+1]
441
442 go func(deviceID string, req *voltha.DeviceImageRequest, ch chan []*voltha.DeviceImageState) {
443 agent := dMgr.getDeviceAgent(ctx, deviceID)
444 if agent == nil {
ssiddiqui9e120e92021-10-11 12:33:05 +0530445 logger.Errorw(ctx, "Device-agent-not-found", log.Fields{"device-id": deviceID})
446 ch <- []*voltha.DeviceImageState{{
447 DeviceId: deviceID,
448 ImageState: &voltha.ImageState{
449 Version: request.GetVersion(),
450 DownloadState: voltha.ImageState_DOWNLOAD_UNKNOWN,
451 Reason: voltha.ImageState_UNKNOWN_ERROR,
452 ImageState: voltha.ImageState_IMAGE_UNKNOWN,
453 },
454 }}
khenaidood948f772021-08-11 17:49:24 -0400455 return
456 }
457
458 resp, err := agent.abortImageUpgradeToDevice(ctx, req)
459 if err != nil {
460 logger.Errorw(ctx, "abort-image-upgrade-to-device-failed", log.Fields{"device-id": deviceID, "error": err})
ssiddiqui9e120e92021-10-11 12:33:05 +0530461 ch <- []*voltha.DeviceImageState{{
462 DeviceId: deviceID,
463 ImageState: &voltha.ImageState{
464 Version: request.GetVersion(),
465 DownloadState: voltha.ImageState_DOWNLOAD_UNKNOWN,
466 Reason: voltha.ImageState_UNKNOWN_ERROR,
467 ImageState: voltha.ImageState_IMAGE_UNKNOWN,
468 },
469 }}
khenaidood948f772021-08-11 17:49:24 -0400470 return
471 }
472
473 err = dMgr.validateDeviceImageResponse(resp)
474 if err != nil {
475 logger.Errorw(ctx, "abort-image-upgrade-to-device-failed", log.Fields{"device-id": deviceID, "error": err})
ssiddiqui9e120e92021-10-11 12:33:05 +0530476 ch <- []*voltha.DeviceImageState{{
477 DeviceId: deviceID,
478 ImageState: &voltha.ImageState{
479 Version: request.GetVersion(),
480 DownloadState: voltha.ImageState_DOWNLOAD_UNKNOWN,
481 Reason: voltha.ImageState_UNKNOWN_ERROR,
482 ImageState: voltha.ImageState_IMAGE_UNKNOWN,
483 },
484 }}
khenaidood948f772021-08-11 17:49:24 -0400485 return
486 }
487 ch <- resp.GetDeviceImageStates()
488 }(deviceID.GetId(), abortImageReq, respCh)
489
490 }
491
492 return dMgr.waitForAllResponses(ctx, "abort-image-upgrade-to-device", respCh, len(request.GetDeviceId()))
493}
494
495func (dMgr *Manager) GetOnuImages(ctx context.Context, id *common.ID) (*voltha.OnuImages, error) {
496 if id == nil || id.Id == "" {
497 return nil, status.Errorf(codes.InvalidArgument, "empty device id")
498 }
499
500 ctx = utils.WithRPCMetadataContext(ctx, "GetOnuImages")
501 log.EnrichSpan(ctx, log.Fields{"device-id": id.Id})
502 agent := dMgr.getDeviceAgent(ctx, id.Id)
503 if agent == nil {
504 return nil, status.Errorf(codes.NotFound, "%s", id.Id)
505 }
506
507 resp, err := agent.getOnuImages(ctx, id)
508 if err != nil {
509 return nil, err
510 }
511
512 logger.Debugw(ctx, "get-onu-images-result", log.Fields{"onu-image": resp.Items})
513
514 return resp, nil
515}
516
517func (dMgr *Manager) ActivateImage(ctx context.Context, request *voltha.DeviceImageRequest) (*voltha.DeviceImageResponse, error) {
518 if err := dMgr.validateImageRequest(request); err != nil {
519 return nil, err
520 }
521
522 ctx = utils.WithRPCMetadataContext(ctx, "ActivateImage")
523 respCh := make(chan []*voltha.DeviceImageState, len(request.GetDeviceId()))
524
525 for index, deviceID := range request.DeviceId {
526 // Create activate request per device
527 activateImageReq := &voltha.DeviceImageRequest{
528 Version: request.Version,
529 CommitOnSuccess: request.CommitOnSuccess,
530 }
531
532 //slice-out only single deviceID from the request
533 activateImageReq.DeviceId = request.DeviceId[index : index+1]
534
535 go func(deviceID string, req *voltha.DeviceImageRequest, ch chan []*voltha.DeviceImageState) {
536 agent := dMgr.getDeviceAgent(ctx, deviceID)
537 if agent == nil {
ssiddiqui9e120e92021-10-11 12:33:05 +0530538 logger.Errorw(ctx, "Device-agent-not-found", log.Fields{"device-id": deviceID})
539 ch <- []*voltha.DeviceImageState{{
540 DeviceId: deviceID,
541 ImageState: &voltha.ImageState{
542 Version: request.GetVersion(),
543 DownloadState: voltha.ImageState_DOWNLOAD_UNKNOWN,
544 Reason: voltha.ImageState_UNKNOWN_ERROR,
545 ImageState: voltha.ImageState_IMAGE_ACTIVATION_ABORTED,
546 },
547 }}
khenaidood948f772021-08-11 17:49:24 -0400548 return
549 }
550
551 resp, err := agent.activateImageOnDevice(ctx, req)
552 if err != nil {
553 logger.Errorw(ctx, "activate-image-failed", log.Fields{"device-id": deviceID, "error": err})
ssiddiqui9e120e92021-10-11 12:33:05 +0530554 ch <- []*voltha.DeviceImageState{{
555 DeviceId: deviceID,
556 ImageState: &voltha.ImageState{
557 Version: request.GetVersion(),
558 DownloadState: voltha.ImageState_DOWNLOAD_UNKNOWN,
559 Reason: voltha.ImageState_UNKNOWN_ERROR,
560 ImageState: voltha.ImageState_IMAGE_ACTIVATION_ABORTED,
561 },
562 }}
khenaidood948f772021-08-11 17:49:24 -0400563 return
564 }
565
566 err = dMgr.validateDeviceImageResponse(resp)
567 if err != nil {
568 logger.Errorw(ctx, "activate-image-failed", log.Fields{"device-id": deviceID, "error": err})
ssiddiqui9e120e92021-10-11 12:33:05 +0530569 ch <- []*voltha.DeviceImageState{{
570 DeviceId: deviceID,
571 ImageState: &voltha.ImageState{
572 Version: request.GetVersion(),
573 DownloadState: voltha.ImageState_DOWNLOAD_UNKNOWN,
574 Reason: voltha.ImageState_UNKNOWN_ERROR,
575 ImageState: voltha.ImageState_IMAGE_UNKNOWN,
576 },
577 }}
khenaidood948f772021-08-11 17:49:24 -0400578 return
579 }
580
581 ch <- resp.GetDeviceImageStates()
582 }(deviceID.GetId(), activateImageReq, respCh)
583
584 }
585
586 return dMgr.waitForAllResponses(ctx, "activate-image", respCh, len(request.GetDeviceId()))
587}
588
589func (dMgr *Manager) CommitImage(ctx context.Context, request *voltha.DeviceImageRequest) (*voltha.DeviceImageResponse, error) {
590 if err := dMgr.validateImageRequest(request); err != nil {
591 return nil, err
592 }
593
594 ctx = utils.WithRPCMetadataContext(ctx, "CommitImage")
595 respCh := make(chan []*voltha.DeviceImageState, len(request.GetDeviceId()))
596
597 for index, deviceID := range request.DeviceId {
598 // Create commit request per device
599 commitImageReq := &voltha.DeviceImageRequest{
600 Version: request.Version,
601 CommitOnSuccess: request.CommitOnSuccess,
602 }
603 //slice-out only single deviceID from the request
604 commitImageReq.DeviceId = request.DeviceId[index : index+1]
605
606 go func(deviceID string, req *voltha.DeviceImageRequest, ch chan []*voltha.DeviceImageState) {
607 agent := dMgr.getDeviceAgent(ctx, deviceID)
608 if agent == nil {
ssiddiqui9e120e92021-10-11 12:33:05 +0530609 logger.Errorw(ctx, "Device-agent-not-found", log.Fields{"device-id": deviceID})
610 ch <- []*voltha.DeviceImageState{{
611 DeviceId: deviceID,
612 ImageState: &voltha.ImageState{
613 Version: request.GetVersion(),
614 DownloadState: voltha.ImageState_DOWNLOAD_UNKNOWN,
615 Reason: voltha.ImageState_UNKNOWN_ERROR,
616 ImageState: voltha.ImageState_IMAGE_COMMIT_ABORTED,
617 },
618 }}
khenaidood948f772021-08-11 17:49:24 -0400619 return
620 }
621
622 resp, err := agent.commitImage(ctx, req)
623 if err != nil {
624 logger.Errorw(ctx, "commit-image-failed", log.Fields{"device-id": deviceID, "error": err})
ssiddiqui9e120e92021-10-11 12:33:05 +0530625 ch <- []*voltha.DeviceImageState{{
626 DeviceId: deviceID,
627 ImageState: &voltha.ImageState{
628 Version: request.GetVersion(),
629 DownloadState: voltha.ImageState_DOWNLOAD_UNKNOWN,
630 Reason: voltha.ImageState_UNKNOWN_ERROR,
631 ImageState: voltha.ImageState_IMAGE_COMMIT_ABORTED,
632 },
633 }}
khenaidood948f772021-08-11 17:49:24 -0400634 return
635 }
636
637 err = dMgr.validateDeviceImageResponse(resp)
638 if err != nil {
639 logger.Errorf(ctx, "commit-image-failed", log.Fields{"device-id": deviceID, "error": err})
ssiddiqui9e120e92021-10-11 12:33:05 +0530640 ch <- []*voltha.DeviceImageState{{
641 DeviceId: deviceID,
642 ImageState: &voltha.ImageState{
643 Version: request.GetVersion(),
644 DownloadState: voltha.ImageState_DOWNLOAD_UNKNOWN,
645 Reason: voltha.ImageState_UNKNOWN_ERROR,
646 ImageState: voltha.ImageState_IMAGE_UNKNOWN,
647 },
648 }}
khenaidood948f772021-08-11 17:49:24 -0400649 return
650 }
651 ch <- resp.GetDeviceImageStates()
652 }(deviceID.GetId(), commitImageReq, respCh)
653
654 }
655
656 return dMgr.waitForAllResponses(ctx, "commit-image", respCh, len(request.GetDeviceId()))
657}
658
659// convenience to avoid redefining
660var imageDownloadFailureResp = &voltha.ImageDownload{DownloadState: voltha.ImageDownload_DOWNLOAD_UNKNOWN}
661
662// GetImageDownloadStatus returns status of image download
663func (dMgr *Manager) GetImageDownloadStatus(ctx context.Context, img *voltha.ImageDownload) (*voltha.ImageDownload, error) {
664 ctx = utils.WithRPCMetadataContext(ctx, "GetImageDownloadStatus")
665 log.EnrichSpan(ctx, log.Fields{"device-id": img.Id})
666
nikesh.krishnandf10b2b2023-09-29 21:24:52 +0530667 logger.Info(ctx, "get-image-download-status", log.Fields{"device-id": img.Id, "image-name": img.Name})
khenaidood948f772021-08-11 17:49:24 -0400668 agent := dMgr.getDeviceAgent(ctx, img.Id)
669 if agent == nil {
670 return imageDownloadFailureResp, status.Errorf(codes.NotFound, "%s", img.Id)
671 }
672 resp, err := agent.getImageDownloadStatus(ctx, img)
673 if err != nil {
674 return imageDownloadFailureResp, err
675 }
676 return resp, nil
677}
678
679// GetImageDownload returns image download
680func (dMgr *Manager) GetImageDownload(ctx context.Context, img *voltha.ImageDownload) (*voltha.ImageDownload, error) {
681 ctx = utils.WithRPCMetadataContext(ctx, "GetImageDownload")
682 log.EnrichSpan(ctx, log.Fields{"device-id": img.Id})
683
nikesh.krishnandf10b2b2023-09-29 21:24:52 +0530684 logger.Info(ctx, "get-image-download", log.Fields{"device-id": img.Id, "image-name": img.Name})
khenaidood948f772021-08-11 17:49:24 -0400685 agent := dMgr.getDeviceAgent(ctx, img.Id)
686 if agent == nil {
687 return imageDownloadFailureResp, status.Errorf(codes.NotFound, "%s", img.Id)
688 }
689 resp, err := agent.getImageDownload(ctx, img)
690 if err != nil {
691 return imageDownloadFailureResp, err
692 }
693 return resp, nil
694}
695
696// ListImageDownloads returns image downloads
697func (dMgr *Manager) ListImageDownloads(ctx context.Context, id *voltha.ID) (*voltha.ImageDownloads, error) {
698 ctx = utils.WithRPCMetadataContext(ctx, "ListImageDownloads")
699 log.EnrichSpan(ctx, log.Fields{"device-id": id.Id})
700
701 logger.Debugw(ctx, "list-image-downloads", log.Fields{"device-id": id.Id})
702 agent := dMgr.getDeviceAgent(ctx, id.Id)
703 if agent == nil {
704 return &voltha.ImageDownloads{Items: []*voltha.ImageDownload{imageDownloadFailureResp}}, status.Errorf(codes.NotFound, "%s", id.Id)
705 }
706 resp, err := agent.listImageDownloads(ctx, id.Id)
707 if err != nil {
708 return &voltha.ImageDownloads{Items: []*voltha.ImageDownload{imageDownloadFailureResp}}, err
709 }
710 return resp, nil
711}
712
713// GetImages returns all images for a specific device entry
714func (dMgr *Manager) GetImages(ctx context.Context, id *voltha.ID) (*voltha.Images, error) {
715 ctx = utils.WithRPCMetadataContext(ctx, "GetImages")
716 log.EnrichSpan(ctx, log.Fields{"device-id": id.Id})
717
nikesh.krishnandf10b2b2023-09-29 21:24:52 +0530718 logger.Info(ctx, "get-images", log.Fields{"device-id": id.Id})
khenaidood948f772021-08-11 17:49:24 -0400719 device, err := dMgr.getDeviceReadOnly(ctx, id.Id)
720 if err != nil {
721 return nil, err
722 }
723 return device.Images, nil
724}
725
726// ListDevicePorts returns the ports details for a specific device entry
727func (dMgr *Manager) ListDevicePorts(ctx context.Context, id *voltha.ID) (*voltha.Ports, error) {
728 ctx = utils.WithRPCMetadataContext(ctx, "ListDevicePorts")
729 log.EnrichSpan(ctx, log.Fields{"device-id": id.Id})
730
731 logger.Debugw(ctx, "list-device-ports", log.Fields{"device-id": id.Id})
732 agent := dMgr.getDeviceAgent(ctx, id.Id)
733 if agent == nil {
734 return nil, status.Errorf(codes.NotFound, "device-%s", id.Id)
735 }
736
737 ports := agent.listDevicePorts()
738 ctr, ret := 0, make([]*voltha.Port, len(ports))
739 for _, port := range ports {
740 ret[ctr] = port
741 ctr++
742 }
743 return &voltha.Ports{Items: ret}, nil
744}
745
746// ListDevicePmConfigs returns pm configs of device
747func (dMgr *Manager) ListDevicePmConfigs(ctx context.Context, id *voltha.ID) (*voltha.PmConfigs, error) {
748 ctx = utils.WithRPCMetadataContext(ctx, "ListDevicePmConfigs")
749 log.EnrichSpan(ctx, log.Fields{"device-id": id.Id})
750
751 agent := dMgr.getDeviceAgent(ctx, id.Id)
752 if agent == nil {
753 return nil, status.Errorf(codes.NotFound, "%s", id.Id)
754 }
755 return agent.listPmConfigs(ctx)
756}
757
758// UpdateDevicePmConfigs updates the PM configs. This is executed when the northbound gRPC API is invoked, typically
759// following a user action
760func (dMgr *Manager) UpdateDevicePmConfigs(ctx context.Context, configs *voltha.PmConfigs) (*empty.Empty, error) {
761 ctx = utils.WithRPCMetadataContext(ctx, "UpdateDevicePmConfigs")
762 log.EnrichSpan(ctx, log.Fields{"device-id": configs.Id})
763
764 if configs.Id == "" {
765 return nil, status.Error(codes.FailedPrecondition, "invalid-device-Id")
766 }
767 agent := dMgr.getDeviceAgent(ctx, configs.Id)
768 if agent == nil {
769 return nil, status.Errorf(codes.NotFound, "%s", configs.Id)
770 }
771 return &empty.Empty{}, agent.updatePmConfigs(ctx, configs)
772}
773
774// ListDeviceFlows returns the flow details for a specific device entry
775func (dMgr *Manager) ListDeviceFlows(ctx context.Context, id *voltha.ID) (*ofp.Flows, error) {
776 ctx = utils.WithRPCMetadataContext(ctx, "ListDeviceFlows")
777 log.EnrichSpan(ctx, log.Fields{"device-id": id.Id})
778 logger.Debugw(ctx, "list-device-flows", log.Fields{"device-id": id.Id})
779 agent := dMgr.getDeviceAgent(ctx, id.Id)
780 if agent == nil {
781 return nil, status.Errorf(codes.NotFound, "device-%s", id.Id)
782 }
783
784 flows := agent.listDeviceFlows()
785 ctr, ret := 0, make([]*ofp.OfpFlowStats, len(flows))
786 for _, flow := range flows {
787 ret[ctr] = flow
788 ctr++
789 }
790 return &ofp.Flows{Items: ret}, nil
791}
792
793// ListDeviceFlowGroups returns the flow group details for a specific device entry
khenaidoo9beaaf12021-10-19 17:32:01 -0400794func (dMgr *Manager) ListDeviceFlowGroups(ctx context.Context, id *voltha.ID) (*ofp.FlowGroups, error) {
khenaidood948f772021-08-11 17:49:24 -0400795 ctx = utils.WithRPCMetadataContext(ctx, "ListDeviceFlowGroups")
796 log.EnrichSpan(ctx, log.Fields{"device-id": id.Id})
797 logger.Debugw(ctx, "list-device-flow-groups", log.Fields{"device-id": id.Id})
798 agent := dMgr.getDeviceAgent(ctx, id.Id)
799 if agent == nil {
800 return nil, status.Errorf(codes.NotFound, "device-%s", id.Id)
801 }
802 groups := agent.listDeviceGroups()
803 ctr, ret := 0, make([]*ofp.OfpGroupEntry, len(groups))
804 for _, group := range groups {
805 ret[ctr] = group
806 ctr++
807 }
khenaidoo9beaaf12021-10-19 17:32:01 -0400808 return &ofp.FlowGroups{Items: ret}, nil
khenaidood948f772021-08-11 17:49:24 -0400809}
810
811func (dMgr *Manager) EnablePort(ctx context.Context, port *voltha.Port) (*empty.Empty, error) {
812 ctx = utils.WithRPCMetadataContext(ctx, "EnablePort")
813 log.EnrichSpan(ctx, log.Fields{"device-id": port.DeviceId})
814
nikesh.krishnandf10b2b2023-09-29 21:24:52 +0530815 logger.Info(ctx, "enable-port", log.Fields{"device-id": port.DeviceId, "port-no": port.PortNo})
khenaidood948f772021-08-11 17:49:24 -0400816 agent := dMgr.getDeviceAgent(ctx, port.DeviceId)
817 if agent == nil {
818 return nil, status.Errorf(codes.NotFound, "%s", port.DeviceId)
819 }
820 return &empty.Empty{}, agent.enablePort(ctx, port.PortNo)
821}
822
823func (dMgr *Manager) DisablePort(ctx context.Context, port *voltha.Port) (*empty.Empty, error) {
824 ctx = utils.WithRPCMetadataContext(ctx, "DisablePort")
825 log.EnrichSpan(ctx, log.Fields{"device-id": port.DeviceId})
826
nikesh.krishnandf10b2b2023-09-29 21:24:52 +0530827 logger.Info(ctx, "disable-port", log.Fields{"device-id": port.DeviceId, "port-no": port.PortNo})
khenaidood948f772021-08-11 17:49:24 -0400828 agent := dMgr.getDeviceAgent(ctx, port.DeviceId)
829 if agent == nil {
830 return nil, status.Errorf(codes.NotFound, "%s", port.DeviceId)
831 }
832 return &empty.Empty{}, agent.disablePort(ctx, port.PortNo)
833}
834
khenaidoo9beaaf12021-10-19 17:32:01 -0400835func (dMgr *Manager) GetExtValue(ctx context.Context, value *extension.ValueSpecifier) (*extension.ReturnValues, error) {
khenaidood948f772021-08-11 17:49:24 -0400836 ctx = utils.WithRPCMetadataContext(ctx, "GetExtValue")
837 log.EnrichSpan(ctx, log.Fields{"device-id": value.Id})
838
nikesh.krishnandf10b2b2023-09-29 21:24:52 +0530839 logger.Info(ctx, "get-ext-value", log.Fields{"onu-id": value.Id})
khenaidood948f772021-08-11 17:49:24 -0400840 cDevice, err := dMgr.getDeviceReadOnly(ctx, value.Id)
841 if err != nil {
842 return nil, status.Errorf(codes.Aborted, "%s", err.Error())
843 }
844 pDevice, err := dMgr.getDeviceReadOnly(ctx, cDevice.ParentId)
845 if err != nil {
846 return nil, status.Errorf(codes.Aborted, "%s", err.Error())
847 }
848 if agent := dMgr.getDeviceAgent(ctx, cDevice.ParentId); agent != nil {
849 resp, err := agent.getExtValue(ctx, pDevice, cDevice, value)
850 if err != nil {
851 return nil, err
852 }
nikesh.krishnandf10b2b2023-09-29 21:24:52 +0530853 logger.Info(ctx, "get-ext-value-result", log.Fields{"result": resp})
khenaidood948f772021-08-11 17:49:24 -0400854 return resp, nil
855 }
856 return nil, status.Errorf(codes.NotFound, "%s", value.Id)
857
858}
859
860// SetExtValue set some given configs or value
khenaidoo9beaaf12021-10-19 17:32:01 -0400861func (dMgr *Manager) SetExtValue(ctx context.Context, value *extension.ValueSet) (*empty.Empty, error) {
khenaidood948f772021-08-11 17:49:24 -0400862 ctx = utils.WithRPCMetadataContext(ctx, "SetExtValue")
nikesh.krishnandf10b2b2023-09-29 21:24:52 +0530863 logger.Info(ctx, "set-ext-value", log.Fields{"onu-id": value.Id})
khenaidood948f772021-08-11 17:49:24 -0400864
865 device, err := dMgr.getDeviceReadOnly(ctx, value.Id)
866 if err != nil {
867 return nil, status.Errorf(codes.Aborted, "%s", err.Error())
868 }
869 if agent := dMgr.getDeviceAgent(ctx, device.Id); agent != nil {
870 resp, err := agent.setExtValue(ctx, device, value)
871 if err != nil {
872 return nil, err
873 }
nikesh.krishnandf10b2b2023-09-29 21:24:52 +0530874 logger.Info(ctx, "set-ext-value-result", log.Fields{"result": resp})
khenaidood948f772021-08-11 17:49:24 -0400875 return resp, nil
876 }
877 return nil, status.Errorf(codes.NotFound, "%s", value.Id)
878
879}
880
khenaidoo9beaaf12021-10-19 17:32:01 -0400881func (dMgr *Manager) StartOmciTestAction(ctx context.Context, request *omci.OmciTestRequest) (*omci.TestResponse, error) {
khenaidood948f772021-08-11 17:49:24 -0400882 ctx = utils.WithRPCMetadataContext(ctx, "StartOmciTestAction")
883 log.EnrichSpan(ctx, log.Fields{"device-id": request.Id})
884
885 logger.Debugw(ctx, "start-omci-test-action", log.Fields{"device-id": request.Id, "uuid": request.Uuid})
886 agent := dMgr.getDeviceAgent(ctx, request.Id)
887 if agent == nil {
888 return nil, status.Errorf(codes.NotFound, "%s", request.Id)
889 }
890 return agent.startOmciTest(ctx, request)
891}
892
893func (dMgr *Manager) SimulateAlarm(ctx context.Context, simulateReq *voltha.SimulateAlarmRequest) (*common.OperationResp, error) {
894 ctx = utils.WithRPCMetadataContext(ctx, "SimulateAlarm")
895
896 logger.Debugw(ctx, "simulate-alarm", log.Fields{"id": simulateReq.Id, "indicator": simulateReq.Indicator, "intf-id": simulateReq.IntfId,
897 "port-type-name": simulateReq.PortTypeName, "onu-device-id": simulateReq.OnuDeviceId, "inverse-bit-error-rate": simulateReq.InverseBitErrorRate,
898 "drift": simulateReq.Drift, "new-eqd": simulateReq.NewEqd, "onu-serial-number": simulateReq.OnuSerialNumber, "operation": simulateReq.Operation})
899 agent := dMgr.getDeviceAgent(ctx, simulateReq.Id)
900 if agent == nil {
901 return nil, status.Errorf(codes.NotFound, "%s", simulateReq.Id)
902 }
903 if err := agent.simulateAlarm(ctx, simulateReq); err != nil {
904 return nil, err
905 }
906 return &common.OperationResp{Code: common.OperationResp_OPERATION_SUCCESS}, nil
907}
yasin sapli8fe47e42023-06-09 21:19:00 +0000908
909func (dMgr *Manager) PutVoipUserProfile(ctx context.Context, voipUserProfileRequest *voip_user_profile.VoipUserProfileRequest) (*empty.Empty, error) {
910 return nil, status.Error(codes.Unimplemented, "put-voip-user-profile-not-implemented")
911}
912
913func (dMgr *Manager) DeleteVoipUserProfile(ctx context.Context, key *common.Key) (*empty.Empty, error) {
914 return nil, status.Error(codes.Unimplemented, "delete-voip-user-profile-not-implemented")
915}
916
917func (dMgr *Manager) PutVoipSystemProfile(ctx context.Context, voipSystemProfileRequest *voip_system_profile.VoipSystemProfileRequest) (*empty.Empty, error) {
918 return nil, status.Error(codes.Unimplemented, "put-voip-system-profile-not-implemented")
919}
920
921func (dMgr *Manager) DeleteVoipSystemProfile(ctx context.Context, key *common.Key) (*empty.Empty, error) {
922 return nil, status.Error(codes.Unimplemented, "delete-voip-system-profile-not-implemented")
923}