diff --git a/cmd/cardano-up/down.go b/cmd/cardano-up/down.go new file mode 100644 index 0000000..024fc05 --- /dev/null +++ b/cmd/cardano-up/down.go @@ -0,0 +1,31 @@ +package main + +import ( + "fmt" + "log/slog" + "os" + + "github.com/blinklabs-io/cardano-up/pkgmgr" + "github.com/spf13/cobra" +) + +func downCommand() *cobra.Command { + cmd := &cobra.Command{ + Use: "down", + Short: "Stops all Docker containers", + Long: `Stops all running Docker containers for installed packages in the current context.`, + RunE: func(cmd *cobra.Command, args []string) error { + pm, err := pkgmgr.NewDefaultPackageManager() + if err != nil { + slog.Error(fmt.Sprintf("failed to create package manager: %s", err)) + os.Exit(1) + } + if err := pm.Down(); err != nil { + slog.Error(err.Error()) + os.Exit(1) + } + return nil + }, + } + return cmd +} diff --git a/cmd/cardano-up/main.go b/cmd/cardano-up/main.go index 2d4d7f4..8176417 100644 --- a/cmd/cardano-up/main.go +++ b/cmd/cardano-up/main.go @@ -70,6 +70,8 @@ func main() { infoCommand(), installCommand(), uninstallCommand(), + upCommand(), + downCommand(), ) if err := rootCmd.Execute(); err != nil { diff --git a/cmd/cardano-up/up.go b/cmd/cardano-up/up.go new file mode 100644 index 0000000..7c17ee7 --- /dev/null +++ b/cmd/cardano-up/up.go @@ -0,0 +1,31 @@ +package main + +import ( + "fmt" + "log/slog" + "os" + + "github.com/blinklabs-io/cardano-up/pkgmgr" + "github.com/spf13/cobra" +) + +func upCommand() *cobra.Command { + cmd := &cobra.Command{ + Use: "up", + Short: "Starts all Docker containers", + Long: `Starts all stopped Docker containers for installed packages in the current context.`, + RunE: func(cmd *cobra.Command, args []string) error { + pm, err := pkgmgr.NewDefaultPackageManager() + if err != nil { + slog.Error(fmt.Sprintf("failed to create package manager: %s", err)) + os.Exit(1) + } + if err := pm.Up(); err != nil { + slog.Error(err.Error()) + os.Exit(1) + } + return nil + }, + } + return cmd +} diff --git a/pkgmgr/package.go b/pkgmgr/package.go index cbb9ff9..05d8616 100644 --- a/pkgmgr/package.go +++ b/pkgmgr/package.go @@ -17,8 +17,10 @@ package pkgmgr import ( "fmt" "io/fs" + "log/slog" "os" "path/filepath" + "strings" ) type Package struct { @@ -115,6 +117,60 @@ func (p Package) uninstall(cfg Config, context string) error { return nil } +func (p Package) startService(cfg Config, context string) error { + pkgName := fmt.Sprintf("%s-%s-%s", p.Name, p.Version, context) + + var startErrors []string + for _, step := range p.InstallSteps { + if step.Docker != nil { + dockerService, err := NewDockerServiceFromContainerName(fmt.Sprintf("%s-%s", pkgName, step.Docker.ContainerName), cfg.Logger) + if err != nil { + startErrors = append(startErrors, fmt.Sprintf("error initializing Docker service for container %s: %v", dockerService.ContainerName, err)) + continue + } + // Start the Docker container if it's not running + slog.Info(fmt.Sprintf("Starting Docker container %s", dockerService.ContainerName)) + if err := dockerService.Start(); err != nil { + startErrors = append(startErrors, fmt.Sprintf("failed to start Docker container %s: %v", dockerService.ContainerName, err)) + } + } + } + + if len(startErrors) > 0 { + slog.Error(strings.Join(startErrors, "\n")) + return ErrOperationFailed + } + + return nil +} + +func (p Package) stopService(cfg Config, context string) error { + pkgName := fmt.Sprintf("%s-%s-%s", p.Name, p.Version, context) + + var stopErrors []string + for _, step := range p.InstallSteps { + if step.Docker != nil { + dockerService, err := NewDockerServiceFromContainerName(fmt.Sprintf("%s-%s", pkgName, step.Docker.ContainerName), cfg.Logger) + if err != nil { + stopErrors = append(stopErrors, fmt.Sprintf("error initializing Docker service for container %s: %v", dockerService.ContainerName, err)) + continue + } + // Stop the Docker container + slog.Info(fmt.Sprintf("Stopping container %s", dockerService.ContainerName)) + if err := dockerService.Stop(); err != nil { + stopErrors = append(stopErrors, fmt.Sprintf("failed to stop Docker container %s: %v", dockerService.ContainerName, err)) + } + } + } + + if len(stopErrors) > 0 { + slog.Error(strings.Join(stopErrors, "\n")) + return ErrOperationFailed + } + + return nil +} + type PackageInstallStep struct { Docker *PackageInstallStepDocker `yaml:"docker,omitempty"` File *PackageInstallStepFile `yaml:"file,omitempty"` diff --git a/pkgmgr/pkgmgr.go b/pkgmgr/pkgmgr.go index ff2e1a1..a144ba2 100644 --- a/pkgmgr/pkgmgr.go +++ b/pkgmgr/pkgmgr.go @@ -85,6 +85,31 @@ func (p *PackageManager) AvailablePackages() []Package { return p.availablePackages[:] } +func (p *PackageManager) Up() error { + // Find installed packages + installedPackages := p.InstalledPackages() + for _, tmpPackage := range installedPackages { + err := tmpPackage.Package.startService(p.config, tmpPackage.Context) + if err != nil { + return err + } + + } + return nil +} + +func (p *PackageManager) Down() error { + // Find installed packages + installedPackages := p.InstalledPackages() + for _, tmpPackage := range installedPackages { + err := tmpPackage.Package.stopService(p.config, tmpPackage.Context) + if err != nil { + return err + } + } + return nil +} + func (p *PackageManager) InstalledPackages() []InstalledPackage { var ret []InstalledPackage for _, pkg := range p.state.InstalledPackages {