github.com/rafflecopter/deis@v1.12.2/client/cmd/apps.go (about)

     1  package cmd
     2  
     3  import (
     4  	"fmt"
     5  	"net/url"
     6  	"os"
     7  	"strings"
     8  	"time"
     9  
    10  	"github.com/deis/deis/pkg/prettyprint"
    11  
    12  	"github.com/deis/deis/client/controller/api"
    13  	"github.com/deis/deis/client/controller/client"
    14  	"github.com/deis/deis/client/controller/models/apps"
    15  	"github.com/deis/deis/client/controller/models/config"
    16  	"github.com/deis/deis/client/pkg/git"
    17  	"github.com/deis/deis/client/pkg/webbrowser"
    18  )
    19  
    20  // AppCreate creates an app.
    21  func AppCreate(id string, buildpack string, remote string, noRemote bool) error {
    22  	c, err := client.New()
    23  	if err != nil {
    24  		return err
    25  	}
    26  
    27  	fmt.Print("Creating Application... ")
    28  	quit := progress()
    29  	app, err := apps.New(c, id)
    30  
    31  	quit <- true
    32  	<-quit
    33  
    34  	if err != nil {
    35  		return err
    36  	}
    37  
    38  	fmt.Printf("done, created %s\n", app.ID)
    39  
    40  	if buildpack != "" {
    41  		configValues := api.Config{
    42  			Values: map[string]interface{}{
    43  				"BUILDPACK_URL": buildpack,
    44  			},
    45  		}
    46  		if _, err = config.Set(c, app.ID, configValues); err != nil {
    47  			return err
    48  		}
    49  	}
    50  
    51  	if !noRemote {
    52  		if err = git.CreateRemote(c.ControllerURL.Host, remote, app.ID); err != nil {
    53  			if err.Error() == "exit status 128" {
    54  				fmt.Println("To replace the existing git remote entry, run:")
    55  				fmt.Printf("  git remote rename deis deis.old && deis git:remote -a %s\n", app.ID)
    56  			}
    57  			return err
    58  		}
    59  	}
    60  
    61  	fmt.Println("remote available at", git.RemoteURL(c.ControllerURL.Host, app.ID))
    62  
    63  	return nil
    64  }
    65  
    66  // AppsList lists apps on the Deis controller.
    67  func AppsList(results int) error {
    68  	c, err := client.New()
    69  
    70  	if err != nil {
    71  		return err
    72  	}
    73  
    74  	if results == defaultLimit {
    75  		results = c.ResponseLimit
    76  	}
    77  
    78  	apps, count, err := apps.List(c, results)
    79  
    80  	if err != nil {
    81  		return err
    82  	}
    83  
    84  	fmt.Printf("=== Apps%s", limitCount(len(apps), count))
    85  
    86  	for _, app := range apps {
    87  		fmt.Println(app.ID)
    88  	}
    89  	return nil
    90  }
    91  
    92  // AppInfo prints info about app.
    93  func AppInfo(appID string) error {
    94  	c, appID, err := load(appID)
    95  
    96  	if err != nil {
    97  		return err
    98  	}
    99  
   100  	app, err := apps.Get(c, appID)
   101  
   102  	if err != nil {
   103  		return err
   104  	}
   105  
   106  	fmt.Printf("=== %s Application\n", app.ID)
   107  	fmt.Println("updated: ", app.Updated)
   108  	fmt.Println("uuid:    ", app.UUID)
   109  	fmt.Println("created: ", app.Created)
   110  	fmt.Println("url:     ", app.URL)
   111  	fmt.Println("owner:   ", app.Owner)
   112  	fmt.Println("id:      ", app.ID)
   113  
   114  	fmt.Println()
   115  	// print the app processes
   116  	if err = PsList(app.ID, defaultLimit); err != nil {
   117  		return err
   118  	}
   119  
   120  	fmt.Println()
   121  	// print the app domains
   122  	if err = DomainsList(app.ID, defaultLimit); err != nil {
   123  		return err
   124  	}
   125  
   126  	fmt.Println()
   127  
   128  	return nil
   129  }
   130  
   131  // AppOpen opens an app in the default webbrowser.
   132  func AppOpen(appID string) error {
   133  	c, appID, err := load(appID)
   134  
   135  	if err != nil {
   136  		return err
   137  	}
   138  
   139  	app, err := apps.Get(c, appID)
   140  
   141  	if err != nil {
   142  		return err
   143  	}
   144  
   145  	u, err := url.Parse(app.URL)
   146  
   147  	if err != nil {
   148  		return err
   149  	}
   150  
   151  	u.Scheme = "http"
   152  
   153  	return webbrowser.Webbrowser(u.String())
   154  }
   155  
   156  // AppLogs returns the logs from an app.
   157  func AppLogs(appID string, lines int) error {
   158  	c, appID, err := load(appID)
   159  
   160  	if err != nil {
   161  		return err
   162  	}
   163  
   164  	logs, err := apps.Logs(c, appID, lines)
   165  
   166  	if err != nil {
   167  		return err
   168  	}
   169  
   170  	return printLogs(logs)
   171  }
   172  
   173  // printLogs prints each log line with a color matched to its category.
   174  func printLogs(logs string) error {
   175  	for _, log := range strings.Split(strings.Trim(logs, `\n`), `\n`) {
   176  		category := "unknown"
   177  		parts := strings.Split(strings.Split(log, ": ")[0], " ")
   178  		if len(parts) >= 2 {
   179  			category = parts[1]
   180  		}
   181  		colorVars := map[string]string{
   182  			"Color": chooseColor(category),
   183  			"Log":   log,
   184  		}
   185  		fmt.Println(prettyprint.ColorizeVars("{{.V.Color}}{{.V.Log}}{{.C.Default}}", colorVars))
   186  	}
   187  
   188  	return nil
   189  }
   190  
   191  // AppRun runs a one time command in the app.
   192  func AppRun(appID, command string) error {
   193  	c, appID, err := load(appID)
   194  
   195  	if err != nil {
   196  		return err
   197  	}
   198  
   199  	fmt.Printf("Running '%s'...\n", command)
   200  
   201  	out, err := apps.Run(c, appID, command)
   202  
   203  	if err != nil {
   204  		return err
   205  	}
   206  
   207  	fmt.Print(out.Output)
   208  	os.Exit(out.ReturnCode)
   209  	return nil
   210  }
   211  
   212  // AppDestroy destroys an app.
   213  func AppDestroy(appID, confirm string) error {
   214  	gitSession := false
   215  
   216  	c, err := client.New()
   217  
   218  	if err != nil {
   219  		return err
   220  	}
   221  
   222  	if appID == "" {
   223  		appID, err = git.DetectAppName(c.ControllerURL.Host)
   224  
   225  		if err != nil {
   226  			return err
   227  		}
   228  
   229  		gitSession = true
   230  	}
   231  
   232  	if confirm == "" {
   233  		fmt.Printf(` !    WARNING: Potentially Destructive Action
   234   !    This command will destroy the application: %s
   235   !    To proceed, type "%s" or re-run this command with --confirm=%s
   236  
   237  > `, appID, appID, appID)
   238  
   239  		fmt.Scanln(&confirm)
   240  	}
   241  
   242  	if confirm != appID {
   243  		return fmt.Errorf("App %s does not match confirm %s, aborting.", appID, confirm)
   244  	}
   245  
   246  	startTime := time.Now()
   247  	fmt.Printf("Destroying %s...\n", appID)
   248  
   249  	if err = apps.Delete(c, appID); err != nil {
   250  		return err
   251  	}
   252  
   253  	fmt.Printf("done in %ds\n", int(time.Since(startTime).Seconds()))
   254  
   255  	if gitSession {
   256  		return git.DeleteRemote(appID)
   257  	}
   258  
   259  	return nil
   260  }
   261  
   262  // AppTransfer transfers app ownership to another user.
   263  func AppTransfer(appID, username string) error {
   264  	c, appID, err := load(appID)
   265  
   266  	if err != nil {
   267  		return err
   268  	}
   269  
   270  	fmt.Printf("Transferring %s to %s... ", appID, username)
   271  
   272  	err = apps.Transfer(c, appID, username)
   273  
   274  	if err != nil {
   275  		return err
   276  	}
   277  
   278  	fmt.Println("done")
   279  
   280  	return nil
   281  }