mirror of
https://github.com/dokku/dokku.git
synced 2026-09-03 04:32:26 +02:00
272 lines
5.2 KiB
Go
272 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 appName == "tls" {
|
|
return errors.New("Unable to destroy tls directory")
|
|
}
|
|
|
|
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 {
|
|
return err
|
|
}
|
|
|
|
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")
|
|
}
|