diff options
-rw-r--r-- | bookpipeline/aws.go | 41 | ||||
-rw-r--r-- | bookpipeline/cmd/lspipeline/main.go | 78 |
2 files changed, 57 insertions, 62 deletions
diff --git a/bookpipeline/aws.go b/bookpipeline/aws.go index f3cdbfa..063bc9f 100644 --- a/bookpipeline/aws.go +++ b/bookpipeline/aws.go @@ -10,6 +10,7 @@ import ( "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/aws/awserr" "github.com/aws/aws-sdk-go/aws/session" + "github.com/aws/aws-sdk-go/service/ec2" "github.com/aws/aws-sdk-go/service/s3" "github.com/aws/aws-sdk-go/service/s3/s3manager" "github.com/aws/aws-sdk-go/service/sqs" @@ -22,6 +23,10 @@ type Qmsg struct { Id, Handle, Body string } +type InstanceDetails struct { + Id, Name, Ip, Spot, Type, State, LaunchTime string +} + type AwsConn struct { // these need to be set before running Init() Region string @@ -29,6 +34,7 @@ type AwsConn struct { // these are used internally sess *session.Session + ec2svc *ec2.EC2 s3svc *s3.S3 sqssvc *sqs.SQS downloader *s3manager.Downloader @@ -37,6 +43,7 @@ type AwsConn struct { wipstorageid string } +// TODO: split this up, as not everything is needed for different uses func (a *AwsConn) Init() error { if a.Region == "" { return errors.New("No Region set") @@ -52,6 +59,7 @@ func (a *AwsConn) Init() error { if err != nil { return errors.New(fmt.Sprintf("Failed to set up aws session: %s", err)) } + a.ec2svc = ec2.New(a.sess) a.s3svc = s3.New(a.sess) a.sqssvc = sqs.New(a.sess) a.downloader = s3manager.NewDownloader(a.sess) @@ -259,3 +267,36 @@ func (a *AwsConn) Upload(bucket string, key string, path string) error { func (a *AwsConn) GetLogger() *log.Logger { return a.Logger } + +// TODO: split pages function so it can be encapsulated by +// downstream and to feed a channel +func (a *AwsConn) GetInstanceDetails() ([]InstanceDetails, error) { + var details []InstanceDetails + err := a.ec2svc.DescribeInstancesPages(&ec2.DescribeInstancesInput{}, func(page *ec2.DescribeInstancesOutput, lastPage bool) bool { + for _, r := range page.Reservations { + for _, i := range r.Instances { + var d InstanceDetails + + for _, t := range i.Tags { + if *t.Key == "Name" { + d.Name = *t.Value + } + } + if i.PublicIpAddress != nil { + d.Ip = *i.PublicIpAddress + } + if i.SpotInstanceRequestId != nil { + d.Spot = *i.SpotInstanceRequestId + } + d.Type = *i.InstanceType + d.Id = *i.InstanceId + d.LaunchTime = i.LaunchTime.String() + d.State = *i.State.Name + + details = append(details, d) + } + } + return !lastPage + }) + return details, err +} diff --git a/bookpipeline/cmd/lspipeline/main.go b/bookpipeline/cmd/lspipeline/main.go index d49b933..3cbc893 100644 --- a/bookpipeline/cmd/lspipeline/main.go +++ b/bookpipeline/cmd/lspipeline/main.go @@ -7,12 +7,6 @@ import ( "os" "rescribe.xyz/go.git/bookpipeline" - - // TODO: abstract out the aws stuff into aws.go in due course - "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/aws/aws-sdk-go/service/s3" ) const usage = `Usage: lspipeline [-v] @@ -32,6 +26,7 @@ type LsPipeliner interface { OCRQueueId() string AnalyseQueueId() string GetQueueDetails(url string) (string, string, error) + GetInstanceDetails() ([]bookpipeline.InstanceDetails, error) } // NullWriter is used so non-verbose logging may be discarded @@ -41,52 +36,19 @@ func (w NullWriter) Write(p []byte) (n int, err error) { return len(p), nil } -type instanceDetails struct { - id, name, ip, spot, iType, state, launchTime string -} - type queueDetails struct { name, numAvailable, numInProgress string } -func ec2getInstances(svc *ec2.EC2, instances chan instanceDetails) { - err := svc.DescribeInstancesPages(&ec2.DescribeInstancesInput{}, parseInstances(instances)) +func getInstances(conn LsPipeliner, detailsc chan bookpipeline.InstanceDetails) { + details, err := conn.GetInstanceDetails() if err != nil { - close(instances) - log.Println("Error with ec2 DescribeInstancePages call:", err) + log.Println("Error getting instance details:", err) } -} - -func parseInstances(details chan instanceDetails) (func(*ec2.DescribeInstancesOutput, bool) bool) { - return func(page *ec2.DescribeInstancesOutput, lastPage bool) bool { - for _, r := range page.Reservations { - for _, i := range r.Instances { - var d instanceDetails - - for _, t := range i.Tags { - if *t.Key == "Name" { - d.name = *t.Value - } - } - if i.PublicIpAddress != nil { - d.ip = *i.PublicIpAddress - } - if i.SpotInstanceRequestId != nil { - d.spot = *i.SpotInstanceRequestId - } - d.iType = *i.InstanceType - d.id = *i.InstanceId - d.launchTime = i.LaunchTime.String() - d.state = *i.State.Name - - details <- d - } - } - if lastPage { - close(details) - } - return !lastPage + for _, d := range details { + detailsc <- d } + close(detailsc) } func getQueueDetails(conn LsPipeliner, qdetails chan queueDetails) { @@ -132,31 +94,23 @@ func main() { log.Fatalln("Failed to set up cloud connection:", err) } - sess, err := session.NewSession(&aws.Config{ - Region: aws.String("eu-west-2"), - }) - if err != nil { - log.Fatalln("Failed to set up aws session", err) - } - ec2svc := ec2.New(sess) - - instances := make(chan instanceDetails, 100) + instances := make(chan bookpipeline.InstanceDetails, 100) queues := make(chan queueDetails) - go ec2getInstances(ec2svc, instances) + go getInstances(conn, instances) go getQueueDetails(conn, queues) fmt.Println("# Instances") for i := range instances { - fmt.Printf("ID: %s, Type: %s, LaunchTime: %s, State: %s", i.id, i.iType, i.launchTime, i.state) - if i.name != "" { - fmt.Printf(", Name: %s", i.name) + fmt.Printf("ID: %s, Type: %s, LaunchTime: %s, State: %s", i.Id, i.Type, i.LaunchTime, i.State) + if i.Name != "" { + fmt.Printf(", Name: %s", i.Name) } - if i.ip != "" { - fmt.Printf(", IP: %s", i.ip) + if i.Ip != "" { + fmt.Printf(", IP: %s", i.Ip) } - if i.spot != "" { - fmt.Printf(", SpotRequest: %s", i.spot) + if i.Spot != "" { + fmt.Printf(", SpotRequest: %s", i.Spot) } fmt.Printf("\n") } |