blob: 7c86e0898821fd727fa4c7cb93dcaa1dc626663a [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
khenaidoo9beaaf12021-10-19 17:32:01 -040024 ca "github.com/opencord/voltha-protos/v5/go/core_adapter"
khenaidood948f772021-08-11 17:49:24 -040025
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()
khenaidoo9beaaf12021-10-19 17:32:01 -0400103 response, err := client.DownloadImage(subCtx, &ca.ImageDownloadMessage{
khenaidood948f772021-08-11 17:49:24 -0400104 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()
khenaidoo9beaaf12021-10-19 17:32:01 -0400184 response, err := client.CancelImageDownload(subCtx, &ca.ImageDownloadMessage{
khenaidood948f772021-08-11 17:49:24 -0400185 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()
khenaidoo9beaaf12021-10-19 17:32:01 -0400265 response, err := client.ActivateImageUpdate(subCtx, &ca.ImageDownloadMessage{
khenaidood948f772021-08-11 17:49:24 -0400266 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()
khenaidoo9beaaf12021-10-19 17:32:01 -0400336 _, err := client.RevertImageUpdate(subCtx, &ca.ImageDownloadMessage{
khenaidood948f772021-08-11 17:49:24 -0400337 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
Kent Hagermancba2f302020-07-28 13:37:36 -0400362 device := agent.getDeviceReadOnlyWithoutLock()
khenaidood948f772021-08-11 17:49:24 -0400363 if !agent.proceedWithRequest(device) {
khenaidoo5d126902021-10-07 10:04:43 -0400364 agent.requestQueue.RequestComplete()
khenaidood948f772021-08-11 17:49:24 -0400365 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 })
khenaidoo5d126902021-10-07 10:04:43 -0400378 agent.requestQueue.RequestComplete()
Mahir Gunyelfa6ea272020-06-10 17:03:51 -0700379 return nil, err
380 }
khenaidoo5d126902021-10-07 10:04:43 -0400381 agent.requestQueue.RequestComplete()
khenaidoo9beaaf12021-10-19 17:32:01 -0400382 return client.GetImageDownloadStatus(ctx, &ca.ImageDownloadMessage{
khenaidood948f772021-08-11 17:49:24 -0400383 Device: device,
384 Image: img,
385 })
Mahir Gunyelfa6ea272020-06-10 17:03:51 -0700386}
387
388func (agent *Agent) updateImageDownload(ctx context.Context, img *voltha.ImageDownload) error {
khenaidood948f772021-08-11 17:49:24 -0400389 var err error
390 var desc string
391 operStatus := &common.OperationResp{Code: common.OperationResp_OPERATION_FAILURE}
392 defer func() { agent.logDeviceUpdate(ctx, nil, nil, operStatus, err, desc) }()
393
394 if err = agent.requestQueue.WaitForGreenLight(ctx); err != nil {
Mahir Gunyelfa6ea272020-06-10 17:03:51 -0700395 return err
396 }
khenaidood948f772021-08-11 17:49:24 -0400397
Rohan Agrawal31f21802020-06-12 05:38:46 +0000398 logger.Debugw(ctx, "updating-image-download", log.Fields{"device-id": agent.deviceID, "img": img})
Mahir Gunyelfa6ea272020-06-10 17:03:51 -0700399
Maninder2195ccc2021-06-23 20:23:01 +0530400 cloned := agent.cloneDeviceWithoutLock()
401
402 if !agent.proceedWithRequest(cloned) {
Maninder0aabf0c2021-03-17 14:55:14 +0530403 agent.requestQueue.RequestComplete()
khenaidood948f772021-08-11 17:49:24 -0400404 err = status.Errorf(codes.FailedPrecondition, "%s", "cannot complete operation as device deletion is in progress or reconciling is in progress/failed")
405 return err
Maninder0aabf0c2021-03-17 14:55:14 +0530406 }
407
Mahir Gunyelfa6ea272020-06-10 17:03:51 -0700408 // Update the image as well as remove it if the download was cancelled
409 clonedImages := make([]*voltha.ImageDownload, len(cloned.ImageDownloads))
410 for _, image := range cloned.ImageDownloads {
411 if image.Id == img.Id && image.Name == img.Name {
412 if image.DownloadState != voltha.ImageDownload_DOWNLOAD_CANCELLED {
413 clonedImages = append(clonedImages, img)
414 }
415 }
416 }
417 cloned.ImageDownloads = clonedImages
Kent Hagermanf6db9f12020-07-22 17:16:19 -0400418
Mahir Gunyelfa6ea272020-06-10 17:03:51 -0700419 // Set the Admin state to enabled if required
420 if (img.DownloadState != voltha.ImageDownload_DOWNLOAD_REQUESTED &&
421 img.DownloadState != voltha.ImageDownload_DOWNLOAD_STARTED) ||
Kent Hagermanf6db9f12020-07-22 17:16:19 -0400422 img.ImageState != voltha.ImageDownload_IMAGE_ACTIVATING {
423 cloned.AdminState = voltha.AdminState_ENABLED
Mahir Gunyelfa6ea272020-06-10 17:03:51 -0700424 }
Kent Hagermanf6db9f12020-07-22 17:16:19 -0400425 return agent.updateDeviceAndReleaseLock(ctx, cloned)
Mahir Gunyelfa6ea272020-06-10 17:03:51 -0700426}
427
428func (agent *Agent) getImageDownload(ctx context.Context, img *voltha.ImageDownload) (*voltha.ImageDownload, error) {
Himani Chawlab4c25912020-11-12 17:16:38 +0530429 logger.Debugw(ctx, "get-image-download", log.Fields{"device-id": agent.deviceID})
Mahir Gunyelfa6ea272020-06-10 17:03:51 -0700430
Kent Hagermancba2f302020-07-28 13:37:36 -0400431 device, err := agent.getDeviceReadOnly(ctx)
432 if err != nil {
433 return nil, status.Errorf(codes.Aborted, "%s", err)
434 }
Kent Hagermanf6db9f12020-07-22 17:16:19 -0400435 for _, image := range device.ImageDownloads {
Mahir Gunyelfa6ea272020-06-10 17:03:51 -0700436 if image.Id == img.Id && image.Name == img.Name {
437 return image, nil
438 }
439 }
440 return nil, status.Errorf(codes.NotFound, "image-not-found:%s", img.Name)
441}
442
443func (agent *Agent) listImageDownloads(ctx context.Context, deviceID string) (*voltha.ImageDownloads, error) {
Himani Chawlab4c25912020-11-12 17:16:38 +0530444 logger.Debugw(ctx, "list-image-downloads", log.Fields{"device-id": agent.deviceID})
Mahir Gunyelfa6ea272020-06-10 17:03:51 -0700445
Kent Hagermancba2f302020-07-28 13:37:36 -0400446 device, err := agent.getDeviceReadOnly(ctx)
447 if err != nil {
448 return nil, status.Errorf(codes.Aborted, "%s", err)
449 }
450 return &voltha.ImageDownloads{Items: device.ImageDownloads}, nil
Mahir Gunyelfa6ea272020-06-10 17:03:51 -0700451}
Andrea Campanella025667e2021-01-14 11:50:07 +0100452
453// onImageFailure brings back the device to Enabled state and sets the image to image download_failed.
khenaidood948f772021-08-11 17:49:24 -0400454func (agent *Agent) onImageFailure(ctx context.Context, imgErr error) {
Andrea Campanellac05c4c42021-02-11 10:25:28 +0100455 // original context has failed due to timeout , let's open a new one
khenaidood948f772021-08-11 17:49:24 -0400456 subCtx, cancel := context.WithTimeout(log.WithSpanFromContext(context.Background(), ctx), agent.internalTimeout)
Andrea Campanellac05c4c42021-02-11 10:25:28 +0100457 subCtx = coreutils.WithRPCMetadataFromContext(subCtx, ctx)
Maninder0aabf0c2021-03-17 14:55:14 +0530458 defer cancel()
khenaidood948f772021-08-11 17:49:24 -0400459 rpc := coreutils.GetRPCMetadataFromContext(subCtx)
460
461 defer func() {
462 eCtx := coreutils.WithSpanAndRPCMetadataFromContext(ctx)
463 rpce := agent.deviceMgr.NewRPCEvent(eCtx, agent.deviceID, imgErr.Error(), nil)
464 go agent.deviceMgr.SendRPCEvent(eCtx, "RPC_ERROR_RAISE_EVENT", rpce,
465 voltha.EventCategory_COMMUNICATION, nil, time.Now().Unix())
466 operStatus := &common.OperationResp{Code: common.OperationResp_OPERATION_FAILURE}
467 desc := "adapter-response"
468 agent.logDeviceUpdate(ctx, nil, nil, operStatus, imgErr, desc)
469 }()
Andrea Campanellac05c4c42021-02-11 10:25:28 +0100470
471 if err := agent.requestQueue.WaitForGreenLight(subCtx); err != nil {
khenaidood948f772021-08-11 17:49:24 -0400472 logger.Errorw(subCtx, "can't obtain lock", log.Fields{"rpc": rpc, "device-id": agent.deviceID, "error": err})
Maninder0aabf0c2021-03-17 14:55:14 +0530473 return
474 }
Maninder2195ccc2021-06-23 20:23:01 +0530475
476 device := agent.getDeviceReadOnlyWithoutLock()
477
478 if !agent.proceedWithRequest(device) {
Maninder0aabf0c2021-03-17 14:55:14 +0530479 agent.requestQueue.RequestComplete()
Maninder2195ccc2021-06-23 20:23:01 +0530480 logger.Errorw(subCtx, "Cannot complete operation as device deletion is in progress or reconciling is in progress/failed.",
Maninder581cf4b2021-06-16 22:42:07 +0530481 log.Fields{"rpc": rpc, "device-id": agent.deviceID})
Andrea Campanella025667e2021-01-14 11:50:07 +0100482 return
483 }
khenaidood948f772021-08-11 17:49:24 -0400484 if imgErr != nil {
485 logger.Errorw(subCtx, "rpc-failed", log.Fields{"rpc": rpc, "device-id": agent.deviceID, "error": imgErr})
Andrea Campanellac05c4c42021-02-11 10:25:28 +0100486 cloned := agent.cloneDeviceWithoutLock()
Andrea Campanella025667e2021-01-14 11:50:07 +0100487 //TODO base this on IMAGE ID when created
488 var imageFailed *voltha.ImageDownload
489 var index int
Andrea Campanellac05c4c42021-02-11 10:25:28 +0100490 if cloned.ImageDownloads != nil {
491 for pos, image := range cloned.ImageDownloads {
Andrea Campanella025667e2021-01-14 11:50:07 +0100492 if image.DownloadState == voltha.ImageDownload_DOWNLOAD_REQUESTED ||
493 image.ImageState == voltha.ImageDownload_IMAGE_ACTIVATING {
494 imageFailed = image
495 index = pos
496 }
497 }
498 }
499
500 if imageFailed == nil {
khenaidood948f772021-08-11 17:49:24 -0400501 logger.Errorw(subCtx, "can't find image", log.Fields{"rpc": rpc, "device-id": agent.deviceID})
Andrea Campanella025667e2021-01-14 11:50:07 +0100502 return
503 }
504
Andrea Campanellac05c4c42021-02-11 10:25:28 +0100505 //update image state on failure
Andrea Campanella025667e2021-01-14 11:50:07 +0100506 if imageFailed.DownloadState == voltha.ImageDownload_DOWNLOAD_REQUESTED {
Andrea Campanellac05c4c42021-02-11 10:25:28 +0100507 cloned.ImageDownloads[index].DownloadState = voltha.ImageDownload_DOWNLOAD_FAILED
Andrea Campanella025667e2021-01-14 11:50:07 +0100508 } else if imageFailed.ImageState == voltha.ImageDownload_IMAGE_ACTIVATING {
Andrea Campanellac05c4c42021-02-11 10:25:28 +0100509 cloned.ImageDownloads[index].ImageState = voltha.ImageDownload_IMAGE_INACTIVE
Andrea Campanella025667e2021-01-14 11:50:07 +0100510 }
Andrea Campanella025667e2021-01-14 11:50:07 +0100511 //Enabled is the only state we can go back to.
512 cloned.AdminState = voltha.AdminState_ENABLED
Andrea Campanellac05c4c42021-02-11 10:25:28 +0100513 if err := agent.updateDeviceAndReleaseLock(subCtx, cloned); err != nil {
514 logger.Errorw(subCtx, "failed-enable-device-after-image-failure",
khenaidood948f772021-08-11 17:49:24 -0400515 log.Fields{"rpc": rpc, "device-id": agent.deviceID, "error": err})
Andrea Campanella025667e2021-01-14 11:50:07 +0100516 }
517 } else {
khenaidood948f772021-08-11 17:49:24 -0400518 logger.Errorw(subCtx, "rpc-failed-invalid-error", log.Fields{"rpc": rpc, "device-id": agent.deviceID})
Andrea Campanellac05c4c42021-02-11 10:25:28 +0100519 return
Andrea Campanella025667e2021-01-14 11:50:07 +0100520 }
Andrea Campanella025667e2021-01-14 11:50:07 +0100521}
522
523// onImageSuccess brings back the device to Enabled state and sets the image to image download_failed.
khenaidood948f772021-08-11 17:49:24 -0400524func (agent *Agent) onImageSuccess(ctx context.Context, response interface{}) {
525 rpc := coreutils.GetRPCMetadataFromContext(ctx)
526
527 var err error
528 var desc string
529 operStatus := &common.OperationResp{Code: common.OperationResp_OPERATION_FAILURE}
530 defer func() { agent.logDeviceUpdate(ctx, nil, nil, operStatus, err, desc) }()
531
532 if err = agent.requestQueue.WaitForGreenLight(ctx); err != nil {
Andrea Campanella025667e2021-01-14 11:50:07 +0100533 return
534 }
Maninder2195ccc2021-06-23 20:23:01 +0530535
536 cloned := agent.cloneDeviceWithoutLock()
537
538 if !agent.proceedWithRequest(cloned) {
Maninder0aabf0c2021-03-17 14:55:14 +0530539 agent.requestQueue.RequestComplete()
khenaidood948f772021-08-11 17:49:24 -0400540 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 +0530541 return
542 }
khenaidood948f772021-08-11 17:49:24 -0400543 logger.Infow(ctx, "rpc-successful", log.Fields{"rpc": rpc, "device-id": agent.deviceID, "response": response})
Andrea Campanella025667e2021-01-14 11:50:07 +0100544 //TODO base this on IMAGE ID when created
545 var imageSucceeded *voltha.ImageDownload
546 var index int
Andrea Campanellac05c4c42021-02-11 10:25:28 +0100547 if cloned.ImageDownloads != nil {
548 for pos, image := range cloned.ImageDownloads {
Andrea Campanella025667e2021-01-14 11:50:07 +0100549 if image.DownloadState == voltha.ImageDownload_DOWNLOAD_REQUESTED ||
550 image.ImageState == voltha.ImageDownload_IMAGE_ACTIVATING {
551 imageSucceeded = image
552 index = pos
553 }
554 }
555 }
556
557 if imageSucceeded == nil {
khenaidood948f772021-08-11 17:49:24 -0400558 err = errors.New("can't find image")
Andrea Campanella025667e2021-01-14 11:50:07 +0100559 return
560 }
Andrea Campanellac05c4c42021-02-11 10:25:28 +0100561 //update image state on success
Andrea Campanella025667e2021-01-14 11:50:07 +0100562 if imageSucceeded.DownloadState == voltha.ImageDownload_DOWNLOAD_REQUESTED {
Andrea Campanellac05c4c42021-02-11 10:25:28 +0100563 cloned.ImageDownloads[index].DownloadState = voltha.ImageDownload_DOWNLOAD_SUCCEEDED
Andrea Campanella025667e2021-01-14 11:50:07 +0100564 } else if imageSucceeded.ImageState == voltha.ImageDownload_IMAGE_ACTIVATING {
Andrea Campanellac05c4c42021-02-11 10:25:28 +0100565 cloned.ImageDownloads[index].ImageState = voltha.ImageDownload_IMAGE_ACTIVE
Andrea Campanella025667e2021-01-14 11:50:07 +0100566 }
Andrea Campanella025667e2021-01-14 11:50:07 +0100567 //Enabled is the only state we can go back to.
568 cloned.AdminState = voltha.AdminState_ENABLED
khenaidood948f772021-08-11 17:49:24 -0400569 if err = agent.updateDeviceAndReleaseLock(ctx, cloned); err != nil {
Andrea Campanella025667e2021-01-14 11:50:07 +0100570 logger.Errorw(ctx, "failed-enable-device-after-image-download-success",
khenaidood948f772021-08-11 17:49:24 -0400571 log.Fields{"rpc": rpc, "device-id": agent.deviceID, "response": response})
Andrea Campanella025667e2021-01-14 11:50:07 +0100572 }
khenaidood948f772021-08-11 17:49:24 -0400573 // Update operation status
574 if err == nil {
575 operStatus.Code = common.OperationResp_OPERATION_SUCCESS
576 }
Andrea Campanella025667e2021-01-14 11:50:07 +0100577}
ssiddiquif076cb82021-04-23 10:47:04 +0530578
579func (agent *Agent) downloadImageToDevice(ctx context.Context, request *voltha.DeviceImageDownloadRequest) (*voltha.DeviceImageResponse, error) {
580 if err := agent.requestQueue.WaitForGreenLight(ctx); err != nil {
581 return nil, err
582 }
583
584 logger.Debugw(ctx, "download-image-to-device", log.Fields{"device-id": agent.deviceID})
585 if agent.device.Root {
586 agent.requestQueue.RequestComplete()
587 return nil, status.Errorf(codes.FailedPrecondition, "device-id:%s, is an OLT. Image update "+
588 "not supported by VOLTHA. Use Device Manager or other means", agent.deviceID)
589 }
590
591 cloned := agent.cloneDeviceWithoutLock()
khenaidood948f772021-08-11 17:49:24 -0400592 if !agent.proceedWithRequest(cloned) {
593 agent.requestQueue.RequestComplete()
594 return nil, status.Errorf(codes.FailedPrecondition, "%s", "cannot complete operation as device deletion is in progress or reconciling is in progress/failed")
595 }
ssiddiquif076cb82021-04-23 10:47:04 +0530596
597 // Send the request to the adapter
khenaidood948f772021-08-11 17:49:24 -0400598 client, err := agent.adapterMgr.GetAdapterClient(ctx, agent.adapterEndpoint)
599 if err != nil {
600 logger.Errorw(ctx, "grpc-client-nil",
601 log.Fields{
602 "error": err,
603 "device-id": agent.deviceID,
604 "device-type": agent.deviceType,
605 "adapter-endpoint": cloned.AdapterEndpoint,
606 })
607 agent.requestQueue.RequestComplete()
608 return nil, err
609 }
610 subCtx, cancel := context.WithTimeout(log.WithSpanFromContext(context.Background(), ctx), agent.rpcTimeout)
ssiddiquif076cb82021-04-23 10:47:04 +0530611 defer cancel()
612 subCtx = coreutils.WithRPCMetadataFromContext(subCtx, ctx)
613
ssiddiquif076cb82021-04-23 10:47:04 +0530614 agent.requestQueue.RequestComplete()
khenaidood948f772021-08-11 17:49:24 -0400615 return client.DownloadOnuImage(subCtx, request)
ssiddiquif076cb82021-04-23 10:47:04 +0530616}
617
618func (agent *Agent) getImageStatus(ctx context.Context, request *voltha.DeviceImageRequest) (*voltha.DeviceImageResponse, error) {
619 if err := agent.requestQueue.WaitForGreenLight(ctx); err != nil {
620 return nil, err
621 }
622
ssiddiquif076cb82021-04-23 10:47:04 +0530623 logger.Debugw(ctx, "get-image-status", log.Fields{"device-id": agent.deviceID})
624
khenaidood948f772021-08-11 17:49:24 -0400625 cloned := agent.cloneDeviceWithoutLock()
626 if !agent.proceedWithRequest(cloned) {
627 agent.requestQueue.RequestComplete()
628 return nil, status.Errorf(codes.FailedPrecondition, "%s", "cannot complete operation as device deletion is in progress or reconciling is in progress/failed")
629 }
630
631 // Send the request to the adapter
632 client, err := agent.adapterMgr.GetAdapterClient(ctx, agent.adapterEndpoint)
ssiddiquif076cb82021-04-23 10:47:04 +0530633 if err != nil {
khenaidood948f772021-08-11 17:49:24 -0400634 logger.Errorw(ctx, "grpc-client-nil",
635 log.Fields{
636 "error": err,
637 "device-id": agent.deviceID,
638 "device-type": agent.deviceType,
639 "adapter-endpoint": cloned.AdapterEndpoint,
640 })
641 agent.requestQueue.RequestComplete()
ssiddiquif076cb82021-04-23 10:47:04 +0530642 return nil, err
643 }
644
khenaidood948f772021-08-11 17:49:24 -0400645 subCtx, cancel := context.WithTimeout(log.WithSpanFromContext(context.Background(), ctx), agent.rpcTimeout)
646 defer cancel()
647 subCtx = coreutils.WithRPCMetadataFromContext(subCtx, ctx)
648
khenaidoo5d126902021-10-07 10:04:43 -0400649 agent.requestQueue.RequestComplete()
khenaidood948f772021-08-11 17:49:24 -0400650 return client.GetOnuImageStatus(subCtx, request)
ssiddiquif076cb82021-04-23 10:47:04 +0530651}
652
653func (agent *Agent) activateImageOnDevice(ctx context.Context, request *voltha.DeviceImageRequest) (*voltha.DeviceImageResponse, error) {
654 if err := agent.requestQueue.WaitForGreenLight(ctx); err != nil {
655 return nil, err
656 }
657
ssiddiquif076cb82021-04-23 10:47:04 +0530658 logger.Debugw(ctx, "activate-image-on-device", log.Fields{"device-id": agent.deviceID})
659
khenaidood948f772021-08-11 17:49:24 -0400660 cloned := agent.cloneDeviceWithoutLock()
661
662 if !agent.proceedWithRequest(cloned) {
663 agent.requestQueue.RequestComplete()
664 return nil, status.Errorf(codes.FailedPrecondition, "%s", "cannot complete operation as device deletion is in progress or reconciling is in progress/failed")
665 }
666
667 // Send the request to the adapter
668 client, err := agent.adapterMgr.GetAdapterClient(ctx, agent.adapterEndpoint)
ssiddiquif076cb82021-04-23 10:47:04 +0530669 if err != nil {
khenaidood948f772021-08-11 17:49:24 -0400670 logger.Errorw(ctx, "grpc-client-nil",
671 log.Fields{
672 "error": err,
673 "device-id": agent.deviceID,
674 "device-type": agent.deviceType,
675 "adapter-endpoint": cloned.AdapterEndpoint,
676 })
677 agent.requestQueue.RequestComplete()
ssiddiquif076cb82021-04-23 10:47:04 +0530678 return nil, err
679 }
680
khenaidood948f772021-08-11 17:49:24 -0400681 subCtx, cancel := context.WithTimeout(log.WithSpanFromContext(context.Background(), ctx), agent.rpcTimeout)
682 defer cancel()
683 subCtx = coreutils.WithRPCMetadataFromContext(subCtx, ctx)
684
685 agent.requestQueue.RequestComplete()
686 return client.ActivateOnuImage(subCtx, request)
ssiddiquif076cb82021-04-23 10:47:04 +0530687}
688
689func (agent *Agent) abortImageUpgradeToDevice(ctx context.Context, request *voltha.DeviceImageRequest) (*voltha.DeviceImageResponse, error) {
690 if err := agent.requestQueue.WaitForGreenLight(ctx); err != nil {
691 return nil, err
692 }
693
ssiddiquif076cb82021-04-23 10:47:04 +0530694 logger.Debugw(ctx, "abort-image-on-device", log.Fields{"device-id": agent.deviceID})
695
khenaidood948f772021-08-11 17:49:24 -0400696 cloned := agent.cloneDeviceWithoutLock()
697
698 if !agent.proceedWithRequest(cloned) {
699 agent.requestQueue.RequestComplete()
700 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 +0530701 }
702
khenaidood948f772021-08-11 17:49:24 -0400703 // Send the request to the adapter
704 client, err := agent.adapterMgr.GetAdapterClient(ctx, agent.adapterEndpoint)
705 if err != nil {
706 logger.Errorw(ctx, "grpc-client-nil",
707 log.Fields{
708 "error": err,
709 "device-id": agent.deviceID,
710 "device-type": agent.deviceType,
711 "adapter-endpoint": cloned.AdapterEndpoint,
712 })
713 agent.requestQueue.RequestComplete()
714 return nil, err
715 }
716 subCtx, cancel := context.WithTimeout(log.WithSpanFromContext(context.Background(), ctx), agent.rpcTimeout)
717 defer cancel()
718 subCtx = coreutils.WithRPCMetadataFromContext(subCtx, ctx)
719
720 agent.requestQueue.RequestComplete()
khenaidood948f772021-08-11 17:49:24 -0400721 return client.AbortOnuImageUpgrade(subCtx, request)
ssiddiquif076cb82021-04-23 10:47:04 +0530722}
723
724func (agent *Agent) commitImage(ctx context.Context, request *voltha.DeviceImageRequest) (*voltha.DeviceImageResponse, error) {
725 if err := agent.requestQueue.WaitForGreenLight(ctx); err != nil {
726 return nil, err
727 }
728
ssiddiquif076cb82021-04-23 10:47:04 +0530729 logger.Debugw(ctx, "commit-image-on-device", log.Fields{"device-id": agent.deviceID})
730
khenaidood948f772021-08-11 17:49:24 -0400731 cloned := agent.cloneDeviceWithoutLock()
732
733 if !agent.proceedWithRequest(cloned) {
734 agent.requestQueue.RequestComplete()
735 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 +0530736 }
737
khenaidood948f772021-08-11 17:49:24 -0400738 // Send the request to the adapter
739 client, err := agent.adapterMgr.GetAdapterClient(ctx, agent.adapterEndpoint)
740 if err != nil {
741 logger.Errorw(ctx, "grpc-client-nil",
742 log.Fields{
743 "error": err,
744 "device-id": agent.deviceID,
745 "device-type": agent.deviceType,
746 "adapter-endpoint": cloned.AdapterEndpoint,
747 })
748 agent.requestQueue.RequestComplete()
749 return nil, err
750 }
751 subCtx, cancel := context.WithTimeout(log.WithSpanFromContext(context.Background(), ctx), agent.rpcTimeout)
752 defer cancel()
753 subCtx = coreutils.WithRPCMetadataFromContext(subCtx, ctx)
754
khenaidoo5d126902021-10-07 10:04:43 -0400755 agent.requestQueue.RequestComplete()
khenaidood948f772021-08-11 17:49:24 -0400756 return client.CommitOnuImage(subCtx, request)
ssiddiquif076cb82021-04-23 10:47:04 +0530757}
758
759func (agent *Agent) getOnuImages(ctx context.Context, id *common.ID) (*voltha.OnuImages, error) {
760 if err := agent.requestQueue.WaitForGreenLight(ctx); err != nil {
761 return nil, err
762 }
763
ssiddiqui47348f62021-05-20 20:41:15 +0530764 logger.Debug(ctx, "get-onu-images")
ssiddiquif076cb82021-04-23 10:47:04 +0530765
khenaidood948f772021-08-11 17:49:24 -0400766 cloned := agent.cloneDeviceWithoutLock()
767
768 if !agent.proceedWithRequest(cloned) {
769 agent.requestQueue.RequestComplete()
770 return nil, status.Errorf(codes.FailedPrecondition, "%s", "cannot complete operation as device deletion is in progress or reconciling is in progress/failed")
771 }
772
ssiddiquif076cb82021-04-23 10:47:04 +0530773 // Send the request to the adapter
khenaidood948f772021-08-11 17:49:24 -0400774 client, err := agent.adapterMgr.GetAdapterClient(ctx, agent.adapterEndpoint)
ssiddiquif076cb82021-04-23 10:47:04 +0530775 if err != nil {
khenaidood948f772021-08-11 17:49:24 -0400776 logger.Errorw(ctx, "grpc-client-nil",
777 log.Fields{
778 "error": err,
779 "device-id": agent.deviceID,
780 "device-type": agent.deviceType,
781 "adapter-endpoint": cloned.AdapterEndpoint,
782 })
783 agent.requestQueue.RequestComplete()
ssiddiquif076cb82021-04-23 10:47:04 +0530784 return nil, err
785 }
786
khenaidood948f772021-08-11 17:49:24 -0400787 agent.requestQueue.RequestComplete()
788 return client.GetOnuImages(ctx, id)
ssiddiquif076cb82021-04-23 10:47:04 +0530789}