Skip to content

Commit

Permalink
Merge pull request #4 from raojinlin/feature-plugin-ec2
Browse files Browse the repository at this point in the history
feat: Implement the logic to list EC2 instances
  • Loading branch information
raojinlin authored Jul 11, 2024
2 parents bb65621 + b0f3780 commit 8cb2910
Show file tree
Hide file tree
Showing 3 changed files with 60 additions and 3 deletions.
2 changes: 2 additions & 0 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ go 1.22.0
toolchain go1.22.5

require (
github.com/aws/aws-sdk-go v1.54.18
github.com/baidubce/bce-sdk-go v0.9.184
github.com/docker/docker v27.0.3+incompatible
github.com/junegunn/fzf v0.0.0-20240702002010-cfc149e99448
Expand Down Expand Up @@ -42,6 +43,7 @@ require (
github.com/google/gofuzz v1.2.0 // indirect
github.com/google/uuid v1.6.0 // indirect
github.com/imdario/mergo v0.3.6 // indirect
github.com/jmespath/go-jmespath v0.4.0 // indirect
github.com/josharian/intern v1.0.0 // indirect
github.com/json-iterator/go v1.1.12 // indirect
github.com/lucasb-eyer/go-colorful v1.2.0 // indirect
Expand Down
6 changes: 6 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@ github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOEl
github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E=
github.com/Microsoft/go-winio v0.4.14 h1:+hMXMk01us9KgxGb7ftKQt2Xpf5hH/yky+TDA+qxleU=
github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA=
github.com/aws/aws-sdk-go v1.54.18 h1:t8DGtN8A2wEiazoJxeDbfPsbxCKtjoRLuO7jBSgJzo4=
github.com/aws/aws-sdk-go v1.54.18/go.mod h1:eRwEWoyTWFMVYVQzKMNHWP5/RV4xIUGMQfXQHfHkpNU=
github.com/baidubce/bce-sdk-go v0.9.184 h1:K3SyUtsQ/RKHbpbiJbFRgtrgYjyAFKFUF+KDD2zWMx4=
github.com/baidubce/bce-sdk-go v0.9.184/go.mod h1:zbYJMQwE4IZuyrJiFO8tO8NbtYiKTFTbwh4eIsqjVdg=
github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8=
Expand Down Expand Up @@ -66,6 +68,10 @@ github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 h1:bkypFPDjIYGfCYD5mRBvpqxfYX1
github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0/go.mod h1:P+Lt/0by1T8bfcF3z737NnSbmxQAppXMRziHUxPOC8k=
github.com/imdario/mergo v0.3.6 h1:xTNEAn+kxVO7dTZGu0CegyqKZmoWFI0rF8UxjlB2d28=
github.com/imdario/mergo v0.3.6/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA=
github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg=
github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo=
github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8=
github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U=
github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY=
github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y=
github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
Expand Down
55 changes: 52 additions & 3 deletions plugins/ec2.go
Original file line number Diff line number Diff line change
@@ -1,18 +1,48 @@
package plugins

import (
"os"

"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/session"
"github.com/aws/aws-sdk-go/service/ec2"
"github.com/raojinlin/hostnav"
"github.com/raojinlin/hostnav/pkg/terminal"
)

type Ec2Plugin struct {
Option *hostnav.CloudProviderOption
Option *hostnav.CloudProviderOption
regionClients map[string]*ec2.EC2
}

func (p *Ec2Plugin) List(options *ListOptions) ([]terminal.Host, error) {
// Implement the logic to list EC2 instances
// Return a slice of Host structs
return []terminal.Host{}, nil
var result []terminal.Host
for _, ec2Client := range p.regionClients {
output, err := ec2Client.DescribeInstances(nil)
if err != nil {
return nil, err
}

for _, reservation := range output.Reservations {
for _, instance := range reservation.Instances {
result = append(result, terminal.Host{
Type: terminal.TerminalTypeHost,
SSHInfo: terminal.SSHInfo{
Name: *instance.PublicDnsName,
PublicIP: *instance.PublicIpAddress,
LocalIP: *instance.PrivateIpAddress,
User: "root",
Port: 22,
UseLocalIP: p.Option.ConnectionOptions.UseLocalIP,
},
})
}
}
}

return result, nil
}

func (e *Ec2Plugin) Name() string {
Expand All @@ -24,9 +54,28 @@ func (e *Ec2Plugin) Cache() bool {
}

func (e *Ec2Plugin) Init(option interface{}) error {
if err := hostnav.MapToStruct(option, e.Option); err != nil {
return err
}

os.Setenv("AWS_ACCESS_KEY_ID", e.Option.AccessKey)
os.Setenv("AWS_SECRET_ACCESS_KEY", e.Option.AccessKeySecret)

for _, region := range e.Option.Regions {
sess, err := session.NewSession(&aws.Config{
Region: aws.String(region),
})

if err != nil {
return err
}

e.regionClients[region] = ec2.New(sess)
}

return nil
}

func NewEc2Plugin() *Ec2Plugin {
return &Ec2Plugin{}
return &Ec2Plugin{Option: &hostnav.CloudProviderOption{}, regionClients: make(map[string]*ec2.EC2)}
}

0 comments on commit 8cb2910

Please sign in to comment.