diff --git a/README.md b/README.md index 7ae3cb1..6248cac 100644 --- a/README.md +++ b/README.md @@ -202,6 +202,7 @@ tail -f /tmp/e1s.log - [x] Read only mode - [x] Auto refresh - [x] Describe clusters + - [x] Describe instances - [x] Describe services - [x] Describe service deployments - [x] Describe service revisions @@ -216,7 +217,8 @@ tail -f /tmp/e1s.log - [x] MemoryUtilization - [x] Show autoscaling target and policy - [x] Open selected resource in browser(support new UI(v2)) - - [x] Interactively exec towards containers(like ssh) + - [x] Interactively shell to containers(like ssh) + - [x] Interactively shell to instances(like ssh) - [x] Edit service - [x] Desired count - [x] Force new deployment diff --git a/internal/view/container.go b/internal/view/container.go index 0bd167b..6b0c4ff 100644 --- a/internal/view/container.go +++ b/internal/view/container.go @@ -23,7 +23,7 @@ func newContainerView(containers []types.Container, app *App) *containerView { hotKeyMap["P"], hotKeyMap["D"], hotKeyMap["E"], - hotKeyMap["enter"], + hotKeyMap["s"], hotKeyMap["ctrlD"], }...) return &containerView{ diff --git a/internal/view/instance.go b/internal/view/instance.go index 6021ca7..7ab66f8 100644 --- a/internal/view/instance.go +++ b/internal/view/instance.go @@ -19,7 +19,6 @@ type instanceView struct { // Constructor for instance view func newInstanceView(instances []types.ContainerInstance, app *App) *instanceView { keys := append(basicKeyInputs, []keyDescriptionPair{ - hotKeyMap["v"], hotKeyMap["s"], }...) return &instanceView{ @@ -75,8 +74,9 @@ func (v *instanceView) headerBuilder() *tview.Pages { // Generate info pages params func (v *instanceView) headerPagesParam(instance types.ContainerInstance) (items []headerItem) { items = []headerItem{ + {name: "Instance ID", value: utils.ShowString(instance.Ec2InstanceId)}, {name: "Status", value: utils.ShowString(instance.Status)}, - {name: "Instance Type", value: utils.ShowString(instance.Ec2InstanceId)}, + {name: "Capacity Provider", value: utils.ShowString(instance.CapacityProviderName)}, {name: "Agent Connected", value: fmt.Sprintf("%v", instance.AgentConnected)}, {name: "Running Tasks Count", value: fmt.Sprintf("%d", instance.RunningTasksCount)}, {name: "Pending Tasks Count", value: fmt.Sprintf("%d", instance.PendingTasksCount)}, @@ -133,7 +133,7 @@ func (v *instanceView) tableParam() (title string, headers []string, dataBuilder for _, instance := range v.instances { row := []string{ utils.ArnToName(instance.ContainerInstanceArn), - utils.ShowGreenGrey(instance.Status, "ACTIVE"), + utils.ShowGreenGrey(instance.Status, "active"), fmt.Sprintf("%d", instance.RunningTasksCount), fmt.Sprintf("%d", instance.PendingTasksCount), fmt.Sprintf("%v", instance.AgentConnected), diff --git a/internal/view/kind.go b/internal/view/kind.go index e37104d..f4730d1 100644 --- a/internal/view/kind.go +++ b/internal/view/kind.go @@ -88,7 +88,7 @@ func (k kind) getAppPageName(name string) string { switch k { case ClusterKind: return k.String() - case ServiceKind, TaskKind, ContainerKind, TaskDefinitionKind, ServiceDeploymentKind, DescriptionKind: + case ServiceKind, TaskKind, ContainerKind, TaskDefinitionKind, ServiceDeploymentKind, DescriptionKind, InstanceKind: return k.String() + "." + name default: return k.String() diff --git a/internal/view/shell.go b/internal/view/shell.go index c51587c..7d480cc 100644 --- a/internal/view/shell.go +++ b/internal/view/shell.go @@ -178,13 +178,13 @@ func (v *view) instanceStartSession() { instanceId := "" if v.app.kind == InstanceKind { if selected.instance == nil { - v.app.Notice.Warn("empty pointer selected.instance") + v.app.Notice.Warn("Not a valid instance") return } instanceId = *selected.instance.Ec2InstanceId } else if v.app.kind == TaskKind { if v.app.task.ContainerInstanceArn == nil { - v.app.Notice.Warn("empty pointer selected.task.ContainerInstanceArn") + v.app.Notice.Warn("Not a valid task with container instance") return } instanceId, err = v.app.Store.GetTaskInstanceId(v.app.cluster.ClusterName, v.app.task.ContainerInstanceArn) @@ -195,7 +195,7 @@ func (v *view) instanceStartSession() { } if instanceId == "" { - v.app.Notice.Warn("empty instanceId") + v.app.Notice.Warn("Not a valid instance") return } diff --git a/internal/view/table.go b/internal/view/table.go index bd7c9b6..ebc78b7 100644 --- a/internal/view/table.go +++ b/internal/view/table.go @@ -60,6 +60,7 @@ func (v *view) buildTable(title string, headers []string, dataBuilder func() [][ pageName := v.app.kind.getTablePageName(v.app.getPageHandle()) v.bodyPages.AddPage(pageName, v.table, true, true) + } // Handler common table events @@ -71,6 +72,11 @@ func (v *view) handleTableEvents() { v.table.SetInputCapture(v.handleInputCapture) v.table.SetDoneFunc(v.handleDone) + + // prevent table row selection out of range + if v.app.rowIndex >= v.table.GetRowCount() { + v.app.rowIndex = 1 + } } // Handle selected event for table when press up and down @@ -88,7 +94,7 @@ func (v *view) handleSelectionChanged(row, column int) { // Handle selected event for table when press Enter func (v *view) handleSelected(row, column int) { - if v.app.kind == TaskDefinitionKind { + if v.app.kind == TaskDefinitionKind || v.app.kind == InstanceKind { return } v.app.rowIndex = 0 diff --git a/internal/view/view.go b/internal/view/view.go index 52d42c9..0f2f6a3 100644 --- a/internal/view/view.go +++ b/internal/view/view.go @@ -12,8 +12,8 @@ import ( const ( awsCli = "aws" smpCi = "session-manager-plugin" - execBannerFmt = "\n\033[1;31m<>\033[0m: \n#######################################\n\033[1;32mCluster\033[0m: \"%s\" \n\033[1;32mService\033[0m: \"%s\" \n\033[1;32mTask\033[0m: \"%s\" \n\033[1;32mContainer\033[0m: \"%s\"\n#######################################\n" - instanceBannerFmt = "\n\033[1;31m<>\033[0m: \n#######################################\n\033[1;32mCluster\033[0m: \"%s\" \n\033[1;32mInstance\033[0m: \"%s\"\n#######################################\n" + execBannerFmt = "\n\033[1;31m<>\033[0m: \n#######################################\n\033[1;32mCluster\033[0m: \"%s\" \n\033[1;32mService\033[0m: \"%s\" \n\033[1;32mTask\033[0m: \"%s\" \n\033[1;32mContainer\033[0m: \"%s\"\n#######################################\n" + instanceBannerFmt = "\n\033[1;31m<>\033[0m: \n#######################################\n\033[1;32mCluster\033[0m: \"%s\" \n\033[1;32mInstance\033[0m: \"%s\"\n#######################################\n" realtimeLogFmt = "\n\033[1;31m<>\033[0m: \n#######################################\n\033[1;32mCluster\033[0m: \"%s\" \n\033[1;32mService\033[0m: \"%s\" \n\033[1;32mLogGroup\033[0m: \"%s\"\n\033[1;32mLogStreamNames\033[0m: \"%s\"\n#######################################\n" )