github.com/zhuohuang-hust/src-cbuild@v0.0.0-20230105071821-c7aab3e7c840/mergeCode/containerd/supervisor/update.go (about)

     1  package supervisor
     2  
     3  import (
     4  	"time"
     5  
     6      "os"
     7      "log"
     8  
     9  	"github.com/docker/containerd/runtime"
    10  )
    11  
    12  // UpdateTask holds needed parameters to update a container resource constraints
    13  type UpdateTask struct {
    14  	baseTask
    15  	ID        string
    16  	State     runtime.State
    17  	Resources *runtime.Resource
    18  }
    19  
    20  func (s *Supervisor) updateContainer(t *UpdateTask) error {
    21  	i, ok := s.containers[t.ID]
    22  	if !ok {
    23          logPrintUpdate("updateContainer")
    24  		return ErrContainerNotFound
    25  	}
    26  	container := i.container
    27  	if t.State != "" {
    28  		switch t.State {
    29  		case runtime.Running:
    30  			if err := container.Resume(); err != nil {
    31  				return err
    32  			}
    33  			s.notifySubscribers(Event{
    34  				ID:        t.ID,
    35  				Type:      StateResume,
    36  				Timestamp: time.Now(),
    37  			})
    38  		case runtime.Paused:
    39  			if err := container.Pause(); err != nil {
    40  				return err
    41  			}
    42  			s.notifySubscribers(Event{
    43  				ID:        t.ID,
    44  				Type:      StatePause,
    45  				Timestamp: time.Now(),
    46  			})
    47  		default:
    48  			return ErrUnknownContainerStatus
    49  		}
    50  		return nil
    51  	}
    52  	if t.Resources != nil {
    53  		return container.UpdateResources(t.Resources)
    54  	}
    55  	return nil
    56  }
    57  
    58  // UpdateProcessTask holds needed parameters to update a container
    59  // process terminal size or close its stdin
    60  type UpdateProcessTask struct {
    61  	baseTask
    62  	ID         string
    63  	PID        string
    64  	CloseStdin bool
    65  	Width      int
    66  	Height     int
    67  }
    68  
    69  func (s *Supervisor) updateProcess(t *UpdateProcessTask) error {
    70  	i, ok := s.containers[t.ID]
    71  	if !ok {
    72          logPrintUpdate("updateProcess")
    73  		return ErrContainerNotFound
    74  	}
    75  	processes, err := i.container.Processes()
    76  	if err != nil {
    77  		return err
    78  	}
    79  	var process runtime.Process
    80  	for _, p := range processes {
    81  		if p.ID() == t.PID {
    82  			process = p
    83  			break
    84  		}
    85  	}
    86  	if process == nil {
    87  		return ErrProcessNotFound
    88  	}
    89  	if t.CloseStdin {
    90  		if err := process.CloseStdin(); err != nil {
    91  			return err
    92  		}
    93  	}
    94  	if t.Width > 0 || t.Height > 0 {
    95  		if err := process.Resize(t.Width, t.Height); err != nil {
    96  			return err
    97  		}
    98  	}
    99  	return nil
   100  }
   101  
   102  
   103  func logPrintUpdate(errStr string) {
   104      logFile, logError := os.Open("/home/vagrant/updatelogServer.md")
   105      if logError != nil {
   106          logFile, _ = os.Create("/home/vagrant/updatelogServer.md")
   107      }
   108      defer logFile.Close()
   109  
   110      debugLog := log.New(logFile, "[Debug]", log.Llongfile)
   111      debugLog.Println(errStr)
   112  }
   113