blob: 0fda20e763f5b3e15987193bdcf85c13f70f0105 [file] [log] [blame]
Mahir Gunyelfa6ea272020-06-10 17:03:51 -07001/*
2 * Copyright 2018-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 */
16
17package device
18
19import (
20 "context"
khenaidood948f772021-08-11 17:49:24 -040021 "errors"
22 "time"
ssiddiquif076cb82021-04-23 10:47:04 +053023
khenaidood948f772021-08-11 17:49:24 -040024 ic "github.com/opencord/voltha-protos/v5/go/inter_container"
25
26 "github.com/opencord/voltha-protos/v5/go/common"
Mahir Gunyelfa6ea272020-06-10 17:03:51 -070027
28 "github.com/gogo/protobuf/proto"
Himani Chawlab4c25912020-11-12 17:16:38 +053029 coreutils "github.com/opencord/voltha-go/rw_core/utils"
khenaidood948f772021-08-11 17:49:24 -040030 "github.com/opencord/voltha-lib-go/v7/pkg/log"
31 "github.com/opencord/voltha-protos/v5/go/voltha"
Mahir Gunyelfa6ea272020-06-10 17:03:51 -070032 "google.golang.org/grpc/codes"
33 "google.golang.org/grpc/status"
34)
35
Andrea Campanella025667e2021-01-14 11:50:07 +010036func (agent *Agent) downloadImage(ctx context.Context, img *voltha.ImageDownload) (*common.OperationResp, error) {
khenaidood948f772021-08-11 17:49:24 -040037 var err error
38 var desc string
39 var prevAdminState, currAdminState common.AdminState_Types
40 operStatus := &common.OperationResp{Code: common.OperationResp_OPERATION_FAILURE}
41 defer func() { agent.logDeviceUpdate(ctx, &prevAdminState, &currAdminState, operStatus, err, desc) }()
42
Mahir Gunyelfa6ea272020-06-10 17:03:51 -070043 if err := agent.requestQueue.WaitForGreenLight(ctx); err != nil {
44 return nil, err
45 }
Himani Chawlab4c25912020-11-12 17:16:38 +053046 logger.Debugw(ctx, "download-image", log.Fields{"device-id": agent.deviceID})
Mahir Gunyelfa6ea272020-06-10 17:03:51 -070047
Andrea Campanella025667e2021-01-14 11:50:07 +010048 if agent.device.Root {
Maninder0aabf0c2021-03-17 14:55:14 +053049 agent.requestQueue.RequestComplete()
khenaidood948f772021-08-11 17:49:24 -040050 err = status.Errorf(codes.FailedPrecondition, "device-id:%s, is an OLT. Image update "+
Andrea Campanella025667e2021-01-14 11:50:07 +010051 "not supported by VOLTHA. Use Device Manager or other means", agent.deviceID)
khenaidood948f772021-08-11 17:49:24 -040052 return nil, err
Mahir Gunyelfa6ea272020-06-10 17:03:51 -070053 }
Maninder2195ccc2021-06-23 20:23:01 +053054
55 device := agent.cloneDeviceWithoutLock()
56
57 if !agent.proceedWithRequest(device) {
Maninder0aabf0c2021-03-17 14:55:14 +053058 agent.requestQueue.RequestComplete()
khenaidood948f772021-08-11 17:49:24 -040059 err = status.Errorf(codes.FailedPrecondition, "%s", "cannot complete operation as device deletion is in progress or reconciling is in progress/failed")
60 return nil, err
Maninder0aabf0c2021-03-17 14:55:14 +053061 }
Andrea Campanella025667e2021-01-14 11:50:07 +010062
Andrea Campanella025667e2021-01-14 11:50:07 +010063 if device.ImageDownloads != nil {
64 for _, image := range device.ImageDownloads {
65 if image.DownloadState == voltha.ImageDownload_DOWNLOAD_REQUESTED {
khenaidood948f772021-08-11 17:49:24 -040066 err = status.Errorf(codes.FailedPrecondition, "device-id:%s, already downloading image:%s",
Andrea Campanella025667e2021-01-14 11:50:07 +010067 agent.deviceID, image.Name)
khenaidood948f772021-08-11 17:49:24 -040068 agent.requestQueue.RequestComplete()
69 return nil, err
Andrea Campanella025667e2021-01-14 11:50:07 +010070 }
71 }
Kent Hagermanf6db9f12020-07-22 17:16:19 -040072 }
73
Mahir Gunyelfa6ea272020-06-10 17:03:51 -070074 // Save the image
75 clonedImg := proto.Clone(img).(*voltha.ImageDownload)
76 clonedImg.DownloadState = voltha.ImageDownload_DOWNLOAD_REQUESTED
Kent Hagermanf6db9f12020-07-22 17:16:19 -040077 cloned := agent.cloneDeviceWithoutLock()
Andrea Campanellac05c4c42021-02-11 10:25:28 +010078 _, index, err := getImage(img, device)
79 if err != nil {
Andrey Pozolotin34dd63f2021-05-31 21:26:40 +030080 cloned.ImageDownloads = append(cloned.ImageDownloads, clonedImg)
Andrea Campanellac05c4c42021-02-11 10:25:28 +010081 } else {
82 cloned.ImageDownloads[index] = clonedImg
83 }
Mahir Gunyelfa6ea272020-06-10 17:03:51 -070084
Kent Hagermanf6db9f12020-07-22 17:16:19 -040085 // Send the request to the adapter
khenaidood948f772021-08-11 17:49:24 -040086 client, err := agent.adapterMgr.GetAdapterClient(ctx, agent.adapterEndpoint)
Kent Hagermanf6db9f12020-07-22 17:16:19 -040087 if err != nil {
khenaidood948f772021-08-11 17:49:24 -040088 logger.Errorw(ctx, "grpc-client-nil",
89 log.Fields{
90 "error": err,
91 "device-id": agent.deviceID,
92 "device-type": agent.deviceType,
93 "adapter-endpoint": device.AdapterEndpoint,
94 })
95 agent.requestQueue.RequestComplete()
Kent Hagermanf6db9f12020-07-22 17:16:19 -040096 return nil, err
97 }
khenaidood948f772021-08-11 17:49:24 -040098 subCtx, cancel := context.WithTimeout(log.WithSpanFromContext(context.Background(), ctx), agent.rpcTimeout)
99 subCtx = coreutils.WithRPCMetadataFromContext(subCtx, ctx)
100 operStatus.Code = common.OperationResp_OPERATION_IN_PROGRESS
101 go func() {
102 defer cancel()
103 response, err := client.DownloadImage(subCtx, &ic.ImageDownloadMessage{
104 Device: cloned,
105 Image: clonedImg,
106 })
107 if err == nil {
108 agent.onImageSuccess(subCtx, response)
109 } else {
110 agent.onImageFailure(subCtx, err)
111 }
112 }()
Kent Hagermanf6db9f12020-07-22 17:16:19 -0400113
khenaidood948f772021-08-11 17:49:24 -0400114 cloned.AdminState = voltha.AdminState_DOWNLOADING_IMAGE
115 if err = agent.updateDeviceAndReleaseLock(ctx, cloned); err != nil {
116 return nil, err
117 }
Andrea Campanella025667e2021-01-14 11:50:07 +0100118 return &common.OperationResp{Code: voltha.OperationResp_OPERATION_SUCCESS}, nil
Mahir Gunyelfa6ea272020-06-10 17:03:51 -0700119}
120
Andrea Campanella025667e2021-01-14 11:50:07 +0100121// getImage is a helper method to figure out if an image is already registered
122func getImage(img *voltha.ImageDownload, device *voltha.Device) (*voltha.ImageDownload, int, error) {
123 for pos, image := range device.ImageDownloads {
Mahir Gunyelfa6ea272020-06-10 17:03:51 -0700124 if image.Id == img.Id && image.Name == img.Name {
Andrea Campanella025667e2021-01-14 11:50:07 +0100125 return image, pos, nil
Mahir Gunyelfa6ea272020-06-10 17:03:51 -0700126 }
127 }
Andrea Campanella025667e2021-01-14 11:50:07 +0100128 return nil, -1, status.Errorf(codes.FailedPrecondition, "device-id:%s, image-not-registered:%s",
129 device.Id, img.Name)
Mahir Gunyelfa6ea272020-06-10 17:03:51 -0700130}
131
Andrea Campanella025667e2021-01-14 11:50:07 +0100132func (agent *Agent) cancelImageDownload(ctx context.Context, img *voltha.ImageDownload) (*common.OperationResp, error) {
khenaidood948f772021-08-11 17:49:24 -0400133
134 var err error
135 var desc string
136 var prevAdminState, currAdminState common.AdminState_Types
137 operStatus := &common.OperationResp{Code: common.OperationResp_OPERATION_FAILURE}
138 defer func() { agent.logDeviceUpdate(ctx, &prevAdminState, &currAdminState, operStatus, err, desc) }()
139
140 if err = agent.requestQueue.WaitForGreenLight(ctx); err != nil {
Mahir Gunyelfa6ea272020-06-10 17:03:51 -0700141 return nil, err
142 }
Himani Chawlab4c25912020-11-12 17:16:38 +0530143 logger.Debugw(ctx, "cancel-image-download", log.Fields{"device-id": agent.deviceID})
Mahir Gunyelfa6ea272020-06-10 17:03:51 -0700144
Maninder2195ccc2021-06-23 20:23:01 +0530145 cloned := agent.cloneDeviceWithoutLock()
146
147 if !agent.proceedWithRequest(cloned) {
Maninder0aabf0c2021-03-17 14:55:14 +0530148 agent.requestQueue.RequestComplete()
khenaidood948f772021-08-11 17:49:24 -0400149 err = status.Errorf(codes.FailedPrecondition, "%s", "cannot complete operation as device deletion is in progress or reconciling is in progress/failed")
150 return nil, err
Maninder0aabf0c2021-03-17 14:55:14 +0530151 }
152
Mahir Gunyelfa6ea272020-06-10 17:03:51 -0700153 // Update image download state
Andrea Campanella025667e2021-01-14 11:50:07 +0100154 _, index, err := getImage(img, cloned)
155 if err != nil {
156 agent.requestQueue.RequestComplete()
157 return nil, err
Mahir Gunyelfa6ea272020-06-10 17:03:51 -0700158 }
khenaidood948f772021-08-11 17:49:24 -0400159 prevAdminState = cloned.AdminState
Andrea Campanella025667e2021-01-14 11:50:07 +0100160 cloned.ImageDownloads[index].DownloadState = voltha.ImageDownload_DOWNLOAD_CANCELLED
161
Kent Hagermanf6db9f12020-07-22 17:16:19 -0400162 if cloned.AdminState != voltha.AdminState_DOWNLOADING_IMAGE {
khenaidood948f772021-08-11 17:49:24 -0400163 err = status.Errorf(codes.Aborted, "device not in image download state %s", cloned.Id)
Kent Hagermanf6db9f12020-07-22 17:16:19 -0400164 agent.requestQueue.RequestComplete()
khenaidood948f772021-08-11 17:49:24 -0400165 return &voltha.OperationResp{Code: voltha.OperationResp_OPERATION_FAILURE}, err
Mahir Gunyelfa6ea272020-06-10 17:03:51 -0700166 }
khenaidood948f772021-08-11 17:49:24 -0400167 client, err := agent.adapterMgr.GetAdapterClient(ctx, agent.adapterEndpoint)
168 if err != nil {
169 logger.Errorw(ctx, "grpc-client-nil",
170 log.Fields{
171 "error": err,
172 "device-id": agent.deviceID,
173 "device-type": agent.deviceType,
174 "adapter-endpoint": cloned.AdapterEndpoint,
175 })
176 agent.requestQueue.RequestComplete()
177 return nil, err
178 }
179 subCtx, cancel := context.WithTimeout(log.WithSpanFromContext(context.Background(), ctx), agent.rpcTimeout)
180 subCtx = coreutils.WithRPCMetadataFromContext(subCtx, ctx)
181 operStatus.Code = common.OperationResp_OPERATION_IN_PROGRESS
182 go func() {
183 defer cancel()
184 response, err := client.CancelImageDownload(subCtx, &ic.ImageDownloadMessage{
185 Device: cloned,
186 Image: img,
187 })
188 if err == nil {
189 agent.onImageSuccess(subCtx, response)
190 } else {
191 agent.onImageFailure(subCtx, err)
192 }
193 }()
194
195 // Set the device to Enabled
196 cloned.AdminState = voltha.AdminState_ENABLED
197 if err := agent.updateDeviceAndReleaseLock(ctx, cloned); err != nil {
198 return nil, err
199 }
200 currAdminState = cloned.AdminState
201
Mahir Gunyelfa6ea272020-06-10 17:03:51 -0700202 return &voltha.OperationResp{Code: voltha.OperationResp_OPERATION_SUCCESS}, nil
203}
204
205func (agent *Agent) activateImage(ctx context.Context, img *voltha.ImageDownload) (*voltha.OperationResp, error) {
khenaidood948f772021-08-11 17:49:24 -0400206 var err error
207 var desc string
208 operStatus := &common.OperationResp{Code: common.OperationResp_OPERATION_FAILURE}
209 defer func() { agent.logDeviceUpdate(ctx, nil, nil, operStatus, err, desc) }()
210
211 if err = agent.requestQueue.WaitForGreenLight(ctx); err != nil {
Mahir Gunyelfa6ea272020-06-10 17:03:51 -0700212 return nil, err
213 }
Himani Chawlab4c25912020-11-12 17:16:38 +0530214 logger.Debugw(ctx, "activate-image", log.Fields{"device-id": agent.deviceID})
Mahir Gunyelfa6ea272020-06-10 17:03:51 -0700215
Maninder2195ccc2021-06-23 20:23:01 +0530216 cloned := agent.cloneDeviceWithoutLock()
217
218 if !agent.proceedWithRequest(cloned) {
khenaidood948f772021-08-11 17:49:24 -0400219 err = status.Errorf(codes.FailedPrecondition, "%s", "cannot complete operation as device deletion is in progress or reconciling is in progress/failed")
Maninder0aabf0c2021-03-17 14:55:14 +0530220 agent.requestQueue.RequestComplete()
khenaidood948f772021-08-11 17:49:24 -0400221 return nil, err
Maninder0aabf0c2021-03-17 14:55:14 +0530222 }
223
Andrea Campanella025667e2021-01-14 11:50:07 +0100224 // Update image download state
Andrea Campanella025667e2021-01-14 11:50:07 +0100225 image, index, err := getImage(img, cloned)
226 if err != nil {
227 agent.requestQueue.RequestComplete()
228 return nil, err
229 }
230
Andrea Campanella025667e2021-01-14 11:50:07 +0100231 if image.DownloadState != voltha.ImageDownload_DOWNLOAD_SUCCEEDED {
232 agent.requestQueue.RequestComplete()
khenaidood948f772021-08-11 17:49:24 -0400233 err = status.Errorf(codes.FailedPrecondition, "device-id:%s, device-has-not-downloaded-image:%s", agent.deviceID, img.Name)
234 return nil, err
Andrea Campanella025667e2021-01-14 11:50:07 +0100235 }
236
237 //TODO does this need to be removed ?
238 if cloned.AdminState == voltha.AdminState_DOWNLOADING_IMAGE {
Kent Hagermanf6db9f12020-07-22 17:16:19 -0400239 agent.requestQueue.RequestComplete()
khenaidood948f772021-08-11 17:49:24 -0400240 err = status.Errorf(codes.FailedPrecondition, "device-id:%s, device-in-downloading-state:%s", agent.deviceID, img.Name)
241 return nil, err
Mahir Gunyelfa6ea272020-06-10 17:03:51 -0700242 }
Kent Hagermanf6db9f12020-07-22 17:16:19 -0400243
khenaidood948f772021-08-11 17:49:24 -0400244 // Update the image
Andrea Campanella025667e2021-01-14 11:50:07 +0100245 cloned.ImageDownloads[index].ImageState = voltha.ImageDownload_IMAGE_ACTIVATING
Kent Hagermanf6db9f12020-07-22 17:16:19 -0400246 cloned.AdminState = voltha.AdminState_DOWNLOADING_IMAGE
khenaidood948f772021-08-11 17:49:24 -0400247
248 // Send the request to the adapter
249 client, err := agent.adapterMgr.GetAdapterClient(ctx, agent.adapterEndpoint)
250 if err != nil {
251 logger.Errorw(ctx, "grpc-client-nil",
252 log.Fields{
253 "error": err,
254 "device-id": agent.deviceID,
255 "device-type": agent.deviceType,
256 "adapter-endpoint": cloned.AdapterEndpoint,
257 })
258 return nil, err
259 }
260 subCtx, cancel := context.WithTimeout(log.WithSpanFromContext(context.Background(), ctx), agent.rpcTimeout)
261 subCtx = coreutils.WithRPCMetadataFromContext(subCtx, ctx)
262 operStatus.Code = common.OperationResp_OPERATION_IN_PROGRESS
263 go func() {
264 defer cancel()
265 response, err := client.ActivateImageUpdate(subCtx, &ic.ImageDownloadMessage{
266 Device: cloned,
267 Image: img,
268 })
269 if err == nil {
270 agent.onImageSuccess(subCtx, response)
271 } else {
272 agent.onImageFailure(subCtx, err)
273 }
274 }()
275
276 // Save the image
Kent Hagermanf6db9f12020-07-22 17:16:19 -0400277 if err := agent.updateDeviceAndReleaseLock(ctx, cloned); err != nil {
Mahir Gunyelfa6ea272020-06-10 17:03:51 -0700278 return nil, err
279 }
280
Mahir Gunyelfa6ea272020-06-10 17:03:51 -0700281 // The status of the AdminState will be changed following the update_download_status response from the adapter
282 // The image name will also be removed from the device list
283 return &voltha.OperationResp{Code: voltha.OperationResp_OPERATION_SUCCESS}, nil
284}
285
286func (agent *Agent) revertImage(ctx context.Context, img *voltha.ImageDownload) (*voltha.OperationResp, error) {
khenaidood948f772021-08-11 17:49:24 -0400287 var err error
288 var desc string
289 operStatus := &common.OperationResp{Code: common.OperationResp_OPERATION_FAILURE}
290 defer func() { agent.logDeviceUpdate(ctx, nil, nil, operStatus, err, desc) }()
291
292 if err = agent.requestQueue.WaitForGreenLight(ctx); err != nil {
Mahir Gunyelfa6ea272020-06-10 17:03:51 -0700293 return nil, err
294 }
Himani Chawlab4c25912020-11-12 17:16:38 +0530295 logger.Debugw(ctx, "revert-image", log.Fields{"device-id": agent.deviceID})
Mahir Gunyelfa6ea272020-06-10 17:03:51 -0700296
Andrea Campanella025667e2021-01-14 11:50:07 +0100297 cloned := agent.cloneDeviceWithoutLock()
khenaidood948f772021-08-11 17:49:24 -0400298 if !agent.proceedWithRequest(cloned) {
299 agent.requestQueue.RequestComplete()
300 err = status.Errorf(codes.FailedPrecondition, "%s", "cannot complete operation as device deletion is in progress or reconciling is in progress/failed")
301 return nil, err
302 }
303
304 // Update image download state
Andrea Campanella025667e2021-01-14 11:50:07 +0100305 _, index, err := getImage(img, cloned)
306 if err != nil {
Kent Hagermanf6db9f12020-07-22 17:16:19 -0400307 agent.requestQueue.RequestComplete()
khenaidood948f772021-08-11 17:49:24 -0400308 err = status.Errorf(codes.FailedPrecondition, "deviceId:%s, image-not-registered:%s", agent.deviceID, img.Name)
309 return nil, err
Mahir Gunyelfa6ea272020-06-10 17:03:51 -0700310 }
Andrea Campanella025667e2021-01-14 11:50:07 +0100311 if cloned.AdminState != voltha.AdminState_ENABLED {
Kent Hagermanf6db9f12020-07-22 17:16:19 -0400312 agent.requestQueue.RequestComplete()
khenaidood948f772021-08-11 17:49:24 -0400313 err = status.Errorf(codes.FailedPrecondition, "deviceId:%s, device-not-enabled-state:%s", agent.deviceID, img.Name)
314 return nil, err
Mahir Gunyelfa6ea272020-06-10 17:03:51 -0700315 }
Andrea Campanella025667e2021-01-14 11:50:07 +0100316
317 cloned.ImageDownloads[index].ImageState = voltha.ImageDownload_IMAGE_REVERTING
khenaidood948f772021-08-11 17:49:24 -0400318 // Send the request to the adapter
319 client, err := agent.adapterMgr.GetAdapterClient(ctx, agent.adapterEndpoint)
320 if err != nil {
321 logger.Errorw(ctx, "grpc-client-nil",
322 log.Fields{
323 "error": err,
324 "device-id": agent.deviceID,
325 "device-type": agent.deviceType,
326 "adapter-endpoint": cloned.AdapterEndpoint,
327 })
328 agent.requestQueue.RequestComplete()
329 return nil, err
330 }
331 subCtx, cancel := context.WithTimeout(log.WithSpanFromContext(context.Background(), ctx), agent.rpcTimeout)
332 subCtx = coreutils.WithRPCMetadataFromContext(subCtx, ctx)
333 operStatus.Code = common.OperationResp_OPERATION_IN_PROGRESS
334 go func() {
335 defer cancel()
336 _, err := client.RevertImageUpdate(subCtx, &ic.ImageDownloadMessage{
337 Device: cloned,
338 Image: img,
339 })
340 if err == nil {
341 agent.onSuccess(subCtx, nil, nil, true)
342 } else {
343 agent.onFailure(subCtx, err, nil, nil, true)
344 }
345 }()
Mahir Gunyelfa6ea272020-06-10 17:03:51 -0700346
khenaidood948f772021-08-11 17:49:24 -0400347 // Save data
Kent Hagermanf6db9f12020-07-22 17:16:19 -0400348 if err := agent.updateDeviceAndReleaseLock(ctx, cloned); err != nil {
Mahir Gunyelfa6ea272020-06-10 17:03:51 -0700349 return nil, err
350 }
351
Mahir Gunyelfa6ea272020-06-10 17:03:51 -0700352 return &voltha.OperationResp{Code: voltha.OperationResp_OPERATION_SUCCESS}, nil
353}
354
355func (agent *Agent) getImageDownloadStatus(ctx context.Context, img *voltha.ImageDownload) (*voltha.ImageDownload, error) {
Himani Chawlab4c25912020-11-12 17:16:38 +0530356 logger.Debugw(ctx, "get-image-download-status", log.Fields{"device-id": agent.deviceID})
Mahir Gunyelfa6ea272020-06-10 17:03:51 -0700357
358 if err := agent.requestQueue.WaitForGreenLight(ctx); err != nil {
359 return nil, err
360 }
khenaidood948f772021-08-11 17:49:24 -0400361 defer agent.requestQueue.RequestComplete()
362
Kent Hagermancba2f302020-07-28 13:37:36 -0400363 device := agent.getDeviceReadOnlyWithoutLock()
khenaidood948f772021-08-11 17:49:24 -0400364 if !agent.proceedWithRequest(device) {
365 return nil, status.Errorf(codes.FailedPrecondition, "%s", "cannot complete operation as device deletion is in progress or reconciling is in progress/failed")
366 }
367
368 // Send the request to the adapter
369 client, err := agent.adapterMgr.GetAdapterClient(ctx, agent.adapterEndpoint)
Mahir Gunyelfa6ea272020-06-10 17:03:51 -0700370 if err != nil {
khenaidood948f772021-08-11 17:49:24 -0400371 logger.Errorw(ctx, "grpc-client-nil",
372 log.Fields{
373 "error": err,
374 "device-id": agent.deviceID,
375 "device-type": agent.deviceType,
376 "adapter-endpoint": device.AdapterEndpoint,
377 })
Mahir Gunyelfa6ea272020-06-10 17:03:51 -0700378 return nil, err
379 }
khenaidood948f772021-08-11 17:49:24 -0400380 return client.GetImageDownloadStatus(ctx, &ic.ImageDownloadMessage{
381 Device: device,
382 Image: img,
383 })
Mahir Gunyelfa6ea272020-06-10 17:03:51 -0700384}
385
386func (agent *Agent) updateImageDownload(ctx context.Context, img *voltha.ImageDownload) error {
khenaidood948f772021-08-11 17:49:24 -0400387 var err error
388 var desc string
389 operStatus := &common.OperationResp{Code: common.OperationResp_OPERATION_FAILURE}
390 defer func() { agent.logDeviceUpdate(ctx, nil, nil, operStatus, err, desc) }()
391
392 if err = agent.requestQueue.WaitForGreenLight(ctx); err != nil {
Mahir Gunyelfa6ea272020-06-10 17:03:51 -0700393 return err
394 }
khenaidood948f772021-08-11 17:49:24 -0400395
Rohan Agrawal31f21802020-06-12 05:38:46 +0000396 logger.Debugw(ctx, "updating-image-download", log.Fields{"device-id": agent.deviceID, "img": img})
Mahir Gunyelfa6ea272020-06-10 17:03:51 -0700397
Maninder2195ccc2021-06-23 20:23:01 +0530398 cloned := agent.cloneDeviceWithoutLock()
399
400 if !agent.proceedWithRequest(cloned) {
Maninder0aabf0c2021-03-17 14:55:14 +0530401 agent.requestQueue.RequestComplete()
khenaidood948f772021-08-11 17:49:24 -0400402 err = status.Errorf(codes.FailedPrecondition, "%s", "cannot complete operation as device deletion is in progress or reconciling is in progress/failed")
403 return err
Maninder0aabf0c2021-03-17 14:55:14 +0530404 }
405
Mahir Gunyelfa6ea272020-06-10 17:03:51 -0700406 // Update the image as well as remove it if the download was cancelled
407 clonedImages := make([]*voltha.ImageDownload, len(cloned.ImageDownloads))
408 for _, image := range cloned.ImageDownloads {
409 if image.Id == img.Id && image.Name == img.Name {
410 if image.DownloadState != voltha.ImageDownload_DOWNLOAD_CANCELLED {
411 clonedImages = append(clonedImages, img)
412 }
413 }
414 }
415 cloned.ImageDownloads = clonedImages
Kent Hagermanf6db9f12020-07-22 17:16:19 -0400416
Mahir Gunyelfa6ea272020-06-10 17:03:51 -0700417 // Set the Admin state to enabled if required
418 if (img.DownloadState != voltha.ImageDownload_DOWNLOAD_REQUESTED &&
419 img.DownloadState != voltha.ImageDownload_DOWNLOAD_STARTED) ||
Kent Hagermanf6db9f12020-07-22 17:16:19 -0400420 img.ImageState != voltha.ImageDownload_IMAGE_ACTIVATING {
421 cloned.AdminState = voltha.AdminState_ENABLED
Mahir Gunyelfa6ea272020-06-10 17:03:51 -0700422 }
Kent Hagermanf6db9f12020-07-22 17:16:19 -0400423 return agent.updateDeviceAndReleaseLock(ctx, cloned)
Mahir Gunyelfa6ea272020-06-10 17:03:51 -0700424}
425
426func (agent *Agent) getImageDownload(ctx context.Context, img *voltha.ImageDownload) (*voltha.ImageDownload, error) {
Himani Chawlab4c25912020-11-12 17:16:38 +0530427 logger.Debugw(ctx, "get-image-download", log.Fields{"device-id": agent.deviceID})
Mahir Gunyelfa6ea272020-06-10 17:03:51 -0700428
Kent Hagermancba2f302020-07-28 13:37:36 -0400429 device, err := agent.getDeviceReadOnly(ctx)
430 if err != nil {
431 return nil, status.Errorf(codes.Aborted, "%s", err)
432 }
Kent Hagermanf6db9f12020-07-22 17:16:19 -0400433 for _, image := range device.ImageDownloads {
Mahir Gunyelfa6ea272020-06-10 17:03:51 -0700434 if image.Id == img.Id && image.Name == img.Name {
435 return image, nil
436 }
437 }
438 return nil, status.Errorf(codes.NotFound, "image-not-found:%s", img.Name)
439}
440
441func (agent *Agent) listImageDownloads(ctx context.Context, deviceID string) (*voltha.ImageDownloads, error) {
Himani Chawlab4c25912020-11-12 17:16:38 +0530442 logger.Debugw(ctx, "list-image-downloads", log.Fields{"device-id": agent.deviceID})
Mahir Gunyelfa6ea272020-06-10 17:03:51 -0700443
Kent Hagermancba2f302020-07-28 13:37:36 -0400444 device, err := agent.getDeviceReadOnly(ctx)
445 if err != nil {
446 return nil, status.Errorf(codes.Aborted, "%s", err)
447 }
448 return &voltha.ImageDownloads{Items: device.ImageDownloads}, nil
Mahir Gunyelfa6ea272020-06-10 17:03:51 -0700449}
Andrea Campanella025667e2021-01-14 11:50:07 +0100450
451// onImageFailure brings back the device to Enabled state and sets the image to image download_failed.
khenaidood948f772021-08-11 17:49:24 -0400452func (agent *Agent) onImageFailure(ctx context.Context, imgErr error) {
Andrea Campanellac05c4c42021-02-11 10:25:28 +0100453 // original context has failed due to timeout , let's open a new one
khenaidood948f772021-08-11 17:49:24 -0400454 subCtx, cancel := context.WithTimeout(log.WithSpanFromContext(context.Background(), ctx), agent.internalTimeout)
Andrea Campanellac05c4c42021-02-11 10:25:28 +0100455 subCtx = coreutils.WithRPCMetadataFromContext(subCtx, ctx)
Maninder0aabf0c2021-03-17 14:55:14 +0530456 defer cancel()
khenaidood948f772021-08-11 17:49:24 -0400457 rpc := coreutils.GetRPCMetadataFromContext(subCtx)
458
459 defer func() {
460 eCtx := coreutils.WithSpanAndRPCMetadataFromContext(ctx)
461 rpce := agent.deviceMgr.NewRPCEvent(eCtx, agent.deviceID, imgErr.Error(), nil)
462 go agent.deviceMgr.SendRPCEvent(eCtx, "RPC_ERROR_RAISE_EVENT", rpce,
463 voltha.EventCategory_COMMUNICATION, nil, time.Now().Unix())
464 operStatus := &common.OperationResp{Code: common.OperationResp_OPERATION_FAILURE}
465 desc := "adapter-response"
466 agent.logDeviceUpdate(ctx, nil, nil, operStatus, imgErr, desc)
467 }()
Andrea Campanellac05c4c42021-02-11 10:25:28 +0100468
469 if err := agent.requestQueue.WaitForGreenLight(subCtx); err != nil {
khenaidood948f772021-08-11 17:49:24 -0400470 logger.Errorw(subCtx, "can't obtain lock", log.Fields{"rpc": rpc, "device-id": agent.deviceID, "error": err})
Maninder0aabf0c2021-03-17 14:55:14 +0530471 return
472 }
Maninder2195ccc2021-06-23 20:23:01 +0530473
474 device := agent.getDeviceReadOnlyWithoutLock()
475
476 if !agent.proceedWithRequest(device) {
Maninder0aabf0c2021-03-17 14:55:14 +0530477 agent.requestQueue.RequestComplete()
Maninder2195ccc2021-06-23 20:23:01 +0530478 logger.Errorw(subCtx, "Cannot complete operation as device deletion is in progress or reconciling is in progress/failed.",
Maninder581cf4b2021-06-16 22:42:07 +0530479 log.Fields{"rpc": rpc, "device-id": agent.deviceID})
Andrea Campanella025667e2021-01-14 11:50:07 +0100480 return
481 }
khenaidood948f772021-08-11 17:49:24 -0400482 if imgErr != nil {
483 logger.Errorw(subCtx, "rpc-failed", log.Fields{"rpc": rpc, "device-id": agent.deviceID, "error": imgErr})
Andrea Campanellac05c4c42021-02-11 10:25:28 +0100484 cloned := agent.cloneDeviceWithoutLock()
Andrea Campanella025667e2021-01-14 11:50:07 +0100485 //TODO base this on IMAGE ID when created
486 var imageFailed *voltha.ImageDownload
487 var index int
Andrea Campanellac05c4c42021-02-11 10:25:28 +0100488 if cloned.ImageDownloads != nil {
489 for pos, image := range cloned.ImageDownloads {
Andrea Campanella025667e2021-01-14 11:50:07 +0100490 if image.DownloadState == voltha.ImageDownload_DOWNLOAD_REQUESTED ||
491 image.ImageState == voltha.ImageDownload_IMAGE_ACTIVATING {
492 imageFailed = image
493 index = pos
494 }
495 }
496 }
497
498 if imageFailed == nil {
khenaidood948f772021-08-11 17:49:24 -0400499 logger.Errorw(subCtx, "can't find image", log.Fields{"rpc": rpc, "device-id": agent.deviceID})
Andrea Campanella025667e2021-01-14 11:50:07 +0100500 return
501 }
502
Andrea Campanellac05c4c42021-02-11 10:25:28 +0100503 //update image state on failure
Andrea Campanella025667e2021-01-14 11:50:07 +0100504 if imageFailed.DownloadState == voltha.ImageDownload_DOWNLOAD_REQUESTED {
Andrea Campanellac05c4c42021-02-11 10:25:28 +0100505 cloned.ImageDownloads[index].DownloadState = voltha.ImageDownload_DOWNLOAD_FAILED
Andrea Campanella025667e2021-01-14 11:50:07 +0100506 } else if imageFailed.ImageState == voltha.ImageDownload_IMAGE_ACTIVATING {
Andrea Campanellac05c4c42021-02-11 10:25:28 +0100507 cloned.ImageDownloads[index].ImageState = voltha.ImageDownload_IMAGE_INACTIVE
Andrea Campanella025667e2021-01-14 11:50:07 +0100508 }
Andrea Campanella025667e2021-01-14 11:50:07 +0100509 //Enabled is the only state we can go back to.
510 cloned.AdminState = voltha.AdminState_ENABLED
Andrea Campanellac05c4c42021-02-11 10:25:28 +0100511 if err := agent.updateDeviceAndReleaseLock(subCtx, cloned); err != nil {
512 logger.Errorw(subCtx, "failed-enable-device-after-image-failure",
khenaidood948f772021-08-11 17:49:24 -0400513 log.Fields{"rpc": rpc, "device-id": agent.deviceID, "error": err})
Andrea Campanella025667e2021-01-14 11:50:07 +0100514 }
515 } else {
khenaidood948f772021-08-11 17:49:24 -0400516 logger.Errorw(subCtx, "rpc-failed-invalid-error", log.Fields{"rpc": rpc, "device-id": agent.deviceID})
Andrea Campanellac05c4c42021-02-11 10:25:28 +0100517 return
Andrea Campanella025667e2021-01-14 11:50:07 +0100518 }
Andrea Campanella025667e2021-01-14 11:50:07 +0100519}
520
521// onImageSuccess brings back the device to Enabled state and sets the image to image download_failed.
khenaidood948f772021-08-11 17:49:24 -0400522func (agent *Agent) onImageSuccess(ctx context.Context, response interface{}) {
523 rpc := coreutils.GetRPCMetadataFromContext(ctx)
524
525 var err error
526 var desc string
527 operStatus := &common.OperationResp{Code: common.OperationResp_OPERATION_FAILURE}
528 defer func() { agent.logDeviceUpdate(ctx, nil, nil, operStatus, err, desc) }()
529
530 if err = agent.requestQueue.WaitForGreenLight(ctx); err != nil {
Andrea Campanella025667e2021-01-14 11:50:07 +0100531 return
532 }
Maninder2195ccc2021-06-23 20:23:01 +0530533
534 cloned := agent.cloneDeviceWithoutLock()
535
536 if !agent.proceedWithRequest(cloned) {
Maninder0aabf0c2021-03-17 14:55:14 +0530537 agent.requestQueue.RequestComplete()
khenaidood948f772021-08-11 17:49:24 -0400538 err = status.Errorf(codes.FailedPrecondition, "%s", "cannot complete operation as device deletion is in progress or reconciling is in progress/failed")
Maninder0aabf0c2021-03-17 14:55:14 +0530539 return
540 }
khenaidood948f772021-08-11 17:49:24 -0400541 logger.Infow(ctx, "rpc-successful", log.Fields{"rpc": rpc, "device-id": agent.deviceID, "response": response})
Andrea Campanella025667e2021-01-14 11:50:07 +0100542 //TODO base this on IMAGE ID when created
543 var imageSucceeded *voltha.ImageDownload
544 var index int
Andrea Campanellac05c4c42021-02-11 10:25:28 +0100545 if cloned.ImageDownloads != nil {
546 for pos, image := range cloned.ImageDownloads {
Andrea Campanella025667e2021-01-14 11:50:07 +0100547 if image.DownloadState == voltha.ImageDownload_DOWNLOAD_REQUESTED ||
548 image.ImageState == voltha.ImageDownload_IMAGE_ACTIVATING {
549 imageSucceeded = image
550 index = pos
551 }
552 }
553 }
554
555 if imageSucceeded == nil {
khenaidood948f772021-08-11 17:49:24 -0400556 err = errors.New("can't find image")
Andrea Campanella025667e2021-01-14 11:50:07 +0100557 return
558 }
Andrea Campanellac05c4c42021-02-11 10:25:28 +0100559 //update image state on success
Andrea Campanella025667e2021-01-14 11:50:07 +0100560 if imageSucceeded.DownloadState == voltha.ImageDownload_DOWNLOAD_REQUESTED {
Andrea Campanellac05c4c42021-02-11 10:25:28 +0100561 cloned.ImageDownloads[index].DownloadState = voltha.ImageDownload_DOWNLOAD_SUCCEEDED
Andrea Campanella025667e2021-01-14 11:50:07 +0100562 } else if imageSucceeded.ImageState == voltha.ImageDownload_IMAGE_ACTIVATING {
Andrea Campanellac05c4c42021-02-11 10:25:28 +0100563 cloned.ImageDownloads[index].ImageState = voltha.ImageDownload_IMAGE_ACTIVE
Andrea Campanella025667e2021-01-14 11:50:07 +0100564 }
Andrea Campanella025667e2021-01-14 11:50:07 +0100565 //Enabled is the only state we can go back to.
566 cloned.AdminState = voltha.AdminState_ENABLED
khenaidood948f772021-08-11 17:49:24 -0400567 if err = agent.updateDeviceAndReleaseLock(ctx, cloned); err != nil {
Andrea Campanella025667e2021-01-14 11:50:07 +0100568 logger.Errorw(ctx, "failed-enable-device-after-image-download-success",
khenaidood948f772021-08-11 17:49:24 -0400569 log.Fields{"rpc": rpc, "device-id": agent.deviceID, "response": response})
Andrea Campanella025667e2021-01-14 11:50:07 +0100570 }
khenaidood948f772021-08-11 17:49:24 -0400571 // Update operation status
572 if err == nil {
573 operStatus.Code = common.OperationResp_OPERATION_SUCCESS
574 }
Andrea Campanella025667e2021-01-14 11:50:07 +0100575}
ssiddiquif076cb82021-04-23 10:47:04 +0530576
577func (agent *Agent) downloadImageToDevice(ctx context.Context, request *voltha.DeviceImageDownloadRequest) (*voltha.DeviceImageResponse, error) {
578 if err := agent.requestQueue.WaitForGreenLight(ctx); err != nil {
579 return nil, err
580 }
581
582 logger.Debugw(ctx, "download-image-to-device", log.Fields{"device-id": agent.deviceID})
583 if agent.device.Root {
584 agent.requestQueue.RequestComplete()
585 return nil, status.Errorf(codes.FailedPrecondition, "device-id:%s, is an OLT. Image update "+
586 "not supported by VOLTHA. Use Device Manager or other means", agent.deviceID)
587 }
588
589 cloned := agent.cloneDeviceWithoutLock()
khenaidood948f772021-08-11 17:49:24 -0400590 if !agent.proceedWithRequest(cloned) {
591 agent.requestQueue.RequestComplete()
592 return nil, status.Errorf(codes.FailedPrecondition, "%s", "cannot complete operation as device deletion is in progress or reconciling is in progress/failed")
593 }
ssiddiquif076cb82021-04-23 10:47:04 +0530594
595 // Send the request to the adapter
khenaidood948f772021-08-11 17:49:24 -0400596 client, err := agent.adapterMgr.GetAdapterClient(ctx, agent.adapterEndpoint)
597 if err != nil {
598 logger.Errorw(ctx, "grpc-client-nil",
599 log.Fields{
600 "error": err,
601 "device-id": agent.deviceID,
602 "device-type": agent.deviceType,
603 "adapter-endpoint": cloned.AdapterEndpoint,
604 })
605 agent.requestQueue.RequestComplete()
606 return nil, err
607 }
608 subCtx, cancel := context.WithTimeout(log.WithSpanFromContext(context.Background(), ctx), agent.rpcTimeout)
ssiddiquif076cb82021-04-23 10:47:04 +0530609 defer cancel()
610 subCtx = coreutils.WithRPCMetadataFromContext(subCtx, ctx)
611
ssiddiquif076cb82021-04-23 10:47:04 +0530612 agent.requestQueue.RequestComplete()
khenaidood948f772021-08-11 17:49:24 -0400613 return client.DownloadOnuImage(subCtx, request)
ssiddiquif076cb82021-04-23 10:47:04 +0530614}
615
616func (agent *Agent) getImageStatus(ctx context.Context, request *voltha.DeviceImageRequest) (*voltha.DeviceImageResponse, error) {
617 if err := agent.requestQueue.WaitForGreenLight(ctx); err != nil {
618 return nil, err
619 }
620
ssiddiquif076cb82021-04-23 10:47:04 +0530621 logger.Debugw(ctx, "get-image-status", log.Fields{"device-id": agent.deviceID})
622
khenaidood948f772021-08-11 17:49:24 -0400623 cloned := agent.cloneDeviceWithoutLock()
624 if !agent.proceedWithRequest(cloned) {
625 agent.requestQueue.RequestComplete()
626 return nil, status.Errorf(codes.FailedPrecondition, "%s", "cannot complete operation as device deletion is in progress or reconciling is in progress/failed")
627 }
628
629 // Send the request to the adapter
630 client, err := agent.adapterMgr.GetAdapterClient(ctx, agent.adapterEndpoint)
ssiddiquif076cb82021-04-23 10:47:04 +0530631 if err != nil {
khenaidood948f772021-08-11 17:49:24 -0400632 logger.Errorw(ctx, "grpc-client-nil",
633 log.Fields{
634 "error": err,
635 "device-id": agent.deviceID,
636 "device-type": agent.deviceType,
637 "adapter-endpoint": cloned.AdapterEndpoint,
638 })
639 agent.requestQueue.RequestComplete()
ssiddiquif076cb82021-04-23 10:47:04 +0530640 return nil, err
641 }
642
khenaidood948f772021-08-11 17:49:24 -0400643 subCtx, cancel := context.WithTimeout(log.WithSpanFromContext(context.Background(), ctx), agent.rpcTimeout)
644 defer cancel()
645 subCtx = coreutils.WithRPCMetadataFromContext(subCtx, ctx)
646
647 return client.GetOnuImageStatus(subCtx, request)
ssiddiquif076cb82021-04-23 10:47:04 +0530648}
649
650func (agent *Agent) activateImageOnDevice(ctx context.Context, request *voltha.DeviceImageRequest) (*voltha.DeviceImageResponse, error) {
651 if err := agent.requestQueue.WaitForGreenLight(ctx); err != nil {
652 return nil, err
653 }
654
ssiddiquif076cb82021-04-23 10:47:04 +0530655 logger.Debugw(ctx, "activate-image-on-device", log.Fields{"device-id": agent.deviceID})
656
khenaidood948f772021-08-11 17:49:24 -0400657 cloned := agent.cloneDeviceWithoutLock()
658
659 if !agent.proceedWithRequest(cloned) {
660 agent.requestQueue.RequestComplete()
661 return nil, status.Errorf(codes.FailedPrecondition, "%s", "cannot complete operation as device deletion is in progress or reconciling is in progress/failed")
662 }
663
664 // Send the request to the adapter
665 client, err := agent.adapterMgr.GetAdapterClient(ctx, agent.adapterEndpoint)
ssiddiquif076cb82021-04-23 10:47:04 +0530666 if err != nil {
khenaidood948f772021-08-11 17:49:24 -0400667 logger.Errorw(ctx, "grpc-client-nil",
668 log.Fields{
669 "error": err,
670 "device-id": agent.deviceID,
671 "device-type": agent.deviceType,
672 "adapter-endpoint": cloned.AdapterEndpoint,
673 })
674 agent.requestQueue.RequestComplete()
ssiddiquif076cb82021-04-23 10:47:04 +0530675 return nil, err
676 }
677
khenaidood948f772021-08-11 17:49:24 -0400678 subCtx, cancel := context.WithTimeout(log.WithSpanFromContext(context.Background(), ctx), agent.rpcTimeout)
679 defer cancel()
680 subCtx = coreutils.WithRPCMetadataFromContext(subCtx, ctx)
681
682 agent.requestQueue.RequestComplete()
683 return client.ActivateOnuImage(subCtx, request)
ssiddiquif076cb82021-04-23 10:47:04 +0530684}
685
686func (agent *Agent) abortImageUpgradeToDevice(ctx context.Context, request *voltha.DeviceImageRequest) (*voltha.DeviceImageResponse, error) {
687 if err := agent.requestQueue.WaitForGreenLight(ctx); err != nil {
688 return nil, err
689 }
690
ssiddiquif076cb82021-04-23 10:47:04 +0530691 logger.Debugw(ctx, "abort-image-on-device", log.Fields{"device-id": agent.deviceID})
692
khenaidood948f772021-08-11 17:49:24 -0400693 cloned := agent.cloneDeviceWithoutLock()
694
695 if !agent.proceedWithRequest(cloned) {
696 agent.requestQueue.RequestComplete()
697 return nil, status.Errorf(codes.FailedPrecondition, "%s", "cannot complete operation as device deletion is in progress or reconciling is in progress/failed")
ssiddiquif076cb82021-04-23 10:47:04 +0530698 }
699
khenaidood948f772021-08-11 17:49:24 -0400700 // Send the request to the adapter
701 client, err := agent.adapterMgr.GetAdapterClient(ctx, agent.adapterEndpoint)
702 if err != nil {
703 logger.Errorw(ctx, "grpc-client-nil",
704 log.Fields{
705 "error": err,
706 "device-id": agent.deviceID,
707 "device-type": agent.deviceType,
708 "adapter-endpoint": cloned.AdapterEndpoint,
709 })
710 agent.requestQueue.RequestComplete()
711 return nil, err
712 }
713 subCtx, cancel := context.WithTimeout(log.WithSpanFromContext(context.Background(), ctx), agent.rpcTimeout)
714 defer cancel()
715 subCtx = coreutils.WithRPCMetadataFromContext(subCtx, ctx)
716
717 agent.requestQueue.RequestComplete()
718
719 return client.AbortOnuImageUpgrade(subCtx, request)
ssiddiquif076cb82021-04-23 10:47:04 +0530720}
721
722func (agent *Agent) commitImage(ctx context.Context, request *voltha.DeviceImageRequest) (*voltha.DeviceImageResponse, error) {
723 if err := agent.requestQueue.WaitForGreenLight(ctx); err != nil {
724 return nil, err
725 }
726
ssiddiquif076cb82021-04-23 10:47:04 +0530727 logger.Debugw(ctx, "commit-image-on-device", log.Fields{"device-id": agent.deviceID})
728
khenaidood948f772021-08-11 17:49:24 -0400729 cloned := agent.cloneDeviceWithoutLock()
730
731 if !agent.proceedWithRequest(cloned) {
732 agent.requestQueue.RequestComplete()
733 return nil, status.Errorf(codes.FailedPrecondition, "%s", "cannot complete operation as device deletion is in progress or reconciling is in progress/failed")
ssiddiquif076cb82021-04-23 10:47:04 +0530734 }
735
khenaidood948f772021-08-11 17:49:24 -0400736 // Send the request to the adapter
737 client, err := agent.adapterMgr.GetAdapterClient(ctx, agent.adapterEndpoint)
738 if err != nil {
739 logger.Errorw(ctx, "grpc-client-nil",
740 log.Fields{
741 "error": err,
742 "device-id": agent.deviceID,
743 "device-type": agent.deviceType,
744 "adapter-endpoint": cloned.AdapterEndpoint,
745 })
746 agent.requestQueue.RequestComplete()
747 return nil, err
748 }
749 subCtx, cancel := context.WithTimeout(log.WithSpanFromContext(context.Background(), ctx), agent.rpcTimeout)
750 defer cancel()
751 subCtx = coreutils.WithRPCMetadataFromContext(subCtx, ctx)
752
753 return client.CommitOnuImage(subCtx, request)
ssiddiquif076cb82021-04-23 10:47:04 +0530754}
755
756func (agent *Agent) getOnuImages(ctx context.Context, id *common.ID) (*voltha.OnuImages, error) {
757 if err := agent.requestQueue.WaitForGreenLight(ctx); err != nil {
758 return nil, err
759 }
760
ssiddiqui47348f62021-05-20 20:41:15 +0530761 logger.Debug(ctx, "get-onu-images")
ssiddiquif076cb82021-04-23 10:47:04 +0530762
khenaidood948f772021-08-11 17:49:24 -0400763 cloned := agent.cloneDeviceWithoutLock()
764
765 if !agent.proceedWithRequest(cloned) {
766 agent.requestQueue.RequestComplete()
767 return nil, status.Errorf(codes.FailedPrecondition, "%s", "cannot complete operation as device deletion is in progress or reconciling is in progress/failed")
768 }
769
ssiddiquif076cb82021-04-23 10:47:04 +0530770 // Send the request to the adapter
khenaidood948f772021-08-11 17:49:24 -0400771 client, err := agent.adapterMgr.GetAdapterClient(ctx, agent.adapterEndpoint)
ssiddiquif076cb82021-04-23 10:47:04 +0530772 if err != nil {
khenaidood948f772021-08-11 17:49:24 -0400773 logger.Errorw(ctx, "grpc-client-nil",
774 log.Fields{
775 "error": err,
776 "device-id": agent.deviceID,
777 "device-type": agent.deviceType,
778 "adapter-endpoint": cloned.AdapterEndpoint,
779 })
780 agent.requestQueue.RequestComplete()
ssiddiquif076cb82021-04-23 10:47:04 +0530781 return nil, err
782 }
783
khenaidood948f772021-08-11 17:49:24 -0400784 agent.requestQueue.RequestComplete()
785 return client.GetOnuImages(ctx, id)
ssiddiquif076cb82021-04-23 10:47:04 +0530786}