Skip to content

Commit 0d2bc08

Browse files
committed
Adding ec2client interface to allow unit testing.
Signed-off-by: Jean-Laurent de Morlhon <jeanlaurent@morlhon.net>
1 parent c77ffa3 commit 0d2bc08

File tree

3 files changed

+80
-14
lines changed

3 files changed

+80
-14
lines changed

drivers/amazonec2/amazonec2.go

Lines changed: 26 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package amazonec2
33
import (
44
"crypto/md5"
55
"crypto/rand"
6+
"errors"
67
"fmt"
78
"io"
89
"io/ioutil"
@@ -52,6 +53,7 @@ var (
5253

5354
type Driver struct {
5455
*drivers.BaseDriver
56+
clientFactory func() Ec2Client
5557
Id string
5658
AccessKey string
5759
SecretKey string
@@ -83,6 +85,10 @@ type Driver struct {
8385
Monitoring bool
8486
}
8587

88+
type clientFactory interface {
89+
build(d *Driver) Ec2Client
90+
}
91+
8692
func (d *Driver) GetCreateFlags() []mcnflag.Flag {
8793
return []mcnflag.Flag{
8894
mcnflag.StringFlag{
@@ -201,9 +207,9 @@ func (d *Driver) GetCreateFlags() []mcnflag.Flag {
201207
}
202208
}
203209

204-
func NewDriver(hostName, storePath string) drivers.Driver {
210+
func NewDriver(hostName, storePath string) *Driver {
205211
id := generateId()
206-
return &Driver{
212+
driver := &Driver{
207213
Id: id,
208214
AMI: defaultAmiId,
209215
Region: defaultRegion,
@@ -218,6 +224,24 @@ func NewDriver(hostName, storePath string) drivers.Driver {
218224
StorePath: storePath,
219225
},
220226
}
227+
228+
driver.clientFactory = driver.buildClient
229+
230+
return driver
231+
}
232+
233+
func (d *Driver) buildClient() Ec2Client {
234+
config := aws.NewConfig()
235+
alogger := AwsLogger()
236+
config = config.WithRegion(d.Region)
237+
config = config.WithCredentials(credentials.NewStaticCredentials(d.AccessKey, d.SecretKey, d.SessionToken))
238+
config = config.WithLogger(alogger)
239+
config = config.WithLogLevel(aws.LogDebugWithHTTPBody)
240+
return ec2.New(session.New(config))
241+
}
242+
243+
func (d *Driver) getClient() Ec2Client {
244+
return d.clientFactory()
221245
}
222246

223247
func (d *Driver) SetConfigFromFlags(flags drivers.DriverOptions) error {
@@ -661,16 +685,6 @@ func (d *Driver) Remove() error {
661685
return nil
662686
}
663687

664-
func (d *Driver) getClient() *ec2.EC2 {
665-
config := aws.NewConfig()
666-
alogger := AwsLogger()
667-
config = config.WithRegion(d.Region)
668-
config = config.WithCredentials(credentials.NewStaticCredentials(d.AccessKey, d.SecretKey, d.SessionToken))
669-
config = config.WithLogger(alogger)
670-
config = config.WithLogLevel(aws.LogDebugWithHTTPBody)
671-
return ec2.New(session.New(config))
672-
}
673-
674688
func (d *Driver) getInstance() (*ec2.Instance, error) {
675689
instances, err := d.getClient().DescribeInstances(&ec2.DescribeInstancesInput{
676690
InstanceIds: []*string{&d.InstanceId},

drivers/amazonec2/amazonec2_test.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ import (
55
"os"
66
"testing"
77

8+
"errors"
9+
810
"github.com/aws/aws-sdk-go/aws"
911
"github.com/aws/aws-sdk-go/service/ec2"
1012
"github.com/docker/machine/commands/commandstest"
@@ -85,8 +87,7 @@ func getTestDriver() (*Driver, error) {
8587

8688
d := NewDriver(machineTestName, storePath)
8789
d.SetConfigFromFlags(getDefaultTestDriverFlags())
88-
drv := d.(*Driver)
89-
return drv, nil
90+
return d, nil
9091
}
9192

9293
func TestConfigureSecurityGroupPermissionsEmpty(t *testing.T) {

drivers/amazonec2/ec2client.go

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
package amazonec2
2+
3+
import "github.com/aws/aws-sdk-go/service/ec2"
4+
5+
type Ec2Client interface {
6+
DescribeAccountAttributes(input *ec2.DescribeAccountAttributesInput) (*ec2.DescribeAccountAttributesOutput, error)
7+
8+
DescribeSubnets(input *ec2.DescribeSubnetsInput) (*ec2.DescribeSubnetsOutput, error)
9+
10+
CreateTags(input *ec2.CreateTagsInput) (*ec2.CreateTagsOutput, error)
11+
12+
//SecurityGroup
13+
14+
CreateSecurityGroup(input *ec2.CreateSecurityGroupInput) (*ec2.CreateSecurityGroupOutput, error)
15+
16+
AuthorizeSecurityGroupIngress(input *ec2.AuthorizeSecurityGroupIngressInput) (*ec2.AuthorizeSecurityGroupIngressOutput, error)
17+
18+
DescribeSecurityGroups(input *ec2.DescribeSecurityGroupsInput) (*ec2.DescribeSecurityGroupsOutput, error)
19+
20+
DeleteSecurityGroup(input *ec2.DeleteSecurityGroupInput) (*ec2.DeleteSecurityGroupOutput, error)
21+
22+
//KeyPair
23+
24+
DeleteKeyPair(input *ec2.DeleteKeyPairInput) (*ec2.DeleteKeyPairOutput, error)
25+
26+
ImportKeyPair(input *ec2.ImportKeyPairInput) (*ec2.ImportKeyPairOutput, error)
27+
28+
DescribeKeyPairs(input *ec2.DescribeKeyPairsInput) (*ec2.DescribeKeyPairsOutput, error)
29+
30+
//Instances
31+
32+
DescribeInstances(input *ec2.DescribeInstancesInput) (*ec2.DescribeInstancesOutput, error)
33+
34+
StartInstances(input *ec2.StartInstancesInput) (*ec2.StartInstancesOutput, error)
35+
36+
RebootInstances(input *ec2.RebootInstancesInput) (*ec2.RebootInstancesOutput, error)
37+
38+
StopInstances(input *ec2.StopInstancesInput) (*ec2.StopInstancesOutput, error)
39+
40+
RunInstances(input *ec2.RunInstancesInput) (*ec2.Reservation, error)
41+
42+
TerminateInstances(input *ec2.TerminateInstancesInput) (*ec2.TerminateInstancesOutput, error)
43+
44+
//SpotInstances
45+
46+
RequestSpotInstances(input *ec2.RequestSpotInstancesInput) (*ec2.RequestSpotInstancesOutput, error)
47+
48+
DescribeSpotInstanceRequests(input *ec2.DescribeSpotInstanceRequestsInput) (*ec2.DescribeSpotInstanceRequestsOutput, error)
49+
50+
WaitUntilSpotInstanceRequestFulfilled(input *ec2.DescribeSpotInstanceRequestsInput) error
51+
}

0 commit comments

Comments
 (0)