/
plugin.go
88 lines (74 loc) · 2.18 KB
/
plugin.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
package ecr
import (
"fmt"
"time"
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/awserr"
"github.com/aws/aws-sdk-go/aws/credentials"
"github.com/aws/aws-sdk-go/aws/credentials/stscreds"
"github.com/aws/aws-sdk-go/aws/session"
"github.com/aws/aws-sdk-go/service/ecr"
)
type Credential struct {
AWSAccessKeyID *string
AWSSecretAccessKey *string
AWSAssumeRoleARN *string
AWSRegion *string
}
type ImagePlugin struct {
AWSCredential Credential
Image Image
}
func (c *Credential) newSession() *session.Session {
awsConfig := aws.Config{}
if c.AWSAccessKeyID != nil && c.AWSSecretAccessKey != nil {
awsConfig.Credentials = credentials.NewStaticCredentials(*c.AWSAccessKeyID, *c.AWSSecretAccessKey, "")
} else if c.AWSAssumeRoleARN != nil {
awsConfig.Credentials = stscreds.NewCredentials(session.Must(session.NewSession()), *c.AWSAssumeRoleARN)
}
if c.AWSRegion != nil {
awsConfig.Region = aws.String(*c.AWSRegion)
}
return session.Must(session.NewSession(&awsConfig))
}
func (p *ImagePlugin) FindImage() error {
reg := ecr.New(p.AWSCredential.newSession())
_, err := p.Image.Find(reg)
return err
}
func (p *ImagePlugin) WaitForImage(interval, timeout int64) error {
reg := ecr.New(p.AWSCredential.newSession())
start := time.Now()
delay := time.Duration(interval) * time.Second
check := make(chan error)
go func() {
for {
go func() {
imgs, err := p.Image.Find(reg)
if err != nil {
if aerr, ok := err.(awserr.Error); ok && aerr.Code() == ecr.ErrCodeImageNotFoundException {
return
}
check <- err
return
}
if len(imgs) > 0 {
fmt.Printf("Image [%s] found after %d seconds\n", p.Image.DockerTag(), int64(time.Now().Sub(start).Seconds()))
check <- nil
return
}
}()
time.Sleep(delay)
fmt.Printf("Waiting for Image [%s], %ds...\n", p.Image.DockerTag(), int64(time.Now().Sub(start).Seconds()))
}
}()
select {
case err := <-check:
if err != nil {
return err
}
case <-time.After(time.Duration(timeout) * time.Second):
return fmt.Errorf("Timed out after %ds while waiting for Image [%s]\n", int64(time.Now().Sub(start).Seconds()), p.Image.DockerTag())
}
return nil
}