The `tls` name is no longer a reserved app name, and can be used by applications. This was previously a reserved app name due to it's use as a place for global SSL certificate files; Dokku has not supported global SSL certificates for many releases, and thus there is no need to reserve the name.
269 lines
5.2 KiB
Go
269 lines
5.2 KiB
Go
package apps
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"os"
|
|
"strings"
|
|
|
|
"github.com/dokku/dokku/plugins/common"
|
|
)
|
|
|
|
// CommandClone clones an app
|
|
func CommandClone(args []string, skipDeploy bool, ignoreExisting bool) error {
|
|
oldAppName, err := getAppName(args)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
newAppName, err := getNewAppName(args)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
if err = common.IsValidAppName(oldAppName); err != nil {
|
|
return err
|
|
}
|
|
|
|
if err = common.IsValidAppName(newAppName); err != nil {
|
|
return err
|
|
}
|
|
|
|
if err = appExists(oldAppName); err != nil {
|
|
return err
|
|
}
|
|
|
|
if err = appExists(newAppName); err == nil {
|
|
if ignoreExisting {
|
|
common.LogWarn("Name is already taken")
|
|
return nil
|
|
}
|
|
|
|
return errors.New("Name is already taken")
|
|
}
|
|
|
|
common.LogInfo1Quiet(fmt.Sprintf("Cloning %s to %s", oldAppName, newAppName))
|
|
if err = createApp(newAppName); err != nil {
|
|
return err
|
|
}
|
|
|
|
if err = common.PlugnTrigger("post-app-clone-setup", []string{oldAppName, newAppName}...); err != nil {
|
|
return err
|
|
}
|
|
|
|
if skipDeploy {
|
|
os.Setenv("SKIP_REBUILD", "true")
|
|
}
|
|
|
|
if err = common.PlugnTrigger("post-app-clone", []string{oldAppName, newAppName}...); err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// CommandCreate creates app via command line
|
|
func CommandCreate(args []string) error {
|
|
appName, err := getAppName(args)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return createApp(appName)
|
|
}
|
|
|
|
// CommandDestroy destroys an app
|
|
func CommandDestroy(args []string) error {
|
|
appName, err := getAppName(args)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
if len(args) >= 2 {
|
|
force := args[1]
|
|
if force == "force" {
|
|
os.Setenv("DOKKU_APPS_FORCE_DELETE", "1")
|
|
}
|
|
}
|
|
|
|
return destroyApp(appName)
|
|
}
|
|
|
|
// CommandExists checks if an app exists
|
|
func CommandExists(args []string) error {
|
|
appName, err := getAppName(args)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return appExists(appName)
|
|
}
|
|
|
|
// CommandList lists all apps
|
|
func CommandList(args []string) error {
|
|
common.LogInfo2Quiet("My Apps")
|
|
apps, err := common.DokkuApps()
|
|
if err != nil {
|
|
common.LogWarn(err.Error())
|
|
return nil
|
|
}
|
|
|
|
for _, appName := range apps {
|
|
common.Log(appName)
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// CommandLock locks an app for deployment
|
|
func CommandLock(args []string) error {
|
|
appName, err := getAppName(args)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
if err := common.VerifyAppName(appName); err != nil {
|
|
return err
|
|
}
|
|
|
|
lockfilePath := fmt.Sprintf("%v/.deploy.lock", common.AppRoot(appName))
|
|
if _, err = os.Create(lockfilePath); err != nil {
|
|
return errors.New("Unable to create deploy lock")
|
|
}
|
|
|
|
common.LogInfo1("Deploy lock created")
|
|
return nil
|
|
}
|
|
|
|
// CommandLocked checks if an app is locked for deployment
|
|
func CommandLocked(args []string) error {
|
|
appName, err := getAppName(args)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
if err := common.VerifyAppName(appName); err != nil {
|
|
return err
|
|
}
|
|
|
|
if appIsLocked(appName) {
|
|
common.LogQuiet("Deploy lock exists")
|
|
return nil
|
|
|
|
}
|
|
return errors.New("Deploy lock does not exist")
|
|
}
|
|
|
|
// CommandRename renames an app
|
|
func CommandRename(args []string, skipDeploy bool) error {
|
|
oldAppName, err := getAppName(args)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
newAppName, err := getNewAppName(args)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
if err = common.IsValidAppName(oldAppName); err != nil {
|
|
return err
|
|
}
|
|
|
|
if err = common.IsValidAppName(newAppName); err != nil {
|
|
return err
|
|
}
|
|
|
|
if err = appExists(oldAppName); err != nil {
|
|
return err
|
|
}
|
|
|
|
if err = appExists(newAppName); err == nil {
|
|
return errors.New("Name is already taken")
|
|
}
|
|
|
|
common.LogInfo1Quiet(fmt.Sprintf("Renaming %s to %s", oldAppName, newAppName))
|
|
if err = createApp(newAppName); err != nil {
|
|
return err
|
|
}
|
|
|
|
if err = common.PlugnTrigger("post-app-rename-setup", []string{oldAppName, newAppName}...); err != nil {
|
|
return err
|
|
}
|
|
|
|
os.Setenv("DOKKU_APPS_FORCE_DELETE", "1")
|
|
if err = destroyApp(oldAppName); err != nil {
|
|
return err
|
|
}
|
|
|
|
if skipDeploy {
|
|
os.Setenv("SKIP_REBUILD", "true")
|
|
}
|
|
|
|
if err = common.PlugnTrigger("post-app-rename", []string{oldAppName, newAppName}...); err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// CommandReport displays an app report for one or more apps
|
|
func CommandReport(args []string) error {
|
|
appName, err := getAppName(args)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
infoFlag := ""
|
|
if len(args) > 1 {
|
|
infoFlag = args[1]
|
|
}
|
|
|
|
if strings.HasPrefix(appName, "--") {
|
|
infoFlag = appName
|
|
appName = ""
|
|
}
|
|
|
|
if len(appName) == 0 {
|
|
apps, err := common.DokkuApps()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
for _, appName := range apps {
|
|
if err := ReportSingleApp(appName, infoFlag); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
return ReportSingleApp(appName, infoFlag)
|
|
}
|
|
|
|
// CommandUnlock unlocks an app for deployment
|
|
func CommandUnlock(args []string) error {
|
|
appName, err := getAppName(args)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
if err := common.VerifyAppName(appName); err != nil {
|
|
return err
|
|
}
|
|
|
|
lockfilePath := fmt.Sprintf("%v/.deploy.lock", common.AppRoot(appName))
|
|
_, err = os.Stat(lockfilePath)
|
|
if !os.IsNotExist(err) {
|
|
common.LogWarn("A deploy may be in progress.")
|
|
common.LogWarn("Removing the app lock will not stop in progress deploys.")
|
|
}
|
|
|
|
err = os.Remove(lockfilePath)
|
|
if err == nil {
|
|
common.LogInfo1("Deploy lock removed")
|
|
return nil
|
|
}
|
|
|
|
return errors.New("Unable to remove deploy lock")
|
|
}
|