(ctx context.Context, client kubectl.Client, pod *v1.Pod, container string, fi fs.FileInfo, bytesReader io.Reader)
| 288 | } |
| 289 | |
| 290 | func injectSyncHelperFromBytes(ctx context.Context, client kubectl.Client, pod *v1.Pod, container string, fi fs.FileInfo, bytesReader io.Reader) error { |
| 291 | writerComplete := make(chan struct{}) |
| 292 | readerComplete := make(chan struct{}) |
| 293 | |
| 294 | // Compress the sync helper and then copy it to the container |
| 295 | reader, writer := io.Pipe() |
| 296 | var ( |
| 297 | retErr error |
| 298 | setRetErr sync.Once |
| 299 | ) |
| 300 | |
| 301 | go func() { |
| 302 | defer close(readerComplete) |
| 303 | defer func() { |
| 304 | if r := recover(); r != nil { |
| 305 | setRetErr.Do(func() { |
| 306 | retErr = fmt.Errorf("%v", r) |
| 307 | }) |
| 308 | } |
| 309 | }() |
| 310 | defer reader.Close() |
| 311 | |
| 312 | err := client.CopyFromReader(ctx, pod, container, "/tmp", reader) |
| 313 | setRetErr.Do(func() { |
| 314 | retErr = err |
| 315 | }) |
| 316 | }() |
| 317 | |
| 318 | go func() { |
| 319 | defer close(writerComplete) |
| 320 | defer func() { |
| 321 | if r := recover(); r != nil { |
| 322 | setRetErr.Do(func() { |
| 323 | retErr = fmt.Errorf("%v", r) |
| 324 | }) |
| 325 | } |
| 326 | }() |
| 327 | defer writer.Close() |
| 328 | |
| 329 | // Use compression |
| 330 | gw := gzip.NewWriter(writer) |
| 331 | defer gw.Close() |
| 332 | |
| 333 | // Create tar writer |
| 334 | tarWriter := tar.NewWriter(gw) |
| 335 | defer tarWriter.Close() |
| 336 | |
| 337 | hdr, err := tar.FileInfoHeader(fi, DevSpaceHelperTempFolder) |
| 338 | if err != nil { |
| 339 | setRetErr.Do(func() { |
| 340 | retErr = err |
| 341 | }) |
| 342 | return |
| 343 | } |
| 344 | |
| 345 | hdr.Name = "devspacehelper" |
| 346 | |
| 347 | // Set permissions correctly |
no test coverage detected