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 }