github.com/containerd/nerdctl@v1.7.7/pkg/composer/pause.go (about)

     1  /*
     2     Copyright The containerd Authors.
     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  
    17  package composer
    18  
    19  import (
    20  	"context"
    21  	"fmt"
    22  	"io"
    23  	"sync"
    24  
    25  	"github.com/containerd/containerd"
    26  	"github.com/containerd/nerdctl/pkg/containerutil"
    27  	"github.com/containerd/nerdctl/pkg/labels"
    28  	"golang.org/x/sync/errgroup"
    29  )
    30  
    31  // Pause pauses service containers belonging to `services`.
    32  func (c *Composer) Pause(ctx context.Context, services []string, writer io.Writer) error {
    33  	serviceNames, err := c.ServiceNames(services...)
    34  	if err != nil {
    35  		return err
    36  	}
    37  	containers, err := c.Containers(ctx, serviceNames...)
    38  	if err != nil {
    39  		return err
    40  	}
    41  
    42  	var mu sync.Mutex
    43  
    44  	eg, ctx := errgroup.WithContext(ctx)
    45  	for _, container := range containers {
    46  		container := container
    47  		eg.Go(func() error {
    48  			if err := containerutil.Pause(ctx, c.client, container.ID()); err != nil {
    49  				return err
    50  			}
    51  			info, err := container.Info(ctx, containerd.WithoutRefreshedMetadata)
    52  			if err != nil {
    53  				return err
    54  			}
    55  
    56  			mu.Lock()
    57  			defer mu.Unlock()
    58  			_, err = fmt.Fprintln(writer, info.Labels[labels.Name])
    59  
    60  			return err
    61  		})
    62  	}
    63  
    64  	return eg.Wait()
    65  }
    66  
    67  // Unpause unpauses service containers belonging to `services`.
    68  func (c *Composer) Unpause(ctx context.Context, services []string, writer io.Writer) error {
    69  	serviceNames, err := c.ServiceNames(services...)
    70  	if err != nil {
    71  		return err
    72  	}
    73  	containers, err := c.Containers(ctx, serviceNames...)
    74  	if err != nil {
    75  		return err
    76  	}
    77  
    78  	var mu sync.Mutex
    79  
    80  	eg, ctx := errgroup.WithContext(ctx)
    81  	for _, container := range containers {
    82  		container := container
    83  		eg.Go(func() error {
    84  			if err := containerutil.Unpause(ctx, c.client, container.ID()); err != nil {
    85  				return err
    86  			}
    87  			info, err := container.Info(ctx, containerd.WithoutRefreshedMetadata)
    88  			if err != nil {
    89  				return err
    90  			}
    91  
    92  			mu.Lock()
    93  			defer mu.Unlock()
    94  			_, err = fmt.Fprintln(writer, info.Labels[labels.Name])
    95  
    96  			return err
    97  		})
    98  	}
    99  
   100  	return eg.Wait()
   101  }