Skip to content
This repository has been archived by the owner on Jul 11, 2022. It is now read-only.

Commit

Permalink
add site command
Browse files Browse the repository at this point in the history
Signed-off-by: Jason McCallister <jason@craftcms.com>
  • Loading branch information
jasonmccallister committed Apr 6, 2020
1 parent fd68b28 commit 0bd44d4
Show file tree
Hide file tree
Showing 4 changed files with 137 additions and 27 deletions.
37 changes: 18 additions & 19 deletions internal/cmd/site.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,28 +25,31 @@ var (
Use: "add",
Short: "Add a site to machine",
RunE: func(cmd *cobra.Command, args []string) error {
name := config.GetString("machine", flagMachineName)
machineName := config.GetString("machine", flagMachineName)
php := config.GetString("php", flagPhpVersion)
path := args[0]
domain := args[1]
localDirectory := args[0]
domainName := args[1]

if err := validate.Path(path); err != nil {
if err := validate.Path(localDirectory); err != nil {
return err
}

if err := validate.Domain(domain); err != nil {
if err := validate.Domain(domainName); err != nil {
return err
}

var commands []nitro.Command

// attach the provided path to /app/sites/domain.test
commands = append(commands, nitro.Mount(name, path, domain))

// run the nginx add-site script
commands = append(commands, nitro.AddSiteScript(name, domain, php, flagPublicDir))

// todo edit the hosts file
// attach the provided localDirectory to /app/sites/domainName.test
commands = append(commands, nitro.Mount(machineName, localDirectory, domainName))
// create localDirectory directory
commands = append(commands, nitro.CreateNewDirectoryForSite(machineName, domainName))
// copy the template
commands = append(commands, nitro.CopyNginxTemplate(machineName, domainName))
// change template variables
commands = append(commands, nitro.ChangeVariablesInTemplate(machineName, domainName, flagPublicDir, php)...)
// make link for nginx localDirectory
commands = append(commands, nitro.LinkNginxSite(machineName, domainName))
// reload nginx
commands = append(commands, nitro.ReloadNginx(machineName))

if flagDebug {
for _, command := range commands {
Expand All @@ -56,11 +59,7 @@ var (
return nil
}

if err := nitro.Run(nitro.NewMultipassRunner("multipass"), commands); err != nil {
return err
}

return nil
return nitro.Run(nitro.NewMultipassRunner("multipass"), commands)
},
PostRun: func(cmd *cobra.Command, args []string) {
fmt.Println(
Expand Down
60 changes: 56 additions & 4 deletions internal/nitro/add_site.go
Original file line number Diff line number Diff line change
@@ -1,9 +1,61 @@
package nitro

func AddSiteScript(name, domain, php, dir string) Command {
import "fmt"

func CreateNewDirectoryForSite(name, site string) Command {
return Command{
Machine: name,
Type: "exec",
Chainable: true,
Args: []string{name, "--", "mkdir", "-p", "/home/ubuntu/sites/" + site},
}
}

func CopyNginxTemplate(name, site string) Command {
return Command{
Machine: name,
Type: "exec",
Chainable: true,
Args: []string{name, "--", "sudo", "cp", "/opt/nitro/nginx/template.conf", "/etc/nginx/sites-available/" + site},
}
}

func ChangeVariablesInTemplate(name, domain, dir, php string) []Command {
var commands []Command

commands = append(commands, changeVariableInNginxTemplate(name, domain, "CHANGEPATH", domain))
commands = append(commands, changeVariableInNginxTemplate(name, domain, "CHANGESERVERNAME", domain))
commands = append(commands, changeVariableInNginxTemplate(name, domain, "CHANGEPUBLICDIR", dir))
commands = append(commands, changeVariableInNginxTemplate(name, domain, "CHANGEPHPVERSION", php))

return commands
}

func changeVariableInNginxTemplate(name, site, variable, actual string) Command {
file := fmt.Sprintf("/etc/nginx/sites-available/%v", site)
sedCmd := "s|" + variable + "|" + actual + "|g"
return Command{
Machine: name,
Type: "exec",
Chainable: true,
Args: []string{name, "--", "sudo", "sed", "-i", sedCmd, file},
}
}

func LinkNginxSite(name, site string) Command {
return Command{
Machine: name,
Type: "exec",
Chainable: true,
Args: []string{name, "--", "sudo", "ln", "-s", "/etc/nginx/sites-available/" + site, "/etc/nginx/sites-enabled/"},
}
}

func ReloadNginx(name string) Command {
return Command{
Machine: name,
Type: "exec",
Args: []string{"--", "sudo", "bash", "/opt/nitro/nginx/add-site.sh", domain, php, dir},
Machine: name,
Type: "exec",
Chainable: true,
Args: []string{name, "--", "sudo", "service", "nginx", "restart"},
}
}
58 changes: 58 additions & 0 deletions internal/nitro/add_site_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
package nitro

import (
"reflect"
"testing"
)

func Test_changePathInNginxPath(t *testing.T) {
type args struct {
name string
site string
variable string
actual string
}
tests := []struct {
name string
args args
want Command
}{
{
name: "returns the correct sed site",
args: args{
name: "machine-name",
site: "example.test",
variable: "CHANGEPATH",
actual: "example.test",
},
want: Command{
Machine: "machine-name",
Type: "exec",
Chainable: true,
Args: []string{"machine-name", "--", "sudo", "sed", "-i", "s|CHANGEPATH|example.test|g", "/etc/nginx/sites-available/example.test"},
},
},
{
name: "returns the correct sed php version",
args: args{
name: "machine-name",
site: "another-site.test",
variable: "CHANGEPHPVERSION",
actual: "7.4",
},
want: Command{
Machine: "machine-name",
Type: "exec",
Chainable: true,
Args: []string{"machine-name", "--", "sudo", "sed", "-i", "s|CHANGEPHPVERSION|7.4|g", "/etc/nginx/sites-available/another-site.test"},
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
if got := changeVariableInNginxTemplate(tt.args.name, tt.args.site, tt.args.variable, tt.args.actual); !reflect.DeepEqual(got, tt.want) {
t.Errorf("changeVariableInNginxTemplate() = \n%v, \nwant:\n %v", got, tt.want)
}
})
}
}
9 changes: 5 additions & 4 deletions internal/nitro/mount.go
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
package nitro

func Mount(name, path, domain string) Command {
func Mount(name, folder, domain string) Command {
return Command{
Machine: name,
Type: "mount",
Args: []string{path, name + ":/app/sites/" + domain},
Machine: name,
Chainable: true,
Type: "mount",
Args: []string{folder, name + ":/app/sites/" + domain},
}
}

0 comments on commit 0bd44d4

Please # to comment.