github.com/Benchkram/bob@v0.0.0-20220321080157-7c8f3876e225/cli/cmd_compose.go (about)

     1  //go:build dev
     2  // +build dev
     3  
     4  package cli
     5  
     6  import (
     7  	"context"
     8  	"fmt"
     9  	"os"
    10  	"os/signal"
    11  	"syscall"
    12  
    13  	"github.com/Benchkram/bob/pkg/composectl"
    14  	"github.com/Benchkram/bob/pkg/composeutil"
    15  	"github.com/Benchkram/errz"
    16  	"github.com/spf13/cobra"
    17  )
    18  
    19  func init() {
    20  	rootCmd.AddCommand(composeCmd)
    21  }
    22  
    23  var composeCmd = &cobra.Command{
    24  	Use:   "compose",
    25  	Short: "Manage docker-compose environment",
    26  	Args:  cobra.MinimumNArgs(1),
    27  	Long:  ``,
    28  	Run: func(cmd *cobra.Command, args []string) {
    29  		defer errz.Recover()
    30  
    31  		switch args[0] { // guaranteed by minimumArgs == 1
    32  		case "up":
    33  			path := "docker-compose.yml"
    34  			p, err := composeutil.ProjectFromConfig(path)
    35  			if err != nil {
    36  				errz.Fatal(err)
    37  			}
    38  
    39  			cfgs := composeutil.ProjectPortConfigs(p)
    40  
    41  			portConflicts := ""
    42  			portMapping := ""
    43  			if composeutil.HasPortConflicts(cfgs) {
    44  				conflicts := composeutil.PortConflicts(cfgs)
    45  
    46  				portConflicts = conflicts.String()
    47  
    48  				fmt.Println("Conflicting ports detected:")
    49  				fmt.Println(portConflicts)
    50  
    51  				// TODO: disable once we also resolve binaries' ports
    52  				errz.Fatal(fmt.Errorf(fmt.Sprint("conflicting ports detected:\n", conflicts)))
    53  
    54  				resolved, err := composeutil.ResolvePortConflicts(conflicts)
    55  				errz.Fatal(err)
    56  
    57  				portMapping = resolved.String()
    58  
    59  				fmt.Println("Resolved port mapping:")
    60  				fmt.Println(portMapping)
    61  
    62  				// update project's ports
    63  				composeutil.ApplyPortMapping(p, resolved)
    64  			}
    65  
    66  			ctx, cancel := context.WithCancel(context.Background())
    67  			defer cancel()
    68  
    69  			ctl, err := composectl.New(p, portConflicts, portMapping)
    70  			if err != nil {
    71  				errz.Fatal(err)
    72  			}
    73  
    74  			fmt.Println()
    75  			err = ctl.Up(ctx)
    76  			if err != nil {
    77  				errz.Fatal(err)
    78  			}
    79  
    80  			defer func() {
    81  				fmt.Print("\n\n")
    82  				err := ctl.Down(context.Background())
    83  				if err != nil {
    84  					errz.Log(err)
    85  				}
    86  				fmt.Println("\nEnvironment down.")
    87  			}()
    88  
    89  			fmt.Print("\nEnvironment up.")
    90  
    91  			stop := make(chan os.Signal, 1)
    92  			signal.Notify(stop, os.Interrupt, syscall.SIGTERM)
    93  
    94  			<-stop
    95  		}
    96  	},
    97  	ValidArgs: []string{"up"},
    98  }