summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bookpipeline/aws.go41
-rw-r--r--bookpipeline/cmd/lspipeline/main.go78
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")
}