作者:jbaye
项目:cl
func (cmd *App) Run(c *cli.Context) {
app := cmd.appReq.GetApplication()
cmd.ui.Say("Showing health and status for app %s...", term.EntityNameColor(app.Name))
summary, err := cmd.appSummaryRepo.GetSummary(app)
if err != nil {
cmd.ui.Failed(err.Error())
return
}
cmd.ui.Ok()
cmd.ui.Say("\n%s %s", term.HeaderColor("health:"), coloredState(summary.App.Health()))
cmd.ui.Say("%s %s x %d instances", term.HeaderColor("usage:"), byteSize(summary.App.Memory*MEGABYTE), summary.App.Instances)
cmd.ui.Say("%s %s\n", term.HeaderColor("urls:"), strings.Join(summary.App.Urls, ", "))
table := [][]string{
[]string{"", "status", "since", "cpu", "memory", "disk"},
}
for index, instance := range summary.Instances {
table = append(table, []string{
fmt.Sprintf("#%d", index),
string(instance.State),
instance.Since.Format("2006-01-02 03:04:05 PM"),
fmt.Sprintf("%.1f%%", instance.CpuUsage),
fmt.Sprintf("%s of %s", byteSize(instance.MemUsage), byteSize(instance.MemQuota)),
fmt.Sprintf("%s of %s", byteSize(instance.DiskUsage), byteSize(instance.DiskQuota)),
})
}
cmd.ui.DisplayTable(table, cmd.coloringFunc)
}
作者:nsn
项目:cl
func (cmd *ShowApp) ShowApp(app cf.Application) {
cmd.ui.Say("Showing health and status for app %s in org %s / space %s as %s...",
terminal.EntityNameColor(app.Name),
terminal.EntityNameColor(cmd.config.OrganizationFields.Name),
terminal.EntityNameColor(cmd.config.SpaceFields.Name),
terminal.EntityNameColor(cmd.config.Username()),
)
appSummary, apiResponse := cmd.appSummaryRepo.GetSummary(app.Guid)
appIsStopped := apiResponse.ErrorCode == cf.APP_STOPPED ||
apiResponse.ErrorCode == cf.APP_NOT_STAGED ||
appSummary.State == "stopped"
if apiResponse.IsNotSuccessful() && !appIsStopped {
cmd.ui.Failed(apiResponse.Message)
return
}
var instances []cf.AppInstanceFields
instances, apiResponse = cmd.appInstancesRepo.GetInstances(app.Guid)
if apiResponse.IsNotSuccessful() && !appIsStopped {
cmd.ui.Failed(apiResponse.Message)
return
}
cmd.ui.Ok()
cmd.ui.Say("\n%s %s", terminal.HeaderColor("requested state:"), coloredAppState(appSummary.ApplicationFields))
cmd.ui.Say("%s %s", terminal.HeaderColor("instances:"), coloredAppInstances(appSummary.ApplicationFields))
cmd.ui.Say("%s %s x %d instances", terminal.HeaderColor("usage:"), formatters.ByteSize(appSummary.Memory*formatters.MEGABYTE), appSummary.InstanceCount)
var urls []string
for _, route := range appSummary.RouteSummaries {
urls = append(urls, route.URL())
}
cmd.ui.Say("%s %s\n", terminal.HeaderColor("urls:"), strings.Join(urls, ", "))
if appIsStopped {
cmd.ui.Say("There are no running instances of this app.")
return
}
table := [][]string{
[]string{"", "state", "since", "cpu", "memory", "disk"},
}
for index, instance := range instances {
table = append(table, []string{
fmt.Sprintf("#%d", index),
coloredInstanceState(instance),
instance.Since.Format("2006-01-02 03:04:05 PM"),
fmt.Sprintf("%.1f%%", instance.CpuUsage*100),
fmt.Sprintf("%s of %s", formatters.ByteSize(instance.MemUsage), formatters.ByteSize(instance.MemQuota)),
fmt.Sprintf("%s of %s", formatters.ByteSize(instance.DiskUsage), formatters.ByteSize(instance.DiskQuota)),
})
}
cmd.ui.DisplayTable(table)
}
作者:jalatera
项目:cl
func (cmd *ShowApp) Run(c *cli.Context) {
app := cmd.appReq.GetApplication()
cmd.ui.Say("Showing health and status for app %s in org %s / space %s as %s...",
terminal.EntityNameColor(app.Name),
terminal.EntityNameColor(cmd.config.Organization.Name),
terminal.EntityNameColor(cmd.config.Space.Name),
terminal.EntityNameColor(cmd.config.Username()),
)
summary, apiResponse := cmd.appSummaryRepo.GetSummary(app)
appIsStopped := apiResponse.ErrorCode == cf.APP_STOPPED || apiResponse.ErrorCode == cf.APP_NOT_STAGED
if apiResponse.IsNotSuccessful() && !appIsStopped {
cmd.ui.Failed(apiResponse.Message)
return
}
cmd.ui.Ok()
cmd.ui.Say("\n%s %s", terminal.HeaderColor("state:"), coloredAppState(summary.App))
cmd.ui.Say("%s %s", terminal.HeaderColor("instances:"), coloredAppInstaces(summary.App))
cmd.ui.Say("%s %s x %d instances", terminal.HeaderColor("usage:"), formatters.ByteSize(summary.App.Memory*formatters.MEGABYTE), summary.App.Instances)
var urls []string
for _, route := range summary.App.Routes {
urls = append(urls, route.URL())
}
cmd.ui.Say("%s %s\n", terminal.HeaderColor("urls:"), strings.Join(urls, ", "))
if appIsStopped {
return
}
table := [][]string{
[]string{"", "status", "since", "cpu", "memory", "disk"},
}
for index, instance := range summary.Instances {
table = append(table, []string{
fmt.Sprintf("#%d", index),
coloredInstanceState(instance),
instance.Since.Format("2006-01-02 03:04:05 PM"),
fmt.Sprintf("%.1f%%", instance.CpuUsage),
fmt.Sprintf("%s of %s", formatters.ByteSize(instance.MemUsage), formatters.ByteSize(instance.MemQuota)),
fmt.Sprintf("%s of %s", formatters.ByteSize(instance.DiskUsage), formatters.ByteSize(instance.DiskQuota)),
})
}
cmd.ui.DisplayTable(table)
}
作者:jalatera
项目:cl
func (repo LoggregatorLogsRepository) connectToWebsocket(location string, app cf.Application, onConnect func(), outputChan chan *logmessage.Message, stopLoggingChan chan bool, printTimeBuffer time.Duration) (err error) {
trace.Logger.Printf("\n%s %s\n", terminal.HeaderColor("CONNECTING TO WEBSOCKET:"), location)
config, err := websocket.NewConfig(location, "http://localhost")
if err != nil {
return
}
config.Header.Add("Authorization", repo.config.AccessToken)
config.TlsConfig = &tls.Config{InsecureSkipVerify: true}
ws, err := websocket.DialConfig(config)
if err != nil {
return
}
onConnect()
inputChan := make(chan *logmessage.Message, 1000)
go repo.sendKeepAlive(ws)
go repo.listenForMessages(ws, inputChan, stopLoggingChan)
go makeAndStartMessageSorter(inputChan, outputChan, stopLoggingChan, printTimeBuffer)
return
}
作者:jalatera
项目:cl
func (cmd *SpaceUsers) Run(c *cli.Context) {
spaceName := c.Args()[1]
org := cmd.orgReq.GetOrganization()
space, apiResponse := cmd.spaceRepo.FindByNameInOrg(spaceName, org)
if apiResponse.IsNotSuccessful() {
cmd.ui.Failed(apiResponse.Message)
}
cmd.ui.Say("Getting users in org %s / space %s as %s",
terminal.EntityNameColor(org.Name),
terminal.EntityNameColor(space.Name),
terminal.EntityNameColor(cmd.config.Username()),
)
cmd.userRepo.FindAllInSpaceByRole(space)
usersByRole, apiResponse := cmd.userRepo.FindAllInSpaceByRole(space)
if apiResponse.IsNotSuccessful() {
cmd.ui.Failed(apiResponse.Message)
}
cmd.ui.Ok()
for role, users := range usersByRole {
cmd.ui.Say("")
cmd.ui.Say("%s", terminal.HeaderColor(role))
for _, user := range users {
cmd.ui.Say(" %s", user.Username)
}
}
}
作者:nota-j
项目:cl
func (cmd *OrgUsers) Run(c *cli.Context) {
org := cmd.orgReq.GetOrganization()
all := c.Bool("a")
cmd.ui.Say("Getting users in org %s as %s...",
terminal.EntityNameColor(org.Name),
terminal.EntityNameColor(cmd.config.Username()),
)
roles := orgRoles
if all {
roles = []string{models.ORG_USER}
}
for _, role := range roles {
displayName := orgRoleToDisplayName[role]
users, apiErr := cmd.userRepo.ListUsersInOrgForRole(org.Guid, role)
cmd.ui.Say("")
cmd.ui.Say("%s", terminal.HeaderColor(displayName))
for _, user := range users {
cmd.ui.Say(" %s", user.Username)
}
if apiErr != nil {
cmd.ui.Failed("Failed fetching org-users for role %s.\n%s", apiErr.Error(), displayName)
return
}
}
}
作者:jalatera
项目:cl
func (cmd *OrgUsers) Run(c *cli.Context) {
org := cmd.orgReq.GetOrganization()
cmd.ui.Say("Getting users in org %s as %s...",
terminal.EntityNameColor(org.Name),
terminal.EntityNameColor(cmd.config.Username()),
)
usersByRole, apiResponse := cmd.userRepo.FindAllInOrgByRole(org)
if apiResponse.IsNotSuccessful() {
cmd.ui.Failed(apiResponse.Message)
return
}
cmd.ui.Ok()
for role, users := range usersByRole {
cmd.ui.Say("")
cmd.ui.Say("%s", terminal.HeaderColor(role))
for _, user := range users {
cmd.ui.Say(" %s", user.Username)
}
}
}
作者:pmuell
项目:cl
func (repo LoggregatorLogsRepository) connectToWebsocket(location string, onConnect func(), outputChan chan *logmessage.Message, stopLoggingChan chan bool, printTimeBuffer time.Duration) (err error) {
trace.Logger.Printf("\n%s %s\n", terminal.HeaderColor("CONNECTING TO WEBSOCKET:"), location)
config, err := websocket.NewConfig(location, "http://localhost")
if err != nil {
return
}
config.Header.Add("Authorization", repo.config.AccessToken)
config.TlsConfig = &tls.Config{InsecureSkipVerify: true}
ws, err := websocket.DialConfig(config)
if err != nil {
return
}
defer ws.Close()
onConnect()
go repo.sendKeepAlive(ws)
inputChan := make(chan *logmessage.Message, LogBufferSize)
stopInputChan := make(chan bool, 1)
go func() {
defer close(stopInputChan)
defer close(inputChan)
repo.listenForMessages(ws, inputChan, stopInputChan)
}()
messageQueue := &SortedMessageQueue{printTimeBuffer: printTimeBuffer}
repo.processMessages(messageQueue, inputChan, outputChan, stopLoggingChan, stopInputChan)
return
}
作者:knollear
项目:cl
func (cmd *SpaceUsers) Run(c *cli.Context) {
spaceName := c.Args()[1]
org := cmd.orgReq.GetOrganization()
space, apiErr := cmd.spaceRepo.FindByNameInOrg(spaceName, org.Guid)
if apiErr != nil {
cmd.ui.Failed(apiErr.Error())
}
cmd.ui.Say("Getting users in org %s / space %s as %s",
terminal.EntityNameColor(org.Name),
terminal.EntityNameColor(space.Name),
terminal.EntityNameColor(cmd.config.Username()),
)
for _, role := range spaceRoles {
displayName := spaceRoleToDisplayName[role]
users, apiErr := cmd.userRepo.ListUsersInSpaceForRole(space.Guid, role)
cmd.ui.Say("")
cmd.ui.Say("%s", terminal.HeaderColor(displayName))
for _, user := range users {
cmd.ui.Say(" %s", user.Username)
}
if apiErr != nil {
cmd.ui.Failed("Failed fetching space-users for role %s.\n%s", apiErr.Error(), displayName)
return
}
}
}
作者:nsn
项目:cl
func (cmd *OrgUsers) Run(c *cli.Context) {
org := cmd.orgReq.GetOrganization()
cmd.ui.Say("Getting users in org %s as %s...",
terminal.EntityNameColor(org.Name),
terminal.EntityNameColor(cmd.config.Username()),
)
for _, role := range orgRoles {
stopChan := make(chan bool)
defer close(stopChan)
displayName := orgRoleToDisplayName[role]
usersChan, statusChan := cmd.userRepo.ListUsersInOrgForRole(org.Guid, role, stopChan)
cmd.ui.Say("")
cmd.ui.Say("%s", terminal.HeaderColor(displayName))
for users := range usersChan {
for _, user := range users {
cmd.ui.Say(" %s", user.Username)
}
}
apiStatus := <-statusChan
if apiStatus.IsNotSuccessful() {
cmd.ui.Failed("Failed fetching org-users for role %s.\n%s", apiStatus.Message, displayName)
return
}
}
}
作者:normalnorma
项目:cl
func dumpResponse(res *http.Response) {
dumpedResponse, err := httputil.DumpResponse(res, true)
if err != nil {
trace.Logger.Printf("Error dumping response\n%s\n", err)
} else {
trace.Logger.Printf("\n%s [%s]\n%s\n", terminal.HeaderColor("RESPONSE:"), time.Now().Format(time.RFC3339), Sanitize(string(dumpedResponse)))
}
}
作者:jbaye
项目:cl
func dumpRequest(req *http.Request) {
dumpedRequest, err := httputil.DumpRequest(req, true)
if err != nil {
fmt.Println("Error dumping request")
} else {
fmt.Printf("\n%s\n%s\n", term.HeaderColor("REQUEST:"), Sanitize(string(dumpedRequest)))
}
}
作者:jalatera
项目:cl
func dumpResponse(res *http.Response) {
dumpedResponse, err := httputil.DumpResponse(res, true)
if err != nil {
trace.Logger.Printf("Error dumping response")
} else {
trace.Logger.Printf("\n%s\n%s\n", terminal.HeaderColor("RESPONSE:"), Sanitize(string(dumpedResponse)))
}
}
作者:jalatera
项目:cl
func (cmd *Start) ApplicationStart(app cf.Application) (updatedApp cf.Application, err error) {
if app.State == "started" {
cmd.ui.Say(terminal.WarningColor("App " + app.Name + " is already started"))
return
}
cmd.ui.Say("Starting app %s in org %s / space %s as %s...",
terminal.EntityNameColor(app.Name),
terminal.EntityNameColor(cmd.config.Organization.Name),
terminal.EntityNameColor(cmd.config.Space.Name),
terminal.EntityNameColor(cmd.config.Username()),
)
updatedApp, apiResponse := cmd.appRepo.Start(app)
if apiResponse.IsNotSuccessful() {
cmd.ui.Failed(apiResponse.Message)
return
}
cmd.ui.Ok()
logChan := make(chan *logmessage.Message, 1000)
go cmd.displayLogMessages(logChan)
onConnect := func() {
cmd.ui.Say("\n%s", terminal.HeaderColor("Staging..."))
}
stopLoggingChan := make(chan bool)
go cmd.logRepo.TailLogsFor(app, onConnect, logChan, stopLoggingChan, 1)
instances, apiResponse := cmd.appRepo.GetInstances(updatedApp)
for apiResponse.IsNotSuccessful() {
if apiResponse.ErrorCode != cf.APP_NOT_STAGED {
cmd.ui.Say("")
cmd.ui.Failed(apiResponse.Message)
return
}
cmd.ui.Wait(1 * time.Second)
instances, apiResponse = cmd.appRepo.GetInstances(updatedApp)
}
stopLoggingChan <- true
cmd.ui.Say("")
cmd.startTime = time.Now()
for cmd.displayInstancesStatus(app, instances) {
cmd.ui.Wait(1 * time.Second)
instances, _ = cmd.appRepo.GetInstances(updatedApp)
}
return
}
作者:jalatera
项目:cl
func dumpRequest(req *http.Request) {
shouldDisplayBody := !strings.Contains(req.Header.Get("Content-Type"), "multipart/form-data")
dumpedRequest, err := httputil.DumpRequest(req, shouldDisplayBody)
if err != nil {
trace.Logger.Print("Error dumping request")
} else {
trace.Logger.Printf("\n%s\n%s\n", terminal.HeaderColor("REQUEST:"), Sanitize(string(dumpedRequest)))
if !shouldDisplayBody {
trace.Logger.Println("[MULTIPART/FORM-DATA CONTENT HIDDEN]")
}
}
}
作者:nsn
项目:cl
func (cmd *Start) ApplicationStart(app cf.Application) (updatedApp cf.Application, err error) {
if app.State == "started" {
cmd.ui.Say(terminal.WarningColor("App " + app.Name + " is already started"))
return
}
stopLoggingChan := make(chan bool, 1)
defer close(stopLoggingChan)
loggingStartedChan := make(chan bool)
defer close(loggingStartedChan)
go cmd.tailStagingLogs(app, loggingStartedChan, stopLoggingChan)
<-loggingStartedChan
cmd.ui.Say("Starting app %s in org %s / space %s as %s...",
terminal.EntityNameColor(app.Name),
terminal.EntityNameColor(cmd.config.OrganizationFields.Name),
terminal.EntityNameColor(cmd.config.SpaceFields.Name),
terminal.EntityNameColor(cmd.config.Username()),
)
params := cf.NewEmptyAppParams()
params.Set("state", "STARTED")
updatedApp, apiResponse := cmd.appRepo.Update(app.Guid, params)
if apiResponse.IsNotSuccessful() {
cmd.ui.Failed(apiResponse.Message)
return
}
cmd.ui.Ok()
cmd.waitForInstancesToStage(updatedApp)
stopLoggingChan <- true
cmd.ui.Say("")
cmd.waitForOneRunningInstance(app.Guid)
cmd.ui.Say(terminal.HeaderColor("\nApp started\n"))
cmd.appDisplayer.ShowApp(app)
return
}
作者:jalatera
项目:cl
func (cmd Start) displayInstancesStatus(app cf.Application, instances []cf.ApplicationInstance) (notFinished bool) {
totalCount := len(instances)
runningCount, startingCount, flappingCount, downCount := 0, 0, 0, 0
for _, inst := range instances {
switch inst.State {
case cf.InstanceRunning:
runningCount++
case cf.InstanceStarting:
startingCount++
case cf.InstanceFlapping:
flappingCount++
case cf.InstanceDown:
downCount++
}
}
if flappingCount > 0 {
cmd.ui.Failed("Start unsuccessful")
return false
}
anyInstanceRunning := runningCount > 0
if anyInstanceRunning {
if len(app.Routes) == 0 {
cmd.ui.Say(terminal.HeaderColor("Started"))
} else {
cmd.ui.Say("Started: app %s available at %s", terminal.EntityNameColor(app.Name), terminal.EntityNameColor(app.Routes[0].URL()))
}
return false
} else {
details := instancesDetails(runningCount, startingCount, downCount)
cmd.ui.Say("%d of %d instances running (%s)", runningCount, totalCount, details)
}
if time.Since(cmd.startTime) > cmd.config.ApplicationStartTimeout*time.Second {
cmd.ui.Failed("Start app timeout")
return false
}
return totalCount > runningCount
}
作者:jul
项目:cl
func (cmd *Start) ApplicationStart(app models.Application) (updatedApp models.Application, err error) {
if app.State == "started" {
cmd.ui.Say(terminal.WarningColor("App " + app.Name + " is already started"))
return
}
stopLoggingChan := make(chan bool, 1)
defer close(stopLoggingChan)
loggingStartedChan := make(chan bool)
defer close(loggingStartedChan)
go cmd.tailStagingLogs(app, loggingStartedChan, stopLoggingChan)
<-loggingStartedChan
cmd.ui.Say("Starting app %s in org %s / space %s as %s...",
terminal.EntityNameColor(app.Name),
terminal.EntityNameColor(cmd.config.OrganizationFields().Name),
terminal.EntityNameColor(cmd.config.SpaceFields().Name),
terminal.EntityNameColor(cmd.config.Username()),
)
state := "STARTED"
updatedApp, apiErr := cmd.appRepo.Update(app.Guid, models.AppParams{State: &state})
if apiErr != nil {
cmd.ui.Failed(apiErr.Error())
return
}
cmd.ui.Ok()
cmd.waitForInstancesToStage(updatedApp)
stopLoggingChan <- true
cmd.ui.Say("")
cmd.waitForOneRunningInstance(updatedApp)
cmd.ui.Say(terminal.HeaderColor("\nApp started\n"))
cmd.appDisplayer.ShowApp(updatedApp)
return
}
作者:nota-j
项目:cl
func NewApp(cmdRunner command_runner.Runner, metadatas ...command_metadata.CommandMetadata) (app *cli.App) {
helpCommand := cli.Command{
Name: "help",
ShortName: "h",
Description: "Show help",
Usage: fmt.Sprintf("%s help [COMMAND]", cf.Name()),
Action: func(c *cli.Context) {
args := c.Args()
if len(args) > 0 {
cli.ShowCommandHelp(c, args[0])
} else {
showAppHelp(appHelpTemplate, c.App)
}
},
}
cli.HelpPrinter = showAppHelp
cli.AppHelpTemplate = appHelpTemplate
trace.Logger.Printf("\n%s\n%s\n\n", terminal.HeaderColor("VERSION:"), cf.Version)
app = cli.NewApp()
app.Usage = cf.Usage
app.Version = cf.Version
app.Action = helpCommand.Action
compiledAtTime, err := time.Parse("Jan 2, 2006 3:04PM", cf.BuiltOnDate)
if err == nil {
app.Compiled = compiledAtTime
} else {
err = nil
app.Compiled = time.Now()
}
app.Commands = []cli.Command{helpCommand}
for _, metadata := range metadatas {
app.Commands = append(app.Commands, getCommand(metadata, cmdRunner))
}
return
}
作者:nsn
项目:cl
func (cmd *SpaceUsers) Run(c *cli.Context) {
spaceName := c.Args()[1]
org := cmd.orgReq.GetOrganization()
space, apiResponse := cmd.spaceRepo.FindByNameInOrg(spaceName, org.Guid)
if apiResponse.IsNotSuccessful() {
cmd.ui.Failed(apiResponse.Message)
}
cmd.ui.Say("Getting users in org %s / space %s as %s",
terminal.EntityNameColor(org.Name),
terminal.EntityNameColor(space.Name),
terminal.EntityNameColor(cmd.config.Username()),
)
for _, role := range spaceRoles {
stopChan := make(chan bool)
defer close(stopChan)
displayName := spaceRoleToDisplayName[role]
usersChan, statusChan := cmd.userRepo.ListUsersInSpaceForRole(space.Guid, role, stopChan)
cmd.ui.Say("")
cmd.ui.Say("%s", terminal.HeaderColor(displayName))
for users := range usersChan {
for _, user := range users {
cmd.ui.Say(" %s", user.Username)
}
}
apiStatus := <-statusChan
if apiStatus.IsNotSuccessful() {
cmd.ui.Failed("Failed fetching space-users for role %s.\n%s", apiStatus.Message, displayName)
return
}
}
}