Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

support multiple compose files and code refactoring #13

Open
wants to merge 13 commits into
base: develop
Choose a base branch
from
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
bin
.DS_Store
.idea

/dcsg
/dcsg
35 changes: 10 additions & 25 deletions dcsg.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,15 +10,7 @@ import (
"github.com/pkg/errors"
)

func newDscg(dockerComposeFile, projectName string, dryRun bool, doPull bool) (*dcsg, error) {
cleanedFilePath, err := filepath.Abs(dockerComposeFile)
if err != nil {
return nil, err
}

if !fileExists(cleanedFilePath) {
return nil, fmt.Errorf("The Docker Compose file %q does not exist", cleanedFilePath)
}
func newDscg(dockerComposeFile string, dockerComposeExtensionFiles []string, projectName string, dryRun bool, doPull bool) (*dcsg, error) {

if projectName == "" {
projectNameFromDirectory, projectNameError := getProjectName(dockerComposeFile)
Expand All @@ -40,26 +32,28 @@ func newDscg(dockerComposeFile, projectName string, dryRun bool, doPull bool) (*
commandExecutor := newExecutor(os.Stdin, os.Stdout, os.Stderr, "", dryRun)

return &dcsg{
projectDirectory: projectDirectory,
dockerComposeFileName: dockerComposeFileName,
projectName: projectName,
projectDirectory: projectDirectory,
dockerComposeFileName: dockerComposeFileName,
dockerComposeExtensionFileNames: dockerComposeExtensionFiles,
projectName: projectName,

installer: &systemdInstaller{systemdDirectory, commandExecutor, dryRun, doPull},
uninstaller: &systemdUninstaller{systemdDirectory, commandExecutor, dryRun},
}, nil
}

type dcsg struct {
projectDirectory string
dockerComposeFileName string
projectName string
projectDirectory string
dockerComposeFileName string
dockerComposeExtensionFileNames []string
projectName string

installer installer
uninstaller uninstaller
}

func (service dcsg) Install() error {
err := service.installer.Install(service.projectDirectory, service.dockerComposeFileName, service.projectName)
err := service.installer.Install(service.projectDirectory, service.dockerComposeFileName, service.dockerComposeExtensionFileNames, service.projectName)
if err != nil {
return errors.Wrap(err, "Installation failed")
}
Expand Down Expand Up @@ -87,15 +81,6 @@ func getProjectDirectory(dockerComposeFile string) (string, error) {

var invalidProjectNameCharacters = regexp.MustCompile("[^a-z0-9]")

func fileExists(filePath string) bool {
_, err := os.Stat(filePath)
if err != nil {
return false
}

return true
}

func getProjectName(dockerComposeFile string) (string, error) {
directoryPath, err := getProjectDirectory(dockerComposeFile)
if err != nil {
Expand Down
30 changes: 16 additions & 14 deletions installer.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import (
)

type installer interface {
Install(projectDirectory, dockerComposeFileName, projectName string) error
Install(projectDirectory string, dockerComposeFileName string, dockerComposeExtensionFileNames []string, projectName string) error
}

type systemdInstaller struct {
Expand All @@ -21,14 +21,15 @@ type systemdInstaller struct {
doPull bool
}

func (installer *systemdInstaller) Install(projectDirectory, dockerComposeFileName, projectName string) error {
func (installer *systemdInstaller) Install(projectDirectory string, dockerComposeFileName string, dockerComposeExtensionFileNames []string, projectName string) error {

serviceName := getServiceName(projectName)
serviceViewModel := serviceDefinition{
ProjectName: projectName,
ProjectDirectory: projectDirectory,
DockerComposeFile: dockerComposeFileName,
DoPull: installer.doPull,
ProjectName: projectName,
ProjectDirectory: projectDirectory,
DockerComposeFile: dockerComposeFileName,
DockerComposeExtensionFiles: dockerComposeExtensionFileNames,
DoPull: installer.doPull,
}

if err := installer.createSystemdService(serviceViewModel); err != nil {
Expand Down Expand Up @@ -95,19 +96,20 @@ RestartSec=10
TimeoutSec=300
WorkingDirectory={{ .ProjectDirectory }}
{{- if .DoPull }}
ExecStartPre=/usr/bin/env docker-compose -p "{{ .ProjectName }}" -f "{{ .DockerComposeFile }}" pull
ExecStartPre=/usr/bin/env docker-compose -p "{{ .ProjectName }}" -f "{{ .DockerComposeFile }}" {{- range .DockerComposeExtensionFiles }} -f "{{ . -}}" {{ end }} pull
{{- end }}
ExecStart=/usr/bin/env docker-compose -p "{{ .ProjectName }}" -f "{{ .DockerComposeFile }}" up
ExecStop=/usr/bin/env docker-compose -p "{{ .ProjectName }}" -f "{{ .DockerComposeFile }}" stop
ExecStopPost=/usr/bin/env docker-compose -p "{{ .ProjectName }}" -f "{{ .DockerComposeFile }}" down
ExecStart=/usr/bin/env docker-compose -p "{{ .ProjectName }}" -f "{{ .DockerComposeFile }}" {{- range .DockerComposeExtensionFiles }} -f "{{ . -}}" {{ end }} up
ExecStop=/usr/bin/env docker-compose -p "{{ .ProjectName }}" -f "{{ .DockerComposeFile }}" {{- range .DockerComposeExtensionFiles }} -f "{{ . -}}" {{ end }} stop
ExecStopPost=/usr/bin/env docker-compose -p "{{ .ProjectName }}" -f "{{ .DockerComposeFile }}" {{- range .DockerComposeExtensionFiles }} -f "{{ . -}}" {{ end }} down

[Install]
WantedBy=docker.service
`

type serviceDefinition struct {
ProjectName string
ProjectDirectory string
DockerComposeFile string
DoPull bool
ProjectName string
ProjectDirectory string
DockerComposeFile string
DockerComposeExtensionFiles []string
DoPull bool
}
16 changes: 9 additions & 7 deletions installer_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,16 +10,17 @@ import (
func getTestInstaller() *systemdInstaller {
targetDirectory := os.TempDir()
commandExecutor := newExecutor(os.Stdin, os.Stdout, os.Stderr, "", false)
return &systemdInstaller{targetDirectory, commandExecutor, false}
return &systemdInstaller{targetDirectory, commandExecutor, false, false}
}

func Test_createSystemdService_NoErrorIsReturned(t *testing.T) {
installer := getTestInstaller()

serviceViewModel := serviceDefinition{
ProjectName: "exampleproject",
ProjectDirectory: "/var/www/example-project",
DockerComposeFile: "docker-compose.yml",
ProjectName: "exampleproject",
ProjectDirectory: "/var/www/example-project",
DockerComposeFile: "docker-compose.yml",
DockerComposeExtensionFiles: []string{"override.yml"},
}

result := installer.createSystemdService(serviceViewModel)
Expand All @@ -34,9 +35,10 @@ func Test_createSystemdService_ServiceFileIsWritten(t *testing.T) {
installer := getTestInstaller()

serviceViewModel := serviceDefinition{
ProjectName: "exampleproject",
ProjectDirectory: "/var/www/example-project",
DockerComposeFile: "docker-compose.yml",
ProjectName: "exampleproject",
ProjectDirectory: "/var/www/example-project",
DockerComposeFile: "docker-compose.yml",
DockerComposeExtensionFiles: []string{"override.yml"},
}

result := installer.createSystemdService(serviceViewModel)
Expand Down
15 changes: 8 additions & 7 deletions main.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,15 +15,16 @@ var (
appDryRun = app.Flag("dry-run", "Print details of what would be done but do not install anything").Short('n').Bool()

// install
installCommand = app.Command("install", "Register a systemd service for the given docker-compose file")
installDockerComposeFile = installCommand.Arg("docker-compose-file", "A docker-compose file").Default("docker-compose.yml").String()
installProjectName = installCommand.Arg("project-name", "The project name of the docker-compose project").String()
installDontPull = installCommand.Flag("no-pull", "The project name of the docker-compose project").Bool()
installCommand = app.Command("install", "Register a systemd service for the given docker-compose file")
installProjectName = installCommand.Arg("project-name", "The project name of the docker-compose project").String()
installDockerComposeFile = installCommand.Arg("docker-compose-file", "A docker-compose file").ExistingFile()
installDockerComposeExtensionFiles = installCommand.Arg("additional-docker-compose-yamls", "Additional docker-compose files").ExistingFiles()
installDontPull = installCommand.Flag("no-pull", "Whether you want to pull the image before startup or not").Default("false").Bool()

// uninstall
uninstallCommand = app.Command("uninstall", "Uninstall the systemd service for the given docker-compose file")
uninstallDockerComposeFile = uninstallCommand.Arg("docker-compose-file", "A docker-compose file").Default("docker-compose.yml").String()
uinstallProjectName = uninstallCommand.Arg("project-name", "The project name of the docker-compose project").String()
uninstallProjectName = uninstallCommand.Arg("project-name", "The project name of the docker-compose project").String()
)

func init() {
Expand All @@ -39,7 +40,7 @@ func handleCommandlineArgument(arguments []string) {
switch kingpin.MustParse(app.Parse(arguments)) {

case installCommand.FullCommand():
service, err := newDscg(*installDockerComposeFile, *installProjectName, *appDryRun, !(*installDontPull))
service, err := newDscg(*installDockerComposeFile, *installDockerComposeExtensionFiles, *installProjectName, *appDryRun, !(*installDontPull))
if err != nil {
fmt.Fprintf(os.Stderr, "%s\n", err)
os.Exit(1)
Expand All @@ -51,7 +52,7 @@ func handleCommandlineArgument(arguments []string) {
}

case uninstallCommand.FullCommand():
service, err := newDscg(*uninstallDockerComposeFile, *uinstallProjectName, *appDryRun, !(*installDontPull))
service, err := newDscg(*uninstallDockerComposeFile, *installDockerComposeExtensionFiles, *uninstallProjectName, *appDryRun, !(*installDontPull))
if err != nil {
fmt.Fprintf(os.Stderr, "%s\n", err)
os.Exit(1)
Expand Down