github.com/apptainer/singularity@v3.1.1+incompatible/internal/pkg/runtime/engines/oci/cleanup.go (about)

     1  // Copyright (c) 2018, Sylabs Inc. All rights reserved.
     2  // This software is licensed under a 3-clause BSD license. Please consult the
     3  // LICENSE.md file distributed with the sources of this project regarding your
     4  // rights to use or distribute this software.
     5  
     6  package oci
     7  
     8  import (
     9  	"fmt"
    10  	"os"
    11  	"syscall"
    12  
    13  	"github.com/sylabs/singularity/internal/pkg/instance"
    14  	"github.com/sylabs/singularity/internal/pkg/sylog"
    15  	"github.com/sylabs/singularity/pkg/ociruntime"
    16  )
    17  
    18  // CleanupContainer cleans up the container
    19  func (engine *EngineOperations) CleanupContainer(fatal error, status syscall.WaitStatus) error {
    20  	if engine.EngineConfig.Cgroups != nil {
    21  		engine.EngineConfig.Cgroups.Remove()
    22  	}
    23  
    24  	pidFile := engine.EngineConfig.GetPidFile()
    25  	if pidFile != "" {
    26  		os.Remove(pidFile)
    27  	}
    28  
    29  	// if container wasn't created, delete instance files
    30  	if engine.EngineConfig.State.Status == ociruntime.Creating {
    31  		name := engine.CommonConfig.ContainerID
    32  		file, err := instance.Get(name, instance.OciSubDir)
    33  		if err != nil {
    34  			sylog.Warningf("no instance files found for %s: %s", name, err)
    35  			return nil
    36  		}
    37  		if err := file.Delete(); err != nil {
    38  			sylog.Warningf("failed to delete instance files: %s", err)
    39  		}
    40  		return nil
    41  	}
    42  
    43  	exitCode := 0
    44  	desc := ""
    45  
    46  	if fatal != nil {
    47  		exitCode = 255
    48  		desc = fatal.Error()
    49  	} else if status.Signaled() {
    50  		s := status.Signal()
    51  		exitCode = int(s) + 128
    52  		desc = fmt.Sprintf("interrupted by signal %s", s.String())
    53  	} else {
    54  		exitCode = status.ExitStatus()
    55  		desc = fmt.Sprintf("exited with code %d", status.ExitStatus())
    56  	}
    57  
    58  	engine.EngineConfig.State.ExitCode = &exitCode
    59  	engine.EngineConfig.State.ExitDesc = desc
    60  
    61  	if err := engine.updateState(ociruntime.Stopped); err != nil {
    62  		return err
    63  	}
    64  
    65  	if engine.EngineConfig.State.AttachSocket != "" {
    66  		os.Remove(engine.EngineConfig.State.AttachSocket)
    67  	}
    68  	if engine.EngineConfig.State.ControlSocket != "" {
    69  		os.Remove(engine.EngineConfig.State.ControlSocket)
    70  	}
    71  
    72  	return nil
    73  }