github.1485827954.workers.dev/nektos/act@v0.2.63/pkg/container/docker_network.go (about)

     1  //go:build !(WITHOUT_DOCKER || !(linux || darwin || windows || netbsd))
     2  
     3  package container
     4  
     5  import (
     6  	"context"
     7  
     8  	"github.com/docker/docker/api/types"
     9  	"github.com/nektos/act/pkg/common"
    10  )
    11  
    12  func NewDockerNetworkCreateExecutor(name string) common.Executor {
    13  	return func(ctx context.Context) error {
    14  		cli, err := GetDockerClient(ctx)
    15  		if err != nil {
    16  			return err
    17  		}
    18  		defer cli.Close()
    19  
    20  		// Only create the network if it doesn't exist
    21  		networks, err := cli.NetworkList(ctx, types.NetworkListOptions{})
    22  		if err != nil {
    23  			return err
    24  		}
    25  		common.Logger(ctx).Debugf("%v", networks)
    26  		for _, network := range networks {
    27  			if network.Name == name {
    28  				common.Logger(ctx).Debugf("Network %v exists", name)
    29  				return nil
    30  			}
    31  		}
    32  
    33  		_, err = cli.NetworkCreate(ctx, name, types.NetworkCreate{
    34  			Driver: "bridge",
    35  			Scope:  "local",
    36  		})
    37  		if err != nil {
    38  			return err
    39  		}
    40  
    41  		return nil
    42  	}
    43  }
    44  
    45  func NewDockerNetworkRemoveExecutor(name string) common.Executor {
    46  	return func(ctx context.Context) error {
    47  		cli, err := GetDockerClient(ctx)
    48  		if err != nil {
    49  			return err
    50  		}
    51  		defer cli.Close()
    52  
    53  		// Make sure that all network of the specified name are removed
    54  		// cli.NetworkRemove refuses to remove a network if there are duplicates
    55  		networks, err := cli.NetworkList(ctx, types.NetworkListOptions{})
    56  		if err != nil {
    57  			return err
    58  		}
    59  		common.Logger(ctx).Debugf("%v", networks)
    60  		for _, network := range networks {
    61  			if network.Name == name {
    62  				result, err := cli.NetworkInspect(ctx, network.ID, types.NetworkInspectOptions{})
    63  				if err != nil {
    64  					return err
    65  				}
    66  
    67  				if len(result.Containers) == 0 {
    68  					if err = cli.NetworkRemove(ctx, network.ID); err != nil {
    69  						common.Logger(ctx).Debugf("%v", err)
    70  					}
    71  				} else {
    72  					common.Logger(ctx).Debugf("Refusing to remove network %v because it still has active endpoints", name)
    73  				}
    74  			}
    75  		}
    76  
    77  		return err
    78  	}
    79  }