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